非官方的 Terraria 移动版 Mod 加载器(Android / arm64-v8a,for Terraria Mobile)。
Mod 是普通的 .NET 10 C# 类库,运行时被加载进游戏进程:内容 API 参照 tModLoader 的使用习惯,游戏类型由 Il2CppInterop 映射成强类型代理,改原版行为直接订阅 On.* 事件。
与 Re-Logic、505 Games、tModLoader 均无关联,也未获其背书。游戏文件由用户自己的正版提供,本仓库与发布产物都不含游戏二进制。
- 强类型:
Terraria.Main、Item、Projectile、NPC、Player都是编译期可检查的代理,字段直接读写,方法直接调用。 - tModLoader 式路径:
ModItem/ModProjectile/ModNPC/ModBuff/ModConfig/Global*,内容 ID 由框架分配,贴图、配方、配置统一注册。 - 只有一条钩子链:
Il2CppInterop.RuntimeDetour+ 内核 Dobby,不需要 Harmony 或第二套 detour。 - 进程内直调:没有 IPC、没有脚本层;框架先判"有没有人覆写"再分派,为空钩子不付成本。
- 不改游戏 APK、不需要 root:宿主把自己的进程变成游戏进程,全程只读用户已安装的那份游戏。
- UI 不依赖悬浮窗权限:配置屏挂在游戏菜单里,自定义界面用 ImGui 覆盖层,画在游戏自己的 GLES 上下文。
- 失败隔离:内核引用校验失败只停用 Mod;单个 Mod 出错不影响其余 Mod,游戏照常运行。
:app 启动器 (Kotlin) 选择游戏 → 导入运行时并校验 → 拉起宿主
└─ :game 宿主 (Kotlin) 注入游戏 dex → 装载游戏 .so → 挂载 assets → UnityPlayer
└─ libpylon.so 绑定 il2cpp_* → 等待引擎稳定 → 校验引用 → Dobby → CoreCLR → ImGui
└─ 托管层 Pylon.Managed → Pylon.ModLoader → 你的 Mod
四层职责与启动时序见 架构。
前置:Windows + PowerShell 7、.NET SDK 10、JDK 17、Android SDK 与 NDK,以及一台 arm64 设备(可选)。
git clone --recurse-submodules https://github.com/Controllerdestiny/Pylon-Loader.git
cd Pylon-Loader
pwsh -File src/csharp/tools/pylon.ps1 checkcheck 会列出缺什么、该怎么补。补齐三类不进仓库的文件(游戏 dump、运行时、代理程序集)后:
pwsh -File src/csharp/tools/pylon.ps1 all -BepInExApk D:\dl\app-release-aligned.apk -DummyDir refs\DummyDll日常改动的两条捷径:
pwsh -File src/csharp/tools/pylon.ps1 build # 内核/宿主/资源有变动时重打 APK
pwsh -File src/csharp/tools/pylon.ps1 managed # 只改托管件:编 + 推进设备,不重装完整的构建说明、命令参考与 CI artifact 见 构建。
public sealed class MyMod : Pylon.ModLoader.Mod
{
public override void Load() => Logger.Info("hello");
public override void SetupContent()
{
On.Terraria.Main.Update += (orig, self, time) => orig(self, time);
}
}把编译产物放进 /storage/emulated/0/Android/data/dev.pylon.loader/Mods/<id>/(或直接在启动器的"Mod 管理"页导入 .dll / .zip / .pmod),重启游戏生效。
API、生命周期、内容类型、打包与调试回路见 Mod 开发;完整示例在 src/csharp/samples。
| 项 | 状态 |
|---|---|
| 宿主链路 / 运行时导入 / 内核 / 托管层 | 已跑通 |
| 内容管线(物品、弹幕、NPC、Buff、配方、方块、玩家与世界、网络、音乐、配置、UI) | 已接入,逐项见 路线 |
| warm 启动 | 宿主 onCreate +26ms,CoreCLR +142ms,引用校验 +219ms |
| 未完成 | release 变体与签名、Tile 自定义绘制、地图颜色、战斗命中管线 |
| 不支持 | Google Play 的 PairIP 构建、中文版、32 位、root 相关注入方案 |
src/app/ 启动器(外部 UI):导入运行时、Mod 管理、拉起 :game
src/game/ 宿主(:game):dex 注入、运行时装载、UnityPlayer、崩溃日志
src/common/ 契约:运行时目录布局、清单格式、哈希
src/core/ C++ 内核 libpylon.so(boot / il2cpp / hook / dotnet / mod / graphics / imgui / jni)
src/csharp/ 托管层与示例:Pylon.Managed / Pylon.ModLoader / Pylon.Mod.Abstractions / Pylon.ImGui
interop/ Il2CppInterop 代理程序集(由你的游戏文件生成,不进 git)
external/ 外部依赖(git 子模块,只有源码)
refs/ 本地游戏 dump(不进 git)
runtime/ BepInEx-Android 运行时(不进 git)
docs/ 文档
| 文档 | 内容 |
|---|---|
| 架构 | 分层、启动时序、内核模块、线程模型、图形管线 |
| 构建 | 前置、三类派生文件、pylon.ps1 参考、CI artifact、缺件对照 |
| 运行时导入 | 目录布局、清单格式、版本门禁、PairIP 拒绝 |
| Mod 开发 | 工程配置、生命周期、内容类型、钩子、打包、调试 |
| 路线 | 已支持范围、未实现项、已知限制、优先级 |
| 排障 | 日志层次、崩溃定位、常见症状 |
| 贡献 | 开发回路、代码与文档规范、提交约定 |
| 内核 | 内核目录、编译契约、硬约束(改内核前必读) |
- 不提供游戏文件:仓库、Release 与 CI artifact 都不含游戏二进制或由其派生的代理程序集。
- 必须使用自己的正版:导入与生成以设备上已安装的
1.4.5系列为准。 - 不支持 PairIP 构建:
libunity.so依赖libpairipcore.so的 Google Play 版会在导入阶段被拒绝,请用无校验构建。 - 不绕过任何校验,也不分发被解密的资源。
- 不复制上游代码:Bunny Loader 采用 PolyForm Noncommercial,与本项目不兼容,只借鉴技术路线与实测结论。
- 名称与商标:产品名不含 "Terraria",只在描述里写 "for Terraria Mobile";不使用游戏美术。
Pylon Loader 非商业许可 —— GNU GPL v3 修改版:官方 GPL-3.0 全文 + 附加条款。
- 禁止商用:不得将本项目代码或其衍生作品用于任何商业目的,除非获得版权所有者书面许可。
- 使用即开源:任何使用、包含或修改本项目代码的项目,无论以何种形式发布,都必须开源并保留本许可条款与署名。
附加条款使本许可属于 GPL-3.0 的修改版,与标准 GPL/MIT/Apache 代码不自动兼容;分发时请随附完整 LICENSE。