using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Notiffy.API; using Notiffy.Utils; using PluginConfig.API; using PluginConfig.API.Decorators; using PluginConfig.API.Fields; 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("UltraNotifPack")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("UltraNotifPack")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("bdd19282-1499-46f9-85b8-6cf2de9cb1c0")] [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 Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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] [Microsoft.CodeAnalysis.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; } } } [BepInPlugin("eepynico.ultranotifpack", "UltraNotifPack", "1.0.0")] public class UltraNotifPack : BaseUnityPlugin { [CompilerGenerated] private sealed class d__19 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public UltraNotifPack <>4__this; private float 5__1; private Notification 5__2; private int 5__3; private string 5__4; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__19(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) 5__2 = default(Notification); 5__4 = null; <>1__state = -2; } private bool MoveNext() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Expected O, but got Unknown //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(5f); <>1__state = 1; return true; case 1: <>1__state = -1; break; case 2: <>1__state = -1; break; } if (intervalEnabled.value) { 5__2 = Notifications.intervalNotifs[Random.Range(0, Notifications.intervalNotifs.Length)]; if (totalIcons.value > 0) { 5__3 = Random.Range(1, totalIcons.value + 1); 5__4 = Path.Combine(workingDir, "icons", $"notif{5__3}.png"); if (File.Exists(5__4)) { 5__2.NotificationIcon = Img2Sprite.LoadNewSprite(5__4, 100f, (SpriteMeshType)1); } else { Log.LogWarning((object)$"Icon {5__3} doesnt exist in {5__4}!"); } 5__4 = null; } NotificationSystem.Notify(5__2); Log.LogInfo((object)"Sending Notification. Type: Interval"); 5__2 = default(Notification); } 5__1 = Random.Range(intervalMin.value, intervalMax.value); <>2__current = (object)new WaitForSeconds(5__1); <>1__state = 2; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public static UltraNotifPack Instance; public static ManualLogSource Log; public static IntField totalIcons; public static string workingDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); private static PluginConfigurator config; private static BoolField intervalEnabled; private static IntField intervalMin; private static IntField intervalMax; public static BoolField actionEnabled; public static FloatField notifChance; public static BoolField notifDie; public static BoolField notifKill; public static BoolField notifParry; public static BoolField notifHit; public static BoolField notifCoin; public static BoolField notifDamage; public static BoolField notifRank; public static BoolField notifStyle; private void Awake() { //IL_0048: 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_006d: Expected O, but got Unknown //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Expected O, but got Unknown //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Expected O, but got Unknown //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Expected O, but got Unknown //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Expected O, but got Unknown //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Expected O, but got Unknown //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Expected O, but got Unknown //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Expected O, but got Unknown //IL_01e5: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; Instance = this; ((BaseUnityPlugin)this).Logger.LogInfo((object)"UltraNotifPack loaded successfully!"); config = PluginConfigurator.Create("UltraNotifPack", "eepynico.ultranotifpack"); new ConfigHeader(config.rootPanel, "-- INTERVAL NOTIFICATIONS --", 24); intervalEnabled = new BoolField(config.rootPanel, "Enable interval notifications", "intervalEnabled", true); intervalMin = new IntField(config.rootPanel, "Min interval (seconds)", "intervalMin", 20); intervalMax = new IntField(config.rootPanel, "Max interval (seconds)", "intervalMax", 60); new ConfigHeader(config.rootPanel, "-- ACTION NOTIFICATIONS --", 24); actionEnabled = new BoolField(config.rootPanel, "Enable action notifications", "actionEnabled", true); notifChance = new FloatField(config.rootPanel, "Notification chance (%)", "notifChance", 100f, 0f, 100f); new ConfigHeader(config.rootPanel, "Actions", 18); notifDie = new BoolField(config.rootPanel, "On death", "notifDie", true); notifKill = new BoolField(config.rootPanel, "On kill", "notifKill", true); notifParry = new BoolField(config.rootPanel, "On parry", "notifParry", true); notifDamage = new BoolField(config.rootPanel, "On damage taken", "notifDamage", true); new ConfigHeader(config.rootPanel, "-- ECT --", 24); totalIcons = new IntField(config.rootPanel, "Total custom icons", "totalIcons", 30, 0, 999); new Harmony("eepynico.ultranotifpack").PatchAll(); ((MonoBehaviour)this).StartCoroutine(NotifLoop()); NotificationSystem.ActionInvoked += delegate(uint id, string actionIdentifier) { Log.LogInfo((object)$"Notification {id} action: {actionIdentifier}"); switch (actionIdentifier) { case "dies": MonoSingleton.Instance.GetHurt(99999, true, 1f, false, false, 0.35f, false); Log.LogInfo((object)"Killed Player"); break; case "reward": Spawning.SpawnEnemy("Mannequin", 10); Log.LogInfo((object)"Spawned 10 Mannequins"); break; case "allowminos": Spawning.SpawnEnemy("Minos Prime"); Log.LogInfo((object)"Spawned Minos"); break; } }; } [IteratorStateMachine(typeof(d__19))] private IEnumerator NotifLoop() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__19(0) { <>4__this = this }; } public static void SendRandom(Notification[] notifs) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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) if (Random.Range(0f, 100f) <= notifChance.value) { Notification val = notifs[Random.Range(0, notifs.Length)]; if (totalIcons.value > 0) { int num = Random.Range(1, totalIcons.value + 1); string text = Path.Combine(workingDir, "icons", $"notif{num}.png"); if (File.Exists(text)) { val.NotificationIcon = Img2Sprite.LoadNewSprite(text, 100f, (SpriteMeshType)1); } else { Log.LogWarning((object)$"Icon {num} doesnt exist in {text}!"); } } NotificationSystem.Notify(val); Log.LogInfo((object)"Action Notification Sending."); } else { Log.LogInfo((object)"Action Notification NOT Sending."); } } } public static class Notifications { public static Notification[] intervalNotifs = (Notification[])(object)new Notification[17] { new Notification { Summary = "System Alert", Body = "You may have vibus", Actions = new List { "dies", "*Die*", "installanti", "Install AntiVirus" } }, new Notification { Summary = "Update Available", Body = "ULTRAKILL 2 Is ready to install", Actions = new List { "yes", "Install Now", "no", "Maybe Later" } }, new Notification { Summary = "Hot singles in your area", Body = "Hot singles in your area! find them now at https://en.wikipedia.org/wiki/Hot_Singles_in_Your_Area", Actions = new List { "idc", "I don't care.", "wiki", "Is that a wikipedia link?" } }, new Notification { Summary = "Congratulations!", Body = "You are the SECOND machine chosen to be hells favorite toy!", Actions = new List { "wtf", "The fuck?", "reward", "Earn reward now!" } }, new Notification { Summary = "Breaking News", Body = "Local machine refuses to listen to reason, continues killing" }, new Notification { Summary = "New Friend Request", Body = "Minos Prime would like to know your location", Actions = new List { "allowminos", "Allow", "no", "Deny" } }, new Notification { Summary = "New sale!", Body = "Buy 3 skulls for the price of 2 skulls plus the price of 1!", Actions = new List { "buy", "Buy", "close", "Close" } }, new Notification { Summary = "Recommended Video", Body = "\"How to parry your taxes\", Uploaded 3 minutes ago.", Actions = new List { "watch", "Watch", "Not now", "Later" } }, new Notification { Summary = "Filth3274 has sent you a message", Body = "\"Check behind you\"", Actions = new List { "reply", "Reply", "read", "Mark As Read", "block", "Block" } }, new Notification { Summary = "GabrielOfficial has sent you a message", Body = "\"Machine, im taking a photo with the funny rock\"", Actions = new List { "reply", "Reply", "read", "Mark As Read", "block", "Block" } }, new Notification { Summary = "Anonymous has sent you a message", Body = "\"Im Approaching.\"", Actions = new List { "reply", "Reply", "read", "Mark As Read", "block", "Block" } }, new Notification { Summary = "LUSTLAYER.XXX has sent you a message", Body = "\"Renew Your subscription! you only have EIGHT days left!\"", Actions = new List { "renew", "Renew", "ignore", "Ignore", "block", "Block" } }, new Notification { Summary = "PaintEater has sent you a message", Body = "\"the progpess of th r is go n we aofp l ak\"", Actions = new List { "reply", "Reply", "read", "Mark As Read", "block", "Block" } }, new Notification { Summary = "GPU Warning", Body = "GPU Tempurature approaching the surface of the sun." }, new Notification { Summary = "Performance Waring", Body = "Blood Consumption exceeds recommended levels." }, new Notification { Summary = "Background Process", Body = "RECORD_COMBAT.bat is consuming 96.3% CPU.", Actions = new List { "close", "Close program", "ignore", "Ignore" } }, new Notification { Summary = "Security Alert", Body = "An unauthorized earthmover has gained access to your file system.", Actions = new List { "password", "Change Password", "authorize", "Authorize this" } } }; public static Notification[] deathNotifs = (Notification[])(object)new Notification[3] { new Notification { Summary = "You died", Body = "Skill issue" }, new Notification { Summary = "You died", Body = "Touch grass" }, new Notification { Summary = "You died", Body = "Get good" } }; public static Notification[] damageNotifs = (Notification[])(object)new Notification[3] { new Notification { Summary = "You got hit", Body = "Try avoiding that" }, new Notification { Summary = "You got hit", Body = "Just shoot them dummy" }, new Notification { Summary = "You got hit", Body = "You know this game requires skill, right?" } }; public static Notification[] parryNotifs = (Notification[])(object)new Notification[3] { new Notification { Summary = "You parried", Body = "Return to Sender" }, new Notification { Summary = "You parried", Body = "Bonk" }, new Notification { Summary = "You parried", Body = "UltraFisted" } }; public static Notification[] rankupNotifs = (Notification[])(object)new Notification[3] { new Notification { Summary = "Rank changed", Body = "Gopro go brrr" }, new Notification { Summary = "Rank changed", Body = "Style on em" }, new Notification { Summary = "Rank changed", Body = "Looking good" } }; public static Notification[] rankdownNotifs = (Notification[])(object)new Notification[3] { new Notification { Summary = "Rank changed", Body = "You suck" }, new Notification { Summary = "Rank changed", Body = "Metal Pipe Sound Effect" }, new Notification { Summary = "Rank changed", Body = "Get rekt" } }; public static Notification[] styleNotifs = (Notification[])(object)new Notification[3] { new Notification { Summary = "Style bonus", Body = "Fancy moves" }, new Notification { Summary = "Style bonus", Body = "Showoff" }, new Notification { Summary = "Style bonus", Body = "Hit that scrongly" } }; public static Notification[] killNotifs = (Notification[])(object)new Notification[3] { new Notification { Summary = "Enemy killed", Body = "Got em" }, new Notification { Summary = "Enemy killed", Body = "Another one bites the dust" }, new Notification { Summary = "Enemy killed", Body = "Blood for the blood machine" } }; } [HarmonyPatch(typeof(NewMovement), "GetHurt")] internal class PatchPlayerHurt { private static void Postfix(NewMovement __instance) { if (__instance.dead) { if (UltraNotifPack.actionEnabled.value && UltraNotifPack.notifDie.value) { UltraNotifPack.SendRandom(Notifications.deathNotifs); UltraNotifPack.Log.LogInfo((object)"Sending Notification. Type: Death"); } } else if (UltraNotifPack.actionEnabled.value && UltraNotifPack.notifDamage.value) { UltraNotifPack.SendRandom(Notifications.damageNotifs); UltraNotifPack.Log.LogInfo((object)"Sending Notification. Type: Damage"); } } } [HarmonyPatch(typeof(Punch), "ParryProjectile")] internal class PatchParry { private static void Postfix() { if (UltraNotifPack.actionEnabled.value && UltraNotifPack.notifParry.value) { UltraNotifPack.SendRandom(Notifications.parryNotifs); UltraNotifPack.Log.LogInfo((object)"Sending Notification. Type: Parry (Proj)"); } } } [HarmonyPatch(typeof(EnemyIdentifier), "Death", new Type[] { })] internal class PatchEnemyDeath { private static void Prefix(EnemyIdentifier __instance) { if (!__instance.dead && UltraNotifPack.actionEnabled.value && UltraNotifPack.notifKill.value) { UltraNotifPack.SendRandom(Notifications.killNotifs); UltraNotifPack.Log.LogInfo((object)"Sending Notification. Type: Kill"); } } } public static class Spawning { public static void SpawnEnemy(string name, int count = 1) { //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) SpawnMenu instance = MonoSingleton.Instance; if ((Object)(object)instance != (Object)null) { FieldInfo field = typeof(SpawnMenu).GetField("objects", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { object value = field.GetValue(instance); FieldInfo field2 = value.GetType().GetField("enemies", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field2 != null) { Array array = (Array)field2.GetValue(value); foreach (object item in array) { FieldInfo field3 = item.GetType().GetField("gameObject", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field3 == null) { continue; } GameObject val = (GameObject)field3.GetValue(item); if (!((Object)(object)val != (Object)null) || !((Object)val).name.Contains(name)) { continue; } for (int i = 0; i < count; i++) { Object.Instantiate(val, ((Component)MonoSingleton.Instance).transform.position + Random.insideUnitSphere * 5f, Quaternion.identity); } return; } } } } EnemyIdentifier[] array2 = Object.FindObjectsOfType(); EnemyIdentifier[] array3 = array2; foreach (EnemyIdentifier val2 in array3) { if (((Object)((Component)val2).gameObject).name.Contains(name)) { for (int k = 0; k < count; k++) { Object.Instantiate(((Component)val2).gameObject, ((Component)MonoSingleton.Instance).transform.position + Random.insideUnitSphere * 5f, Quaternion.identity); } return; } } GameObject[] array4 = Resources.FindObjectsOfTypeAll(); GameObject[] array5 = array4; foreach (GameObject val3 in array5) { if (((Object)val3).name == name && (Object)(object)val3.GetComponent() != (Object)null) { for (int m = 0; m < count; m++) { Object.Instantiate(val3, ((Component)MonoSingleton.Instance).transform.position + Random.insideUnitSphere * 5f, Quaternion.identity); } return; } } UltraNotifPack.Log.LogWarning((object)("Prefab " + name + " not found anywhere!")); } }