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 GetItOffMe v1.0.0
GetItOffMe.dll
Decompiled 2 years agousing System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; 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("GetItOffMe")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("GetItOffMe")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("7705f351-3382-4868-84c6-766b9dc54f7c")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace GetItOffMe { [BepInPlugin("GetItOffMe", "GetItOffMe", "1.0.0")] internal class GetItOffMeBase : BaseUnityPlugin { public static PluginLogger logger = new PluginLogger(); private static GetItOffMeBase Instance; private static ConfigEntry<bool> LoggingEnabled; private static ConfigEntry<bool> ConfigMechanicEnabled; private static ConfigEntry<float> ConfigCentipedeRemovalChance; private static ConfigEntry<bool> ConfigCustomIntervalEnabled; private static ConfigEntry<float> ConfigRemovalInterval; private static ConfigEntry<bool> ConfigSuffocationEnabled; private static ConfigEntry<bool> ConfigCustomHurtChance; private static ConfigEntry<float> ConfigSuffocationHurtChance; private static ConfigEntry<int> ConfigSuffocationDamage; private static ConfigEntry<bool> ConfigCentipedeCanDie; private static ConfigEntry<float> ConfigCentipedeDeathChance; public static bool MechanicEnabled; public static float CentipedeRemovalChance; public static bool CustomIntervalEnabled; public static float RemovalInterval; public static bool SuffocationEnabled; public static bool CustomHurtChance; public static float SuffocationHurtChance; public static int SuffocationDamage; public static bool CentipedeCanDie; public static float CentipedeDeathChance; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } BindConfig(); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "GetItOffMe"); SetValues(); logger.LogInfo("Plugin has been awoken!"); } private void BindConfig() { ConfigCentipedeCanDie = ((BaseUnityPlugin)this).Config.Bind<bool>("Removal Settings", "Can Die", true, "Whether or not the snare flea has a chance of dying after you get it off your head."); ConfigCentipedeDeathChance = ((BaseUnityPlugin)this).Config.Bind<float>("Removal Settings", "Death Chance", 0.2f, "The chance in percentage of which the snare flea can die after getting removed from player heads."); ConfigSuffocationEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Suffocation Settings", "Enabled", true, (ConfigDescription)null); ConfigCustomHurtChance = ((BaseUnityPlugin)this).Config.Bind<bool>("Suffocation Settings", "Custom Hurt Chance", true, (ConfigDescription)null); ConfigSuffocationHurtChance = ((BaseUnityPlugin)this).Config.Bind<float>("Suffocation Settings", "Suffocation Hurt Chance", 0.35f, "The chance in percentage of which the snare flea will damage you."); ConfigSuffocationDamage = ((BaseUnityPlugin)this).Config.Bind<int>("Suffocation Settings", "Damage", 10, (ConfigDescription)null); ConfigMechanicEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Disable the mechanics of the mod if it conflicts with other mods."); ConfigCentipedeRemovalChance = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Removal Chance", 0.25f, "The success rate of players getting rid of snare fleas clinging on their head."); ConfigCustomIntervalEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Custom Interval", true, (ConfigDescription)null); ConfigRemovalInterval = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Removal Interval", 1f, "The amount of seconds it'll take before player either gets hurt, or before snare flea gets removed"); LoggingEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Debugging", "Logging", true, (ConfigDescription)null); } private void SetValues() { logger.EnableLogging(LoggingEnabled.Value); MechanicEnabled = ConfigMechanicEnabled.Value; CentipedeRemovalChance = ConfigCentipedeRemovalChance.Value; CustomIntervalEnabled = ConfigCustomIntervalEnabled.Value; RemovalInterval = ConfigRemovalInterval.Value; SuffocationEnabled = ConfigSuffocationEnabled.Value; CustomHurtChance = ConfigCustomHurtChance.Value; SuffocationHurtChance = ConfigSuffocationHurtChance.Value; SuffocationDamage = ConfigSuffocationDamage.Value; CentipedeCanDie = ConfigCentipedeCanDie.Value; CentipedeDeathChance = ConfigCentipedeDeathChance.Value; } } public class PluginInfo { public const string PLUGIN_GUID = "GetItOffMe"; public const string PLUGIN_NAME = "GetItOffMe"; public const string PLUGIN_VERSION = "1.0.0"; } public class PluginLogger { private static ManualLogSource mls = Logger.CreateLogSource("GetItOffMe"); private static bool ShouldLog = true; public void EnableLogging(bool enabled) { ShouldLog = enabled; } public void LogInfo(object data) { if (ShouldLog) { mls.LogInfo(data); } } public void LogError(object data) { if (ShouldLog) { mls.LogError(data); } } } } namespace GetItOffMe.Patches { [HarmonyPatch(typeof(CentipedeAI))] internal class CentipedeAIPatch { private static FieldInfo DamagePlayerInterval = typeof(CentipedeAI).GetField("damagePlayerInterval", BindingFlags.Instance | BindingFlags.NonPublic); [HarmonyPatch("Start")] [HarmonyPrefix] public static void Prefix(CentipedeAI __instance) { if (GetItOffMeBase.MechanicEnabled && (Object)(object)((Component)__instance).GetComponent<CentipedeRemover>() == (Object)null) { ((Component)__instance).gameObject.AddComponent<CentipedeRemover>(); GetItOffMeBase.logger.LogInfo("Patched the Snare flea with the Centipede Removal Mechanic."); } } [HarmonyPatch("DamagePlayerOnIntervals")] [HarmonyPostfix] public static void DamagePlayerOnIntervals_Postfix(ref CentipedeAI __instance) { //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00be: 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) //IL_007a: Unknown result type (might be due to invalid IL or missing references) if (!GetItOffMeBase.SuffocationEnabled) { GetItOffMeBase.logger.LogInfo("Suffocation is disabled. Damage is not going through."); return; } float num = (float)DamagePlayerInterval.GetValue(__instance); if (num <= 0f) { if (Random.value <= GetItOffMeBase.SuffocationHurtChance && GetItOffMeBase.CustomHurtChance) { __instance.clingingToPlayer.DamagePlayer(GetItOffMeBase.SuffocationDamage, true, true, (CauseOfDeath)5, 0, false, default(Vector3)); GetItOffMeBase.logger.LogInfo($"Player took {GetItOffMeBase.SuffocationDamage} damage."); } else { __instance.clingingToPlayer.DamagePlayer(GetItOffMeBase.SuffocationDamage, true, true, (CauseOfDeath)5, 0, false, default(Vector3)); GetItOffMeBase.logger.LogInfo($"Player took {GetItOffMeBase.SuffocationDamage} damage."); } DamagePlayerInterval.SetValue(__instance, 2); } } } public class CentipedeRemover : MonoBehaviour { private CentipedeAI centipede; public bool IsClingingToPlayer; private void Start() { centipede = ((Component)this).GetComponent<CentipedeAI>(); float num = (GetItOffMeBase.CustomIntervalEnabled ? GetItOffMeBase.RemovalInterval : 1f); ((MonoBehaviour)this).InvokeRepeating("AttemptCentipedeRemoval", num, num); } private void Update() { if ((Object)(object)centipede != (Object)null) { IsClingingToPlayer = (((Object)(object)centipede.clingingToPlayer != (Object)null) ? true : false); } } private void AttemptCentipedeRemoval() { if ((Object)(object)centipede == (Object)null || !IsClingingToPlayer) { return; } if (Random.value <= GetItOffMeBase.CentipedeRemovalChance) { IsClingingToPlayer = false; centipede.StopClingingClientRpc(false); centipede.StopClingingServerRpc(false); if (GetItOffMeBase.CentipedeCanDie && Random.value <= GetItOffMeBase.CentipedeDeathChance) { ((EnemyAI)centipede).KillEnemy(true); GetItOffMeBase.logger.LogInfo("Player yoinked off the snare flea too hard, causing the snare flea to die."); } ((MonoBehaviour)this).CancelInvoke("AttemptCentipedeRemoval"); GetItOffMeBase.logger.LogInfo("Stopped Calling AttemptCentipedeRemoval because snare flea has already been removed."); } else { GetItOffMeBase.logger.LogInfo("Player was unsuccessful in getting the snare flea off their head."); } GetItOffMeBase.logger.LogInfo($"Hurt Chance -> {GetItOffMeBase.SuffocationHurtChance}({GetItOffMeBase.SuffocationEnabled}) <-> Death Chance -> {GetItOffMeBase.CentipedeDeathChance}({GetItOffMeBase.CentipedeCanDie})"); } } }