• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!
  • Dies ist ein moderiertes Forum. Dein Beitrag ist für dich und andere erst sichtbar, wenn er von einem Teammitglied moderiert wurde! Wird dein Beitrag abgelehnt erhältst du eine Meldung. Bitte erstelle solange keine neuen Beiträge! Die Freischaltung wird auch nicht durch Nachfragen bei einem Teammitglied beschleunigt.

Commands ohne Eintrag in der Plugin.yml Registrieren

ILoveJava

Minecrafter
Registriert
21 März 2021
Beiträge
7
Diamanten
52
Hey Ho, vielleicht kann das jemand gebrauchen, der folgende Code Registriert Commands ohne Eintrag in der Plugin.yml.

Ich erkläre kurz, warum man dieses System benutzen kann, dieses System ersetzt grundsätzlich den Command Reiter in der Plugin.yml,
dies bedeutet das folgender Code nicht mehr in der Plugin.yml erfasst werden muss:

Code:
u:
    description: Test
    permission: Test
    aliases: [Test]
    usage: Test

dazu entfällt die Registration und das setzten des Executor:
Code:
this.getCommand("kit").setExecutor(new CommandKit());

zu:

Code:
new Command_Test(Name,Plugin);

des weiteren wurde der Executor angepasst von:

Code:
public boolean onCommand(CommandSender sender,Command cmd,String label,String[] args)

zu:

Code:
public boolean command(CommandSender sender, String[] args)

Es entfallen somit der Command selbst wie auch das Label

Wofür braucht man sowas?
Nun, der Anwendungsbereich ist natürlich für jeden selbst zu finden, jedoch erspart euch diese Klasse bei größeren System
einiges an Code, es kann beliebig modifiziert und angepasst werden, Commands können durch eine Config beliebig verändert werden.


Zum Anfang erstellt ihr eine Klasse namens AbstractCommands und fügt folgendes ein:
Code:
package de.ilovejava.commands;

import java.lang.reflect.Field;

import org.bukkit.Bukkit;
import org.bukkit.command.CommandMap;
import org.bukkit.command.CommandSender;
import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.plugin.Plugin;

/*
* Erstellt den Command für die @BukkitCommandMap
* @author ILoveJava
* @version 1.0
* @see https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/command/CommandMap.html
*/

public abstract class AbstractCommands extends BukkitCommand{

    /*
     * Konstruktor für die Klasse @AbstractCommands{@String,@Plugin}
     * @param commandName{@String}
     * @param pl{@Plugin}
     * @see https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/plugin/Plugin.html
     * @exception IllegalArgumentException
     * @exception IllegalAccessException
     * @exception NoSuchFieldException
     * @exception SecurityException
     * */
    public AbstractCommands(String commandName, Plugin pl) {
        super(commandName);
        try {
            getCommandMap().register(pl.getName(), this);
        }catch(IllegalArgumentException|IllegalAccessException|NoSuchFieldException|SecurityException e) {
            e.printStackTrace();
        }
    }
 
    /*
     * Getter @Boolean
     * @param sender{@CommandSender}
     * @param arg1{@String}
     * @param args{@String}
     * @return @Command{@CommandSender,@String}
     * @see https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/command/CommandSender.html
     * @see Command{@CommandSender,@String[]}
     * */
    @Override
    public boolean execute(CommandSender sender, String arg1, String[] args) {
        return command(sender, args);
    }
 
    /*
     * Runner @Boolean
     * @param paramCommandSender{@Commandsender}
     * @param paramArrayOfString{@String[]}
     * @see https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/command/CommandSender.html
     * @see https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/command/defaults/BukkitCommand.html
     * */
    public abstract boolean command(CommandSender paramCommandSender, String[] paramArrayOfString);
 
    /*
     * Getter @CommandMap getCommand
     * @exception IllegalArgumentException
     * @exception IllegalAccessException
     * @exception NoSuchFieldException
     * @exception SecurityException
     * @return commandMap{CommandMap}
     * */
    public CommandMap getCommandMap()throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException{
        Field commandMap = Bukkit.getServer().getClass().getDeclaredField("commandMap");
        commandMap.setAccessible(true);
        return (CommandMap) commandMap.get(Bukkit.getServer());
    }
}

Zum registrieren des Commandes in der Main Klasse folgenden Konstruktor aufrufen:
Code:
new Command_Test(Name,Plugin);

Nun nur noch auf die Klasse AbstractCommands verweisen:
Code:
public class Command_Test extends AbstractCommands{

    public Command_Test(String commandName, Plugin pl) {
        super(commandName, pl);
    }

    @Override
    public boolean command(CommandSender sender, String[] args) {
     
    }
 
}


Ich hoffe das dies jemand gebrauchen kann.

MfG
 
Zuletzt bearbeitet:

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.671
Diamanten
570
Das Tutorial an sich überzeugt mich im Umfang nicht so richtig und da könnte man durchaus noch ein paar erklärende Worte dazu packen. Vor allem wird der Command nicht mehr automatisch von Bukkit entfernt, wenn das Plugin deaktiviert wird.

Aber das Ganze wurde immerhin sauber gebaut und ich vermute der Anwendungsfall kommt tatsächlich häufiger vor, so dass ich das einfach mal freigeschaltet habe. Vielleicht magst du noch ein paar erklärende Wort ergänzen.
 

Igelchen

Minecrafter
Registriert
28 März 2021
Beiträge
6
Diamanten
56
Nettes Tutorial, aber: gibt es irgendeinen Grund, warum man nicht einfach zur plugin.yml greifen sollte?
 

ILoveJava

Minecrafter
Registriert
21 März 2021
Beiträge
7
Diamanten
52
Nettes Tutorial, aber: gibt es irgendeinen Grund, warum man nicht einfach zur plugin.yml greifen sollte?

Eine gute Frage, natürlich bleibt dies jedem selbst überlassen, ich beantworte diese Frage jedoch an einem Beispiel(Voxelsniper):

Code:
  u:
    description: Undo changes made by yourself or other players.
    permission: voxelsniper.sniper
    aliases: [undo]
    usage: Invalid syntax. Use /<command> help to see valid syntax.
  uu:
    description: Undo changes made by other players.
    permission: voxelsniper.sniper
    aliases: [undouser]
    usage: Invalid syntax. Use /<command> help to see valid syntax.
  d:
    description: Reverts all values back to defaults.
    permission: voxelsniper.sniper
    alias: [default]
    usage: Invalid syntax. Use /<command> help to see valid syntax.
  p:
    description: Change the currently active performer for the performer brush.
    permission: voxelsniper.sniper
    aliases: [perf, performer]
    usage: Invalid syntax. Use /<command> help to see valid syntax.

Ich selbst benutze dieses System damit meine Plugin.yml Kompakt wird, ich persönlich mag es nicht wenn in einer File 400 Zeilen drin sind wie man oben sehen kann(Die Voxelsnip Plugin.yml gekürzt), jedoch überlasse ich es dir ob du dieses System verwenden möchtest, da jeder anders arbeitet und somit über eine andere Erstellung seiner Syntax verfügt.


Das Tutorial an sich überzeugt mich im Umfang nicht so richtig und da könnte man durchaus noch ein paar erklärende Worte dazu packen. Vor allem wird der Command nicht mehr automatisch von Bukkit entfernt, wenn das Plugin deaktiviert wird.

Aber das Ganze wurde immerhin sauber gebaut und ich vermute der Anwendungsfall kommt tatsächlich häufiger vor, so dass ich das einfach mal freigeschaltet habe. Vielleicht magst du noch ein paar erklärende Wort ergänzen.

Danke für dein Feedback, ich habe eine kleine Erklärung hinzugefügt und kurz erläutert was diese System genau macht und was dadurch entfällt.

" Vor allem wird der Command nicht mehr automatisch von Bukkit entfernt, wenn das Plugin deaktiviert wird. "
Ich werde mich dem annehmen und in den nächsten den Code updaten.


Lg.
 
Oben