会话与存档

基本信息

属性 值
会话管理类 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),首次启动读不到文件是预期行为

相关条目