Easy4Form API 文档 v2
⚠️ 不推荐使用 / NOT RECOMMENDED
中文: 虽然此 API v2 基于新版 Cumulus 接口且正在积极维护,但不推荐直接使用。请考虑:
- 推荐: 使用主代理包,它会自动处理兼容性并提供最佳体验
- 备选: 仅在特别需要新接口功能时才直接使用此 v2 包
English: While this API v2 is based on the new Cumulus interface and is actively maintained, it is not recommended for direct use. Please consider:
- Recommended: Use the main proxy package which automatically handles compatibility and provides the best experience
- Alternative: Use this v2 package directly only if you specifically need the new interface features
返回: 主文档
Easy4Form v2 是基于新版 Cumulus 接口的现代化 Form API,为基岩版玩家创建表单提供了增强的功能和更好的性能。
目录
简介
Easy4Form v2 提供了一个更新的接口,通过新的 Cumulus API 为基岩版玩家创建和发送表单。它支持基岩版中可用的所有三种表单类型,并具有改进的性能和新功能:
- 简单表单:玩家可以点击的按钮列表
- 模态表单:带有两个按钮的对话框(是/否,确认/取消等)
- 自定义表单:带有各种输入元素的表单(文本框,开关,滑块,下拉菜单等)
v2 的主要改进
- 新版 Cumulus 接口:基于最新的 Cumulus API 构建,性能更佳
- 增强的响应处理:更灵活的响应处理,为不同场景提供单独的处理器
- 改进的错误处理:更好的错误管理和调试功能
- 现代 Java 特性:利用现代 Java 特性和 lambda 表达式
- 更好的类型安全:增强的类型安全和空值处理
玩家工具
检查玩家是否为基岩版玩家
方法签名:
public static boolean isBedrockPlayer(Player player)参数:
player(Player) - 要检查的Bukkit玩家对象
返回值:
boolean- 如果是基岩版玩家返回true,否则返回false
用法:
boolean isBedrockPlayer = Easy4FormAPI.isBedrockPlayer(player);示例:
import org.bukkit.entity.Player;
import cn.enderrealm.easy4form.api.v2.Easy4FormAPI;
public void onPlayerJoin(Player player) {
if (Easy4FormAPI.isBedrockPlayer(player)) {
player.sendMessage("欢迎,基岩版玩家!");
} else {
player.sendMessage("欢迎,Java版玩家!");
}
}获取 FloodgatePlayer 实例
方法签名:
public static FloodgatePlayer getFloodgatePlayer(Player player)参数:
player(Player) - 要获取FloodgatePlayer的Bukkit玩家对象
返回值:
FloodgatePlayer- FloodgatePlayer实例,如果不是基岩版玩家则返回null
用法:
FloodgatePlayer floodgatePlayer = Easy4FormAPI.getFloodgatePlayer(player);示例:
import org.bukkit.entity.Player;
import cn.enderrealm.easy4form.api.v2.Easy4FormAPI;
import org.geysermc.floodgate.api.player.FloodgatePlayer;
public void getPlayerInfo(Player player) {
FloodgatePlayer floodgatePlayer = Easy4FormAPI.getFloodgatePlayer(player);
if (floodgatePlayer != null) {
String deviceOs = floodgatePlayer.getDeviceOs().toString();
player.sendMessage("您正在使用:" + deviceOs);
}
}简单表单
简单表单由标题、内容和按钮列表组成。
使用 Easy4FormAPI
方法签名:
public static void sendSimpleForm(Player player, String title, String content, List<String> buttons, Consumer<Integer> responseHandler)参数:
player(Player) - 接收表单的Bukkit玩家title(String) - 表单标题content(String) - 表单内容/描述文本buttons(List<String>) - 按钮文本列表responseHandler(Consumer<Integer>) - 回调函数,接收按钮索引(从0开始)或表单关闭时为null
用法:
List<String> buttons = Arrays.asList("按钮 1", "按钮 2", "按钮 3");
Easy4FormAPI.sendSimpleForm(player, "标题", "内容", buttons, response -> {
if (response != null) {
player.sendMessage("您点击了按钮:" + buttons.get(response));
} else {
player.sendMessage("您关闭了表单");
}
});示例:服务器选择器
import org.bukkit.entity.Player;
import cn.enderrealm.easy4form.api.v2.Easy4FormAPI;
import java.util.Arrays;
import java.util.List;
public void showServerSelector(Player player) {
List<String> servers = Arrays.asList("生存", "创造", "小游戏", "空岛");
Easy4FormAPI.sendSimpleForm(
player,
"服务器选择器",
"选择要连接的服务器:",
servers,
response -> {
if (response != null) {
String server = servers.get(response);
player.sendMessage("正在连接到 " + server + "...");
// 连接玩家到选定服务器的代码
}
}
);
}使用 SimpleFormBuilder
可用方法:
title(String title)- 设置表单标题content(String content)- 设置表单内容/描述button(String text)- 添加无图片的按钮button(String text, String imagePath)- 添加带资源包图片的按钮buttonWithUrl(String text, String imageUrl)- 添加带URL图片的按钮validResultHandler(Consumer<Integer> handler)- 设置有效响应的处理器closedOrInvalidResultHandler(Runnable handler)- 设置关闭或无效表单的处理器send(Player player)- 向玩家发送表单
方法参数:
title(String) - 显示在表单顶部的标题文本content(String) - 显示在标题下方的描述文本text(String) - 按钮文本imagePath(String) - 资源包路径(例如:"textures/items/diamond")imageUrl(String) - 图片的网络URL(例如:"https://example.com/image.png")handler(Consumer<Integer>) - 接收按钮索引(从0开始)的回调handler(Runnable) - 关闭/无效表单的回调player(Player) - 接收表单的Bukkit玩家
用法:
new SimpleFormBuilder()
.title("标题")
.content("内容")
.button("按钮 1") // 无图片按钮
.button("按钮 2", "textures/items/diamond") // 带资源包图片的按钮
.buttonWithUrl("按钮 3", "https://example.com/image.png") // 带URL图片的按钮
.validResultHandler(response -> {
player.sendMessage("您点击了按钮:" + response);
})
.closedOrInvalidResultHandler(() -> {
player.sendMessage("表单被关闭或无效");
})
.send(player);示例:商店分类
import org.bukkit.entity.Player;
import cn.enderrealm.easy4form.api.v2.SimpleFormBuilder;
public void showShopCategories(Player player) {
new SimpleFormBuilder()
.title("商店")
.content("选择一个分类:")
.button("武器")
.button("盔甲")
.button("工具")
.button("食物")
.button("杂项")
.validResultHandler(response -> {
switch (response) {
case 0:
openWeaponsShop(player);
break;
case 1:
openArmorShop(player);
break;
case 2:
openToolsShop(player);
break;
case 3:
openFoodShop(player);
break;
case 4:
openMiscShop(player);
break;
}
})
.closedOrInvalidResultHandler(() -> {
// 处理表单关闭
})
.send(player);
}模态表单
模态表单由标题、内容和两个按钮组成(通常用于是/否或确认/取消场景)。
使用 Easy4FormAPI
方法签名:
public static void sendModalForm(Player player, String title, String content, String button1, String button2, Consumer<Boolean> responseHandler)参数:
player(Player) - 接收表单的Bukkit玩家title(String) - 表单标题content(String) - 表单内容/描述文本button1(String) - 第一个按钮的文本(通常是"是"、"确认"等)button2(String) - 第二个按钮的文本(通常是"否"、"取消"等)responseHandler(Consumer<Boolean>) - 回调函数,button1返回true,button2返回false,关闭表单返回null
用法:
Easy4FormAPI.sendModalForm(
player,
"确认",
"您确定要继续吗?",
"是",
"否",
response -> {
if (response != null) {
if (response) {
player.sendMessage("您确认了!");
} else {
player.sendMessage("您取消了!");
}
}
}
);示例:传送确认
import org.bukkit.entity.Player;
import cn.enderrealm.easy4form.api.v2.Easy4FormAPI;
public void confirmTeleport(Player player, Location destination) {
Easy4FormAPI.sendModalForm(
player,
"传送确认",
"您要传送到指定位置吗?",
"传送",
"取消",
response -> {
if (response != null && response) {
player.teleport(destination);
player.sendMessage("已传送!");
}
}
);
}使用 ModalFormBuilder
可用方法:
title(String title)- 设置表单标题content(String content)- 设置表单内容/描述button1(String text)- 设置第一个按钮的文本button2(String text)- 设置第二个按钮的文本validResultHandler(Consumer<Boolean> handler)- 设置有效响应的处理器closedOrInvalidResultHandler(Runnable handler)- 设置关闭或无效表单的处理器send(Player player)- 向玩家发送表单
方法参数:
title(String) - 显示在表单顶部的标题文本content(String) - 显示在标题下方的描述文本text(String) - 按钮文本handler(Consumer<Boolean>) - 接收button1为true,button2为false的回调handler(Runnable) - 关闭/无效表单的回调player(Player) - 接收表单的Bukkit玩家
用法:
new ModalFormBuilder()
.title("确认")
.content("您确定要继续吗?")
.button1("是")
.button2("否")
.validResultHandler(response -> {
if (response) {
player.sendMessage("您确认了!");
} else {
player.sendMessage("您取消了!");
}
})
.closedOrInvalidResultHandler(() -> {
player.sendMessage("表单被关闭");
})
.send(player);示例:删除家园确认
import org.bukkit.entity.Player;
import cn.enderrealm.easy4form.api.v2.ModalFormBuilder;
public void confirmDeleteHome(Player player, String homeName) {
new ModalFormBuilder()
.title("删除家园")
.content("您确定要删除家园 \"" + homeName + "\" 吗?")
.button1("删除")
.button2("取消")
.validResultHandler(response -> {
if (response) {
// 删除家园的代码
player.sendMessage("家园 \"" + homeName + "\" 已被删除。");
}
})
.closedOrInvalidResultHandler(() -> {
// 处理表单关闭
})
.send(player);
}自定义表单
自定义表单允许您创建带有各种输入元素的表单,如文本框、开关、滑块、下拉菜单等。
使用 CustomFormBuilder
可用方法:
title(String title)- 设置表单标题label(String id, String text)- 添加文本标签(仅显示)input(String id, String label, String placeholder, String defaultValue)- 添加文本输入框toggle(String id, String label, boolean defaultValue)- 添加开关(布尔值)slider(String id, String label, float min, float max, float step, float defaultValue)- 添加滑块dropdown(String id, String label, List<String> options, int defaultIndex)- 添加下拉菜单stepSlider(String id, String label, List<String> steps, int defaultIndex)- 添加步进滑块validResultHandler(Consumer<Map<String, Object>> handler)- 设置有效响应的处理器invalidResultHandler(Runnable handler)- 设置无效表单的处理器send(Player player)- 向玩家发送表单
元素参数:
id(String) - 元素的唯一标识符(在响应映射中使用)label(String) - 元素的显示文本text(String) - 标签的文本内容placeholder(String) - 输入框的占位符文本defaultValue(String/boolean/float) - 元素的默认值min/max(float) - 滑块的范围限制step(float) - 滑块的步进增量options/steps(List<String>) - 下拉菜单/步进滑块的可用选项defaultIndex(int) - 下拉菜单/步进滑块的默认选中索引
用法:
new CustomFormBuilder()
.title("设置")
.label("info", "请在下方配置您的设置:")
.input("name", "姓名", "输入您的姓名", player.getName())
.toggle("notifications", "启用通知", true)
.slider("volume", "音量", 0, 100, 10, 50)
.dropdown("difficulty", "难度", Arrays.asList("简单", "普通", "困难"), 1)
.validResultHandler(response -> {
String name = (String) response.get("name");
boolean notifications = (boolean) response.get("notifications");
int volume = ((Float) response.get("volume")).intValue();
String difficulty = (String) response.get("difficulty");
player.sendMessage("姓名:" + name);
player.sendMessage("通知:" + notifications);
player.sendMessage("音量:" + volume);
player.sendMessage("难度:" + difficulty);
})
.invalidResultHandler(() -> {
player.sendMessage("表单被关闭或无效");
})
.send(player);示例:玩家资料表单
import org.bukkit.entity.Player;
import cn.enderrealm.easy4form.api.v2.CustomFormBuilder;
import java.util.Arrays;
import java.util.List;
public void showProfileForm(Player player) {
List<String> genders = Arrays.asList("男性", "女性", "其他", "不愿透露");
List<String> ageRanges = Arrays.asList("18岁以下", "18-24", "25-34", "35-44", "45+", "不愿透露");
new CustomFormBuilder()
.title("玩家资料")
.label("header", "请填写您的资料信息:")
.input("nickname", "昵称", "输入您的首选昵称", player.getName())
.input("bio", "个人简介", "介绍一下您自己", "")
.toggle("showProfile", "向其他玩家显示我的资料", true)
.dropdown("gender", "性别", genders, 0)
.dropdown("ageRange", "年龄段", ageRanges, 0)
.validResultHandler(response -> {
// 保存资料信息
String nickname = (String) response.get("nickname");
String bio = (String) response.get("bio");
boolean showProfile = (boolean) response.get("showProfile");
String gender = genders.get(((Float) response.get("gender")).intValue());
String ageRange = ageRanges.get(((Float) response.get("ageRange")).intValue());
// 保存资料信息的代码
player.sendMessage("资料更新成功!");
})
.invalidResultHandler(() -> {
// 处理表单关闭或无效输入
})
.send(player);
}示例:服务器反馈表单
import org.bukkit.entity.Player;
import cn.enderrealm.easy4form.api.v2.CustomFormBuilder;
import java.util.Arrays;
import java.util.List;
public void showFeedbackForm(Player player) {
List<String> ratings = Arrays.asList("差", "一般", "好", "很好", "优秀");
List<String> aspects = Arrays.asList("游戏玩法", "社区", "管理员", "活动", "性能");
new CustomFormBuilder()
.title("服务器反馈")
.label("intro", "我们重视您的反馈!请告诉我们您的想法。")
.dropdown("overall", "整体体验", ratings, 2)
.stepSlider("favorite", "最喜欢的方面", aspects, 0)
.input("suggestions", "建议", "在此输入您的建议", "")
.toggle("contact", "我们可以联系您获取更多反馈吗?", false)
.validResultHandler(response -> {
String overallRating = ratings.get(((Float) response.get("overall")).intValue());
String favoriteAspect = aspects.get(((Float) response.get("favorite")).intValue());
String suggestions = (String) response.get("suggestions");
boolean canContact = (boolean) response.get("contact");
// 保存反馈的代码
player.sendMessage("感谢您的反馈!");
// 通知管理员新反馈
for (Player admin : getAdminPlayers()) {
admin.sendMessage("来自 " + player.getName() + " 的新反馈:");
admin.sendMessage("整体:" + overallRating);
admin.sendMessage("最喜欢:" + favoriteAspect);
admin.sendMessage("建议:" + suggestions);
}
})
.invalidResultHandler(() -> {
// 处理表单关闭
})
.send(player);
}
private List<Player> getAdminPlayers() {
// 获取在线管理员玩家的代码
return new ArrayList<>();
}从 v1 迁移
主要变化
响应处理:v2 为不同的响应类型使用单独的处理器:
validResultHandler()- 用于有效的表单响应closedOrInvalidResultHandler()/invalidResultHandler()- 用于关闭或无效的表单
自定义表单响应访问:v2 使用新的 Cumulus 迭代器模式:
- v1:
response.responses().get(index) - v2:
response.valueAt(index)配合response.reset()
- v1:
Lambda 表达式:v2 使用更简洁的 lambda 表达式以获得更好的性能
包结构:从
cn.enderrealm.easy4form.api.v2导入而不是v1
迁移示例
v1 代码:
new SimpleFormBuilder()
.title("测试")
.button("按钮 1")
.responseHandler(response -> {
if (response != null) {
player.sendMessage("点击了:" + response);
} else {
player.sendMessage("关闭了");
}
})
.send(player);v2 代码:
new SimpleFormBuilder()
.title("测试")
.button("按钮 1")
.validResultHandler(response -> {
player.sendMessage("点击了:" + response);
})
.closedOrInvalidResultHandler(() -> {
player.sendMessage("关闭了");
})
.send(player);附加说明
- 所有表单构建器都使用流式接口,允许方法链式调用以获得更清洁的代码。
- 响应处理器是异步调用的,因此在与 Bukkit API 交互时要小心。
- v2 相比 v1 提供了更好的错误处理和调试功能。
- 新的响应处理系统允许对不同表单状态进行更精确的控制。
- Lambda 表达式在 v2 中进行了优化以获得更好的性能。