我写的插件未禁用我的世界中的/ me

时间:2019-03-07 10:30:02

标签: java minecraft bukkit

因此在我的服务器/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:

现在,如果没有操作员的人可以运行/me hello,那么它就不应输出到聊天记录中,并且用户应该收到类似Dont me me!的消息

但事实并非如此。用户仍然可以在没有op的情况下进行/me hello的操作,并且代码应阻止该操作

由于我是Java的新手,因此可能很容易发现此错误,我们将不胜感激。

1 个答案:

答案 0 :(得分:3)

问题在于AsyncPlayerChatEvent仅在实际键入聊天消息(而非命令)时才被调用。对于命令,您必须使用PlayerCommandPreprocessEvent,Mischa在注释中对此做了很好的解释。更改事件将使其起作用:

@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