←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Limit CT - funkcja licząca graczy w TT

  • +
  • -
Makale - zdjęcie Makale 22.03.2016

Witajcie. Potrzebuję funkcji, która na bieżąca będzie liczyła mi ilość TT i zapisywała to do zmiennej liczba_tt. Oczywiście zmienna liczba_tt ma się zmienić po tym, jak ktoś dojdzie / odejdzie z TT.

 

Zamysł jest taki:

zrobić plugin, który na podstawie liczby TT ustawi limit CT na takiej zasadzie:

 

0-5 TT - 1 CT

6-10 - 2 CT

10-14 - 3 CT

 

 

Na razie to co wiem jak zrobić:

if(liczba_tt <= 5){
    limit CT -> 1
}

if(liczba_tt > 6 && liczba_tt <= 10){
    limit CT -> 2
}

if(liczba_tt > 10 && liczba_tt <= 14){
    limit CT -> 3
}

Sam warunek nie jest trudny. Potrzebuję też jak zrobić taki limit CT.

Odpowiedz

  • +
  • -
wiwi249 - zdjęcie wiwi249 22.03.2016

public PlayersInTeam(team) {
  new number = 0;
  for(new i=0; i<=get_playersnum(); i++) {
      if(!is_user_connected(i))
          continue;
     
      if(cs_get_user_team(i) != team)
          continue;

      number++;
  }
  return number;
}

Wystarczy takie coś. Teraz żeby spisać liczbę graczy teamu do zmiennej wystarczy:

liczba_tt = PlayersInTeam(CS_TEAM_T);

Żeby się ta wartość zmieniała, wystarczy zabieg powtórzyć w client_putinserver i client_disconnect.


Użytkownik wiwi249 edytował ten post 22.03.2016 19:36
Odpowiedz

  • +
  • -
Makale - zdjęcie Makale 22.03.2016

Ciężko mi coś ten PAWN idzie.

 

Mam coś takiego:

#include <amxmodx>

#define PLUGIN "Limit CT"
#define VERSION "1.0"
#define AUTHOR "xxx"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	set_cvar_num("mp_limitteams",0)
	set_cvar_num("mp_autoteambalance",0)

}

public PlayersInTeam(team) {
  new number = 0;
  for(new i=0; i<=get_playersnum(); i++) {
      if(!is_user_connected(i)) continue;

      if(cs_get_user_team(i) != team) continue;

      number++;
  }
  return number;
}


public LimitCt() 
	liczba_tt = PlayersInTeam(CS_TEAM_T);
	
	if(liczba_tt <= 5){
		
	}
	
	if(liczba_tt > 6 && liczba_tt <= 10){

	}
	
	if(liczba_tt > 10 && liczba_tt <= 14){

	}
}

 

Co teraz dalej? Zdaję sobie sprawy z tego, że to podstawy, ale nigdy aż taka wiedza z zakresu PAWN'a nie była mi potrzebna.


Użytkownik Makale edytował ten post 22.03.2016 20:09
Odpowiedz

  • +
  • -
Asiap - zdjęcie Asiap 22.03.2016

tu masz cos podobnego http://amxx.pl/topic...ndpost&p=705304moj stary kod

ale do liczenia graczy lepiej jest uzyc kody stad http://amxx.pl/topic...ndpost&p=710857

Odpowiedz

  • +
  • -
wiwi249 - zdjęcie wiwi249 22.03.2016

Powiedzmy, że podstawy. Od tego jest to forum żeby się uczyć.
W funkcji którą sobie stworzyłeś możesz sobie ustawiać wartość zmiennej CT/TT i to raczej tyle. Przede wszystkim funkcja musi być w jakimś momencie wywołana, np. na początku rundy (w tym celu zobacz sobie tutorial Eventy - http://amxx.pl/topic/1680-eventy/). Wywołać, czy wykonać funkcję jest bardzo łatwo - po prostu piszesz Nazwa_Funkcji(parametry); czyli w Twoim przypadku LimitCt();

 

Ale jeśli chcesz rzeczywiście ograniczyć ilość ludzi w teamie to to może być trochę gorsze. Wydaje mi się że trzeba zarejestrować komendy jointeam i chooseteam, ale nie jestem pewien. Musisz zobaczyć jak to jest zrobione w Zombie Mod na przykład. Są też dostępne team limitery w necie.

Wireshark Cookie Dump:

OKCancel
Odpowiedz

  • +
  • -
Makale - zdjęcie Makale 22.03.2016

Z innego pluginu:

	register_menucmd(register_menuid("Team_Select",1),(1<<0)|(1<<1)|(1<<4),"teamselect")
	register_clcmd("jointeam","jointeam")

oraz

if(in_ct >= get_cvar_num("tl_limit_graczy")) {
				client_print(id, print_chat, "[TL] Druzyna CT pelna! Wejdz do T.");
				engclient_cmd(id,"jointeam","T")
Odpowiedz

  • +
  • -
Makale - zdjęcie Makale 22.03.2016

Czyli teraz mam coś takiego:

#include <amxmodx>

#define PLUGIN "Limit CT"
#define VERSION "1.0"
#define AUTHOR "xxx"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	set_cvar_num("mp_limitteams",0)
	set_cvar_num("mp_autoteambalance",0)
	
	register_menucmd(register_menuid("Team_Select",1),(1<<0)|(1<<1)|(1<<4),"teamselect")
	register_clcmd("jointeam","jointeam")

}

public client_putinserver(id){
	LimitCt();
}

public client_disconnect(id){
	LimitCt();
}

public PlayersInTeam(team) {
  new number = 0;
  for(new i=0; i<=get_playersnum(); i++) {
      if(!is_user_connected(i)) continue;

      if(cs_get_user_team(i) != team) continue;

      number++;
  }
  return number;
}


public LimitCt() 
	liczba_tt = PlayersInTeam(CS_TEAM_T);
	
	if(liczba_tt <= 5){
	
	// jak zrobić żeby był 1 CT ? funckja ktora liczy CT i jezeli liczba ct wieksza niż 1 to ma się wykonac:
	// engclient_cmd(id,"jointeam","T") ?
		
	}
	
	if(liczba_tt > 6 && liczba_tt <= 10){

	}
	
	if(liczba_tt > 10 && liczba_tt <= 14){

	}
}

Pewno trzeba przerobić funkcję public[/size] [/size]PlayersInTeam[/size]([/size]team[/size]) tak, żeby liczyła ilość CT obecną do zmiennej liczba_ct i wtedy warunek wygląda tak:[/size]

	if(liczba_tt <= 5){
	
			if (liczba_ct = 1){
				engclient_cmd(id,"jointeam","T") // i dołozyc printa ze druzycna CT pelna przerzucilo cie do TT
			}
			else{
			 // tutaj co ? plugin_continue ??
			}
	}

Wiem, że są inne w necie ale one mnie nie zadowalają. Nie działąją tak jak chce, albo się bugują. Wolę zrobić sam z waszą pomoc i się przy okazji czegoś nauczyć.


Użytkownik Makale edytował ten post 22.03.2016 20:58
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 23.03.2016


for(new i=0; i<=get_playersnum(); i++)

Tyle razy tłumaczyłem.

Wchodzi gracz, dostaje id 1, wchodzi kolejny dostaje 2, kolejny 3 kolejny 4, wychodzi ten o id 2.

Mamy trzech graczy od id 1,3,4

get_playersnum() zwróci Ci 3. Gracz o id 4 zostanie w Twojej pętli pominięty. Ponadto nikt nigdy nie dostanie id 0 więc po co od zera zaczynać?

 

 

Makale musisz zrobić następującą rzecz - przewidzieć kiedy ilość graczy w ct/tt się zmienia.

 

