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 AngryBritishDuck v1.2.0
angryduck.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using AngryDuck.Patches; using BepInEx; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("angryduck")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("angryduck")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("177ce422-ce2b-4a69-838c-55bec10d7e7f")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] [BepInPlugin("atomiclabs.ANGRYDUCK", "Angry Duck", "1.0.0")] public class AngryDuckMod : BaseUnityPlugin { public const string modGUID = "atomiclabs.ANGRYDUCK"; public const string modName = "Angry Duck"; public const string modVersion = "1.0.0"; public static AngryDuckMod instance; public static List<AudioClip> quackSounds; public static readonly Random random = new Random(); private Harmony harmony; private AssetBundle bundle; internal ManualLogSource logger; public AudioClip attackLoopClip; public AudioClip stunClip; public AudioClip stunStopClip; public AudioClip transformClip; public AudioClip deathClip; public AudioClip noticeClip; private void Awake() { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown logger = ((BaseUnityPlugin)this).Logger; logger.LogInfo((object)"Loading Angry Duck mod..."); if ((Object)(object)instance == (Object)null) { instance = this; harmony = new Harmony("atomiclabs.ANGRYDUCK"); harmony.PatchAll(typeof(EnemyDuckAnimPatch)); quackSounds = new List<AudioClip>(); string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); bundle = AssetBundle.LoadFromFile(Path.Combine(directoryName, "angryducksounds")); if ((Object)(object)bundle == (Object)null) { logger.LogError((object)"Failed to load asset bundle!"); return; } quackSounds = (from clip in bundle.LoadAllAssets<AudioClip>() where ((Object)clip).name.StartsWith("quack") && int.TryParse(((Object)clip).name.Substring(5), out var result) && result >= 1 && result <= 6 select clip).ToList(); if (quackSounds.Count == 0) { logger.LogError((object)"No valid quack sounds found in the asset bundle!"); return; } logger.LogInfo((object)$"Loaded {quackSounds.Count} quack sounds from asset bundle!"); attackLoopClip = bundle.LoadAsset<AudioClip>("attackloopsound"); stunClip = bundle.LoadAsset<AudioClip>("stunsound"); stunStopClip = bundle.LoadAsset<AudioClip>("stunstopsound"); transformClip = bundle.LoadAsset<AudioClip>("transformsound"); deathClip = bundle.LoadAsset<AudioClip>("deathsound"); noticeClip = bundle.LoadAsset<AudioClip>("noticesound"); if ((Object)(object)attackLoopClip == (Object)null || (Object)(object)stunClip == (Object)null || (Object)(object)stunStopClip == (Object)null || (Object)(object)transformClip == (Object)null || (Object)(object)deathClip == (Object)null || (Object)(object)noticeClip == (Object)null) { logger.LogError((object)"Failed to load one or more sounds from asset bundle!"); } } else { Object.Destroy((Object)(object)this); } } public AudioClip GetRandomQuackSound() { if (quackSounds == null || quackSounds.Count == 0) { logger.LogError((object)"Quack sounds list is empty or null."); return null; } return quackSounds[random.Next(quackSounds.Count)]; } } namespace AngryDuck.Patches; [HarmonyPatch(typeof(EnemyDuckAnim))] internal class EnemyDuckAnimPatch { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void ReplaceAudio(EnemyDuckAnim __instance) { if (AngryDuckMod.quackSounds != null && AngryDuckMod.quackSounds.Count > 0) { AudioClip val = AngryDuckMod.quackSounds[AngryDuckMod.random.Next(AngryDuckMod.quackSounds.Count)]; __instance.quackSound.Sounds = (AudioClip[])(object)new AudioClip[1] { val }; AngryDuckMod.instance.logger.LogInfo((object)$"[AUDIO] Duck {((Object)__instance).GetInstanceID()} selected quack sound -> {((Object)val).name}"); } else { AngryDuckMod.instance.logger.LogError((object)"[AUDIO] Failed to assign quack sound - no valid sounds available."); } if ((Object)(object)AngryDuckMod.instance.attackLoopClip != (Object)null) { __instance.attackLoopSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.attackLoopClip }; AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Attack loop sound replaced -> " + ((Object)AngryDuckMod.instance.attackLoopClip).name)); } if ((Object)(object)AngryDuckMod.instance.stunClip != (Object)null) { __instance.stunSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.stunClip }; AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Stun sound replaced -> " + ((Object)AngryDuckMod.instance.stunClip).name)); } if ((Object)(object)AngryDuckMod.instance.stunStopClip != (Object)null) { __instance.stunStopSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.stunStopClip }; AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Stun stop sound replaced -> " + ((Object)AngryDuckMod.instance.stunStopClip).name)); } if ((Object)(object)AngryDuckMod.instance.transformClip != (Object)null) { __instance.transformSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.transformClip }; AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Transform sound replaced -> " + ((Object)AngryDuckMod.instance.transformClip).name)); } if ((Object)(object)AngryDuckMod.instance.deathClip != (Object)null) { __instance.deathSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.deathClip }; AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Death sound replaced -> " + ((Object)AngryDuckMod.instance.deathClip).name)); } if ((Object)(object)AngryDuckMod.instance.noticeClip != (Object)null) { __instance.noticeSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.noticeClip }; AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Notice sound replaced -> " + ((Object)AngryDuckMod.instance.noticeClip).name)); } } }