Jump to content
Prosíme všetkých užívateľov, ktorý sa chcú opätovne pripojiť na discord aby znovu spárovali svoje účty kliknutím na "Discord" v navigácií a pripojili sa na server Read more... ×
Sign in to follow this  
Nope

návod Oprávnění (Admin/Vip) 2019 - Systémy #3

Recommended Posts

OprávněníAdmin/Vip 2019 Systémy #3

*****

Pojďme si udělat návod na všechny "systémy" individuálně.:weSmart:
Vítejte u dalšího dílu PAWN kouzla zbaven.

Obsah

1. Doporučené návody, includy a pluginy,
2. Makra a proměnné,
3. Makra a zprávy, že je něco špatně,
4. Jednoduché použití,
5. Užitečné funkce,
6. AdminChat i VipChat,
7. Ranky, tituly, tagy,
8. Seznam online administrátorů či VIPs.

Doporučené návody, includy a pluginy

Běžně lze udělat celý Admin/Vip systém bez jakýkoliv cizích includů, akorát je to těžší a v některých případech dokonce pomalejší. Tady je jakési moje doporučené includy/pluginy a i návody pro usnadnění práce:

1. Sscanf2 
Rozhodně doporučuji. Univerzální plugin/fce pro práci s více parametry u příkazů.

2. Double-O-Files2 (dof2)
Jednoduché a prosté pro práci se soubory. Je to konkurent dini, ačkoliv se s ním pracuje prakticky stejně.

3. i-zcmd
Vylepšená verze zcmd. Ale obyčejná či vylepšená, obě verze jsou konkurenti snadného použití a v rychlosti na rozdíl od dcmd.

4. y_commands+y_ini
Pro náročné. Lze využít i knihovnu YSI. Nejen, že obsahuje oba užitečné includy(1. na příkazy, 2. na soubory), ale i hromadu dalších. Rozhodně užitečné a výborné na tvorbu právě různých oprávnění. Akorát, uživatel jí musí dobře znát, stejně jako samotné pawn.

 

Pro naše účely využijeme, sscanf2, dof2 a i-zcmd.
Makra a proměnné
Celý systém je prakticky z 50 % tvořen jedinou proměnnou a to:

new AdminLevel[MAX_PLAYERS];

To je všechno.  Není to žádná magie. Pouze jediná proměnná je celý základ. Ta pomůcka co kontroluje všechna oprávnění. S touhle proměnnou už lze snadno pracovat. Stejně se pracuje i s oprávnění na vip hráče. Jediný rozdíl je v tom, jestliže chceme, aby bylo jediné VIP (aka jediné 2 možnosti a to má, nebo nemá), tak deklarujeme proměnnou jen s jiným datovým typem:

new bool:IsPremium[MAX_PLAYERS];

Teď makra. Několik doporučení ode mě (ale není to nutné). První zmenšit počet max hráčů. Číslo 500 není zrovna málo. A je malá šance, že někdo se dostane k více než ke 100 lidí, tak si jednoduše redefinujeme (to znamená opět definovat). Možná jste to často mohli vidět jen jako další makro aka MAX_PLAYERS_EX, ale to nechceme, stačí redefinovat:

#undef MAX_PLAYERS
/* Lze i vepsat menší číslo například 50 */
#define MAX_PLAYERS 100 

Druhé doporučení a to udělat si makra jako fce. Stejně jako máme fce IsPlayerAdmin, můžeme k tomu přizpůsobit i naší proměnnou:

#define GetPlayerAdminLevel(%0) AdminLevel[%0]

A ještě jedna maličkost a to si definovat rovnou určitá jména pro určitá oprávnění. Sice to jsou pouze čísla, ale může se to hodit pro usnadnění:

#define player 	(0)
#define helper 	(1)
#define mod 	(2)
#define admin 	(3)
#define owner 	(4)

Použití je stejné snadné jako práce s proměnnou samotnou:

if (GetPlayerAdminLevel(playerid) == helper) return SCM(playerid, -1, "Hráč je Pomocník ");

A u VIP:

#define IsPlayerVip(%0) IsPremium[%0]
/* Sample code */
	if (!IsPlayerVip(playerid)) return SendClientMessage(playerid, -1, "Nejsi VIP ole!");

No a pak tu máme samozřejmě i makra pro barvy, což je i celkem zřejmé a dost známé:

#define COLOR_YELLOW 0xFFFF0000

Makra a zprávy, že je něco špatně
Tohle je spíše pro lenochy a programátory, co ví, že se určité zprávy budou vícekrát opakovat (špatně napsané parametry, nemá dostatečné oprávnění...), tak i na to lze použít také makra. Nejdříve si definujeme vlastní fci, už s předem známou barvou a to červenou, jinak argumenty jako je playerid a text zůstanou stejné:

#define SendErrorMessage(%0,%1) SendClientMessage(%0,0xFF000000,%1)

A pod ní už můžeme definovat i vlastní obsahy těchto zpráv, například:

