GTA-Expert Forum: [GUIDA] Comandi con parametri - GTA-Expert Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

[GUIDA] Comandi con parametri Con dcmd e sscanf

#1 L'utente č offline   dodo94 

  • Taccheggiatore
  • Gruppo: Utenti
  • Messaggi: 38
  • Iscritto il: 08/03/11
  • GTA Preferito:GTA: San Andreas

Inviato il 31 dicembre 2011 - 18:32

Salve ragazzi, questa è la mia prima guida in ita sull'uso del Pawno. Spiegherò in maniera semplice come creare comandi condizionati da uno o più parametri. questo sarà utile anche, per esempio, nel caso vogliate creare un sistema admin, per esepio:
/kill

E' il classico comando per uccidere chi lo fa, ma se volete crearne uno del tipo:
/kill [ID GIOCATORE]


Allora dovremo inserire anche il parametro ID giocatore, ossia chi deve essere ucciso. oppure:
/heal [ID GIOCATORE] [SALUTE]

avrà due parametri: l'id del player da guarire e il livello di salute da dargli. Per creare questi comandi andremo ad usare due funzioni avanzate: il dcmd e lo sscanf. La guida è stata scritta per aiutare i meno esperti nello scripting Immagine Postata.
Prima di tutto dobbiamo definire il dcmd. Allora scriviamo in testa allo script (prima del main()):
#define dcmd(%1,%2,%3) if(!strcmp((%3)[1],#%1,true,(%2))&&((((%3)[(%2)+1]=='\0')&&(dcmd_%1(playerid,"")))||(((%3)[(%2)+1]==' ')&&(dcmd_%1(playerid,(%3)[(%2)+2])))))return 1


Dovremo inoltre scaricare quest'include:
http://forum.sa-mp.c...ad.php?t=120356
Mettetelo nella directory pawno/include e poi create la direttiva #include <sscanf2> nella vostra gamemode.

All'inizio dell'"OnPlayerCommandText", andiamo a scrivere questa stringa, per iniziare il nostro primo comando:
dcmd(heal, 4, cmdtext);


heal: al posto di questa scritta, scrivete il nome da dare al comando con parametri.
4: "heal" ha 4 lettere, quindi qui va scritto 4. Capito?
cmdtext: lasciate invariato questo campo.

Avremo, dunque:
public OnPlayerCommandText(playerid, cmdtext[]){
	dcmd(heal, 4, cmdtext);
	return 0;
}


Ora, fuori dall'OnPlayerCommandText, incollate questo script. Creerà un comando di base che curerà un player specifico (determinato da un parametro, come avete visto all'inizio):
dcmd_heal(playerid, params[])
{
	//Variabili dei parametri

		new id;

	new pname[MAX_PLAYER_NAME]; //nome giocatore curato
	new aname[MAX_PLAYER_NAME]; //nome giocatore che cura

	GetPlayerName(playerid, aname, sizeof(aname));
	GetPlayerName(id, pname, sizeof(pname));
	if(sscanf(params, "u", id))
	{
		SendClientMessage(playerid, 0xFF000000, "Sintassi: /heal <id giocatore>"); //errore di sintassi
	}
	else if(!IsPlayerConnected(id))
	{
		return SendClientMessage(playerid, 0xFF000000, "ID giocatore non valido!"); //id giocatore invalido
	}
	else if(id == playerid) return SendClientMessage(playerid, 0xFF000000, "Non puoi curare te stesso!");
	else //il comando vero e proprio
	{
	//TUTTO QUELLO CHE DEVE FARE IL COMANDO
	
		new pstring[128]; //messaggio al giocatore curato
		new astring[128]; //messaggio al giocatore che cura

		SetPlayerHealth(id, 100.0);
		format(astring, sizeof(astring), "Hai curato %s!", pname);
		format(pstring, sizeof(pstring), "%s ti ha curato", aname);
		SendClientMessage(playerid, 0x00FF0000, astring);
		SendClientMessage(id, 0x00FF0000, pstring);
		return 1;
	}
	return 1;
}


In alto, dove c'è "dcmd_heal", dovete mettere al posto di "heal" la stessa parola scritta nella funzione precedente ("dcmd(heal, 4, cmdtext);").

Subito sotto alla riga "dcmd_heal", dovete creare le variabili per i parametri del comando (una variabile per ogni parametro). Queste variabili serviranno per contenere i valori che il giocatore scriverà quando fa il comando. Ad esempio, se usa un comando /heal [ID giocatore] facendo /heal 2, curerà il giocatore con l'ID "2". Questo 2 deve essere archiviato in una variabile per poi lavorare con le funzioni che deve fare il comando. Nel nostro caso, il comando ha un solo parametro, quindi dobbiamo creare una variabile per esso, che abbiamo chiamato id.

La stringa if(sscanf(params, "u", id)) è il fulcro del comando:


1) params: lasciate invariato.


2) "u": ricordatevi di non levare mai le virgolette "", trattandosi di una stringa. Qui dobbiamo dichiarare i parametri che compongono il comando. Ad una lettera corrisponde un parametro. Qui, essendoci solo una lettera, u, significa che abbiamo un solo parametro. Se vogliamo scrivere due parametri dovremo scrivere "uu", ossia affiancare più lettere, e così via. Queste lettere determinano il tipo di parametro del comando. Ecco tutte le lettere:
  • d / i: parametro di tipo numerico intero (esempio: denaro)
  • c: parametro di tipo character (una singola lettera)
  • u: ID o nome di un giocatore. Parametro molto utile. Lo usiamo anche nel comando che stiamo creando, "/heal <id giocatore>", per determinare quale giocatore dobbiamo curare. Il bello di questa "u" è che possiamo anche inserire il nick di questo giocatore.
  • s: parametro di tipo string, ossia un testo. E' utile per esempio per inviare un testo ad un giocatore.
  • f: parametro di tipo float, ossia un numero decimale. Utile per coordinate, angoli, livello salute, ecc.
  • l: parametro di tipo logico (booleano). Può essere soltanto true o false.
  • h / x: parametro di tipo HEX. Serve per i colori HEX.
  • z: parametro sempre di tipo string, ma opzionale. Può essere utile per esempio per un parametro "reason", usato spesso in un ipotetico "/ban". L'admin, che usa il comando, può decidere o meno se mettere tale parametro, ossia è facoltativo. Ricordatevi che funziona solo con le stringhe.

Ce ne sono altre, ma, essendo una guida di base per principianti, non li tratteremo. Se sapete usare questi tipi di parametro potrete comunque creare moltissimi comandi con parametri Immagine Postata.
Il comando "/heal <id giocatore>" avrà quindi questo tipo di parametri:
"u"
Oppure, un ipotetico "/teleport <id giocatore> <coord. x> <coord. y> <coord. z>, che teletrasporta un giocatore specifico nelle coordinate stabilite nei tre parametri, avrà questo tipo di parametri:
"ufff" //u è per l'ID del player, mentre le tre f (tipo float) sarà per le coordinate

3) id: in questo caso, "id" è il nome della variabile che conterrà l'ID del giocatore da curare. Se il comando ha più parametri, dovete aggiungere anche le altri variabili per gli altri parametri.
Per esempio, tornando al nostro "/teleport", dovremo scrivere, nel complesso:
if(sscanf(params, "ufff", id, x, y, z))

Supponendo di aver creato le tre variabili (float) x, y e z.

COMANDO DI ESEMPIO: GIVECASH
Come script di esempio, vi propongo un comando "/givecash", che darà ad un giocatore specifico una somma specifica di denaro. Come avrete intuito, abbiamo dunque un comando con due parametri, uno tipo "u" e l'altro "d" (intero). Oltre alla variabile per l'ID del giocatore, dobbiamo crearne una seconda per contenere la somma di denaro, che abbiamo chiamato denaro.

public OnPlayerCommandText(playerid, cmdtext[])
{
	dcmd(givecash, 8, cmdtext);
	return 0;
}
 
dcmd_givecash(playerid, params[])
{
	//Variabili dei parametri
		new id;
	new denaro;

	if (sscanf(params, "ud", id, denaro)) SendClientMessage(playerid, 0xFF0000AA, "Sintassi: /givecash <id giocatore> <denaro>");
	else if (id == INVALID_PLAYER_ID) SendClientMessage(playerid, 0xFF0000AA, "ID giocatore non valido!");
	else if (denaro > GetPlayerMoney(playerid)) SendClientMessage(playerid, 0xFF0000AA, "Non hai abbastanza denaro!");
	else
	{
		GivePlayerMoney(id, denaro);
		GivePlayerMoney(playerid, 0 - denaro);
		SendClientMessage(playerid, 0x00FF00AA, "Hai inviato il denaro con successo!");
		SendClientMessage(id, 0x00FF00AA, "Ti hanno dato del denaro");
	}
	return 1;
}

Messaggio modificato da dodo94 il 01 gennaio 2012 - 16:20

0

#2 L'utente č offline   Frank_Mangano 

  • Taccheggiatore
  • Gruppo: Utenti
  • Messaggi: 504
  • Iscritto il: 10/02/10
  • Provenienza:Bari
  • GTA Preferito:GTA: San Andreas

Inviato il 09 gennaio 2012 - 20:44

Ottima per i principianti e non :)

Mappe & Script a pagamento. Contattare: marcostox@hotmail.it(msn) Frank_Mangano (skype)


--------------------------------------------------******I MIEI LAVORI******-------------------------------------------------


[Rilasciato][MAP]Bunker a 2 piani[Pubblico]

[Rilasciato][SCRIPT]Lavoro Spazzino[Pubblico]

[Rilasciato][SCRIPT]Sistema di Registrazione[Pubblico]
0

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

1 utenti stanno leggendo questa discussione
0 utenti, 1 ospiti, 0 utenti anonimi