Inregistrare comenzi

#1
Pentru a crea o comanda noua, vom intercepta functia OnPluginStart si vom crea comanda in interiorul acesteia.

Code: Select all

#include <sourcemod>

public void OnPluginStart()
{
	RegConsoleCmd("sm_test", Command_Test, "Descriere despre comanda");
	RegAdminCmd("sm_testforadmin", Command_TestForAdmin, ADMFLAG_GENERIC, "Descriere despre comanda");
}
Avem nevoie de libraria "sourcemod" pentru a folosi functiile RegConsoleCmd si RegAdminCmd, dar si pentru a intercepta OnPluginStart.
Am inregistrat comanda "sm_test". Cand cineva scrie sm_test in consola, !test sau /test in chat, Command_Test se va ocupa de raspuns. Vom defini mai jos Command_Test.
Comanda sm_testforadmin e doar pentru admini, pentru cei care au flagul ADMFLAG_GENERIC. Gasiti aici toate flagurile: https://wiki.alliedmods.net/Checking_Ad ... Scripting)

Code: Select all

#include <sourcemod>

public void OnPluginStart()
{
	RegConsoleCmd("sm_test", Command_Test, "Descriere despre comanda");
	RegAdminCmd("sm_testforadmin", Command_TestForAdmin, ADMFLAG_GENERIC, "Descriere despre comanda");
}

public Action Command_Test(int client, int args)
{
	PrintToChatAll("Testam pluginul");
	PrintToChat(client, "Hello");
	
	return Plugin_Handled;
}

public Action Command_TestForAdmin(int client, int args)
{
	PrintToChatAll("Testam pluginul");
	PrintToChat(client, "Hello");
	
	return Plugin_Handled;
}
La folosirea comenzii sm_test, se va afisa in chat mesajul: "Testam pluginul" tututor jucatorilor. Se foloseste functia PrintToChatAll pt a afisa un mesaj tuturor jucatorilor.
Mesajul "Hello" se va afisa doar celui care a folosit comanda. Idem pt sm_testforadmin.

Tipul functiei:
Dupa cum se poate observa, returnam la final Plugin_Handled.

Action poate lua urmatoarele valori:

Code: Select all

Plugin_Continue
Plugin_Changed
Plugin_Handled
Plugin_Stop
De ce returnam Plugin_Handled cand cream o comanda noua?
Daca nu am returna Plugin_Handled (se poate folosi si Plugin_Stop in acest caz), atunci csgo s-ar uita in lista sa de comenzi si ar cauta sm_test (cum exista si comanda "dsiconnect", csgo se uita in comenzile sale, cauta "disconnect" si face ceva - deconecteaza jucatorul). In consola va aparea mesajul: "Tried to look up for a console command" sau ceva de genul.
Returnand Plugin_Handled prevenim acest lucru. Nu este ceva obligatoriu, care sa strice ceva la server, dar este bine sa punem asa.

Parametrii functiei:
Dupa cum se poate observa, functia primeste parametrii "client" si "args":

- client este user-ul care a scris comanda, poate lua o valoare de la 0 pana la MaxClients (este o variabila sourcemod).
Atunci cand clientul este 0, comanda a fost trimisa de catre server.

Daca vrem sa ignoram comenzile trimise de server, scriem asa (util pt comenzi de genul !rank, !stats, !top etc. unde serverul nu are treaba cu ele):

Code: Select all

public Action Command_TestForAdmin(int client, int args)
{
	if (!client) // comanda trimisa de server?
	{
		return Plugin_Handled;
	}
	
	// trimite raspuns
	return Plugin_Handled;
}
- args este numarul de parametrii trimisi.
Parametrii sunt despartiti prin SPACE sau alte caractere diferite de cifre sau litere.

Daca vrem sa fortam ca jucatorii sa trimita minim 3 parametrii scriem asa:

Code: Select all

public Action Command_TestForAdmin(int client, int args)
{
	if (args < 3) // sub 3 parametri?
	{
		ReplyToCommand(client, "[SM] Minim 3 parametri");
		return Plugin_Handled;
	}
	
	// trimite raspuns
	return Plugin_Handled;
}
ReplyToCommand
ReplyToCommand este foarte des folosita in creearea comenzilor. Trimite un raspuns pe chat daca jucatorul scrie comanda in chat, sau in consola daca jucatorul trimite comanda in consola.

Re: Inregistrare comenzi

#2
Desi nefinalizat, tutorialul este pe intelesul unui noob ca si mine.
Urmarind tutorialul tau, si inca 2 tutoriale in engleza ale unui tip "LearnSourcePawn" de pe youtube, am reusit sa fac un plugin ce spameaza "Test" in chat.
Nu e cine stie ce, but i gotta start somewhere. :D

Code: Select all

#include <sourcemod>
#include <sdktools>

#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo = 
{
	name = "SpamTest",
	author = "FAQU",
	description = "Spams Test into chat",
	version = "1.0"
}

public void OnPluginStart()
{
	RegAdminCmd("sm_test", TestSpam, ADMFLAG_GENERIC, "Spams Test into chat");
}

public Action TestSpam(int client, int args)
{
	if (args > 0)
	{
		ReplyToCommand(client, "[SM] Usage: sm_test");
		return Plugin_Handled;
	}
	PrintToChatAll(" \x04Test");
	PrintToChatAll(" \x04Test");
	PrintToChatAll(" \x04Test");
	PrintToChatAll(" \x04Test");
	PrintToChatAll(" \x04Test");
	PrintToChatAll(" \x04Test");
	PrintToChatAll(" \x04Test");
	return Plugin_Handled;
}
Attachments
poza.png
poza.png (213.01 KiB) Viewed 180 times