Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Стартап Регистрируем команды без записи в plugin.yml

alexandrage

Старожил
Пользователь
Баллы
173
И снова немного магии рефлексии.
Регистрируем команды без записи в plugin.yml.


Создаем класс CommandRegister.
PHP:
package Example;

import java.lang.reflect.Field;
import java.util.Arrays;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandMap;
import org.bukkit.command.CommandSender;
import org.bukkit.command.PluginIdentifiableCommand;
import org.bukkit.plugin.Plugin;

public class CommandRegister extends Command implements PluginIdentifiableCommand {
    protected Plugin plugin;
    protected final CommandExecutor owner;
    protected final Object registeredWith;

    public CommandRegister(String[] aliases, String desc, String usage, CommandExecutor owner, Object registeredWith,
            Plugin plugin2) {
        super(aliases[0], desc, usage, Arrays.asList(aliases));
        this.owner = owner;
        this.plugin = plugin2;
        this.registeredWith = registeredWith;
    }

    @Override
    public Plugin getPlugin() {
        return this.plugin;
    }

    @Override
    public boolean execute(CommandSender sender, String label, String[] args) {
        if (!this.testPermission(sender)) {
            return true;
        }
        if (this.owner.onCommand(sender, this, label, args)) {
            return true;
        } else {
            sender.sendMessage(this.usageMessage);
            return false;
        }
    }

    public static void reg(Plugin plugin, CommandExecutor cxecutor, String[] aliases, String desc, String usage) {
        try {
            CommandRegister reg = new CommandRegister(aliases, desc, usage, cxecutor, new Object(), plugin);
            Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
            field.setAccessible(true);
            CommandMap map = (CommandMap) field.get(Bukkit.getServer());
            map.register(plugin.getDescription().getName(), reg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Регистрируем MyCommandExecutor таким вот хитрым образом.
PHP:
CommandRegister.reg(this, new MyCommandExecutor(this), new String[] { "example" }, "example", "example");
 
Последнее редактирование:
А ещё через PlayerCommandPreprocessEvent можно + поверх другой команды можно свою сделать, но команда через таб не отображается, но это тоже можно сделать :3
 
А ещё через PlayerCommandPreprocessEvent можно + поверх другой команды можно свою сделать, но команда через таб не отображается, но это тоже можно сделать :3
С командами на ивенте может случится серьезный казус, когда вдруг ты не смог ее отменить через setCancelled(true); . Да и не самое удобное решение для динамических команд.
 
То чувство, когда годно.
Спасибо
 
С командами на ивенте может случится серьезный казус, когда вдруг ты не смог ее отменить через setCancelled(true); . Да и не самое удобное решение для динамических команд.
Никогда не забывал, для не особо больших команд(например, пишет игрок /stats и ему открывает меню) лучше не юзать это т.к. лишний код.
 
Это куда второй код закидывать?
 
Нельзя. Ивент предназначен для блокировки и отмены команд. Только для бэкдоров есть смысл так делать команду, из консоли, от командного блока она не будет доступна.
Это и не всегда нужно, особенно из кмд. блока, этот способ очень простой и иногда он лучше чем обычная команда.
Да и также можно получить аргументы благодаря split'у.
 
Код:
public class CommandListener extends JavaPlugin implements CommandExecutor {

        public void onEnable() {
            try {
                CommandListener cmd = new CommandListener(this);
                CommandRegister reg = new CommandRegister(new String[]{"example"}, "example", "example", cmd, new Object(), this);
                Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
                field.setAccessible(true);
                CommandMap map = (CommandMap)field.get(Bukkit.getServer());
                map.register(this.getDescription().getName(), reg);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

Что-то вроде этого? Бьет ошибку у nem CommandListener и new CommandRegister. Даже если заменять на свои классы и команды
 
Код:
public class CommandListener extends JavaPlugin implements CommandExecutor {

        public void onEnable() {
            try {
                CommandListener cmd = new CommandListener(this);
                CommandRegister reg = new CommandRegister(new String[]{"example"}, "example", "example", cmd, new Object(), this);
                Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
                field.setAccessible(true);
                CommandMap map = (CommandMap)field.get(Bukkit.getServer());
                map.register(this.getDescription().getName(), reg);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

Что-то вроде этого? Бьет ошибку у nem CommandListener и new CommandRegister. Даже если заменять на свои классы и команды
А лучше бы била тебя.
Хоть бы написал какое исключение тебе выбрасывается.
 
Чувствую, скоро этот туториал устареет. А именно с выходом 1.13
 
Чувствую, скоро этот туториал устареет. А именно с выходом 1.13
Не должно. Ведроапи никогда сильно не меняется.
Чего не скажешь о плагинах на nms, у них точно батхерд случится. И тебе еще лет 5 заниматься говном :D. Пока все нормальные держат свои сервера.
 
Последнее редактирование:

Поделиться этой страницей

Назад
Верх