java - 我写的插件没有禁用我的世界中的/me

标签 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:

现在,如果没有 op 的人运行 /me hello,它不应该输出到聊天,用户应该收到类似 Dont me me! 的消息

>

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

由于我对 java 还很陌生,这个错误可能很容易找到,如果有任何帮助,我们将不胜感激。

最佳答案

问题是 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

关于java - 我写的插件没有禁用我的世界中的/me,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55041572/

相关文章:

java - 查找字符串中的第一个数字序列?

java - HIbernate注解@GeneratedValue策略类型的区别

java - 仅在第一次显示时加载选项卡(Fragment)一次并保留以供以后使用

java - Java中的静态类

php - 回溯迷宫生成(将所有内容转换为二维数组)

c# - 从 C# 启动 jar

java - 解密我的世界 .dat 文件

java - 使用 -Djava.ext.dirs=lib 选项启动 craftbukkit 时出错

java - 从 ItemStack 获取项目槽

java - hibernate 5 : how to cast connection's metadata to DialectresolutionInfo