创建你的第一个Mod
本文档旨在指导开发者如何在 SCE Universe Java Edition 中创建和集成自己的Mod。你将了解到Mod与Mod加载器之间的核心交互接口,以及如何利用内置UI组件与用户进行交互。
概述
SCE Universe Java Edition 的Mod系统旨在提供一个可扩展的框架,允许第三方开发者为游戏添加新功能、内容或修改现有行为。核心在于 modloader_main 接口,它定义了Mod生命周期和UI交互的契约。Mod加载器将发现、加载并管理实现了此接口的Mod。
架构
Mod加载器是整个系统的核心,它负责发现并激活Mod。每个Mod都必须实现 modloader_main 接口,这是Mod与系统通信的桥梁。Mod通过 UI_core 组件与游戏的文本用户界面进行交互。
解释:
- Mod Loader (Mod加载器):负责发现、加载、激活和停用所有已安装的Mod。
modloader_mainInterface (Mod加载器主接口):所有Mod必须实现的接口。它定义了Mod的生命周期方法(启用、禁用)和UI交互方法。UI_coreComponent (UI核心组件):提供了一系列方法,允许Mod在游戏的文本用户界面上显示信息、接收用户输入和构建复杂的UI页面。- 你的Mod实现类 (Your Mod Class):你开发的具体Mod,它将实现
modloader_main接口,并使用UI_core来实现其功能。
Mod接口 (modloader_main)
modloader_main 接口是每个Mod的入口点。它定义了Mod生命周期中必须实现的关键方法。
1package cn.oraclestar.sce.system.modloader;
2
3public interface modloader_main {
4 final String pluginName = "";
5 final String version = "";
6 void onEnable();
7 void onDisable();
8 void innerToPage(cn.oraclestar.sce.system.UI.UI_core ui_core,int now_page);
9 int innerHandle(String Input,int now_page);
10}Source: modloader_main.java
接口方法详解
pluginName(String): Mod的名称。version(String): Mod的版本。onEnable(): 当Mod被加载和激活时调用。你可以在这里执行Mod的初始化逻辑,例如注册事件监听器、加载配置文件等。onDisable(): 当Mod被卸载或停用时调用。你可以在这里执行Mod的清理逻辑,例如注销事件监听器、保存数据等。innerToPage(cn.oraclestar.sce.system.UI.UI_core ui_core, int now_page): Mod用于向指定页面渲染内容的方法。ui_core参数提供了UI操作的API,now_page指示当前Mod所在的页面ID。innerHandle(String Input, int now_page): Mod用于处理用户输入的方法。当用户在指定页面输入内容时,此方法将被调用。Input参数是用户的输入内容,now_page指示当前Mod所在的页面ID。此方法应返回一个整数,通常用于指示处理结果或下一个页面状态。
UI交互 (UI_core)
UI_core 类提供了与游戏文本界面交互的丰富功能。Mod可以通过它来构建动态且彩色的输出,以及获取用户输入。
1public class UI_core extends ui_header {
2 // ...
3 public void insertTitle(String textContent,rgb color){ /* ... */ }
4 public void insertText(String textContent,rgb color){ /* ... */ }
5 public void insertSpan(String textContent,rgb color){ /* ... */ }
6 public void insertHint(String textContent,rgb color){ /* ... */ }
7 public void insertInput(boolean isPause,rgb color){ /* ... */ }
8 public void insertOption(String textContent,int index,rgb color){ /* ... */ }
9 public void getUserInput(){ /* ... */ }
10 // ...
11}Source: UI_core.java
主要方法包括:
insertTitle(String textContent, rgb color): 插入标题,支持颜色。insertText(String textContent, rgb color): 插入普通文本,支持颜色。insertHint(String textContent, rgb color): 插入提示信息,如错误、警告或普通消息。insertOption(String textContent, int index, rgb color): 插入带编号的选项。insertInput(): 插入一个输入提示符,等待用户输入。getUserInput(): 获取用户在控制台的输入。
Mod在 innerToPage 中会调用这些 insert 方法来构建页面内容,然后由 UI_core 负责渲染。
核心流程
Mod加载器与Mod之间的典型交互流程如下所示,主要围绕 innerToPage 和 innerHandle 方法展开。
解释:
- Mod启用:Mod加载器调用Mod的
onEnable()方法进行初始化。 - 页面渲染:当用户进入Mod的特定页面时,Mod加载器调用Mod的
innerToPage()方法,并将UI_core实例传递给Mod。Mod使用UI_core的方法来插入标题、文本、选项和输入提示。 - 用户输入:
UI_core渲染页面并等待用户输入。一旦用户输入内容,Mod加载器将输入内容传递给Mod的innerHandle()方法。 - 输入处理:Mod在
innerHandle()中处理用户的输入,并返回一个整数,指示操作结果或下一个要显示的页面。 - Mod禁用:当Mod被卸载或游戏关闭时,Mod加载器调用Mod的
onDisable()方法进行资源清理。
使用示例
以下是一个简单的Mod实现示例,展示了如何实现 modloader_main 接口以及如何使用 UI_core 进行基本的UI交互。
1. Mod基本结构
1// MyFirstMod.java
2package cn.oraclestar.sce.mod.myfirstmod; // Mod通常有自己的包路径
3
4import cn.oraclestar.sce.system.modloader.modloader_main;
5import cn.oraclestar.sce.system.UI.UI_core;
6import cn.oraclestar.sce.system.UI.Color; // 用于颜色
7import cn.oraclestar.sce.system.UI.fmt.rgb; // 用于自定义RGB颜色
8
9public class MyFirstMod implements modloader_main {
10
11 // Mod的名称和版本,Mod加载器会读取这些信息
12 @Override
13 public final String pluginName = "我的第一个Mod";
14 @Override
15 public final String version = "1.0.0";
16
17 // 用于管理Mod的内部状态,例如当前显示的页面
18 private int currentPage = 0;
19
20 @Override
21 public void onEnable() {
22 System.out.println("Mod: " + pluginName + " v" + version + " 已启用!");
23 currentPage = 0; // 启用时重置页面状态
24 }
25
26 @Override
27 public void onDisable() {
28 System.out.println("Mod: " + pluginName + " 已禁用。");
29 }
30
31 @Override
32 public void innerToPage(UI_core ui_core, int now_page) {
33 // 根据Mod的内部页面状态渲染不同的内容
34 switch (currentPage) {
35 case 0:
36 displayHomePage(ui_core);
37 break;
38 case 1:
39 displayAboutPage(ui_core);
40 break;
41 default:
42 ui_core.insertTitle("未知页面", Color.RED);
43 ui_core.insertText("按回车返回主页。");
44 break;
45 }
46 }
47
48 @Override
49 public int innerHandle(String Input, int now_page) {
50 // 根据当前页面和用户输入处理逻辑
51 switch (currentPage) {
52 case 0: // 主页处理
53 return handleHomePageInput(Input);
54 case 1: // 关于页面处理
55 return handleAboutPageInput(Input);
56 default:
57 // 未知页面,任何输入都返回主页
58 currentPage = 0;
59 return 0; // 返回0表示维持当前Mod页面 (通常Mod加载器会刷新当前Mod页面)
60 }
61 }
62
63 // --- 辅助方法用于构建Mod页面 ---
64
65 private void displayHomePage(UI_core ui_core) {
66 ui_core.resetList(); // 重置列表前缀
67 ui_core.insertTitle(pluginName + " - 主页", Color.YELLOW);
68 ui_core.insertNewLine();
69 ui_core.insertText("欢迎使用我的第一个Mod!", Color.BLUE);
70 ui_core.insertNewLine();
71 ui_core.insertOption("查看关于", 1, Color.GREEN);
72 ui_core.insertOption("退出Mod", 9, Color.RED);
73 ui_core.insertNewLine();
74 ui_core.insertInput(); // 插入输入提示符
75 }
76
77 private int handleHomePageInput(String input) {
78 try {
79 int choice = Integer.parseInt(input.trim());
80 switch (choice) {
81 case 1:
82 currentPage = 1; // 切换到关于页面
83 break;
84 case 9:
85 // 退出Mod的逻辑可能由Mod加载器处理,这里暂时返回一个特殊值
86 return -1; // 示例:-1表示退出Mod或返回上一级系统页面
87 default:
88 // 无效输入,留在当前页面
89 System.out.println("无效选项,请重新输入。");
90 }
91 } catch (NumberFormatException e) {
92 // 输入不是数字,留在当前页面
93 System.out.println("请输入数字。");
94 }
95 return 0; // 维持当前Mod页面
96 }
97
98 private void displayAboutPage(UI_core ui_core) {
99 ui_core.resetList();
100 ui_core.insertTitle(pluginName + " - 关于", Color.CYAN);
101 ui_core.insertNewLine();
102 ui_core.insertText("这个Mod是一个示例Mod,展示了基本的集成。", new rgb(100, 200, 255));
103 ui_core.insertNewLine();
104 ui_core.insertHint("版本: " + version + " 作者: OracleLoadstar", Color.MAGENTA);
105 ui_core.insertNewLine();
106 ui_core.insertOption("返回主页", 0, Color.GREEN);
107 ui_core.insertNewLine();
108 ui_core.insertInput();
109 }
110
111 private int handleAboutPageInput(String input) {
112 try {
113 int choice = Integer.parseInt(input.trim());
114 if (choice == 0) {
115 currentPage = 0; // 返回主页
116 } else {
117 System.out.println("无效选项,请重新输入。");
118 }
119 } catch (NumberFormatException e) {
120 System.out.println("请输入数字。");
121 }
122 return 0; // 维持当前Mod页面
123 }
124}Sources:
2. Mod的编译与放置
要使你的Mod生效,你需要:
- 将上述
MyFirstMod.java文件编译成.class文件。 - 将编译后的
.class文件(以及所有依赖的.class文件,如果Mod结构复杂)打包成一个.jar文件。 - 将
.jar文件放置在Mod加载器指定 Mods 目录中(具体目录需要查阅Mod加载器的配置或文档,本仓库未明确给出)。
Mod加载器会在启动时扫描此目录,并加载实现了 modloader_main 接口的Mod。
API 参考
modloader_main 接口
onEnable(): void
- 描述: Mod被启用时调用。
- 参数: 无
- 返回: 无
- 抛出: 运行时异常
onDisable(): void
- 描述: Mod被禁用时调用。
- 参数: 无
- 返回: 无
- 抛出: 运行时异常
innerToPage(ui_core: cn.oraclestar.sce.system.UI.UI_core, now_page: int): void
- 描述: 用于将Mod内容渲染到UI页面。
- 参数:
ui_core(cn.oraclestar.sce.system.UI.UI_core): 提供UI操作的实例。now_page(int): 当前页面ID,通常由Mod加载器传递。
- 返回: 无
- 抛出: 运行时异常
innerHandle(Input: String, now_page: int): int
- 描述: 处理用户在Mod页面中的输入。
- 参数:
Input(String): 用户的输入内容。now_page(int): 当前页面ID。
- 返回:
int,通常用于指示Mod加载器应如何响应(例如,0表示维持当前Mod页面,-1表示退出Mod或返回上一级系统页面,具体取决于Mod加载器的实现)。 - 抛出: 运行时异常
相关链接
modloader_main.java- Mod接口的定义UI_core.java- UI核心组件的实现Color.java- 预定义颜色常量rgb.java- RGB颜色类的定义