跳转至

Allay API概览

本文列出Allay官方出现的主要插件API主题、常用配置字段和能力边界。Allay是第三方自实现服务端,以下内容均为Allay项目公开或讨论的接口,不是BDS原生能力。

版本提示

Allay的服务端版本、API版本和Minecraft基岩版协议版本相互关联。具体接口签名、类名和可用性会随版本变化,使用前应先核对当前发行版、Javadoc和运行时行为。

插件描述文件

Allay插件通常使用plugin.json描述元数据。

字段 类型 必要性 说明
name 字符串 必要 插件名称。
entrance 字符串 必要 插件入口类的全限定名。
authors 字符串数组 建议 插件作者列表。
version 字符串 必要 插件版本,必须是合法语义化版本。
description 字符串 可选 插件描述。
website 字符串 可选 插件网站。
dependencies 对象数组 可选 依赖插件名称、版本字符串和是否可选。

当前公开的plugin_descriptor_json_scheme.json只列出了这些字段;dependencies中的条目包含nameoptionalversion三个键。

生命周期

方法 阶段 注意事项
onLoad() 插件被加载,服务器尚未完全启动。 不应注册监听器、命令和调度任务,也不应访问世界。
onEnable() 插件被启用。 适合注册命令、事件监听器和任务。
onDisable() 插件被禁用。 适合保存配置、释放资源和清理状态。
reload() 插件显式重载。 JAR插件默认不可热重载;只有确认安全时才应实现。

插件系统组成

类型 作用
PluginSource 提供本地或远程插件路径。
PluginLoaderPluginLoaderFactory 判断插件文件是否可加载,并创建对应加载器实例。
PluginDescriptor 保存插件名称、入口、版本、依赖等描述信息。
PluginManager 管理插件发现、依赖检查、加载、启用和禁用。
PluginContainer 保存运行中的插件主体、描述符、加载器和数据目录。
Plugin 插件逻辑主体。

加载流程中,Allay会先遍历插件源,再为每个插件文件选择加载器、读取描述符并检查循环依赖,最后调用onLoad()。因此,不应把游戏内初始化写进onLoad(),否则即使表面上“能运行”,也会让插件生命周期变得脆弱且难以重载。

热重载

情况 说明
Plugin.isReloadable()返回false 默认状态,JAR插件不参与热重载。
仅返回true但未实现reload() 控制台会给出警告;这不表示插件已经真正支持热重载。
JAR插件调用reload() 只会执行插件自身的重载逻辑,不会自动重新从JAR文件读取新代码。

命令树

Allay命令通过继承Command并在prepareCommandTree(CommandTree tree)中构造命令树。命令节点可以执行回调、添加参数、限制发送者类型、设置节点权限和返回错误。

内置参数类型

方法 结果类型 说明
str(name) String 单个词。
msg(name) String 消息文本,可包含空格并消耗剩余参数。
intNum(name) Integer 整数。
floatNum(name) Float 浮点数。
doubleNum(name) Double 双精度浮点数。
longNum(name) Long 长整数。
shortNum(name) Short 短整数。
bool(name) Boolean 布尔值。
enums(name, values...) String 字符串枚举。
enumsIgnoreCase(name, values...) String 忽略大小写的字符串枚举。
enumClass(name, EnumClass.class) 枚举类 Java枚举类。
target(name) 实体列表 实体目标选择器。
playerTarget(name) 实体列表 玩家目标选择器。
wildcardTarget(name) String 通配目标。
pos(name) Vector3d 位置参数,支持相对坐标。
gameMode(name) GameMode 游戏模式。
difficulty(name) Difficulty 难度。
effect(name) EffectType 状态效果类型。
enchantment(name) EnchantmentType 魔咒类型。
itemType(name) ItemType<?> 物品类型。
blockType(name) BlockType<?> 方块类型。
blockPropertyValues(name) List<BlockPropertyValue> 方块属性值列表。
entityType(name) EntityType<?> 实体类型。
remain(name) List<String> 剩余参数。
key(name) String 字面量子命令。
cmd(name) String 命令字符串。

发送者类型

类型 说明
SenderType.ANY 任意发送者。
SenderType.PLAYER 玩家。
SenderType.ACTUAL_PLAYER 真实玩家,不含假玩家。
SenderType.ENTITY 实体。
SenderType.SERVER 服务器控制台。

错误输出

