using System;
using System.Collections;
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.ModOptions;
using BTD_Mod_Helper.Api.Testing;
using BTD_Mod_Helper.Extensions;
using HarmonyLib;
using Il2Cpp;
using Il2CppAssets.Scripts.Models;
using Il2CppAssets.Scripts.Models.Bloons.Behaviors;
using Il2CppAssets.Scripts.Models.Effects;
using Il2CppAssets.Scripts.Models.Entities;
using Il2CppAssets.Scripts.Models.Gameplay.Mods;
using Il2CppAssets.Scripts.Models.GenericBehaviors;
using Il2CppAssets.Scripts.Models.Knowledge;
using Il2CppAssets.Scripts.Models.Powers;
using Il2CppAssets.Scripts.Models.TowerSets;
using Il2CppAssets.Scripts.Models.Towers;
using Il2CppAssets.Scripts.Models.Towers.Behaviors;
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.Behaviors.Emissions;
using Il2CppAssets.Scripts.Models.Towers.Behaviors.Emissions.Behaviors;
using Il2CppAssets.Scripts.Models.Towers.Filters;
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.Objects;
using Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack;
using Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Behaviors;
using Il2CppAssets.Scripts.Simulation.Towers.Projectiles;
using Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Behaviors;
using Il2CppAssets.Scripts.Unity;
using Il2CppAssets.Scripts.Unity.Bridge;
using Il2CppAssets.Scripts.Unity.Display;
using Il2CppAssets.Scripts.Unity.Player;
using Il2CppAssets.Scripts.Unity.UI_New.InGame;
using Il2CppAssets.Scripts.Unity.UI_New.Knowledge;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppNinjaKiwi.Common.ResourceUtils;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using Il2CppSystem.Linq;
using Il2CppSystem.Reflection;
using MegaKnowledge;
using MegaKnowledge.MegaKnowledges.Military;
using MelonLoader;
using MelonLoader.Preferences;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(MegaKnowledgeMod), "Mega Knowledge", "1.2.16", "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("MegaKnowledge")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+a95956bc63fd0c7c079d44739107031876904c3c")]
[assembly: AssemblyProduct("MegaKnowledge")]
[assembly: AssemblyTitle("MegaKnowledge")]
[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.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace MegaKnowledge
{
public class KnowledgeMenu
{
[HarmonyPatch(typeof(KnowledgeSkillTree), "UpdateButtonStates")]
internal class KnowledgeSkillTree_UpdateButtonStates
{
[HarmonyPostfix]
internal static void Postfix(KnowledgeSkillTree __instance)
{
//IL_014c: Unknown result type (might be due to invalid IL or missing references)
//IL_0191: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0272: Unknown result type (might be due to invalid IL or missing references)
//IL_0281: Unknown result type (might be due to invalid IL or missing references)
//IL_0286: Unknown result type (might be due to invalid IL or missing references)
knowledgeSkillTree = __instance;
foreach (MegaKnowledge megaKnowledge in ModContent.GetContent<MegaKnowledge>())
{
GameObject gameObject = ((IEnumerable<Component>)((Component)__instance).GetComponentsInChildren<Component>()).First((Component val3) => ((Object)val3).name == megaKnowledge.KnowledgeToCloneFrom).gameObject;
Transform val = gameObject.transform.parent.FindChild(((ModContent)megaKnowledge).Name);
if ((Object)(object)val != (Object)null)
{
return;
}
GameObject val2 = Object.Instantiate<GameObject>(gameObject, gameObject.transform.parent, true);
val2.transform.Translate((float)megaKnowledge.Offset, -400f, 0f);
KnowledgeSkillBtn componentInChildren = val2.GetComponentInChildren<KnowledgeSkillBtn>();
((Object)val2).name = ((ModContent)megaKnowledge).Name;
IEnumerable<KnowledgeModel> knowledgeModels = ((IEnumerable<KnowledgeModel>)Game.instance.model.allKnowledge).Where((KnowledgeModel model) => ((object)model.category/*cast due to .constrained prefix*/).ToString() == ((object)megaKnowledge.TowerSet/*cast due to .constrained prefix*/).ToString());
componentInChildren.ClickedEvent = ClickedEventHandler.op_Implicit((Action<KnowledgeSkillBtn>)delegate(KnowledgeSkillBtn skillBtn)
{
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
bool flag = true;
Btd6Player btd6Player = GameExt.GetBtd6Player(Game.instance);
foreach (KnowledgeModel item in knowledgeModels)
{
if (!btd6Player.HasKnowledge(((Model)item).name))
{
flag = false;
}
}
if (!(Input.GetKey((KeyCode)304) || flag))
{
foreach (KnowledgeSkillBtn value in Buttons[megaKnowledge.TowerSet].Values)
{
value.SetState((KnowlegdeSkillBtnState)1);
}
foreach (MegaKnowledge item2 in from mkv in ModContent.GetContent<MegaKnowledge>()
where mkv.TowerSet == megaKnowledge.TowerSet
select mkv)
{
if (item2 != megaKnowledge)
{
item2.Enabled = false;
}
}
}
if (Input.GetKey((KeyCode)308) || (megaKnowledge.Enabled && (Object)(object)knowledgeSkillTree.currSelectedBtn == (Object)(object)skillBtn))
{
megaKnowledge.Enabled = false;
skillBtn.SetState((KnowlegdeSkillBtnState)1);
}
else
{
megaKnowledge.Enabled = true;
skillBtn.SetState((KnowlegdeSkillBtnState)3);
}
if (!Input.GetKey((KeyCode)308))
{
knowledgeSkillTree.BtnClicked(skillBtn);
}
knowledgeSkillTree.selectedPanelTitleTxt.SetText(((NamedModContent)megaKnowledge).DisplayName);
knowledgeSkillTree.selectedPanelDescTxt.SetText(((NamedModContent)megaKnowledge).Description);
});
componentInChildren.Construct(val2);
if (!Buttons.ContainsKey(megaKnowledge.TowerSet))
{
Buttons[megaKnowledge.TowerSet] = new Dictionary<string, KnowledgeSkillBtn>();
}
Buttons[megaKnowledge.TowerSet][((ModContent)megaKnowledge).Name] = componentInChildren;
componentInChildren.SetState((KnowlegdeSkillBtnState)((!megaKnowledge.Enabled) ? 1 : 3));
Image component = ((IEnumerable<Component>)((Component)componentInChildren).GetComponentsInChildren<Component>()).First((Component val3) => ((Object)val3).name == "Icon").GetComponent<Image>();
ImageExt.SetSprite(component, ModContent.GetSpriteReference<MegaKnowledgeMod>(((ModContent)megaKnowledge).Name));
((Graphic)component).mainTexture.filterMode = (FilterMode)2;
}
Enumerator<GameObject> enumerator2 = knowledgeSkillTree.scrollers.GetEnumerator();
while (enumerator2.MoveNext())
{
GameObject current = enumerator2.Current;
RectTransform component2 = current.GetComponent<RectTransform>();
component2.sizeDelta += new Vector2(0f, 500f);
}
}
}
[HarmonyPatch(typeof(KnowledgeSkillTree), "Update")]
internal class KnowledgeSkillTree_Update
{
[HarmonyPostfix]
internal static void Postfix(KnowledgeSkillTree __instance)
{
foreach (Dictionary<string, KnowledgeSkillBtn> value in Buttons.Values)
{
foreach (string megaKnowledge in value.Keys)
{
value[megaKnowledge].SetSelected(ModContent.GetContent<MegaKnowledge>().First((MegaKnowledge knowledge) => ((ModContent)knowledge).Name == megaKnowledge).Enabled);
}
}
}
}
[HarmonyPatch(typeof(KnowledgeMain), "OnEnable")]
internal class KnowledgeMain_Open
{
[HarmonyPostfix]
internal unsafe static void Postfix(KnowledgeMain __instance)
{
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
Dictionary<TowerSet, GameObject> dictionary = new Dictionary<TowerSet, GameObject>
{
{
(TowerSet)1,
((Component)__instance.primaryCompletedTxt).gameObject
},
{
(TowerSet)2,
((Component)__instance.militaryCompletedTxt).gameObject
},
{
(TowerSet)4,
((Component)__instance.magicCompletedTxt).gameObject
},
{
(TowerSet)8,
((Component)__instance.supportCompletedTxt).gameObject
}
};
foreach (KeyValuePair<TowerSet, GameObject> item in dictionary)
{
item.Deconstruct(out var key, out var value);
TowerSet val = key;
GameObject val2 = value;
GameObject gameObject = ((Component)val2.transform.parent).gameObject;
Transform val3 = gameObject.transform.FindChild(((object)(*(TowerSet*)(&val))/*cast due to .constrained prefix*/).ToString());
if ((Object)(object)val3 != (Object)null)
{
continue;
}
GameObject gameObject2 = ((Component)((Component)gameObject.transform.FindChild("MKIcon")).GetComponentInChildren<Image>()).gameObject;
int num = 25;
foreach (MegaKnowledge item2 in ModContent.GetContent<MegaKnowledge>())
{
if (item2.Enabled && item2.TowerSet == val)
{
GameObject val4 = Object.Instantiate<GameObject>(gameObject2, gameObject.transform, true);
val4.transform.Translate(-150f + (float)num / 3.6f, (float)num, 0f);
val4.transform.Rotate(0f, 0f, -15.5f);
((Object)val4).name = ((object)(*(TowerSet*)(&val))/*cast due to .constrained prefix*/).ToString();
Image component = val4.GetComponent<Image>();
ImageExt.SetSprite(component, ModContent.GetSpriteReference<MegaKnowledgeMod>(((ModContent)item2).Name));
((Graphic)component).mainTexture.filterMode = (FilterMode)2;
num += 160;
}
}
}
}
}
public static KnowledgeSkillTree knowledgeSkillTree;
public static readonly Dictionary<TowerSet, Dictionary<string, KnowledgeSkillBtn>> Buttons = new Dictionary<TowerSet, Dictionary<string, KnowledgeSkillBtn>>();
}
public abstract class MegaKnowledge : NamedModContent
{
internal static bool? overrideEnabled;
private MelonPreferences_Entry<bool> setting;
internal static GameModel currentGameModel;
public bool Enabled
{
get
{
return overrideEnabled ?? setting?.Value ?? false;
}
set
{
setting.Value = value;
}
}
public abstract string TowerId { get; }
public abstract int Offset { get; }
public TowerSet TowerSet { get; private set; }
public string KnowledgeToCloneFrom
{
get
{
//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_000b: 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)
//IL_0023: Expected I4, but got Unknown
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Invalid comparison between Unknown and I4
TowerSet towerSet = TowerSet;
if (1 == 0)
{
}
string result;
switch (towerSet - 1)
{
default:
if ((int)towerSet != 8)
{
goto case 2;
}
result = "BankDeposits";
break;
case 0:
result = "MoreCash";
break;
case 1:
result = "BigBloonSabotage";
break;
case 3:
result = "ManaShield";
break;
case 2:
result = "";
break;
}
if (1 == 0)
{
}
return result;
}
}
public override void Register()
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
if (MegaKnowledgeMod.MegaKnowledgeCategory == null)
{
MegaKnowledgeMod.MegaKnowledgeCategory = MelonPreferences.CreateCategory("MegaKnowledges");
}
TowerSet = Game.instance.model.GetTowerWithName(TowerId).towerSet;
setting = MegaKnowledgeMod.MegaKnowledgeCategory.CreateEntry<bool>(((ModContent)this).Name, false, ((NamedModContent)this).DisplayName, ((NamedModContent)this).Description, false, false, (ValueValidator)null, (string)null);
}
public abstract void Apply(TowerModel model);
public virtual void OnUpdate()
{
}
}
public class MegaKnowledgeMod : BloonsTD6Mod
{
public static MelonPreferences_Category MegaKnowledgeCategory;
public static readonly ModSettingBool OpKnowledge = new ModSettingBool(false)
{
description = "Re-enables the old OP behavior of many MegaKnowledges before they were rebalanced",
icon = "Ui[MaxPowersIcon]",
displayName = "OP Knowledge"
};
public override void OnMainMenu()
{
MegaKnowledgeCategory.SaveToFile(false);
}
public override void OnUpdate()
{
if ((Object)(object)InGame.instance == (Object)null || InGame.instance.bridge == null)
{
return;
}
foreach (MegaKnowledge item in from mk in ModContent.GetContent<MegaKnowledge>()
where mk.Enabled
select mk)
{
item.OnUpdate();
}
}
public override void OnNewGameModel(GameModel result, IReadOnlyList<ModModel> mods)
{
if (GameExt.GetPlayerProfile(Game.instance).knowledgeDisabled || mods.ToList().Any((ModModel model) => Il2CppReferenceArray.Any<MutatorModModel>(model.mutatorMods, (Func<MutatorModModel, bool>)((MutatorModModel mod) => Il2CppSystemObjectExt.Is<DisableMonkeyKnowledgeModModel>((Il2CppObjectBase)(object)mod)))))
{
return;
}
MegaKnowledge.currentGameModel = result;
IEnumerable<MegaKnowledge> enumerable = from megaKnowledge in ModContent.GetContent<MegaKnowledge>()
where megaKnowledge.Enabled
select megaKnowledge;
foreach (MegaKnowledge item in enumerable)
{
foreach (TowerModel item2 in Il2CppGenericIEnumerable.AsIEnumerable<TowerModel>(result.GetTowersWithBaseId(item.TowerId, false)))
{
if (!item2.isParagon)
{
try
{
item.Apply(item2);
}
catch (Exception ex)
{
ModHelper.Warning<MegaKnowledgeMod>((object)("Failed to apply " + ((ModContent)item).Id));
ModHelper.Warning<MegaKnowledgeMod>((object)ex);
}
}
}
}
}
public static void AddAllTargets(AttackModel attackModel)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Expected O, but got Unknown
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Expected O, but got Unknown
//IL_0040: 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_0052: Expected O, but got Unknown
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Expected O, but got Unknown
List<TargetSupplierModel> list = AttackModelBehaviorExt.GetBehaviors<TargetSupplierModel>(attackModel).ToList();
AttackModelBehaviorExt.AddBehavior<TargetFirstModel>(attackModel, CreateTargetFirstModelExt.Create(new Args
{
isSelectable = true
}));
AttackModelBehaviorExt.AddBehavior<TargetLastModel>(attackModel, CreateTargetLastModelExt.Create(new Args
{
isSelectable = true
}));
AttackModelBehaviorExt.AddBehavior<TargetCloseModel>(attackModel, CreateTargetCloseModelExt.Create(new Args
{
isSelectable = true
}));
AttackModelBehaviorExt.AddBehavior<TargetStrongModel>(attackModel, CreateTargetStrongModelExt.Create(new Args
{
isSelectable = true
}));
foreach (TargetSupplierModel item in list)
{
AttackModelBehaviorExt.RemoveBehavior<TargetSupplierModel>(attackModel, item);
AttackModelBehaviorExt.AddBehavior<TargetSupplierModel>(attackModel, item);
}
}
public static void UpdatePointer(AttackModel attackModel)
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Expected O, but got Unknown
RotateToPointerModel behavior = AttackModelBehaviorExt.GetBehavior<RotateToPointerModel>(attackModel);
AttackModelBehaviorExt.AddBehavior<RotateToTargetModel>(attackModel, CreateRotateToTargetModelExt.Create(new Args
{
rotateOnlyOnThrow = behavior.rotateOnlyOnEmit,
rotateTower = behavior.rotateTower
}));
LineEffectModel val = default(LineEffectModel);
if (ModelExt.HasDescendant<LineEffectModel>((Model)(object)attackModel, ref val))
{
val.useRotateToPointer = false;
}
}
}
public class MegaKnowledgeTest : ModTest
{
public override IEnumerator Test()
{
yield return ((ModTest)this).EnsureOnMainMenuWithNoPopUps();
MegaKnowledge.overrideEnabled = true;
yield return ((ModTest)this).LoadIntoGame((InGameData)null);
yield return null;
yield return ((ModTest)this).EnsureOnMainMenuWithNoPopUps();
MegaKnowledge.overrideEnabled = null;
}
}
public static class MiscPatches
{
[HarmonyPatch(typeof(RotateToPointer), "SetRotation")]
internal static class RotateToPointer_SetRotation
{
[HarmonyPrefix]
internal static bool Prefix(RotateToPointer __instance)
{
Attack attack = ((AttackBehavior)__instance).attack;
TargetSupplier val = default(TargetSupplier);
if (!ModContent.GetInstance<DartlingEmpowerment>().Enabled || !Il2CppSystemObjectExt.Is<TargetSupplier>(attack.activeTargetSupplier, ref val) || !AttackBehaviorExt.HasAttackBehavior<RotateToPointer>(attack) || !AttackBehaviorExt.HasAttackBehavior<RotateToTarget>(attack))
{
return true;
}
bool flag = Il2CppSystemObjectExt.Is<TargetFirst>((Il2CppObjectBase)(object)val) || Il2CppSystemObjectExt.Is<TargetLast>((Il2CppObjectBase)(object)val) || Il2CppSystemObjectExt.Is<TargetClose>((Il2CppObjectBase)(object)val) || Il2CppSystemObjectExt.Is<TargetStrong>((Il2CppObjectBase)(object)val) || Il2CppSystemObjectExt.Is<TargetCamo>((Il2CppObjectBase)(object)val);
return !flag;
}
}
[HarmonyPatch(typeof(RotateToTarget), "ApplyRotation")]
internal static class RotateToTarget_ApplyRotation
{
[HarmonyPrefix]
internal static bool Prefix(RotateToTarget __instance)
{
Attack attack = ((AttackBehavior)__instance).attack;
TargetSupplier val = default(TargetSupplier);
if (!ModContent.GetInstance<DartlingEmpowerment>().Enabled || !Il2CppSystemObjectExt.Is<TargetSupplier>(attack.activeTargetSupplier, ref val) || !AttackBehaviorExt.HasAttackBehavior<RotateToPointer>(attack) || !AttackBehaviorExt.HasAttackBehavior<RotateToTarget>(attack))
{
return true;
}
return Il2CppSystemObjectExt.Is<TargetFirst>((Il2CppObjectBase)(object)val) || Il2CppSystemObjectExt.Is<TargetLast>((Il2CppObjectBase)(object)val) || Il2CppSystemObjectExt.Is<TargetClose>((Il2CppObjectBase)(object)val) || Il2CppSystemObjectExt.Is<TargetStrong>((Il2CppObjectBase)(object)val) || Il2CppSystemObjectExt.Is<TargetCamo>((Il2CppObjectBase)(object)val);
}
}
[HarmonyPatch(typeof(TrackTargetWithinTime), "CalculateDirection")]
internal class TrackTargetWithinTime_CalculateDirection
{
[HarmonyPrefix]
internal static bool Prefix(TrackTargetWithinTime __instance)
{
if (((Model)__instance.trackTargetWithinTimeModel).name.Contains("Behind") && (double)((ProjectileBehavior)__instance).projectile.ExhaustFraction < 0.2)
{
return false;
}
return true;
}
}
}
public static class ModHelperData
{
public const string WorksOnVersion = "55.0";
public const string Version = "1.2.16";
public const string Name = "Mega Knowledge";
public const string Description = "Adds in new extra powerful monkey knowledge effects. You can find them at the bottom of the Primary, Military, Magic and Support trees.\n\nNormally, you can have one Mega Knowledge active at a time for each of the four trees, but once you've unlocked every normal Monkey Knowledge in the tree, then you can use all of them at once!";
public const string RepoOwner = "doombubbles";
public const string PrevRepoName = "mega-knowledge";
public const string RepoName = "MegaKnowledge";
}
}
namespace MegaKnowledge.MegaKnowledges.Support
{
public class CarryABigStick : MegaKnowledge
{
public override string Description => "Beast Handlers keep their 000 melee attack, and it gets stronger as you upgrade them.";
public override string TowerId => TowerType.BeastHandler;
public override int Offset => 1600;
public override void Apply(TowerModel model)
{
if (model.tier != 0)
{
AttackModel attackModel = TowerModelExt.GetAttackModel(Game.instance.model.GetTower(TowerType.BeastHandler, 0, 0, 0));
WeaponModel val = ModelExt.Duplicate<WeaponModel>(((Il2CppArrayBase<WeaponModel>)(object)attackModel.weapons)[0]);
ProjectileModel projectile = ProjectileModelBehaviorExt.GetBehavior<CreateProjectileOnContactModel>(val.projectile).projectile;
AttackModel attackModel2 = TowerModelExt.GetAttackModel(model);
AttackModelExt.AddWeapon(attackModel2, val);
attackModel2.range = attackModel.range;
attackModel2.drawRangeCircle = true;
val.Rate /= 1f + (float)(((Il2CppArrayBase<int>)(object)model.tiers)[0] * ((Il2CppArrayBase<int>)(object)model.tiers)[0]) * 0.25f;
projectile.radius += (float)(model.tier * 4);
DamageModel damageModel = ProjectileModelExt.GetDamageModel(projectile);
damageModel.damage += (float)(((Il2CppArrayBase<int>)(object)model.tiers)[1] * ((Il2CppArrayBase<int>)(object)model.tiers)[1]);
attackModel2.range += (float)(((Il2CppArrayBase<int>)(object)model.tiers)[2] * 5);
projectile.pierce += (float)(((Il2CppArrayBase<int>)(object)model.tiers)[2] * ((Il2CppArrayBase<int>)(object)model.tiers)[2]);
}
}
}
public class DigitalAmplification : MegaKnowledge
{
public override string TowerId => TowerType.MonkeyVillage;
public override string Description => "Monkey Villages have greatly increased range.";
public override int Offset => 800;
public override void Apply(TowerModel model)
{
float num = (ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge) ? 2f : 1.5f);
model.range *= num;
foreach (AttackModel attackModel in TowerModelExt.GetAttackModels(model))
{
attackModel.range *= num;
}
}
}
public class Overtime : MegaKnowledge
{
public override string TowerId => TowerType.EngineerMonkey;
public override string Description => ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge) ? "Engineers and their sentries are permanently overclocked." : "Engineers permanently Overclock themselves.";
public override int Offset => 1200;
public override void Apply(TowerModel model)
{
}
public override void OnUpdate()
{
OverclockModel behavior = AbilityModelBehaviorExt.GetBehavior<OverclockModel>(TowerModelExt.GetAbility(Game.instance.model.GetTower(TowerType.EngineerMonkey, 0, 4, 0)));
foreach (TowerToSimulation item in Enumerable.ToArray<TowerToSimulation>(InGame.instance.bridge.GetAllTowers()))
{
string baseId = ((EntityModel)item.tower.towerModel).baseId;
if (((baseId == TowerType.EngineerMonkey && (!item.Def.isParagon || ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge))) || (baseId.Contains(TowerType.Sentry) && ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge))) && ((Mutable)item.tower).GetMutatorById("Overclock") == null)
{
((Mutable)item.tower).AddMutator((BehaviorMutator)(object)behavior.Mutator, -1, false, true, false, true, false, false, false, -1, false, false);
}
}
}
}
public class RealHealthyBananas : MegaKnowledge
{
public override string TowerId => TowerType.BananaFarm;
public override string Description => "Healthy Bananas makes all Banana Farms give 1 life per round per upgrade (aka tier + 1 per round).";
public override int Offset => 0;
public override void Apply(TowerModel model)
{
//IL_001b: 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)
//IL_002b: Expected O, but got Unknown
//IL_002c: 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_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Expected O, but got Unknown
int amount = model.tier + 1;
BonusLivesPerRoundModel behavior = TowerModelBehaviorExt.GetBehavior<BonusLivesPerRoundModel>(model);
if (behavior == null)
{
Args val = new Args();
((ModelArgs<BonusLivesPerRoundModel>)val).name = "BonusLivesPerRoundModel_HealthyBananas";
val.amount = amount;
val.lifespan = 1.25f;
val.assetId = ModContent.CreatePrefabReference("eb70b6823aec0644c81f873e94cb26cc");
TowerModelBehaviorExt.AddBehavior<BonusLivesPerRoundModel>(model, CreateTowersBonusLivesPerRoundModelExt.Create(val));
}
else
{
behavior.amount = amount;
}
}
}
public class SpikeEmpowerment : MegaKnowledge
{
public override string TowerId => TowerType.SpikeFactory;
public override string Description => "Once per round, Spike Factories emit a permanent Road Spikes power on the track. It does extra damage based on the tier of the Spike Factory.";
public override int Offset => 400;
public override string DisplayName => "Spikes R Us";
public override void Apply(TowerModel model)
{
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Expected O, but got Unknown
ProjectileModel val = ModelExt.Duplicate<ProjectileModel>(PowerModelBehaviorExt.GetBehavior<RoadSpikesModel>(MegaKnowledge.currentGameModel.GetPowerWithId("RoadSpikes")).projectileModel);
DamageModel behavior = ProjectileModelBehaviorExt.GetBehavior<DamageModel>(val);
behavior.damage += (float)(model.tier * model.tier);
AttackModel attackModel = TowerModelExt.GetAttackModel(model);
WeaponModel val2 = ModelExt.Duplicate<WeaponModel>(((Il2CppArrayBase<WeaponModel>)(object)attackModel.weapons)[0], ((ModContent)this).Name);
ProjectileModelBehaviorExt.AddBehavior<ArriveAtTargetModel>(val, ((Model)val2).GetDescendant<ArriveAtTargetModel>());
ProjectileModelBehaviorExt.AddBehavior<ScaleProjectileModel>(val, ((Model)val2).GetDescendant<ScaleProjectileModel>());
ProjectileModelBehaviorExt.AddBehavior<HeightOffsetProjectileModel>(val, ((Model)val2).GetDescendant<HeightOffsetProjectileModel>());
WeaponModelExt.SetProjectile(val2, val);
WeaponModelBehaviorExt.AddBehavior<EmissionsPerRoundFilterModel>(val2, CreateEmissionsPerRoundFilterModelExt.Create(new Args
{
count = 1
}));
AttackModelExt.AddWeapon(attackModel, val2);
}
}
}
namespace MegaKnowledge.MegaKnowledges.Primary
{
public class BombVoyage : MegaKnowledge
{
public override string TowerId => TowerType.BombShooter;
public override string Description => ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge) ? "Bomb Shooters' projectiles travel much faster and can damage any Bloon type." : "Bomb Shooters' projectiles travel much faster, and explosions can splash damage onto Camo bloons.";
public override int Offset => -400;
public override void Apply(TowerModel model)
{
ProjectileModel projectile = ((Il2CppArrayBase<WeaponModel>)(object)TowerModelExt.GetAttackModel(model).weapons)[0].projectile;
TravelStraitModel behavior = ProjectileModelBehaviorExt.GetBehavior<TravelStraitModel>(projectile);
CreateProjectileOnContactModel behavior2 = ProjectileModelBehaviorExt.GetBehavior<CreateProjectileOnContactModel>(projectile);
if (behavior != null && behavior2 != null)
{
behavior.Speed *= (ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge) ? 2f : 1.5f);
}
if (ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge))
{
Il2CppGenericIEnumerable.ForEach<DamageModel>(((Model)model).GetDescendants<DamageModel>(), (Action<DamageModel>)delegate(DamageModel damageModel)
{
damageModel.immuneBloonProperties = (BloonProperties)0;
});
return;
}
Il2CppGenericIEnumerable.ForEach<ProjectileModel>(((Model)model).GetDescendants<ProjectileModel>(), (Action<ProjectileModel>)delegate(ProjectileModel p)
{
Il2CppGenericIEnumerable.ForEach<FilterInvisibleModel>(((Model)p).GetDescendants<FilterInvisibleModel>(), (Action<FilterInvisibleModel>)delegate(FilterInvisibleModel invisibleModel)
{
invisibleModel.isActive = false;
});
});
}
}
public class DoubleRanga : MegaKnowledge
{
public override string TowerId => TowerType.BoomerangMonkey;
public override string Description => ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge) ? "Boomerang Monkeys throw 2 Boomerangs at a time!" : "Boomerang Monkeys tier 3 and below throw 2 Boomerangs at a time!";
public override int Offset => -800;
public override void Apply(TowerModel model)
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Expected O, but got Unknown
//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_0079: Expected O, but got Unknown
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Expected O, but got Unknown
if (model.tier <= 3 || ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge))
{
WeaponModel val = ((Il2CppArrayBase<WeaponModel>)(object)TowerModelExt.GetAttackModel(model).weapons)[0];
Args val2 = new Args();
((ModelArgs<RandomArcEmissionModel>)val2).name = "RandomArcEmissionModel_";
val2.count = 2;
val2.randomAngle = 30f;
val2.startOffset = 1f;
RandomArcEmissionModel val3 = CreateRandomArcEmissionModelExt.Create(val2);
Args val4 = new Args();
((ModelArgs<ArcEmissionModel>)val4).name = "ArcEmissionModel_";
val4.Count = 2;
val4.angle = 30f;
ArcEmissionModel emission = CreateArcEmissionModelExt.Create(val4);
val.emission = (EmissionModel)(object)emission;
}
}
}
public class GorillaGlue : MegaKnowledge
{
public override string TowerId => TowerType.GlueGunner;
public override string Description => "Glue Gunners' glue globs do moderate damage themselves.";
public override int Offset => 800;
public override void Apply(TowerModel model)
{
//IL_006a: 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_007d: Expected O, but got Unknown
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: 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)
//IL_00dc: Expected O, but got Unknown
foreach (ProjectileModel item in Il2CppGenericIEnumerableExt.ToList<ProjectileModel>(((Model)model).GetDescendants<ProjectileModel>()))
{
int num = Math.Max(1, model.tier);
if (model.tier == 4)
{
num++;
}
if (model.tier == 5)
{
num += 5;
}
DamageModel damageModel = ProjectileModelExt.GetDamageModel(item);
if (damageModel == null)
{
damageModel = CreateDamageModelExt.Create(new Args
{
damage = num
});
ProjectileModelBehaviorExt.AddBehavior<DamageModel>(item, damageModel);
}
else
{
DamageModel obj = damageModel;
obj.damage += (float)num;
}
if (((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("MOAB Glue"))
{
DamageModifierForTagModel val = CreateDamageModifierForTagModelExt.Create(new Args
{
tag = "Moabs",
damageAddative = num * 9,
applyOverMaxDamage = true
});
ProjectileModelBehaviorExt.AddBehavior<DamageModifierForTagModel>(item, val);
item.hasDamageModifiers = true;
}
}
}
}
public class IceSeeYou : MegaKnowledge
{
public override string TowerId => TowerType.IceMonkey;
public override string Description => "Ice Monkeys detect and remove Camo from Bloons.";
public override int Offset => 400;
public override void Apply(TowerModel model)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
Args val = new Args();
((ModelArgs<RemoveBloonModifiersModel>)(object)val).name = "RemoveBloonModifiersModel_";
val.cleanseCamo = true;
val.bloonTagExcludeList = new string[0];
val.bloonTagExplicitList = new string[0];
RemoveBloonModifiersModel val2 = CreateRemoveBloonModifiersModelExt.Create(val);
foreach (ProjectileModel item in Il2CppGenericIEnumerableExt.ToList<ProjectileModel>(((Model)model).GetDescendants<ProjectileModel>()))
{
ProjectileModelBehaviorExt.AddBehavior<RemoveBloonModifiersModel>(item, ModelExt.Duplicate<RemoveBloonModifiersModel>(val2));
}
Il2CppGenericIEnumerable.ForEach<FilterInvisibleModel>(((Model)model).GetDescendants<FilterInvisibleModel>(), (Action<FilterInvisibleModel>)delegate(FilterInvisibleModel invisibleModel)
{
invisibleModel.isActive = false;
});
}
}
public class SplodeyDarts : MegaKnowledge
{
public override string TowerId => TowerType.DartMonkey;
public override string Description => ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge) ? "Dart Monkey projectiles explode on expiration." : "Dart Monkey projectiles for Tier 3 and below explode on expiration.";
public override int Offset => -1200;
public override void Apply(TowerModel model)
{
//IL_00b0: 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_00c0: Expected O, but got Unknown
//IL_00c1: 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)
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Expected O, but got Unknown
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: Expected O, but got Unknown
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_0169: Expected O, but got Unknown
//IL_0174: Unknown result type (might be due to invalid IL or missing references)
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
//IL_0184: Expected O, but got Unknown
//IL_0185: Unknown result type (might be due to invalid IL or missing references)
//IL_0198: Expected O, but got Unknown
if (model.tier > 3 && !ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge))
{
return;
}
ProjectileModel projectile = TowerModelExt.GetWeapon(Game.instance.model.GetTowerFromId(TowerType.BombShooter)).projectile;
foreach (ProjectileModel item in Il2CppGenericIEnumerableExt.ToList<ProjectileModel>(((Model)model).GetDescendants<ProjectileModel>()))
{
ProjectileModel val = ModelExt.Duplicate<ProjectileModel>(projectile);
CreateProjectileOnContactModel behavior = ProjectileModelBehaviorExt.GetBehavior<CreateProjectileOnContactModel>(val);
CreateSoundOnProjectileCollisionModel behavior2 = ProjectileModelBehaviorExt.GetBehavior<CreateSoundOnProjectileCollisionModel>(val);
CreateEffectOnContactModel behavior3 = ProjectileModelBehaviorExt.GetBehavior<CreateEffectOnContactModel>(val);
if (((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("Enhanced Eyesight"))
{
((Model)behavior.projectile).GetDescendant<FilterInvisibleModel>().isActive = false;
}
Args val2 = new Args();
((ModelArgs<CreateProjectileOnExhaustFractionModel>)val2).name = "SplodeyDarts";
val2.projectile = behavior.projectile;
val2.emission = behavior.emission;
val2.fraction = 1f;
val2.durationfraction = 1f;
val2.canCreateInBetweenRounds = true;
CreateProjectileOnExhaustFractionModel val3 = CreateCreateProjectileOnExhaustFractionModelExt.Create(val2);
ProjectileModelBehaviorExt.AddBehavior<CreateProjectileOnExhaustFractionModel>(item, val3);
Args val4 = new Args();
((ModelArgs<CreateSoundOnProjectileExhaustModel>)val4).name = "SplodeyDarts";
val4.sound1 = behavior2.sound1;
val4.sound2 = behavior2.sound2;
val4.sound3 = behavior2.sound3;
val4.sound4 = behavior2.sound4;
val4.sound5 = behavior2.sound5;
CreateSoundOnProjectileExhaustModel val5 = CreateCreateSoundOnProjectileExhaustModelExt.Create(val4);
ProjectileModelBehaviorExt.AddBehavior<CreateSoundOnProjectileExhaustModel>(item, val5);
Args val6 = new Args();
((ModelArgs<CreateEffectOnExhaustedModel>)val6).name = "SplodeyDarts";
val6.effectModel = behavior3.effectModel;
CreateEffectOnExhaustedModel val7 = CreateCreateEffectOnExhaustedModelExt.Create(val6);
ProjectileModelBehaviorExt.AddBehavior<CreateEffectOnExhaustedModel>(item, val7);
if (!ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge))
{
behavior.projectile.pierce = 5f;
}
}
}
}
public class TackAttack : MegaKnowledge
{
public override string TowerId => TowerType.TackShooter;
public override string Description => "Tack Shooters' attack constantly, and their projectiles travel farther.";
public override int Offset => 0;
public override void Apply(TowerModel model)
{
TowerModelExt.GetAttackModel(model).fireWithoutTarget = true;
foreach (ProjectileModel item in Il2CppGenericIEnumerableExt.ToList<ProjectileModel>(((Model)model).GetDescendants<ProjectileModel>()))
{
TravelStraitModel behavior = ProjectileModelBehaviorExt.GetBehavior<TravelStraitModel>(item);
if (behavior != null)
{
behavior.Lifespan *= 1.5f;
}
}
if (((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("Ring of Fire"))
{
model.range *= 1.5f;
}
}
}
}
namespace MegaKnowledge.MegaKnowledges.Military
{
public class AceHardware : MegaKnowledge
{
public override string TowerId => TowerType.MonkeyAce;
public override string Description => "Monkey Aces get a new shorter ranged focus-firing gunner attack.";
public override int Offset => 0;
public override void Apply(TowerModel model)
{
TowerModel tower = Game.instance.model.GetTower(TowerType.MonkeyAce, 0, 0, 4);
AttackModel val = ModelExt.Duplicate<AttackModel>(TowerModelExt.GetAttackModel(tower, "Spectre"), ((ModContent)this).Name);
WeaponModel val2 = ((Il2CppArrayBase<WeaponModel>)(object)val.weapons)[0];
WeaponModelBehaviorExt.RemoveBehavior<AlternateProjectileModel>(val2);
val.range = 60 + 20 * model.tier;
val2.Rate = 0.6f - 0.1f * (float)model.tier;
ProjectileModelExt.GetDamageModel(val2.projectile).damage = 1 + model.tier / 2;
val2.projectile.pierce = ((Il2CppArrayBase<WeaponModel>)(object)TowerModelExt.GetAttackModels(model).First((AttackModel a) => !((Model)a).name.Contains("Spectre")).weapons)[0].projectile.pierce;
if (((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("Spy Plane"))
{
Il2CppGenericIEnumerable.ForEach<FilterInvisibleModel>(((Model)val).GetDescendants<FilterInvisibleModel>(), (Action<FilterInvisibleModel>)delegate(FilterInvisibleModel m)
{
m.isActive = false;
});
}
TowerModelBehaviorExt.AddBehavior<AttackModel>(model, val);
}
}
public class AllPowerToThrusters : MegaKnowledge
{
public override string TowerId => TowerType.HeliPilot;
public override string Description => "Heli Pilots can move at hyper-sonic speeds";
public override int Offset => 400;
public override void Apply(TowerModel model)
{
HeliMovementModel descendant = ((Model)model).GetDescendant<HeliMovementModel>();
descendant.maxSpeed *= 3f;
descendant.brakeForce *= 3f;
descendant.movementForceStart *= 3f;
descendant.movementForceEnd *= 3f;
descendant.movementForceEndSquared = descendant.movementForceEnd * descendant.movementForceEnd;
descendant.strafeDistance *= 3f;
descendant.strafeDistanceSquared = descendant.strafeDistance * descendant.strafeDistance;
}
}
public class AttackAndSupport : MegaKnowledge
{
public override string TowerId => TowerType.MonkeySub;
public override string Description => "Monkey Subs don't need to submerge to gain submerged benefits.";
public override int Offset => -800;
public override void Apply(TowerModel model)
{
//IL_0061: 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_0071: Expected O, but got Unknown
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: 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_00a6: Expected O, but got Unknown
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Expected O, but got Unknown
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Expected O, but got Unknown
//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
//IL_01d7: Expected O, but got Unknown
//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
//IL_01ed: Expected O, but got Unknown
SubmergeModel val = default(SubmergeModel);
if (!TowerModelBehaviorExt.HasBehavior<SubmergeModel>(model, ref val) || model.isParagon)
{
return;
}
model.targetTypes = Game.instance.model.GetTowerFromId(TowerType.MonkeySub).targetTypes;
EffectModel effectModel = TowerModelBehaviorExt.GetBehavior<SubmergeEffectModel>(model).effectModel;
if ((double)val.heroXpScale > 1.0)
{
Args val2 = new Args();
((ModelArgs<HeroXpScaleSupportModel>)val2).name = "HeroXpScaleSupportModel_";
val2.isUnique = true;
val2.heroXpScale = val.heroXpScale;
val2.buffLocsName = ((TowerBehaviorBuffModel)val).buffLocsName;
val2.buffIconName = ((TowerBehaviorBuffModel)val).buffIconName;
TowerModelBehaviorExt.AddBehavior<HeroXpScaleSupportModel>(model, CreateHeroXpScaleSupportModelExt.Create(val2));
}
if ((double)val.abilityCooldownSpeedScale > 1.0)
{
Args val3 = new Args();
((ModelArgs<AbilityCooldownScaleSupportModel>)val3).name = "AbilityCooldownScaleSupportModel_";
val3.isUnique = true;
val3.abilityCooldownSpeedScale = val.abilityCooldownSpeedScale;
val3.affectsOnlyWater = true;
val3.buffLocsName = ((TowerBehaviorBuffModel)val).buffLocsName;
val3.buffIconName = ((TowerBehaviorBuffModel)val).buffIconName;
val3.mutatorPriority = val.supportMutatorPriority;
TowerModelBehaviorExt.AddBehavior<AbilityCooldownScaleSupportModel>(model, CreateAbilityCooldownScaleSupportModelExt.Create(val3));
}
TowerModelBehaviorExt.RemoveBehavior<SubmergeModel>(model);
foreach (AttackModel attackModel in TowerModelExt.GetAttackModels(model))
{
if (((Model)attackModel).name.Contains("Submerge"))
{
((Model)attackModel).name = ((Model)attackModel).name.Replace("Submerged", "");
WeaponModelBehaviorExt.GetBehavior<EjectEffectModel>(((Il2CppArrayBase<WeaponModel>)(object)attackModel.weapons)[0]).effectModel.assetId = val.attackDisplayPath;
}
AttackModelBehaviorExt.RemoveBehavior<SubmergedTargetModel>(attackModel);
}
Args val4 = new Args();
((ModelArgs<CreateEffectAfterTimeModel>)val4).name = "CreateEffectAfterTimeModel_";
val4.effectModel = effectModel;
val4.useRoundTime = true;
TowerModelBehaviorExt.AddBehavior<CreateEffectAfterTimeModel>(model, CreateCreateEffectAfterTimeModelExt.Create(val4));
}
}
public class DartlingEmpowerment : MegaKnowledge
{
public override string TowerId => TowerType.DartlingGunner;
public override string Description => "Dartling Gunner can attack like a regular tower.";
public override int Offset => 1200;
public override void Apply(TowerModel model)
{
if (((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("Bloon Area Denial System"))
{
return;
}
AttackModel attackModel = TowerModelExt.GetAttackModel(model);
MegaKnowledgeMod.UpdatePointer(attackModel);
MegaKnowledgeMod.AddAllTargets(attackModel);
model.UpdateTargetProviders();
if (((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("Faster Swivel"))
{
TravelStraitModel behavior = ProjectileModelBehaviorExt.GetBehavior<TravelStraitModel>(((Il2CppArrayBase<WeaponModel>)(object)attackModel.weapons)[0].projectile);
if (behavior != null)
{
behavior.Speed *= 1.3428571f;
}
}
}
}
public class Dreadnought : MegaKnowledge
{
public override string TowerId => TowerType.MonkeyBuccaneer;
public override string Description => "Monkey Buccaneers shoot molten cannon balls instead of darts and grapes.";
public override int Offset => -400;
public override void Apply(TowerModel model)
{
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
AttackModel attackModel = TowerModelExt.GetAttackModel(model);
AddBehaviorToBloonModel descendant = ((Model)Game.instance.model.GetTower(TowerType.MonkeyBuccaneer, 0, 2, 0)).GetDescendant<AddBehaviorToBloonModel>();
foreach (ProjectileModel item in from projectileModel in Il2CppGenericIEnumerableExt.ToList<ProjectileModel>(((Model)attackModel).GetDescendants<ProjectileModel>())
where !((Model)projectileModel).name.Contains("Explosion") && ProjectileModelExt.GetDamageModel(projectileModel) != null
select projectileModel)
{
if (!ProjectileModelBehaviorExt.HasBehavior<AddBehaviorToBloonModel>(item))
{
ProjectileModelBehaviorExt.AddBehavior<AddBehaviorToBloonModel>(item, ModelExt.Duplicate<AddBehaviorToBloonModel>(descendant));
}
DamageOverTimeModel descendant2 = ((Model)item).GetDescendant<DamageOverTimeModel>();
bool flag = ((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("Buccaneer-Hot Shot");
if (ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge))
{
descendant2.triggerImmediate = flag;
}
else if (!flag)
{
descendant2.damage = 1f;
}
item.scale = ((item.radius > 3f) ? 0.7f : 0.5f);
item.display = ModContent.CreatePrefabReference("c840e245a0b1deb4284cfc3f953e16cf");
DamageModel damageModel = ProjectileModelExt.GetDamageModel(item);
BloonProperties immuneBloonProperties = (BloonProperties)0;
damageModel.immuneBloonPropertiesOriginal = (BloonProperties)0;
damageModel.immuneBloonProperties = immuneBloonProperties;
item.UpdateCollisionPassList();
}
}
}
public class MortarEmpowerment : MegaKnowledge
{
public override string TowerId => TowerType.MortarMonkey;
public override string Description => "Mortar Monkey can attack like a regular tower.";
public override int Offset => 800;
public override void Apply(TowerModel model)
{
AttackModel attackModel = TowerModelExt.GetAttackModel(model);
MegaKnowledgeMod.AddAllTargets(attackModel);
model.towerSelectionMenuThemeId = "ActionButton";
model.UpdateTargetProviders();
}
}
public class RifleRange : MegaKnowledge
{
public override string TowerId => TowerType.SniperMonkey;
public override string Description => "Sniper Monkey shots can critically strike for double damage.";
public override int Offset => -1200;
public override void Apply(TowerModel model)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Expected O, but got Unknown
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Expected O, but got Unknown
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Expected O, but got Unknown
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00bc: Expected O, but got Unknown
float damage = ProjectileModelExt.GetDamageModel(TowerModelExt.GetWeapon(model).projectile).damage;
WeaponModel weapon = TowerModelExt.GetWeapon(model);
Args val = new Args
{
damage = damage * 2f,
lower = 1,
upper = 6
};
Args val2 = new Args();
((ModelArgs<DisplayModel>)val2).name = "Crit";
val2.display = ModContent.CreatePrefabReference("252e82e70578330429a758339e10fd25");
val2.category = (DisplayCategory)32;
val.displayModel = CreateDisplayModelExt.Create(val2);
val.distributeToChildren = true;
WeaponModelBehaviorExt.AddBehavior<CritMultiplierModel>(weapon, CreateCritMultiplierModelExt.Create(val));
ProjectileModelBehaviorExt.AddBehavior<ShowTextOnHitModel>(TowerModelExt.GetWeapon(model).projectile, CreateShowTextOnHitModelExt.Create(new Args
{
assetId = ModContent.CreatePrefabReference("3dcdbc19136c60846ab944ada06695c0"),
lifespan = 0.5f
}));
}
}
}
namespace MegaKnowledge.MegaKnowledges.Magic
{
public class BloonAreNotPrepared : MegaKnowledge
{
public override string TowerId => TowerType.Druid;
public override string Description => "Druids' personal stacking buffs always have maximum effect.";
public override int Offset => -400;
public override void Apply(TowerModel model)
{
if (((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("Heart of Vengeance"))
{
foreach (WeaponModel weapon in TowerModelExt.GetWeapons(model))
{
LifeBasedAttackSpeedModel behavior = WeaponModelBehaviorExt.GetBehavior<LifeBasedAttackSpeedModel>(weapon);
if (behavior != null)
{
float num = (float)behavior.lifeCap * behavior.ratePerLife + behavior.baseRateIncrease;
weapon.Rate /= 1f + num;
WeaponModelBehaviorExt.RemoveBehavior<LifeBasedAttackSpeedModel>(weapon);
}
}
}
if (((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("Druid of Wrath"))
{
DamageBasedAttackSpeedModel behavior2 = TowerModelBehaviorExt.GetBehavior<DamageBasedAttackSpeedModel>(model);
if (behavior2 != null)
{
float num2 = (float)behavior2.maxStacks * behavior2.increasePerThreshold;
foreach (WeaponModel weapon2 in TowerModelExt.GetWeapons(model))
{
weapon2.Rate /= 1f + num2;
}
}
}
if (((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("Avatar of Wrath"))
{
DruidVengeanceEffectModel behavior3 = TowerModelBehaviorExt.GetBehavior<DruidVengeanceEffectModel>(model);
if (behavior3 != null)
{
DamageModifierWrathModel damageModifierWrathModel = behavior3.damageModifierWrathModel;
damageModifierWrathModel.rbeThreshold = 1;
behavior3.epicGlowEffectStacks = -1;
}
}
}
}
public class CrystalBall : MegaKnowledge
{
public override string TowerId => TowerType.WizardMonkey;
public override string Description => ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge) ? "The Guided Magic upgrade gives Wizard Monkeys Advanced Intel style targeting" : "Instead of letting Wizard Monkeys see through walls, the Guided Magic upgrade gives them Advanced Intel style targeting.";
public override int Offset => -2000;
public override void Apply(TowerModel model)
{
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Expected O, but got Unknown
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Expected O, but got Unknown
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Expected O, but got Unknown
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_0139: Unknown result type (might be due to invalid IL or missing references)
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Expected O, but got Unknown
//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
//IL_01c2: Expected O, but got Unknown
//IL_01c8: Expected O, but got Unknown
if (!((Il2CppArrayBase<string>)(object)model.appliedUpgrades).Contains("Guided Magic"))
{
return;
}
if (!ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge))
{
model.ignoreBlockers = false;
}
TrackTargetModel behavior = ProjectileModelBehaviorExt.GetBehavior<TrackTargetModel>(TowerModelExt.GetWeapon(model).projectile);
foreach (AttackModel attackModel in TowerModelExt.GetAttackModels(model))
{
if (AttackModelBehaviorExt.GetBehavior<TargetFirstPrioCamoModel>(attackModel) != null)
{
AttackModelBehaviorExt.RemoveBehavior<TargetFirstPrioCamoModel>(attackModel);
AttackModelBehaviorExt.AddBehavior<TargetFirstSharedRangeModel>(attackModel, CreateTargetFirstSharedRangeModelExt.Create(new Args
{
isSelectable = true,
isSharedRangeEnabled = true
}));
}
if (AttackModelBehaviorExt.GetBehavior<TargetLastPrioCamoModel>(attackModel) != null)
{
AttackModelBehaviorExt.RemoveBehavior<TargetLastPrioCamoModel>(attackModel);
AttackModelBehaviorExt.AddBehavior<TargetLastSharedRangeModel>(attackModel, CreateTargetLastSharedRangeModelExt.Create(new Args
{
isSelectable = true,
isSharedRangeEnabled = true
}));
}
if (AttackModelBehaviorExt.GetBehavior<TargetClosePrioCamoModel>(attackModel) != null)
{
AttackModelBehaviorExt.RemoveBehavior<TargetClosePrioCamoModel>(attackModel);
AttackModelBehaviorExt.AddBehavior<TargetCloseSharedRangeModel>(attackModel, CreateTargetCloseSharedRangeModelExt.Create(new Args
{
isSelectable = true,
isSharedRangeEnabled = true
}));
}
if (AttackModelBehaviorExt.GetBehavior<TargetStrongPrioCamoModel>(attackModel) != null)
{
AttackModelBehaviorExt.RemoveBehavior<TargetStrongPrioCamoModel>(attackModel);
AttackModelBehaviorExt.AddBehavior<TargetStrongSharedRangeModel>(attackModel, CreateTargetStrongSharedRangeModelExt.Create(new Args
{
isSelectable = true,
isSharedRangeEnabled = true
}));
}
if (!ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge))
{
attackModel.attackThroughWalls = false;
}
}
foreach (WeaponModel weapon in TowerModelExt.GetWeapons(model))
{
EmissionModel emission = weapon.emission;
Args val = new Args();
((ModelArgs<EmissionCamoIfTargetIsCamoModel>)val).name = "EmissionCamoIfTargetIsCamoModel_CamoEmissionBehavior";
EmissionModelBehaviorExt.AddBehavior<EmissionCamoIfTargetIsCamoModel>(emission, CreateEmissionCamoIfTargetIsCamoModelExt.Create(val));
}
foreach (ProjectileModel item in Il2CppGenericIEnumerableExt.ToList<ProjectileModel>(((Model)model).GetDescendants<ProjectileModel>()))
{
TravelStraitModel behavior2 = ProjectileModelBehaviorExt.GetBehavior<TravelStraitModel>(item);
if (behavior2 != null)
{
float val2 = behavior2.Lifespan * (200f / behavior2.Speed);
behavior2.Lifespan = Math.Max(behavior2.Lifespan, val2);
if (ProjectileModelBehaviorExt.GetBehavior<TrackTargetModel>(item) == null)
{
ProjectileModelBehaviorExt.AddBehavior<TrackTargetModel>(item, ModelExt.Duplicate<TrackTargetModel>(behavior));
}
}
if (!ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge))
{
item.ignoreBlockers = false;
}
}
}
}
public class Oktoberfest : MegaKnowledge
{
public override string TowerId => TowerType.Alchemist;
public override string Description => "Alchemist buff potions last for 50% more shots.";
public override int Offset => -800;
public override void Apply(TowerModel model)
{
AddBerserkerBrewToProjectileModel descendant = ((Model)model).GetDescendant<AddBerserkerBrewToProjectileModel>();
if (descendant != null)
{
descendant.cap = (int)((double)descendant.cap * 1.5);
BerserkerBrewCheckModel val = ((Il2CppObjectBase)((Il2CppArrayBase<TowerBehaviorModel>)(object)descendant.towerBehaviors)[0]).Cast<BerserkerBrewCheckModel>();
val.maxCount = (int)((double)val.maxCount * 1.5);
}
AddAcidicMixtureToProjectileModel descendant2 = ((Model)model).GetDescendant<AddAcidicMixtureToProjectileModel>();
if (descendant2 != null)
{
descendant2.cap = (int)((double)descendant2.cap * 1.5);
AcidicMixtureCheckModel val2 = ((Il2CppObjectBase)((Il2CppArrayBase<TowerBehaviorModel>)(object)descendant2.towerBehaviors)[0]).Cast<AcidicMixtureCheckModel>();
val2.maxCount = (int)((double)val2.maxCount * 1.5);
}
}
}
public class ShadowDouble : MegaKnowledge
{
public override string TowerId => TowerType.NinjaMonkey;
public override string Description => "Ninja Monkeys can throw extra Shurikens behind them if Bloons are present.";
public override int Offset => -1200;
public override void Apply(TowerModel model)
{
//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_0040: Expected O, but got Unknown
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Expected O, but got Unknown
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Expected O, but got Unknown
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Expected O, but got Unknown
//IL_00b6: 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)
//IL_00cc: Expected O, but got Unknown
AttackModel attackModel = TowerModelExt.GetAttackModel(model);
WeaponModel val = ((Il2CppArrayBase<WeaponModel>)(object)attackModel.weapons)[0];
WeaponModel val2 = ModelExt.Duplicate<WeaponModel>(val);
val2.projectile.display = ModContent.CreatePrefabReference<ShadowShuriken>();
WeaponModelBehaviorExt.AddBehavior<FireAlternateWeaponModel>(val, CreateFireAlternateWeaponModelExt.Create(new Args
{
weaponId = 1
}));
WeaponModelBehaviorExt.AddBehavior<FireWhenAlternateWeaponIsReadyModel>(val2, CreateFireWhenAlternateWeaponIsReadyModelExt.Create(new Args
{
weaponId = 1
}));
WeaponModelBehaviorExt.AddBehavior<FilterTargetAngleFilterModel>(val2, CreateFilterTargetAngleFilterModelExt.Create(new Args
{
fieldOfView = 45f,
baseTowerRotationOffset = 180f,
shareFilterTargets = true,
minTimeBetweenFilterTargetsFrames = 56
}));
ArcEmissionModel val3 = ((Il2CppObjectBase)val2.emission).TryCast<ArcEmissionModel>();
if (val3 != null)
{
EmissionModelBehaviorExt.AddBehavior<EmissionArcRotationOffTowerDirectionModel>(val2.emission, CreateEmissionArcRotationOffTowerDirectionModelExt.Create(new Args
{
offsetRotation = 180
}));
}
else
{
EmissionModelBehaviorExt.AddBehavior<EmissionRotationOffTowerDirectionModel>(val2.emission, CreateEmissionRotationOffTowerDirectionModelExt.Create(new Args
{
offsetRotation = 180
}));
}
((Model)val2).name = ((Model)val2).name + " Secondary";
val2.ejectX *= -1f;
TrackTargetWithinTimeModel behavior = ProjectileModelBehaviorExt.GetBehavior<TrackTargetWithinTimeModel>(val2.projectile);
if (behavior != null)
{
((Model)behavior).name = ((Model)behavior).name + "Behind";
}
AttackModelExt.AddWeapon(attackModel, val2);
}
}
public class ShadowShuriken : ModDisplay
{
public override PrefabReference BaseDisplayReference => TowerModelExt.GetWeapon(Game.instance.model.GetTower(TowerType.NinjaMonkey, 0, 0, 0)).projectile.display;
public override void ModifyDisplayNode(UnityDisplayNode node)
{
((ModDisplay)this).Set2DTexture(node, ((ModContent)this).Name);
}
}
public class TheBigThree : MegaKnowledge
{
public override string TowerId => TowerType.SuperMonkey;
public override string Description => "Sun Avatars, Robo Cops, and Dark Knights buff the attack speed / range / pierce of any of the other two types nearby them.";
public override int Offset => -1600;
public override void Apply(TowerModel model)
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Expected O, but got Unknown
//IL_006a: 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_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Expected O, but got Unknown
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Expected O, but got Unknown
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_0106: Expected O, but got Unknown
//IL_0192: Unknown result type (might be due to invalid IL or missing references)
//IL_0197: Unknown result type (might be due to invalid IL or missing references)
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
//IL_01be: Unknown result type (might be due to invalid IL or missing references)
//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
//IL_01e3: Expected O, but got Unknown
if (model.tier < 3)
{
return;
}
Args val = new Args();
((ModelArgs<FilterInBaseTowerIdModel>)(object)val).name = "Filter_Supes";
val.baseIds = new string[1] { TowerType.SuperMonkey };
FilterInBaseTowerIdModel val2 = CreateFilterInBaseTowerIdModelExt.Create(val);
int num = (ModSettingBool.op_Implicit(MegaKnowledgeMod.OpKnowledge) ? model.tier : (model.tier - 2));
SupportModel[] array = (SupportModel[])(object)new SupportModel[3]
{
SupportModelExt.ApplyBuffIcon<SunAvatarIcon>((SupportModel)(object)CreateRateSupportModelExt.Create(new Args
{
multiplier = 1f - (float)num * 0.05f,
isUnique = true,
mutatorId = "TheBigThree1"
})),
SupportModelExt.ApplyBuffIcon<RoboMonkeyIcon>((SupportModel)(object)CreateRangeSupportModelExt.Create(new Args
{
isUnique = true,
multiplier = (float)num * 0.05f,
mutatorId = "TheBigThree2"
})),
SupportModelExt.ApplyBuffIcon<DarkKnightIcon>((SupportModel)(object)CreatePierceSupportModelExt.Create(new Args
{
isUnique = true,
pierce = model.tier,
mutatorId = "TheBigThree3"
}))
};
for (int i = 0; i < 3; i++)
{
if (((Il2CppArrayBase<int>)(object)model.tiers)[i] < 3)
{
continue;
}
SupportModel val3 = array[i];
for (int j = 0; j < 3; j++)
{
if (i != j)
{
SupportModel val4 = ModelExt.Duplicate<SupportModel>(val3);
((Model)val4).name = ((MemberInfo)((Object)val3).GetIl2CppType()).Name + "_" + j;
val4.filters = Il2CppReferenceArray<TowerFilterModel>.op_Implicit((TowerFilterModel[])(object)new TowerFilterModel[2]
{
(TowerFilterModel)ModelExt.Duplicate<FilterInBaseTowerIdModel>(val2),
(TowerFilterModel)CreateFilterInTowerTiersModelExt.Create(new Args
{
path1MinTier = ((j == 0) ? 3 : 0),
path1MaxTier = 5,
path2MinTier = ((j == 1) ? 3 : 0),
path2MaxTier = 5,
path3MinTier = ((j == 2) ? 3 : 0),
path3MaxTier = 5
})
});
TowerModelBehaviorExt.AddBehavior<SupportModel>(model, val4);
}
}
}
}
}
public class SunAvatarIcon : ModBuffIcon
{
public override string Icon => "349e26a7177707840b25ed118ed9df65";
}
public class RoboMonkeyIcon : ModBuffIcon
{
public override string Icon => "e2bdaec3ca44ace41b051b67913443aa";
}
public class DarkKnightIcon : ModBuffIcon
{
public override string Icon => "42dade880051bd64cb20eded6e436f65";
}
}