Decompiled source of PlaytimeBunny ModelReplacement v0.1.2

PlaytimeBunnyModelReplacement.dll

Decompiled a week ago
using 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)
		{
		}
	}
}