Aller au contenu
×
×
  • Créer...

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


Messages recommandés

  • Robot

 

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.



 

  • Metin2 Dev 1
  • Love 1

french_banner.gif

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 0
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Jours populaires



  • brilliantdiscord_widget
  • Flux d'Activité

    1. 0

      Projet DosMetin2 Old/Semi-Like

    2. 0

      Mythesia2 | Devour your Enemies in Battle

    3. 0

      Need help with server setup

    4. 2

      Files 2012

    5. 2

      Files 2012

    6. 13

      Top Metin2 - Les meilleurs serveurs privés Metin2 français

    7. 13

      Top Metin2 - Les meilleurs serveurs privés Metin2 français

    8. 5

      Erreur de connexion navicat

    9. 13

      Metin2 40250 / 2014 Serverfiles + Client + SRC [ 15 Langues ]

  • En ligne récemment

    • Aucun utilisateur enregistré regarde cette page.

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.