方法 说明
addNoTargetMatchError() 没有实体匹配目标选择器。
addTooManyTargetsError() 匹配实体过多。
addPlayerNotFoundError() 未找到玩家。
addSyntaxError() 当前参数处存在语法错误。
addInvalidExecutorError(SenderType) 命令发送者类型错误。
addError(message, args...) 添加自定义错误消息。
addOutput(message, args...) 添加普通输出消息。

权限

Allay权限节点使用点号表示树状关系,例如allay.command.say。权限值使用Tristate表示。

说明
TRUE 显式允许。
FALSE 显式拒绝。
UNDEFINED 未显式设置,通常按拒绝处理。

实现Permissible的对象可以执行权限检查。Allay默认玩家权限计算器会让操作员拥有全部权限,让非操作员只拥有有限权限。插件也可以替换PermissionCalculator实现自定义权限系统。

事件

事件监听方法使用@EventHandler标注,并且应只有一个事件类型参数和void返回值。监听器需要注册到事件总线。

Allay存在服务器实例事件总线和世界事件总线。世界相关事件应注册到对应世界的事件总线;非世界事件由服务器实例事件总线处理。

调度器

调度器 线程或作用域 适用场景
服务器调度器 服务器线程 全局、非世界状态任务。
世界调度器 对应世界线程 世界级状态,例如时间、天气和世界数据。
维度调度器 维度线程或并行计算线程池 维度中的方块、粒子和实体更新。
实体调度器 实体当前维度线程 与单个实体生命周期绑定的任务。

Allay重复任务以刻为间隔。教程示例中,任务回调返回true表示继续运行,返回false表示停止。

方块API

概念 说明
BlockType 方块种类,拥有状态集合、属性集合、默认状态和行为。
BlockState 某一方块种类的具体不可变状态。方块状态通常可以按单例使用==比较。
Block 维度中某一位置和层的方块状态包装对象。
BlockPropertyType 方块属性定义。
BlockBehavior 方块逻辑,例如掉落、交互和刻处理。
BlockTypes 原版方块类型的静态引用集合。

Allay维度API可读写指定坐标和层的方块状态。基岩版同一位置可有多层方块,教程中将第0层作为主方块层,将第1层作为液体或含水层。

物品API

概念 说明
ItemStack 可持有、存储或掉落的物品实例,包含数量、损坏值、自定义名称、描述和魔咒等数据。
ItemType 物品种类,可创建物品栈并关联ItemData
ItemTypes 原版物品类型的静态引用集合。
ItemData 最大堆叠数、耐久、攻击伤害、护甲值和附魔能力等元数据。
ItemTag 物品分类标签,例如工具、剑、食物和品质标签。

Allay物品栈是可变对象。修改共享物品栈前应先复制。

方块类型和物品类型之间存在对应关系,但并非所有方块物品都与方块标识符一一同名。处理方块转物品时,应以实际注册结果为准。

容器API

类型 大小 说明
INVENTORY 36 玩家物品栏。
ARMOR 4 玩家盔甲槽。
OFFHAND 1 副手槽。
CHEST 27 单箱子。
DOUBLE_CHEST 54 大箱子。
BARREL 27 木桶。
SHULKER_BOX 27 潜影盒。
ENDER_CHEST 27 末影箱。
FURNACE 3 熔炉。
BREWING_STAND 5 酿造台。
ANVIL 3 铁砧。
CRAFTING_TABLE 9 工作台。
FAKE_CHEST 27 伪箱子容器。
FAKE_DOUBLE_CHEST 54 伪大箱子容器。

伪容器用于创建自定义GUI。通常应使用addPlayer()显示给玩家,因为该方法会在打开容器前处理客户端所需的伪方块。

容器还支持打开、关闭和槽位变化监听,适合商店、菜单和状态同步界面。

表单API

类型 说明
简单表单 显示文本和多个按钮,适合菜单。
模态表单 显示两个按钮,适合确认或二选一。
自定义表单 支持输入框、下拉菜单、开关、滑块、步进滑块、标签、标题和分隔线。

自定义表单响应按元素添加顺序返回。标签、标题和分隔线不产生响应,但仍会影响编者对索引的理解,处理回调时应显式记录可响应元素顺序。

Boss栏API

属性 类型 默认值 说明
title 字符串 "" Boss栏文本。
progress float 1.0 进度,范围为0至1。
color BossBarColor PINK 颜色。
style BossBarStyle SOLID 分段样式。
darkenSky 布尔值 false 是否加深天空。

颜色包括PINKBLUEREDGREENYELLOWPURPLEREBECCA_PURPLEWHITE。样式包括SOLIDSEGMENTED_6SEGMENTED_10SEGMENTED_12SEGMENTED_20

