Jump to content

C++ - Création d'une Commande GM


Recommended Posts

  • Bot

 

Niveau requis Intermédiaire

Temps estimé : Entre 5 et 10 minutes

 

 

 

Le nécessaire :

  • Pour réaliser ce tutoriel et l'expérimenter vous même, vous allez avoir besoin de sources serveur (game) compilables et utilisables.
  • Pour la compréhension du tutoriel, vous aurez juste besoin de votre cerveau, et pour ceux qui n'en ont pas sous la main, essayez quand même !

 

Nous allons ensemble créer la fonction metin (utilisable grâce à un joueur qui enverrait dans le chat "/metin") qui aura pour rôle de nous renvoyer un message contenant notre pseudo, par exemple.

 

 

I. Déclarer notre fonction :

Pour commencer, nous allons devoir déclarer notre fonction, c'est à dire le protocole qui sera exécuté lorsque notre commande sera envoyée par le joueur. Pour cela, rendez-vous dans le fichier cmd.cpp, vous y trouverez dès le début du fichier quelques lignes comme celle-ci :

ACMD(do_[...]);

 

Nous allons suivre cette syntaxe, et déclarer notre fonction pour la commande, tapons :

ACMD(do_metin);

Notes :

  • N'oubliez pas le point virgule pour marquer la fin de notre déclaration;
  • Ne vous souciez pas des arguments que prendra notre fonction.

 

 

II. Définir notre fonction :

Maintenant que notre fonction est déclarée, il nous faut maintenant la définir. Pour cela, le fichier n'est pas fixe, selon la commande, vous utiliserez un fichier différent parmi :

  • cmd_general.cpp;
  • cmd_emotions.cpp;
  • etc...

Ici, notre commande sera accessible à tous et n'est pas relative à certaines conditions, nous allons donc la placer dans le fichier cmd_general.cpp.

 

Nous allons comme toute définition reprendre la déclaration et l'étendre

ACMD(do_metin)
{
	// Content
}

 

Maintenant, pour savoir quoi mettre, nous allons revenir à notre objectif principal  envoyer un message. Pour cela, nous allons utiliser la fonction ChatPacket. Elle prend deux paramètres, la type de message, puis le message en lui même.

 

Pour cela une seule ligne suffit

ch->ChatPacket();

(ch, abréviation de character, sert à désigner le joueur qui envoie la commande)

 

Nous utiliserons le canal habituel pour les retour de commande : CHAT_TYPE_INFO.
Un problème persiste encore : Comment récupérer le pseudo du joueur ?

Vous vous souvenez de notre ch ? Il va nous servir, grâce à la fonction getName(), qui n'attend pas d'argument.

Nous utiliserons ensuite le format habituel pour la concaténation en C++, et notre ChatPacket(), pour obtenir cette fonction

ACMD(do_metin)
{
	ch->ChatPacket(CHAT_TYPE_INFO, "Votre nom est %s", ch->Getname());
}

Notez que vous pouvez très bien utiliser la fonction LC_TEXT(), qui vous permettra d'obtenir le texte correspondant dans votre locale_string.txt

 

 

III. Déclarer notre commande :

Il reste une toute dernière étape : déclarer notre fonction. Il suffit d'ajouter une ligne à notre fichier cmd.cpp

Visitez un peu le fichier, et vous trouverez une liste avec tout un tas de ligne comme celle que nous allons ajouter :

{ "metin",		do_metin,		0,			POS_DEAD,	GM_PLAYER	},

Notez que :

  • La première information est le nom de la commande en jeu;
  • La deuxième est la fonction à laquelle la commande est liée;
  • La dernière est le grade minimum pour avoir accès à cette fonction.

 

Vous pouvez maintenant compiler vos sources et admirer votre magnifique commande.

 

Pour continuer:

Pour compléter ce tutoriel et ne pas laisser cette ligne vide, je vous propose de changer notre fonction pour que je vous apprendre à utiliser des commandes à arguments.

 

Nous allons par exemple demande à l'utilisateur de renseigner son nom, et nous n'utiliserons plus le ch->GetName().

Les changements s'effectueront exclusivement dans la définition de la fonction.

 

Créons pour commencer une variable pour stocker l'argument : 

char arg1[256];

Nous allons devoir stocker notre argument de dans, nous utiliserons la fonction : one_argument()

one_argument(argument, arg1, sizeof(arg1));

Cependant, cela ne suffit pas, cette ligne ne vérifie pas l'existence de l'argument. Nous allons donc ajouter après une condition vérifiant son intégrité ou non :

if (!*arg1)
{
	ch->ChatPacket(CHAT_TYPE_INFO, "Usage: /metin <name>");
	return;
}

Si l'argument n'existe pas, nous renvoyons directement à l'utilisateur l'usage de la commande.


Nous allons maintenant pouvoir retaper notre fonction pour envoyer un message, mais ne plus utiliser notre ch->GetName(), mais notre arg1.

ACMD(do_metin)
{
	char arg1[256];
	
	one_argument(argument, arg1, sizeof(arg1));

	if (!*arg1)
	{
		ch->ChatPacket(CHAT_TYPE_INFO, "Usage: /metin <name>");
		return;
	}
	ch->ChatPacket(CHAT_TYPE_INFO, "Votre nom est %s", arg1);
}

 

Vous pouvez de nouveau compiler vos sources et tester.

 

 

Notez que la fonction change en fonction du nombre d'argument, par exemple :

two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

 

 

Merci de m'avoir lu, en espérant que ce modeste tutoriel puisse être utile à quelques personnes.

 

Drei.



 

  • Like 1

Metin2 Download - Funky Émulation - Metin2 Dev - MiaW Network

Link to post

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


  • Flux d'Activité

    1. 18

      serveur Metin2

    2. 1

      Implantation MOB (invisible + error)

    3. 1

      Implantation MOB (invisible + error)

    4. 1

      Mondial2 Remastered - New School International Private Server Open 27/11/2020

    5. 18

      serveur Metin2

    6. 29

      Dump Proto 2014

    7. 18

      serveur Metin2

    8. 15

      Mustang SF - Full - 1.8

  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.