java - /me in minecraft 没有被我写的插件禁用
问题描述
所以在我的服务器/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!
但事实并非如此。用户仍然可以在/me hello
没有 op 的情况下进行操作,并且代码应该防止这种情况发生
由于我对 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
推荐阅读
- c++ - 这些特定指针的含义
- java - 为什么〜1在Java中返回-2而不是0?
- java - 如何使用 Java 在 Eclipse 中运行 webdriver 和 JMeter 代码
- stripe-payments - Stripe 与 expo react 原生应用程序集成
- c# - 循环遍历未保存的实体对象并获取除非标量属性外的属性和值
- python - 我的数据清理脚本很慢,关于如何改进的任何想法?
- c# - 为项目中的所有 WCF 服务提供单端点配置?
- c# - Entity Framework 6.0 中的对象查询
- python - 如何使用凭据初始化 Google Cloud Storage
- c++ - C2678 二进制“==”:未找到采用“卡”类型左侧操作数的运算符(或没有可接受的转换)