Jump to content


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

Posted Image Posted Image

Guest Message by DevFuse
 

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


  • You cannot start a new topic
  • You cannot reply to this topic
14 replies to this topic

#1 IntelCom

    Wszechwiedzący

  • Power User

  • Reputacja: 100
    Zaawansowany

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

Posted 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

Posted 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

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

Edited by oeN., 12.04.2015 15:57.

  • +
  • -
  • 1

#4 MAGNET

    SourceLearned ;)

  • Moderator

  • Reputacja: 661
    Wszechmogący

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

Posted 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

Posted 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

Posted 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,381
Offline

Posted 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

Posted 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

Posted 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

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


Edited by grankee, 13.04.2015 05:30.

  • +
  • -
  • 0

#11 Puchate

    Wszechobecny

  • Użytkownik

  • Reputacja: 204
    Profesjonalista

  • Postów:433
  • Lokalizacja:Polska
Offline

Posted 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

Posted 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

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

Edited by Puchate, 13.04.2015 22:43.

  • +
  • -
  • 1

#14 Sooldierr

    Zaawansowany

  • Użytkownik

  • Reputacja: 3
    Nowy

  • Postów:94
  • Lokalizacja:Turek
Offline

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


Edited by Sooldierr, 22.04.2015 19:31.

  • +
  • -
  • 1

#15 Puchate

    Wszechobecny

  • Użytkownik

  • Reputacja: 204
    Profesjonalista

  • Postów:433
  • Lokalizacja:Polska
Offline

Posted 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




  


1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users

Coinsy CSGOPolygon Za SMS, PSC , Przelew - CoinSell.pro
Skiny do CS:GO za SMS, PSC, Przelew - CSGOPaka.com
Automatyczny Bot Levelowania Steam - LVLUPSteam.com
CSGO Gambling Sites and Free Betting Codes - DreamCodes.gg

Sign In