Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java /minecraft中的我并没有被我编写的插件禁用_Java_Minecraft_Bukkit - Fatal编程技术网

Java /minecraft中的我并没有被我编写的插件禁用

Java /minecraft中的我并没有被我编写的插件禁用,java,minecraft,bukkit,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.bukk

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

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


由于我是java新手,这个错误可能很容易找到,任何帮助都将不胜感激。

问题是,
AsyncPlayerChatEvent
仅在实际键入聊天信息(而不是命令)时才会被调用。对于命令,您必须使用
playerCommandPreprepreceEvent
,正如Misha在注释中精彩地解释的那样。更改事件将使其正常工作:

@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!");
        }
    }
}
但是,请注意,应该避免这种情况。幸运的是,有另一种方法可以在bukkit服务器中完全禁用命令。服务器文件夹中应该有一个
commands.yml
文件。只需添加“me”别名并在文件中将其设置为null:

aliases:
  me:
  - null

这似乎是一个图书馆特有的问题。我重新标记了你的问题。如果我正确地回忆起命令(以
/
开头的聊天消息),不要触发“
OnChat
”,而是触发“
OnCommand
”查看
AsyncPlayerCommandEvent
或类似的东西(没有答案,因为我不确定这是否正确)您好@Misha我找不到关于
AsyncPlayerCommandEvent
@kaci的任何类似内容,我不知道是否有asyn版本,但您正在寻找
PlayerCommandPreprepreprocessEvent
。在任何命令执行器之前,每个命令都会触发此事件。因此,我研究了
playercommandproprecevent
,从我在线阅读的内容来看,如果我只是将
AsyncPlayerChatEvent
替换为
playercommandprocevent
,它应该能够工作,但它没有。你知道我做错了什么吗?这件事应该避免的具体原因是什么?事实上如果OP希望能够在某种条件下控制
/me
的使用,则链接文档鼓励使用此事件:“此事件的一些有效使用示例为:[……]有条件地阻止属于其他插件的命令。[……]”