[Java] Entwicklung des Spigot-Plug-Ins - Registrieren Sie den Befehl als Vanilla-Befehl

Überblick

Zielgruppe

・ Die Umgebung für die Plug-In-Entwicklung ist vorhanden.

Umgebung

・ Windows 10 - 1909 -Eclipse IDE Version: 2020-06 (4.16.0) ・ Minecraft 1.16.1 ・ Zapfen 1.16.1

Hinweis

Hierbei wird der aus Minecraft 1.13 hinzugefügte Befehlsmodul-Brigadier verwendet, sodass dies bei Versionen unter 1.13 möglicherweise nicht möglich ist.

Befehl zum Erstellen

-Dieses Mal werden wir sicher einen Befehl erstellen, um "den Spieler zum Fliegen zu bringen". -Befehlssyntax /fly <Spieler> allow

Quellcode und Beschreibung

・ Erstellen wir zunächst eine Klasse.

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("%S fliegbar gemacht", new Object[] {players.iterator().next().getScoreboardDisplayName()}), true);
		}else {
			commandListenerWrapper.sendMessage(new ChatMessage("%S Spieler flugfähig gemacht", new Object[] {players.size()}), true);
		}

		return players.size();
	}
}

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

-Erstellen Sie eine Methode zur Befehlsregistrierung. -CommandDispatcher ist für 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 Net.minecraft.server.v1_16_R1.CommandDispatcher.a (" fly ") Dies ist der / fly Teil.

Benötigt ((Erlaubnis) -> { return permission.hasPermission(2); }); Gibt die Berechtigungsstufe an, auf der der Befehl ausgeführt werden kann. Wenn "2" angegeben ist, können nur Spieler mit Administratorrechten es ausführen.

Then Dann (net.minecraft.server.v1_16_R1.CommandDispatcher.a (" target ", ArgumentEntity.d ()). Then (net.minecraft.server.v1_16_R1.CommandDispatcher.a (" allow ")) Die Syntax nach / fly ArgumentEntity.d () wird verwendet, wenn Sie nur den Player angeben möchten. Wenn Sie eine Entität wie @e angeben, wird eine solche Fehlermeldung angezeigt. Untitled.jpg

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

-Die Syntax des Befehls ist registriert.

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

-Sie können es mit "entityPlayer.abilities.canFly = true" flugfähig machen. · EntityPlayer.updateAbilities () sendet an den Server, dass sich die Fähigkeiten des Spielers(entityPlayer.abilities)geändert haben. Stellen Sie sicher, dass Sie dies berücksichtigen, wenn Sie Änderungen vornehmen.

if(players.size() == 1) {
    commandListenerWrapper.sendMessage(new ChatMessage("%S fliegbar gemacht", new Object[] {players.iterator().next().getScoreboardDisplayName()}), true);
}else {
    commandListenerWrapper.sendMessage(new ChatMessage("%S Spieler flugfähig gemacht", new Object[] {players.size()}), true);
}

· CommandListenerWrapper.sendMessage () sendet eine Nachricht an den Befehlsabsender. -Wenn Sie "getScoreboardDisplayName ()" verwenden, werden die Informationen angezeigt, wenn Sie den Cursor auf diese Weise bewegen. Ohne Titel 1.jpg -Wenn "true" angegeben ist, wird es an andere Spieler und Serverprotokolle gesendet. -Wenn "false" angegeben ist, wird nur der Absender des Befehls gesendet.

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 () wird aufgerufen, wenn das Plug-In geladen wird. Registrieren Sie den Befehl hier.

Versuchen Sie es auf den Server zu legen

無題3.jpg Ich habe mich fest angemeldet. 無題2.jpg Du kannst fliegen.

Da es als Vanille-Befehl registriert ist, wird es "/ minecraft: fly" sein. (Minecraft: kann weggelassen werden)

Guter Punkt

-Funktionen wie der Vanille-Befehl. -Es ist nicht notwendig, es in plugin.yml zu beschreiben. -Es ist nicht erforderlich, eine Klasse für die Vervollständigung der Registerkarte zu erstellen.

schlechter Platz

-Der Code ist in der Regel lang. (Schwer zu sehen)

Am Ende

Vielen Dank für das Lesen des Artikels. Dies ist das erste Mal, dass ich einen Artikel geschrieben habe, daher war er möglicherweise schwer zu verstehen.

Recommended Posts

[Java] Entwicklung des Spigot-Plug-Ins - Registrieren Sie den Befehl als Vanilla-Befehl
Registrieren Sie das Paket bei PyPI
Beachten Sie den Abschluss eines zeitaufwändigen Befehls