适用源码:
9da0beb8e8fdad85f50d7039408c3d98494e91c7。本文记录源码行为,默认配置不等于实服配置。
设计状态:按现状编写,具体业务批准记录未逐项核定;开发状态:下述能力有实现证据,限制单列;验证状态:完成定向源码核对,未执行自动测试或实服验收。
入口链
FacilityCommand.onCommand 按参数分派,总菜单→ConstructionMenuService,open→FacilityOpener。创建菜单回调→FacilityManager→FacilityPlacementService.createFromMenu;当前结果是发放摆放道具,落地时再进入 placeFromItem,而非菜单当场创建。
放置时按 FacilityType 分流城镇中心与标准设施,检查原城镇、占地、结构、费用和区块唯一身份;失败路径可能回退本次占地/结构,不能泛化为外部经济全局事务。
领域与状态
Facility 为抽象基类,FacilityState 是不含 UI/任务的不可变快照;FacilityRuntime 提供仓储、结构、Towny、钱包及生命周期服务。类型声明包括 MINE、TOWN_CENTER、BANK、EXCHANGE、PORT(业务为驿站)、BLACKSMITH。
运行状态 PLACING、ACTIVE、PAUSED、DISABLED、DISMANTLING、REMOVED;冲突状态 PEACEFUL、CONTESTED、UNDER_SIEGE、CAPTURED、OCCUPIED。二者独立,枚举存在不证明围城、占领玩法完成。升级接口和拆除接口按类型实现,不能仅按按钮显示判断所有类型支持。
矿场生产链
FacilityProductionService 扫描活跃设施,以 inFlight 防止同设施并行受理;MineFacility 计算 roll,投放账本领取后异步加载区块并切到 region,FacilityDeliveryService 再核对和入库。空 roll 推进游标;超过累计上限不反复补回。
库存入库及生产游标的一致性必须看对应仓储事务,不通过重设 lastProductionAt 重发。加载超时等失败有重试/释放分支,不能把所有异常合并成“已发放”。
UI 与来源冲突
当前 FacilityMenuService 为非城镇中心提供物资分页,每行两种、每页8种;库存图标及数字均映射材质。FacilityMenuListener 对普通物资存取使用 canOpen,账户 WITHDRAW 则走 canManage。
旧指南的即时创建、无分页和通用取出管理权限表述与此不同。这里记录执行事实,业务批准仍需维护者核对;不擅自修改旧页。
事件与扩展
生命周期转换与状态变更事件是设施扩展点;修改时区分可取消前置与事后审计,不把 UI 按钮当安全边界。具体结构放置/回滚在设施结构层,外部插件访问经 TownyGateway。新增类型还需配置、mapper、定义注册和装配,不只加枚举。
来源
代码根 folia_plugin/src/main/java/com/flrv/:event/command/FacilityCommand.java、logic/facility/service/FacilityPlacementService.java、FacilityProductionService.java、FacilityUpgradeService.java(同 service)、logic/facility/core/FacilityState.java、MineFacility.java、FacilityType.java(同 core)、ui/facility/FacilityMenuService.java、event/inventory/FacilityMenuListener.java。配置 folia_plugin/src/main/resources/config.yml。
相关:玩家设施指南、架构。