ModTheSpire SpirePatch深度详解30秒为杀戮尖塔写出第一个Prefix/Postfix补丁【免费下载链接】ModTheSpireExternal mod loader for Slay The Spire项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpireModTheSpire是《杀戮尖塔》Slay the Spire的外部 MOD 加载器而SpirePatch是其中最强的补丁注入注解——只需几行代码就能在游戏的任意方法执行前后插入自定义逻辑完全无需修改原版游戏文件。本文带你彻底搞懂 SpirePatch并在 30 秒内写出你的第一个 Prefix / Postfix 补丁。一、为什么每个 MOD 都需要 SpirePatchModTheSpire 的核心理念是游戏原文件一个字节都不动所有修改都在内存中通过字节码补丁完成相关实现见 Patcher.java。在这个体系里补丁注解就是 MOD 开发者的万金油工具SpirePatch类级注解声明我要给哪个类的哪个方法打补丁SpirePrefixPatch方法级注解标记一个方法在原方法执行前运行SpirePostfixPatch方法级注解标记一个方法在原方法执行后运行三个注解的定义都非常精简可以亲自查看源码感受它的设计SpirePatch.javaSpirePrefixPatch.javaSpirePostfixPatch.java启动时Patcher 会扫描 MOD 中所有带补丁注解的类按 Patcher.java 中的逻辑识别出 Prefix 和 Postfix 方法再把它们织入目标方法。 除了这两个还有SpirePatch2支持更复杂的定位器 Locator当你需要按第 N 个匹配位置精确插入代码时它就派上用场了源码见 SpirePatch2.java。二、30 秒上手写出第一个补丁第 1 步准备开发环境需要JDK 8和Maven仓库自带 Maven 包装器 mvnw也可以直接用它。如果要在本地研究 ModTheSpire 源码先克隆仓库git clone https://gitcode.com/gh_mirrors/mo/ModTheSpire第 2 步准备 MOD 描述文件每个 MOD 的 JAR 内都需要一份ModTheSpire.json用来声明 MOD 的 ID、名称、版本和作者等信息字段定义可以参考 ModInfo.java{ modid: myfirstpatch, name: 我的第一个补丁, version: 1.0.0, author_list: [You], description: 一个 SpirePatch 入门示例 }第 3 步写补丁类核心就这一个文件假设你想在玩家选择奖励卡片的方法执行前、后各打印一条日志补丁类就是这样import com.evacipated.cardcrawl.modthespire.lib.*; public class RewardExample { SpirePatch( clz AbstractDungeon.class, // 目标类 method getRewardCard // 目标方法 ) public static class HookRewardCard { SpirePrefixPatch public static void Prefix() { System.out.println(奖励卡片即将生成); } SpirePostfixPatch public static void Postfix() { System.out.println(奖励卡片已生成完毕); } } }就这么简单——一个类级SpirePatch锁定目标两个方法分别标注SpirePrefixPatch和SpirePostfixPatch补丁就完成了。✅第 4 步打包并放入 mods 目录mvnw package把生成的 JAR 放进游戏的mods目录目录结构说明见 README.md运行 MTS.cmdWindows或 MTS.shLinux在启动器中勾选你的 MOD点击 Play打开控制台就能看到你插入的日志输出了。三、SpirePatch 属性速查表SpirePatch支持以下属性日常开发基本只用前 4 个属性作用常用场景clz目标类Class 类型首选编译器能帮你查错cls目标类字符串不想引用某个类时用method目标方法名必填paramtypez目标方法参数类型数组同名方法重载时区分paramtypes参数类型字符串形式与paramtypez二选一requiredModId依赖的其他 MOD ID给别人的 MOD 打补丁时必填optional补丁目标缺失时是否跳过兼容性处理两个小技巧同名注解可以叠加SpirePatch标记了Repeatable(SpirePatches.class)见 SpirePatches.java一个类上可以同时写多个SpirePatch。补丁方法里可以拿到参数Prefix/Postfix 方法的实参会自动绑定到原方法的对应参数需要修改原方法的局部变量时参数声明成ByRefT类型即可封装类见 ByRef.java。四、新手最容易踩的 3 个坑 ⚠️补丁方法必须是 static非静态补丁方法会在启动时直接抛出NonStaticPatchMethodException报错文案在 NonStaticPatchMethodException.java。参数类型要对得上原方法有参数而你的 Prefix/Postfix 方法参数签名不匹配时会报参数类型缺失MissingParamTypesException.java按报错提示补齐参数即可。别用反射猜方法名method属性填错一个字母补丁就会静默失败建议直接复制反编译工具里的签名或优先用paramtypez精确锁定重载。 补丁加载的完整链路Loader读取 mods 目录 →Patcher扫描注解生成PatchInfoPatchInfo.java→ 用 Javassist 织入字节码。遇到加载问题按这条链排查效率最高。五、写在最后一个SpirePatch 一个SpirePrefixPatch就能完成方法执行前插入逻辑的最小闭环30 秒完全可以做到想深入细节lib 目录 下还有SpireField、SpireReturn等 10 多个补丁注解等你探索每次版本变化记录都写在 CHANGELOG.md 里升级 MOD 时看一眼能少走很多弯路。从会装 MOD到会写 MOD只差一个 SpirePatch 的距离。现在就动手让你的第一个杀戮尖塔补丁跑起来吧【免费下载链接】ModTheSpireExternal mod loader for Slay The Spire项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考