InjectLib

版本 v1.1.0·更新於 2025-03-09

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

安裝與使用 安裝:按包內說明操作

  1. 解壓本站下載的壓縮包,先讀包內的 readme / 說明檔案。
  2. 多數模組依賴遊戲的模組載入器:常見做法是用社群模組管理器(如 r2modman)選中本遊戲安裝,由管理器自動處理載入器與依賴。
  3. 手動安裝時,把模組檔案放進遊戲目錄下對應的 Mod / plugins 資料夾。
  4. 啟動遊戲確認載入成功;帶「前置依賴」的模組需要把依賴一併安裝。

不同模組的安裝位置差異較大,包內說明是最可靠的依據。

前置依賴

下面這些內容需要先安裝,否則該模組不會生效:

BepInEx-BepInExPack_GTFO

檔案與校驗

檔案名稱
InjectLib-1.1.0.zip
檔案大小
88.4 KiB