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

Mod核心接口

本文档介绍了SCE-Universe Java Edition的Mod加载器(ModLoader)所提供的核心接口,这些接口是开发者创建和集成Mod到游戏中的基础。通过理解这些接口,Mod开发者可以更好地实现Mod的生命周期管理和与游戏核心功能的交互。

概述

Mod核心接口定义了Mod如何被ModLoader识别、加载和管理。主要包括一个核心接口 modloader_main 和一个元数据注解 @targetmodloader_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都必须实现此接口。

java
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 指示当前的页面。
  • innerHandle(String Input, int now_page):
    • 描述: 用于处理来自UI或其他内部源的输入。Mod可以根据 Input 字符串和 now_page 参数来执行相应的逻辑,并返回一个整数结果。

@target 注解

@target 注解是一个运行时注解,用于为Mod类提供元数据。ModLoader在加载Mod时会读取这些信息,以便识别、显示和管理Mod。Mod开发者必须使用此注解来标记其Mod主类。

java
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}

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

注解字段:

  • 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.javatarget.java 的规范而创建的。

一个简单的Mod

java
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:

相关链接

On this page