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

Zablokowanie działania funkcji, gdy admin jest na serwerze.


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
14 odpowiedzi w tym temacie

#1 IntelCom

    Wszechwiedzący

  • Power User

Reputacja: 100
Zaawansowany

  • Postów:500
  • GG:
  • Imię:Dawid
  • Lokalizacja:Opole
Offline

Napisano 12.04.2015 14:01

Jak poprawnie zablokować daną funkcję, gdy admin jest obecny na serwerze?
  • +
  • -
  • 0

#2 MAGNET

    SourceLearned ;)

  • Moderator

Reputacja: 661
Wszechmogący

  • Postów:1 535
  • GG:
  • Imię:Olek
  • Lokalizacja:Dalekoo
Offline

Napisano 12.04.2015 15:34

przelecieć pętlą po graczach?


  • +
  • -
  • 1

#3 oeN.

    Wszechwidzący

  • Użytkownik

Reputacja: 95
Zaawansowany

  • Postów:294
  • Lokalizacja:Dom
Offline

Napisano 12.04.2015 15:56

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;
}

Użytkownik oeN. edytował ten post 12.04.2015 15:57

  • +
  • -
  • 1

#4 MAGNET

    SourceLearned ;)

  • Moderator

Reputacja: 661
Wszechmogący

  • Postów:1 535
  • GG:
  • Imię:Olek
  • Lokalizacja:Dalekoo
Offline

Napisano 12.04.2015 15:58

oeN.

a co jeśli na serwerze będzie 2 adminów i jeden wyjdzie?


  • +
  • -
  • 0

#5 oeN.

    Wszechwidzący

  • Użytkownik

Reputacja: 95
Zaawansowany

  • Postów:294
  • Lokalizacja:Dom
Offline

Napisano 12.04.2015 16:07

No fakt... Czyli bez pętli się nie obejdzie.


  • +
  • -
  • 0

#6 MAGNET

    SourceLearned ;)

  • Moderator

Reputacja: 661
Wszechmogący

  • Postów:1 535
  • GG:
  • Imię:Olek
  • Lokalizacja:Dalekoo
Offline

Napisano 12.04.2015 16:08

Niekoniecznie...

 

Można przy connect'ie jakąś zmienną inkrementować, a przy disconnect'ie dekrementować  i tyle


  • +
  • -
  • 0

#7 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 12.04.2015 17:45

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


  • +
  • -
  • 1

#8 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 12.04.2015 18:14

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?).


MAGNET (12.04.2015 18:16):
Ajajajaj Sory za minusa
Na telefonie jestem i się kliknęło

  • +
  • -
  • 3

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#9 oeN.

    Wszechwidzący

  • Użytkownik

Reputacja: 95
Zaawansowany

  • Postów:294
  • Lokalizacja:Dom
Offline

Napisano 12.04.2015 21:46

A czy client_infochanged tutaj sprawdzi czy graczowi zmieniły się flagi?


  • +
  • -
  • 0

#10 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

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

Napisano 13.04.2015 05:28

 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.


Użytkownik grankee edytował ten post 13.04.2015 05:30

  • +
  • -
  • 0

#11 Puchate

    Wszechobecny

  • Użytkownik

Reputacja: 204
Profesjonalista

  • Postów:433
  • Lokalizacja:Polska
Offline

Napisano 13.04.2015 09:37


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).

Skąd taki pomysł?
  • +
  • -
  • 0

#12 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 13.04.2015 10:51

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).

Skąd taki pomysł?

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.

Eventów związanych z przypisaniem uprawnień możesz wszystkich nie przewidzieć przez co będziesz miał dziurawy plugin.

Można pokombinować z wykrywaniem użycia set_user_flags w jakiś sposób...
  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#13 Puchate

    Wszechobecny

  • Użytkownik

Reputacja: 204
Profesjonalista

  • Postów:433
  • Lokalizacja:Polska
Offline

Napisano 13.04.2015 22:42

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) 
}

Użytkownik Puchate edytował ten post 13.04.2015 22:43

  • +
  • -
  • 1

#14 Sooldierr

    Zaawansowany

  • Użytkownik

Reputacja: 3
Nowy

  • Postów:94
  • Lokalizacja:Turek
Offline

Napisano 22.04.2015 19:28

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++


Użytkownik Sooldierr edytował ten post 22.04.2015 19:31

  • +
  • -
  • 1

#15 Puchate

    Wszechobecny

  • Użytkownik

Reputacja: 204
Profesjonalista

  • Postów:433
  • Lokalizacja:Polska
Offline

Napisano 22.04.2015 22:14

 

pętla w nieskończoność, niepoprawna inkrementacja.

 

Fakt, mała pomyłka przy zmianie nazw zmiennych :)


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?

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
  • +
  • -
  • 0




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

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