本帖最后由 白色的小熊 于 2021-8-17 15:03 编辑 
源代码在这里:复制代码
你们说的错误我已经改了,现在的问题就是命令参数的判断,虽然有两个命令,实质上是一个命令,然后还有一个问题,就是怎么在其他类中注销主类的事件监听器
源代码在这里:
 
- import org.bukkit.command.Command;
 
- import org.bukkit.command.CommandExecutor;
 
- import org.bukkit.command.CommandSender;
 
- import org.bukkit.event.Listener;
 
- import org.bukkit.event.player.AsyncPlayerChatEvent;
 
- import org.bukkit.plugin.Plugin;
 
 
- public class OnCommand implements CommandExecutor, Listener {
 
 
-     public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
 
-         if (cmd.toString().equals("chat")) {
 
-             if (args[0].equals("close")) {
 
-                 AsyncPlayerChatEvent.getHandlerList().unregister(this);
 
-                 sender.sendMessage("已关闭聊天功能");
 
-             }
 
-             if (args.length == 1) {
 
-                 return false;
 
-             }
 
-             if (args[0].equals("open")) {
 
-                 sender.getServer().getPluginManager().registerEvents(this, (Plugin) this);
 
-                 sender.sendMessage("已开启聊天功能");
 
-             }
 
-             return true;
 
-         }
 
-         return false;
 
-     }
 
- }
你们说的错误我已经改了,现在的问题就是命令参数的判断,虽然有两个命令,实质上是一个命令,然后还有一个问题,就是怎么在其他类中注销主类的事件监听器
额,完全看不懂呢
toString 不应该在这里使用
要使用 cmd.getName().equalsIgnoreCase("chat")
要使用 cmd.getName().equalsIgnoreCase("chat")
 本帖最后由 白色的小熊 于 2021-8-17 12:00 编辑 
这样的话就只能实现/chat close而不能实现/chat open,怎么在另一个类里关闭主类的事件监听器?
不管是/chat open还是/chat close实质上都是一个指令,两个不同的参数
RarityEG 发表于 2021-8-17 11:24
toString 不应该在这里使用
要使用 cmd.getName().equalsIgnoreCase("chat")
这样的话就只能实现/chat close而不能实现/chat open,怎么在另一个类里关闭主类的事件监听器?
不管是/chat open还是/chat close实质上都是一个指令,两个不同的参数
多试几次吧
今天怎么这么多灌水的?不会你来回复啥?
sdgavfdhieavfc
我在想 if (cmd.toString().equals("chat"))  有什么意义,setExcutor的时候不是指定了命令了吗,为什么还要判断一次,还有你判长为什么在中间.
 本帖最后由 南柯郡守 于 2021-8-17 13:00 编辑 
你在主类有没有注册指令
this.getCommand(cmd).setExecutor(executor)
命令长度最好先判断 不然你第一个if容易npe
if (cmd.toString().equals("chat")) 百分百false 你这里的cmd是一个指令对象 不单单是你的/chat
你在主类有没有注册指令
this.getCommand(cmd).setExecutor(executor)
命令长度最好先判断 不然你第一个if容易npe
if (cmd.toString().equals("chat")) 百分百false 你这里的cmd是一个指令对象 不单单是你的/chat
结冰的离季 发表于 2021-8-17 12:53
我在想 if (cmd.toString().equals("chat")) 有什么意义,setExcutor的时候不是指定了命令了吗,为什么还 ...
已经改了,还是不管用啊,输入/chat open还是给我返回false
南柯郡守 发表于 2021-8-17 12:54
你在主类有没有注册指令
this.getCommand(cmd).setExecutor(executor)
这个在主类里写了,请仔细看问题,谢谢
 本帖最后由 结冰的离季 于 2021-8-17 13:15 编辑 
print大法,确定到底是哪个false输出args[0] 和 args[0].equals("open")
如果if (cmd.toString().equals("chat")) { 已经去掉的话 false百分百是length的
白色的小熊 发表于 2021-8-17 13:05
已经改了,还是不管用啊,输入/chat open还是给我返回false
print大法,确定到底是哪个false输出args[0] 和 args[0].equals("open")
如果if (cmd.toString().equals("chat")) { 已经去掉的话 false百分百是length的
南柯郡守 发表于 2021-8-17 13:13
呵呵 不客气
还真没在哪里看到你说在主类写这句了
那是因为主类的代码没有放上去
-     public void onEnable() {
 
-         getServer().getLogger().info(ChatColor.GREEN + "插件已被调用");
 
-         getServer().getLogger().info(ChatColor.GREEN + "版本号:" + a);
 
-         getServer().getLogger().info(ChatColor.GREEN + "作者" + b);
 
-         getServer().getPluginManager().registerEvents(this, this);
 
-         this.getCommand("chat").setExecutor(new OnCommand());
 
- }
注意看最后一行,明明写了,请仔细审题
白色的小熊 发表于 2021-8-17 13:16
那是因为主类的代码没有放上去
注意看最后一行,明明写了,请仔细审题
所以在我回答之前并没有放上去对吧
所以我的回答也没问题对吧
所以我补充的部分你也没看见是吧
所以你不是来这里解决问题的是吧
结冰的离季 发表于 2021-8-17 13:09
print大法,确定到底是哪个false输出args[0] 和 args[0].equals("open")
如果if (cmd.toString().equals(" ...
长度没有问题,就两个长度,/chat open和/chat close,不可能是长度的错误,它还时不时的给我返回错误
D:\用户目录\我的图片
 本帖最后由 白色的小熊 于 2021-8-17 13:29 编辑 
既然我来提问就已经做好了充足的准备,教程我已经看了,所以都不是!!!如果不是来回答问题的请不要恶意灌水,第一,你补充的没有实质性帮助,第二,在你回答之前就已经放上去了,我也没有没看见你的回答,否则也不会回复,第三,我是抱着问问题的态度和你说话,请注意言辞
南柯郡守 发表于 2021-8-17 13:21
所以在我回答之前并没有放上去对吧
所以我的回答也没问题对吧
既然我来提问就已经做好了充足的准备,教程我已经看了,所以都不是!!!如果不是来回答问题的请不要恶意灌水,第一,你补充的没有实质性帮助,第二,在你回答之前就已经放上去了,我也没有没看见你的回答,否则也不会回复,第三,我是抱着问问题的态度和你说话,请注意言辞
 本帖最后由 结冰的离季 于 2021-8-17 13:32 编辑 
报错应该是AsyncPlayerChatEvent.getHandlerList().unregister(this); 和sender.getServer().getPluginManager().registerEvents(this, (Plugin) this);
的问题,你这个类又没继承AsyncPlayerChatEvent,怎么能注销,也不能注册
可能是输入之后报错了,退出了当前if分支然后他就返回false了
白色的小熊 发表于 2021-8-17 13:23
长度没有问题,就两个长度,/chat open和/chat close,不可能是长度的错误,它还时不时的给我返回错误
...
报错应该是AsyncPlayerChatEvent.getHandlerList().unregister(this); 和sender.getServer().getPluginManager().registerEvents(this, (Plugin) this);
的问题,你这个类又没继承AsyncPlayerChatEvent,怎么能注销,也不能注册
可能是输入之后报错了,退出了当前if分支然后他就返回false了
白色的小熊 发表于 2021-8-17 13:25
既然我来提问就已经做好了充足的准备,教程我已经看了,所以都不是!!!如果不是来回答问题的请不要恶意 ...
你做好了充足的准备那我们怎么知道 在没有表述出来的情况下我们只能做假设
你没说那我们不就是再提一遍?
你都没说全那能叫充足的准备? 准备啥了也没在帖子里说啊
完了你的语气别人能不能接受我不知道 反正是让我很不舒服
问题在哪儿(Plugin)this
你怎么能把一个没有继承JavaPlugin的类初始化做插件去强转?
结冰的离季 发表于 2021-8-17 13:31
报错应该是AsyncPlayerChatEvent.getHandlerList().unregister(this); 和sender.getServer().getPluginMan ...
可是主类继承了,还写了这个事件的监听器,然后这个类好像和主类联系不起来
白色的小熊 发表于 2021-8-17 13:34
可是主类继承了,还写了这个事件的监听器,然后这个类好像和主类联系不起来 ...
主类关他什么事,this是当前类的,你要不就传入主类对象
 本帖最后由 白色的小熊 于 2021-8-17 13:56 编辑 
没有必要的就不需要说,难不成我啥也不准备就来提问?你们是不知道,但是你们可以想,既然我来提问,肯定是准备了,而且后来我已经告诉你了我已经写了。
我已经明确告诉你了,我已经写了。
这么多问题你是看不见吗?
我的语气为啥是这样的你自己不清楚吗?!
南柯郡守 发表于 2021-8-17 13:32
你做好了充足的准备那我们怎么知道 在没有表述出来的情况下我们只能做假设
你没说那我们不就是再提一遍 ...
没有必要的就不需要说,难不成我啥也不准备就来提问?你们是不知道,但是你们可以想,既然我来提问,肯定是准备了,而且后来我已经告诉你了我已经写了。
还真没在哪里看到你说在主类写这句了
我已经明确告诉你了,我已经写了。
没写这句也会返回false 还有其他问题吗?
这么多问题你是看不见吗?
我的语气为啥是这样的你自己不清楚吗?!
冒泡泡。。。
 本帖最后由 南柯郡守 于 2021-8-17 18:30 编辑 
哄堂大孝了
你是说因为我语气不好所以你才这个态度?你是没看顺序?
难不成你的论坛帖子是乱序排的回复?
是不知道啊 所以有可能的就会说一下啊
你又不是我孩子 我哪儿能对你知根知底 孝死了
别的不说 就你这个标题的态度你觉得是问问题的态度?
白色的小熊 发表于 2021-8-17 13:54
没有必要的就不需要说,难不成我啥也不准备就来提问?你们是不知道,但是你们可以想,既然我来提问,肯定 ...
哄堂大孝了
你是说因为我语气不好所以你才这个态度?你是没看顺序?
难不成你的论坛帖子是乱序排的回复?
你们是不知道,但是你们可以想
是不知道啊 所以有可能的就会说一下啊
你又不是我孩子 我哪儿能对你知根知底 孝死了
第三,我是抱着问问题的态度和你说话,请注意言辞
为什么我自己设置的命令,明明输对了还是给我return false
别的不说 就你这个标题的态度你觉得是问问题的态度?