InjectLib
Dauda wants to inject things
模組介紹 作者原文
Features
- Inject Custom Fields to Il2Cpp type
- Inject Custom Json fields to Il2Cpp type
Referencing to your plugin
[BepInDependency("GTFO.InjectLib", BepInDependency.DependencyFlags.HardDependency)]
$(GameFolder)\BepInEx\cache
Inject Fields
- Feature to extends il2cpp domain types and inject your own data to it!
//Defining Field is reqired in order to set/get data
FieldInjector.DefineValueField(string fieldName);
FieldInjector.DefineManagedField(string fieldName);
//Set data
bool FieldInjector.TrySetValueField(Il2CppType obj, string fieldName, UnmanagedType value);
bool FieldInjector.TrySetManagedField(Il2CppType obj, string fieldName, ManagedType value);
//Load Saved data
bool FieldInjector.TryGetValueField(Il2CppType obj, string fieldName, out UnmanagedType value);
bool FieldInjector.TryGetManagedField(Il2CppType obj, string fieldName, out ManagedType value);
Inject Custom Jsons to existing il2cpp type (base game json)
//SetConverter alter the whole json parse behaviour
//Useful if you want to fully alter the content of json
JsonInjector.SetConverter(Il2CppJsonReferenceTypeConverter converter);
JsonInjector.SetConverter(Il2CppJsonUnmanagedTypeConverter converter); //Type must be defined on il2cpp domain!!!
//AddHandler is similar to Harmony Postfix without out ref __result param
//You only can get JToken of parsed json and result object
//So you could inject your own field using FieldInjector
JsonInjector.AddHandler(Il2CppJsonReferenceTypeHandler handler);
JsonInjector.AddHandler(Il2CppJsonUnmanagedTypeHandler handler);
public abstract class Il2CppJsonReferenceTypeConverter: INativeJsonConverter where T: Il2CppObjectBase
{
protected abstract T Read(JToken jToken, T existingValue, JsonSerializer serializer);
protected abstract void Write(JsonWriter writer, T value, JsonSerializer serializer);
}
public abstract class Il2CppJsonUnmanagedTypeConverter: INativeJsonConverter where T: unmanaged
{
protected abstract T Read(JToken jToken, T existingValue, JsonSerializer serializer);
protected abstract void Write(JsonWriter writer, T value, JsonSerializer serializer);
protected abstract Il2CppSystem.Object ToIl2CppObject(T value);
}
public abstract class Il2CppJsonReferenceTypeHandler: INativeJsonHandler where T: Il2CppObjectBase
{
public abstract void OnRead(in Il2CppSystem.Object result, in JToken jToken);
}
public abstract class Il2CppJsonUnmanagedTypeHandler: INativeJsonHandler where T: unmanaged
{
public abstract void OnRead(in Il2CppSystem.Object result, in JToken jToken);
}
Bare example of Json Injection
JsonInjector.SetConverter(new EventTypeConverter());
JsonInjector.AddHandler(new EventDataHandler());
//This converter alter the behaviour of reading/writing eWardenObjectiveEventType enum
//So you could Parse extended enum types!
internal class EventTypeConverter: Il2CppJsonUnmanagedTypeConverter
{
protected override eWardenObjectiveEventType Read(JToken jToken, eWardenObjectiveEventType existingValue, JsonSerializer serializer)
{
int value = 0;
switch(jToken.Type)
{
case JTokenType.Integer:
value = (int)jToken;
break;
case JTokenType.String:
var str = (string)jToken;
if (Enum.TryParse(str, ignoreCase: true, out var weeResult))
{
value = (int)weeResult;
break;
}
else if (Enum.TryParse(str, ignoreCase: true, out var woResult))
{
value = (int)woResult;
break;
}
return eWardenObjectiveEventType.None;
default:
return eWardenObjectiveEventType.None;
}
return (eWardenObjectiveEventType)value;
}
protected override void Write(JsonWriter writer, eWardenObjectiveEventType value, JsonSerializer serializer)
{
writer.WriteValue((int)value);
}
protected override Il2CppSystem.Object ToIl2CppObject(eWardenObjectiveEventType value)
{
return new Il2CppSystem.Int32() { m_value = (int)value }.BoxIl2CppObject();
}
}
//This one reads Custom Fields from WardenObjectiveEventData type!
internal class EventDataHandler: Il2CppJsonReferenceTypeHandler
{
private readonly static J
安裝與使用 安裝:按包內說明操作
- 解壓本站下載的壓縮包,先讀包內的 readme / 說明檔案。
- 多數模組依賴遊戲的模組載入器:常見做法是用社群模組管理器(如 r2modman)選中本遊戲安裝,由管理器自動處理載入器與依賴。
- 手動安裝時,把模組檔案放進遊戲目錄下對應的 Mod / plugins 資料夾。
- 啟動遊戲確認載入成功;帶「前置依賴」的模組需要把依賴一併安裝。
不同模組的安裝位置差異較大,包內說明是最可靠的依據。
下面這些內容需要先安裝,否則該模組不會生效: