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
的使用,则链接文档鼓励使用此事件:“此事件的一些有效使用示例为:[……]有条件地阻止属于其他插件的命令。[……]”