Boss栏对象在修改属性后会自动把更新同步给当前查看者,但不会替插件自动清理查看者列表。

记分板API

Allay记分板可以设置行内容并添加或移除查看者。显示槽位包括:

槽位 说明
SIDEBAR 屏幕右侧,常用于动态信息。
LIST 在线玩家列表。
BELOW_NAME 玩家名称标签下方。

示例提醒,玩家离开后应显式调用removeViewer(...)Scoreboard#setLines(...)会自动把新内容重发给现有查看者。

配置API

格式 扩展名 说明
YAML .yml.yaml 推荐用于复杂配置,支持嵌套结构和注释。
JSON .json.js 适合与其他系统交换数据。
Properties .properties.cnf 简单键值对。
Enum .txt.list.enum 每行一个值。

Config支持按点号访问嵌套键、读取列表、读取配置节、保存、重载、删除键和类型检查。

国际化

Allay国际化系统使用翻译键。插件语言文件位于JAR内的assets/lang/目录,文件名形如en_US.jsonzh_CN.json。翻译键建议使用插件命名空间,例如myplugin:greeting.welcome

占位符 说明
%1%2%3 有序参数,推荐使用。
%s 无序字符串参数。
%d 无序数字参数。

常见入口包括I18n.get().tr(...)player.sendTranslatable(...)。当目标语言缺失某个翻译键时,系统会回退到en_US

持久化数据容器

持久化数据容器(Persistent Data Container),简称PDC,用于在Allay对象上保存插件自定义数据。常见持有者包括世界、实体、方块实体和物品栈。

类型 说明
ByteByte Array 字节和字节数组。
ShortIntegerInteger ArrayLongLong Array 整数类型。
FloatDouble 浮点类型。
String 字符串。
Boolean 布尔值。
PersistentDataContainer 嵌套容器。
List 由其他持久化数据类型包装的列表。

数据不会在不同持有者之间自动复制。例如,将一个物品栈放置为带方块实体的方块时,其PDC数据不会自动迁移到方块实体。

如果原生类型不够用,还可以自行实现PersistentDataType,把复杂对象映射成受支持的基础类型再存储。

自定义方块定义

高级自定义方块API使用CustomBlockDefinitionGenerator为每个BlockState生成客户端渲染定义。该API要求访问服务端模块,具有内部API风险。

工厂方法 说明
of(Function<BlockState, BlockStateDefinition>) 按方块状态返回不同定义。
ofConstant(BlockStateDefinition) 所有状态使用同一定义。
ofTexture(String) 使用单一纹理的简单方块。

BlockStateDefinition可包含几何体、材质、变换和显示名称。几何体可设置骨骼可见性、剔除规则、剔除图层和UV锁定。材质实例可设置渲染方法、面暗化、环境光遮蔽、随机UV旋转和纹理变种。

自定义物品定义

高级自定义物品API使用CustomItemDefinitionGenerator生成客户端物品定义。该API也要求访问服务端模块。

属性 类型 说明
texture 字符串 资源包中的物品纹理名,必需。
displayName 字符串 物品栏显示名。
renderOffsets RenderOffsets 手持时的位置、旋转和缩放。
foil 布尔值 是否总是显示附魔光泽。
canDestroyInCreative 布尔值 创造模式中是否可破坏方块。
allowOffHand 布尔值 是否可放入副手。较新Allay变更记录提示应改用ItemTags.ALLOW_OFFHAND
cooldown 整数 使用冷却秒数。
customProperties 映射 自定义NBT属性。
customComponents 映射 自定义基岩版组件。
renderOffsets.scale(...)renderOffsets.textureSize(...) 辅助方法 用于快速调整较大贴图或特殊手持缩放。

生成器会按物品组件自动识别盔甲、工具、食物和有耐久物品,并写入相应客户端属性。自定义物品仍需要资源包提供对应纹理。

调试形状

Allay还提供了按维度管理的绘图形状接口,可把简单几何体直接发送给客户端用于调试或可视化。

类型 说明
PrimitiveBox 盒体。
PrimitiveLine 线段。
PrimitiveArrow 箭头。
PrimitiveCircle 圆。
PrimitiveSphere 球。
PrimitiveText 文本标记。

形状通常通过Dimension#addPrimitiveShape(...)添加到维度中,再通过removePrimitiveShape(...)removeAllPrimitiveShapes()移除。玩家进入对应维度后会看到这些形状,离开维度时会自动失去可见性;也可以通过addViewer(...)removeViewer(...)只对指定玩家显示。