[JAVA] Acceptez la commande [MineCraft Plugin] et déclenchez un événement

Conditions préalables

Nous développerons le plug-in en l'ajoutant au plug-in créé dans Creating a Spigot plug-in using Eclipse.

ÉTAPE 1: Implémentation des commandes de base

Paramètres de plugin.yml

Modifiez plugin.yml pour ajouter la fonction que la commande du plug-in créé par vous-même répond à la commande.

command:
Nom de la commande:
    description:Un aperçu de la commande est donné ici
    usage:Description de l'utilisation de la commande

--description - Description de la commande. --usage - Comment utiliser la commande Si onCommand () renvoie false ici, cette utilisation sera affichée.

Seuls les éléments de base sont ajoutés ici. Il est possible de jouer avec diverses choses en ajoutant autre que «description» et «utilisation». Si vous souhaitez définir d'autres paramètres détaillés, [ce site](https://mcmodding.jp/modding/index.php/Plugin.yml%E3%81%AE%E8%A8%AD%E5%AE%9A% Veuillez vous référer à E4% B8% 80% E8% A6% A7).

Un exemple est le suivant.

name: "QiitaTest"
version: "${project.version}"
main: "com.github.kubota.qiitatest.QiitaTest"
api-version: "1.13"

commands: #Déclarez des commandes pour votre propre plugin
  qiita:
    description: this is a sample command.
    usage: /<command>

Modifier la classe principale

Ajoutez les éléments suivants à la classe principale.

@Override
  public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    return false;
}

Voici une brève description de la méthode ʻonCommand. Cette méthode est exécutée lorsque la commande définie par Command dans plugin.yml` est exécutée.

Il y a quatre arguments, dont chacun est le suivant. --CommandSender sender - Expéditeur de la commande --Command cmd - Contenu de la commande exécutée --String commandLabel - Alias de commande utilisé --String [] args - Un tableau contenant des arguments de commande

Et comme le type de cette méthode est «Boolean», la valeur renvoyée est soit «true» soit «false». Si c'est "vrai", cela signifie que cela fonctionne normalement. S'il est «faux», cela signifie qu'il n'a pas fonctionné normalement, et le contenu décrit dans «utilisation» s'affiche.

Si vous ajoutez cette méthode à un programme existant, ce sera comme suit.

package com.github.kubota.qiitatest;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

public class QiitaTest extends JavaPlugin{
    //↓ onEnable est une méthode qui est exécutée lorsqu'elle est chargée
    @Override
    public void onEnable() {
        //↓ Laisser un journal sur le serveur
        getLogger().info("Hello, Qiita!");
    }

    //onCommand est un plugin.Exécuté lorsque la commande décrite dans yml est appelée
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    	return false;
    }
}

Lorsque vous faites cela, cela ressemble à ceci: スクリーンショット 2019-08-13 23.45.28.png Lorsque la commande Qiita est exécutée, le programme de la méthode ʻonCommand est exécuté et false est renvoyé, ainsi le contenu décrit dans ʻUsage dans plugin.yml est affiché. Je vais.

Comme il est difficile de comprendre avec cela, ajoutez la méthode sendMessage. Cette méthode est une méthode membre de la classe CommandSender. La fonction de cette méthode est d'envoyer la chaîne de caractères de l'argument sous forme de message à cette personne cible (utilisateur de l'instance). La différence avec la méthode getLogger utilisée dans le chapitre précédent est qu'elle affiche la chaîne de caractères sur la console et n'envoie la chaîne de caractères qu'à la personne cible.

Ce qui suit est la version modifiée.

package com.github.kubota.qiitatest;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

public class QiitaTest extends JavaPlugin{
    //↓ onEnable est une méthode qui est exécutée lorsqu'elle est chargée
    @Override
    public void onEnable() {
        //↓ Laisser un journal sur le serveur
        getLogger().info("Hello, Qiita!");
    }

    //onCommand est un plugin.Exécuté lorsque la commande décrite dans yml est appelée
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
        sender.sendMessage("Command, Qiita!");
    	return true;
    }
}

En raison de la nature de la méthode ʻonCommand, son premier argument, sender`, est l'utilisateur qui a exécuté la commande. Par conséquent, dans ce programme, le message est envoyé uniquement à l'utilisateur qui a exécuté la commande. De plus, j'ai changé de «false» à «true» pour confirmer le changement de comportement dû à la valeur de retour.

