using HarmonyLib; using MIU; using System; using UnityEngine; namespace CustomCosmeticLoader.Patches { /* * Hijack the cosmetic of the marble in single player. This doesn't apply the custom texture, just swaps out the * marble with the designated marble to hijack. */ [HarmonyPatch(typeof(MarbleController), nameof(MarbleController.ApplyMyCosmetics))] internal class MarbleControllerApplyMyCosmeticsPatch { [HarmonyPostfix] static void Postfix(MarbleController __instance) { if (!Config.enabled) return; if (Config.skinNameToHijack == "*") return; // Shouldn't happen I don't think but we do this elsewhere in mp if (NetworkManager.IsMultiplayer) return; MarbleHolder mHolder = __instance.MHolder; string actualSkinId = mHolder.CosmeticSet.skin; mHolder.SetMarble(Shared.SkinToHijack); // Setting the skin id here allows others in multiplayer/replays to see your normal skin mHolder.CosmeticSet.skin = actualSkinId; } } /* * Hijack the cosmetic of the marble when watching Replays. This doesn't apply the custom texture, just swaps out * the marble with the designated marble to hijack. */ [HarmonyPatch(typeof(MarbleController), nameof(MarbleController.ApplyCosmetics))] internal class MarbleControllerApplyCosmeticsPatch { static void Postfix(MarbleController __instance, ReplayCosmetics cosmetics) { if (!Config.enabled) return; if (Config.skinNameToHijack == "*") return; if (!Config.inAllReplays) return; MarbleHolder mHolder = __instance.GetComponentInChildren(); string actualSkinId = mHolder.CosmeticSet.skin; mHolder.SetMarble(Shared.SkinToHijack); mHolder.CosmeticSet.skin = actualSkinId; } } }