Mod文件夹结构
本文档详细介绍了SCE-Universe Java版模组加载器所识别和使用的模组文件结构。理解这个结构对于模组开发者和想要手动安装模组的用户至关重要。
概述
SCE-Universe 的模组加载器(Modloader)设计为高度可扩展,允许玩家通过简单的文件放置方式添加新的游戏内容和功能。模组以标准的Java Archive(JAR)文件形式提供,并放置在游戏根目录下的特定文件夹中。加载器会自动扫描这些目录,识别并加载符合规范的模组。
该系统支持两种主要类型的模组目录:常规模组目录和预加载模组目录,后者用于需要在游戏核心功能之前初始化的模组。
架构
下图展示了模组加载器如何与文件系统和模组组件交互的整体架构。
模组加载器 (modlist.java) 会扫描 plugins/ 和 plugins/preload/ 目录以查找 .jar 文件。每个 .jar 文件都被视为一个潜在的模组。加载器会检查这些 JAR 包内部的类,寻找实现 modloader_main 接口并使用 @target 注解标记的类,这个类将作为模组的入口点。
核心结构
模组加载器在游戏启动时,会查找以下两个主要目录来加载模组:
-
plugins/目录: 这是标准模组的存放位置。所有放置在此目录下的.jar文件都将被加载器检测并尝试作为常规模组进行加载。 -
plugins/preload/目录: 这是一个特殊的子目录,用于存放需要优先于其他常规模组加载的模组。放置在此目录下的.jar文件将首先被加载,这对于需要修改游戏启动过程或在其他模组加载前提供基础功能的模组非常有用。
如果这些目录不存在,模组加载器会在启动时自动创建它们。
模组 JAR 文件结构
每个模组本身是一个 .jar 文件,其内部通常包含:
- 模组主类:实现
cn.oraclestar.sce.system.modloader.modloader_main接口,并使用cn.oraclestar.sce.system.modloader.target注解标记的Java类。 - 其他Java类:模组功能所需的其他类。
- 资源文件:图片、声音、配置文件等,模组可以通过
ClassLoader访问这些资源。 - 依赖库:模组可能需要的第三方库。
模组加载流程
以下序列图详细说明了模组加载器在游戏启动时扫描并加载模组的步骤。
模组主类和元数据
为了让加载器正确识别和加载模组,模组开发者需要创建一个实现 modloader_main 接口并使用 @target 注解标记的类。
modloader_main 接口
这个接口定义了模组的生命周期方法和与UI交互的方法。
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); // UI交互方法
9 int innerHandle(String Input,int now_page); // UI交互方法
10}Source: src/cn/oraclestar/sce/system/modloader/modloader_main.java
@target 注解
这个注解用于提供模组的元数据,例如模组名称、作者、版本和描述。加载器通过读取这些信息来识别和展示模组。
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"; // 模组版本 (默认值为 "1.0.0")
14 String Description() default "None"; // 模组描述 (默认值为 "None")
15}示例:模组主类骨架
这是一个模组主类的基本结构示例,展示了如何实现 modloader_main 接口和使用 @target 注解。
1package com.yourmod.example; // 替换为你的模组包名
2
3import cn.oraclestar.sce.system.modloader.modloader_main;
4import cn.oraclestar.sce.system.modloader.target;
5import cn.oraclestar.sce.system.UI.UI_core;
6
7@target(name = "我的第一个模组", author = "Mod 作者", version = "1.0.0", Description = "这是一个示例模组。")
8public class MyFirstMod implements modloader_main {
9
10 // 模组名称 (由 @target 注解提供,这里无需重复)
11 // public static final String pluginName = "我的第一个模组";
12 // 模组版本 (由 @target 注解提供,这里无需重复)
13 // public static final String version = "1.0.0";
14
15 @Override
16 public void onEnable() {
17 System.out.println("[我的第一个模组] 模组已启用!");
18 // 在这里初始化你的模组功能
19 }
20
21 @Override
22 public void onDisable() {
23 System.out.println("[我的第一个模组] 模组已禁用!");
24 // 在这里清理你的模组资源
25 }
26
27 @Override
28 public void innerToPage(UI_core ui_core, int now_page) {
29 // 实现UI页面跳转逻辑
30 }
31
32 @Override
33 public int innerHandle(String Input, int now_page) {
34 // 实现UI输入处理逻辑
35 return 0;
36 }
37}Sources: