Do TT po zrobieniu reconnecta
wonsz żeczny
20.01.2016
Witam.
Próbuję napisać plugin, który za zadanie ma przenoszenie do terrorystów gdy osoba w ciągu 60 sekund zrobi reconnect.
Jednak ten plugin mi nie chce działać a ja bez radny nie wiem dlaczego.
#include <amxmodx> #include <amxmisc> #include <cstrike> #define PLUGIN "Anty Reconnect" #define VERSION "1.0" #define AUTHOR "rst" new bool:wyszedl[33] public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) return PLUGIN_CONTINUE } public client_putinserver(id) { if ((is_user_bot(id)) || ( get_user_flags(id) & ADMIN_IMMUNITY)) return PLUGIN_HANDLED if( wyszedl[id] == true && get_user_team(id) == 2) { przenies(id) } return PLUGIN_HANDLED; } public client_disconnect(id) { if ((is_user_bot(id)) || (get_user_flags(id) & ADMIN_IMMUNITY)) return PLUGIN_HANDLED wyszedl[id] = true set_task( 60.0, "Koniec", id) return PLUGIN_HANDLED; } public Koniec(id) { wyszedl[id] = false } public przenies(id) { if( wyszedl[id] == true) { cs_set_user_team(id, CS_TEAM_T, CS_T_TERROR) client_cmd(id, "say Zrobiles reconnect. Zostales przeniesiony do tt") } }
Użytkownik wonsz żeczny edytował ten post 20.01.2016 15:00
grankee
20.01.2016
Szanowny panie "bez radny"- bezradny piszemy razem, to jest jedno słowo.
Co do Twojego problemu:
1. Nie możesz wewnątrz funkcji client_disconnect(id) sprawdzać czy gracz jest adminem, w zasadzie nie możesz nic tam sprawdzać, bo w momencie wykonania się tej funkcji gracza nie ma już na serwerze. Jeśli potrzebujesz tam informacji o graczu to musisz je wczytać do zmiennej globalnej kiedy gracz wejdzie na serwer, w przypadku informacji czy jest adminem nalezy zrobic to w fukncji client_authorized(id) (nie w client_connect, bo tam gracz jeszcze nie ma przydzielonych flag admina).
2. Nie możesz bazować na numerze id, ponieważ jak gracz wyjdzie i w jego miejsce wejdzie inny gracz to dostanie jego id i wg Twojego pluginu zostanie wzięty jako ten co wyszedł mimo, że to całkiem kto inny. Z resztą, nawet jak gracz da recconecta to niue ma pewności, że dostanie ten sam numer id.
Żeby w miarę dobrze identyfikować graczy musisz na wejsciu (client_authorized) pobierać ich SID/IP do zmiennej globalnej a na wyjściu (client_disconnect) je sprawdzać i zapisywać do zmiennej "wyszedł". Teraz jak gracz wchodzi to porównujesz jego SID/IP z całą tabelą zapisanych SID/IP graczy co wyszli i wtedy wiesz czy był on na serwerze przez ostatnią minutę.
wonsz żeczny
23.01.2016
Zrobiłem teraz korzystając z pluginu "No retry" lecz nadal nie działa.
#include <amxmodx> #include <amxmisc> #include <cstrike> #define PLUGIN "Anty Reconnect" #define VERSION "1.0" #define AUTHOR "rst" #define MAX_PLAYERS 33 new pID[MAX_PLAYERS][22] public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) return PLUGIN_CONTINUE } public client_putinserver(id) { if ((is_user_bot(id)) || ( get_user_flags(id) & ADMIN_IMMUNITY)) return PLUGIN_HANDLED new ip[22] get_user_ip(id,ip,21) for(new i = 1; i < MAX_PLAYERS; i++) { if (equal(ip, pID[i], 21)) { new uID[1] uID[0] = get_user_userid(id) set_task(1.0,"przenies",77,uID,1) } break } return PLUGIN_HANDLED; } public client_disconnect(id) { new ip[22] get_user_ip(id,ip,21) new found = 0; for(new i = 1; i < MAX_PLAYERS; i++) { if (equal(ip, pID[i], 21)) { found = 1 break } } if (found == 0) { for(new i = 1; i < MAX_PLAYERS; i++) { if (pID[i][0] == 0) { get_user_ip(id, pID[i], 21) new aID[1] aID[0] = i set_task( 60.0, "cleanID", (id + MAX_PLAYERS),aID,1) break } } } return PLUGIN_HANDLED; } public cleanID(i[]) { pID[i[0]][0] = 0 } public przenies(id[]) { cs_set_user_team(id[0], CS_TEAM_T, CS_T_TERROR) cs_user_spawn(id[0]) cs_user_spawn(id[0]) client_cmd(id[0], "say Zrobiles reconnect. Zostales przeniesiony do tt") }
Napis z tego
client_cmd(id[0], "say Zrobiles reconnect. Zostales przeniesiony do tt")
Nie wyświetla się.
vanillah
23.01.2016
zamiast
client_cmd(id[0], "say Zrobiles reconnect. Zostales przeniesiony do tt")
spróbuj
client_print(id[0], print_chat, "Zrobiles reconnect. Zostales przeniesiony do tt");
Użytkownik Trikolos edytował ten post 23.01.2016 13:17
wonsz żeczny
23.01.2016
Chodzi o to, że nie przerzuca do tt a z tym napisem chodzi, że plugin nie dochodzi do momentu public przenies(id[])
grankee
23.01.2016
dodałem Ci kilka komentarzy co źle robisz
#include <amxmodx> #include <amxmisc> #include <cstrike> #define PLUGIN "Anty Reconnect" #define VERSION "1.0" #define AUTHOR "rst" #define MAX_PLAYERS 33 new pID[MAX_PLAYERS][22] public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) return PLUGIN_CONTINUE } public client_putinserver(id) { if ((is_user_bot(id)) || ( get_user_flags(id) & ADMIN_IMMUNITY)) return PLUGIN_HANDLED new ip[22] get_user_ip(id,ip,21)//pobnierasz IP gracza for(new i = 1; i < MAX_PLAYERS; i++) { if (equal(ip, pID[i], 21)) //porównujesz IP z UID, nigdy nie będzie takie samo. Musisz albo używać IP albo UID { new uID[1] uID[0] = get_user_userid(id)//nie potrzebne Ci tutaj userid tylko authid (STEAM_costam) set_task(1.0,"przenies",77,uID,1) } break } return PLUGIN_HANDLED; } public client_disconnect(id) { new ip[22] get_user_ip(id,ip,21)//pisałem już wcześniej, nie możesz tutaj pobrać zadnych danych gracza, bo go juz nie ma na serwie new found = 0; for(new i = 1; i < MAX_PLAYERS; i++) { if (equal(ip, pID[i], 21)) { found = 1 break } } if (found == 0) { for(new i = 1; i < MAX_PLAYERS; i++) { if (pID[i][0] == 0) { get_user_ip(id, pID[i], 21) new aID[1] aID[0] = i set_task( 60.0, "cleanID", (id + MAX_PLAYERS),aID,1) break } } } return PLUGIN_HANDLED; } public cleanID(i[]) { pID[i[0]][0] = 0 } public przenies(id[]) { cs_set_user_team(id[0], CS_TEAM_T, CS_T_TERROR) cs_user_spawn(id[0]) cs_user_spawn(id[0]) client_cmd(id[0], "say Zrobiles reconnect. Zostales przeniesiony do tt") }
W ogóle to nie radzę używać pluginu jako bazy jeśli robisz coś więcej niż bardzo drobna modyfikacja, bo więcej stracisz czasu na przerabianie niż napisanie od nowa.
Ogólny zarys:
new gOstatniaMinuta[60][22]//60 to ilosc elementow tablicy, sadze, ze wiecej osob w ciagu minuty nie bedzie sie laczylo, 22 to UID/IP, zmienisz sobie co bedziesz chcial new gPlayersId[33][22]//tu bedzie zapisywal authid gracZy na wejsciu public client_authorized(id) { -pobierasz authid do zmiennej gPlayersId[id] -porownujesz funkcja contain w pętli z każdym elementem tablicy gOstatniaMinuta, pamiętaj, że jak funkcja contain zwróci 0 to znaczy, że porównnane elementy są takie same, jak są inne to zwraca -1. -jeśli znaleziono to przerzucasz do terro, -jeśli nie znaleziono to szukasz pętlą pierwszego wolnego miejsca w tablicy gOstatniaMinuta i wpisujesz tam UID(szukania dokonujesz sprawdzając wartość pierwszego elementu tablicy czyli gOstatniaMinuta[i][0], dalej w kodzie bedziesz go ustawial na 0 -szukasz petla pierwszego wolnego miejsca w tablicy gOstatniaMinuta i zapisujesz tam UID } public client_disconnect(id) { -szukasz petla pierwszego wolnego miejsca w tablicy gOstatniaMinuta i zapisujesz tam gPlayersId[id] -robisz taska na minute, który ustawi na 0 pierwszy znak w tej tablicy (gOstatniaMinuta[numer_miejsca_jakiego_uzyles][0]=0) }
Użytkownik grankee edytował ten post 23.01.2016 15:52
wonsz żeczny
23.01.2016
#include <amxmodx> #include <amxmisc> #include <cstrike> #define PLUGIN "Anty Reconnect" #define VERSION "1.0" #define AUTHOR "rst" #define MAX_PLAYERS 33 new gOstatniaMinuta[60][22] new gPlayersId[33][22] public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) } public client_authorized(id) { if ( get_user_flags(id) & ADMIN_IMMUNITY ) return PLUGIN_HANDLED // jak to sprawdzic :/ get_user_authid( gPlayersId[id] ) // tak tez nie zbyt get_user_authid(id, gPlayersId[id] ) for(new i = 1; i < MAX_PLAYERS; i++) { if (contain( gPlayersId[i][], gOstatniaMinuta[i]) ) { set_task(1.0, "przenies", gPlayersId[i]) } else { // dobrze szukam? for( gOstatniaMinuta[i][0], OstatniaMinuta[i] < 60, OstatniaMinuta[i]++ ) { new uID[i] uID[i] = 0 } } } } public client_disconnect(id) { // dobrze szukam? for( gOstatniaMinuta[i][0], OstatniaMinuta[i] < 60, OstatniaMinuta[i]++ ) { // jak zapisac ? hmm gPlayersId[i] = 1 // tutaj tez sie zabugilem set_task(60.0, gOstatniaMinuta[i][0] = 0) } } public przenies(id[]) { cs_set_user_team(id[0], CS_TEAM_T, CS_T_TERROR) cs_user_spawn(id[0]) cs_user_spawn(id[0]) client_cmd(id[0], "say Zrobiles reconnect. Zostales przeniesiony do tt") }
Takich rzeczy jeszcze nie ogarniam, kilka wskazówek by się przydało
grankee
23.01.2016
#include <amxmodx> #include <amxmisc> #include <cstrike> new gOstatniaMinuta[60][22] new gPlayersId[33][22] new gDoTerro[33] public plugin_init() { register_plugin("Force tt after retry","0.1","grankee") register_event("TeamInfo","team_assign","a") } public client_authorized(id) { if ( get_user_flags(id) & ADMIN_IMMUNITY ) return PLUGIN_CONTINUE gDoTerro[id]=0 get_user_authid(id,gPlayersId[id],21 )//authid jest pobierane jako ciąg znaków, zwykły "wyraz" for(new i = 1; i < /*MAX_PLAYERS*/60/*tu musi byc 60, bo szukamy wsrod 60-elementowej tablicy*/; i++) { if (contain( gPlayersId[id], gOstatniaMinuta[i]) ==0) //pisałem Ci: 0 oznacza, że są takie same! { //set_task(1.0, "przenies", gPlayersId[i])//przenoszenie od razu bedzie robiło bugi, bo gracz nie dołączył jeszcze do drużyny, trzeba zapisac jego id jako przypisane do wymuszenia druzyny i forsowac to w evencie jointeam gDoTerro[id]=1 gOstatniaMinuta[i][0]=0//zwalniamy miejsce w tablicy } } return PLUGIN_CONTINUE } public client_disconnect(id) { // dobrze szukam? for( new a=0;a<60;a++) { if(gOstatniaMinuta[a][0]==0)//wolne miejsce w tablicy { copy(gOstatniaMinuta[a],21,gPlayersId[id])//kopiujemy tutaj SID osoby opuszczającej serwer set_task(60.0,"usun_minute",a)//robimy taska, co ma sie usunac za minute return PLUGIN_CONTINUE } } log_amx("Tablica gOstatniaMinuta okazala sie za mala, zwieksz ja!")//na wypadek jak w praktyce okaze sie, ze jest za mala, sprawdzaj logi i jak znajdziesz ten napis to zwieksz return PLUGIN_CONTINUE } public usun_minute(id) { gOstatniaMinuta[id][0]=0 } public team_assign() { static old_team[33] new tid new id = read_data(1) new Team[32] read_data(2,Team,31) //UNASSIGNED //TERRORIST //CT //SPECTATOR if(equal(Team,"UNASSIGNED")) tid = 0 else if(equal(Team,"TERRORIST")) tid = 1 else if(equal(Team,"CT")) tid = 2 else if(equal(Team,"SPECTATOR")) tid = 3 if(old_team[id]==tid) return PLUGIN_CONTINUE //jesli druzyna sie nie zmienila to przerywamy event old_team[id] = tid //zapisujemy nowy team if(gDoTerro[id]==1) { cs_set_user_team(id,CS_TEAM_T) gDoTerro[id]=0 } return PLUGIN_CONTINUE // skoro juz uzylismy returna to musimy tez na koniec go dac }
Tylko w tej wersji gracz przylapany na retry nie bedzie mogl wejsc do tt juz do konca mapy
Użytkownik grankee edytował ten post 25.01.2016 21:31
wonsz żeczny
24.01.2016
Próbowałem tak ale kompilator wywalał errory więc sobie odpuściłem
get_user_authid(id,gPlayersId[id],21 )
A o co chodzi z tym?
Tylko w tej wersji gracz przylapany na retry nie bedzie mogl wejsc do tt juz do konca mapy
Czy że do ct nie będzie mógł?
grankee
25.01.2016
znaczy do ct, bedzie go wrzucalo juz do konca mapy do tt
get_user_authid(id,gPlayersId[id],21 )
A o co chodzi z tym?
Standardowe pobranie ciągu znaków do tablicy zmiennych
Użytkownik grankee edytował ten post 25.01.2016 13:20
wonsz żeczny
25.01.2016
A można by zrobić aby mógł potem do tego tt, np. gdy drużyny są nie równe to aby mogło go przerzucić.
grankee
25.01.2016
tak, już zedytowałem treść pluginu, teraz po dołączzeniu odblokuje się wejście do terro, ale musisz zadbać, aby ptb blokowało samodzielne zmienianie drużyn, będzie bowiem ciężko zablokować graczowi zmianę drużyny a jednocześnie umożliwić to PTB (czy jakiego tam balancera uzywasz). Trzebaby natywy robić i edytować także ptb