using System; using System.Collections; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using Dissonance; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [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 = "")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: AssemblyCompany("LastTry")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("LastTry")] [assembly: AssemblyTitle("LastTry")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace ModelReplacement { public class MRCUTIE : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "cutie"; return Assets.MainAssetBundle.LoadAsset(text); } protected override void AddModelScripts() { ((BodyReplacementBase)this).AddModelScripts(); if ((Object)(object)base.replacementModel == (Object)null) { return; } Transform val = base.replacementModel.transform.Find("Body.dmx"); if ((Object)(object)val != (Object)null) { if ((Object)(object)((Component)val).gameObject.GetComponent() == (Object)null) { AutoBlink autoBlink = ((Component)val).gameObject.AddComponent(); autoBlink.faceMesh = ((Component)val).GetComponent(); } if ((Object)(object)((Component)val).gameObject.GetComponent() == (Object)null) { VoiceMouth voiceMouth = ((Component)val).gameObject.AddComponent(); voiceMouth.faceMesh = ((Component)val).GetComponent(); if ((Object)(object)((BodyReplacementBase)this).controller != (Object)null) { voiceMouth.Setup(((BodyReplacementBase)this).controller); Debug.Log((object)"[BoyKisserForever] VoiceMouth injected into MRCUTIE!"); } } } else { Debug.LogWarning((object)"[BoyKisserForever] Could not find 'Body.dmx' inside MRCUTIE hierarchy!"); } } } public class MRCUTIE_ : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "cutie"; return Assets.MainAssetBundle.LoadAsset(text); } protected override void AddModelScripts() { ((BodyReplacementBase)this).AddModelScripts(); if ((Object)(object)base.replacementModel == (Object)null) { return; } Transform val = base.replacementModel.transform.Find("Body.dmx"); if ((Object)(object)val != (Object)null) { if ((Object)(object)((Component)val).gameObject.GetComponent() == (Object)null) { AutoBlink autoBlink = ((Component)val).gameObject.AddComponent(); autoBlink.faceMesh = ((Component)val).GetComponent(); } if ((Object)(object)((Component)val).gameObject.GetComponent() == (Object)null) { VoiceMouth voiceMouth = ((Component)val).gameObject.AddComponent(); voiceMouth.faceMesh = ((Component)val).GetComponent(); if ((Object)(object)((BodyReplacementBase)this).controller != (Object)null) { voiceMouth.Setup(((BodyReplacementBase)this).controller); Debug.Log((object)"[BoyKisserForever] VoiceMouth injected into MRCUTIE_!"); } } } else { Debug.LogWarning((object)"[BoyKisserForever] Could not find 'Body.dmx' inside MRCUTIE_ hierarchy!"); } } } public class VoiceMouth : MonoBehaviour { public SkinnedMeshRenderer faceMesh; private int aaBlendShapeIndex = -1; private PlayerControllerB targetPlayer; private VoicePlayerState voiceState; private AudioSource remoteAudioSource; private float[] audioSamples = new float[128]; [Header("Voice Settings")] public float voiceSensitivity = 20f; public float remoteSensitivityMultiplier = 1.5f; [Header("Noise Gate")] public float noiseThreshold = 0.005f; private float nextVoiceRetryTime = 0f; private bool hasLoggedNull = false; private bool hasLoggedFound = false; public void Setup(PlayerControllerB player) { targetPlayer = player; RefreshVoiceProperty(); } private void Awake() { if ((Object)(object)faceMesh == (Object)null) { faceMesh = ((Component)this).GetComponent(); } if ((Object)(object)faceMesh != (Object)null) { aaBlendShapeIndex = faceMesh.sharedMesh.GetBlendShapeIndex("AA"); if (aaBlendShapeIndex == -1) { Debug.LogWarning((object)"[BoyKisserForever] Missing 'AA' mouth blendshape!"); } } } private void RefreshVoiceProperty() { if ((Object)(object)targetPlayer == (Object)null) { return; } if (targetPlayer.voicePlayerState != null) { voiceState = targetPlayer.voicePlayerState; if (!hasLoggedFound) { Debug.Log((object)("[BoyKisserForever] Got voiceState from PlayerControllerB for " + targetPlayer.playerUsername + ": " + voiceState.Name)); hasLoggedFound = true; hasLoggedNull = false; } } else if (voiceState != null) { if (!hasLoggedFound) { Debug.Log((object)("[BoyKisserForever] Found voiceState (fallback) for " + targetPlayer.playerUsername + ": " + voiceState.Name)); hasLoggedFound = true; hasLoggedNull = false; } } else if (!hasLoggedNull) { Debug.Log((object)$"[BoyKisserForever] No voiceState yet for {targetPlayer.playerUsername} (steamId={targetPlayer.playerSteamId}, clientId={targetPlayer.actualClientId}); will retry"); hasLoggedNull = true; } } private void Update() { if (!((Object)(object)faceMesh == (Object)null) && aaBlendShapeIndex != -1 && !((Object)(object)targetPlayer == (Object)null)) { if (Time.time >= nextVoiceRetryTime) { RefreshVoiceProperty(); nextVoiceRetryTime = Time.time + 1f; } if (voiceState != null) { float num = ((voiceState.IsSpeaking && !targetPlayer.isPlayerDead) ? voiceState.Amplitude : 0f); float blendShapeWeight = faceMesh.GetBlendShapeWeight(aaBlendShapeIndex); float num2 = ((num > noiseThreshold) ? Mathf.Clamp(num * voiceSensitivity * 100f, 0f, 100f) : 0f); faceMesh.SetBlendShapeWeight(aaBlendShapeIndex, Mathf.MoveTowards(blendShapeWeight, num2, Time.deltaTime * 400f)); } } } } [BepInPlugin("com.Lewden.yes", "BoyKisserForever", "0.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public static ConfigFile config; public static ConfigEntry enableModelForAllSuits { get; private set; } public static ConfigEntry enableModelAsDefault { get; private set; } public static ConfigEntry suitNamesToEnableModel { get; private set; } private static void InitConfig() { enableModelForAllSuits = config.Bind("Suits to Replace Settings", "Enable Model for all Suits", false, "Enable to model replace every suit. Set to false to specify suits"); enableModelAsDefault = config.Bind("Suits to Replace Settings", "Enable Model as default", false, "Enable to model replace every suit that hasn't been otherwise registered."); suitNamesToEnableModel = config.Bind("Suits to Replace Settings", "Suits to enable Model for", "Default,Orange suit", "Enter a comma separated list of suit names.(Additionally, [Green suit,Pajama suit,Hazard suit])"); } private void Awake() { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Expected O, but got Unknown config = ((BaseUnityPlugin)this).Config; InitConfig(); Assets.PopulateAssets(); if (enableModelForAllSuits.Value) { ModelReplacementAPI.RegisterModelReplacementOverride(typeof(MRCUTIE)); } if (enableModelAsDefault.Value) { ModelReplacementAPI.RegisterModelReplacementDefault(typeof(MRCUTIE)); } string[] array = suitNamesToEnableModel.Value.Split(','); string[] array2 = array; foreach (string text in array2) { ModelReplacementAPI.RegisterSuitModelReplacement(text, typeof(MRCUTIE)); } Harmony val = new Harmony("com.Lewden.yes"); val.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin com.Lewden.yes is loaded!"); } } public static class Assets { public static string mainAssetBundleName = "templatebundle"; 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); } } } public class AutoBlink : MonoBehaviour { public SkinnedMeshRenderer faceMesh; private int leftEyeIndex; private int rightEyeIndex; [Header("Blink settings")] public float minBlinkInterval = 2f; public float maxBlinkInterval = 5f; public float blinkSpeed = 0.05f; private void Awake() { faceMesh = faceMesh ?? ((Component)this).GetComponent(); leftEyeIndex = faceMesh.sharedMesh.GetBlendShapeIndex("EyesClosed.L"); rightEyeIndex = faceMesh.sharedMesh.GetBlendShapeIndex("EyesClosed.R"); if (leftEyeIndex == -1) { Debug.LogWarning((object)"Could not find EyesClosed.L"); } if (rightEyeIndex == -1) { Debug.LogWarning((object)"Could not find EyesClosed.R"); } } private void Start() { ((MonoBehaviour)this).StartCoroutine(BlinkRoutine()); } private IEnumerator BlinkRoutine() { while (true) { yield return (object)new WaitForSeconds(Random.Range(minBlinkInterval, maxBlinkInterval)); for (float t = 0f; t < 1f; t += blinkSpeed) { float weight = Mathf.Lerp(0f, 100f, t); if (leftEyeIndex != -1) { faceMesh.SetBlendShapeWeight(leftEyeIndex, weight); } if (rightEyeIndex != -1) { faceMesh.SetBlendShapeWeight(rightEyeIndex, weight); } yield return null; } yield return (object)new WaitForSeconds(Random.Range(0.08f, 0.12f)); for (float t2 = 0f; t2 < 1f; t2 += blinkSpeed) { float weight2 = Mathf.Lerp(100f, 0f, t2); if (leftEyeIndex != -1) { faceMesh.SetBlendShapeWeight(leftEyeIndex, weight2); } if (rightEyeIndex != -1) { faceMesh.SetBlendShapeWeight(rightEyeIndex, weight2); } yield return null; } } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }