插件入口与生命周期
TalexSoulTech 是 JavaPlugin 入口并保存静态实例。onEnable 保存默认配置、初始化 BaseTalex、注册 Listeners、BlockListener、UIListener 与命令,然后为在线玩家创建 PlayerData。onDisable 先关闭界面和电网,再保存机器、物品、方块和玩家数据,最后关闭 MySQL 连接。
组件
- TalexSoulTech
- BaseTalex
- MysqlManager
- ElectricityManager
执行面与控制面分层
插件运行时负责 Paper 服内规则与本地数据;Cloudflare SaaS 负责身份、归属、配对、顺序化快照和受能力约束的扩展控制面。
启用 JavaScript 后可用页签切换;禁用 JavaScript 时两套架构都保持完整可读。
下面的拆解仅描述当前 Java 源码已经体现的职责与调用关系。它不把未来机器、未实现学科或云端路线反写成本地插件事实。
TalexSoulTech 是 JavaPlugin 入口并保存静态实例。onEnable 保存默认配置、初始化 BaseTalex、注册 Listeners、BlockListener、UIListener 与命令,然后为在线玩家创建 PlayerData。onDisable 先关闭界面和电网,再保存机器、物品、方块和玩家数据,最后关闭 MySQL 连接。
Listeners 负责进入、离开、手持、交互等玩家事件;BlockListener 负责自定义方块放置与破坏;MachineManager 在通过保护检查后用每台机器的 MachineChecker 决定是否打开机器 UI。
InventoryUI 管理分页 Inventory2D 与 Holder;UIListener 只接管该 Holder 的点击和关闭事件,并按玩家节流。MenuBasic 将 Setup、按玩家 Setup、打开、重开与销毁包装成通用菜单生命周期。
电网只在服务端主线程结算。它把位置化端点和线缆重建为连通网络,以源、路径和目标的预算进行能量转移,并把周期统计保留给观测与排错。
物品、分类、机器、已放置方块和玩家状态各有自己的领域对象;MySQL 与 YAML 缓存承担不同层次的正常停服持久化职责。
Listeners.onJoin 异步构造 PlayerData;onLeave 查找该玩家数据并调用 leave,触发状态写回。
Listeners.onInteract 取 PlayerData,先调用 ProtectorManager,再交给 MachineManager。随后才处理 MachineItem 放置逻辑、guide 标签和 st_items NBT 标签分发。
Listeners.onItemHold 先验证 TalexItem,再用 SoulTechItem 的物品验证将事件交给匹配的扩展物品。
BlockListener.onBlockPlaced 过滤原版不适合作为自定义方块的材料,验证 TalexItem 与 soul_tech_item_id;未被物品自行处理时创建 TalexBlock。
BlockListener.onBlockBreak 先走保护检查,再让自定义工具处理;若目标是 BlockManager 中的 TalexBlock,则交给其受控破坏逻辑。
MachineManager 保存以机器名称为键的 BaseMachine。onEvent 依次调用 MachineChecker,首个通过者关闭当前界面并打开机器,随后立即返回。
一期云端负责服主身份、服务器归属、一次性配对、顺序化快照同步,以及受能力权限约束的 Cordis 风格扩展运行时。Paper 插件仍是游戏规则与本地数据的执行者;云端不接管玩家背包、机器判定或实时电网结算。
服主使用用户名和密码注册或登录。密码使用 PBKDF2;会话放在 HttpOnly、Secure、SameSite=Lax Cookie 中,浏览器脚本不读取会话令牌。
DB 绑定指向 D1,其中 users、sessions、servers、server_api_keys、pairing_codes、server_snapshots、server_events 是一期的基础持久化表;扩展控制记录与审计同样按租户和服务器范围持久化。外键与索引服务于用户归属、服务器查询和按服务器写入。
明文 API Key 只在配对成功响应中返回给插件一次;D1 仅保存 SHA-256 哈希。控制台、日志、状态接口和插件命令不回显它。
SYNC_COORDINATOR Durable Object 绑定为每个 serverId 提供串行化入口。同步的 sequence 判定、快照写入和事件记录在同一服务器顺序内完成,避免同服并发请求抢写最后状态。
每个扩展实例获得独立 Context、自己的依赖视图、已授权能力与 disposer 栈。Lua 与 JavaScript 都运行在受限沙箱中,不继承 Worker 全局绑定、其他扩展状态或跨服务器租户的数据访问权。
插件配置 cloud.enabled 默认 false。完成 /tst cloud link 配对码 后才保存 serverId、apiBase 和 API Key,并以 Bearer 认证提交状态快照。
返回 Worker 健康状态;它不泄露会话、服务器密钥或租户快照。
创建用户名与 PBKDF2 密码凭据,并建立受保护会话。
校验用户名和密码后建立受保护会话。
撤销当前会话并清除会话 Cookie。
返回当前已登录服主的身份信息。
读取当前服主的服务器列表,或在当前服主名下创建服务器。
在 current user_id 与 owner 边界通过后读取单台服务器。
为当前服主拥有的服务器生成一次性、十分钟有效的配对码。
在所有权校验通过后读取该服务器的最近快照。
未登录插件提交 {code,name,softwareVersion};有效且未使用的码成功后返回 {serverId,apiKey,apiBase}。
插件用 Authorization: Bearer API Key 提交 {serverId,sequence,sentAt,server,players,systems,catalog};成功响应为 {accepted,sequence,serverTime}。
扩展不是能随意读取 Worker 绑定的脚本片段,而是由云端控制面创建、在服务器租户 Context 中运行、受依赖图与能力权限约束的生命周期单元。
每个已启动扩展拥有独立 Context:其中保存扩展标识、所属服务器与租户、解析后的依赖、已获授权的能力、运行状态和专属 disposer 栈。扩展之间不共享可变全局状态,Context 是资源与授权的唯一宿主。
控制面将扩展清单中的依赖构成有向图,在启动或更新前检查缺失依赖、循环依赖和版本约束。只有依赖全部处于可用状态时,目标扩展才可启动。
Context 使用后进先出释放策略。资源通常有依赖建立顺序:最后登记的订阅、任务或桥接句柄最先释放,先登记的底层资源最后关闭。
更新从候选包与候选配置开始,而不是原地改写正在运行的实例。控制面先校验清单、依赖图、授权能力和沙箱装载,再在独立候选 Context 中启动。
热更新成功才改变活动版本;失败是可审计事件,不是要求服主手工猜测旧包内容的状态。
每个 JavaScript 扩展在独立受限执行域中运行,只通过宿主桥接得到 Context 和已授权能力;它不能直接枚举 Worker 环境变量、D1 绑定、Durable Object 绑定或其他扩展的内存。
每个 Lua 扩展运行在独立受限状态中,宿主只注入与 Context 能力对应的接口;无权访问的主机函数、跨租户状态和未声明的网络或持久化资源不可见。
扩展清单声明所需能力,控制面在安装、更新与启动前核对授权。运行时把被批准的能力作为窄句柄注入 Context;没有得到句柄的操作默认拒绝。
已登录服主只能在自己拥有的服务器范围内创建、编辑、安装、更新、启用、禁用、启动、停止和删除扩展。控制面负责状态机与资源清理,不把这些操作下放给浏览器本地状态。
每次控制面动作都会记录发起用户、所属租户与服务器、扩展标识、动作、结果、时间、关联版本和失败原因摘要。敏感配置、API Key 和沙箱源代码不写入可见审计字段。
在现有快照与事件基础上增加趋势图、异常阈值和可下载的运营报表。
研究密钥轮换、快照保留策略和细粒度服主成员权限,但不改变当前 owner 边界。
让目录与版本元数据获得审核发布流程,但不允许云端未经审计地下发游戏规则。