You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GeyserMC API检测表单按钮点击时遇类型转换错误

解决GeyserMC SimpleForm响应类型转换错误

错误原因

  1. 你创建的是SimpleForm,它的响应只会是SimpleFormResponse或者null(玩家关闭表单),代码中多余的CustomFormResponse类型判断完全没必要,反而可能引发类型混淆。
  2. 错误提示的核心是类型转换异常,当玩家未点击按钮直接关闭表单时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:52:15