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 WarBannerBuff v5.4.0
plugins/WarBannerBuff.dll
Decompiled 6 months agousing System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using EntityStates.DeepVoidPortalBattery; using EntityStates.MeridianEvent; using EntityStates.Missions.Arena.NullWard; using EntityStates.Missions.BrotherEncounter; using EntityStates.Missions.Moon; using EntityStates.ShrineHalcyonite; using EntityStates.SolusHeart.Phase0; using EntityStates.SolusHeart.Phase1; using EntityStates.SolusHeart.Phase2; using EntityStates.SolusWing2; using On.EntityStates.DeepVoidPortalBattery; using On.EntityStates.MeridianEvent; using On.EntityStates.Missions.Arena.NullWard; using On.EntityStates.Missions.BrotherEncounter; using On.EntityStates.Missions.Moon; using On.EntityStates.ShrineHalcyonite; using On.EntityStates.SolusHeart.Phase0; using On.EntityStates.SolusHeart.Phase1; using On.EntityStates.SolusHeart.Phase2; using On.EntityStates.SolusWing2; using On.RoR2; using R2API; using RoR2; using RoR2.ContentManagement; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; using WarBannerBuff.Components; using WarBannerBuff.ItemChanges; using WarBannerBuff.Modules; [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.1", FrameworkDisplayName = "")] [assembly: AssemblyCompany("WarBannerBuff")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("WarBannerBuff")] [assembly: AssemblyTitle("WarBannerBuff")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] namespace WarBannerBuff { [BepInPlugin("com.kking117.WarBannerBuff", "WarBannerBuff", "5.4.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class MainPlugin : BaseUnityPlugin { public const string MODUID = "com.kking117.WarBannerBuff"; public const string MODNAME = "WarBannerBuff"; public const string MODTOKEN = "KKING117_WARBANNERBUFF_"; public const string MODVERSION = "5.4.0"; internal static ManualLogSource ModLogger; public static PluginInfo pluginInfo; internal static bool Starstorm_Loaded; public static float RecoveryTick; public static float HealBase; public static float HealLevel; public static float HealMin; public static float RechargeBase; public static float RechargeLevel; public static float RechargeMin; public static float RegenBonus; public static float DamageBonus; public static float CritBonus; public static float ArmorBonus; public static float AttackBonus; public static float MoveBonus; public static float VoidBanner; public static float PillarBanner; public static float DeepVoidBanner; public static float BossBanner; public static float FocusBanner; public static float MeridianBanner; public static float HalcyonBanner; public static float PrisonBanner; public static float SolusHeartBanner; public static bool Merge_Enable; public static float Merge_MinOverlap; public static float Merge_FuseMult; public static bool SS2_ShareWithGreaterBanner; public void Awake() { ModLogger = ((BaseUnityPlugin)this).Logger; pluginInfo = ((BaseUnityPlugin)this).Info; ReadConfig(); new WarBanner(); new ContentPacks().Initialize(); ((ResourceAvailability)(ref GameModeCatalog.availability)).CallWhenAvailable((Action)PostLoad); } private void PostLoad() { LoadCompat(); } private void LoadCompat() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Invalid comparison between Unknown and I4 //IL_003d: Unknown result type (might be due to invalid IL or missing references) if (!SS2_ShareWithGreaterBanner) { return; } Starstorm_Loaded = Chainloader.PluginInfos.ContainsKey("com.TeamMoonstorm"); if (Starstorm_Loaded) { BuffIndex val = BuffCatalog.FindBuffIndex("BuffGreaterBanner"); if ((int)val > -1) { WarBanner.GreaterBannerBuff = BuffCatalog.GetBuffDef(val); } if ((Object)(object)WarBanner.GreaterBannerBuff != (Object)(object)Buffs.Warbanner) { ModLogger.LogInfo((object)"Found SS2 Greater Banner Buff"); } else { ModLogger.LogInfo((object)"Couldn't find SS2 Greater Banner Buff"); } } } public void ReadConfig() { RecoveryTick = ((BaseUnityPlugin)this).Config.Bind<float>("Healing and Recharge", "Tick Interval", 0f, "Delay in seconds between each heal/recharge tick. (0 or less disables this feature)").Value; HealBase = ((BaseUnityPlugin)this).Config.Bind<float>("Healing and Recharge", "Heal Max Health", 0.0025f, "Heal this % amount of health based on their total health. (0.01 = 1%)").Value; HealLevel = ((BaseUnityPlugin)this).Config.Bind<float>("Healing and Recharge", "Heal Level Health", 0.25f, "Heal this flat amount of health per level.").Value; HealMin = ((BaseUnityPlugin)this).Config.Bind<float>("Healing and Recharge", "Minimum Heal", 1f, "The minimum amount of healing to gain.").Value; RechargeBase = ((BaseUnityPlugin)this).Config.Bind<float>("Healing and Recharge", "Recharge Max Shield", 0f, "Recharge this % amount of shield based on their total shield. (0.01 = 1%)").Value; RechargeLevel = ((BaseUnityPlugin)this).Config.Bind<float>("Healing and Recharge", "Recharge Level Shield", 0f, "Recharge this flat amount of shield per level.").Value; RechargeMin = ((BaseUnityPlugin)this).Config.Bind<float>("Healing and Recharge", "Minimum Recharge", 0f, "The minimum amount of recharge to gain.").Value; AttackBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Stat Bonuses", "Attack Speed Bonus", 0.3f, "Attack Speed bonus from Warbanners.").Value; MoveBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Stat Bonuses", "Move Speed Bonus", 0.3f, "Movement Speed bonus from Warbanners.").Value; DamageBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Stat Bonuses", "Damage Bonus", 0.2f, "Damage bonus from Warbanners.").Value; CritBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Stat Bonuses", "Crit Bonus", 0f, "Crit bonus from Warbanners.").Value; ArmorBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Stat Bonuses", "Armor Bonus", 0f, "Armor bonus from Warbanners.").Value; RegenBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Stat Bonuses", "Regen Bonus", 3f, "Regen bonus from Warbanners. (Scales with level)").Value; BossBanner = ((BaseUnityPlugin)this).Config.Bind<float>("Placement Events", "Mithrix Phase Banners", 1f, "Players equipped with Warbanners will place one down at the start of Mithrix's phases. (Except the item steal phase.) (X = Banner radius multiplier for banners placed from this.) (0.0 or less disables this.)").Value; PillarBanner = ((BaseUnityPlugin)this).Config.Bind<float>("Placement Events", "Moon Pillar Banners", 0.75f, "Players equipped with Warbanners will place one down at the start of a Moon Pillar event. (X = Banner radius multiplier for banners placed from this.) (0.0 or less disables this.)").Value; DeepVoidBanner = ((BaseUnityPlugin)this).Config.Bind<float>("Placement Events", "Deep Void Signal Banners", 0.75f, "Players equipped with Warbanners will place one down at the start of a Deep Void Signal event. (X = Banner radius multiplier for banners placed from this.) (0.0 or less disables this.)").Value; PrisonBanner = ((BaseUnityPlugin)this).Config.Bind<float>("Placement Events", "Solus Wing Banners", 1f, "Players equipped with Warbanners will place one down at the start of Solus Wing phases. (X = Banner radius multiplier for banners placed from this.) (0.0 or less disables this.)").Value; SolusHeartBanner = ((BaseUnityPlugin)this).Config.Bind<float>("Placement Events", "Solus Heart Banners", 1f, "Players equipped with Warbanners will place one down at the start of Solus Heart phases. (X = Banner radius multiplier for banners placed from this.) (0.0 or less disables this.)").Value; VoidBanner = ((BaseUnityPlugin)this).Config.Bind<float>("Placement Events", "Void Cell Banners", 0.5f, "Players equipped with Warbanners will place one down at the start of a Void Cell event. (X = Banner radius multiplier for banners placed from this.) (0.0 or less disables this.)").Value; FocusBanner = ((BaseUnityPlugin)this).Config.Bind<float>("Placement Events", "Focus Banners", 1f, "Players equipped with Warbanners will place one down when activating the Focus in Simulacrum. (X = Banner radius multiplier for banners placed from this.) (0.0 or less disables this.)").Value; MeridianBanner = ((BaseUnityPlugin)this).Config.Bind<float>("Placement Events", "Prime Meridian Banners", 1f, "Players equipped with Warbanners will place one down at the start of False Son's phases. (X = Banner radius multiplier for banners placed from this.) (0.0 or less disables this.)").Value; HalcyonBanner = ((BaseUnityPlugin)this).Config.Bind<float>("Placement Events", "Halcyon Shrine Banners", 0f, "Players equipped with Warbanners will place one down when activating the Halcyon Shrine. (X = Banner radius multiplier for banners placed from this.) (0.0 or less disables this.)").Value; Merge_Enable = ((BaseUnityPlugin)this).Config.Bind<bool>("Banner Merging", "Enable", true, "Allow banner merging? (May cause stutters when banners are placed.)").Value; Merge_MinOverlap = ((BaseUnityPlugin)this).Config.Bind<float>("Banner Merging", "Minimum Overlap", 0.25f, "Minimum amount of overlap that banners need to merge. Values closer to 0 makes the requirement less strict. (Accepts 0-1)").Value; Merge_FuseMult = ((BaseUnityPlugin)this).Config.Bind<float>("Banner Merging", "Merge Multiplier", 0.5f, "How much radius to take from the smaller banners when merging.").Value; SS2_ShareWithGreaterBanner = ((BaseUnityPlugin)this).Config.Bind<bool>("Starstorm 2", "Count Greater Warbanner", false, "Makes the buff granted by the Greater Warbanner also count as the Warbanner buff.").Value; } } } namespace WarBannerBuff.Modules { public static class Buffs { internal static List<BuffDef> buffDefs = new List<BuffDef>(); internal static BuffDef AddNewBuff(string buffName, Sprite buffIcon, Color buffColor, bool canStack, bool isDebuff, bool isCooldown) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) BuffDef val = ScriptableObject.CreateInstance<BuffDef>(); ((Object)val).name = buffName; val.buffColor = buffColor; val.canStack = canStack; val.isDebuff = isDebuff; val.eliteDef = null; val.iconSprite = buffIcon; val.isCooldown = isCooldown; ((Object)val).name = ((Object)val).name; buffDefs.Add(val); return val; } } internal class ContentPacks : IContentPackProvider { internal ContentPack contentPack = new ContentPack(); public string identifier => "com.kking117.WarBannerBuff"; public void Initialize() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ContentManager.collectContentPackProviders += new CollectContentPackProvidersDelegate(ContentManager_collectContentPackProviders); } private void ContentManager_collectContentPackProviders(AddContentPackProviderDelegate addContentPackProvider) { addContentPackProvider.Invoke((IContentPackProvider)(object)this); } public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { contentPack.identifier = identifier; contentPack.buffDefs.Add(Buffs.buffDefs.ToArray()); args.ReportProgress(1f); yield break; } public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { ContentPack.Copy(contentPack, args.output); args.ReportProgress(1f); yield break; } public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { args.ReportProgress(1f); yield break; } } } namespace WarBannerBuff.ItemChanges { public class WarBanner { public static float OverlapDistanceMult; public static BuffDef ModdedBuff = Buffs.Warbanner; public static GameObject BannerWard = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/WardOnLevel/WarbannerWard.prefab").WaitForCompletion(); public static GameObject BuffVFX = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/WardOnLevel/WarbannerBuffEffect.prefab").WaitForCompletion(); private static string BannerWard_RefName = "(Clone)"; private static float NextRecover = 1f; public static BuffDef GreaterBannerBuff; public WarBanner() { ClampConfig(); CreateBuff(); UpdateText(); Hooks(); } private void ClampConfig() { MainPlugin.Merge_FuseMult = Math.Max(0f, MainPlugin.Merge_MinOverlap); MainPlugin.Merge_FuseMult = Math.Min(1f, MainPlugin.Merge_MinOverlap); OverlapDistanceMult = 1f - MainPlugin.Merge_FuseMult; MainPlugin.Merge_FuseMult = Math.Min(1f, MainPlugin.Merge_MinOverlap); MainPlugin.DamageBonus = Math.Max(0f, MainPlugin.DamageBonus); MainPlugin.AttackBonus = Math.Max(0f, MainPlugin.AttackBonus); MainPlugin.CritBonus = Math.Max(0f, MainPlugin.CritBonus); MainPlugin.ArmorBonus = Math.Max(0f, MainPlugin.ArmorBonus); MainPlugin.RegenBonus = Math.Max(0f, MainPlugin.RegenBonus); MainPlugin.MoveBonus = Math.Max(0f, MainPlugin.MoveBonus); } private void CreateBuff() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown ModdedBuff = Buffs.AddNewBuff("WarBanner(Modded)", Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/Base/WardOnLevel/bdWarbanner.asset").WaitForCompletion().iconSprite, Color.yellow, canStack: false, isDebuff: false, isCooldown: false); BannerWard.GetComponent<BuffWard>().buffDef = ModdedBuff; CharacterBody.UpdateAllTemporaryVisualEffects += new hook_UpdateAllTemporaryVisualEffects(CharacterBody_UpdateAllTemporaryVisualEffects); BannerWard_RefName = ((Object)BannerWard).name + BannerWard_RefName; GreaterBannerBuff = ModdedBuff; } private void Hooks() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Expected O, but got Unknown //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Expected O, but got Unknown //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Expected O, but got Unknown //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Expected O, but got Unknown //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Expected O, but got Unknown //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Expected O, but got Unknown //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Expected O, but got Unknown //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Expected O, but got Unknown //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Expected O, but got Unknown //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Expected O, but got Unknown //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Expected O, but got Unknown //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Expected O, but got Unknown if (MainPlugin.RecoveryTick > 0f) { Run.Start += new hook_Start(Run_Start); Run.FixedUpdate += new hook_FixedUpdate(Run_FixedUpdate); HealthComponent.ServerFixedUpdate += new hook_ServerFixedUpdate(HealthComponent_FixedUpdate); } RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsHook); if (MainPlugin.BossBanner > 0f) { Phase1.OnEnter += new hook_OnEnter(Phase1_OnEnter); Phase2.OnEnter += new hook_OnEnter(Phase2_OnEnter); Phase3.OnEnter += new hook_OnEnter(Phase3_OnEnter); } if (MainPlugin.PillarBanner > 0f) { MoonBatteryActive.OnEnter += new hook_OnEnter(MoonBatteryActive_OnEnter); } if (MainPlugin.VoidBanner > 0f) { Active.OnEnter += new hook_OnEnter(NullWardActive_OnEnter); } if (MainPlugin.DeepVoidBanner > 0f) { BaseDeepVoidPortalBatteryState.OnEnter += new hook_OnEnter(DeepVoidPortal_OnEnter); } if (MainPlugin.FocusBanner > 0f) { InfiniteTowerRun.OnSafeWardActivated += new hook_OnSafeWardActivated(InfiniteTowerRun_OnSafeWardActivated); } if (MainPlugin.HalcyonBanner > 0f) { ShrineHalcyoniteActivatedState.OnEnter += new hook_OnEnter(Halcyon_OnEnter); } if (MainPlugin.MeridianBanner > 0f) { Phase1.OnEnter += new hook_OnEnter(Meridian_Phase1); Phase2.OnEnter += new hook_OnEnter(Meridian_Phase2); Phase3.OnEnter += new hook_OnEnter(Meridian_Phase3); } if (MainPlugin.PrisonBanner > 0f) { Mission2Fight.OnEnter += new hook_OnEnter(SolusWing_StartPhase); Mission3Darkness.OnEnter += new hook_OnEnter(SolusWing_BeamPhase); Mission4Desperation.OnEnter += new hook_OnEnter(SolusWing_DesperationPhase); } if (MainPlugin.SolusHeartBanner > 0f) { Mission0.OnEnter += new hook_OnEnter(SolusHeart_Phase0); Mission1.OnEnter += new hook_OnEnter(SolusHeart_Phase1); Mission2.OnEnter += new hook_OnEnter(SolusHeart_Phase2); } if (MainPlugin.Merge_Enable) { BuffWard.Start += new hook_Start(BuffWard_Start); } } private static void UpdateText() { string text = "Drop a Warbanner on level up or starting the Teleporter event. Grants allies"; string text2 = "On <style=cIsUtility>level up</style> or starting the <style=cIsUtility>Teleporter event</style>, drop a banner that strengthens all allies within <style=cIsUtility>16m</style> <style=cStack>(+8m per stack)</style>.\n\nThe banner grants:"; List<string> list = new List<string>(); List<string> list2 = new List<string>(); if (MainPlugin.DamageBonus > 0f) { list.Add(" damage"); list2.Add($" <style=cIsDamage>+{MainPlugin.DamageBonus * 100f}% damage</style>"); } if (MainPlugin.AttackBonus > 0f) { list.Add(" attack speed"); list2.Add($" <style=cIsDamage>+{MainPlugin.AttackBonus * 100f}% attack speed</style>"); } if (MainPlugin.CritBonus > 0f) { list.Add(" crit chance"); list2.Add($" <style=cIsDamage>+{MainPlugin.CritBonus}% crit chance</style>"); } if (MainPlugin.ArmorBonus > 0f) { list.Add(" armor"); list2.Add($" <style=cIsHealing>+{MainPlugin.ArmorBonus} armor</style>"); } if (MainPlugin.RegenBonus > 0f) { list.Add(" regen"); list2.Add($" <style=cIsHealing>+{MainPlugin.RegenBonus} base health regen</style>"); } if (MainPlugin.MoveBonus > 0f) { list.Add(" movement speed"); list2.Add($" <style=cIsUtility>+{MainPlugin.MoveBonus * 100f}% movement speed</style>"); } for (int i = 0; i < list.Count; i++) { if (i == list.Count - 1) { text += " and"; text2 += " and"; } else if (i > 0) { text += ","; text2 += ","; } text += list[i]; text2 += list2[i]; } text += "."; text2 += "."; LanguageAPI.Add("ITEM_WARDONLEVEL_PICKUP", text); LanguageAPI.Add("ITEM_WARDONLEVEL_DESC", text2); } private void RecalculateStatsHook(CharacterBody sender, StatHookEventArgs args) { if (HasBannerBuff(sender)) { args.damageMultAdd += MainPlugin.DamageBonus; args.attackSpeedMultAdd += MainPlugin.AttackBonus; args.moveSpeedMultAdd += MainPlugin.MoveBonus; args.critAdd += MainPlugin.CritBonus; args.armorAdd += MainPlugin.ArmorBonus; if (MainPlugin.RegenBonus > 0f) { args.baseRegenAdd += MainPlugin.RegenBonus; args.levelRegenAdd += MainPlugin.RegenBonus / 5f; } } } private void Run_Start(orig_Start orig, Run self) { orig.Invoke(self); NextRecover = 1f; } private void Run_FixedUpdate(orig_FixedUpdate orig, Run self) { orig.Invoke(self); if (MainPlugin.RecoveryTick > 0f) { if (NextRecover <= 0f) { NextRecover += MainPlugin.RecoveryTick; } NextRecover -= Time.fixedDeltaTime; } } private void HealthComponent_FixedUpdate(orig_ServerFixedUpdate orig, HealthComponent self, float deltaTime) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, deltaTime); if (Object.op_Implicit((Object)(object)self.body) && HasBannerBuff(self.body) && NextRecover <= 0f) { float num = CalculateHeal(self); if (num > 0f) { self.Heal(num, default(ProcChainMask), true); } num = CalculateRecharge(self); if (num > 0f) { self.RechargeShield(num); } } } private static float CalculateHeal(HealthComponent self) { float num = 0f; if (Object.op_Implicit((Object)(object)self.body)) { num = self.fullHealth * MainPlugin.HealBase; float num2 = self.body.level - 1f; num += MainPlugin.HealLevel * num2; if (num < MainPlugin.HealMin) { num = MainPlugin.HealMin; } } return num; } private static float CalculateRecharge(HealthComponent self) { float num = 0f; if (Object.op_Implicit((Object)(object)self.body)) { num = self.fullShield * MainPlugin.RechargeBase; float num2 = self.body.level - 1f; num += MainPlugin.RechargeLevel * num2; if (num < MainPlugin.RechargeMin) { num = MainPlugin.RechargeMin; } } return num; } private static void Halcyon_OnEnter(orig_OnEnter orig, ShrineHalcyoniteActivatedState self) { orig.Invoke(self); SpawnTeamWarBanners((TeamIndex)1, MainPlugin.HalcyonBanner); } private static void SolusHeart_Phase0(orig_OnEnter orig, Mission0 self) { orig.Invoke(self); if (NetworkServer.active) { SpawnTeamWarBanners((TeamIndex)1, MainPlugin.SolusHeartBanner); } } private static void SolusHeart_Phase1(orig_OnEnter orig, Mission1 self) { orig.Invoke(self); if (NetworkServer.active) { SpawnTeamWarBanners((TeamIndex)1, MainPlugin.SolusHeartBanner); } } private static void SolusHeart_Phase2(orig_OnEnter orig, Mission2 self) { orig.Invoke(self); if (NetworkServer.active) { SpawnTeamWarBanners((TeamIndex)1, MainPlugin.SolusHeartBanner); } } private static void SolusWing_StartPhase(orig_OnEnter orig, Mission2Fight self) { orig.Invoke(self); if (NetworkServer.active) { SpawnTeamWarBanners((TeamIndex)1, MainPlugin.PrisonBanner); } } private static void SolusWing_BeamPhase(orig_OnEnter orig, Mission3Darkness self) { orig.Invoke(self); if (NetworkServer.active) { SpawnTeamWarBanners((TeamIndex)1, MainPlugin.PrisonBanner); } } private static void SolusWing_DesperationPhase(orig_OnEnter orig, Mission4Desperation self) { orig.Invoke(self); if (NetworkServer.active) { SpawnTeamWarBanners((TeamIndex)1, MainPlugin.PrisonBanner); } } private static void Meridian_Phase1(orig_OnEnter orig, Phase1 self) { orig.Invoke(self); if (NetworkServer.active) { SpawnTeamWarBanners((TeamIndex)1, MainPlugin.MeridianBanner); } } private static void Meridian_Phase2(orig_OnEnter orig, Phase2 self) { orig.Invoke(self); if (NetworkServer.active) { SpawnTeamWarBanners((TeamIndex)1, MainPlugin.MeridianBanner); } } private static void Meridian_Phase3(orig_OnEnter orig, Phase3 self) { orig.Invoke(self); if (NetworkServer.active) { SpawnTeamWarBanners((TeamIndex)1, MainPlugin.MeridianBanner); } } private static void Phase1_OnEnter(orig_OnEnter orig, Phase1 self) { orig.Invoke(self); SpawnTeamWarBanners((TeamIndex)1, MainPlugin.BossBanner); } private static void Phase2_OnEnter(orig_OnEnter orig, Phase2 self) { orig.Invoke(self); SpawnTeamWarBanners((TeamIndex)1, MainPlugin.BossBanner); } private static void Phase3_OnEnter(orig_OnEnter orig, Phase3 self) { orig.Invoke(self); SpawnTeamWarBanners((TeamIndex)1, MainPlugin.BossBanner); } private static void MoonBatteryActive_OnEnter(orig_OnEnter orig, MoonBatteryActive self) { orig.Invoke(self); SpawnTeamWarBanners((TeamIndex)1, MainPlugin.PillarBanner); } private static void NullWardActive_OnEnter(orig_OnEnter orig, Active self) { orig.Invoke(self); SpawnTeamWarBanners((TeamIndex)1, MainPlugin.VoidBanner); } private static void DeepVoidPortal_OnEnter(orig_OnEnter orig, BaseDeepVoidPortalBatteryState self) { orig.Invoke(self); SpawnTeamWarBanners((TeamIndex)1, MainPlugin.DeepVoidBanner); } private static void InfiniteTowerRun_OnSafeWardActivated(orig_OnSafeWardActivated orig, InfiniteTowerRun self, InfiniteTowerSafeWardController safeWard) { orig.Invoke(self, safeWard); SpawnTeamWarBanners((TeamIndex)1, MainPlugin.FocusBanner); } private static void BuffWard_Start(orig_Start orig, BuffWard self) { orig.Invoke(self); TryMergeWithWard(self); } private static void SpawnTeamWarBanners(TeamIndex team, float sizemult) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active || !(sizemult > 0f)) { return; } ReadOnlyCollection<TeamComponent> teamMembers = TeamComponent.GetTeamMembers(team); for (int i = 0; i < teamMembers.Count; i++) { CharacterBody body = teamMembers[i].body; if (!Object.op_Implicit((Object)(object)body)) { continue; } HealthComponent healthComponent = body.healthComponent; if (Object.op_Implicit((Object)(object)healthComponent) && healthComponent.alive && Object.op_Implicit((Object)(object)body.inventory)) { int itemCountEffective = body.inventory.GetItemCountEffective(Items.WardOnLevel); if (itemCountEffective > 0) { GameObject val = Object.Instantiate<GameObject>(BannerWard, ((Component)teamMembers[i]).transform.position, Quaternion.identity); val.GetComponent<TeamFilter>().teamIndex = team; val.GetComponent<BuffWard>().Networkradius = (8f + 8f * (float)itemCountEffective) * sizemult; NetworkServer.Spawn(val); } } } } private static void TryMergeWithWard(BuffWard thisbuffWard) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active || !(((Object)((Component)thisbuffWard).gameObject).name == BannerWard_RefName) || thisbuffWard.expires) { return; } TeamIndex teamIndex = thisbuffWard.teamFilter.teamIndex; List<BuffWard> list = new List<BuffWard>(); BuffWard val = thisbuffWard; BuffWard[] array = Object.FindObjectsOfType<BuffWard>(); foreach (BuffWard val2 in array) { if ((Object)(object)val2 != (Object)(object)thisbuffWard && !val2.expires && ((Object)val2).name == ((Object)thisbuffWard).name && val2.invertTeamFilter == thisbuffWard.invertTeamFilter && val2.teamFilter.teamIndex == teamIndex && IsWardInRange(val2, thisbuffWard)) { list.Add(val2); if (val2.radius > val.radius) { val = val2; } } } if (list.Count <= 0) { return; } float radius = val.radius; float num = 0f; if ((Object)(object)thisbuffWard != (Object)(object)val) { num += thisbuffWard.radius; } foreach (BuffWard item in list) { if ((Object)(object)item != (Object)(object)val) { num += item.radius; } item.expires = true; Object.Destroy((Object)(object)((Component)item).gameObject); } thisbuffWard.radius = radius + num * MainPlugin.Merge_FuseMult; TryMergeWithWard(thisbuffWard); } private static bool IsWardInRange(BuffWard target, BuffWard searcher) { //IL_0026: 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) float num = searcher.radius * OverlapDistanceMult; float num2 = target.radius * OverlapDistanceMult; float num3 = Vector3.Distance(((Component)target).gameObject.transform.position, ((Component)searcher).gameObject.transform.position); if (num3 - num2 <= num) { return true; } if (num3 - num <= num2) { return true; } return false; } private static void CharacterBody_UpdateAllTemporaryVisualEffects(orig_UpdateAllTemporaryVisualEffects orig, CharacterBody self) { //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (self.HasBuff(ModdedBuff) && !self.HasBuff(Buffs.Warbanner)) { WarBannerBuffVFX warBannerBuffVFX = ((Component)self).GetComponent<WarBannerBuffVFX>(); if ((Object)(object)warBannerBuffVFX == (Object)null) { warBannerBuffVFX = ((Component)self).gameObject.AddComponent<WarBannerBuffVFX>(); } if ((Object)(object)warBannerBuffVFX.effect == (Object)null) { GameObject val = Object.Instantiate<GameObject>(BuffVFX, self.corePosition, Quaternion.identity); warBannerBuffVFX.effect = val.GetComponent<TemporaryVisualEffect>(); warBannerBuffVFX.effect.parentTransform = self.coreTransform; warBannerBuffVFX.effect.visualState = (VisualState)0; warBannerBuffVFX.effect.healthComponent = self.healthComponent; warBannerBuffVFX.effect.radius = self.radius; LocalCameraEffect component = val.GetComponent<LocalCameraEffect>(); if (Object.op_Implicit((Object)(object)component)) { component.targetCharacter = ((Component)self).gameObject; } } } else { WarBannerBuffVFX component2 = ((Component)self).GetComponent<WarBannerBuffVFX>(); if ((Object)(object)component2 != (Object)null) { component2.effect.visualState = (VisualState)1; } } } private bool HasBannerBuff(CharacterBody body) { if (body.HasBuff(ModdedBuff) || body.HasBuff(GreaterBannerBuff)) { return true; } return false; } } } namespace WarBannerBuff.Components { public class WarBannerBuffVFX : MonoBehaviour { public TemporaryVisualEffect effect; } }