准备环境与项目结构¶
ICMod开发以Android设备上的Horizon启动器为入口。Nernar维护的InnerCore文档把整体关系描述为“Horizon加载InnerCore包,InnerCore包加载CoreEngine,模组再通过CoreEngine与Minecraft交互”。这个体系属于第三方旧客户端模组生态,不是当前国际版原生支持的开发方式。
先确认目标环境
提到的InnerCore主线长期围绕Android版Minecraft、Horizon启动器和特定游戏版本运行。维护旧项目时,应先确认目标设备的Android版本、CPU架构、InnerCore包版本、模组依赖库版本和目标Minecraft版本。
安装与包¶
Nernar文档将InnerCore相关环境分为启动器、包和引擎:
- Horizon是启动器,负责预加载游戏、下载和管理包、管理模组与模组包。
- InnerCore是Minecraft相关包,提供模组运行环境。
- CoreEngine是模组直接接触的主要接口层。
Horizon中的包通常包含普通InnerCore、InnerCore Test和InnerCore Legacy。普通InnerCore面向多数项目;Test用于测试实验性变化;Legacy用于旧项目兼容。旧的独立InnerCore应用已经属于更早的生态,文档也不建议把它当作新项目目标。
在Android11及以下设备上,Horizon目录通常更容易通过games/horizon访问;较新的Android版本因存储权限限制,需要通过文件管理器进入Android/data/com.zheka.horizon/files/horizon。资料反复提醒:日志通常位于Horizon的logs目录或InnerCore包的innercore目录,向旧模组作者反馈问题时应优先提供完整日志。
包目录¶
Horizon目录下的核心内容大致如下:
horizonpacks:已安装的包。logs:启动器、引擎和崩溃日志。resource_packs:启动器级资源包缓存。behavior_packs:启动器级行为包缓存。packs/Inner_Coremodpacks:模组包。innercore:默认模组包和引擎设置。innercore/mods:默认安装的模组。worlds:该包独立使用的世界。assets:该游戏版本的内置资源副本。
不要直接编辑包内的assets目录。附加包资源应放入Minecraft的开发资源包或开发行为包目录;InnerCore模组资源则应由模组自己的build.config描述并加载。
模组目录¶
一个典型InnerCore模组是一个文件夹。它不仅包含脚本,也包含资源、配置、图标、构建输出和可能的Java或C++代码。
- 模组文件夹
.dex:发布构建文件。dev.includes:构建到目标脚本的文件列表。header.js:常见的头部脚本。
assetsresourcesterrain-atlas:方块纹理。items-opaque:物品纹理。
gui:界面资源。
launcher.js:加载阶段脚本。build.config:核心构建配置。mod.info:模组名称、作者、版本和简介。mod_icon.png:模组图标。config.json:模组设置。config.info.json:设置界面描述。
mod.info是JSON文件。资料建议至少填写name、author、version和description。description应保持短小,因为旧模组浏览器界面的显示空间有限。
{
"name": "Name me",
"author": "ICDocs",
"version": "1.0",
"description": "Short description."
}
config.json默认可只包含enabled。当enabled为false时,模组脚本可以不启动,但资源仍可能被加载,因此依赖关系和资源副作用需要单独考虑。
构建配置¶
build.config描述资源、脚本、构建目录、库目录、Java目录和原生目录。给出的常见字段包括:
defaultConfig- 设定构建类型、API、库目录、资源包目录和行为包目录。InnerCore模组通常使用CoreEngine作为主要API。
resources- 设定资源目录和资源类型。
resource用于普通资源,gui用于旧界面资源。 compile- 设定要加载的脚本以及
sourceType。常见类型有preloader、launcher、main、custom和library。 buildDirs- 设定要把多个脚本构建到哪个目标脚本。目录中通常需要
.includes。 javaDirs和nativeDirs- 设定Java代码和C++原生代码目录。它们属于旧客户端模组生态的能力,不是附加包能力。
{
"defaultConfig": {
"buildType": "develop",
"api": "CoreEngine",
"libraryDir": "lib/"
},
"resources": [
{
"path": "assets/resources/",
"resourceType": "resource"
},
{
"path": "assets/gui/",
"resourceType": "gui"
}
],
"buildDirs": [
{
"dir": "dev/",
"targetSource": "main.js"
}
],
"compile": [
{
"path": "main.js",
"sourceType": "main"
},
{
"path": "launcher.js",
"sourceType": "launcher"
}
]
}
.includes按顺序列出参与构建的脚本。空行和注释会被忽略;不存在的文件通常只产生警告。工具链版本还会读取注释中的TypeScript编译选项,支持目录、排除项和部分通配写法。
# comments can describe why a file is included
header.js
api/tests.js
api/globals.js
module/.
脚本生命周期¶
InnerCore文档把脚本生命周期分为几个阶段:
- 启动器启动后,InnerCore扫描模组、收集脚本并决定要加载的资源。
preloader脚本可在游戏资源加载前处理资源,例如生成或重染纹理。- 游戏进入加载阶段后,
launcher脚本运行。它通常设置多人信息,然后调用Launch()。 Launch()启动main脚本,模组的物品、方块、配方、事件和主要逻辑通常在这里注册。custom脚本可通过runCustomSource按需运行,并可接收额外上下文。
ConfigureMultiplayer({
name: "Name me",
version: "auto",
isClientOnly: false
});
Launch();
不要重复启动
资料明确指出,每个模组只能启动一次。重复调用Launch()会导致错误。
开发工具¶
Nernar文档推荐使用Visual Studio Code或IntelliJ IDEA一类环境编写脚本、Java和C++代码;移动设备上可使用Spck Code Editor。若需要TypeScript、Java、C++和从电脑推送代码到设备,InnerCore Mod Toolchain会统一处理TypeScript编译器、Java编译器、C/C++编译器和Android调试桥等工具。
这些工具建议只适用于维护旧ICMod项目。新项目若不依赖旧客户端能力,应优先评估附加包、脚本API、中国版模组SDK或服务端插件。