#define MSG_PERM "[ ! ] {FFFFFF}Nemáš dostatečné oprávnění"
#define MSG_VIP "[ ! ] {FFFFFF}Nevlastníš vip účet!"

Použití je celkem prosté. vložíme do naší fce i makro naší zprávy:

CMD:say(playerid, params[]) {

	if (GetPlayerAdminLevel(playerid) < helper) return SendErrorMessage(playerid, MSG_PERMS);

Má to hned 2 výhody. Za 1. nemusíme neustále psát (kopírovat) obsah zprávy, a za 2. můžeme obsah snadno kdykoliv změnit.
Jednoduché použití
Ukážeme si použití všech složek(sscanf, příkazy), kromě jediné (ukládání) v jednom příkazu, kde je více parametrů a to k nastavení pozice:
Začneme přidáním maker pro naši error zprávu:

#define MSG_PARAMS "[ ! ] {FFFFFF}Špatně vepsané parametry !"
#define MSG_INVALID_ID "[ ! ] {FFFFFF}Tento hráč není připojený !"

Tady několik začátečníku dělá jednu zbytečnou chybu. Nejdříve deklaruje proměnné a až poté kontroluje, jestliže hráč má oprávnění. Takže naopak, nejdříve zjistíme, zda má hráč oprávnění a až pak deklarujeme proměnné, naopak by to bylo zbytečné, když se stejně nepoužijí:

CMD:setpos(playerid, params[]) {

	if (GetPlayerAdminLevel(playerid) < mod) return SendErrorMessage(playerid, MSG_PERMS);

A nyní až deklarujeme proměnné. Musíme si hlídat datový typ, jelikož nastavujeme pozice a ty nejsou int.
Pro tento účel postačí, když bude u hráče hledat pouze ID (nikoliv nick):

	new 
		id,
		Float: xpos,
		Float: ypos,
		Float: zpos;
	if (sscanf(params, "ifff", id, xpos, ypos, zpos)) return SendErrorMessage(playerid, MSG_PARAMS);

A samozřejmě ještě kontrolujeme, zda napsat správné ID hráče:

if (!IsPlayerConnected(id)) return SendErrorMessage(playerid, MSG_INVALID_ID);

A to je všechno. Pak už jen nastavujeme pozici (poznámka: nezapomeňte na případ zda je ve vozidle!):

	SetPlayerPos(id, xpos, ypos, zpos);
	return CMD_SUCCESS;
}

Užitečné funkce
(Jelikož na 100 % ty fce použijete, tak jsem se rozhodl vynechat stock)
Jedna z nejpoužívanějších a nejznámějších fci je zjištění jména hráče:

GetPlayerNick(playerid) {
	
	new 
		Playernick[MAX_PLAYER_NAME + 1];
	GetPlayerName(playerid, Playernick, MAX_PLAYER_NAME);
	return Playernick;
}

Další fce co já osobě používám snad v každém systému, co tvořím nebo jsem vytvořil tak ne fce na ukládání a načítání údajů. A aby to nebylo málo, tak lze všechny údaje načítat rovnou, včetně hesla i statistik i během teprve přihlašování na server, protože bez správného hesla na serveru nebude pokračovat a se správným budou už jeho údaje načtené, takže není třeba ukládat více souborů:

SavePlayerData(playerid) {

	new 
		Float: phealth,
		Filepath[30];
	format(Filepath, 30, "Data/%s.sav", GetPlayerNick(playerid));
	GetPlayerHealth(playerid, phealth);	
	if (!DOF2_FileExists(Filepath)) DOF2_CreateFile(Filepath);
	DOF2_SetInt(Filepath, "AdminLevel", GetPlayerAdminLevel(playerid));
	DOF2_SetFloat(Filepath, "Health", phealth);
	DOF2_SetBool(Filepath, "IsVip", IsPlayerVip(playerid));
	DOF2_SaveFile();
	return 1;
}
LoadPlayerData(playerid) {

	new 
		Filepath[30];
	format(Filepath, 30, "Data/%s.sav", GetPlayerNick(playerid));
	GetPlayerHealth(playerid, phealth);	
	if (!DOF2_FileExists(Filepath)) return 1;
	AdminLevel[playerid] = DOF2_GetInt(Filepath, "AdminLevel");
	SetPlayerHealth(playerid, DOF2_GetFloat(Filepath, "Health", phealth));
	IsPremium[playerid] = DOF2_GetBool(Filepath, "IsVip");
	return 1;	
}

Použití je prosté, například při odchodu ze serveru:

public OnPlayerDisconnect(playerid, reason) {

	// Sample code
	SavePlayerData(playerid);
	return 1;
}

AdminChat i VipChat

public OnPlayerText(playerid, text[]) {

	/* Nejdříve zjistíme, jestliže jeho první znak vepsaný do chatu je vykříčník */
	if (text[0] == '!') {

		/* Poté jestliže je vůbec VIP, pokud ne, odešle se obyčejný text */
		if (IsPlayerVip(playerid)) {

			/* Tady si deklarujeme řetězec a naformátujeme zprávu, která se odešle */
			new 
				String[144 + 1];
			format(String, sizeof String, "[ VIPS ] %s: %s", GetPlayerNick(playerid), text[1])

			/* Zacyklíme všechny přítomné hráče*/
			for (new i; i < MAX_PLAYERS; i++) {

				if (IsPlayerConnected(i)) {

					/* Zjistíme, jestliže i oni jsou VIP */
					if (IsPlayerVip(i)) {

						/* A odešleme jim zprávu */
						SendClientMessage(i, 0x00FF0000, String);
					}
				}
			}
		}
	}
	return 1;
}

AdminChat pracuje na úplně stejném principu s DROBNÝM rozdílem. Jediné co se zjišťuje, zda má adminlevel namísto VIP.
Ranky, tituly, tagy
Tak to neni nic jednoduššího než jen změnit v OnPlayerText() způsob, co za text se odešle.
Najdeme si nějaký způsob jak zjistit, zda hráč má nějaký titul vůbec. Můžeme například zjistit, zda počet znaků je více než 3:

	if (strlen(TitulHrace[playerid] > 3)) {

		new 
			String[144 + 1];
		format(String, sizeof String, "%s %s: %s", TitulHrace[playerid], GetPlayerNick, text);
		SendClientMessageToAll(0x00FF0000, String);
		return 0;
	}

Seznam online administrátorů či VIPs
Tak to už jsem několikrát psal návod jak na to v sekci Pomoc:

Citace

/*

	Pro úspěšné zobrazení potřebuješ minimálně tyto 3 proměnné:
	- Content = Obsah textu jako jsou jména adminů, jejich level či RCON,
	- Connected = Proměnná, která potvrdí, že je nějaký admin online, 
	- Nick = Jestliže nemáš fci na zjištění jména, tak je potřeba proměnná do fce GetPlayerName,
*/
	new 
		bool: Connected,
		Nick[MAX_PLAYER_NAME + 1],
		Content[512 + 1];
/*
	- Logicky, pro všechny hráče využiješ cyklus.
	- Taková malá vychytávka od vEnda: Pokud chceš přeskočit nepřipojené id hráče, využiješ na to
	  continue za pomocí podmínky zda nejsou připojení.

*/

	for (new i = 0; i < MAX_PLAYERS; i++) {

		if (!IsPlayerConnected(i)) continue;

	/* 	Jestlize na serveru mas nejakou promennou, která obsahuje udaje, zda admin bude skryt v nejakem seznamu,
		tak na to snadno pouzijes podminku: */
		if (Hidden[i] == false) {

	/*	Nejdrive hledat zda nejaký z tech hracu na serveru má AdminLevel, takze jednoducha podminka: */

			if (AdminLevel[i] > 0) {

	/* Az sem prirazujes k promenné Connected hodnotu true, protože by to jinak mohl byt jakýkoliv hráč co je
		momentálně na serveru, i když nemá admin level. */
				Connected = true;
	/* Zjistis jméno toho admina pomocí fce: */ 
				GetPlayerName(i, Nick, MAX_PLAYER_NAME);
	/* A všechny zjištěné údaje vložíš do formatu a pridas k obsahu ve Concent: */
				format(Concent, ..., "%s\nAdmin %s [ LEVEL %i]", Content, Nick, AdminLevel[i]);
			}
	/* Pak si samozřejmě zjistíš, jestlize nikdo z nich nemá admina, tak jestliže je alespoň přihlášen
	   na RCON a to fcí: */
			if (IsPlayerAdmin(i)) {

				Connected = true;
				GetPlayerName(i, Nick, MAX_PLAYER_NAME);
	/* Tady už jen rozlišíš zda má level či ne a pozor, pokud nemá, tak se ve formátování vyloučí AdminLevel */
				if (AdminLevel[i] == 0) format(Concent, "Admin %s [ RCON ]", Content, Nick);
				else format(Concent, ..., "Admin %s [ LEVEL %i + RCON ]", Content, Nick, AdminLevel[i]);
			}

	}
	/* Další jednoduchá podmínka, pokud je nějaký admin online, zobrazí dialog, jestli ne, odešle zprávu */
	if (Connected == true) return ShowPlayerDialog(playerid, ...);
	else return SendClientMessage(playerid, -1, "Admini nejsou online");

 

Odkazy
Anketa2019  Systémy #1 - [Topic] [Pastebin]
Carmenu2019 Systémy #2 - [Topic] [Pastebin]
Oprávnění (Admin/Vip)2019 Systémy #3 - [Pastebin]

WhiteFlashyGoshawk-size_restricted.gif&key=9ae98bc298c254f5893c36f9819ca4e4209e7018d545ee665b211d581277691e

Edited by Scydo
obtížnost
  • Líbí se mi to! (+1) 2

Sdílet tento příspěvek


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×