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

Działanie cmd_access


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

#1 csMaster

    Wszechwiedzący

  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 01.08.2019 20:33

Czy podając w cmd_access() sume bitową flag, funkcja sprawdzi czy gracz ma wszystkie flagi czy tylko jedną z podanych ?


  • +
  • -
  • 0

#2 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 584
Godlike

  • Postów:12 053
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 01.08.2019 20:35

wszystkie
  • +
  • -
  • 0

#3 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 01.08.2019 20:54


stock cmd_access(id, level, cid, num, bool:accesssilent = false) 
{
	new has_access = 0;
	if ( id==(is_dedicated_server()?0:1) ) 
	{
		has_access = 1;
	}
	else if ( level==ADMIN_ADMIN )
	{
		if ( is_user_admin(id) )
		{
			has_access = 1;
		}
	}
	else if ( get_user_flags(id) & level )
	{
		has_access = 1;
	}
	else if (level == ADMIN_ALL) 
	{
		has_access = 1;
	}

	if ( has_access==0 ) 
	{
		if (!accesssilent)
		{
#if defined AMXMOD_BCOMPAT
			console_print(id, SIMPLE_T("You have no access to that command."));
#else
			console_print(id,"%L",id,"NO_ACC_COM");
#endif
		}
		return 0;
	}
	if (read_argc() < num) 
	{
		new hcmd[32], hinfo[128], hflag;
		get_concmd(cid,hcmd,31,hflag,hinfo,127,level);
#if defined AMXMOD_BCOMPAT
		console_print(id, SIMPLE_T("Usage:  %s %s"), hcmd, SIMPLE_T(hinfo));
#else
		console_print(id,"%L:  %s %s",id,"USAGE",hcmd,hinfo);
#endif
		return 0;
	}
	
	return 1;
}
get_user_flags(id) & level

Wystarczy, że jedną będzie mieć.

Natomiast można tą funkcją sprawdzić czy gracz nie ma żadnej flagi z podanych


  • +
  • -
  • 0

#4 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 01.08.2019 21:06

get_user_flags(id) & level

->

get_user_flags(id) & (ADMIN_VOTE|ADMIN_KICK)

Z tego powinno wynikać że funkcja sprawdza czy gracz ma wszystkie flagi (?)


  • +
  • -
  • 0

#5 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 01.08.2019 21:08

Nie, bo tam jest operator iloczynu bitowego a nie zwykłe porównanie.

Jak chcesz sprawdzić czy gracz ma dane flagi uzyj

get_user_flags(id) == level


Rivit (01.08.2019 21:11):
Zresztą co Ci szkodzi przetestować na szybko? Ustaw flage jedną z dwóch i zobacz

  • +
  • -
  • 0

#6 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 01.08.2019 21:28

No nie tak łatwo bo na serwerze lokalnym mam wszystkie flagi. Ale masz racje, funkcja sprawdzi czy gracz ma jedną z flag.

Jeszcze jedno pytanie. Zastanawiam się czy operator '==' sprawdzi czy gracz ma dokładnie takie flagi jak po operatorze czy tylko wszystkie z tych które podam ? Wydaje się że '==' sprawdzi czy wartość get_user_flags(id) jest równe np. 516 (c,i) ale chyba ten operator nie działa tak przy pracy na bitach ?


  • +
  • -
  • 0

#7 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 01.08.2019 21:35


No nie tak łatwo bo na serwerze lokalnym mam wszystkie flagi.

Przeciez zmiana tego stocka to dwie sekundy

 

Zadziała, przeciez flagi to tak naprawdę kolejne potegi dwojki.


  • +
  • -
  • 0

#8 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 01.08.2019 21:39

 


No nie tak łatwo bo na serwerze lokalnym mam wszystkie flagi.

Przeciez zmiana tego stocka to dwie sekundy

 

Zadziała, przeciez flagi to tak naprawdę kolejne potegi dwojki.

 

 

Czyli taka linijka:

get_user_flags(id) == (ADMIN_VOTE|ADMIN_KICK)

Sprawdzi czy jedynymi flagami gracza są 'c' i 'i' ? A więc jak sprawdzić w ten sposób czy gracz ma wszystkie z podanych flag ale niekoniecznie tylko te podane ?


  • +
  • -
  • 0

#9 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 01.08.2019 21:49

new f = read_flags('abc')
get_user_flags(id) & f == f

Rivit (01.08.2019 21:49):
Ale chyba była funkcja do tego w amxx, has_flags chyba czy cos takiego

  • +
  • -
  • 0

#10 Robiin

    Godlike

  • Support Team

Reputacja: 1 121
Super Hero

  • Postów:2 073
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 01.08.2019 22:35

new f = read_flags('abc')
get_user_flags(id) & f == f

 

has_flag


  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#11 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 01.08.2019 22:40

@asiorr w takim razie w dokumentacji jest zły opis działania has_flag(), to samo z access() przy którym pisze że gracz musi mieć wszystkie z podanych flag.

Jednak has_flag() powinno sprawdzać czy gracz ma jedną z flag, w amxmisc.inc widać że ta funkcja używa iloczynu bitowego do sprawdzania flag.


Użytkownik csMaster edytował ten post 01.08.2019 22:49

  • +
  • -
  • 0

#12 Żuk

    Wszechwidzący

  • Użytkownik

Reputacja: 11
Początkujący

  • Postów:291
  • Lokalizacja:Katowice
Offline

Napisano 01.08.2019 23:49

U mnie był problem bo czasami z niewiadomych przyczyn coś nadawało graczom pare flag, potrzebowałem szybko się z tym uporać i też kombinowałem jak sprawdzić czy gracz posiada kilka flag na raz, na szybko ale skutecznie zadziałało to:

if((get_user_flags(id) & ADMIN_VOTE) && (get_user_flags(id) & ADMIN_KICK))

i tak po kolei jakie flagi chcesz, has_flag  w moim wypadku też się nie sprawdzało jakkolwiek bym tego nie użył.

 

//edit

 

https://amxx.pl/topi...agezestaw-flag/


Użytkownik Żuk edytował ten post 01.08.2019 23:53

  • +
  • -
  • 0

#13 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 02.08.2019 05:30

@aSiorr
has_flag tak nie działa...


/* Returns true if the user has ANY of the provided flags
 * false if they have none 
 */
stock has_flag(id, const flags[]) 
{
	return (get_user_flags(id) & read_flags(flags));
}
/* Returns true if the user has ALL of the provided flags
 * false otherwise
 */
stock has_all_flags(id, const flags[]) 
{
	new FlagsNumber=read_flags(flags);
	return ((get_user_flags(id) & FlagsNumber)==FlagsNumber);
}

  • +
  • -
  • 0




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

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