miuu-custom-cosmetic-loader/Patches/MarbleControllerPatches.cs

60 lines
1.7 KiB
C#

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<MarbleHolder>();
string actualSkinId = mHolder.CosmeticSet.skin;
mHolder.SetMarble(Shared.SkinToHijack);
mHolder.CosmeticSet.skin = actualSkinId;
}
}
}