Minecraft Paper Kotlin插件:添加值后HashMap为何为空?
问题分析
你遇到的核心问题是:处理onInventoryClick事件的FishMatch实例,和调用play()方法的FishMatch实例不是同一个对象。这会导致两个实例各自持有独立的players HashMap,事件触发时访问的自然是空的那一份。
常见原因&解决方案
1. 重复创建FishMatch实例
如果调用play()时每次都新建FishMatch对象(比如写FishMatch(plugin).play(player)),同时又在其他地方注册了另一个FishMatch实例作为Listener,就会出现这种数据不互通的情况。
解决方法:使用单例实例
在插件主类中创建唯一的FishMatch实例,注册为Listener,所有调用play()的地方都复用这个实例:
// 插件主类 class MyPlugin : JavaPlugin() { lateinit var fishMatch: FishMatch override fun onEnable() { fishMatch = FishMatch(this) server.pluginManager.registerEvents(fishMatch, this) } } // 调用play的地方(比如命令处理器) fun someCommand(player: Player) { val plugin = player.plugin as MyPlugin plugin.fishMatch.play(player) }
2. 事件注册错误
如果FishMatch的Listener是在play()方法这类动态逻辑中注册的,可能会导致注册多个实例,或者注册的实例和调用play()的不是同一个。
解决方法:统一在插件主类注册Listener
确保只有一个FishMatch实例被注册为Listener,且这个实例就是你用来调用play()的那个。
3. 快速验证手段
在play()和onInventoryClick方法中分别打印实例的hashCode(),就能确认是否是同一个对象:
fun play(player: Player) { // ... Messages().log(plugin, "FishMatch实例哈希: ${this.hashCode()}") } @EventHandler fun onInventoryClick(event: InventoryClickEvent) { // ... Messages().log(plugin, "FishMatch实例哈希: ${this.hashCode()}") }
如果两个哈希值不同,就可以确定是多实例导致的问题。
内容的提问来源于stack exchange,提问作者SirArchibald
相关产品推荐
相关产品推荐

