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 SCP173CoilheadSFX v1.3.1
BepInEx/plugins/SCP173/SCP_173.dll
Decompiled 2 years agousing 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 BepInEx.Logging; 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(".NETFramework,Version=v4.6", FrameworkDisplayName = "")] [assembly: AssemblyCompany("SCP_173")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("SCP173 mod")] [assembly: AssemblyFileVersion("1.3.1.0")] [assembly: AssemblyInformationalVersion("1.3.1")] [assembly: AssemblyProduct("SCP_173")] [assembly: AssemblyTitle("SCP_173")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.3.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace SCP_173 { [BepInPlugin("raydenoir.SCP_173", "SCP_173", "1.3.1")] public class Plugin : BaseUnityPlugin { public static ManualLogSource Logging; public static string PluginDirectory; public static ConfigEntry<int> VarietyChance; public static ConfigEntry<bool> EnableDefaultMovementSounds; public static ConfigEntry<bool> EnableDefaultSpringSounds; public static AudioClip[] ScareSounds; public static AudioClip Concrete; public static GameObject Scp173Model; public static AssetBundle Bundle; private void Awake() { Logging = ((BaseUnityPlugin)this).Logger; PluginDirectory = ((BaseUnityPlugin)this).Info.Location; EnableDefaultMovementSounds = ((BaseUnityPlugin)this).Config.Bind<bool>("Sounds", "EnableDefaultMovementSounds", false, "true/false: If set to false, enables concrete grinding sounds instead of default Coilhead steps."); EnableDefaultSpringSounds = ((BaseUnityPlugin)this).Config.Bind<bool>("Sounds", "EnableDefaultSpringSounds", false, "true/false: If set to false, enables scare sounds on SCP-173 appearance instead of default spring noises."); VarietyChance = ((BaseUnityPlugin)this).Config.Bind<int>("Variety", "VarietyChance", 100, "Integer number from 0 to 100 inclusive. A chance in percent to spawn SCP-173 instead of regular Coilhead. Values below 100 allow regular Coilheads to spawn."); if (VarietyChance.Value < 0) { VarietyChance.Value = 0; } if (VarietyChance.Value > 100) { VarietyChance.Value = 100; } LoadAssets(); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null); Logging.LogInfo((object)"Plugin raydenoir.SCP_173 is loaded!"); } private void LoadAssets() { try { Bundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(PluginDirectory), "scp173")); } catch (Exception ex) { Logging.LogError((object)("Couldn't load asset bundle: " + ex.Message)); return; } try { ScareSounds = (AudioClip[])(object)new AudioClip[6]; for (int i = 0; i < 6; i++) { ScareSounds[i] = Bundle.LoadAsset<AudioClip>("assets/scp173/scare" + (i + 1) + ".wav"); } Concrete = Bundle.LoadAsset<AudioClip>("assets/scp173/concrete.wav"); Scp173Model = Bundle.LoadAsset<GameObject>("assets/scp173/scp173.prefab"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Successfully loaded assets."); } catch (Exception ex2) { ((BaseUnityPlugin)this).Logger.LogError((object)("Couldn't load assets: " + ex2.Message)); } } } public static class PluginInfo { public const string PLUGIN_GUID = "SCP_173"; public const string PLUGIN_NAME = "SCP_173"; public const string PLUGIN_VERSION = "1.3.1"; } } namespace SCP_173.Patches { [HarmonyPatch] public class CoilheadPatch : MonoBehaviour { private static HashSet<SpringManAI> scps = new HashSet<SpringManAI>(); public static ManualLogSource Logging = Plugin.Logging; [HarmonyPatch(typeof(EnemyAI), "Start")] [HarmonyPostfix] public static void Summon173(EnemyAI __instance) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown if (!(__instance is SpringManAI)) { return; } SpringManAI val; try { val = (SpringManAI)__instance; } catch (Exception ex) { Logging.LogError((object)("Couldn't cast EnemyAI instance to SpringManAI: " + ex.Message)); return; } Random random = new Random(); int num = random.Next(100); if (num < Plugin.VarietyChance.Value) { scps.Add(val); Object.Destroy((Object)(object)((Component)((Component)val).transform.Find("SpringManModel").Find("Body")).gameObject.GetComponent<SkinnedMeshRenderer>()); Object.Destroy((Object)(object)((Component)((Component)val).transform.Find("SpringManModel").Find("Head")).gameObject.GetComponent<MeshRenderer>()); if (!Plugin.EnableDefaultMovementSounds.Value) { ((Component)((Component)val).transform.Find("SpringManModel").Find("FoostepSFX")).gameObject.GetComponent<AudioSource>().mute = true; } InstantiateScp173(val); ChangeSpringNoises(val); Logging.LogInfo((object)"SCP-173 resources are loaded."); } } private static void InstantiateScp173(SpringManAI parent) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)Plugin.Scp173Model == (Object)null) && scps.Contains(parent)) { GameObject val = Object.Instantiate<GameObject>(Plugin.Scp173Model); val.transform.SetParent(((Component)parent).transform.Find("SpringManModel")); val.transform.localPosition = Vector3.zero; val.transform.localRotation = Quaternion.identity; val.transform.localScale = Vector3.one; } } private static void ChangeSpringNoises(SpringManAI parent) { if (!Plugin.EnableDefaultSpringSounds.Value && Plugin.ScareSounds != null && scps.Contains(parent)) { ((Component)parent).GetComponent<SpringManAI>().springNoises = Plugin.ScareSounds; } } [HarmonyPatch(typeof(SpringManAI), "SetAnimationGoClientRpc")] [HarmonyPostfix] [ClientRpc] public static void PlayWalkSounds(SpringManAI __instance) { if (!Plugin.EnableDefaultMovementSounds.Value && !((Object)(object)Plugin.Concrete == (Object)null) && scps.Contains(__instance)) { ((EnemyAI)__instance).creatureSFX.PlayOneShot(Plugin.Concrete, 0.75f); WalkieTalkie.TransmitOneShotAudio(((EnemyAI)__instance).creatureSFX, Plugin.Concrete, 0.4f); } } [HarmonyPatch(typeof(SpringManAI), "SetAnimationStopClientRpc")] [HarmonyPostfix] [ClientRpc] public static void StopWalkSounds(SpringManAI __instance) { if (!Plugin.EnableDefaultMovementSounds.Value && !((Object)(object)Plugin.Concrete == (Object)null) && scps.Contains(__instance) && ((EnemyAI)__instance).creatureSFX.isPlaying) { ((EnemyAI)__instance).creatureSFX.Stop(); } } } }