Zablokowanie działania funkcji, gdy admin...
oeN.
12.04.2015
Albo nawet lepiej.
#include <amxmodx> #include <amxmisc> #define PLUGIN "New Plug-In" #define VERSION "1.0" #define AUTHOR "author" new bool:admin_online; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) } public client_connect(id) { if(get_user_flags(id) & ADMIN_BAN && !admin_online) admin_online = true; } public client_disconnect(id) { if(get_user_flags(id) & ADMIN_BAN && admin_online) admin_online = false; } public Funkcja() { if(admin_online) return PLUGIN_CONTINUE; //Kod return PLUGIN_CONTINUE; }
Edited by oeN., 12.04.2015 15:57.
MAGNET
12.04.2015
Niekoniecznie...
Można przy connect'ie jakąś zmienną inkrementować, a przy disconnect'ie dekrementować i tyle
Rivit
12.04.2015
Wersja z pętlą:
stock bool:isAdminOnServer() { for(new id = 0; id <= get_maxplayers(); id++) { if(!is_user_connected(id)) continue; if(!(get_user_flags(id) & ADMIN_BAN)) continue; return true; } return false; }
Powinno zadziałać, pisane z fona, mogą być błędy
GwynBleidD
12.04.2015
Po 1. pamiętajcie moi drodzy, że w client_connect NIE WIEMY, czy gracz jest adminem czy nie. Nawet w client_authorized możemy się tego nie dowiedzieć! (np gdy na serwerze jest amxbans, a admini są wczytywani z bazy danych).
Po 2. pamiętajcie moi drodzy, że w client_disconnect również możemy się nie dowiedzieć czy gracz opuszczający serwer był adminem (jego flagi mogły zostać wyczyszczone wcześniej).
Po 3. pamiętajcie moi drodzy, że admin może stać się adminem właściwie w każdej chwili... Zmieni nick, ktoś wywoła przeładowanie adminów na serwerze, admin będzie miał na jakiś czas i akurat mu się skończy...
Dlatego wersja z pętlą wydaje się lepsza, ale nie jest najlepsza. Najlepszą i najbardziej optymalną wersję osiągniemy gdy przypilnujemy wszystkich okoliczności, tj: złapiemy dokładnie moment w którym ktoś adminem zostaje, złapiemy dokładnie moment w którym adminem przestaje być oraz w inny sposób w client_disconnect sprawdzimy czy to właśnie admin opuścił serwer (być może jakaś tablica typu boolean w której będziemy trzymać kto był adminem?).
grankee
13.04.2015
Nie, ale złapiesz tym np okoliczność zmiany nicku co może wiązać się z przypisaniem flag admina.
Ja bym zostawił pętle, jest pewniejsza i o ile nie będziesz tego używał x razy na sekundę to nie powinno być problemu. Eventów związanych z przypisaniem uprawnień możesz wszystkich nie przewidzieć przez co będziesz miał dziurawy plugin.
Edited by grankee, 13.04.2015 05:30.
Puchate
13.04.2015
Skąd taki pomysł?
Po 2. pamiętajcie moi drodzy, że w client_disconnect również możemy się nie dowiedzieć czy gracz opuszczający serwer był adminem (jego flagi mogły zostać wyczyszczone wcześniej).
GwynBleidD
13.04.2015
Spotkałem się z tym w jakiejś starej wersji amxbans, modowanej przez kogośtam... Z jakiegoś powodu w client_disconnect czyścił on flagi, a że amxbans jest zwykle na szczycie pluginów to inne pluginy w client_disconnect miały już puste flagi.Skąd taki pomysł?Po 2. pamiętajcie moi drodzy, że w client_disconnect również możemy się nie dowiedzieć czy gracz opuszczający serwer był adminem (jego flagi mogły zostać wyczyszczone wcześniej).
Można pokombinować z wykrywaniem użycia set_user_flags w jakiś sposób...Eventów związanych z przypisaniem uprawnień możesz wszystkich nie przewidzieć przez co będziesz miał dziurawy plugin.
Puchate
13.04.2015
Można by w sumie zrobić to tak, aby było dość wydajne
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <amxmisc> #define PLUGIN "Admin online" #define VERSION "0.1" #define AUTHOR "Sn!ff3r" #define FLAG ADMIN_BAN new bool:adminOnline = false new maxPlayers public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) maxPlayers = get_maxplayers() } public admin_check(id) { if(!(get_user_flags(id) & FLAG)) // no update needed { return } adminOnline = false for(new player = 1; player <= maxPlayers; id++) { if(is_user_connected(player) && (get_user_flags(player) & FLAG)) { adminOnline = true break } } } public client_infochanged(id) { if(!is_user_connected(id)) { return PLUGIN_CONTINUE } new newname[32], oldname[32] get_user_name(id, oldname, 31) get_user_info(id, "name", newname, 31) if(!equali(newname, oldname)) { admin_check(id) } return PLUGIN_CONTINUE } public client_disconnect(id) { admin_check(id) } public client_authorized(id) { admin_check(id) }
Edited by Puchate, 13.04.2015 22:43.
Sooldierr
22.04.2015
A z tym przeładowaniem adminów to musiało by wykryć komendę na serwerze amx_reloadadmins? I wtedy pętlą po graczach w celu sprawdzenia/aktualizacji licznika adminów?
BTW:
for(new player = 1; player <= maxPlayers; id++) { if(is_user_connected(player) && (get_user_flags(player) & FLAG)) { adminOnline = true break } }
pętla w nieskończoność, niepoprawna inkrementacja.
Nie id++, a player++
Edited by Sooldierr, 22.04.2015 19:31.
Puchate
22.04.2015
pętla w nieskończoność, niepoprawna inkrementacja.
Fakt, mała pomyłka przy zmianie nazw zmiennych
Jeżeli chce mieć braną pod uwagę obsługę tego to tak, trzeba dodać obsługę tej komendy co można bez problemu zrobić bez ingerencji w plik admin.sma
A z tym przeładowaniem adminów to musiało by wykryć komendę na serwerze amx_reloadadmins? I wtedy pętlą po graczach w celu sprawdzenia/aktualizacji licznika adminów?