Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of Edge Of Night v0.3.0
EdgeOfNight.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.Logging; using Microsoft.CodeAnalysis; using On.RoR2; using On.RoR2.UI; using R2API; using RoR2; using RoR2.UI; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("EdgeOfNight")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("EdgeOfNight")] [assembly: AssemblyTitle("EdgeOfNight")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.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 EdgeOfNightMod { internal static class Assets { internal static GameObject EdgeOfNightPrefab; internal static Sprite EdgeOfNightIcon; internal static GameObject EdgeOfNightSpherePrefab; internal static ManualLogSource Logger; private const string ModPrefix = "@EdgeOfNightMod:"; internal static ItemDef EdgeOfNightItemDef; internal static void Init(ManualLogSource Logger) { Assets.Logger = Logger; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("EdgeOfNight.Assets.eonassetbundle")) { AssetBundle val = AssetBundle.LoadFromStream(stream); EdgeOfNightPrefab = val.LoadAsset<GameObject>("Assets/AssetsBundlesWanted/Edge_of_Night.prefab"); EdgeOfNightIcon = val.LoadAsset<Sprite>("Assets/AssetsBundlesWanted/Edge_of_Night.png"); EdgeOfNightSpherePrefab = val.LoadAsset<GameObject>("Assets/AssetsBundlesWanted/Edge_of_Night_Sphere.prefab"); } CreateEdgeOfNightItem(); AddLanguageTokens(); } private static void CreateEdgeOfNightItem() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Expected O, but got Unknown //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Expected O, but got Unknown EdgeOfNightItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)EdgeOfNightItemDef).name = "EdgeOfNight"; EdgeOfNightItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier2Def.asset").WaitForCompletion(); EdgeOfNightItemDef.pickupModelPrefab = EdgeOfNightPrefab; EdgeOfNightItemDef.pickupIconSprite = EdgeOfNightIcon; EdgeOfNightItemDef.nameToken = "EDGEOFNIGHT_NAME"; EdgeOfNightItemDef.pickupToken = "EDGEOFNIGHT_PICKUP"; EdgeOfNightItemDef.descriptionToken = "EDGEOFNIGHT_DESC"; EdgeOfNightItemDef.loreToken = "EDGEOFNIGHT_LORE"; EdgeOfNightItemDef.tags = (ItemTag[])(object)new ItemTag[2] { (ItemTag)3, (ItemTag)1 }; EdgeOfNightItemDef.canRemove = true; EdgeOfNightItemDef.hidden = false; ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); CustomItem val2 = new CustomItem(EdgeOfNightItemDef, val); if (!ItemAPI.Add(val2)) { EdgeOfNightItemDef = null; Logger.LogError((object)"Unable to add Edge of Night item"); } } private static void AddLanguageTokens() { LanguageAPI.Add("EDGEOFNIGHT_NAME", "Edge of Night"); LanguageAPI.Add("EDGEOFNIGHT_PICKUP", "When damaged by an Elite enemy, temporarily gain that Elite's power."); LanguageAPI.Add("EDGEOFNIGHT_DESC", $"Upon being damaged by an Elite enemy, gain that Elite's <style=cIsDamage>power</style> for <style=cIsUtility>{EdgeOfNight.GetTotalBuffTime(1)}s</style> <style=cStack>(+{EdgeOfNight.buffStackBonus}s per stack)</style>. Recharges every <style=cIsUtility>{EdgeOfNight.cooldownDuration}</style> seconds."); LanguageAPI.Add("EDGEOFNIGHT_BUFF", "<style=cIsUtility>Active</style>"); LanguageAPI.Add("EDGEOFNIGHT_COOLDOWN", "<style=cIsUtility>On cooldown</style>"); LanguageAPI.Add("EDGEOFNIGHT_LORE", "It's just a cool-looking cape..? Surely there must be some use for this."); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("George.EdgeofNightMod", "EdgeofNightMod", "0.3.0")] public class EdgeOfNight : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnTakeDamageServer <>9__15_0; public static hook_RecalculateStats <>9__15_1; public static hook_SetItemIndex <>9__15_2; internal void <HooksContainer>b__15_0(orig_OnTakeDamageServer orig, CharacterBody self, DamageReport damageReport) { ActivateEffect(self, damageReport); orig.Invoke(self, damageReport); } internal void <HooksContainer>b__15_1(orig_RecalculateStats orig, CharacterBody self) { UpdateBuff(self); orig.Invoke(self); } internal void <HooksContainer>b__15_2(orig_SetItemIndex orig, ItemIcon self, ItemIndex newIndex, int newCount) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, newIndex, newCount); if ((Object)(object)self.tooltipProvider != (Object)null && newIndex == Assets.EdgeOfNightItemDef.itemIndex) { self.tooltipProvider.overrideBodyText = GetDisplayInformation(); } } } public const string ModVer = "0.3.0"; public const string ModAuthor = "George"; public const string ModName = "EdgeofNightMod"; public const string PluginGUID = "George.EdgeofNightMod"; public static ManualLogSource Log; public static BuffDef activeBuff; public static BuffDef cooldownBuff; public static float buffDuration = 1f; public static float buffStackBonus = 2f; public static float cooldownDuration = 8f; public static uint procSoundEventID = 4094061087u; public static uint offCooldownSoundEventID = 3231506196u; public static Dictionary<NetworkInstanceId, GameObject> sphereInstanceDict = new Dictionary<NetworkInstanceId, GameObject>(); public void Awake() { Log = ((BaseUnityPlugin)this).Logger; Assets.Init(Log); CreateBuffs(); HooksContainer(); } private static void CreateBuffs() { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) activeBuff = ScriptableObject.CreateInstance<BuffDef>(); activeBuff.iconSprite = Assets.EdgeOfNightIcon; ((Object)activeBuff).name = "EDGEOFNIGHT_BUFF"; activeBuff.canStack = false; activeBuff.isDebuff = false; activeBuff.isCooldown = false; activeBuff.isHidden = false; activeBuff.buffColor = Color.white; ContentAddition.AddBuffDef(activeBuff); cooldownBuff = ScriptableObject.CreateInstance<BuffDef>(); cooldownBuff.iconSprite = Assets.EdgeOfNightIcon; ((Object)cooldownBuff).name = "EDGEOFNIGHT_COOLDOWN"; cooldownBuff.canStack = true; cooldownBuff.isDebuff = false; cooldownBuff.isCooldown = true; cooldownBuff.isHidden = false; cooldownBuff.buffColor = Color.gray; ContentAddition.AddBuffDef(cooldownBuff); } private static void HooksContainer() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown object obj = <>c.<>9__15_0; if (obj == null) { hook_OnTakeDamageServer val = delegate(orig_OnTakeDamageServer orig, CharacterBody self, DamageReport damageReport) { ActivateEffect(self, damageReport); orig.Invoke(self, damageReport); }; <>c.<>9__15_0 = val; obj = (object)val; } CharacterBody.OnTakeDamageServer += (hook_OnTakeDamageServer)obj; object obj2 = <>c.<>9__15_1; if (obj2 == null) { hook_RecalculateStats val2 = delegate(orig_RecalculateStats orig, CharacterBody self) { UpdateBuff(self); orig.Invoke(self); }; <>c.<>9__15_1 = val2; obj2 = (object)val2; } CharacterBody.RecalculateStats += (hook_RecalculateStats)obj2; object obj3 = <>c.<>9__15_2; if (obj3 == null) { hook_SetItemIndex val3 = delegate(orig_SetItemIndex orig, ItemIcon self, ItemIndex newIndex, int newCount) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, newIndex, newCount); if ((Object)(object)self.tooltipProvider != (Object)null && newIndex == Assets.EdgeOfNightItemDef.itemIndex) { self.tooltipProvider.overrideBodyText = GetDisplayInformation(); } }; <>c.<>9__15_2 = val3; obj3 = (object)val3; } ItemIcon.SetItemIndex += (hook_SetItemIndex)obj3; } public static int GetTotalBuffTime(int count) { return Convert.ToInt32(buffDuration + buffStackBonus * (float)count); } private static void ActivateEffect(CharacterBody self, DamageReport damageReport) { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)damageReport.attackerBody == (Object)null || !Object.op_Implicit((Object)(object)self) || !self.isPlayerControlled || !self.HasBuff(activeBuff)) { return; } int itemCount = self.inventory.GetItemCount(Assets.EdgeOfNightItemDef); if (itemCount <= 0 || !damageReport.attackerBody.isElite) { return; } for (int i = 0; i < BuffCatalog.eliteBuffIndices.Length; i++) { BuffIndex val = BuffCatalog.eliteBuffIndices[i]; if (damageReport.attackerBody.HasBuff(val)) { self.AddTimedBuff(val, (float)GetTotalBuffTime(itemCount)); self.RemoveBuff(activeBuff); AddCooldownStacks(self, cooldownBuff, cooldownDuration); AkSoundEngine.PostEvent(procSoundEventID, ((Component)self).gameObject); DeactivateSphere(self); } } } public static void AddCooldownStacks(CharacterBody self, BuffDef cooldown, float duration) { for (float num = 1f; num <= duration; num += 1f) { self.AddTimedBuff(cooldown, num); } } private static void UpdateBuff(CharacterBody self) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)self) || !Object.op_Implicit((Object)(object)self.inventory)) { return; } if (self.inventory.GetItemCount(Assets.EdgeOfNightItemDef.itemIndex) <= 0) { if (self.HasBuff(activeBuff)) { self.RemoveBuff(activeBuff); DeactivateSphere(self); } } else if (!self.HasBuff(activeBuff) && !self.HasBuff(cooldownBuff)) { self.AddBuff(activeBuff); AkSoundEngine.PostEvent(offCooldownSoundEventID, ((Component)self).gameObject); ActivateSphere(self); } } private static string GetDisplayInformation() { return Language.GetString(Assets.EdgeOfNightItemDef.descriptionToken); } private static void CreateSphereInstance(CharacterBody self) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(Assets.EdgeOfNightSpherePrefab); TemporaryVisualEffect val2 = val.AddComponent<TemporaryVisualEffect>(); val2.enterComponents = (MonoBehaviour[])(object)new MonoBehaviour[0]; val2.exitComponents = (MonoBehaviour[])(object)new MonoBehaviour[0]; val2.parentTransform = self.coreTransform; val2.visualState = (VisualState)0; val2.healthComponent = self.healthComponent; float num = (float)((double)self.bestFitRadius * 1.5); val.transform.localScale = new Vector3(num, num, num); val.SetActive(true); sphereInstanceDict.Add(((NetworkBehaviour)self.master).netId, val); } private static void ActivateSphere(CharacterBody self) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (sphereInstanceDict.TryGetValue(((NetworkBehaviour)self.master).netId, out var value)) { value.SetActive(true); } else { CreateSphereInstance(self); } } private static void DeactivateSphere(CharacterBody self) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (sphereInstanceDict.TryGetValue(((NetworkBehaviour)self.master).netId, out var value)) { value.SetActive(false); } } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } }