会话与存档
基本信息
| 属性 | 值 |
|---|---|
| 会话管理类 | com.sk89q.worldedit.session.SessionManager |
| 存储实现 | com.sk89q.worldedit.session.storage.JsonFileSessionStore |
| 存储目录 | <config>/worldedit/sessions/ |
| 目录创建点 | SessionManager.java:285(new File(config.getWorkingDirectory(), "sessions")) |
| 单文件路径 | <sessions>/<id>.json(JsonFileSessionStore.java:81) |
| 序列化格式 | JSON(Gson) |
| 备用实现 | VoidStore(同一包,空实现) |
存储后端的绑定时机
SessionManager 的 store 字段不是在构造时初始化的,而是在收到 ConfigurationLoadEvent 时赋值:
SessionManager.java:282-287
282 @Subscribe
283 public void onConfigurationLoad(ConfigurationLoadEvent event) {
284 LocalConfiguration config = event.getConfiguration();
285 File dir = new File(config.getWorkingDirectory(), "sessions");
286 store = new JsonFileSessionStore(dir);
287 }
因此 首次启动时(preInit 阶段尚无 ConfigurationLoadEvent)会话不会落盘;事件由 //we reload 投递(WorldEditCommands.java:77-84),此后才开始持久化。ForgeWorldEdit.serverAboutToStart 也会在注册 Platform 时间接触发配置加载。
存取内容
会话存储保存的是 LocalSession 的选区、选区器、掩码、历史指针等元数据,不含剪贴板——剪贴板字段在 LocalSession.java:72 声明为 transient ClipboardHolder,且 JsonFileSessionStore.java 全文 0 处引用 clipboard(grep -c clipboard 无命中)。因此重进服务器后 //paste 会提示剪贴板为空,需重新 //copy 或 //load。
会话标识
会话按玩家隔离,键由 SessionKey / getKey(owner) 决定;SessionManager 用 Map 保存 SessionHolder(内含 session 与 lastActive 时间戳,SessionManager.java:290+)。取会话的入口是 ForgeWorldEdit.getSession(EntityPlayerMP)(ForgeWorldEdit.java:312-317)。
生命周期
| 操作 | 入口 |
|---|---|
| 取出/创建会话 | SessionManager.get(SessionOwner) |
| 移除会话 | SessionManager.remove(SessionOwner)(:270-273) |
| 清空全部会话 | SessionManager.clear()(:278-280) |
| 服务端停止 | ForgeWorldEdit.serverStopping(ForgeWorldEdit.java:176-192)注销 Platform |
静默失败点
JsonFileSessionStore建目录失败时记log.log(Level.WARNING, "Failed to create directory '...' for sessions")(JsonFileSessionStore.java:63)——只写日志,不向玩家报错- 读配置文件时的
FileNotFoundException被ignored静默忽略(PropertiesConfiguration.java:67),首次启动读不到文件是预期行为
相关条目
- 编辑会话与历史 - 会话内的历史栈
- worldedit.properties 配置项 - 工作目录的来源
- 剪贴板与 schematic 格式 - 剪贴板为何不落盘