Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Random garbage in IL2CPPStructArray<T> #86

Open
Kein opened this issue Mar 21, 2022 · 1 comment
Open

Random garbage in IL2CPPStructArray<T> #86

Kein opened this issue Mar 21, 2022 · 1 comment

Comments

@Kein
Copy link

Kein commented Mar 21, 2022

  • Game has PlayerCharacter with property myUtilities[] (as Il2CppReferenceArray) of base type BaseUtilityComponent. Said class exposes base property myInputs which is "unhollowed" as Il2CppStructArray<INPUT> where INPUT is plain enum.
  • Original types from metadata are plain arrays.
  • I have created my custom class MyUtility and inherited from BaseUtilityComponent on mono side (bepinex plugin)
  • Upon initialization of PlayerCharacter I instantiate my custom component on mono side, add it to GameObject of PlayerCharacter and add it to myUtilities[] as well
  • Finally, I populate myInputs with custom array of INPUT enum values.
  • All these objects are created on a stack in Postfix method so they are collected eventually on mono side and I'm assuming they are copied to il2cpp domain through its boxing/unboxing.

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 as
PlayerCharacter is being remade. WasCollected returns false for the given IL2cppStructArray (sine it is referenced on il2cpp side)
Let me know if more information is needed.

@Kein
Copy link
Author

Kein commented Mar 24, 2022

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
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant