Please disclose if your mod was created primarily 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 DangerousEnemies SMALL Edition v1.0.0
plugins/DangerousEnemies.SMALLEdition.dll
Decompiled 6 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("DangerousEnemies.SMALLEdition")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("DangerousEnemies.SMALLEdition")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("d65d0009-4513-4664-9cfb-9cfc9f1c3f45")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] [BepInPlugin("gabdao.dangerousenemies.SMALLedition", "DangerousEnemies SMALL Edition", "1.0.0")] public class DangerousEnemiesSMALLEditionPlugin : BaseUnityPlugin { public static ConfigEntry<bool> EnableDebugLogging; public static ConfigEntry<float> GreylingCircleInterval; public static ConfigEntry<float> GreylingCircleDuration; public static ConfigEntry<float> GreylingCircleDistance; public static ConfigEntry<float> GreylingAttackIntervalMin; public static ConfigEntry<float> GreylingAttackIntervalMax; public static ConfigEntry<float> GreydwarfCircleInterval; public static ConfigEntry<float> GreydwarfCircleDuration; public static ConfigEntry<float> GreydwarfCircleDistance; public static ConfigEntry<float> GreydwarfAttackIntervalMin; public static ConfigEntry<float> GreydwarfAttackIntervalMax; public static ConfigEntry<float> GreydwarfBruteCircleInterval; public static ConfigEntry<float> GreydwarfBruteCircleDuration; public static ConfigEntry<float> GreydwarfBruteCircleDistance; public static ConfigEntry<float> GreydwarfBruteAttackIntervalMin; public static ConfigEntry<float> GreydwarfBruteAttackIntervalMax; public static ConfigEntry<float> GreydwarfShamanCircleInterval; public static ConfigEntry<float> GreydwarfShamanCircleDuration; public static ConfigEntry<float> GreydwarfShamanCircleDistance; public static ConfigEntry<float> GreydwarfShamanAttackIntervalMin; public static ConfigEntry<float> GreydwarfShamanAttackIntervalMax; public static ConfigEntry<float> BoarCircleInterval; public static ConfigEntry<float> BoarCircleDuration; public static ConfigEntry<float> BoarCircleDistance; public static ConfigEntry<float> BoarAttackIntervalMin; public static ConfigEntry<float> BoarAttackIntervalMax; public static ConfigEntry<float> NeckCircleInterval; public static ConfigEntry<float> NeckCircleDuration; public static ConfigEntry<float> NeckCircleDistance; public static ConfigEntry<float> NeckAttackIntervalMin; public static ConfigEntry<float> NeckAttackIntervalMax; public static ConfigEntry<float> SkeletonCircleInterval; public static ConfigEntry<float> SkeletonCircleDuration; public static ConfigEntry<float> SkeletonCircleDistance; public static ConfigEntry<float> SkeletonAttackIntervalMin; public static ConfigEntry<float> SkeletonAttackIntervalMax; public static ConfigEntry<float> DraugrCircleInterval; public static ConfigEntry<float> DraugrCircleDuration; public static ConfigEntry<float> DraugrCircleDistance; public static ConfigEntry<float> DraugrAttackIntervalMin; public static ConfigEntry<float> DraugrAttackIntervalMax; public static ConfigEntry<float> HatchlingCircleInterval; public static ConfigEntry<float> HatchlingCircleDuration; public static ConfigEntry<float> HatchlingCircleDistance; public static ConfigEntry<float> HatchlingAttackIntervalMin; public static ConfigEntry<float> HatchlingAttackIntervalMax; public static ConfigEntry<float> GoblinCircleInterval; public static ConfigEntry<float> GoblinCircleDuration; public static ConfigEntry<float> GoblinCircleDistance; public static ConfigEntry<float> GoblinAttackIntervalMin; public static ConfigEntry<float> GoblinAttackIntervalMax; public static ConfigEntry<float> GoblinShamanCircleInterval; public static ConfigEntry<float> GoblinShamanCircleDuration; public static ConfigEntry<float> GoblinShamanCircleDistance; public static ConfigEntry<float> UlvCircleInterval; public static ConfigEntry<float> UlvCircleDuration; public static ConfigEntry<float> UlvCircleDistance; public static ConfigEntry<float> UlvAttackIntervalMin; public static ConfigEntry<float> UlvAttackIntervalMax; public static ConfigEntry<float> WraithCircleInterval; public static ConfigEntry<float> WraithCircleDuration; public static ConfigEntry<float> WraithCircleDistance; public static ConfigEntry<float> WraithAttackIntervalMin; public static ConfigEntry<float> WraithAttackIntervalMax; public static ConfigEntry<float> SurtlingCircleInterval; public static ConfigEntry<float> SurtlingCircleDuration; public static ConfigEntry<float> SurtlingCircleDistance; public static ConfigEntry<float> SurtlingAttackIntervalMin; public static ConfigEntry<float> SurtlingAttackIntervalMax; public static ConfigEntry<float> BlobCircleInterval; public static ConfigEntry<float> BlobCircleDuration; public static ConfigEntry<float> BlobCircleDistance; public static ConfigEntry<float> BlobAttackIntervalMin; public static ConfigEntry<float> BlobAttackIntervalMax; public static ConfigEntry<float> BlobEliteCircleInterval; public static ConfigEntry<float> BlobEliteCircleDuration; public static ConfigEntry<float> BlobEliteCircleDistance; public static ConfigEntry<float> BlobEliteAttackIntervalMin; public static ConfigEntry<float> BlobEliteAttackIntervalMax; public static ConfigEntry<float> BlobTarCircleInterval; public static ConfigEntry<float> BlobTarCircleDuration; public static ConfigEntry<float> BlobTarCircleDistance; public static ConfigEntry<float> BlobTarAttackIntervalMin; public static ConfigEntry<float> BlobTarAttackIntervalMax; public static ConfigEntry<float> BlobLavaCircleInterval; public static ConfigEntry<float> BlobLavaCircleDuration; public static ConfigEntry<float> BlobLavaCircleDistance; public static ConfigEntry<float> BlobLavaAttackIntervalMin; public static ConfigEntry<float> BlobLavaAttackIntervalMax; public static ConfigEntry<float> FenringCircleInterval; public static ConfigEntry<float> FenringCircleDuration; public static ConfigEntry<float> FenringCircleDistance; public static ConfigEntry<float> FenringAttackIntervalMin; public static ConfigEntry<float> FenringAttackIntervalMax; public static ConfigEntry<float> LoxCircleInterval; public static ConfigEntry<float> LoxCircleDuration; public static ConfigEntry<float> LoxCircleDistance; public static ConfigEntry<float> DeathsquitoCircleInterval; public static ConfigEntry<float> DeathsquitoCircleDuration; public static ConfigEntry<float> DeathsquitoCircleDistance; public static ConfigEntry<float> DeathsquitoAttackIntervalMin; public static ConfigEntry<float> DeathsquitoAttackIntervalMax; public static ConfigEntry<float> SeekerCircleInterval; public static ConfigEntry<float> SeekerCircleDuration; public static ConfigEntry<float> SeekerCircleDistance; public static ConfigEntry<float> SeekerAttackIntervalMin; public static ConfigEntry<float> SeekerAttackIntervalMax; private Harmony _harmony; private void Awake() { //IL_0f0e: Unknown result type (might be due to invalid IL or missing references) //IL_0f18: Expected O, but got Unknown EnableDebugLogging = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "EnableDebugLogging", false, "Enable debug logging for circling modifications"); GreylingCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Greyling", "CircleInterval", 0f, "Circle target interval for Greyling (0 = disable circling)"); GreylingCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Greyling", "CircleDuration", 0f, "Circle target duration for Greyling (0 = disable circling)"); GreylingCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Greyling", "CircleDistance", 0f, "Circle target distance for Greyling (0 = disable circling)"); GreylingAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Greyling", "AttackIntervalMin", 0f, "Minimum attack interval for Greyling (seconds)"); GreylingAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Greyling", "AttackIntervalMax", 3f, "Maximum attack interval for Greyling (seconds)"); GreydwarfCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf", "CircleInterval", 0f, "Circle target interval for Greydwarf (0 = disable circling)"); GreydwarfCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf", "CircleDuration", 0f, "Circle target duration for Greydwarf (0 = disable circling)"); GreydwarfCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf", "CircleDistance", 0f, "Circle target distance for Greydwarf (0 = disable circling)"); GreydwarfAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf", "AttackIntervalMin", 0f, "Minimum attack interval for Greydwarf (seconds)"); GreydwarfAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf", "AttackIntervalMax", 3f, "Maximum attack interval for Greydwarf (seconds)"); GreydwarfBruteCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf Brute", "CircleInterval", 0f, "Circle target interval for Greydwarf Brute (0 = disable circling)"); GreydwarfBruteCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf Brute", "CircleDuration", 0f, "Circle target duration for Greydwarf Brute (0 = disable circling)"); GreydwarfBruteCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf Brute", "CircleDistance", 0f, "Circle target distance for Greydwarf Brute (0 = disable circling)"); GreydwarfBruteAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf Brute", "AttackIntervalMin", 0f, "Minimum attack interval for Greydwarf Brute (seconds)"); GreydwarfBruteAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf Brute", "AttackIntervalMax", 3f, "Maximum attack interval for Greydwarf Brute (seconds)"); GreydwarfShamanCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf Shaman", "CircleInterval", 0f, "Circle target interval for Greydwarf Shaman (0 = disable circling)"); GreydwarfShamanCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf Shaman", "CircleDuration", 0f, "Circle target duration for Greydwarf Shaman (0 = disable circling)"); GreydwarfShamanCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf Shaman", "CircleDistance", 0f, "Circle target distance for Greydwarf Shaman (0 = disable circling)"); GreydwarfShamanAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf Shaman", "AttackIntervalMin", 2f, "Minimum attack interval for Greydwarf Shaman (seconds)"); GreydwarfShamanAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Greydwarf Shaman", "AttackIntervalMax", 10f, "Maximum attack interval for Greydwarf Shaman (seconds)"); BoarCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Boar", "CircleInterval", 0f, "Circle target interval for Boar (0 = disable circling)"); BoarCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Boar", "CircleDuration", 0f, "Circle target duration for Boar (0 = disable circling)"); BoarCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Boar", "CircleDistance", 0f, "Circle target distance for Boar (0 = disable circling)"); BoarAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Boar", "AttackIntervalMin", 0f, "Minimum attack interval for Boar (seconds)"); BoarAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Boar", "AttackIntervalMax", 4f, "Maximum attack interval for Boar (seconds)"); NeckCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Neck", "CircleInterval", 0f, "Circle target interval for Neck (0 = disable circling)"); NeckCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Neck", "CircleDuration", 0f, "Circle target duration for Neck (0 = disable circling)"); NeckCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Neck", "CircleDistance", 0f, "Circle target distance for Neck (0 = disable circling)"); NeckAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Neck", "AttackIntervalMin", 0f, "Minimum attack interval for Neck (seconds)"); NeckAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Neck", "AttackIntervalMax", 4f, "Maximum attack interval for Neck (seconds)"); SkeletonCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Skeleton", "CircleInterval", 0f, "Circle target interval for Skeleton (0 = disable circling)"); SkeletonCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Skeleton", "CircleDuration", 0f, "Circle target duration for Skeleton (0 = disable circling)"); SkeletonCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Skeleton", "CircleDistance", 0f, "Circle target distance for Skeleton (0 = disable circling)"); SkeletonAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Skeleton", "AttackIntervalMin", 0f, "Minimum attack interval for Skeleton (seconds)"); SkeletonAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Skeleton", "AttackIntervalMax", 6f, "Maximum attack interval for Skeleton (seconds)"); DraugrCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Draugr", "CircleInterval", 0f, "Circle target interval for Draugr (0 = disable circling)"); DraugrCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Draugr", "CircleDuration", 0f, "Circle target duration for Draugr (0 = disable circling)"); DraugrCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Draugr", "CircleDistance", 0f, "Circle target distance for Draugr (0 = disable circling)"); DraugrAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Draugr", "AttackIntervalMin", 0f, "Minimum attack interval for Draugr (seconds)"); DraugrAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Draugr", "AttackIntervalMax", 6f, "Maximum attack interval for Draugr (seconds)"); HatchlingCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Hatchling", "CircleInterval", 0f, "Circle target interval for Hatchling (0 = disable circling)"); HatchlingCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Hatchling", "CircleDuration", 0f, "Circle target duration for Hatchling (0 = disable circling)"); HatchlingCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Hatchling", "CircleDistance", 0f, "Circle target distance for Hatchling (0 = disable circling)"); HatchlingAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Hatchling", "AttackIntervalMin", 3f, "Minimum attack interval for Hatchling (seconds)"); HatchlingAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Hatchling", "AttackIntervalMax", 8f, "Maximum attack interval for Hatchling (seconds)"); GoblinCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Goblin", "CircleInterval", 0f, "Circle target interval for Goblin (0 = disable circling)"); GoblinCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Goblin", "CircleDuration", 0f, "Circle target duration for Goblin (0 = disable circling)"); GoblinCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Goblin", "CircleDistance", 0f, "Circle target distance for Goblin (0 = disable circling)"); GoblinAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Goblin", "AttackIntervalMin", 2f, "Minimum attack interval for Goblin (seconds)"); GoblinAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Goblin", "AttackIntervalMax", 8f, "Maximum attack interval for Goblin (seconds)"); GoblinShamanCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Goblin Shaman", "CircleInterval", 0f, "Circle target interval for Goblin Shaman (0 = disable circling)"); GoblinShamanCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Goblin Shaman", "CircleDuration", 0f, "Circle target duration for Goblin Shaman (0 = disable circling)"); GoblinShamanCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Goblin Shaman", "CircleDistance", 0f, "Circle target distance for Goblin Shaman (0 = disable circling)"); UlvCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Ulv", "CircleInterval", 0f, "Circle target interval for Ulv (0 = disable circling)"); UlvCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Ulv", "CircleDuration", 0f, "Circle target duration for Ulv (0 = disable circling)"); UlvCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Ulv", "CircleDistance", 0f, "Circle target distance for Ulv (0 = disable circling)"); UlvAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Ulv", "AttackIntervalMin", 0f, "Minimum attack interval for Ulv (seconds)"); UlvAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Ulv", "AttackIntervalMax", 4f, "Maximum attack interval for Ulv (seconds)"); WraithCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Wraith", "CircleInterval", 0f, "Circle target interval for Wraith (0 = disable circling)"); WraithCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Wraith", "CircleDuration", 0f, "Circle target duration for Wraith (0 = disable circling)"); WraithCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Wraith", "CircleDistance", 0f, "Circle target distance for Wraith (0 = disable circling)"); WraithAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Wraith", "AttackIntervalMin", 0f, "Minimum attack interval for Wraith (seconds)"); WraithAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Wraith", "AttackIntervalMax", 4f, "Maximum attack interval for Wraith (seconds)"); SurtlingCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Surtling", "CircleInterval", 0f, "Circle target interval for Surtling (0 = disable circling)"); SurtlingCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Surtling", "CircleDuration", 0f, "Circle target duration for Surtling (0 = disable circling)"); SurtlingCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Surtling", "CircleDistance", 0f, "Circle target distance for Surtling (0 = disable circling)"); SurtlingAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Surtling", "AttackIntervalMin", 0f, "Minimum attack interval for Surtling (seconds)"); SurtlingAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Surtling", "AttackIntervalMax", 5f, "Maximum attack interval for Surtling (seconds)"); BlobCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Blob", "CircleInterval", 0f, "Circle target interval for Blob (0 = disable circling)"); BlobCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Blob", "CircleDuration", 0f, "Circle target duration for Blob (0 = disable circling)"); BlobCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Blob", "CircleDistance", 0f, "Circle target distance for Blob (0 = disable circling)"); BlobAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Blob", "AttackIntervalMin", 2f, "Minimum attack interval for Blob (seconds)"); BlobAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Blob", "AttackIntervalMax", 6f, "Maximum attack interval for Blob (seconds)"); BlobEliteCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("BlobElite", "CircleInterval", 0f, "Circle target interval for BlobElite (0 = disable circling)"); BlobEliteCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("BlobElite", "CircleDuration", 0f, "Circle target duration for BlobElite (0 = disable circling)"); BlobEliteCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("BlobElite", "CircleDistance", 0f, "Circle target distance for BlobElite (0 = disable circling)"); BlobEliteAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("BlobElite", "AttackIntervalMin", 2f, "Minimum attack interval for BlobElite (seconds)"); BlobEliteAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("BlobElite", "AttackIntervalMax", 6f, "Maximum attack interval for BlobElite (seconds)"); BlobTarCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("BlobTar", "CircleInterval", 0f, "Circle target interval for BlobTar (0 = disable circling)"); BlobTarCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("BlobTar", "CircleDuration", 0f, "Circle target duration for BlobTar (0 = disable circling)"); BlobTarCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("BlobTar", "CircleDistance", 0f, "Circle target distance for BlobTar (0 = disable circling)"); BlobTarAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("BlobTar", "AttackIntervalMin", 3f, "Minimum attack interval for BlobTar (seconds)"); BlobTarAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("BlobTar", "AttackIntervalMax", 10f, "Maximum attack interval for BlobTar (seconds)"); BlobLavaCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("BlobLava", "CircleInterval", 0f, "Circle target interval for BlobLava (0 = disable circling)"); BlobLavaCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("BlobLava", "CircleDuration", 0f, "Circle target duration for BlobLava (0 = disable circling)"); BlobLavaCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("BlobLava", "CircleDistance", 0f, "Circle target distance for BlobLava (0 = disable circling)"); BlobLavaAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("BlobLava", "AttackIntervalMin", 2f, "Minimum attack interval for BlobLava (seconds)"); BlobLavaAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("BlobLava", "AttackIntervalMax", 6f, "Maximum attack interval for BlobLava (seconds)"); FenringCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Fenring", "CircleInterval", 0f, "Circle target interval for Fenring (0 = disable circling)"); FenringCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Fenring", "CircleDuration", 0f, "Circle target duration for Fenring (0 = disable circling)"); FenringCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Fenring", "CircleDistance", 0f, "Circle target distance for Fenring (0 = disable circling)"); FenringAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Fenring", "AttackIntervalMin", 1f, "Minimum attack interval for Fenring (seconds)"); FenringAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Fenring", "AttackIntervalMax", 5f, "Maximum attack interval for Fenring (seconds)"); LoxCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Lox", "CircleInterval", 0f, "Circle target interval for Lox (0 = disable circling)"); LoxCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Lox", "CircleDuration", 0f, "Circle target duration for Lox (0 = disable circling)"); LoxCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Lox", "CircleDistance", 0f, "Circle target distance for Lox (0 = disable circling)"); DeathsquitoCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Deathsquito", "CircleInterval", 0f, "Circle target interval for Deathsquito (0 = disable circling)"); DeathsquitoCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Deathsquito", "CircleDuration", 0f, "Circle target duration for Deathsquito (0 = disable circling)"); DeathsquitoCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Deathsquito", "CircleDistance", 0f, "Circle target distance for Deathsquito (0 = disable circling)"); DeathsquitoAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Deathsquito", "AttackIntervalMin", 3f, "Minimum attack interval for Deathsquito (seconds)"); DeathsquitoAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Deathsquito", "AttackIntervalMax", 10f, "Maximum attack interval for Deathsquito (seconds)"); SeekerCircleInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Seeker", "CircleInterval", 0f, "Circle target interval for Seeker (0 = disable circling)"); SeekerCircleDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Seeker", "CircleDuration", 0f, "Circle target duration for Seeker (0 = disable circling)"); SeekerCircleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Seeker", "CircleDistance", 0f, "Circle target distance for Seeker (0 = disable circling)"); SeekerAttackIntervalMin = ((BaseUnityPlugin)this).Config.Bind<float>("Seeker", "AttackIntervalMin", 2f, "Minimum attack interval for Seeker (seconds)"); SeekerAttackIntervalMax = ((BaseUnityPlugin)this).Config.Bind<float>("Seeker", "AttackIntervalMax", 10f, "Maximum attack interval for Seeker (seconds)"); _harmony = new Harmony("gabdao.enemycirclingcontrol"); _harmony.PatchAll(); if (EnableDebugLogging.Value) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"Enemy Circling Control loaded with individual enemy configurations"); } } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } EnemyCirclingPatch.Cleanup(); EnemyAttackIntervalPatch.Cleanup(); } } [HarmonyPatch(typeof(MonsterAI), "Awake")] public static class EnemyCirclingPatch { private struct EnemyConfig { public float CircleInterval; public float CircleDuration; public float CircleDistance; public bool Found; public static readonly EnemyConfig NotFound = new EnemyConfig(0f, 0f, 0f, found: false); public EnemyConfig(float interval, float duration, float distance, bool found = true) { CircleInterval = interval; CircleDuration = duration; CircleDistance = distance; Found = found; } } private static readonly Dictionary<string, EnemyConfig> s_configCache = new Dictionary<string, EnemyConfig>(); private static HashSet<string> s_customEnemies = null; private static string s_lastCustomEnemyConfig = null; private static float s_lastCleanupTime = 0f; private const float CLEANUP_INTERVAL = 300f; private static void Postfix(MonsterAI __instance) { try { if ((Object)(object)__instance == (Object)null) { return; } Character component = ((Component)__instance).GetComponent<Character>(); if ((Object)(object)component == (Object)null || string.IsNullOrWhiteSpace(component.m_name)) { return; } PeriodicCleanup(); string name = component.m_name; if (!s_configCache.TryGetValue(name, out var value)) { value = GetEnemyConfig(name); s_configCache[name] = value; } if (value.Found) { __instance.m_circleTargetInterval = value.CircleInterval; __instance.m_circleTargetDuration = value.CircleDuration; __instance.m_circleTargetDistance = value.CircleDistance; if (DangerousEnemiesSMALLEditionPlugin.EnableDebugLogging.Value) { Debug.Log((object)("[EnemyCirclingControl] Modified circling for: " + name + " " + $"(Interval: {value.CircleInterval}, Duration: {value.CircleDuration}, Distance: {value.CircleDistance})")); } } } catch (Exception arg) { Debug.LogError((object)$"[EnemyCirclingControl] Exception in circling patch: {arg}"); } } private static EnemyConfig GetEnemyConfig(string characterName) { string text = characterName.ToLowerInvariant(); if (text.Contains("greyling")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.GreylingCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.GreylingCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.GreylingCircleDistance.Value); } if (text.Contains("greydwarf")) { if (text.Contains("brute")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.GreydwarfBruteCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.GreydwarfBruteCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.GreydwarfBruteCircleDistance.Value); } if (text.Contains("shaman")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.GreydwarfShamanCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.GreydwarfShamanCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.GreydwarfShamanCircleDistance.Value); } return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.GreydwarfCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.GreydwarfCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.GreydwarfCircleDistance.Value); } if (text.Contains("boar")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.BoarCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.BoarCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.BoarCircleDistance.Value); } if (text.Contains("neck")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.NeckCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.NeckCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.NeckCircleDistance.Value); } if (text.Contains("skeleton")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.SkeletonCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.SkeletonCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.SkeletonCircleDistance.Value); } if (text.Contains("draugr")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.DraugrCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.DraugrCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.DraugrCircleDistance.Value); } if (text.Contains("hatchling") || text.Contains("drake")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.HatchlingCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.HatchlingCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.HatchlingCircleDistance.Value); } if (text.Contains("goblin")) { if (text.Contains("brute")) { return EnemyConfig.NotFound; } if (text.Contains("shaman")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleDistance.Value); } return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.GoblinCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.GoblinCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.GoblinCircleDistance.Value); } if (text.Contains("ulv")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.UlvCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.UlvCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.UlvCircleDistance.Value); } if (text.Contains("wraith")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.WraithCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.WraithCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.WraithCircleDistance.Value); } if (text.Contains("surtling")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.SurtlingCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.SurtlingCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.SurtlingCircleDistance.Value); } if (text.Contains("blob")) { if (text.Contains("elite")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleDistance.Value); } if (text.Contains("tar")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleDistance.Value); } if (text.Contains("lava")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.GoblinShamanCircleDistance.Value); } return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.BlobCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.BlobCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.BlobCircleDistance.Value); } if (text.Contains("fenring")) { if (text.Contains("cultist")) { return EnemyConfig.NotFound; } return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.FenringCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.FenringCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.FenringCircleDistance.Value); } if (text.Contains("deathsquito")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.DeathsquitoCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.DeathsquitoCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.DeathsquitoCircleDistance.Value); } if (text.Contains("lox")) { return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.LoxCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.LoxCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.LoxCircleDistance.Value); } if (text.Contains("seeker")) { if (text.Contains("brute")) { return EnemyConfig.NotFound; } return new EnemyConfig(DangerousEnemiesSMALLEditionPlugin.SeekerCircleInterval.Value, DangerousEnemiesSMALLEditionPlugin.SeekerCircleDuration.Value, DangerousEnemiesSMALLEditionPlugin.SeekerCircleDistance.Value); } return EnemyConfig.NotFound; } private static void PeriodicCleanup() { if (Time.time - s_lastCleanupTime > 300f) { if (s_configCache.Count > 150) { s_configCache.Clear(); } s_lastCleanupTime = Time.time; } } public static void Cleanup() { s_configCache.Clear(); s_customEnemies?.Clear(); s_customEnemies = null; s_lastCustomEnemyConfig = null; } } [HarmonyPatch(typeof(MonsterAI), "SelectBestAttack")] public static class EnemyAttackIntervalPatch { private static readonly FieldRef<MonsterAI, Character> m_characterRef = AccessTools.FieldRefAccess<MonsterAI, Character>("m_character"); private static readonly Dictionary<MonsterAI, string> s_lastAttackByInstance = new Dictionary<MonsterAI, string>(); private static float s_lastCleanupTime = 0f; private const float CLEANUP_INTERVAL = 60f; private static void Postfix(MonsterAI __instance, ref ItemData __result) { try { if ((Object)(object)__instance == (Object)null) { return; } ((Object)__instance).name.ToLower(); if (__result == null || (Object)(object)__result.m_dropPrefab == (Object)null) { return; } Character val = m_characterRef.Invoke(__instance); if ((Object)(object)val == (Object)null || string.IsNullOrWhiteSpace(val.m_name)) { return; } PeriodicCleanup(); string name = val.m_name; (float, float)? attackConfig = GetAttackConfig(name.ToLowerInvariant()); if (!attackConfig.HasValue) { return; } string name2 = ((Object)__result.m_dropPrefab).name; if (!s_lastAttackByInstance.TryGetValue(__instance, out var value) || value != name2) { s_lastAttackByInstance[__instance] = name2; float num = Random.Range(attackConfig.Value.Item1, attackConfig.Value.Item2); __result.m_shared.m_aiAttackInterval = num; if (DangerousEnemiesSMALLEditionPlugin.EnableDebugLogging.Value) { Debug.Log((object)$"[EnemyCirclingControl] Set attack interval for {name} ({name2}): {num:F2}s"); } } } catch (Exception arg) { Debug.LogError((object)$"[EnemyCirclingControl] Exception in attack interval patch: {arg}"); } } private static (float Min, float Max)? GetAttackConfig(string lowerName) { if (lowerName.Contains("greyling")) { return (DangerousEnemiesSMALLEditionPlugin.GreylingAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.GreylingAttackIntervalMax.Value); } if (lowerName.Contains("greydwarf")) { if (lowerName.Contains("brute")) { return (DangerousEnemiesSMALLEditionPlugin.GreydwarfBruteAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.GreydwarfBruteAttackIntervalMax.Value); } if (lowerName.Contains("shaman")) { return (DangerousEnemiesSMALLEditionPlugin.GreydwarfShamanAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.GreydwarfShamanAttackIntervalMax.Value); } return (DangerousEnemiesSMALLEditionPlugin.GreydwarfAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.GreydwarfAttackIntervalMax.Value); } if (lowerName.Contains("boar")) { return (DangerousEnemiesSMALLEditionPlugin.BoarAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.BoarAttackIntervalMax.Value); } if (lowerName.Contains("neck")) { return (DangerousEnemiesSMALLEditionPlugin.NeckAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.NeckAttackIntervalMax.Value); } if (lowerName.Contains("skeleton")) { return (DangerousEnemiesSMALLEditionPlugin.SkeletonAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.SkeletonAttackIntervalMax.Value); } if (lowerName.Contains("draugr")) { return (DangerousEnemiesSMALLEditionPlugin.DraugrAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.DraugrAttackIntervalMax.Value); } if (lowerName.Contains("drake")) { return (DangerousEnemiesSMALLEditionPlugin.HatchlingAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.HatchlingAttackIntervalMax.Value); } if (lowerName.Contains("goblin")) { if (lowerName.Contains("brute")) { return null; } if (lowerName.Contains("shaman")) { return null; } return (DangerousEnemiesSMALLEditionPlugin.GoblinAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.GoblinAttackIntervalMax.Value); } if (lowerName.Contains("ulv")) { return (DangerousEnemiesSMALLEditionPlugin.UlvAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.UlvAttackIntervalMax.Value); } if (lowerName.Contains("wraith")) { return (DangerousEnemiesSMALLEditionPlugin.WraithAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.WraithAttackIntervalMax.Value); } if (lowerName.Contains("surtling")) { return (DangerousEnemiesSMALLEditionPlugin.SurtlingAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.SurtlingAttackIntervalMax.Value); } if (lowerName.Contains("blob")) { if (lowerName.Contains("elite")) { return (DangerousEnemiesSMALLEditionPlugin.BlobEliteAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.BlobEliteAttackIntervalMax.Value); } if (lowerName.Contains("tar")) { return (DangerousEnemiesSMALLEditionPlugin.BlobTarAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.BlobTarAttackIntervalMax.Value); } if (lowerName.Contains("lava")) { return (DangerousEnemiesSMALLEditionPlugin.BlobLavaAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.BlobLavaAttackIntervalMax.Value); } return (DangerousEnemiesSMALLEditionPlugin.BlobAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.BlobAttackIntervalMax.Value); } if (lowerName.Contains("fenring")) { if (lowerName.Contains("cultist")) { return null; } return (DangerousEnemiesSMALLEditionPlugin.FenringAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.FenringAttackIntervalMax.Value); } if (lowerName.Contains("deathsquito")) { return (DangerousEnemiesSMALLEditionPlugin.DeathsquitoAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.DeathsquitoAttackIntervalMax.Value); } if (lowerName.Contains("seeker")) { if (lowerName.Contains("brute")) { return null; } return (DangerousEnemiesSMALLEditionPlugin.SeekerAttackIntervalMin.Value, DangerousEnemiesSMALLEditionPlugin.SeekerAttackIntervalMax.Value); } return null; } private static void PeriodicCleanup() { if (!(Time.time - s_lastCleanupTime > 60f)) { return; } foreach (MonsterAI item in s_lastAttackByInstance.Keys.Where((MonsterAI key) => (Object)(object)key == (Object)null || (Object)(object)((Component)key).gameObject == (Object)null).ToList()) { s_lastAttackByInstance.Remove(item); } s_lastCleanupTime = Time.time; } public static void Cleanup() { s_lastAttackByInstance.Clear(); } } [HarmonyPatch(typeof(MonsterAI), "Awake")] public static class MinorEnemyProjectileIntervalPatch { private static readonly Dictionary<MonsterAI, bool> s_configCache = new Dictionary<MonsterAI, bool>(); private static float s_lastCleanupTime = 0f; private const float CLEANUP_INTERVAL = 60f; private static void Postfix(MonsterAI __instance) { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown try { PeriodicCleanup(); if ((Object)(object)__instance == (Object)null || s_configCache.ContainsKey(__instance)) { return; } string text = ((Object)__instance).name.ToLower(); if (!text.Contains("drake")) { return; } Humanoid component = ((Component)__instance).GetComponent<Humanoid>(); if ((Object)(object)component == (Object)null) { return; } ItemData val = (ItemData)AccessTools.Field(typeof(Humanoid), "m_rightItem").GetValue(component); if (val?.m_shared != null) { float num = 0f; float num2 = 0f; if (text.Contains("drake")) { num = DangerousEnemiesSMALLEditionPlugin.HatchlingAttackIntervalMin.Value; num2 = DangerousEnemiesSMALLEditionPlugin.HatchlingAttackIntervalMax.Value; } float num3 = Random.Range(num, num2); val.m_shared.m_aiAttackInterval = num3; if (DangerousEnemiesSMALLEditionPlugin.EnableDebugLogging.Value) { Debug.Log((object)$"[MinorEnemyProjectileIntervalPatch] Set attack interval for {((Object)__instance).name}: {num3:F2}s"); } } s_configCache[__instance] = true; } catch (Exception arg) { Debug.LogError((object)$"[MinorEnemyProjectileIntervalPatch] Exception: {arg}"); } } private static void PeriodicCleanup() { if (Time.time - s_lastCleanupTime > 60f) { if (s_configCache.Count > 150) { s_configCache.Clear(); } s_lastCleanupTime = Time.time; } } public static void Cleanup() { s_configCache.Clear(); } }