using System; using System.Collections.Generic; 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 Unity.Netcode; 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] [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 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; DogHurtAudio dogHurtAudio = base.replacementModel.AddComponent(); dogHurtAudio.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; DogHurtAudio dogHurtAudio = base.replacementModel.AddComponent(); dogHurtAudio.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; DogHurtAudio dogHurtAudio = base.replacementModel.AddComponent(); dogHurtAudio.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; DogHurtAudio dogHurtAudio = base.replacementModel.AddComponent(); dogHurtAudio.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; DogHurtAudio dogHurtAudio = base.replacementModel.AddComponent(); dogHurtAudio.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; DogHurtAudio dogHurtAudio = base.replacementModel.AddComponent(); dogHurtAudio.player = ((BodyReplacementBase)this).controller; } } public class MRGEXPIEALBINO : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "Gexpie Albino"; 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; DogHurtAudio dogHurtAudio = base.replacementModel.AddComponent(); dogHurtAudio.player = ((BodyReplacementBase)this).controller; } } public class MRGEXPIEALBINOSCARF : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "Gexpie Albino 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; DogHurtAudio dogHurtAudio = base.replacementModel.AddComponent(); dogHurtAudio.player = ((BodyReplacementBase)this).controller; } } public class MRGEXPIEALBINOCLOTHWSCARF : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "Gexpie Albino Cloth W 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; DogHurtAudio dogHurtAudio = base.replacementModel.AddComponent(); dogHurtAudio.player = ((BodyReplacementBase)this).controller; } } public class MRGEXPIESCARFTAILBANDAGE : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "Gexpie Scarf Tailbandage"; 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; DogHurtAudio dogHurtAudio = base.replacementModel.AddComponent(); dogHurtAudio.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"); } } public class DogHurtAudio : MonoBehaviour { public PlayerControllerB player; private bool wasUpdated = false; private bool wasDead = false; private float lastPlayTime = -999f; public float hurtCooldown = 1f; public static Dictionary Instances = new Dictionary(); public static List hurtClips = new List(); private AudioSource audioSource; private void Start() { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) if (((Object)((Component)this).gameObject).name.Contains("ViewModel") || ((Object)((Component)this).gameObject).name.Contains("Shadow")) { Debug.Log((object)"Skipped registered"); return; } GameObject val = new GameObject("DogHurtAudio"); val.transform.SetParent(((Component)player).transform, false); val.transform.localPosition = Vector3.zero; audioSource = val.AddComponent(); Debug.Log((object)"AudioSource Created"); audioSource.spatialBlend = 0f; audioSource.rolloffMode = (AudioRolloffMode)1; audioSource.maxDistance = 18f; audioSource.minDistance = 1f; if (hurtClips.Count == 0) { LoadAudioClips(); } if ((Object)(object)player != (Object)null) { Instances[player.playerClientId] = this; Debug.Log((object)("Registered DogHurtAudio for " + player.playerClientId)); } else { Debug.LogError((object)"DogHurtAudio player NULL"); } } private void Update() { //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Expected O, but got Unknown //IL_00f2: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)player == (Object)null) { return; } if (player.isPlayerDead && !wasDead) { wasUpdated = false; wasDead = player.isPlayerDead; } if (!player.isPlayerDead && wasDead && !wasUpdated) { wasDead = player.isPlayerDead; if (!((Object)((Component)this).gameObject).name.Contains("ViewModel") && !((Object)((Component)this).gameObject).name.Contains("Shadow")) { GameObject val = new GameObject("DogHurtAudio"); val.transform.SetParent(((Component)player).transform, false); val.transform.localPosition = Vector3.zero; audioSource = val.AddComponent(); Debug.Log((object)"AudioSource Created"); audioSource.spatialBlend = 0f; audioSource.rolloffMode = (AudioRolloffMode)1; audioSource.maxDistance = 18f; audioSource.minDistance = 1f; Instances[player.playerClientId] = this; wasUpdated = true; Debug.Log((object)("Registered DogHurtAudio for " + player.playerClientId)); } } } public void PlayHurt(int index) { if (!(Time.time - lastPlayTime < hurtCooldown)) { lastPlayTime = Time.time; if (index >= 0 && index < hurtClips.Count) { audioSource.clip = hurtClips[index]; audioSource.volume = 1f; audioSource.Play(); } } } private void LoadAudioClips() { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string text = Path.Combine(directoryName, "Audio"); if (!Directory.Exists(text)) { Debug.LogError((object)("Audio folder missing: " + text)); return; } string[] files = Directory.GetFiles(text, "*.wav"); string[] array = files; foreach (string text2 in array) { WWW val = new WWW("file://" + text2); while (!val.isDone) { } AudioClip audioClip = val.GetAudioClip(); if ((Object)(object)audioClip != (Object)null) { hurtClips.Add(audioClip); Debug.Log((object)("Loaded hurt audio: " + text2)); } } } private void OnDestroy() { if (!((Object)(object)player == (Object)null)) { ulong playerClientId = player.playerClientId; if (Instances.TryGetValue(playerClientId, out DogHurtAudio value) && (Object)(object)value == (Object)(object)this) { Instances.Remove(playerClientId); } } } } [HarmonyPatch(typeof(PlayerControllerB))] public class DamagePatch { [HarmonyPatch("DamagePlayer")] [HarmonyPostfix] private static void OnDamagePlayer(PlayerControllerB __instance) { if (!((Object)(object)__instance == (Object)null) && !__instance.isPlayerDead && DogHurtAudio.hurtClips.Count != 0) { int clipIndex = Random.Range(0, DogHurtAudio.hurtClips.Count); DogHurtAudio value = null; bool flag = DogHurtAudio.Instances.TryGetValue(__instance.playerClientId, out value); DogHurtAudio.Instances.TryGetValue(__instance.playerClientId, out value); if ((Object)(object)value != (Object)null) { Debug.Log((object)"PLAY HURT SOUND"); DogNetworker.Instance.RequestPlayHurtServerRpc(__instance.playerClientId, clipIndex); } else { Debug.Log((object)"DogHurtAudio NOT FOUND"); } } } } public class DogNetworker : NetworkBehaviour { public static DogNetworker Instance; private void Awake() { Instance = this; } [ServerRpc(RequireOwnership = false)] public void RequestPlayHurtServerRpc(ulong playerId, int clipIndex) { PlayHurtClientRpc(playerId, clipIndex); } [ClientRpc] public void PlayHurtClientRpc(ulong playerId, int clipIndex) { PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[playerId]; if (!((Object)(object)val == (Object)null)) { DogHurtAudio value = null; DogHurtAudio.Instances.TryGetValue(playerId, out value); if ((Object)(object)value == (Object)null) { Debug.Log((object)"No DogHurtAudio"); } else { value.PlayHurt(clipIndex); } } } } [BepInPlugin("com.Nullah.Geckoexpie", "Gexpie Model", "1.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public static ConfigFile config; public static AudioClip[] HurtClips; 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. Something between from 50 to 150"); 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_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0165: 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)); ModelReplacementAPI.RegisterSuitModelReplacement("gexpie albino", typeof(MRGEXPIEALBINO)); ModelReplacementAPI.RegisterSuitModelReplacement("gexpie albino scarf", typeof(MRGEXPIEALBINOSCARF)); ModelReplacementAPI.RegisterSuitModelReplacement("gexpie albino cloth w scarf", typeof(MRGEXPIEALBINOCLOTHWSCARF)); ModelReplacementAPI.RegisterSuitModelReplacement("gexpie scarf tailbandage", typeof(MRGEXPIESCARFTAILBANDAGE)); 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); } } } [HarmonyPatch(typeof(StartOfRound))] internal class StartOfRoundPatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void AwakePostfix(StartOfRound __instance) { if ((Object)(object)((Component)__instance).GetComponent() == (Object)null) { ((Component)__instance).gameObject.AddComponent(); Debug.Log((object)"DogNetworker Added To StartOfRound"); } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }