Spigot插件开发调用getView().getTitle()报方法无法解析如何解决
报错核心原因
getView()方法并不属于Inventory类,你之前记忆的调用链存在错误,直接在Inventory实例上调用该方法必然触发Cannot resolve method 'getView' in 'Inventory'报错。InventoryView是玩家打开容器界面时,服务端生成的绑定「玩家-容器-库存」关联关系的临时对象,静态放置的箱子方块本身不存在关联视图实例,无法直接从Chest方块状态对象获取InventoryView。你直接写InventoryView()属于将类名作为方法调用,因此会新增Cannot resolve method 'InventoryView' in 'Chest'报错。- 你选择的事件时机错误:
PlayerInteractEvent触发时玩家还未完成箱子打开动作,此时即便调用player.getOpenInventory()拿到的也是玩家此前打开的界面,和当前点击的箱子没有关联。
正确实现方案
你需要实现的是匹配标题为Test的箱子、拦截玩家打开操作,以下两种写法可直接运行:
方案1:直接从方块状态获取标题(推荐,适配1.14及以上主流版本)
1.14及以上版本中,Chest等容器方块状态类内置了getTitle()方法,不需要绕路获取库存或视图对象,直接在交互事件中判断即可,修正后代码如下:
@EventHandler public void onInteract(PlayerInteractEvent e) { Action action = e.getAction(); Player player = e.getPlayer(); Block clickedBlock = e.getClickedBlock(); if (action != Action.PHYSICAL && clickedBlock != null && clickedBlock.getType() == Material.CHEST) { Chest chestState = (Chest) clickedBlock.getState(); if (chestState.getTitle().equalsIgnoreCase("Test")) { player.sendMessage("Event triggered"); e.setCancelled(true); } } }
注意:原代码中hand.getType();是无意义的无效代码,没有做任何判断或赋值,直接删除即可。
方案2:监听库存打开事件获取视图(全版本适配,适合需要操作InventoryView的场景)
如果你确实需要使用InventoryView对象,不要在玩家交互事件中获取,改为监听InventoryOpenEvent。该事件触发时玩家已经完成容器打开动作,可直接从事件对象获取合法的InventoryView实例,代码如下:
@EventHandler public void onInventoryOpen(InventoryOpenEvent e) { // 仅过滤箱子类型的库存界面 if (e.getInventory().getType() != InventoryType.CHEST) { return; } if (e.getView().getTitle().equalsIgnoreCase("Test")) { e.getPlayer().sendMessage("Event triggered"); e.setCancelled(true); } }
内容的提问来源于stack exchange,提问作者Kelvin Hollander
相关产品推荐
相关产品推荐

