Mod核心接口
本文档介绍了SCE-Universe Java Edition的Mod加载器(ModLoader)所提供的核心接口,这些接口是开发者创建和集成Mod到游戏中的基础。通过理解这些接口,Mod开发者可以更好地实现Mod的生命周期管理和与游戏核心功能的交互。
概述
Mod核心接口定义了Mod如何被ModLoader识别、加载和管理。主要包括一个核心接口 modloader_main 和一个元数据注解 @target。modloader_main 接口负责定义Mod的生命周期事件(如启用和禁用)以及与游戏UI的交互方法。而 @target 注解则用于为Mod提供必要的元数据,如名称、作者、版本和描述,ModLoader通过这些元数据来识别和管理Mod。
这些接口是实现插件化架构的关键,允许第三方开发者在不修改游戏核心代码的情况下,扩展游戏功能。
架构
ModLoader的核心架构围绕 modloader_main 接口和 @target 注解展开。modlist 类负责扫描、加载Mod,并与实现了这些核心接口的Mod实例进行交互。
图1: Mod核心接口架构图
此图展示了Mod核心接口 (
modloader_main、@target) 如何与Mod加载器 (modlist) 以及Mod实现 (MyMod) 协同工作。ModLoader 扫描Mod文件,识别实现了modloader_main接口并使用@target注解的类,然后加载这些Mod实例并管理其生命周期。
Mod核心接口
modloader_main 接口
modloader_main 接口定义了Mod必须实现的生命周期方法和核心交互方法。任何希望被ModLoader识别和加载的Mod都必须实现此接口。
1package cn.oraclestar.sce.system.modloader;
2
3public interface modloader_main {
4 final String pluginName = ""; // 不推荐直接使用此字段,应通过@target注解提供名称
5 final String version = ""; // 不推荐直接使用此字段,应通过@target注解提供版本
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: src/cn/oraclestar/sce/system/modloader/modloader_main.java
接口方法:
onEnable():- 描述: Mod被ModLoader加载并启用时调用。Mod应在此方法中执行初始化操作,如注册事件监听器、加载资源等。
onDisable():- 描述: Mod被禁用或ModLoader关闭时调用。Mod应在此方法中执行清理操作,如注销事件监听器、保存数据、释放资源等。
innerToPage(cn.oraclestar.sce.system.UI.UI_core ui_core, int now_page):- 描述: 用于Mod与游戏UI进行交互,将Mod的内部逻辑映射到特定的UI页面。
ui_core提供了UI操作的上下文,now_page指示当前的页面。
- 描述: 用于Mod与游戏UI进行交互,将Mod的内部逻辑映射到特定的UI页面。
innerHandle(String Input, int now_page):- 描述: 用于处理来自UI或其他内部源的输入。Mod可以根据
Input字符串和now_page参数来执行相应的逻辑,并返回一个整数结果。
- 描述: 用于处理来自UI或其他内部源的输入。Mod可以根据
@target 注解
@target 注解是一个运行时注解,用于为Mod类提供元数据。ModLoader在加载Mod时会读取这些信息,以便识别、显示和管理Mod。Mod开发者必须使用此注解来标记其Mod主类。
1package cn.oraclestar.sce.system.modloader;
2
3import java.lang.annotation.ElementType;
4import java.lang.annotation.Retention;
5import java.lang.annotation.RetentionPolicy;
6import java.lang.annotation.Target;
7
8@Target(ElementType.TYPE)
9@Retention(RetentionPolicy.RUNTIME)
10public @interface target {
11 String name();
12 String author() default "未知";
13 String version() default "1.0.0";
14 String Description() default "None";
15}注解字段:
name():- 类型:
String - 描述: Mod的唯一名称。这是ModLoader识别和显示Mod的主要标识。
- 类型:
author():- 类型:
String - 默认值: "未知"
- 描述: Mod的作者名称。
- 类型:
version():- 类型:
String - 默认值: "1.0.0"
- 描述: Mod的版本号。
- 类型:
Description():- 类型:
String - 默认值: "None"
- 描述: Mod的简短描述。
- 类型:
核心流程
ModLoader发现并加载Mod的核心流程涉及扫描Mod文件、加载类、检查接口实现和注解,然后初始化Mod。
图2: Mod加载与生命周期流程图
此流程图详细描述了ModLoader如何发现磁盘上的Mod文件,将其加载到内存中,并验证它们是否符合Mod接口规范。一旦Mod被成功加载,
onEnable()方法将被调用,Mod进入运行状态。在游戏关闭或Mod被卸载时,onDisable()方法会被调用以进行资源清理。
使用示例
以下是一个简单的Mod实现示例,它展示了如何实现 modloader_main 接口并使用 @target 注解。
由于仓库中没有直接的Mod实现示例,此示例是基于 modloader_main.java 和 target.java 的规范而创建的。
一个简单的Mod
1// MySimpleMod.java
2package com.mycompany.mymod;
3
4import cn.oraclestar.sce.system.modloader.modloader_main;
5import cn.oraclestar.sce.system.modloader.target;
6import cn.oraclestar.sce.system.UI.UI_core; // 假设UI_core是可导入的
7
8@target(name = "MySimpleMod", author = "ModDeveloper", version = "1.0.0", Description = "一个简单的示例Mod")
9public class MySimpleMod implements modloader_main {
10
11 @Override
12 public void onEnable() {
13 System.out.println("[MySimpleMod] Mod 已启用!");
14 // 在这里执行Mod的初始化逻辑
15 }
16
17 @Override
18 public void onDisable() {
19 System.out.println("[MySimpleMod] Mod 已禁用!");
20 // 在这里执行Mod的清理逻辑
21 }
22
23 @Override
24 public void innerToPage(UI_core ui_core, int now_page) {
25 System.out.println("[MySimpleMod] 导航到页面: " + now_page);
26 // 根据页面号更新UI
27 }
28
29 @Override
30 public int innerHandle(String Input, int now_page) {
31 System.out.println("[MySimpleMod] 收到输入 '" + Input + "',当前页面: " + now_page);
32 // 处理UI输入逻辑
33 if ("hello".equals(Input)) {
34 System.out.println("[MySimpleMod] 回应: World!");
35 return 1; // 成功处理
36 }
37 return 0; // 未处理
38 }
39}Sources: