介绍
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 接口,并实现 onEnable、onDisable、innerToPage 和 innerHandle 方法。同时,Mod 的主类需要通过 @target 注解提供元数据,如 modid、作者、版本和 描述。
Modloader 示例
以下是一个 Mod 主类的基本结构:
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 类并重写 buildPage 和 handlePageInput 方法来编写新的 TUI 页面。
页面示例
以下是一个自定义页面的示例,展示了如何构建页面内容和处理用户输入:
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变为false,false变为true)。 - 参数:
key(String):布尔类型设置的键名。
- 描述:切换布尔类型设置的值(
addSet(String key, Object value)- 描述:添加一个新的设置项。目前支持
String、Int和Boolean三种类型,并带有自动判断功能。 - 参数:
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 的编译方式则取决于开发者偏好。