OracleLoadstar/SCE-Universe_Java_Edition
开发者指南Modloader开发

创建你的第一个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_main Interface (Mod加载器主接口):所有Mod必须实现的接口。它定义了Mod的生命周期方法(启用、禁用)和UI交互方法。
  • UI_core Component (UI核心组件):提供了一系列方法,允许Mod在游戏的文本用户界面上显示信息、接收用户输入和构建复杂的UI页面。
  • 你的Mod实现类 (Your Mod Class):你开发的具体Mod,它将实现 modloader_main 接口,并使用 UI_core 来实现其功能。

Mod接口 (modloader_main)

modloader_main 接口是每个Mod的入口点。它定义了Mod生命周期中必须实现的关键方法。

java
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可以通过它来构建动态且彩色的输出,以及获取用户输入。

java
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之间的典型交互流程如下所示,主要围绕 innerToPageinnerHandle 方法展开。

加载图表中...

解释:

  1. Mod启用:Mod加载器调用Mod的 onEnable() 方法进行初始化。
  2. 页面渲染:当用户进入Mod的特定页面时,Mod加载器调用Mod的 innerToPage() 方法,并将 UI_core 实例传递给Mod。Mod使用 UI_core 的方法来插入标题、文本、选项和输入提示。
  3. 用户输入UI_core 渲染页面并等待用户输入。一旦用户输入内容,Mod加载器将输入内容传递给Mod的 innerHandle() 方法。
  4. 输入处理:Mod在 innerHandle() 中处理用户的输入,并返回一个整数,指示操作结果或下一个要显示的页面。
  5. Mod禁用:当Mod被卸载或游戏关闭时,Mod加载器调用Mod的 onDisable() 方法进行资源清理。

使用示例

以下是一个简单的Mod实现示例,展示了如何实现 modloader_main 接口以及如何使用 UI_core 进行基本的UI交互。

1. Mod基本结构

java
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生效,你需要:

  1. 将上述 MyFirstMod.java 文件编译成 .class 文件。
  2. 将编译后的 .class 文件(以及所有依赖的 .class 文件,如果Mod结构复杂)打包成一个 .jar 文件。
  3. .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加载器的实现)。
  • 抛出: 运行时异常

相关链接

Sources

(2 files)
src/cn/oraclestar/sce/system/modloader
src/cn/oraclestar/sce/system/UI

On this page