Limit CT - funkcja licząca graczy w TT
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.
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
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
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
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.
OKCancel
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")
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
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
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()
OKCancel
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
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
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?
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.
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?
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.
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
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))
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.