OracleLoadstar/SCE-Universe_Java_Edition
项目概览

介绍

SCE-Universe_Java_Edition 项目是 SCE-Universe 项目的 Java 实现。它主要用于测试最新版本特性和探索未完成/未计划的更新。该项目强调模块化和可扩展性,通过 Modloader 系统允许开发者方便地扩展其功能。

概述

SCE-Universe_Java_Edition 是一个实验性的 Java 版本,旨在作为 SCE-Universe 的测试平台,用于验证新的设计理念和功能。与主分支的正式版本不同,此分支由组织成员维护,不代表官方发布。其核心特性包括:

  • Modloader 系统:一个强大的插件机制,允许用户和开发者通过模块(mod)扩展应用程序的功能。
  • 优化的日志系统:采用标准错误流输出日志,提高终端用户界面的体验。
  • 高度可定制的TUI:提供灵活的页面管理和丰富的UI工具,方便构建和交互文本用户界面。
  • 原生Java项目:不依赖第三方构建系统,仅使用原生Java编译,鼓励开发者以“胖包”形式打包mod,避免依赖冲突。

此文档将介绍项目的整体架构、关键组件及其交互方式,以及如何利用Modloader和页面系统进行开发。

架构

SCE-Universe_Java_Edition 的架构围绕核心应用、Modloader、页面管理和设置管理构建。Modloader作为核心扩展点,使得应用程序可以灵活地集成第三方功能模块。

加载图表中...

Source: Generated by AI

架构说明:

  • 核心应用程序:项目的启动点,负责初始化 Modloader、页面管理器和设置管理器。它协调这些核心组件的工作,提供基础的运行环境。
  • Modloader 管理器:负责发现、加载和管理所有已安装的模块(Mods)。它在应用启动时激活 Mods,并在运行时将事件或渲染任务传递给 Mods 处理。

    Source: src/cn/oraclestar/sce/system/modloader/modloader_main.java

  • 页面管理器 (router_core):负责处理应用程序的文本用户界面 (TUI) 页面。它管理页面注册、渲染逻辑以及用户输入。Mod 可以通过此管理器注册新页面或覆盖现有页面。

    Source: src/cn/oraclestar/sce/system/router/router_core.java

  • 设置管理器 (setManager_core):提供统一的接口来访问和修改应用程序的各种设置。它处理设置的加载、保存和类型转换,确保设置的持久化。

    Source: src/cn/oraclestar/sce/system/setManager/setManager_core.java

  • UI_core / TUI 渲染:这是所有TUI渲染操作的抽象层。页面管理器和Mod通过它来在终端上绘制文本、接收用户输入,并实现文本界面的交互逻辑。
  • Mods (modloader_main 实现):由开发者创建的独立功能模块。每个 Mod 都实现了 modloader_main 接口,并通过 @target 注解提供其元数据。Mod 可以与页面管理器、设置管理器和UI_core交互,以扩展或修改应用行为。

    Source: src/cn/oraclestar/sce/system/modloader/modloader_main.java Source: src/cn/oraclestar/sce/system/modloader/target.java

  • Mod 配置 (@target 注解):用于为 Mod 提供名称、作者、版本和描述等元数据,帮助 Modloader 识别和管理 Mods。
  • 用户输入/输出 (TUI):应用程序与用户进行交互的接口,包括在终端显示信息和接收用户键盘输入。
  • 设置文件 / 持久化:设置管理器负责将应用程序设置保存到文件系统,并在启动时重新加载,确保配置的持久性。

主要特性

Modloader 系统

Modloader 是 SCE-Universe_Java_Edition 的核心扩展机制。它允许用户通过将 Mod 文件放置在 plugins 文件夹下(前置 Mod 放置在 plugins/preload),来扩展或修改应用程序的功能。未来的版本更新也将以 Mod 的形式发布,这意味着核心架构将保持稳定。

用户指南:

  • 将 Mod 文件放置在 plugins 文件夹中。
  • 如果 Mod 是前置 Mod,请放置在 plugins/preload 文件夹中。
  • 启动时请使用提供的启动脚本。

开发者指南: 开发者可以制作 Mod 来扩展 SCE 的功能。一个 Mod 需要继承 cn.oraclestar.sce.system.modloader.modloader_main 接口,并实现 onEnableonDisableinnerToPageinnerHandle 方法。同时,Mod 的主类需要通过 @target 注解提供元数据,如 modid作者版本描述

Modloader 示例

以下是一个 Mod 主类的基本结构:

java
1package cn.oraclestar.sce.upgrade.a26_01; //你的mod类所在包名 2 3import cn.oraclestar.sce.system.modloader.target; 4import cn.oraclestar.sce.system.modloader.modloader_main; 5import cn.oraclestar.sce.system.router.pages; 6import cn.oraclestar.sce.system.UI.UI_core; 7 8@target(name = "SCE_JAVA_UPGRADE_26_01", author = "xingguangcuican", version = "26.01", Description = "SCE JAVA Offcial Upgrade on 26.01") 9public class App implements modloader_main { 10 // 在指定页面插入额外选项判断,arg0是当前pageid,arg1是用户输入,若不需要则保持return pages.CURRENT;,不清楚pageid有那些可以去cn.oraclestar.sce.system.router下找到所有内置页 11 @Override 12 public int innerHandle(String arg0, int arg1) { 13 return pages.CURRENT; 14 } 15 // 在指定TUI界面渲染额外内容arg0是ui类的实例化对象,arg1是当前pageid,你可以通过pageid判断当前界面并调用ui实例化对象中的方法插入需额外渲染的内容 16 @Override 17 public void innerToPage(UI_core arg0, int arg1) { 18 19 } 20 // 在软件关闭时执行(一般没用,没有几个用户会安全关闭本软件) 21 @Override 22 public void onDisable() { 23 return; 24 } 25 //在软件启动时执行,一般用来添加设置,注册页面等等 26 @Override 27 public void onEnable() { 28 // ... 29 return; 30 } 31}

Source: README.md

日志系统更新

日志现在通过 Java 的标准错误流 (System.err) 输出。在使用时,建议将标准错误重定向到文件,例如 2>log.log,以避免影响终端用户界面的体验。

配置新页面与客制化接口

SCE-Universe_Java_Edition 提供了灵活的机制来创建新页面或覆盖现有页面。

开发者可以通过继承 router_core 类并重写 buildPagehandlePageInput 方法来编写新的 TUI 页面。

页面示例

以下是一个自定义页面的示例,展示了如何构建页面内容和处理用户输入:

java
1package cn.oraclestar.sce.upgrade.a26_01.system.pages; 2 3import cn.oraclestar.sce.system.UI.Color; 4import cn.oraclestar.sce.system.router.pages; 5import cn.oraclestar.sce.system.router.router_core; 6import cn.oraclestar.sce.system.setManager.setManager_core; 7import cn.oraclestar.sce.upgrade.a26_01.system.pages_; 8 9public class online_after extends router_core { 10 @Override 11 protected void buildPage(){ 12 // 写TUI渲染逻辑,就像写HTML一样 13 try{ 14 _ui.insertTitle("(开始) 联网搜索"); 15 _ui.insertSpan("APIKEY状态:",Color.DEFAULT); 16 if(((String)setManager_core.getVaule("official_26_01:apiKey")).equals(" ")){ 17 _ui.insertSpan("未设置",Color.RED); 18 } 19 else { 20 _ui.insertSpan("已设置",Color.GREEN); 21 } 22 _ui.insertNewLine(); 23 _ui.insertSpan("同步状态:",Color.DEFAULT); 24 if(!((Boolean)setManager_core.getVaule("official_26_01:is_sync"))){ 25 _ui.insertSpan("未同步",Color.RED); 26 } 27 else { 28 _ui.insertSpan("已同步",Color.GREEN); 29 } 30 _ui.insertNewLine(); 31 _ui.insertNewLine(); 32 _ui.insertOption("选取支援卡",1); 33 _ui.insertOption("设置/修改 APIKEY",2); 34 _ui.insertOption("同步数据库",3); 35 _ui.insertNewLine(); 36 _ui.insertOption("退出",0); 37 _ui.insertNewLine(); 38 _ui.insertInput(); 39 } catch(Exception e){ 40 e.printStackTrace(); 41 } 42 } 43 @Override 44 protected int handlePageInput(String Input){ 45 // 写交互逻辑 46 try{ 47 if(Input.equals("2")){ 48 setManager_core.changeVaule("official_26_01:apiKey",displayEditInfo("APIKEY",setManager_core.getVaule("official_26_01:apiKey"))); 49 } else if(Input.equals("0")){ 50 return pages.START; 51 } else if(Input.equals("3")){ 52 setManager_core.toggleSetting("official_26_01:is_sync"); 53 return pages.ONLINE; 54 } 55 } catch (Exception e){ 56 e.printStackTrace(); 57 } 58 return pages.CURRENT; 59 } 60}

Source: README.md

API 参考

setManager_core

setManager_core 是应用程序设置管理的核心类。它是一个单例模式的实现,提供了访问和修改各种设置的方法。

  • getCore(): setManager_core
    • 描述:返回 setManager_core 的唯一实例。
    • 返回setManager_core 实例。
  • changeVaule(String key, Object value)
    • 描述:修改指定键的设置值。该方法会自动判断值的类型。
    • 参数
      • key (String):设置的键名。
      • value (Object):新的设置值。
  • getVaule(String key): T
    • 描述:获取指定键的设置值。返回类型为泛型 T,需要强制转换为对应的类型。
    • 参数
      • key (String):设置的键名。
    • 返回:键对应的值。
  • toggleSetting(String key)
    • 描述:切换布尔类型设置的值(true 变为 falsefalse 变为 true)。
    • 参数
      • key (String):布尔类型设置的键名。
  • addSet(String key, Object value)
    • 描述:添加一个新的设置项。目前支持 StringIntBoolean 三种类型,并带有自动判断功能。
    • 参数
      • key (String):设置的键名。
      • value (Object):设置的初始值。

router_core

router_core 是页面管理的核心类,提供添加新页面的功能。

  • addPage(int pageId, pageheader pageInstance)
    • 描述:添加一个新页面到路由系统。页面可以覆盖现有页面,但有层级限制(例如,前置Mod不能覆盖其他前置Mod)。
    • 参数
      • pageId (int):页面的唯一标识符,建议使用页面名称的哈希值。
      • pageInstance (pageheader):继承了 pageheader 类的页面实例。

编译与依赖

SCE-Universe_Java_Edition 是在 JDK 17 下编译的,Mod 的 JDK 版本不应低于 JDK 17。 项目没有引入任何第三方库,也没有使用任何构建系统。你可以执行 ./build.sh 进行编译,或者使用自己的方式编译该原生 Java 项目。Mod 的编译方式则取决于开发者偏好。

相关链接

Sources

(5 files)
(root)
src/cn/oraclestar/sce/system/modloader
src/cn/oraclestar/sce/system/router
src/cn/oraclestar/sce/system/setManager

On this page