Jump to content

návod Scydovy YSI návody | #5 | [FS] Masivní použití knihovny [***]


Scydo

Recommended Posts

MASIVNÍ POUŽITÍ KNIHOVNY
*****

V tomto díle nepůjde ani tak moc o návod, jako spíše o ukázku, že velkou většinu částí/includů ze knihovny lze aplikovat a tvořit s její pomocí prakticky cokoliv a obsahuje skoro cokoliv. Nějakou dobu jsem přemýšlel, jak to nejlepé předvést a tak mě napadlo napsat takovou menší ukázku Admin scriptu s použitím co nejvíce možností z knihovny, jak to je jen možné.

Situace je následujicí, použil jsem:

  • y_hooks pro hookované funkce,
  • y_va pro již vytvořené formátované funkce zpráv,
  • y_timers pro lepší práci s timery,
  • y_inline pro práci s funkcí volanou ve fci,
  • y_commands pro příkazy a parametry,
  • y_dialog pro práci s dialogy a abych nepotřeboval nastavovat ID,
  • y_ini pro ukládání údajů o hráči,
  • y_colours protože obsahuje skoro 4000 barev jak pro zprávy tak i pro obyčejné použití,
  • y_scriptinit pro speciální fci která se vyvolá jak ve FS tak i ve GM,
  • y_utils pro doplňkové fce jako například právě zjištění nicku ReturnPlayerName(),
  • y_iterate pro lepší práci s cykly,
  • y_playerarray pro komprimaci paměti boolean proměnných,
  • y_groups pro práci s oprávněním a skupinama.

A vytvořil následujicí kód:

Spoiler

#include <a_samp>
#include <YSI_Coding\y_hooks>
#include <YSI_Coding\y_va>
#include <YSI_Coding\y_timers>
#include <YSI_Coding\y_inline>
#include <YSI_Visual\y_commands>
#include <YSI_Visual\y_dialog>
#include <YSI_Storage\y_ini>
#include <YSI_Server\y_colours>
#include <YSI_Server\y_scriptinit>
#include <YSI_Core\y_utils> 
#include <YSI_Data\y_iterate>
#include <YSI_Data\y_playerarray>
#include <YSI_Players\y_groups>

new
	PlayerArray:IsAdmin<MAX_PLAYERS>,
	PlayerArray:vHp<MAX_PLAYERS>,
	Group:gPlayer,
	Group:gAdmin,
	Group:gVip;

forward NacistData(playerid, name[], value[]);
public NacistData(playerid, name[], value[]) {
	new bool:hodnota = false; 
	INI_Bool("isadmin", hodnota);
	Bit_Set(IsAdmin, playerid, hodnota);
	Group_SetPlayer(gPlayer, playerid, true);
	INI_Bool("isvip", hodnota);
	Group_SetPlayer(gPlayer, playerid, hodnota);
	INI_Bool("isadming", hodnota);
	Group_SetPlayer(gAdmin, playerid, hodnota);
	return 1;
}

public OnScriptInit() {
	Group_SetGlobalCommandDefault(false);
	Group_SetGlobalGroup(gPlayer, true);
	gPlayer = Group_Create("Hráč");
	gVip = Group_Create("Vip");
	gAdmin = Group_Create("Admin");
	Group_SetColour(gPlayer, X11_GREEN);
	Group_SetColour(gVip, X11_YELLOW1);
	Group_SetColour(gAdmin, X11_RED);
	GROUP_ADD<gPlayer> {
		@YCMD:help;
		@YCMD:setowner;
	}
	GROUP_ADD<gVip> {
		@YCMD:help;
		@YCMD:vhp;
		@YCMD:setowner;
	}
	GROUP_ADD<gAdmin> {
		@YCMD:help;
		@YCMD:setowner;
	}
	return 1;
}
hook OnPlayerConnect(playerid) {
	new file[50];
	format(file, sizeof file, "%s.txt", ReturnPlayerName(playerid));
	INI_ParseFile(file, "NacistData", .bExtra = true, .extra = playerid);
	return 1;
}

hook OnPlayerDisconnect@2(playerid, reason) {
	new file[50];
	format(file, sizeof file, "%s.txt", ReturnPlayerName(playerid));
	new INI:Soubor = INI_Open(file);
	INI_WriteBool(Soubor, "isadmin", Bit_Get(IsAdmin, playerid));
	INI_WriteBool(Soubor, "isvip", Group_GetPlayer(gVip, playerid));
	INI_WriteBool(Soubor, "isadming", Group_GetPlayer(gAdmin, playerid));
	INI_Close(Soubor);
	return 1;
}

YCMD:setowner(playerid, params[], help) {
	if (Bit_Get(IsAdmin, playerid) == true) return SendClientMessage(playerid, X11_RED, "Už máš toto oprávnění !");
	if (!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, X11_RED, "Nemáš dostatečné admin oprávnění !");
	Bit_Let(IsAdmin, playerid);
	va_SendClientMessageToAll(X11_RED, "Hráč %s se úspěšně stal novým majitelem", ReturnPlayerName(playerid));
	return 1;
}

YCMD:help(playerid, params[], help) {
  	//Sample code
	return SendClientMessage(playerid, X11_RED, "Sample code"), 1;
}