Le résultat de l'exécution est le suivant. スクリーンショット 2019-08-14 0.22.35.png

ÉTAPE 2: plusieurs commandes

Paramètres de plugin.yml

Pour définir plusieurs plug-ins, ajoutez-les sous Commande comme suit. Ça ressemble à ça.

name: "QiitaTest"
version: "${project.version}"
main: "com.github.kubota.qiitatest.QiitaTest"
api-version: "1.13"

commands: #Déclarez des commandes pour votre propre plugin
  qiita:
    description: this is 1st sample command.
    usage: /<command>
  sample:
    description: this is 2nd sample command.
    usage: /<command>

Modifier la classe principale

ʻOnCommand est une méthode qui est exécutée lorsque la commande décrite dans plugin.ymlest appelée. Si plusieurs commandes sont définies dansplugin.yml`, elles seront exécutées si l'une d'elles est appelée. Si vous conservez le programme existant, même si vous préparez plusieurs commandes, elles effectueront toutes la même opération.

Dans ce cas, il est inutile de préparer plusieurs commandes, il est donc nécessaire de brancher le processus en fonction de la commande exécutée.

package com.github.kubota.qiitatest;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

public class QiitaTest extends JavaPlugin{
    //↓ onEnable est une méthode qui est exécutée lorsqu'elle est chargée
    @Override
    public void onEnable() {
        //↓ Laisser un journal sur le serveur
        getLogger().info("Hello, Qiita!");
    }

    //onCommand est un plugin.Exécuté lorsque la commande décrite dans yml est appelée
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
        if(cmd.getName().equalsIgnoreCase("qiita")){
            //Exécuté lorsque la commande qiita est exécutée
            sender.sendMessage("Command, Qiita!");
            return true;
        }
        if(cmd.getName().equalsIgnoreCase("sample")){
            //Exécuté lorsque la commande exemple est exécutée
            sender.sendMessage("Command, sample!");
            return true;
        }
    	return false;
    }
}

Comme mentionné ci-dessus, cmd stocke des informations sur la commande exécutée. Vous pouvez obtenir la commande exécutée sous forme de chaîne de caractères en exécutant la méthode getName de cette instance. Méthode ʻEqualsIgnoreCase` Il s'agit d'une méthode du type String qui renvoie comme type booléen si la chaîne d'argument correspond à la chaîne exécutée.

Quand ceci est exécuté, ce sera comme suit. スクリーンショット 2019-08-14 15.30.19.png

Tips

La méthode est arrêtée de force sans exécuter return et le traitement ultérieur.

ÉTAPE 3: sous-commande

Paramètres pour plugin.yml

Ce n'est pas un must, mais pour lui faire accepter des arguments en fonction de la commande qiita, changez ʻusage` comme suit.

name: "QiitaTest"
version: "${project.version}"
main: "com.github.kubota.qiitatest.QiitaTest"
api-version: "1.13"

commands: #Déclarez des commandes pour votre propre plugin
  qiita:
    description: this is 1st sample command.
    usage: /<command> [text]
  sample:
    description: this is 2nd sample command.
    usage: /<command>

Modifier la classe principale

Les arguments lors de l'exécution d'une commande sont stockés dans une variable appelée «args». Il s'agit d'un tableau de type String. Puisqu'il s'agit d'un tableau, vous pouvez l'obtenir en tapant ʻargs [x] , etc. La partie x` commence à 0 et s'incrémente de 1.

> qiita a wa ka

Si vous exécutez la commande

argument args[0] args[1] args[2]
valeur "a" "wa" "ka"

Il est stocké comme ça.

Écrivons le code suivant en utilisant ceci.

package com.github.kubota.qiitatest;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

public class QiitaTest extends JavaPlugin{
    //↓ onEnable est une méthode qui est exécutée lors de son chargement
    @Override
    public void onEnable() {
        //↓ Laisser un journal sur le serveur
        getLogger().info("Hello, Qiita!");
    }

    //onCommand est un plugin.Exécuté lorsque la commande décrite dans yml est appelée
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    	if(cmd.getName().equalsIgnoreCase("qiita")) {
    		if(args.length == 0)return false;
    		sender.sendMessage("Command, Qiita by " + args[0]);
    		return true;
    	}
    	if(cmd.getName().equalsIgnoreCase("sample")) {
    		sender.sendMessage("Command, Sample");
    		return true;
    	}
    	return false;
    }
}

ʻArgs.length contient le nombre d'éléments stockés dans le tableau de ʻargs. S'il vaut 0, cela signifie qu'aucun argument n'a été entré lors de l'exécution de la commande. Cette fois, un tel état n'est pas approprié, donc la méthode ʻonCommand renvoie false`.

Si la condition est dépassée (si un argument existe), la chaîne de caractères saisie comme premier argument est affichée après l'affichage du message «Command, Qiita by». Lorsque ceci est exécuté, le résultat sera le suivant. スクリーンショット 2019-08-14 17.21.11.png

Voilà pour cette fois!

ÉTAPE 4: Exemple de plug-in (Janken)

Enfin, créez un exemple de plug-in en utilisant ces connaissances.

En tant que fonction, c'est un programme qui joue un ordinateur. La main de l'adversaire est déterminée comme étant une main aléatoire lorsque le plug-in est activé, et ne changera pas après cela.

Les fonctions implémentées par les commandes sont

――Do Janken

Il y en a deux.

plugin.yml

name: "QiitaTest"
version: "${project.version}"
main: "com.github.kubota.qiitatest.QiitaTest"
api-version: "1.13"

commands: #Déclarez des commandes pour votre propre plugin
  janken:
    discription: play the game of scissors-paper-roc.
    usage: /<command> [your choice]
  enemy:
    discription: check enemy choice.
    usage: /<command>
    

Fonction de la commande du plug-in à implémenter

commander une fonction
/janken [Main à sortir] Do Janken
/enemy Vérifiez la main de l'adversaire

classe principale

package com.github.kubota.qiitatest;

//Bibliothèque pour la génération de nombres aléatoires
import java.util.Random;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

public class QiitaTest extends JavaPlugin{
	String enemy = "";

	//onEnable est la méthode qui sera exécutée lors de son chargement
	//Dans cette méthode ennemi(La main de l'adversaire)Déterminer aléatoirement
	@Override
	public void onEnable() {
		//Séquence avec informations sur la main
		String[] hand = {"goo","tyo","paa"};

		//Instancier une classe pour la génération de nombres aléatoires
		Random r = new Random();
		//Générer un nombre aléatoire entre 0 et 3 avec la méthode nextInt,Stockez la main correspondante dans l'ennemi
		enemy = hand[r.nextInt(3)];
	}


    //onCommand est un plugin.Exécuté lorsque la commande décrite dans yml est appelée
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {

    	//Jouez au jeu avec l'ennemi en exécutant la commande janken
    	//Entrez votre main comme argument
    	if(cmd.getName().equalsIgnoreCase("janken")) {

    		//Aucun argument passé
    		if(args.length == 0)return false;

    		if(args[0].equalsIgnoreCase("paa") && enemy.equalsIgnoreCase("tyo") ||
    			args[0].equalsIgnoreCase("tyo") && enemy.equalsIgnoreCase("goo") ||
    			args[0].equalsIgnoreCase("goo") && enemy.equalsIgnoreCase("paa")){
    			//Modèle de défaite
    			sender.sendMessage("Ma victoire!Pense à pourquoi tu as perdu jusqu'à demain");

    		}else if(args[0].equalsIgnoreCase("tyo") && enemy.equalsIgnoreCase("paa") ||
    			args[0].equalsIgnoreCase("goo") && enemy.equalsIgnoreCase("tyo") ||
        		args[0].equalsIgnoreCase("paa") && enemy.equalsIgnoreCase("goo")) {
    			//Modèle de victoire
    			sender.sendMessage("Fais le!Laisse-moi me venger demain");

    		}else if(args[0].equalsIgnoreCase(enemy)) {
    			//Motif Aiko
    			sender.sendMessage("Aikoyan!Qu'est-ce que c'est ça?");

    		}else {
    			//Modèles autres que goo tyo paa
    			return false;
    		}
    		return true;
    	}

    	//Afficher la main de l'adversaire avec le commandement ennemi
    	if(cmd.getName().equalsIgnoreCase("enemy")) {
    		sender.sendMessage("Enemy choice is " + enemy + ".");
    		return true;
    	}

    	return false;
    }
}

Génération aléatoire

//Bibliothèque pour la génération de nombres aléatoires
import java.util.Random;

En important cette bibliothèque, vous pouvez utiliser les classes utilisées ci-dessous pour générer des nombres aléatoires.

//Variable pour stocker la main de l'adversaire
String enemy = "";

//onEnable est la méthode qui sera exécutée lors de son chargement
//Dans cette méthode ennemi(La main de l'adversaire)Déterminer aléatoirement
@Override
public void onEnable() {
	//Séquence avec informations sur la main
	String[] hand = {"goo","tyo","paa"};

	//Instancier une classe pour la génération de nombres aléatoires
	Random r = new Random();
	//Générer un nombre aléatoire entre 0 et 3 avec la méthode nextInt,Stockez la main correspondante dans l'ennemi
	enemy = hand[r.nextInt(3)];
}

C'est un programme qui détermine aléatoirement la main de l'adversaire. Tout d'abord, préparez ʻenmy`, qui est une variable qui stocke la main de l'adversaire, comme un champ de la classe principale.

Après cela, une instance de la classe Random est initialisée en tant que processus lorsque ce programme devient effectif. Cela permet d'utiliser une méthode pour générer des nombres aléatoires via cette instance. Ensuite, appelez la méthode nectInt pour obtenir un nombre aléatoire. L'argument de cette méthode est la valeur maximale du nombre aléatoire généré. Ce programme génère des nombres aléatoires de 0 ou plus et de moins de 3.

En utilisant ceci comme indice du tableau, il est possible d'en obtenir aléatoirement un parmi les trois éléments de 0 à 2, c'est-à-dire le tableau «main».

Do Janken

//Jouez au jeu avec l'ennemi en exécutant la commande janken
    //Entrez votre main comme argument
    if(cmd.getName().equalsIgnoreCase("janken")) {

    	//Aucun argument passé
    	if(args.length == 0)return false;

    	if(args[0].equalsIgnoreCase("paa") && enemy.equalsIgnoreCase("tyo") ||
    		args[0].equalsIgnoreCase("tyo") && enemy.equalsIgnoreCase("goo") ||
    		args[0].equalsIgnoreCase("goo") && enemy.equalsIgnoreCase("paa")){
    		//Modèle de défaite
    		sender.sendMessage("Ma victoire!Pense à pourquoi tu as perdu jusqu'à demain");

    	}else if(args[0].equalsIgnoreCase("tyo") && enemy.equalsIgnoreCase("paa") ||
    		args[0].equalsIgnoreCase("goo") && enemy.equalsIgnoreCase("tyo") ||
        	args[0].equalsIgnoreCase("paa") && enemy.equalsIgnoreCase("goo")) {
    		//Modèle de victoire
    		sender.sendMessage("Fais le!Laisse-moi me venger demain");

    	}else if(args[0].equalsIgnoreCase(enemy)) {
    		//Motif Aiko
    		sender.sendMessage("Aikoyan!Qu'est-ce que c'est ça?");

    	}else {
    		//Modèles autres que goo tyo paa
    		return false;
    	}
    	return true;
}

Et le suivant semble être très difficile à première vue, mais le contenu est simple car l'expression conditionnelle est compliquée. Le modèle gagnant et le modèle perdant sont tous définis un par un (seuls les juges Aiko qui «ennemi» et «args [0]» sont égaux).

Montrer la main de l'adversaire

//Afficher la main de l'adversaire avec le commandement ennemi
if(cmd.getName().equalsIgnoreCase("enemy")) {
	sender.sendMessage("Enemy choice is " + enemy + ".");
	return true;
}

Il affiche simplement «ennemi». Je ne pense pas qu'il y ait de difficulté particulière.

Résultat d'exécution

スクリーンショット 2019-08-14 20.11.54.png

Les références

Recommended Posts

Acceptez la commande [MineCraft Plugin] et déclenchez un événement
Accordez un jeton d'accès avec la commande curl et POST l'API
sphinx-quickstart est devenu un problème et j'ai essayé de créer une commande alternative et le stress a disparu