使用GeyserMC API检测表单按钮点击时遇类型转换错误
解决GeyserMC SimpleForm响应类型转换错误
错误原因
- 你创建的是
SimpleForm,它的响应只会是SimpleFormResponse或者null(玩家关闭表单),代码中多余的CustomFormResponse类型判断完全没必要,反而可能引发类型混淆。 - 错误提示的核心是类型转换异常,当玩家未点击按钮直接关闭表单时,
responseData可能为null或空值,此时强制类型转换会触发错误。
修正后的代码
package org.centoricraft.centoriui23; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.java.JavaPlugin; import org.geysermc.cumulus.SimpleForm; import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.cumulus.response.SimpleFormResponse; public class CentoriUI23 extends JavaPlugin implements Listener { private FloodgateApi floodgateApi; @Override public void onEnable() { if (getServer().getPluginManager().getPlugin("Floodgate") != null) { floodgateApi = FloodgateApi.getInstance(); getServer().getPluginManager().registerEvents(this, this); } else { getLogger().warning("Floodgate plugin not found! Disabling plugin..."); getServer().getPluginManager().disablePlugin(this); } } @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); if (floodgateApi.isFloodgatePlayer(player.getUniqueId())) { Bukkit.getScheduler().runTaskLater(this, () -> { FloodgatePlayer floodgatePlayer = floodgateApi.getPlayer(player.getUniqueId()); if (floodgatePlayer != null) { SimpleForm form = SimpleForm.builder() .title("Centori UI") .button("Play") .button("Discord") .build(); form.setResponseHandler((formPlayer, responseData) -> { // 先判断玩家是否关闭表单 if (responseData == null) { return; } // SimpleForm的响应必然是SimpleFormResponse,无需额外类型判断 SimpleFormResponse response = (SimpleFormResponse) responseData; int buttonId = response.getClickedButtonId(); if (buttonId == 0) { // 处理Play按钮点击 formPlayer.sendMessage("已进入游戏模式"); } else if (buttonId == 1) { // 处理Discord按钮点击 formPlayer.sendMessage("服务器Discord链接:https://discord.xxx"); } }); floodgatePlayer.sendForm(form); } }, 20L); // 延迟1秒(20刻) } } }
额外建议
- 确保你的Floodgate和Cumulus依赖版本匹配,版本不兼容也可能导致此类类型错误。
- 若使用新版Cumulus API,可改用Optional响应处理器,代码更简洁安全:
form.setResponseHandler((formPlayer, response) -> { response.ifPresent(r -> { int buttonId = r.getClickedButtonId(); if (buttonId == 0) { // 处理Play按钮 } else if (buttonId == 1) { // 处理Discord按钮 } }); });
内容的提问来源于stack exchange,提问作者Nopfp
相关产品推荐
相关产品推荐

