Open Kein opened 2 years ago
Code:
ClassInjector.RegisterTypeInIl2Cpp<MyUtility>();
//------
public class MyUtility : BaseUtility // class from the unhollowed assembly, Monobehaviour
{
public MyUtility(System.IntPtr ptr) : base(ptr)
{
myInputs = new INPUT[] { //whatever }; // implicit conversion to UnhollowerBaseLib.Il2CppStructArray<T>
}
public override void ActionEffect()
{
UnityEngine.Debug.Log("DONE");
}
[HarmonyPatch(typeof(PlayerCharacter), "creature_Awake")]
static class PatchPlayerCharacterInit
{
static void Postfix(PlayerCharacter __instance)
{
__instance.gameObject.AddComponent<MyUtility>();
//Automatically gets added to IL2cppReferenceArray<BaseUtility>
///on character instance by original code
}
}
PlayerCharacter
with propertymyUtilities[]
(as Il2CppReferenceArrayBaseUtilityComponent
. Said class exposes base propertymyInputs
which is "unhollowed" asIl2CppStructArray<INPUT>
whereINPUT
is plain enum.MyUtility
and inherited fromBaseUtilityComponent
on mono side (bepinex plugin)PlayerCharacter
I instantiate my custom component on mono side, add it to GameObject ofPlayerCharacter
and add it tomyUtilities[]
as wellmyInputs
with custom array ofINPUT
enum values.For the first time (first scene load) everything works fine. When I change the scene, thing become weird,
myInputs
on my custom Component now has some weird garbage data, like Count/Length being a few million or throwing nullref when trying to request any value by index. The odd part is that this component isnt even transitioned through scene as DDOL or HideandDontSave, it is literally recreated asPlayerCharacter
is being remade. WasCollected returns false for the givenIL2cppStructArray
(sine it is referenced on il2cpp side) Let me know if more information is needed.