[Java] Développement du plug-in Spigot - Enregistrez la commande en tant que commande vanilla

Aperçu

-Normalement, la commande à enregistrer dans plugin.yml est enregistrée en tant que commande vanilla.

Public cible

・ L'environnement de développement de plug-ins est en place.

environnement

・ Windows 10 à 1909 -Version de l'EDI Eclipse: 2020-06 (4.16.0) ・ Minecraft 1.16.1 ・ Robinet 1.16.1

Mise en garde

Cela utilise le brigadier du moteur de commande ajouté à partir de Minecraft 1.13, donc cela peut ne pas être possible avec les versions inférieures à 1.13.

Commande pour créer

-Cette fois, nous allons créer en toute sécurité une commande pour "faire voler le joueur". -Syntaxe de commande /fly <joueur> allow

Code source et description

・ Commençons par créer une classe.

FlyCommand.java


package com.hamusuke.qiita.command;

import java.util.Collection;

import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;

import net.minecraft.server.v1_16_R1.ArgumentEntity;
import net.minecraft.server.v1_16_R1.ChatMessage;
import net.minecraft.server.v1_16_R1.CommandListenerWrapper;
import net.minecraft.server.v1_16_R1.EntityPlayer;

public class FlyCommand {
	public static void register(CommandDispatcher<CommandListenerWrapper> dispatcher) {
		LiteralArgumentBuilder<CommandListenerWrapper> literalArgumentBuilder = net.minecraft.server.v1_16_R1.CommandDispatcher.a("fly").requires((permission) -> {
			return permission.hasPermission(2);
		}).then(net.minecraft.server.v1_16_R1.CommandDispatcher.a("target", ArgumentEntity.d()).then(net.minecraft.server.v1_16_R1.CommandDispatcher.a("allow").executes((commandcontext) -> {
			return execute(commandcontext.getSource(), ArgumentEntity.f(commandcontext, "target"));
		})));

		dispatcher.register(literalArgumentBuilder);
	}

	private static int execute(CommandListenerWrapper commandListenerWrapper, Collection<EntityPlayer> players) {
		for(EntityPlayer entityPlayer : players) {
			entityPlayer.abilities.canFly = true;
			entityPlayer.updateAbilities();
		}

		if(players.size() == 1) {
			commandListenerWrapper.sendMessage(new ChatMessage("%Fait s flyable", new Object[] {players.iterator().next().getScoreboardDisplayName()}), true);
		}else {
			commandListenerWrapper.sendMessage(new ChatMessage("%Fait voler les joueurs", new Object[] {players.size()}), true);
		}

		return players.size();
	}
}

public static void register(CommandDispatcher<CommandListenerWrapper> dispatcher) {

-Créer une méthode pour l'enregistrement des commandes. -CommandDispatcher est pour com.mojang.brigadier.CommandDispatcher

LiteralArgumentBuilder<CommandListenerWrapper> literalArgumentBuilder = net.minecraft.server.v1_16_R1.CommandDispatcher.a("fly").requires((permission) -> {
	return permission.hasPermission(2);
}).then(net.minecraft.server.v1_16_R1.CommandDispatcher.a("target", ArgumentEntity.d()).then(net.minecraft.server.v1_16_R1.CommandDispatcher.a("allow").executes((commandcontext) -> {
	return execute(commandcontext.getSource(), ArgumentEntity.f(commandcontext, "target"));
})));

Net.minecraft.server.v1_16_R1.CommandDispatcher.a (" voler ") C'est la partie / fly.

Nécessite ((permission) -> { return permission.hasPermission(2); }); Spécifie le niveau de privilège auquel la commande peut être exécutée. Si «2» est spécifié, seuls les joueurs avec des privilèges d'administrateur peuvent l'exécuter.

Puis (net.minecraft.server.v1_16_R1.CommandDispatcher.a (" target ", ArgumentEntity.d ()). Then (net.minecraft.server.v1_16_R1.CommandDispatcher.a (" allow ")) La syntaxe après / fly ʻArgumentEntity.d () `est utilisé lorsque vous souhaitez spécifier uniquement le lecteur. Si vous spécifiez une entité telle que @e, vous obtiendrez une erreur comme celle-ci. Untitled.jpg

executes((commandcontext) -> {
    return execute(commandcontext.getSource(), ArgumentEntity.f(commandcontext, "target"));
})
dispatcher.register(literalArgumentBuilder);

-La syntaxe de la commande est enregistrée.

for(EntityPlayer entityPlayer : players) {
    entityPlayer.abilities.canFly = true;
    entityPlayer.updateAbilities();
}

-Vous pouvez voler avec ʻentityPlayer.abilities.canFly = true. · ʻEntityPlayer.updateAbilities () envoie au serveur que les capacités du joueur (entityPlayer.abilities) ont changé. N'oubliez pas de l'inclure lorsque vous apportez des modifications.

if(players.size() == 1) {
    commandListenerWrapper.sendMessage(new ChatMessage("%Fait s flyable", new Object[] {players.iterator().next().getScoreboardDisplayName()}), true);
}else {
    commandListenerWrapper.sendMessage(new ChatMessage("%Fait voler les joueurs", new Object[] {players.size()}), true);
}

· CommandListenerWrapper.sendMessage () envoie un message à l'expéditeur de la commande. -Si vous utilisez getScoreboardDisplayName (), les informations seront affichées lorsque vous déplacez le curseur de cette manière. Sans titre 1.jpg -Si true est spécifié, il sera envoyé aux autres joueurs et aux journaux du serveur. -Si false est spécifié, seul l'expéditeur de la commande sera envoyé.

Main.java


package com.hamusuke.qiita;

import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_16_R1.CraftServer;
import org.bukkit.plugin.java.JavaPlugin;

import com.hamusuke.qiita.command.FlyCommand;
import com.mojang.brigadier.CommandDispatcher;

import net.minecraft.server.v1_16_R1.CommandListenerWrapper;
import net.minecraft.server.v1_16_R1.DedicatedServer;

public class Main extends JavaPlugin {
	@Override
	public void onEnable() {
		DedicatedServer dedicatedServer = ((CraftServer)Bukkit.getServer()).getServer();
		CommandDispatcher<CommandListenerWrapper> dispatcher = dedicatedServer.vanillaCommandDispatcher.a();
		
  		FlyCommand.register(dispatcher);
  		getLogger().info("registered fly command");
	}
}

-OnEnable () est appelé lorsque le plug-in est chargé, alors enregistrez la commande ici.

Essayez de le mettre sur le serveur

無題3.jpg Je me suis inscrit fermement. 無題2.jpg Tu peux voler.

Puisqu'il est enregistré en tant que commande vanilla, ce sera / minecraft: fly. (minecraft: peut être omis)

Bon point

-Fonctionne de la même manière que la commande vanilla. -Il n'est pas nécessaire de le décrire dans plugin.yml. -Il n'est pas nécessaire de créer une classe pour l'achèvement des tabulations.

mauvais endroit

-Le code a tendance à être long. (Difficile de voir)

À la fin

Merci d'avoir lu l'article. C'est la première fois que j'écris un article, donc cela peut avoir été difficile à comprendre.

Recommended Posts

[Java] Développement du plug-in Spigot - Enregistrez la commande en tant que commande vanilla
Enregistrez le package avec PyPI
Notez l'achèvement d'une commande chronophage