YCMD:vhp(playerid, params[], help) {
	if (Bit_Get(vHp, playerid) == true) return SendClientMessage(playerid, X11_RED, "Už jsi toto použil. Vyčkej pro další !");
	SetPlayerHealth(playerid, 100.0);
	defer dalsiPouziti(playerid);
	return SendClientMessage(playerid, X11_GREEN, "Úspěšně jsi si doplnil život!"), 1;
}

YCMD:setlevel(playerid, params[], help) = setalevel;
YCMD:setalevel(playerid, params[], help) {
	if (help) return SendClientMessage(playerid, X11_YELLOW1, "Nastaví hráči Administrátorská práva !");
	if (Bit_Get(IsAdmin, playerid) == false) return SendClientMessage(playerid, X11_RED, "Nemáš dostatečné admin oprávnění !");
	if (isnull(params)) return SendClientMessage(playerid, X11_RED, "Použití: /setalevel ID");
	if (strval(params) == INVALID_PLAYER_ID) return SendClientMessage(playerid, X11_RED, "Špatné ID !");
	SetPVarInt(playerid, "playeridid", strval(params));
	inline OnSetLevel(pid, dialogid, response, listitem, string:inputtext[]) {
		#pragma unused dialogid, inputtext
		if (!response) return 1;
		new id = GetPVarInt(id, "playeridid");
		switch (listitem) {
			case 0: {
				Group_SetPlayer(gPlayer, id, true);
				va_SendClientMessage(pid, X11_GREEN, "Nastavil jsi hráči %s skupinu %s", ReturnPlayerName(id), Group_GetName(gPlayer));
			}
			case 1: {
				Group_SetPlayer(gVip, id, true);
				va_SendClientMessage(pid, X11_GREEN, "Nastavil jsi hráči %s skupinu %s", ReturnPlayerName(id), Group_GetName(gVip));
			}
			case 2: {
				Group_SetPlayer(gAdmin, id, true);
				va_SendClientMessage(pid, X11_GREEN, "Nastavil jsi hráči %s skupinu %s", ReturnPlayerName(id), Group_GetName(gAdmin));
			}
		}
	}
	return Dialog_ShowCallback(playerid, using inline OnSetLevel, DIALOG_STYLE_LIST, "Nastavit lvl", "Hrac\nVip\nAdmin", "Potvrdit", "Zavrit");
}

timer dalsiPouziti[1000*60*2](playerid) {

	Bit_Vet(vHp, playerid);
	SendClientMessage(playerid, X11_GREEN, "Už můžeš opět použít /vhp");
}


YCMD:kill(playerid, params[], help) {
	if (help) return SendClientMessage(playerid, X11_YELLOW1, "Zabije hráče na místě");
	if (isnull(params)) return SendClientMessage(playerid, X11_RED, "Použití: /kill ID");
	if (strval(params) == INVALID_PLAYER_ID) return SendClientMessage(playerid, X11_RED, "Špatné ID !");
	SetPlayerHealth(strval(params), 0.0);
	va_SendClientMessage(playerid, X11_RED, "Zabil jsi hráče %s", ReturnPlayerName(strval(params)));
	return 1;
}

YCMD:vips(playerid, params[], help) {
	new dialog[512];
	foreach (new i: Player) {
		if (Group_GetPlayer(gVip, i) == true) {
			format(dialog, sizeof dialog, "%s\n{%06x}%s "YELLOW"[VIP]", GetPlayerColor(i) >>> 8, ReturnPlayerName(i));
		}
	}
	return Dialog_Show(playerid,DIALOG_STYLE_LIST, "Vip Online", dialog, "Zavrit", "");
}

 

Kdyby si náhodou někdo myslel, že jsem si ten kód jen vycucal z prstů a nelze to kompilovat, tak zde :d:
https://ctrlv.link/shots/2020/12/27/33IK.png

Pouze varování a to nevyužití jednoho makra, ale to lze snadno vyřešit či ignorovat.

Několik poznámek ohledně kódu

Jelikož plánuji udělat na zbytek includů z knihovny individuální návod, nebudu zde popisovat o čem přesně jsou, nebo co přesně dělají, ale:

  • Bohužel, funkce při čtení souboru nemají návratovou hodnotu vyčtené informace. To znamená, že pro nastavení boolean je zapotřebí si deklarovat proměnnou new bool:hodnota která načtenou informací vše nastaví.
  • Při načítání jsme nemuseli zjišťovat jestliže je hráč, protože pak zjišťujeme jestliže není VIP či Admin, a obě možnosti můžou vyjít jako nepravé, takže lze nastavit rovnou Group_SetPlayer(gPlayer, playerid, true), že s určitostí patří mezi hráče.
  • Příkaz setalevel má alternativní příkaz setlevel.
  • YCMD mají hned několik možných návratových hodnot. To znamená, že není dobrý nápad používat boolean návratovou hodnotu true/false ale pouze čísla a to 1 nebo 0.
  • Hookované fce jsou jen pouze, kdybych místo scriptu z toho udělal include. A také se zavolají dříve než public.
  • Proměnná IsAdmin neni nic více než jen pro rozlišení jestliže je admin a aby mohl příkaz setalevel.
  • Při hookování OnPlayerDisconnect, jsem musel použít jiné "id" hooku, protože původní už je někde použité v knihovně.
     

y_bit/y_playerarray -  Odkaz
y_hooks - Odkaz
y_timers - Odkaz

Hlavní topic - Odkaz

 

Edited by Scydo
  • Děkuji (+1) 1
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...