-Dołączenie do drużyny

-Zmiana drużyny (o ile na to chcesz pozwolić)

-Wyjście z gry

-Przejście do spectators

 

Robisz na to wszystko eventy i tyle, na bieżąco trzymasz ilość graczy w obu teamach w zmiennych. Jeśli ktoś chce dołączyć do któregoś teamu to sprawdzasz czy ilość graczy na to pozwala, jak nie to zmieniasz mu team 

cs_set_user_team(id,team)

Użytkownik grankee edytował ten post 23.03.2016 01:50
Odpowiedz

  • +
  • -
wiwi249 - zdjęcie wiwi249 23.03.2016


get_playersnum() zwróci Ci 3. Gracz o id 4 zostanie w Twojej pętli pominięty.

O kurde, nie pomyślałem o tym a tak robiłem już swoje pluginy, racja.

Rozsądniej byłoby użyć get_maxplayers()

Wireshark Cookie Dump:

OKCancel
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 25.03.2016


Rozsądniej byłoby użyć get_maxplayers()

Też dawno temu napotkałem sytuację, gdzie gracz dostał id większe od maxplayers. Nie wiem jak to się stało i czy to nadal możliwe czy już to naprawiono, ale utkwiło mi w pamięci, bo straciłem mnóstwo czasu przez to nie rozumiejąc czemu to nie działa.

Najbezpieczniej użyć 32, wykonanie takiej pętli nawet co sekundę i sprawdzenie jednego warunku is_user_alive wewnątrz na prawdę nie obciąży serwera.

 

@ Makale 

Tak się zastanawiam po co Ci to na bieżąco. Kiedy potrzebujesz sprawdzić w danej chwili ilu jest graczy to robisz funkcję liczącą graczy danej drużyny i tyle. Po co Ci to trzymać na bieżąco?

 

 

Ludzie mają sobie sami do ct dołączać, a plugin ma blokować, żeby nie dało się wejść jeśli nie ma minimum x w terro?


Użytkownik grankee edytował ten post 25.03.2016 02:17
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 25.03.2016

Jeśli koniecznie chcesz na bieżąco liczyć najlepiej było by użyć eventów zmiany teamu itp. i kontrolować ilość niż tak odpalać zliczanie ciagle

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 25.03.2016


Jeśli koniecznie chcesz na bieżąco liczyć najlepiej było by użyć eventów zmiany teamu itp. i kontrolować ilość niż tak odpalać zliczanie ciagle

Sądząc po treści jaką podał to chodzi tylko o utrzymanie odpowiedniej ilości graczy w obu teamach, zatem informacja o ilości graczy potrzebna jest tylko kiedy ktoś dołącza, czy to jest ciągle albo chociaż często?

Odpowiedz

  • +
  • -
Makale - zdjęcie Makale 25.03.2016

@UP

Dokładnie jak wyżej.

Chcę zrobić limit graczy w drużynie CT. Ten limit ma być "zmienny" na podstawie ilości w TT.

Więc plugin musi mieć dwie główne zmienne: ilość ct i ilość tt. Zmienne te muszą się aktualizować co:

-Dołączenie do drużyny

-Zmiana drużyny (o ile na to chcesz pozwolić)

-Wyjście z gry

 

Na podstawie tego ile jest osób w TT ustala taki limit dla graczy CT.

 

 

Co do postu DarkGL.

Pewno i tak byłoby lepiej tylko zasadnicze pytanie "jak to zrobić?". Dla mnie najłatwiejszym sposobem jest ciągłe liczenie ilości graczy w drużynach.

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 26.03.2016

Ani nie jest to trudne ani też z drugiej strony potrzebne. Przykładowo na jedną mapę dla 20 slotowego serwera dolaczy ktos max 40 razy? czy to duzo na jedna mape? Lepiej liczyc kiedy to potrzebne. Łatwiej byłoby to napisać, gdyby ludzie sami się pchali do ct, a nie plugin ich musiał przerzucać, czy tak się będzie działo?

