using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BTD_Mod_Helper; using BTD_Mod_Helper.Api; using BTD_Mod_Helper.Api.Display; using BTD_Mod_Helper.Api.Helpers; using BTD_Mod_Helper.Api.ModOptions; using BTD_Mod_Helper.Api.Towers; using BTD_Mod_Helper.Extensions; using HarmonyLib; using Il2Cpp; using Il2CppAssets.Scripts; using Il2CppAssets.Scripts.Models; using Il2CppAssets.Scripts.Models.Audio; using Il2CppAssets.Scripts.Models.Effects; using Il2CppAssets.Scripts.Models.Entities; using Il2CppAssets.Scripts.Models.GenericBehaviors; using Il2CppAssets.Scripts.Models.Map; using Il2CppAssets.Scripts.Models.TowerSets; using Il2CppAssets.Scripts.Models.Towers; using Il2CppAssets.Scripts.Models.Towers.Behaviors; using Il2CppAssets.Scripts.Models.Towers.Behaviors.Abilities; using Il2CppAssets.Scripts.Models.Towers.Behaviors.Abilities.Behaviors; using Il2CppAssets.Scripts.Models.Towers.Behaviors.Attack; using Il2CppAssets.Scripts.Models.Towers.Behaviors.Attack.Behaviors; using Il2CppAssets.Scripts.Models.Towers.Mutators; using Il2CppAssets.Scripts.Models.Towers.Projectiles; using Il2CppAssets.Scripts.Models.Towers.Projectiles.Behaviors; using Il2CppAssets.Scripts.Models.Towers.TowerFilters; using Il2CppAssets.Scripts.Models.Towers.Weapons; using Il2CppAssets.Scripts.Models.Towers.Weapons.Behaviors; using Il2CppAssets.Scripts.Simulation; using Il2CppAssets.Scripts.Simulation.Objects; using Il2CppAssets.Scripts.Simulation.SMath; using Il2CppAssets.Scripts.Simulation.Towers; using Il2CppAssets.Scripts.Simulation.Towers.Behaviors; using Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Abilities.Behaviors; using Il2CppAssets.Scripts.Unity; using Il2CppAssets.Scripts.Unity.Bridge; using Il2CppAssets.Scripts.Unity.Display; using Il2CppAssets.Scripts.Unity.UI_New.InGame; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppNinjaKiwi.Common.ResourceUtils; using MelonLoader; using Microsoft.CodeAnalysis; using TempleBase; using TempleBase.Displays; using TempleBase.SacrificeAttacks; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(TempleBaseMod), "Temple Base", "1.1.13", "doombubbles", null)] [assembly: MelonGame("Ninja Kiwi", "BloonsTD6")] [assembly: MelonGame("Ninja Kiwi", "BloonsTD6-Epic")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("TempleBase")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+a0aa255a2920aaf52660c246f7b93ecdb64a4fb0")] [assembly: AssemblyProduct("TempleBase")] [assembly: AssemblyTitle("TempleBase")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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 TempleBase { public static class Extensions { public static void SetSelectable(this TargetSupplierModel m, bool value) { TargetFirstModel val = default(TargetFirstModel); TargetLastModel val2 = default(TargetLastModel); TargetStrongModel val3 = default(TargetStrongModel); TargetCloseModel val4 = default(TargetCloseModel); TargetFirstPrioCamoModel val5 = default(TargetFirstPrioCamoModel); TargetLastPrioCamoModel val6 = default(TargetLastPrioCamoModel); TargetStrongPrioCamoModel val7 = default(TargetStrongPrioCamoModel); TargetClosePrioCamoModel val8 = default(TargetClosePrioCamoModel); TargetEliteTargettingModel val9 = default(TargetEliteTargettingModel); if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)m, ref val)) { val.isSelectable = value; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)m, ref val2)) { val2.isSelectable = value; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)m, ref val3)) { val3.isSelectable = value; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)m, ref val4)) { val4.isSelectable = value; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)m, ref val5)) { val5.isSelectable = value; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)m, ref val6)) { val6.isSelectable = value; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)m, ref val7)) { val7.isSelectable = value; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)m, ref val8)) { val8.isSelectable = value; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)m, ref val9)) { val9.isSelectable = value; } } public static AttackModel FixedSacAttack(this AttackModel attackModel) { AttackModel val = ModelExt.Duplicate(attackModel); AttackModelBehaviorExt.RemoveBehavior(val); AttackModelBehaviorExt.GetBehaviors(val).ForEach(delegate(TargetSupplierModel model) { model.SetSelectable(value: true); }); Il2CppGenericIEnumerable.ForEach(((Model)val).GetDescendants(), (Action)delegate(WeaponModel weaponModel) { WeaponModelBehaviorExt.RemoveBehavior(weaponModel); WeaponModelBehaviorExt.RemoveBehavior(weaponModel); }); Il2CppGenericIEnumerable.ForEach(((Model)val).GetDescendants(), (Action)delegate(TowerModel towerModel) { Il2CppGenericIEnumerable.ForEach(((Model)towerModel).GetDescendants(), (Action)delegate(WeaponModel weaponModel) { WeaponModelBehaviorExt.RemoveBehavior(weaponModel); }); }); return val; } public static SupportModel FixedSacSupport(this SupportModel supportModel) { SupportModel val = ModelExt.Duplicate(supportModel); val.isGlobal = true; val.onlyShowBuffIfMutated = true; return val; } public static T Paragon(this T getFixedBoi) where T : Model { Il2CppGenericIEnumerable.ForEach(((Model)getFixedBoi).GetDescendants(), (Action)delegate(DamageModel model) { model.damage *= 2f; model.immuneBloonProperties = (BloonProperties)0; }); Il2CppGenericIEnumerable.ForEach(((Model)getFixedBoi).GetDescendants(), (Action)delegate(DisplayModel model) { model.display = CosmeticHelper.SwapDarkTempleAsset(model.display); }); Il2CppGenericIEnumerable.ForEach(((Model)getFixedBoi).GetDescendants(), (Action)delegate(EffectModel model) { model.assetId = CosmeticHelper.SwapDarkTempleAsset(model.assetId); }); Il2CppGenericIEnumerable.ForEach(((Model)getFixedBoi).GetDescendants(), (Action)delegate(ProjectileModel model) { model.display = CosmeticHelper.SwapDarkTempleAsset(model.display); }); Il2CppGenericIEnumerable.ForEach(((Model)getFixedBoi).GetDescendants(), (Action)delegate(AirUnitModel model) { model.display = CosmeticHelper.SwapDarkTempleAsset(model.display); }); Il2CppGenericIEnumerable.ForEach(((Model)getFixedBoi).GetDescendants(), (Action)delegate(TowerModel model) { ((EntityModel)model).display = CosmeticHelper.SwapDarkTempleAsset(((EntityModel)model).display); model.Paragon(); }); return getFixedBoi; } public static Tower? GetTowerOnTop(this Tower tower) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) TowerManager towerManager = InGameExt.GetTowerManager(InGame.instance); TowerModel towerModel = tower.towerModel; return Il2CppGenerics.FirstOrDefault(Il2CppGenerics.Where(towerManager.GetClosestTowers(((CommonBehaviorProxy)(object)tower).Position.ToVector2(), -1, (TowerFilter)null, towerModel.range), (Func)delegate(Tower t) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) ObjectId parentId = ((CommonBehaviorProxy)(object)t).ParentId; return ((ObjectId)(ref parentId)).Id == -1; }), (Func)((Tower t) => ((RootObject)t).Id != ((RootObject)tower).Id)); } public static List GetAllTowersOnTop(this Tower tower) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) TowerManager towerManager = InGameExt.GetTowerManager(InGame.instance); TowerModel towerModel = tower.towerModel; return Il2CppGenericsExt.ToList(Il2CppGenerics.Where(towerManager.GetClosestTowers(((CommonBehaviorProxy)(object)tower).Position.ToVector2(), -1, (TowerFilter)null, towerModel.range), (Func)delegate(Tower t) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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) ObjectId parentId = ((CommonBehaviorProxy)(object)t).ParentId; return ((ObjectId)(ref parentId)).Id == -1 && ((RootObject)t).Id != ((RootObject)tower).Id; })); } public static void ApplyToAttack(this TempleTowerMutatorGroupModel templeTowerMutatorGroupModel, AttackModel attackModel) { if (((TowerMutatorGroupModel)templeTowerMutatorGroupModel).mutators == null) { return; } WeaponModel val = ((Il2CppArrayBase)(object)attackModel.weapons)[0]; ProjectileModel projectile = val.projectile; DamageModel damageModel = ProjectileModelExt.GetDamageModel(projectile); PierceTowerMutatorModel val2 = default(PierceTowerMutatorModel); DamageTowerMutatorModel val3 = default(DamageTowerMutatorModel); ReloadTimeTowerMutatorModel val4 = default(ReloadTimeTowerMutatorModel); ProjectileSizeTowerMutatorModel val5 = default(ProjectileSizeTowerMutatorModel); ProjectileSpeedTowerMutatorModel val6 = default(ProjectileSpeedTowerMutatorModel); RangeTowerMutatorModel val7 = default(RangeTowerMutatorModel); WindChanceTowerMutatorModel val8 = default(WindChanceTowerMutatorModel); AddBehaviorToTowerMutatorModel val9 = default(AddBehaviorToTowerMutatorModel); RateSupportModel val10 = default(RateSupportModel); PierceSupportModel val11 = default(PierceSupportModel); RangeSupportModel val12 = default(RangeSupportModel); DamageSupportModel val13 = default(DamageSupportModel); foreach (TowerMutatorModel item in ((IEnumerable)((TowerMutatorGroupModel)templeTowerMutatorGroupModel).mutators).Where((TowerMutatorModel mutator) => mutator.conditionalId == null)) { if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item, ref val2)) { projectile.pierce += (float)val2.pierce; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item, ref val3)) { damageModel.damage += val3.damage; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item, ref val4)) { val.Rate *= 1f - val4.multiplier; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item, ref val5)) { projectile.radius *= 1f + val5.sizeModifier; projectile.scale *= 1f + val5.assetSizeModifier; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item, ref val6)) { TravelStraitModel behavior = ProjectileModelBehaviorExt.GetBehavior(projectile); behavior.Speed *= 1f + val6.speedModifier; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item, ref val7)) { attackModel.range += val7.rangeIncrease; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item, ref val8)) { WindModel behavior2 = ProjectileModelBehaviorExt.GetBehavior(projectile); behavior2.chance += val8.windChance; } else { if (!Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item, ref val9)) { continue; } foreach (TowerBehaviorModel item2 in (Il2CppArrayBase)(object)val9.behaviors) { if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item2, ref val10)) { val.Rate *= val10.multiplier; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item2, ref val11)) { projectile.pierce += val11.pierce; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item2, ref val12)) { attackModel.range += val12.additive; attackModel.range *= 1f + val12.multiplier; } else if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item2, ref val13)) { DamageModel damageModel2 = ProjectileModelExt.GetDamageModel(projectile); damageModel2.damage += val13.increase; } } } } } } public static class ModHelperData { public const string WorksOnVersion = "54.0"; public const string Version = "1.1.13"; public const string Name = "Temple Base"; public const string Description = "Adds in the Temple Base, a tower that lets you place another tower on top of it to power it up like a Sun Temple."; public const string RepoOwner = "doombubbles"; public const string PrevRepoName = "temple-base"; public const string RepoName = "TempleBase"; public const string Icon = "TempleBase.png"; } internal static class AllowTempleSacrificing { [HarmonyPatch(typeof(MonkeyTemple), "StartSacrifice")] internal static class MonkeyTemple_StartSacrifice { [HarmonyPrefix] private static void Prefix() { sacrificing = true; } [HarmonyPostfix] private static void Postfix() { sacrificing = false; } } [HarmonyPatch(/*Could not decode attribute arguments.*/)] internal static class TowerModel_isPowerTower { [HarmonyPrefix] private static bool Prefix(TowerModel __instance, ref bool __result) { if (sacrificing && TowerModelExt.GetModTower(__instance) is TempleBase) { __result = true; return false; } return true; } } public static bool sacrificing; } internal static class ParagonSacrificing { [HarmonyPatch(typeof(ParagonTower), "StartSacrifice")] internal static class ParagonTower_StartSacrifice { [HarmonyPrefix] private static void Prefix(ParagonTower __instance) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) if (TowerModelExt.GetModTower(((TowerBehavior)__instance).tower.towerModel) is TempleBase) { paragonTower = __instance; index = 0; Tower towerOnTop = ((TowerBehavior)__instance).tower.GetTowerOnTop(); if (towerOnTop != null) { Vector2 val = ((CommonBehaviorProxy)(object)((TowerBehavior)__instance).tower).Position.ToVector2(); towerOnTop.PositionTower(new Vector2(val.x, val.y + 10f), true); } } } [HarmonyPostfix] private static void Postfix() { paragonTower = null; } } [HarmonyPatch(typeof(TowerManager), "TowerSacrificed")] internal static class TowerManager_TowerSacrificed { [HarmonyPrefix] private static void Prefix(Tower tower) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) Tower val = default(Tower); if (TowerModelExt.GetModTower(tower.towerModel) is TempleBase && paragonTower != null && Il2CppSystemObjectExt.Is(tower.GetTowerOnTop(), ref val)) { Vector2 val2 = ((CommonBehaviorProxy)(object)((TowerBehavior)paragonTower).tower).Position.ToVector2(); val.PositionTower(new Vector2(val2.x - 10f + (float)(index * 20), val2.y - 10f), true); index++; } } } public static int index; public static ParagonTower? paragonTower; } public class TempleBase : ModTower { public const float Height = 40f; public const float Width = 13f; public override TowerSet TowerSet => (TowerSet)8; public override string BaseTower => TowerType.MonkeyVillage; public override ParagonMode ParagonMode => (ParagonMode)2; public override int Cost => 500; public override string Icon => ((ModContent)this).Name; public override string Portrait => ((ModContent)this).Name; public override string Description => "Place a tower on top of this to designate it 'The Chosen'.\nBy default, increases The Chosen's range."; public override bool IncludeInRogueLegends => true; public override void ModifyBaseTowerModel(TowerModel towerModel) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown RectangleFootprintModel val = (RectangleFootprintModel)(object)(towerModel.footprint = (FootprintModel)new RectangleFootprintModel("RectangleFootprintModel_", 40f, 40f, false, false, false)); TowerModelBehaviorExt.AddBehavior(towerModel, val); towerModel.range = 13f; TowerModelExt.GetAttackModel(towerModel).range = 13f; TowerModelBehaviorExt.AddBehavior(towerModel, GetAreaModel()); TowerModel tower = Game.instance.model.GetTower(TowerType.SuperMonkey, (towerModel.tier >= 5) ? 5 : 4, 0, 0); DisplayModel val3 = ModelExt.Duplicate(TowerModelBehaviorExt.GetBehavior(tower)); TowerModelBehaviorExt.RemoveBehaviors(towerModel); TowerModelBehaviorExt.AddBehavior(towerModel, val3); ((EntityModel)towerModel).display = val3.display; RangeSupportModel behavior = TowerModelBehaviorExt.GetBehavior(towerModel); behavior.mutatorId = "TempleBase-Range"; SupportModelExt.ApplyBuffIcon((SupportModel)(object)behavior); TowerModelBehaviorExt.RemoveBehavior(towerModel); } public static AddMakeshiftAreaModel GetAreaModel() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_006f: 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) Args val = new Args(); val.points = (Vector3[])(object)new Vector3[4] { new Vector3(-13f, -13f, 40f), new Vector3(13f, -13f, 40f), new Vector3(13f, 13f, 40f), new Vector3(-13f, 13f, 40f) }; val.newAreaType = (AreaType)2; val.filterInTowerSizes = new string[4] { "small", "medium", "large", "XL" }; val.ignoreZAxisTowerCollision = true; val.destroyTowersOnAreaWhenSold = true; val.dontDestroyTowersWhenAreaChanges = true; return CreateAddMakeshiftAreaModelExt.Create(val); } public override bool IsValidCrosspath(params int[] tiers) { return ModHelper.HasMod("UltimateCrosspathing") || ((ModTower)this).IsValidCrosspath(tiers); } } public class TempleBaseBuffIcon : ModBuffIcon { public override string Icon => "TempleBase"; } public class TempleBaseMod : BloonsTD6Mod { public static readonly ModSettingBool NerfedIncome = new ModSettingBool(true) { description = "Somewhat nerfs the income generation of the Bottom Path Upgrades when used with a Support Tower" }; public override void OnTowerCreated(Tower tower, Entity target, Model modelToUse) { HandleAllModelChanges(); } public override void OnTowerDestroyed(Tower tower) { HandleAllModelChanges(); } public override void OnTowerUpgraded(Tower tower, string upgradeName, TowerModel newBaseTowerModel) { HandleAllModelChanges(); } private static void HandleAllModelChanges() { if ((Object)(object)InGame.instance == (Object)null) { return; } UnityToSimulation bridge = InGame.instance.bridge; Simulation val = ((bridge != null) ? bridge.Simulation : null); if (val == null) { return; } IEnumerable enumerable = from model in Il2CppGenericIEnumerableExt.ToList(val.factory.GetUncast()) where TowerModelExt.GetModTower(model.towerModel) is TempleBase select model; foreach (Tower item in enumerable) { HandleSacAttacks(item); EnforceOneTowerPolicy(item); EmbiggenTempleTemples(item); } } private static void HandleSacAttacks(Tower tower) { //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) Tower towerOnTop = tower.GetTowerOnTop(); bool isParagon = tower.towerModel.isParagon; int num = (isParagon ? 6 : ((Il2CppArrayBase)(object)tower.towerModel.tiers)[2]); List content = ModContent.GetContent(); List list = new List(); if (isParagon) { list.AddRange(from t in tower.GetAllTowersOnTop() select t.towerModel.towerSet); } else if (towerOnTop != null) { list.Add(towerOnTop.towerModel.towerSet); } foreach (TempleBaseSacAttack item in content) { if (towerOnTop == null || item.Tier != num || !list.Contains(item.TowerSet)) { item.Remove(tower); } else { item.Apply(tower); } } } private static void EnforceOneTowerPolicy(Tower tower) { Tower towerOnTop = tower.GetTowerOnTop(); TowerModel val = ((Il2CppObjectBase)((Mutable)tower).rootModel).Cast(); bool flag = TowerModelBehaviorExt.GetBehavior(val) != null; bool flag2 = towerOnTop != null && !TowerModelBehaviorExt.HasBehavior(towerOnTop.towerModel); if (flag2 == flag) { val = ModelExt.Duplicate(val); if (flag) { TowerModelBehaviorExt.RemoveBehavior(val); } else { TowerModelBehaviorExt.AddBehavior(val, TempleBase.GetAreaModel()); } ((Mutable)tower).UpdateRootModel((Model)(object)val); } } private static void EmbiggenTempleTemples(Tower tower) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown Tower towerOnTop = tower.GetTowerOnTop(); bool flag = towerOnTop != null && TowerModelBehaviorExt.HasBehavior(towerOnTop.towerModel); float num = InGame.instance.bridge.Model.globalTowerScale * (flag ? 1.2f : 1f); if (((CommonBehaviorProxy)(object)tower).Scale.X != num) { ((CommonBehaviorProxy)(object)tower).Scale = new Vector3Boxed(num, num, num); } } } public class VengefulTempleBaseBuffIcon : ModBuffIcon { public override string Icon => "VengefulTempleBase-Portrait"; } } namespace TempleBase.Upgrades { public abstract class TempleBaseUpgrade : ModUpgrade { public const string TheTower = "The Chosen"; public override string Icon => ((ModContent)this).Name; public override SpriteReference IconReference => ((ModContent)this).GetSpriteReferenceOrDefault(((ModUpgrade)this).Icon); protected static TowerModel SunTemple => Game.instance.model.GetTower(TowerType.SuperMonkey, 4, 0, 0); protected static TowerModel SunGod => Game.instance.model.GetTower(TowerType.SuperMonkey, 5, 0, 0); } public class VengefulTempleBase : ModParagonUpgrade { public override int Cost => 600000; public override string DisplayName => "Vengeful Temple Base"; public override bool RemoveAbilities => false; public override string Description => "The Chosens combine forces atop this ancient monument to unbridled vengeance."; public override void ApplyUpgrade(TowerModel towerModel) { towerModel.range = 20f; DisplayModel behavior = TowerModelBehaviorExt.GetBehavior(towerModel); PrefabReference val = CosmeticHelper.SwapDarkTempleAsset(behavior.display); PrefabReference display = (behavior.display = val); ((EntityModel)towerModel).display = display; ParagonTowerModel behavior2 = TowerModelBehaviorExt.GetBehavior(towerModel); foreach (AssetPathModel item in (Il2CppArrayBase)(object)behavior2.displayDegreePaths) { item.assetPath = val; } behavior2.effectDuringModel.assetId = val; behavior2.endEffectModel.assetId = val; foreach (SupportModel behavior7 in TowerModelBehaviorExt.GetBehaviors(towerModel)) { SupportModelExt.ApplyBuffIcon(behavior7); } VengefulTempleBaseBuffIcon instance = ModContent.GetInstance(); DiscountZoneModel behavior3 = TowerModelBehaviorExt.GetBehavior(towerModel); ((TowerBehaviorBuffModel)behavior3).buffLocsName = ((ModBuffIcon)instance).Icon; ((TowerBehaviorBuffModel)behavior3).buffIconName = ((ModContent)instance).Id; DamageSupportModel behavior4 = TowerModelBehaviorExt.GetBehavior(towerModel); behavior4.mutatorId += "Vengeful"; AbilityModel behavior5 = TowerModelBehaviorExt.GetBehavior(towerModel); behavior5.icon = ((ModUpgrade)this).IconReference; ActivateRangeSupportZoneModel behavior6 = AbilityModelBehaviorExt.GetBehavior(behavior5); behavior6.mutatorId += "Vengeful"; } } } namespace TempleBase.Upgrades.Top { public class Daybreak : TempleBaseUpgrade { [HarmonyPatch(typeof(MutatorTower), "Mutate")] internal static class DamageSupport_Mutate { [HarmonyPostfix] private static void Postfix(MutatorTower __instance, Model model) { //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Expected O, but got Unknown //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Expected O, but got Unknown if (!((BehaviorMutator)__instance).id.Contains("Daybreak")) { return; } DamageModel val = default(DamageModel); DamageModifierModel val4 = default(DamageModifierModel); foreach (ProjectileModel item in Il2CppGenericIEnumerableExt.ToList(model.GetDescendants())) { if (!ProjectileModelBehaviorExt.HasBehavior(item, ref val)) { continue; } ProjectileModel val2 = ModelExt.Duplicate(TowerModelExt.GetWeapon(Game.instance.model.GetTower(TowerType.BombShooter, 0, 0, 0)).projectile); PrefabReference val3 = ((Il2CppArrayBase)(object)TowerModelExt.GetAttackModel(TempleBaseUpgrade.SunGod).weapons)[0].projectile.display; if (((BehaviorMutator)__instance).id.Contains("Vengeful")) { val3 = CosmeticHelper.SwapDarkTempleAsset(val3); } CreateProjectileOnContactModel behavior = ProjectileModelBehaviorExt.GetBehavior(val2); EffectModel effectModel = ProjectileModelBehaviorExt.GetBehavior(val2).effectModel; effectModel.assetId = val3; effectModel.lifespan /= 20f; behavior.projectile.pierce = 5f + item.pierce; if (((BehaviorMutator)__instance).id.Contains("Vengeful")) { ProjectileModelExt.GetDamageModel(behavior.projectile).damage = val.damage * 2f; } else { ProjectileModelExt.GetDamageModel(behavior.projectile).damage = 1f + val.damage; } ProjectileModelExt.GetDamageModel(behavior.projectile).immuneBloonProperties = (BloonProperties)0; foreach (Model item2 in (Il2CppArrayBase)(object)item.behaviors) { if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)item2, ref val4)) { ProjectileModelBehaviorExt.AddBehavior(behavior.projectile, ModelExt.Duplicate(val4)); } } CreateProjectileOnExhaustFractionModel val5 = new CreateProjectileOnExhaustFractionModel("CreateProjectileOnExhaustFractionModel_", behavior.projectile, behavior.emission, 0.01f, 1f, true, false, false); ProjectileModelBehaviorExt.AddBehavior(item, val5); CreateEffectOnExhaustFractionModel val6 = new CreateEffectOnExhaustFractionModel("", effectModel, 0f, (Fullscreen)0, 0.01f, 1f, false); ProjectileModelBehaviorExt.AddBehavior(item, val6); } } } public override int Path => 0; public override int Tier => 5; public override int Cost => 90000; public override string Description => "The power of the sun in the palm of your hand..."; public override void ApplyUpgrade(TowerModel towerModel) { TowerModelBehaviorExt.GetBehavior(towerModel).mutatorId = ((ModContent)this).Id + (towerModel.isParagon ? "Paragon" : ""); } } public class PiercingLight : TempleBaseUpgrade { public override int Path => 0; public override int Tier => 1; public override int Cost => 750; public override string Description => "Increases The Chosen's pierce by 2."; public override string Icon => "68a4ad3c4022d418b99518023976fd6b"; public override void ApplyUpgrade(TowerModel towerModel) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown PierceSupportModel val = new PierceSupportModel("PierceSupportModel_TempleBase", true, 2f, ((ModContent)this).Id, new Il2CppReferenceArray(0L), false, "", ""); SupportModelExt.ApplyBuffIcon((SupportModel)(object)val); TowerModelBehaviorExt.AddBehavior(towerModel, val); } } public class SolarEruption : TempleBaseUpgrade { [HarmonyPatch(typeof(MutatorTower), "Mutate")] internal static class DamageSupport_Mutate { [HarmonyPostfix] private static void Postfix(MutatorTower __instance, Model model) { //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Expected O, but got Unknown //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Expected O, but got Unknown if (!((BehaviorMutator)__instance).id.Contains("SolarEruption")) { return; } DamageModel val = default(DamageModel); foreach (ProjectileModel item in Il2CppGenericIEnumerableExt.ToList(model.GetDescendants())) { if (ProjectileModelBehaviorExt.HasBehavior(item, ref val)) { ProjectileModel val2 = ModelExt.Duplicate(TowerModelExt.GetWeapon(Game.instance.model.GetTower(TowerType.BombShooter, 0, 0, 0)).projectile); PrefabReference display = ((Il2CppArrayBase)(object)TowerModelExt.GetAttackModel(TempleBaseUpgrade.SunTemple).weapons)[0].projectile.display; CreateProjectileOnContactModel behavior = ProjectileModelBehaviorExt.GetBehavior(val2); EffectModel effectModel = ProjectileModelBehaviorExt.GetBehavior(val2).effectModel; effectModel.assetId = display; effectModel.lifespan /= 20f; behavior.projectile.pierce = 5f + item.pierce / 2f; ProjectileModelExt.GetDamageModel(behavior.projectile).damage = val.damage; ProjectileModelExt.GetDamageModel(behavior.projectile).immuneBloonProperties = (BloonProperties)0; CreateProjectileOnExhaustFractionModel val3 = new CreateProjectileOnExhaustFractionModel("CreateProjectileOnExhaustFractionModel_", behavior.projectile, behavior.emission, 0.01f, 1f, true, false, false); ProjectileModelBehaviorExt.AddBehavior(item, val3); CreateEffectOnExhaustFractionModel val4 = new CreateEffectOnExhaustFractionModel("", effectModel, 0f, (Fullscreen)0, 0.01f, 1f, false); ProjectileModelBehaviorExt.AddBehavior(item, val4); } } } } public override int Path => 0; public override int Tier => 4; public override int Cost => 9000; public override string Description => "The Chosen's damaging projectiles cause explosions on first contact with Bloons."; public override void ApplyUpgrade(TowerModel towerModel) { TowerModelBehaviorExt.GetBehavior(towerModel).mutatorId = ((ModContent)this).Id; } } public class SolarMauler : TempleBaseUpgrade { public override int Path => 0; public override int Tier => 3; public override int Cost => 3000; public override string Description => "The Chosen does further increased damage to Moab class bloons."; public override string Icon => "4f11d9b6f8bd4ec4fb1ef1cde5baf163"; public override void ApplyUpgrade(TowerModel towerModel) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown DamageModifierForTagModel val = new DamageModifierForTagModel("DamageModifierForTagModel_", "Moabs", 1.1f, 1f, false, true, false); DamageModifierSupportModel val2 = new DamageModifierSupportModel("DamageModifierSupportModel_", true, ((ModContent)this).Id, new Il2CppReferenceArray(0L), false, (DamageModifierModel)(object)val, false, 0f, false); SupportModelExt.ApplyBuffIcon((SupportModel)(object)val2); ((Model)val2).AddChildDependant(val); TowerModelBehaviorExt.AddBehavior(towerModel, val2); } } public class SunBurn : TempleBaseUpgrade { public override int Path => 0; public override int Tier => 2; public override int Cost => 1500; public override string Description => "Increases the damage of The Chosen by 1"; public override string Icon => "54fb88eeeb1c54d749d5c19bbcb67125"; public override void ApplyUpgrade(TowerModel towerModel) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown DamageSupportModel val = new DamageSupportModel("DamageSupportModel_TempleBase", true, 1f, ((ModContent)this).Id, new Il2CppReferenceArray(0L), false, false, 0f); SupportModelExt.ApplyBuffIcon((SupportModel)(object)val); TowerModelBehaviorExt.AddBehavior(towerModel, val); } } } namespace TempleBase.Upgrades.Mid { public class AvatarOfSol : TempleBaseUpgrade { [HarmonyPatch(typeof(RangeMutator), "Mutate")] internal static class RangeMutator_Mutate { [HarmonyPostfix] private static void Postfix(RangeMutator __instance, Model model) { TowerModel towerModel = default(TowerModel); if (!((BehaviorMutator)__instance).id.Contains("AvatarOfSol") || !Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)model, ref towerModel) || towerModel.isSubTower) { return; } AttackModel val = ModelExt.Duplicate(TowerModelExt.GetAttackModel(TempleBaseUpgrade.SunTemple)); DisplayModelExt.ApplyDisplay(AttackModelBehaviorExt.GetBehavior(val)); AttackModelBehaviorExt.GetBehavior(val).onlyRotateDuringThrow = false; WeaponModelBehaviorExt.RemoveBehavior(((Il2CppArrayBase)(object)val.weapons)[0]); foreach (TempleTowerMutatorGroupModel item in from groupModel in TowerModelBehaviorExt.GetBehaviors(TempleBaseUpgrade.SunTemple) where groupModel.towerSet == towerModel.towerSet select groupModel) { item.ApplyToAttack(val); } TowerModelBehaviorExt.AddBehavior(towerModel, val); } } private const int Duration = 15; private const int Cooldown = 60; public override int Path => 1; public override int Tier => 4; public override int Cost => 20000; public override string Description => $"Ability: {"The Chosen"} becomes The Avatar of Sol for {15}s. {60}s cooldown."; public override string Icon => "080c12903611a654b8d3281aef7fe553"; public override void ApplyUpgrade(TowerModel towerModel) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Expected O, but got Unknown ActivateRangeSupportZoneModel val = new ActivateRangeSupportZoneModel("ActivateRangeSupportZoneModel_" + ((ModContent)this).Id, ((ModContent)this).Id, true, 0f, 65f, 20f, 99f, false, 15f, new Il2CppReferenceArray(0L)); AbilityHelper val2 = new AbilityHelper(((ModContent)this).Name); val2.DisplayName = ((NamedModContent)this).DisplayName; val2.Description = ((NamedModContent)this).Description; val2.Animation = 1; val2.IconReference = ((ModUpgrade)this).IconReference; val2.Cooldown = 60f; val2.Behaviors = (Model[])(object)new Model[2] { (Model)new CreateSoundOnAbilityModel("", new SoundModel("SoundModel_", TowerModelBehaviorExt.GetBehavior(TempleBaseUpgrade.SunTemple).sound.assetId), (SoundModel)null, (SoundModel)null), (Model)val }; TowerModelBehaviorExt.AddBehavior(towerModel, (ModelHelper)(object)val2); } } public class LetThereBeLight : TempleBaseUpgrade { [HarmonyPatch(typeof(MutatorTower), "Mutate")] internal static class VisibilitySupport_MutatorTower { [HarmonyPostfix] private static void Postfix(MutatorTower __instance, Model model) { if (((BehaviorMutator)__instance).id.Contains("XRAY")) { Il2CppGenericIEnumerable.ForEach(model.GetDescendants(), (Action)delegate(AttackModel attackModel) { attackModel.attackThroughWalls = true; }); Il2CppGenericIEnumerable.ForEach(model.GetDescendants(), (Action)delegate(ProjectileModel projectile) { projectile.ignoreBlockers = true; }); } } } public override int Path => 1; public override int Tier => 2; public override int Cost => 1000; public override string Description => "Further increases The Chosen's range and allows it to attack through walls."; public override void ApplyUpgrade(TowerModel towerModel) { RangeSupportModel behavior = TowerModelBehaviorExt.GetBehavior(towerModel); behavior.multiplier *= 2f; VisibilitySupportModel behavior2 = TowerModelBehaviorExt.GetBehavior(towerModel); behavior2.mutatorId += "XRAY"; } } public class SolarFlares : TempleBaseUpgrade { public override int Path => 1; public override int Tier => 1; public override int Cost => 500; public override string Description => "Allows The Chosen to target Camo Bloons"; public override void ApplyUpgrade(TowerModel towerModel) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown VisibilitySupportModel val = new VisibilitySupportModel("VisibilitySupportModel_TempleBase", true, ((ModContent)this).Id, false, new Il2CppReferenceArray(0L), "", "", false, false); SupportModelExt.ApplyBuffIcon((SupportModel)(object)val); TowerModelBehaviorExt.AddBehavior(towerModel, val); } } public class SolIncarnate : TempleBaseUpgrade { [HarmonyPatch(typeof(RangeMutator), "Mutate")] internal static class RangeMutator_Mutate { [HarmonyPostfix] private static void Postfix(RangeMutator __instance, Model model) { TowerModel towerModel = default(TowerModel); if (!((BehaviorMutator)__instance).id.Contains("SolIncarnate") || !Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)model, ref towerModel) || towerModel.isSubTower) { return; } PrefabReference display = AttackModelBehaviorExt.GetBehavior(TowerModelExt.GetAttackModel(TempleBaseUpgrade.SunTemple)).display; AttackModel val = ModelExt.Duplicate(TowerModelExt.GetAttackModel(TempleBaseUpgrade.SunGod)); DisplayModel behavior = AttackModelBehaviorExt.GetBehavior(val); if (((BehaviorMutator)__instance).id.Contains("Vengeful")) { DisplayModelExt.ApplyDisplay(behavior); } else { behavior.display = display; } WeaponModel obj = ((Il2CppArrayBase)(object)val.weapons)[0]; obj.ejectZ /= 2f; AttackModelBehaviorExt.GetBehavior(val).onlyRotateDuringThrow = false; ProjectileModel projectile = ((Il2CppArrayBase)(object)val.weapons)[0].projectile; projectile.radius *= 1.5f; projectile.scale *= 1.25f; WeaponModelBehaviorExt.RemoveBehavior(((Il2CppArrayBase)(object)val.weapons)[0]); foreach (TempleTowerMutatorGroupModel behavior2 in TowerModelBehaviorExt.GetBehaviors(TempleBaseUpgrade.SunTemple)) { behavior2.ApplyToAttack(val); } foreach (TempleTowerMutatorGroupModel item in from groupModel in TowerModelBehaviorExt.GetBehaviors(TempleBaseUpgrade.SunGod) where groupModel.towerSet == towerModel.towerSet select groupModel) { item.ApplyToAttack(val); } if (((BehaviorMutator)__instance).id.Contains("Vengeful")) { PrefabReference val2 = CosmeticHelper.SwapDarkTempleAsset(projectile.display); PrefabReference display2 = (ProjectileModelBehaviorExt.GetBehavior(projectile).display = val2); projectile.display = display2; DamageModel damageModel = ProjectileModelExt.GetDamageModel(projectile); damageModel.damage *= 2f; } TowerModelBehaviorExt.AddBehavior(towerModel, val); } } private const int Duration = 15; private const int Cooldown = 45; public override int Path => 1; public override int Tier => 5; public override int Cost => 70000; public override string Description => $"Ability: {"The Chosen"} becomes Sol Incarnate for {15}s. {45}s cooldown."; public override string Icon => "a04463dfa8e4c704c8b660dd6e5d64b4"; public override void ApplyUpgrade(TowerModel towerModel) { AbilityModel ability = TowerModelExt.GetAbility(towerModel); ((Model)ability).name = "AbilityModel_" + ((ModContent)this).Name; ability.description = ((NamedModContent)this).Description; ability.displayName = ((NamedModContent)this).DisplayName; ability.icon = ((ModUpgrade)this).IconReference; ability.Cooldown = 45f; ActivateRangeSupportZoneModel behavior = AbilityModelBehaviorExt.GetBehavior(ability); behavior.mutatorId = ((ModContent)this).Id; behavior.lifespan = 15f; } } public class SunBeams : TempleBaseUpgrade { public override int Path => 1; public override int Tier => 3; public override int Cost => 2000; public override string Description => "The Chosen can damage all Bloon types."; public override void ApplyUpgrade(TowerModel towerModel) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown DamageTypeSupportModel val = new DamageTypeSupportModel("DamageTypeSupportModel_TempleBase", true, ((ModContent)this).Id, (BloonProperties)0, new Il2CppReferenceArray(0L), "", ""); SupportModelExt.ApplyBuffIcon((SupportModel)(object)val); TowerModelBehaviorExt.AddBehavior(towerModel, val); } } } namespace TempleBase.Upgrades.Bot { public class LightOnCash : TempleBaseUpgrade { public override int Path => 2; public override int Tier => 2; public override int Cost => 750; public override string Description => "Reduces the cost of The Chosen's upgrades by 5%."; public override void ApplyUpgrade(TowerModel towerModel) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown TempleBaseBuffIcon instance = ModContent.GetInstance(); DiscountZoneModel val = new DiscountZoneModel("", 0.05f, 1, ((ModContent)this).Id, false, 5, 0, ((ModBuffIcon)instance).Icon, ((ModContent)instance).Id, "", "", false, false, false); TowerModelBehaviorExt.AddBehavior(towerModel, val); } } public class SpeedOfLight : TempleBaseUpgrade { public override int Path => 2; public override int Tier => 1; public override int Cost => 500; public override string Description => "Increases The Chosen's attack speed."; public override void ApplyUpgrade(TowerModel towerModel) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown RateSupportModel val = new RateSupportModel("RateSupportModel_TempleBase", 0.85f, true, ((ModContent)this).Id, false, 0, new Il2CppReferenceArray(0L), "", "", false, (DisplayModel)null); SupportModelExt.ApplyBuffIcon((SupportModel)(object)val); TowerModelBehaviorExt.AddBehavior(towerModel, val); } } public class TempleBlessings : TempleBaseUpgrade { public override int Path => 2; public override int Tier => 4; public override int Cost => 50000; public override string Description => "Activate the rest of the Sun Temple sacrifice attacks for the The Chosen's tower set."; public override void ApplyUpgrade(TowerModel towerModel) { } } public class TempleBoons : TempleBaseUpgrade { public override int Path => 2; public override int Tier => 3; public override int Cost => 20000; public override string Description => "Activate some of the Sun Temple sacrifice attacks for the The Chosen's tower set."; public override void ApplyUpgrade(TowerModel towerModel) { } } public class TempleGodsends : TempleBaseUpgrade { public override int Path => 2; public override int Tier => 5; public override int Cost => 100000; public override string Description => "Activate the full True Sun God sacrifice attacks for The Chosen's tower set."; public override void ApplyUpgrade(TowerModel towerModel) { } } } namespace TempleBase.SacrificeAttacks { public abstract class TempleBaseSacAttack : ModContent { public abstract TowerSet TowerSet { get; } public abstract int Tier { get; } protected List Behaviors { get; private set; } = null; protected static TowerModel SunTemple => Game.instance.model.GetTower(TowerType.SuperMonkey, 4, 0, 0); protected static TowerModel SunGod => Game.instance.model.GetTower(TowerType.SuperMonkey, 5, 0, 0); public sealed override void Register() { Behaviors = GetBehaviors().ToList(); for (int i = 0; i < Behaviors.Count; i++) { ((Model)Behaviors[i]).name = ((ModContent)this).Id + "-" + i; } } public void Remove(Tower tower) { TowerModel val = ((Il2CppObjectBase)((Mutable)tower).rootModel).Cast(); bool flag = false; for (Model val2 = ((IEnumerable)((EntityModel)val).behaviors).FirstOrDefault((Func)((Model model) => model.name.Contains(((ModContent)this).Id))); val2 != null; val2 = ((IEnumerable)((EntityModel)val).behaviors).FirstOrDefault((Func)((Model model) => model.name.Contains(((ModContent)this).Id)))) { if (!flag) { val = ModelExt.Duplicate(val); flag = true; } TowerModelBehaviorExt.RemoveBehavior(val, val2); } if (flag) { val.UpdateTargetProviders(); ((Mutable)tower).UpdateRootModel((Model)(object)val); OnUpdate(tower); } } public void Apply(Tower tower) { TowerModel val = ((Il2CppObjectBase)((Mutable)tower).rootModel).Cast(); bool flag = false; foreach (TowerBehaviorModel behavior in Behaviors) { Model val2 = ((IEnumerable)((EntityModel)val).behaviors).FirstOrDefault((Func)((Model model) => model.name.Contains(((Model)behavior).name))); if (val2 == null) { if (!flag) { val = ModelExt.Duplicate(val); flag = true; } val2 = (Model)(object)ModelExt.Duplicate(behavior); TowerModelBehaviorExt.AddBehavior(val, val2); } } if (flag) { val.UpdateTargetProviders(); ((Mutable)tower).UpdateRootModel((Model)(object)val); OnUpdate(tower); } } protected static void OnUpdate(Tower tower) { Simulation simulation = InGame.instance.bridge.Simulation; Il2CppGenericIEnumerable.ForEach(simulation.factory.GetUncast(), (Action)delegate(Tower t) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) if (((CommonBehaviorProxy)(object)t).ParentId == ((RootObject)tower).Id) { simulation.DestroyTower(t, t.owner); } }); } protected TempleTowerMutatorGroupModel GetSacrificeEffect(TowerModel towerModel, int cost) { return TowerModelBehaviorExt.GetBehaviors(towerModel).First((TempleTowerMutatorGroupModel model) => model.towerSet == TowerSet && model.cost == cost); } protected abstract IEnumerable GetBehaviors(); } } namespace TempleBase.SacrificeAttacks.Support { public class Support3 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)8; public override int Tier => 3; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 20001)).GetDescendant()).FixedSacSupport(); yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant()).FixedSacSupport(); yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant()).FixedSacSupport(); if (ModSettingBool.op_Implicit(TempleBaseMod.NerfedIncome)) { yield return (TowerBehaviorModel)(object)ModelExt.Duplicate(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 10001)).GetDescendant()); } else { yield return (TowerBehaviorModel)(object)ModelExt.Duplicate(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 15001)).GetDescendant()); } } } public class Support4 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)8; public override int Tier => 4; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant()).FixedSacSupport(); yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant()).FixedSacSupport(); if (ModSettingBool.op_Implicit(TempleBaseMod.NerfedIncome)) { yield return (TowerBehaviorModel)(object)ModelExt.Duplicate(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 15001)).GetDescendant()); } else { yield return (TowerBehaviorModel)(object)ModelExt.Duplicate(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant()); } yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant()).FixedSacSupport(); yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant()).FixedSacSupport(); } } public class Support5 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)8; public override int Tier => 5; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant()).FixedSacSupport(); yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant()).FixedSacSupport(); yield return (TowerBehaviorModel)(object)ModelExt.Duplicate(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant()); yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant()).FixedSacSupport(); yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant()).FixedSacSupport(); yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 30001)).GetDescendant()).FixedSacSupport(); yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 30001)).GetDescendant()).FixedSacSupport(); if (!ModSettingBool.op_Implicit(TempleBaseMod.NerfedIncome)) { yield return (TowerBehaviorModel)(object)ModelExt.Duplicate(((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 40001)).GetDescendant()); } yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 40001)).GetDescendant()).FixedSacSupport(); yield return (TowerBehaviorModel)(object)((SupportModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 50001)).GetDescendant()).FixedSacSupport(); } } public class Support6 : Support5 { public override TowerSet TowerSet => (TowerSet)8; public override int Tier => 6; protected override IEnumerable GetBehaviors() { return from model in base.GetBehaviors() select model.Paragon(); } } } namespace TempleBase.SacrificeAttacks.Primary { public class Primary3 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)1; public override int Tier => 3; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 10001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant().FixedSacAttack(); } } public class Primary4 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)1; public override int Tier => 4; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant().FixedSacAttack(); } } public class Primary5 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)1; public override int Tier => 5; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 40001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 50001)).GetDescendant().FixedSacAttack(); } } public class Primary6 : Primary5 { public override TowerSet TowerSet => (TowerSet)1; public override int Tier => 6; protected override IEnumerable GetBehaviors() { return from model in base.GetBehaviors() select model.Paragon(); } } } namespace TempleBase.SacrificeAttacks.Military { public class Military3 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)2; public override int Tier => 3; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 10001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 30001)).GetDescendant().FixedSacAttack(); } } public class Military4 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)2; public override int Tier => 4; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant().FixedSacAttack(); } } public class Military5 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)2; public override int Tier => 5; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 40001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 50001)).GetDescendant().FixedSacAttack(); } } public class Military6 : Military5 { public override TowerSet TowerSet => (TowerSet)2; public override int Tier => 6; protected override IEnumerable GetBehaviors() { return from model in base.GetBehaviors() select model.Paragon(); } } } namespace TempleBase.SacrificeAttacks.Magic { public class Magic3 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)4; public override int Tier => 3; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 10001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 20001)).GetDescendant().FixedSacAttack(); } } public class Magic4 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)4; public override int Tier => 4; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 35001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant().FixedSacAttack(); } } public class Magic5 : TempleBaseSacAttack { public override TowerSet TowerSet => (TowerSet)4; public override int Tier => 5; protected override IEnumerable GetBehaviors() { yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 35001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 40001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunTemple, 50001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 35001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 40001)).GetDescendant().FixedSacAttack(); yield return (TowerBehaviorModel)(object)((Model)GetSacrificeEffect(TempleBaseSacAttack.SunGod, 50001)).GetDescendant().FixedSacAttack(); } } public class Magic6 : Magic5 { public override TowerSet TowerSet => (TowerSet)4; public override int Tier => 6; protected override IEnumerable GetBehaviors() { return from model in base.GetBehaviors() select model.Paragon(); } } } namespace TempleBase.Displays { public class SunHead : ModDisplay { public override PrefabReference BaseDisplayReference => AttackModelBehaviorExt.GetBehavior(TowerModelExt.GetAttackModel(Game.instance.model.GetTower(TowerType.SuperMonkey, 4, 0, 0))).display; public override float Scale => 0.85f; } public class VengefulSunHead : ModDisplay { public override PrefabReference BaseDisplayReference => AttackModelBehaviorExt.GetBehavior(TowerModelExt.GetAttackModel(Game.instance.model.GetTower(TowerType.SuperMonkey, 4, 0, 0))).display; public override void ModifyDisplayNode(UnityDisplayNode node) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) ((ModDisplay)this).SetMeshTexture(node, ((ModContent)this).Name); ((ModDisplay)this).SetMeshOutlineColor(node, new Color(90f, 90f, 95f)); } } }