Jump to content

návod [YSI] Admins [*] #3


Scydo

Recommended Posts

YSI4 ADMINS #3
*****

Zdravím vás u dalšího návodu práce s YSI. Dnešní díl se bude týkat velice známého příkazu /admins. Nevyužijeme bohužel knihovnu na plno, ale hledal jsem způsob, jak vám ukázat využití iterate(foreach).
Hledal jsem nějakou zajímavou ukázku. Jenže, takových scriptů je skutečně mnoho, od návodů, po helpy, kde někteří autoři mají dokonce svojí vlastní. Tak jsem vybral asi ten nejpříhodnější:



 

dcmd_admins(playerid, params[])
//WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
{
	#pragma unused params
	if(GetCountOfAdmins() == 0) 	return ShowPlayerDialog(playerid,50,DIALOG_STYLE_MSGBOX,"{ffa500}Upozornění","{ffff00}Na serveru není přítomen žádný Administrátor!","Potvrdit","");
	new string[255];
	for(new i=0;i<MAX_PLAYERS;i++)
	{
		if(IsPlayerConnected(i))
		{
			if(IsPlayerAdmin(i) && p_info[i][admin_level] == 0)
			{
					format(string, 60, "{f0ffff}[ ID:%d ] Nick : %s [ RCON ]",i,name(i));
					ShowPlayerDialog(playerid,51,DIALOG_STYLE_MSGBOX,"{ffa500}Administrátoři On-line",string,"Potvrdit","");
			}
			else if(p_info[i][admin_level] > 0 && !IsPlayerAdmin(i))
			{
					format(string, 60, "{f0ffff}[ ID:%d ] Nick : %s [ LEVEL %d ]",i,name(i),p_info[i][admin_level]);
					ShowPlayerDialog(playerid,51,DIALOG_STYLE_MSGBOX,"{ffa500}Administrátoři On-line",string,"Potvrdit","");
			}
			else if(IsPlayerAdmin(i) && p_info[i][admin_level] > 0)
			{
					format(string, 60, "{f0ffff}[ ID:%d ] Nick : %s [ LEVEL %d + RCON ]",i,name(i),p_info[i][admin_level]);
					ShowPlayerDialog(playerid,51,DIALOG_STYLE_MSGBOX,"{ffa500}Administrátoři On-line",string,"Potvrdit","");
			}
		}
 	}
	return 1;
}

 



Kód, celkem už slušnější, nám zaslal autor do helpu (pawno.cz/topic/41048), s tím, že prý s tím má problém, ale i tak ho můžeme využít jako ukázku. Nebudeme pracovat s jmény místo levelů. To si tam můžete již každý přidat individuálně.
No, pustíme se do toho, nejdříve si jako vždy nahrajeme includy z knihovny, které budeme potřebovat pro práci:

  • YSI_Visual\y_commands - pro lepší, efektivnější práci s příkazy, včetně parametrů.
  • YSI_Data\y_iterate - Dříve známo jako foreach. Zjednodušený, rychlejší a efektivnější cyklus, se kterým se lépe pracuje.
  • YSI_Visual\y_dialog - Include je propracovaný tak, aby se dialogID, se kterým bude s tímto includem pracovat, aby se nekřížil s nějakým jiným.
  • YSI_Server\y_colours - Obsahuje propracované preprocesory s barvami, které pak může uživatel jednoduše využít prakticky kdekoliv.

Potřebné includy z knihovny máme nahrané a tak můžeme pokračovat. Začneme tím, že si deklarujeme jednu integer proměnnou, která nám bude sloužit jako AdminLevel našich hráčů:


new 
	iAdmin[MAX_PLAYERS char];

Všimněte si slovíčka char. Co je to? Zkráceně a zjednodušeně, nám to vrátí číslo po dělení pole číslem 4(například [200] / 4 = [50]). Dále si přidáme samozřejmě příkaz, který nám bude zobrazovat naše administrátory:



YCMD:admins(playerid, params[], help) {

Tak, a ťed budeme potřebovat deklarovat lokálně tři proměnné. Dvě budou string, přesněji první proměnná string bude pro text v dialogu a druhý pro nick, a třetí proměnná bude integer, který nám bude udávat počet přitomných administrátorů na serveru:



	new 
		sString[800 + 1],
		sNick[MAX_PLAYER_NAME + 1],
		iPocet;

Když to máme za sebou, tak za další budeme přidat samotný cyklus, kterým nám projete všechny hráče na serveru. Princip foreach je prakticky stejný jako cyklus se GetPlayerPoolSize, ale samozřejmě lepší:



	foreach(new i: Player) {

Slovíčko Player nám říká, že cyklus má project pouze přítomné hráče na serveru. Je samozřejmě více možností pro cyklus(Bot, Character, Actor, Vehicle). Po cyklusu následuje funkce, která nám všech hráčů zjistí jméno. Můžeme jí samozřejmě přidat, že je bude zjišťovat, až najde ty naše administrátory, ale zas taková hrůzná to nebude, když to necháme takhle mimo:



		GetPlayerName(i, sNick, sizeof(sNick));

Konečně můžeme hledat naše administrátory. Postačí nám 2 úplně základní a typické podmínky, a to sice, jestliže má nějaký AdminLevel a pokud je přihlášen na rcon. Začneme podmínkou v případě, že je přihlášen na RCON ale nemá AdminLevel, včetně formatování samozřejmě, a nesmíme zapomenou zvyšovat naší proměnnou iPocet:



		if(IsPlayerAdmin(i) && !iAdmin{i}) format(sString, sizeof(sString), "{%06x}%s\t{FFFFFF}\t+RCON", GetPlayerColor(i) >>> 8, sNick, iPocet++;

Další podmínkou v případě, že není přihlášen na RCON ale má nějaký AdminLevel:



		if(!IsPlayerAdmin(i) && iAdmin{i}) format(sString, sizeof(sString), "{%06x}%s\t{FFFFFF}LEVEL %i\t", GetPlayerColor(i) >>> 8, sNick, iAdmin{i}), iPocet++;

A třetí podmínkou v případě, že je přihlášen na RCON a zároveň má nějaký AdminLevel:



		if(IsPlayerAdmin(i) && iAdmin{i}) format(sString, sizeof(sString), "{%06x}%s\t{FFFFFF}LEVEL %i\t+RCON", GetPlayerColor(i) >>> 8, sNick, iAdmin{i}), iPocet++;

Všimněte si, jak pracujeme s tou proměnnou. Jako s boolen. Tudíž, v případě, jestli vrací true/false, nikoliv číslo... k čemu? Jelikož, nepotřebujeme vědět jaký má přesně adminlevel (1, 2, 3...), nám stačí, pokud nějaký má(1) a pokud má žádný(0). A ano přesně tak. To jsou stejné hodnoty jako u boolenu: true(1) a false(0).

Když máme tyhle podmínky za sebou, tak za další budeme potřebovat podmínku, jestliže je vůbec nějaký přítomný administrátor. Na to nám poslouží naše lokální proměnná. Začneme v případě, že nejsou, tak nám pomocí návratové hodnoty zobrazí zprávu:



	if (!iPocet) return (SendClientMessage(playerid, X11_RED, "[ ! ] Nikdo z přítomných hráčů není administrátor !"));

V případě, že je nějaký přítomný, tak budeme potřebovat už blok, jelikož se stane více věci. Začneme tím, že si formátujeme string s našimi administrátory:



		format(sString, sizeof(sString), "%s\n\n{A9C4E4}Počet online administrátorů: {FFFFFF}%i", sString, iPocet);

A nakonec zobrazíme samotný dialog. Díky y_dialog nemusíme vepisovat dialogID, najde nám samo, které nejnižší dialogID je volné:



		Dialog_Show(playerid, DIALOG_STYLE_TABLIST, "Administrátoři Online", sString, "Zavrit", "");

Pak už jen ukončíme blok a ukončíme i příkaz návratovou hodnotou a máme hotovo:



	}
	return (true);
}

ukazka.png

Celý kód pro shlédnutí zde:

 

#include <a_samp>
#include <YSI_Visual\y_commands>
#include <YSI_Data\y_iterate>	
#include <YSI_Visual\y_dialog>
#include <YSI_Server\y_colours>

new 
	iAdmin[MAX_PLAYERS char];

YCMD:admins(playerid, params[], help) {

	new 
		sString[800 + 1],
		sNick[MAX_PLAYER_NAME + 1],
		iPocet;
	foreach(new i: Player) {

		GetPlayerName(i, sNick, sizeof(sNick));
		if(IsPlayerAdmin(i) && !iAdmin{i}) format(sString, sizeof(sString), "{%06x}%s\t{FFFFFF}\t+RCON", GetPlayerColor(i) >>> 8, sNick), iPocet++;
		if(!IsPlayerAdmin(i) && iAdmin{i}) format(sString, sizeof(sString), "{%06x}%s\t{FFFFFF}LEVEL %i\t", GetPlayerColor(i) >>> 8, sNick, iAdmin{i}), iPocet++;
		if(IsPlayerAdmin(i) && iAdmin{i}) format(sString, sizeof(sString), "{%06x}%s\t{FFFFFF}LEVEL %i\t+RCON", GetPlayerColor(i) >>> 8, sNick, iAdmin{i}), iPocet++;
	}
	if (!iPocet) return (SendClientMessage(playerid, X11_RED, "[ ! ] Nikdo z přítomných hráčů není administrátor !"));
	else {
		format(sString, sizeof(sString), "%s\n \n\t{A9C4E4}Počet online administrátorů: \t{FFFFFF}%i", sString, iPocet);
		Dialog_Show(playerid, DIALOG_STYLE_TABLIST, "Administrátoři Online", sString, "Zavrit", "");
	}
	return (true);
}

 

 

 

Návod označen jako platný

Ten to návod byl označen jako platný.Návod může být kdykoli označen jako nevhodný či neplatný

  • Líbí se mi to! (+1) 2
Link to comment
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
×
×
  • Create New...