Odpowiedz

  • +
  • -
Makale - zdjęcie Makale 27.03.2016

Ja już zgłupiałem. Chcę tylko plugin, który ustawi limit CT na podstawie ilości TT. Jeżeli limit CT będzie osiągnięty i ktoś bedzie chciał wbić do CT do wyświetli info, że CT pełne.

Plugin nie musi działać wstecz, że jak zmiejszy się ilość TT to z CT przerzuci do TT.

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 28.03.2016

Musisz przetestować, sam nie mam jak.

#include <amxmodx>
#include <cstrike>
new gOstatniDoCt


public plugin_init() {
	register_plugin("CT limiter","0.1","grankee")
	
	set_cvar_num("mp_limitteams",0)
	set_cvar_num("mp_autoteambalance",0)
	
	register_menucmd(register_menuid("Team_Select",1),(1<<0)|(1<<1)|(1<<4),"teamselect")
	register_clcmd("jointeam","teamselect")
	
}


public teamselect(id)
{
	if(get_user_team(id)==2)
	gOstatniDoCt=id
	return PLUGIN_CONTINUE
}
public client_disconnect(id){
	LimitCt();
}

public PlayersInTeam(team) 
{
	new number = 0;
	for(new i=0; i<=32; i++) 
	{
		if(!is_user_connected(i)) continue;
		
		if(get_user_team(i) != team) continue;
		
		number++;
	}
	return number;
}


public LimitCt() 
{
	if(get_playersnum()<2) return 
	new liczbaTerro = PlayersInTeam(1);
	new liczbaCt=PlayersInTeam(2)
	if((liczbaTerro <= 5 && liczbaCt>1) ||
	(liczbaTerro>5 && liczbaCt<=10 && liczbaCt>2) ||
	(liczbaTerro>10 && liczbaCt<=14 && liczbaCt>3))
	{
		cs_set_user_team(is_user_connected(gOstatniDoCt)?gOstatniDoCt:LosujGracza(2),CS_TEAM_T)
	}
	return 
}
public OstatniCt()
{
	if(is_user_connected(gOstatniDoCt)) return gOstatniDoCt
	
	
	return LosujGracza(2)
}
LosujGracza(team)
{
	if(PlayersInTeam(team)<1) return -1
	new id
	do
	{
		id=random_num(1,32)
	}
	while(get_user_team(id)!=team)
	return id
}


Użytkownik grankee edytował ten post 29.03.2016 03:00
Odpowiedz

  • +
  • -
Makale - zdjęcie Makale 10.04.2016

Dzięki. Już sprawdzam. Wstępnie po kodzie widzę, że o to mi chodziło.

Odpowiedz

  • +
  • -
Makale - zdjęcie Makale 10.04.2016

ale

(liczbaTerro>5 && liczbaCt<=10 && liczbaCt>2) ||
	(liczbaTerro>10 && liczbaCt<=14 && liczbaCt>3))

nie powinno byc tak:

(liczbaTerro>5 && liczbaTerro<=10 && liczbaCt>2) ||
	(liczbaTerro>10 && liczbaTerro<=14 && liczbaCt>3))
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 12.04.2016

Powinno, pisalem na zmeczonego :)

Odpowiedz

  • +
  • -
Makale - zdjęcie Makale 14.04.2016

Hmm raz działa a raz nie. Jak działa to przerzuca żyjacego CT do TT w środku rundy. Może na razie darujmy sobie przerzucanie graczy. Bardziej mi chodzi o to, że jak wbija gracz to żeby nie mógł dojść do CT.

 

Powiedzmy, że jest  3 TT i 1 CT. Wbija gracz i chce dojść do CT to wyświetla się mu info jakieś łądne z colorchatu + dojdzie do TT.

Odpowiedz