using System; 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 = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: AssemblyCompany("Gexpie Model")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Gexpie Model")] [assembly: AssemblyTitle("Gexpie Model")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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] [Microsoft.CodeAnalysis.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 MRGEXPIESCARFMINDWIPED : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "Gexpie Scarf Mindwiped"; return Assets.MainAssetBundle.LoadAsset(text); } protected override void AddModelScripts() { BlendShapeLipSync blendShapeLipSync = base.replacementModel.AddComponent(); blendShapeLipSync.player = ((BodyReplacementBase)this).controller; DeathEyeClose deathEyeClose = base.replacementModel.AddComponent(); deathEyeClose.player = ((BodyReplacementBase)this).controller; } } public class MRGEXPIEHOODIE : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "Gexpie Hoodie"; return Assets.MainAssetBundle.LoadAsset(text); } protected override void AddModelScripts() { BlendShapeLipSync blendShapeLipSync = base.replacementModel.AddComponent(); blendShapeLipSync.player = ((BodyReplacementBase)this).controller; DeathEyeClose deathEyeClose = base.replacementModel.AddComponent(); deathEyeClose.player = ((BodyReplacementBase)this).controller; } } public class MRGEXPIELIMBWRAPLEGPOUCH : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "Gexpie Limbwrap Legpouch"; return Assets.MainAssetBundle.LoadAsset(text); } protected override void AddModelScripts() { BlendShapeLipSync blendShapeLipSync = base.replacementModel.AddComponent(); blendShapeLipSync.player = ((BodyReplacementBase)this).controller; DeathEyeClose deathEyeClose = base.replacementModel.AddComponent(); deathEyeClose.player = ((BodyReplacementBase)this).controller; } } public class MRGEXPIENORMAL : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "Gexpie Normal"; return Assets.MainAssetBundle.LoadAsset(text); } protected override void AddModelScripts() { BlendShapeLipSync blendShapeLipSync = base.replacementModel.AddComponent(); blendShapeLipSync.player = ((BodyReplacementBase)this).controller; DeathEyeClose deathEyeClose = base.replacementModel.AddComponent(); deathEyeClose.player = ((BodyReplacementBase)this).controller; } } public class MRGEXPIESCARF : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "Gexpie Scarf"; return Assets.MainAssetBundle.LoadAsset(text); } protected override void AddModelScripts() { BlendShapeLipSync blendShapeLipSync = base.replacementModel.AddComponent(); blendShapeLipSync.player = ((BodyReplacementBase)this).controller; DeathEyeClose deathEyeClose = base.replacementModel.AddComponent(); deathEyeClose.player = ((BodyReplacementBase)this).controller; } } public class MRGEXPIESCARFHAPPY : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "Gexpie Scarf Happy"; return Assets.MainAssetBundle.LoadAsset(text); } protected override void AddModelScripts() { BlendShapeLipSync blendShapeLipSync = base.replacementModel.AddComponent(); blendShapeLipSync.player = ((BodyReplacementBase)this).controller; DeathEyeClose deathEyeClose = base.replacementModel.AddComponent(); deathEyeClose.player = ((BodyReplacementBase)this).controller; } } public class BlendShapeLipSync : MonoBehaviour { public PlayerControllerB player; public SkinnedMeshRenderer faceRenderer; public string blendShapeName = "Mouth open"; public float smoothSpeed = 12f; private VoicePlayerState voice; private int mouthOpenIndex; private float currentWeight; public float sensitivity => Plugin.voiceSensitivity.Value; private void Start() { faceRenderer = ((Component)this).GetComponentInChildren(); SkinnedMeshRenderer[] componentsInChildren = ((Component)this).GetComponentsInChildren(); SkinnedMeshRenderer[] array = componentsInChildren; foreach (SkinnedMeshRenderer val in array) { if (!((Object)(object)val.sharedMesh == (Object)null) && val.sharedMesh.GetBlendShapeIndex("Mouth open") != -1) { faceRenderer = val; break; } } if ((Object)(object)faceRenderer == (Object)null) { Debug.LogError((object)"Cant find SkinnedMeshRenderer!"); return; } if ((Object)(object)faceRenderer.sharedMesh == (Object)null) { Debug.LogError((object)"SkinnedMeshRenderer has no Mesh!"); return; } mouthOpenIndex = faceRenderer.sharedMesh.GetBlendShapeIndex(blendShapeName); if (mouthOpenIndex == -1) { Debug.LogError((object)("Cant find BlendShape: " + blendShapeName)); return; } Debug.Log((object)"Found MouthOpen BlendShape!"); InitVoice(); } private void Update() { if ((Object)(object)player == (Object)null || (Object)(object)faceRenderer == (Object)null) { return; } if (voice == null) { InitVoice(); return; } float num = 0f; if (voice.IsSpeaking && !player.isPlayerDead) { num = Mathf.Clamp01(voice.Amplitude * sensitivity) * 100f; } currentWeight = Mathf.Lerp(currentWeight, num, Time.deltaTime * smoothSpeed); faceRenderer.SetBlendShapeWeight(mouthOpenIndex, currentWeight); } private void InitVoice() { if (!((Object)(object)StartOfRound.Instance == (Object)null)) { StartOfRound.Instance.RefreshPlayerVoicePlaybackObjects(); voice = player.voicePlayerState; if (voice == null && (Object)(object)player == (Object)(object)StartOfRound.Instance.localPlayerController) { voice = StartOfRound.Instance.voiceChatModule.FindPlayer(StartOfRound.Instance.voiceChatModule.LocalPlayerName); } } } } public class DeathEyeClose : MonoBehaviour { public PlayerControllerB player; private SkinnedMeshRenderer faceRenderer; private int leftEyeIndex; private int rightEyeIndex; private bool wasDead = false; private void Start() { faceRenderer = ((Component)this).GetComponentInChildren(); SkinnedMeshRenderer[] componentsInChildren = ((Component)this).GetComponentsInChildren(); SkinnedMeshRenderer[] array = componentsInChildren; foreach (SkinnedMeshRenderer val in array) { if (!((Object)(object)val.sharedMesh == (Object)null) && val.sharedMesh.GetBlendShapeIndex("L.Eye close") != -1) { faceRenderer = val; break; } } if ((Object)(object)faceRenderer == (Object)null) { Debug.LogError((object)"Cant find SkinnedMeshRenderer!"); return; } leftEyeIndex = faceRenderer.sharedMesh.GetBlendShapeIndex("L.Eye close"); rightEyeIndex = faceRenderer.sharedMesh.GetBlendShapeIndex("R.Eye close"); if (leftEyeIndex == -1) { Debug.LogError((object)"Cant find L.Eye close"); } if (rightEyeIndex == -1) { Debug.LogError((object)"Cant find R.Eye close"); } } private void Update() { if (!((Object)(object)player == (Object)null)) { bool isPlayerDead = player.isPlayerDead; if (isPlayerDead && !wasDead) { CloseEyes(); } if (!isPlayerDead && wasDead) { OpenEyes(); } wasDead = isPlayerDead; } } private void CloseEyes() { if (leftEyeIndex != -1) { faceRenderer.SetBlendShapeWeight(leftEyeIndex, 100f); } if (rightEyeIndex != -1) { faceRenderer.SetBlendShapeWeight(rightEyeIndex, 100f); } Debug.Log((object)"player's dead, eyes closed"); } private void OpenEyes() { if (leftEyeIndex != -1) { faceRenderer.SetBlendShapeWeight(leftEyeIndex, 0f); } if (rightEyeIndex != -1) { faceRenderer.SetBlendShapeWeight(rightEyeIndex, 0f); } Debug.Log((object)"player's revived, eyes opened"); } } [BepInPlugin("com.Nullah.Geckoexpie", "Gexpie Model", "1.0.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; } public static ConfigEntry voiceSensitivity { get; private set; } private static void InitConfig() { voiceSensitivity = config.Bind("Animation", "Voice Sensitivity", 100f, "Detection Sensitivity for mouth animation when talking."); 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", "gexpie normal", "Enter a comma separated list of suit names.(Additionally, [Green suit,Pajama suit,Hazard suit])"); } private void Awake() { //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Expected O, but got Unknown config = ((BaseUnityPlugin)this).Config; InitConfig(); Assets.PopulateAssets(); if (enableModelForAllSuits.Value) { ModelReplacementAPI.RegisterModelReplacementOverride(typeof(MRGEXPIENORMAL)); } if (enableModelAsDefault.Value) { ModelReplacementAPI.RegisterModelReplacementDefault(typeof(MRGEXPIENORMAL)); } string[] array = suitNamesToEnableModel.Value.Split(','); string[] array2 = array; foreach (string text in array2) { ModelReplacementAPI.RegisterSuitModelReplacement(text, typeof(MRGEXPIENORMAL)); } ModelReplacementAPI.RegisterSuitModelReplacement("gexpie scarf mindwiped", typeof(MRGEXPIESCARFMINDWIPED)); ModelReplacementAPI.RegisterSuitModelReplacement("gexpie hoodie", typeof(MRGEXPIEHOODIE)); ModelReplacementAPI.RegisterSuitModelReplacement("gexpie limbwrap legpouch", typeof(MRGEXPIELIMBWRAPLEGPOUCH)); ModelReplacementAPI.RegisterSuitModelReplacement("gexpie scarf", typeof(MRGEXPIESCARF)); ModelReplacementAPI.RegisterSuitModelReplacement("gexpie scarf happy", typeof(MRGEXPIESCARFHAPPY)); Harmony val = new Harmony("com.Nullah.Geckoexpie"); val.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin com.Nullah.Geckoexpie is loaded!"); } } public static class Assets { public static string mainAssetBundleName = "gexpiebundle"; 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) { } } }