当前位置: 首页 > 知识库问答 >
问题:

无法从我的命令类minecraft插件(spigot)中识别hashset的事件

胡飞鹏
2023-03-14

所以我正在试验hashmap/set,我无法让我的事件类识别我的hashset的内容。切换命令有效(识别并发回玩家是否在集合中的正确结果),但是,当我投掷棒时,事件总是返回代码的其他部分(总是声明为假),而不是使用集合中的数据来检查玩家是否在那里。(代码将在下面)

是的,我的事件和命令都已注册

我所尝试的

更换球员。添加(p.getUniqueId());给球员们。添加(p.getName());反之亦然,多个if语句对哈希集的创建/检查方式进行随机小更改

代码:

切换命令*


import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.HashSet;
import java.util.UUID;

public class HashCommand implements CommandExecutor {
    HashSet<UUID> players = new HashSet<UUID>();

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if(!(sender instanceof Player)) {
            sender.sendMessage("Players Only");

        }else{
            Player p = (Player) sender;
            boolean check = players.contains(p.getUniqueId());
            if(!check){
                players.add(p.getUniqueId());
                p.sendMessage("Toggled On");

            }else{
                players.remove(p.getUniqueId());
                p.sendMessage("Toggled Off");
            }
        }
        return false;
    }
}

事件命令


import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

import org.bukkit.event.player.PlayerFishEvent;




public class Event implements Listener {
    public HashCommand hashCommand = new HashCommand();

    @EventHandler
    public void onCast(PlayerFishEvent e){
        Player p = e.getPlayer();
        if (hashCommand.players.contains(p.getUniqueId())) {
            p.sendMessage("Fish");
        }else{
            p.sendMessage("You do not have it enabled!");

        }

    }


}

共有1个答案

颜新
2023-03-14

在您的情况下,您不能使用面向对象的方式。每次触发命令时,Spigot都会创建一个HashCommand类的新实例。Spigot不使用您在事件侦听器中创建的实例:public HashCommand hashCommand=new HashCommand();。拥有多重实例意味着您有多重集合,每个集合都有自己的内容。因此,您从事件访问的集合与从命令访问的集合不同。事件集始终为空。

解决方案使设置为静态。每个实例的静态内容都是“相同的”。

public static Set<UUID> players = new HashSet<UUID>();

在事件类中,您可以通过类名访问它,如图所示:

HashCommand.players.contains(...)

不需要名为hashCommand的实例。

请注意,您可能需要添加玩家断开连接事件,以从您的游戏集中删除未联机的玩家。

 类似资料:
  • 为什么它不起作用?它阻塞每个命令。我希望它阻止除config中的命令外的所有命令

  • Hello Support我无法从组件中获取字符串。我用两种方法做到了这一点,但结果很糟糕。 其结果是铸造错误 和 结果是文字上的“聊天。方括号”,这很奇怪。 请帮忙。谢谢

  • 问题内容: 我通过清单中的“导出向导”导出了我的eclipse插件,似乎一切进行得很好(没有错误)。它在zip文件的插件目录中创建了一个.jar文件。 我以为将jar放入我的Eclipse插件目录中将进行安装(在重新启动eclipse之后),但这没有用。Eclipse看不到插件(透视图未显示) 我尝试使用“帮助”->“安装新软件”->“本地存档”,但始终显示“找不到软件” 您能帮我准备好将插件安装

  • 总的来说,我对tomcat和JSP很陌生,我还搜索了无数其他问题,这些问题似乎有完全相同的问题,但没有一个能解决我的问题。 服务器结构包含(以及其他内容,如css文件和其他html资源)一个jsp文件和一个java类: jsp文件包含: Java 类的源文件如下所示: 现在,我(重新)启动tomcat服务器,用浏览器访问jsp文件,并得到以下错误消息: 无法编译 JSP 的类:在生成的 java

  • 所以我正在编辑一个插件,是为我的世界龙头。 在反编译程序/调试器中,这就是“FlyCommand”显示的内容。在我下面上课。龙卷风915。蓬松的 https://pastebin.com/KB3jLX7S 下面是我的intellij项目中显示的同一个文件。 https://pastebin.com/kqX3DzTu 我想换个角色 我从intellij假设这是它需要编辑的地方。但是我不知道如何改变,