Perchable
让生物能被"挂"在另一具身体上(肩挂灵宠那一类)的契约。实现它就是全部——座位点、记录、容量与所有受理检查都在框架侧(PerchService),附属只需要交出自己的生物与它的答案,不需要为自己造一个座位。
| 成员 | 说明 |
|---|---|
Optional<Vec3> perchOffset(Entity vehicle, List<Vec3> claimed) | 我想坐在那具身体的哪里;返回空=拒绝这具载具(框架什么都不写,回一个拒绝结果)。 |
void onPerched(Entity vehicle) | 记录写下之后的时刻通知,默认什么都不做。 |
void onPerchReleased(Entity vehicle) | 记录被清、乘客关系也结束之后的时刻通知,默认什么都不做。 |
坐标在载具自己的坐标系里:x 是载具的左侧、z 是车头方向、y 从载具当前顶部往下量——所以潜行或换姿势时挂着的生物自动跟着走,两边都不必知道姿势。偏移会按平台交给座位钩子的 scale 等比缩放,与 AbstractHorse / Camel 那些原版座位同口径。
claimed 是已经在同一具载具上就座的其他乘客声明过的偏移,所以有多种座位可给的生物可以自己挑一个空的(都满了就拒绝,也是合法答案)。框架算好传进来,不另开公开查询。
两个钩子是时刻,不是状态:onPerched 只在"从没挂到挂上"时调(同一具载具上换个座位不算第二次就座);onPerchReleased 在记录清掉且骑乘结束后调——自己下来的、被服务器策略放下的、被判定为失效的都走它。载具已经消失的那一种没有载具可传,钩子不触发;要精确判断状态就问 PerchService.perchOffset(生物),记录才是唯一真相。
框架不为它提供实体:生物是附属的东西,基座只提供"挂"这件事本身与它要问的两个问题。查找点就是 PerchService——附属在自己的代码里(右键、驯服、任务完成……随便哪个时刻)调 PerchService.perch(生物, 载具),框架去问生物的 perchOffset;PerchService.release(生物) 是下来的唯一出口,PerchService.perchOffset(生物) 是只读查询。
数据包与脚本目前进不来:没有对应的行为、命令或脚本方法,那是玩法入口的决定,与这条契约分开。