internal static void Prefix(HeroUpgradeDetails __instance, string heroIdToUse)
        {
            var heroSprites    = __instance.heroSprites;
            var newHeroSprites = new Il2CppReferenceArray <HeroFontMaterial>(heroSprites.Length + 1);

            for (var i = 0; i < heroSprites.Count; i++)
            {
                var heroFontMaterial = heroSprites[i];
                if (heroFontMaterial.name != heroIdToUse)
                {
                    newHeroSprites[i] = heroFontMaterial;
                }
                else
                {
                    return;
                }
            }

            var nameMaterial = newHeroSprites[0].heroNameMaterial;

            if (ModTowerHelper.ModTowerCache.TryGetValue(heroIdToUse, out var tower) && tower is ModHero modHero &&
                heroSprites.FirstOrDefault(material => material.name == modHero.NameStyle) is HeroFontMaterial materal)
            {
                nameMaterial = materal.heroNameMaterial;
            }

            newHeroSprites[heroSprites.Length] = new HeroFontMaterial
            {
                name             = heroIdToUse,
                heroNameMaterial = nameMaterial
            };

            __instance.heroSprites = newHeroSprites;
        }
        internal static void Postfix(HeroUpgradeDetails __instance, string heroIdToUse)
        {
            if (ModTowerHelper.ModTowerCache.TryGetValue(heroIdToUse, out var tower) && tower is ModHero modHero)
            {
                for (var i = 0; i < __instance.heroUpgrades.Length; i++)
                {
                    __instance.heroUpgrades[i].gameObject.SetActive(i < modHero.MaxLevel);
                }

                for (var i = 0; i < __instance.abilityPanels.Length; i++)
                {
                    __instance.abilityPanels[i].gameObject.SetActive(i < modHero.Abilities);
                }
            }
        }