/ Me в Minecraft не отключен плагином, который я написал - PullRequest
2 голосов
/ 07 марта 2019

Так что на моем сервере /me это активная команда.Я хотел отключить это, потому что я не хочу, чтобы люди могли это делать.

Я изучаю Java, поэтому я решил написать код, который отключил /me сам.

Поэтому я написал следующий код:

package com.ste999.disableme;

import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.event.player.AsyncPlayerChatEvent;

public class Main extends JavaPlugin implements Listener 
    @Override
    public void onEnable() {
        getLogger().info("disable me enabled");
        PluginManager pm = this.getServer().getPluginManager();
        pm.registerEvents(this, (this));
    }

    @Override
    public void onDisable() {
        getLogger().info("disable me disabled");
    }

    @EventHandler
    public void OnMe(AsyncPlayerChatEvent event)
    {
        Player p = event.getPlayer();
        if(!p.hasPermission("ste999.me")) {
            if (event.getMessage().startsWith("/me")) {
                event.setCancelled(true);
                p.sendMessage("§4Dont me me!");
                }
            }
        }
}

со следующим файлом plugin.yml:

name: Disable_Me
main: com.ste999.disableme.Main
version: 1.0
load: startup
description: this is should disable me
commands:

Теперь, если кто-то без op запустит /me hello, он не должен выводиться вчат и пользователь должен получить сообщение вроде Dont me me!

Но это не так.пользователь все еще может делать /me hello без операции, и код должен предотвратить это

Поскольку я довольно новичок в Java, эту ошибку, вероятно, легко найти, и любая помощь будет высоко ценится.

1 Ответ

3 голосов
/ 08 марта 2019

Проблема в том, что AsyncPlayerChatEvent вызывается только при фактическом наборе сообщений чата (не команд).Для команд вы должны использовать PlayerCommandPreprocessEvent, как замечательно объяснил Миша в комментариях.Изменение события заставит его работать:

@EventHandler
public void disableMeCommand(PlayerCommandPreprocessEvent event) {
    Player p = event.getPlayer();
    if(!p.hasPermission("ste999.me")) {
        if(event.getMessage().startsWith("/me")) {
            event.setCancelled(true);
            p.sendMessage("§4Dont me me!");
        }
    }
}

Однако обратите внимание, что PlayerCommandPreprocessEvent следует избегать.К счастью, есть еще один способ полностью отключить команду на сервере Bukkit.У вас должен быть файл commands.yml, расположенный в папке вашего сервера.Просто добавьте псевдоним "me" и установите его в null внутри файла:

aliases:
  me:
  - null
...