Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of PlaytimeBunny ModelReplacement v0.1.2
PlaytimeBunnyModelReplacement.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Dissonance; using GameNetcodeStuff; using HarmonyLib; using ModelReplacement; using Unity.Netcode; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("ModelReplacementAPI")] [assembly: AssemblyCompany("PlaytimeBunnyModelReplacement")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("PlaytimeBunnyModelReplacement")] [assembly: AssemblyTitle("PlaytimeBunnyModelReplacement")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] public class ExpressionManager : MonoBehaviour { private enum BlinkShapes { Blink = 15, Scream = 32 } private enum SpeakShapes { Mouth = 20 } private enum voicestate { Closed, Talking, Screaming } private SkinnedMeshRenderer body; private IEnumerator blinkingInstance; private IEnumerator speakingInstance; private bool isblinking; private GameObject parent; private PlayerControllerB plrCntrB; public BodyReplacementBase bodyReplacementB; private bool isScreaming; private voicestate currentVoiceState; private bool eyeOpen = true; public bool died = false; private VoicePlayerState vps; private float requiredVolume; private IEnumerator currentBlinkState; private IEnumerator currentSpeakState; public void SetBodyReplacementB(Transform tofind) { BodyReplacementBase component = ((Component)tofind).GetComponent<BodyReplacementBase>(); bodyReplacementB = component; Awake(); } private void Awake() { if (!((Object)(object)bodyReplacementB == (Object)null)) { plrCntrB = bodyReplacementB.controller; body = ((Component)this).gameObject.GetComponent<SkinnedMeshRenderer>(); parent = ((Component)((Component)this).gameObject.transform.parent).gameObject; if (!plrCntrB.isPlayerDead && died) { died = false; OnRespawn(); } requiredVolume = 70f; } } private void OnEnable() { if ((Object)(object)bodyReplacementB == (Object)null) { return; } requiredVolume = 70f; plrCntrB = bodyReplacementB.controller; if (!plrCntrB.isPlayerDead) { if (died) { died = false; OnRespawn(); } if (blinkingInstance != null) { ((MonoBehaviour)this).StopCoroutine(blinkingInstance); } if (speakingInstance != null) { ((MonoBehaviour)this).StopCoroutine(speakingInstance); } body.SetBlendShapeWeight(15, 0f); body.SetBlendShapeWeight(32, 0f); body.SetBlendShapeWeight(20, 0f); eyeOpen = true; isblinking = false; isScreaming = false; } else if (died) { OnDeath(); } StartOfRound.Instance.RefreshPlayerVoicePlaybackObjects(); vps = plrCntrB.voicePlayerState; if (vps == null && (Object)(object)plrCntrB == (Object)(object)StartOfRound.Instance.localPlayerController) { vps = StartOfRound.Instance.voiceChatModule.FindPlayer(StartOfRound.Instance.voiceChatModule.LocalPlayerName); } } private void Update() { if ((Object)(object)plrCntrB == (Object)null) { plrCntrB = bodyReplacementB.controller; } if (!isblinking && (Object)(object)body != (Object)null && !died && !isScreaming) { isblinking = true; if (blinkingInstance != null) { ((MonoBehaviour)this).StopCoroutine(blinkingInstance); } eyeOpen = !eyeOpen; blinkingInstance = changeBlinkState(BlinkShapes.Blink, EyeStateVal(eyeOpen), blinkingInstance); ((MonoBehaviour)this).StartCoroutine(blinkingInstance); } if (plrCntrB.voicePlayerState != null) { vps = plrCntrB.voicePlayerState; if (vps.IsSpeaking) { if (voiceAmp() > requiredVolume && !isScreaming) { ((MonoBehaviour)this).StartCoroutine(ChangeScreamState(screaming: true)); } if (voiceAmp() < requiredVolume && isScreaming) { ((MonoBehaviour)this).StartCoroutine(ChangeScreamState(screaming: false)); } if (voiceAmp() > 5f && currentVoiceState != voicestate.Talking) { currentVoiceState = voicestate.Talking; if (speakingInstance != null) { ((MonoBehaviour)this).StopCoroutine(speakingInstance); } speakingInstance = changeSpeakState(SpeakShapes.Mouth, 50, speakingInstance); ((MonoBehaviour)this).StartCoroutine(speakingInstance); } if (voiceAmp() < 5f && currentVoiceState != 0) { currentVoiceState = voicestate.Closed; if (speakingInstance != null) { ((MonoBehaviour)this).StopCoroutine(speakingInstance); } speakingInstance = changeSpeakState(SpeakShapes.Mouth, 0, speakingInstance); ((MonoBehaviour)this).StartCoroutine(speakingInstance); } } } if (plrCntrB.isPlayerDead && !died) { died = true; } else if (!plrCntrB.isPlayerDead && died) { died = false; OnRespawn(); if (blinkingInstance != null) { ((MonoBehaviour)this).StopCoroutine(blinkingInstance); } if (speakingInstance != null) { ((MonoBehaviour)this).StopCoroutine(speakingInstance); } body.SetBlendShapeWeight(15, 0f); body.SetBlendShapeWeight(32, 0f); body.SetBlendShapeWeight(20, 0f); eyeOpen = true; isblinking = false; isScreaming = false; } } public void OnDeath() { ((MonoBehaviour)this).StopAllCoroutines(); GameObject replacementDeadBody = bodyReplacementB.replacementDeadBody; Plugin.Logger.LogInfo((object)replacementDeadBody); SkinnedMeshRenderer val = (from x in replacementDeadBody.GetComponentsInChildren<SkinnedMeshRenderer>() where ((Object)x).name.Contains("Body") select x).FirstOrDefault(); ((Behaviour)((Component)this).gameObject.GetComponent<ExpressionManager>()).enabled = false; val.SetBlendShapeWeight(15, 100f); val.SetBlendShapeWeight(19, 100f); } private void OnRespawn() { isblinking = false; body.SetBlendShapeWeight(15, 0f); body.SetBlendShapeWeight(19, 0f); } private IEnumerator ChangeScreamState(bool screaming) { isblinking = true; isScreaming = screaming; body.SetBlendShapeWeight(15, 0f); if (blinkingInstance != null) { ((MonoBehaviour)this).StopCoroutine(blinkingInstance); } blinkingInstance = changeBlinkState(BlinkShapes.Scream, EyeStateVal(!isScreaming), blinkingInstance, 0.03f); yield return ((MonoBehaviour)this).StartCoroutine(blinkingInstance); if (!isScreaming) { isblinking = false; } } private IEnumerator changeBlinkState(BlinkShapes state, int value, IEnumerator instance, float speed = 0.1f) { if (died) { yield break; } if (currentBlinkState != null) { ((MonoBehaviour)this).StopCoroutine(currentBlinkState); } currentBlinkState = instance; float elapsedTime = 0f; while (body.GetBlendShapeWeight((int)state) != (float)value) { elapsedTime += Time.deltaTime; float percComplete = elapsedTime / speed; float blendKey = Mathf.Lerp(body.GetBlendShapeWeight((int)state), (float)value, percComplete); body.SetBlendShapeWeight((int)state, blendKey); yield return (object)new WaitForSeconds(0.01f); } body.SetBlendShapeWeight((int)state, (float)value); yield return (object)new WaitForSeconds(0.25f); currentBlinkState = null; if (state == BlinkShapes.Blink) { if ((float)value == 0f) { yield return (object)new WaitForSeconds(Random.Range(1f, 4f)); isblinking = false; } else { isblinking = false; } } } private IEnumerator changeSpeakState(SpeakShapes state, int value, IEnumerator instance, float speed = 0.035f) { if (!died) { if (currentSpeakState != null) { ((MonoBehaviour)this).StopCoroutine(currentSpeakState); } currentSpeakState = instance; float elapsedTime = 0f; while (body.GetBlendShapeWeight((int)state) != (float)value) { elapsedTime += Time.deltaTime; float percComplete = elapsedTime / speed; float blendKey = Mathf.Lerp(body.GetBlendShapeWeight((int)state), (float)value, percComplete); body.SetBlendShapeWeight((int)state, blendKey); yield return (object)new WaitForSeconds(0.01f); } body.SetBlendShapeWeight((int)state, (float)value); currentSpeakState = null; } } private int EyeStateVal(bool state) { if (state) { return 0; } return 100; } private float voiceAmp() { return vps.Amplitude * 6.5f * 100f; } } public class UIReplacementManager : MonoBehaviour { public GameObject PlayerHud_Self; public Image selfOut; public Image selfFill; private Sprite cachedImgFill; private Sprite cachedImgOut; private bool setNew = false; private void Awake() { PlayerHud_Self = GameObject.Find("IngamePlayerHUD/TopLeftCorner"); selfFill = ((Component)PlayerHud_Self.transform.Find("SelfRed")).GetComponent<Image>(); selfOut = ((Component)PlayerHud_Self.transform.Find("Self")).GetComponent<Image>(); setNew = false; } private void OnEnable() { if (!setNew) { cachedImgFill = selfFill.sprite; cachedImgOut = selfOut.sprite; selfOut.sprite = Assets.MainAssetBundle.LoadAsset<Sprite>("BunBoyFillOut.png"); selfFill.sprite = Assets.MainAssetBundle.LoadAsset<Sprite>("BunBoyFillIn.png"); setNew = true; } } private void OnDisable() { setNew = false; selfOut.sprite = cachedImgOut; selfFill.sprite = cachedImgFill; } } namespace ModelReplacement { public class MRPLAYTIMEBUNNYALL : BodyReplacementBase { private ExpressionManager EM; public override GameObject LoadAssetsAndReturnModel() { string text = "PlaytimeBunnyAll"; return Assets.MainAssetBundle.LoadAsset<GameObject>(text); } public override void AddModelScripts() { PlayerControllerB component = ((Component)this).gameObject.GetComponent<PlayerControllerB>(); Transform val = ((IEnumerable<Transform>)base.replacementModel.GetComponentsInChildren<Transform>()).FirstOrDefault((Func<Transform, bool>)((Transform x) => ((Object)x).name.Contains("Body"))); if (!Object.op_Implicit((Object)(object)((Component)val).gameObject.GetComponent<ExpressionManager>()) != Object.op_Implicit((Object)null)) { ExpressionManager expressionManager = ((Component)val).gameObject.AddComponent<ExpressionManager>(); expressionManager.SetBodyReplacementB(((Component)this).gameObject.transform); EM = expressionManager; } if ((Object)(object)component == (Object)(object)StartOfRound.Instance.localPlayerController && (Object)(object)((Component)val.parent).GetComponent<UIReplacementManager>() == (Object)null && ((NetworkBehaviour)component).IsOwner) { UIReplacementManager uIReplacementManager = ((Component)val.parent).gameObject.AddComponent<UIReplacementManager>(); } } } public class MRPLAYTIMEBUNNYMAKEUPNOACC : BodyReplacementBase { private ExpressionManager EM; public override GameObject LoadAssetsAndReturnModel() { string text = "PlaytimeBunnyMakeUpNoAcc"; return Assets.MainAssetBundle.LoadAsset<GameObject>(text); } public override void AddModelScripts() { PlayerControllerB component = ((Component)this).gameObject.GetComponent<PlayerControllerB>(); Transform val = ((IEnumerable<Transform>)base.replacementModel.GetComponentsInChildren<Transform>()).FirstOrDefault((Func<Transform, bool>)((Transform x) => ((Object)x).name.Contains("Body"))); if (!Object.op_Implicit((Object)(object)((Component)val).gameObject.GetComponent<ExpressionManager>()) != Object.op_Implicit((Object)null)) { ExpressionManager expressionManager = ((Component)val).gameObject.AddComponent<ExpressionManager>(); expressionManager.SetBodyReplacementB(((Component)this).gameObject.transform); EM = expressionManager; } if ((Object)(object)component == (Object)(object)StartOfRound.Instance.localPlayerController && (Object)(object)((Component)val.parent).GetComponent<UIReplacementManager>() == (Object)null && ((NetworkBehaviour)component).IsOwner) { UIReplacementManager uIReplacementManager = ((Component)val.parent).gameObject.AddComponent<UIReplacementManager>(); } } } public class MRPLAYTIMEBUNNYACCNOMAKEUP : BodyReplacementBase { private ExpressionManager EM; public override GameObject LoadAssetsAndReturnModel() { string text = "PlaytimeBunnyAccNoMakeUp"; return Assets.MainAssetBundle.LoadAsset<GameObject>(text); } public override void AddModelScripts() { PlayerControllerB component = ((Component)this).gameObject.GetComponent<PlayerControllerB>(); Transform val = ((IEnumerable<Transform>)base.replacementModel.GetComponentsInChildren<Transform>()).FirstOrDefault((Func<Transform, bool>)((Transform x) => ((Object)x).name.Contains("Body"))); if (!Object.op_Implicit((Object)(object)((Component)val).gameObject.GetComponent<ExpressionManager>()) != Object.op_Implicit((Object)null)) { ExpressionManager expressionManager = ((Component)val).gameObject.AddComponent<ExpressionManager>(); expressionManager.SetBodyReplacementB(((Component)this).gameObject.transform); EM = expressionManager; } if ((Object)(object)component == (Object)(object)StartOfRound.Instance.localPlayerController && (Object)(object)((Component)val.parent).GetComponent<UIReplacementManager>() == (Object)null && ((NetworkBehaviour)component).IsOwner) { UIReplacementManager uIReplacementManager = ((Component)val.parent).gameObject.AddComponent<UIReplacementManager>(); } } } public class MRPLAYTIMEBUNNYNOACCNOMAKEUP : BodyReplacementBase { private ExpressionManager EM; public override GameObject LoadAssetsAndReturnModel() { string text = "PlaytimeBunnyNoAccNoMakeup"; return Assets.MainAssetBundle.LoadAsset<GameObject>(text); } public override void AddModelScripts() { PlayerControllerB component = ((Component)this).gameObject.GetComponent<PlayerControllerB>(); Transform val = ((IEnumerable<Transform>)base.replacementModel.GetComponentsInChildren<Transform>()).FirstOrDefault((Func<Transform, bool>)((Transform x) => ((Object)x).name.Contains("Body"))); if (!Object.op_Implicit((Object)(object)((Component)val).gameObject.GetComponent<ExpressionManager>()) != Object.op_Implicit((Object)null)) { ExpressionManager expressionManager = ((Component)val).gameObject.AddComponent<ExpressionManager>(); expressionManager.SetBodyReplacementB(((Component)this).gameObject.transform); EM = expressionManager; } if ((Object)(object)component == (Object)(object)StartOfRound.Instance.localPlayerController && (Object)(object)((Component)val.parent).GetComponent<UIReplacementManager>() == (Object)null && ((NetworkBehaviour)component).IsOwner) { UIReplacementManager uIReplacementManager = ((Component)val.parent).gameObject.AddComponent<UIReplacementManager>(); } } } [BepInPlugin("com.local.moddingcompany.playtimebunnymodelreplacement", "PlaytimeBunny_ModelReplacement", "0.1.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Logger; private void Awake() { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown Assets.PopulateAssets(); ModelReplacementAPI.RegisterSuitModelReplacement("PlaytimeBunnyAccNoMakeUp", typeof(MRPLAYTIMEBUNNYACCNOMAKEUP)); ModelReplacementAPI.RegisterSuitModelReplacement("PlaytimeBunnyAll", typeof(MRPLAYTIMEBUNNYALL)); ModelReplacementAPI.RegisterSuitModelReplacement("PlaytimeBunnyMakeUpNoAcc", typeof(MRPLAYTIMEBUNNYMAKEUPNOACC)); ModelReplacementAPI.RegisterSuitModelReplacement("PlaytimeBunnyNoAccNoMakeUp", typeof(MRPLAYTIMEBUNNYNOACCNOMAKEUP)); Harmony val = new Harmony("com.local.moddingcompany.playtimebunnymodelreplacement"); val.PatchAll(); Logger.LogInfo((object)"Plugin com.local.moddingcompany.playtimebunnymodelreplacement is loaded!"); } } public static class Assets { public static string mainAssetBundleName = "playtimebunnyassets"; public static AssetBundle MainAssetBundle = null; private static string GetAssemblyName() { return Assembly.GetExecutingAssembly().GetName().Name.Replace(" ", "_"); } public static void PopulateAssets() { if ((Object)(object)MainAssetBundle == (Object)null) { Console.WriteLine(GetAssemblyName() + "." + mainAssetBundleName); using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetAssemblyName() + "." + mainAssetBundleName); MainAssetBundle = AssetBundle.LoadFromStream(stream); } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }