跳转至

运行时注入

扩展运行时注入

RWPP支持扩展运行时注入代码,利用inject-info,可以在游戏启动时动态生成字节码;在双端分别实现注入的逻辑,能够方便地对游戏逻辑进行改动,而对于Kotlin扩展和Lua扩展有不同情况,此处分别进行讨论

Lua

以下为一个基本的inject-info

[[injectInfos]]
className = "com.corrodinggames.rts.game.units.am"
methodName = "ci"
methodDesc = "()V"
alias = "removeUnitSelf"
injectMode = "InsertBefore"
platform = "desktop"

[[injectInfos]]
className = "com.corrodinggames.rts.game.units.ce"
methodName = "bN"
methodDesc = "()V"
alias = "removeUnitSelf"
injectMode = "InsertBefore"
platform = "android"

如代码所示,injectInfos为一个数组,你需要在inject_lua.toml文件中写入需要的info.

injectInfos

用于在方法的指定位置注入lua代码. - className 要注入的方法所在的完整类名 - methodName 要注入的方法的名称 - methodDesc 要注入的方法的签名 - alias 用于统一不同平台差异的别名,也是lua处插入方法时需要提供的参数 - injectMode 有 InsertBefore,InsertAfter 和 Override,注意若用多个Override 模式注入同一个方法,则会造成冲突. 若用InsertAfter时,可以返回用InterruptResult包装的返回值,表明中断方法继续执行. - platform 对应的平台实现

写好inject-info后,可用以下方式进行注入

inject("removeUnitSelf", function (this)
-- ...
end)

this即为此方法当前对象的引用,若需要注入的方法有参数,也可在上述示例的匿名函数中按其顺序添加参数.

注意

若注入的方法为静态方法,则无需this参数

Kotlin

Kotlin扩展的运行时注入则更加灵活,且能支持更多功能。详情请看相关文档,示例扩展以及源码,此处仅指出需要注意的点

  • 若注入时需要classpath中没有的类,可以使用@InjectClassByString,或@Inject中手动传递desc参数,而不是让ksp根据函数参数进行推导.

  • 暂不支持对构造方法的注入