using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using DM;
using FhpSLib;
using HarmonyLib;
using Landfall.TABS;
using Landfall.TABS.AI.Components.Modifiers;
using Landfall.TABS.UnitEditor;
using Landfall.TABS.Workshop;
using RunicSpells;
using RunicSpellsScripts;
using RunicSpellsUtilities;
using SLMA;
using TFBGames;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("RunicSpells")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("GeeztJeez")]
[assembly: AssemblyProduct("RunicSpells")]
[assembly: AssemblyCopyright("Copyright © Geezt Lifetime")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("7acfaef0-7669-4401-8bff-5a9a02e18c75")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace RunicSpells
{
public static class UManager
{
public class InitManager
{
public static void InitExplosions(Sprite icon)
{
}
public static void InitEffects(Sprite icon)
{
}
public static void InitCustomPrefabs(Sprite icon)
{
}
public static void InitClothings(Sprite icon, string catNm = "Runic Spells", UTISeal.AssetType assetType = UTISeal.AssetType.Prop, TagType archType = (TagType)0)
{
}
public static void InitWeapons(Sprite icon, string catNm = "Runic Spells", UTISeal.AssetType assetType = UTISeal.AssetType.Weapon, TagType archType = (TagType)0)
{
}
public static void InitProjectiles(Sprite icon, string catNm = "Runic Spells", UTISeal.AssetType assetType = UTISeal.AssetType.Projectile, TagType archType = (TagType)0)
{
//IL_002c: 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_0086: Unknown result type (might be due to invalid IL or missing references)
int startId = 632894532;
UTISeal.Uti.ICat.SetTag(UPool.MyPool.AddObject("P_InstaBeamblastLaserSingular", UTISeal.Uti.LoBuGaOb("P_InstaBeamblastLaserSingular"), true, (HideFlags)52, icon, UTISeal.Uti.IDScn(assetType, startId), true), catNm, archType);
UTISeal.Uti.ICat.SetTag(UPool.MyPool.AddObject("P_InstaBeamblastLaserDouble", UTISeal.Uti.LoBuGaOb("P_InstaBeamblastLaserDouble"), true, (HideFlags)52, icon, UTISeal.Uti.IDScn(assetType, startId), true), catNm, archType);
UTISeal.Uti.ICat.SetTag(UPool.MyPool.AddObject("P_InstaBeamblastLaserTringular", UTISeal.Uti.LoBuGaOb("P_InstaBeamblastLaserTringular"), true, (HideFlags)52, icon, UTISeal.Uti.IDScn(assetType, startId), true), catNm, archType);
}
public static void InitAbilities(Sprite icon, string catNm = "Runic Spells", UTISeal.AssetType assetType = UTISeal.AssetType.Ability, TagType archType = (TagType)0)
{
}
public static void InitUnitBases(Sprite icon, string catNm = "Runic Spells", UTISeal.AssetType assetType = UTISeal.AssetType.UnitBase, TagType archType = (TagType)0)
{
}
}
public static string comment;
public static void InitAssets(LandfallContentDatabase db)
{
Sprite icon = UTISeal.Uti.LoBuTex2Sprite("itemicon");
string catNm = "Runic Spells";
comment = "Custom Clothing";
InitManager.InitClothings(icon, catNm, UTISeal.AssetType.Prop, (TagType)0);
comment = "Custom Weapons";
InitManager.InitWeapons(icon, catNm, UTISeal.AssetType.Weapon, (TagType)0);
comment = "Custom Projectiles";
InitManager.InitProjectiles(icon, catNm, UTISeal.AssetType.Projectile, (TagType)0);
comment = "Custom Abilities";
InitManager.InitAbilities(icon, catNm, UTISeal.AssetType.Ability, (TagType)0);
comment = "Custom Unit Bases";
InitManager.InitUnitBases(icon, catNm, UTISeal.AssetType.UnitBase, (TagType)0);
comment = "Custom Explosions";
InitManager.InitExplosions(icon);
comment = "Custom Effects";
InitManager.InitEffects(icon);
comment = "Custom Custom Prefabs";
InitManager.InitCustomPrefabs(icon);
}
public static void SetBlueprints(UnitBlueprint unit, LandfallContentDatabase db)
{
}
public static void SetEffects(GameObject effect)
{
}
public static void SetExplosion(GameObject explosion)
{
}
public static void SetUnits(Unit unit, LandfallContentDatabase db)
{
}
public static void SetWeapon(GameObject weapon, HandType hand, Team team, Unit unit, MeleeWeapon melee, RangeWeapon range, LandfallContentDatabase db)
{
}
public static void SetProjectile(GameObject proj, ProjectileHit projhit, LandfallContentDatabase db)
{
//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_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: 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_0063: 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)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//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: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Expected O, but got Unknown
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_012f: Unknown result type (might be due to invalid IL or missing references)
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_0145: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
//IL_0171: Unknown result type (might be due to invalid IL or missing references)
//IL_0176: Unknown result type (might be due to invalid IL or missing references)
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
//IL_019d: Unknown result type (might be due to invalid IL or missing references)
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
//IL_01c7: Expected O, but got Unknown
//IL_0200: Unknown result type (might be due to invalid IL or missing references)
//IL_0205: Unknown result type (might be due to invalid IL or missing references)
//IL_0216: Unknown result type (might be due to invalid IL or missing references)
//IL_021b: Unknown result type (might be due to invalid IL or missing references)
//IL_022c: Unknown result type (might be due to invalid IL or missing references)
//IL_0231: Unknown result type (might be due to invalid IL or missing references)
//IL_0242: Unknown result type (might be due to invalid IL or missing references)
//IL_0247: Unknown result type (might be due to invalid IL or missing references)
//IL_0258: Unknown result type (might be due to invalid IL or missing references)
//IL_025d: Unknown result type (might be due to invalid IL or missing references)
//IL_026e: Unknown result type (might be due to invalid IL or missing references)
//IL_0273: Unknown result type (might be due to invalid IL or missing references)
//IL_0284: Unknown result type (might be due to invalid IL or missing references)
//IL_0289: Unknown result type (might be due to invalid IL or missing references)
//IL_029a: Unknown result type (might be due to invalid IL or missing references)
//IL_029f: Unknown result type (might be due to invalid IL or missing references)
//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
//IL_02ae: Expected O, but got Unknown
if ((Object)(object)proj == (Object)(object)UPool.MyPool.GetObject("P_InstaBeamblastLaserSingular"))
{
proj.AddComponent<InstaBeamBehaviour>().widthCurve = new AnimationCurve((Keyframe[])(object)new Keyframe[8]
{
new Keyframe(0f, 0f),
new Keyframe(0.25f, 0.75f),
new Keyframe(0.5f, 0.18f),
new Keyframe(0.7f, 0.55f),
new Keyframe(0.85f, 0.23f),
new Keyframe(0.94f, 1f),
new Keyframe(0.98f, 1f),
new Keyframe(1.5f, 0f)
});
proj.AddComponent<DamageTriggerZoneBehaviour>();
}
if ((Object)(object)proj == (Object)(object)UPool.MyPool.GetObject("P_InstaBeamblastLaserDouble"))
{
proj.AddComponent<InstaBeamBehaviour>().widthCurve = new AnimationCurve((Keyframe[])(object)new Keyframe[8]
{
new Keyframe(0f, 0f),
new Keyframe(0.25f, 0.75f),
new Keyframe(0.5f, 0.18f),
new Keyframe(0.7f, 0.55f),
new Keyframe(0.85f, 0.23f),
new Keyframe(0.94f, 1f),
new Keyframe(0.98f, 1f),
new Keyframe(1.5f, 0f)
});
proj.AddComponent<DamageTriggerZoneBehaviour>();
}
if ((Object)(object)proj == (Object)(object)UPool.MyPool.GetObject("P_InstaBeamblastLaserTringular"))
{
proj.AddComponent<InstaBeamBehaviour>().widthCurve = new AnimationCurve((Keyframe[])(object)new Keyframe[8]
{
new Keyframe(0f, 0f),
new Keyframe(0.25f, 0.75f),
new Keyframe(0.5f, 0.18f),
new Keyframe(0.7f, 0.55f),
new Keyframe(0.85f, 0.23f),
new Keyframe(0.94f, 1f),
new Keyframe(0.98f, 1f),
new Keyframe(1.5f, 0f)
});
proj.AddComponent<DamageTriggerZoneBehaviour>();
}
}
public static void SetCombatMove(GameObject move, DodgeMove dodge, LandfallContentDatabase db)
{
}
public static void SetClothes(GameObject cloth, CharacterItem ci, Renderer render, MeshRenderer mesh, SkinnedMeshRenderer skinnedMesh, LandfallContentDatabase db)
{
}
public static void SetAllGameObject(GameObject gameObject, LandfallContentDatabase db)
{
}
public static void InitUnitsAndFactions(LandfallContentDatabase db)
{
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("GeeztJeez.RunicSpells", "RunicSpells", "1.0.0")]
internal class Loader : BaseUnityPlugin
{
private bool initialized;
public static bool enableDebug;
public AssetBundle assetBundle;
private static string modName;
private void ApplyHarmony()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
try
{
new Harmony(modName).PatchAll(Assembly.GetExecutingAssembly());
Log("Harmony patched successfully!");
}
catch (Exception ex)
{
LogError("Harmony patch failed: " + ex);
LogWarning("Please contact Geezt Jeez or try reloading the game for proper installation...");
}
}
public AssetBundle LoadBundle(string assetBundleName)
{
Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(assetBundleName);
if (manifestResourceStream == null)
{
return null;
}
if (!manifestResourceStream.CanRead)
{
return null;
}
return AssetBundle.LoadFromStream(manifestResourceStream);
}
public void LoadMod()
{
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
SLMALoader.GetInstance();
LandfallContentDatabase landfallContentDatabase = ContentDatabase.Instance().LandfallContentDatabase;
UTISeal.bundle = (assetBundle = LoadBundle("runicspellsassetbundle"));
UManager.InitAssets(landfallContentDatabase);
UManager.InitUnitsAndFactions(landfallContentDatabase);
HashSet<int> hashSet = new HashSet<int>();
GameObject[] array = Resources.FindObjectsOfTypeAll<GameObject>();
foreach (GameObject val in array)
{
if ((Object)(object)val == (Object)null)
{
continue;
}
int instanceID = ((Object)val).GetInstanceID();
if (hashSet.Contains(instanceID))
{
continue;
}
hashSet.Add(instanceID);
if (Object.op_Implicit((Object)(object)val.GetComponent<Explosion>()))
{
Log("Currently editing Explosion : " + ((Object)val).name);
UManager.SetExplosion(val);
}
if (Object.op_Implicit((Object)(object)val.GetComponent<WeaponItem>()))
{
Log("Currently editing Weapon : " + ((Object)val).name);
UManager.SetWeapon(val, val.GetComponent<HandType>(), val.GetComponent<Team>(), val.GetComponent<Unit>(), val.GetComponent<MeleeWeapon>(), val.GetComponent<RangeWeapon>(), landfallContentDatabase);
if (Object.op_Implicit((Object)(object)val.GetComponent<MeleeWeapon>()))
{
MeleeWeapon componentInChildren = val.GetComponentInChildren<MeleeWeapon>();
if ((Object)(object)componentInChildren != (Object)null)
{
componentInChildren.Validate();
}
}
if (Object.op_Implicit((Object)(object)val.GetComponent<RangeWeapon>()))
{
RangeWeapon componentInChildren2 = val.GetComponentInChildren<RangeWeapon>();
if ((Object)(object)componentInChildren2 != (Object)null)
{
componentInChildren2.Validate();
}
}
}
if (Object.op_Implicit((Object)(object)val.GetComponent<ProjectileHit>()) || Object.op_Implicit((Object)(object)val.GetComponent<Projectile>()))
{
Log("Currently editing Projectile : " + ((Object)val).name);
UManager.SetProjectile(val, val.GetComponent<ProjectileHit>(), landfallContentDatabase);
}
if (Object.op_Implicit((Object)(object)val.GetComponent<PlaySoundEffect>()))
{
Log("Currently editing Effect : " + ((Object)val).name);
UManager.SetEffects(val);
}
if (Object.op_Implicit((Object)(object)val.GetComponent<Unit>()))
{
Log("Currently editing Unit : " + ((Object)val).name);
UManager.SetUnits(val.GetComponent<Unit>(), landfallContentDatabase);
}
if (Object.op_Implicit((Object)(object)val.GetComponent<SpecialAbility>()))
{
Log("Currently editing Movement : " + ((Object)val).name);
UManager.SetCombatMove(val, val.GetComponent<DodgeMove>(), landfallContentDatabase);
}
if (Object.op_Implicit((Object)(object)val.GetComponent<PropItem>()))
{
Log("Currently editing Clothing : " + ((Object)val).name);
UManager.SetClothes(val, val.GetComponent<CharacterItem>(), val.GetComponent<Renderer>(), val.GetComponent<MeshRenderer>(), val.GetComponent<SkinnedMeshRenderer>(), landfallContentDatabase);
}
if (Object.op_Implicit((Object)(object)val.GetComponentInChildren<PlaySoundEffect>()))
{
Log("Current Validated Sound Effect : " + ((Object)val).name);
PlaySoundEffect[] componentsInChildren = val.GetComponentsInChildren<PlaySoundEffect>();
for (int j = 0; j < componentsInChildren.Length; j++)
{
componentsInChildren[j].Validate();
}
}
UManager.SetAllGameObject(val, landfallContentDatabase);
Log("Current Debugged Game Object : " + ((Object)val).name);
}
UnitBlueprint[] array2 = Resources.FindObjectsOfTypeAll<UnitBlueprint>();
for (int k = 0; k < array2.Length; k++)
{
Log("Blueprint currently debugged : " + array2[k].Entity.Name);
UManager.SetBlueprints(array2[k], landfallContentDatabase);
array2[k].Validate();
}
ServiceLocator.GetService<CustomContentLoaderModIO>().QuickRefresh((WorkshopContentType)5, (Action)null);
}
private void Awake()
{
try
{
ApplyHarmony();
((MonoBehaviour)this).StartCoroutine(Call());
}
catch (Exception ex)
{
LogError("Fatal error, mod loading failed: " + ex);
LogWarning("Please contact Geezt Jeez or try reloading the game for proper installation...");
}
}
private IEnumerator Call()
{
if (!initialized)
{
yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)Object.FindObjectOfType<ServiceLocator>() != (Object)null));
yield return (object)new WaitUntil((Func<bool>)(() => ServiceLocator.GetService<ISaveLoaderService>() != null));
Log($"Loading {modName}!");
LoadMod();
initialized = true;
Log($"{modName} Successfully loaded!");
}
}
public static void Log(string message)
{
if (enableDebug)
{
Debug.Log((object)$"[{modName}] [Log] : {message}");
}
}
public static void LogWarning(string message)
{
if (enableDebug)
{
Debug.LogWarning((object)$"[{modName}] [Warn] : {message}");
}
}
public static void LogError(string message)
{
if (enableDebug)
{
Debug.LogError((object)$"[{modName}] [Error] : {message}");
}
}
static Loader()
{
modName = "Runic Spells";
}
}
}
namespace RunicSpellsUtilities
{
public sealed class UTISeal
{
public class Uti : MonoBehaviour
{
public static class PrimitiveHelper
{
private static Dictionary<PrimitiveType, Mesh> primitiveMeshes;
public unsafe static GameObject CreatePrimitive(PrimitiveType type, bool withCollider)
{
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: 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_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Expected O, but got Unknown
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
if (withCollider)
{
return GameObject.CreatePrimitive(type);
}
GameObject val = new GameObject(((object)(*(PrimitiveType*)(&type))/*cast due to .constrained prefix*/).ToString());
val.AddComponent<MeshFilter>().sharedMesh = GetPrimitiveMesh(type);
val.AddComponent<MeshRenderer>();
return val;
}
public static Mesh GetPrimitiveMesh(PrimitiveType type)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: 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 (!primitiveMeshes.ContainsKey(type))
{
CreatePrimitiveMesh(type);
}
return primitiveMeshes[type];
}
private static Mesh CreatePrimitiveMesh(PrimitiveType type)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
GameObject obj = GameObject.CreatePrimitive(type);
Mesh sharedMesh = obj.GetComponent<MeshFilter>().sharedMesh;
Object.Destroy((Object)(object)obj);
primitiveMeshes[type] = sharedMesh;
return sharedMesh;
}
static PrimitiveHelper()
{
primitiveMeshes = new Dictionary<PrimitiveType, Mesh>();
}
}
public static class GameObjectHelper
{
public static GameObject InstantiateEmpty(string name, Vector3 position, Quaternion rotation, Transform parent)
{
//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_000c: 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_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Expected O, but got Unknown
GameObject val = new GameObject(name);
val.transform.position = position;
val.transform.rotation = rotation;
val.transform.parent = parent;
return val;
}
}
public static class ICat
{
public static GameObject SetTag(GameObject item, string categoryName = "Expansionary", TagType tagType = (TagType)0)
{
//IL_0018: 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_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
try
{
CharacterItem componentInChildren = item.GetComponentInChildren<CharacterItem>();
if (Object.op_Implicit((Object)(object)componentInChildren))
{
componentInChildren.tags = new List<Tag>
{
new Tag
{
tagType = tagType,
value = categoryName
}
};
}
}
catch (Exception ex)
{
Loader.LogError(ex.ToString());
}
return item;
}
}
private const string UnitIDFileName = "ExpansionaryUnitIDs.cfg";
private static readonly Dictionary<string, int> PersistentUnitIDs;
private static bool unitIDsLoaded;
private static Dictionary<DatabaseID, GameObject> CombatMoves
{
get
{
Dictionary<DatabaseID, GameObject> dictionary = HelpLibrary.m_combatMoves;
if (dictionary == null)
{
dictionary = (HelpLibrary.m_combatMoves = new Dictionary<DatabaseID, GameObject>());
}
return dictionary;
}
}
private static Dictionary<DatabaseID, GameObject> CharacterProps
{
get
{
Dictionary<DatabaseID, GameObject> dictionary = HelpLibrary.m_characterProps;
if (dictionary == null)
{
dictionary = (HelpLibrary.m_characterProps = new Dictionary<DatabaseID, GameObject>());
}
return dictionary;
}
}
private static Dictionary<DatabaseID, GameObject> UnitBases
{
get
{
Dictionary<DatabaseID, GameObject> dictionary = HelpLibrary.m_unitBases;
if (dictionary == null)
{
dictionary = (HelpLibrary.m_unitBases = new Dictionary<DatabaseID, GameObject>());
}
return dictionary;
}
}
private static Dictionary<DatabaseID, Faction> Factions
{
get
{
Dictionary<DatabaseID, Faction> dictionary = HelpLibrary.m_factions;
if (dictionary == null)
{
dictionary = (HelpLibrary.m_factions = new Dictionary<DatabaseID, Faction>());
}
return dictionary;
}
}
private static Dictionary<DatabaseID, GameObject> Weapons
{
get
{
Dictionary<DatabaseID, GameObject> dictionary = HelpLibrary.m_weapons;
if (dictionary == null)
{
dictionary = (HelpLibrary.m_weapons = new Dictionary<DatabaseID, GameObject>());
}
return dictionary;
}
}
private static Dictionary<DatabaseID, GameObject> Projectiles
{
get
{
Dictionary<DatabaseID, GameObject> dictionary = HelpLibrary.m_projectiles;
if (dictionary == null)
{
dictionary = (HelpLibrary.m_projectiles = new Dictionary<DatabaseID, GameObject>());
}
return dictionary;
}
}
private static Dictionary<DatabaseID, UnitBlueprint> Units
{
get
{
Dictionary<DatabaseID, UnitBlueprint> dictionary = HelpLibrary.m_unitBlueprints;
if (dictionary == null)
{
dictionary = (HelpLibrary.m_unitBlueprints = new Dictionary<DatabaseID, UnitBlueprint>());
}
return dictionary;
}
}
private static string UnitIDFilePath => Path.Combine(Paths.ConfigPath, "ExpansionaryUnitIDs.cfg");
public AssetBundle LoadBundle(string assetBundleName)
{
Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(assetBundleName);
if (manifestResourceStream == null)
{
Loader.LogError("[LoadBundle] Failed to find resource: " + assetBundleName);
return null;
}
if (!manifestResourceStream.CanRead)
{
Loader.LogError("[LoadBundle] Resource stream is not readable: " + assetBundleName);
return null;
}
return AssetBundle.LoadFromStream(manifestResourceStream);
}
public static Sprite LoBuTex2Sprite(string name)
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
Loader.Log("Loading the texture named: " + name);
Texture2D val = (Texture2D)bundle.LoadAsset(name);
((Texture)val).filterMode = (FilterMode)0;
return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
}
public static GameObject LoBuGaOb(string name)
{
try
{
Loader.Log($"Loading object: {name}");
return bundle.LoadAsset<GameObject>(name);
}
catch (Exception ex)
{
Loader.LogError($"Exception found during loading object: {ex.ToString()}");
return null;
}
}
public static AudioClip LoBuAudioClip(string name)
{
return bundle.LoadAsset<AudioClip>(name);
}
public static Material LoBuMat(string name)
{
return bundle.LoadAsset<Material>(name);
}
public static int IDScn(AssetType type, int startId = 1)
{
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
int num = Math.Max(1, startId);
DatabaseID id = default(DatabaseID);
((DatabaseID)(ref id))..ctor(num);
while (IsOccupied(type, id))
{
Loader.LogWarning($"[IDChecker] ID {num} in use for {type}, trying {num + 1}...");
num++;
((DatabaseID)(ref id))..ctor(num);
}
Loader.Log($"[IDChecker] Found free ID for {type}: {num}");
return num;
}
private static bool IsOccupied(AssetType type, DatabaseID id)
{
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: 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_004d: 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_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)
return type switch
{
AssetType.Prop => CharacterProps.ContainsKey(id),
AssetType.UnitBase => UnitBases.ContainsKey(id),
AssetType.Faction => Factions.ContainsKey(id),
AssetType.Ability => CombatMoves.ContainsKey(id),
AssetType.Weapon => Weapons.ContainsKey(id),
AssetType.Projectile => Projectiles.ContainsKey(id),
AssetType.Unit => Units.ContainsKey(id),
_ => throw new ArgumentOutOfRangeException("type", type, null),
};
}
public static Faction SetFactionHidden(Faction faction)
{
faction.ForceSetField<Faction>("m_isSecret", true);
faction.ForceSetField<Faction>("m_lockSecrets", true);
return faction;
}
public static Faction SetFaction(Faction faction, bool secret, bool lockSecrets, Color color, int index)
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
faction.ForceSetField<Faction>("m_isSecret", secret);
faction.ForceSetField<Faction>("m_lockSecrets", lockSecrets);
faction.m_FactionColor = color;
faction.index = index;
return faction;
}
public static Mesh LoBuMesh(string name)
{
return bundle.LoadAsset<Mesh>(name);
}
public static UnitBlueprint CreateUnit(string name, UnitBlueprint unit, Faction faction, Sprite sprite)
{
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Expected O, but got Unknown
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
//IL_0189: Expected O, but got Unknown
//IL_0198: Unknown result type (might be due to invalid IL or missing references)
//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
//IL_0215: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Expected O, but got Unknown
//IL_0026: 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_0255: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)unit != (Object)null)
{
UnitBlueprint val = Object.Instantiate<UnitBlueprint>(unit);
DatabaseEntity val2 = new DatabaseEntity((WorkshopContentType)0);
int persistentUnitID = GetPersistentUnitID(name);
val2.GUID = new DatabaseID(-2, persistentUnitID);
OtherLibrary.SetField<UnitBlueprint>(val, "m_entity", (object)val2);
Dictionary<DatabaseID, UnitBlueprint> dictionary = (Dictionary<DatabaseID, UnitBlueprint>)OtherLibrary.GetField<LandfallContentDatabase>(ContentDatabase.Instance().LandfallContentDatabase, "m_unitBlueprints");
if (dictionary.ContainsKey(val2.GUID))
{
Loader.LogError("Unit ID collision for '" + name + "'. ID: " + persistentUnitID);
return null;
}
dictionary.Add(val2.GUID, val);
OtherLibrary.SetField<LandfallContentDatabase>(ContentDatabase.Instance().LandfallContentDatabase, "m_unitBlueprints", (object)dictionary);
val.Entity.Name = name;
((Object)val).name = name;
val.Entity.SpriteIcon = sprite;
if ((Object)(object)faction != (Object)null && (Object)(object)val != (Object)null)
{
if (faction.Units == null)
{
faction.Units = (UnitBlueprint[])(object)new UnitBlueprint[1] { val };
}
else
{
List<UnitBlueprint> list = faction.Units.ToList();
list.Add(val);
faction.Units = list.ToArray();
}
}
Loader.Log("Created '" + name + "' with persistent ID " + persistentUnitID);
return val;
}
UnitBlueprint val3 = Object.Instantiate<UnitBlueprint>((UnitBlueprint)SLMALoader.SDic["blueprints"]["UNIT_TRIBAL_CLUB"]);
DatabaseEntity val4 = new DatabaseEntity((WorkshopContentType)0);
int persistentUnitID2 = GetPersistentUnitID(name);
val4.GUID = new DatabaseID(-2, persistentUnitID2);
OtherLibrary.SetField<UnitBlueprint>(val3, "m_entity", (object)val4);
((Object)val3).name = name;
val3.m_props = null;
val3.RightWeapon = null;
val3.MovementComponents = new List<IMovementComponent> { (IMovementComponent)(object)default(KeepRangedDistance) };
ContentDatabase.Instance().AddUserUnitBlueprint(val3);
Dictionary<DatabaseID, UnitBlueprint> dictionary2 = (Dictionary<DatabaseID, UnitBlueprint>)OtherLibrary.GetField<LandfallContentDatabase>(ContentDatabase.Instance().LandfallContentDatabase, "m_unitBlueprints");
if (dictionary2.ContainsKey(val4.GUID))
{
Loader.LogError("Unit ID collision for '" + name + "'. ID: " + persistentUnitID2);
return null;
}
dictionary2.Add(val4.GUID, val3);
OtherLibrary.SetField<LandfallContentDatabase>(ContentDatabase.Instance().LandfallContentDatabase, "m_unitBlueprints", (object)dictionary2);
val3.Entity.Name = name;
((Object)val3).name = name;
val3.Entity.SpriteIcon = sprite;
if ((Object)(object)faction != (Object)null && (Object)(object)val3 != (Object)null)
{
if (faction.Units == null)
{
faction.Units = (UnitBlueprint[])(object)new UnitBlueprint[1] { val3 };
}
else
{
List<UnitBlueprint> list2 = faction.Units.ToList();
list2.Add(val3);
faction.Units = list2.ToArray();
}
}
SLMATool.SLMADic.Add(name, val3);
Loader.Log("Created '" + name + "' with persistent ID " + persistentUnitID2);
return val3;
}
public static int GetPersistentUnitID(string unitName, int startId = 1)
{
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
EnsureUnitIDsLoaded();
if (string.IsNullOrEmpty(unitName))
{
throw new ArgumentException("Unit name cannot be null or empty.", "unitName");
}
if (PersistentUnitIDs.TryGetValue(unitName, out var value))
{
DatabaseID key = default(DatabaseID);
((DatabaseID)(ref key))..ctor(-2, value);
if (!Units.TryGetValue(key, out var value2))
{
Loader.Log($"[UnitID] Reusing saved ID {value} for unit '{unitName}'.");
return value;
}
if ((Object)(object)value2 != (Object)null && value2.Entity != null && value2.Entity.Name == unitName)
{
Loader.Log($"[UnitID] ID {value} already belongs to '{unitName}'. Reusing it.");
return value;
}
Loader.LogWarning($"[UnitID] Saved ID {value} for '{unitName}' is occupied by another unit. Searching for a new ID.");
int num = FindFreePersistentUnitID(startId);
PersistentUnitIDs[unitName] = num;
SaveUnitIDs();
Loader.LogWarning($"[UnitID] Unit '{unitName}' was moved from ID {value} to ID {num}.");
return num;
}
int num2 = FindFreePersistentUnitID(startId);
PersistentUnitIDs.Add(unitName, num2);
SaveUnitIDs();
Loader.Log($"[UnitID] Assigned new persistent ID {num2} to '{unitName}'.");
return num2;
}
private static int FindFreePersistentUnitID(int startId)
{
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
int num = Math.Max(1, startId);
DatabaseID key = default(DatabaseID);
while (true)
{
((DatabaseID)(ref key))..ctor(-2, num);
bool num2 = Units.ContainsKey(key);
bool flag = IsPersistentIDReservedByAnotherUnit(num);
if (!num2 && !flag)
{
break;
}
Loader.LogWarning($"[UnitID] Unit ID {num} is unavailable. Trying {num + 1}...");
num++;
}
Loader.Log($"[UnitID] Found free persistent unit ID: {num}");
return num;
}
private static bool IsPersistentIDReservedByAnotherUnit(int id)
{
foreach (KeyValuePair<string, int> persistentUnitID in PersistentUnitIDs)
{
if (persistentUnitID.Value == id)
{
return true;
}
}
return false;
}
private static void EnsureUnitIDsLoaded()
{
if (unitIDsLoaded)
{
return;
}
unitIDsLoaded = true;
try
{
string unitIDFilePath = UnitIDFilePath;
if (!File.Exists(unitIDFilePath))
{
Loader.Log("[UnitID] No persistent unit ID file found. Creating a new registry.");
SaveUnitIDs();
return;
}
string[] array = File.ReadAllLines(unitIDFilePath);
foreach (string text in array)
{
if (string.IsNullOrWhiteSpace(text) || text.StartsWith("#"))
{
continue;
}
int num = text.IndexOf('\t');
if (num <= 0 || num >= text.Length - 1)
{
Loader.LogWarning("[UnitID] Ignoring malformed registry line: " + text);
continue;
}
string text2 = UnescapeUnitName(text.Substring(0, num));
if (!int.TryParse(text.Substring(num + 1), out var result))
{
Loader.LogWarning("[UnitID] Invalid ID in registry: " + text);
}
else if (result < 1)
{
Loader.LogWarning("[UnitID] Ignoring invalid ID " + result + " for unit '" + text2 + "'.");
}
else if (PersistentUnitIDs.ContainsKey(text2))
{
Loader.LogWarning("[UnitID] Duplicate unit entry found for '" + text2 + "'. Keeping the first entry.");
}
else if (IsPersistentIDReservedByAnotherUnit(result))
{
Loader.LogWarning("[UnitID] Duplicate ID " + result + " found in registry. Ignoring entry for '" + text2 + "'.");
}
else
{
PersistentUnitIDs.Add(text2, result);
}
}
Loader.Log($"[UnitID] Loaded {PersistentUnitIDs.Count} persistent unit IDs.");
}
catch (Exception ex)
{
Loader.LogError("[UnitID] Failed to load persistent unit IDs: " + ex);
}
}
private static void SaveUnitIDs()
{
try
{
string configPath = Paths.ConfigPath;
if (!Directory.Exists(configPath))
{
Directory.CreateDirectory(configPath);
}
List<string> list = new List<string>();
list.Add("# Expansionary persistent unit IDs");
list.Add("# Unit Name<TAB>ID");
foreach (KeyValuePair<string, int> persistentUnitID in PersistentUnitIDs)
{
list.Add(FormatUnitName(persistentUnitID.Key) + "\t" + persistentUnitID.Value);
}
File.WriteAllLines(UnitIDFilePath, list.ToArray());
}
catch (Exception ex)
{
Loader.LogError("[UnitID] Failed to save persistent unit IDs: " + ex);
}
}
private static string FormatUnitName(string value)
{
return value.Replace("\\", "\\\\").Replace("\t", "\\t").Replace("\r", "\\r")
.Replace("\n", "\\n");
}
private static string UnescapeUnitName(string value)
{
return value.Replace("\\n", "\n").Replace("\\r", "\r").Replace("\\t", "\t")
.Replace("\\\\", "\\");
}
public static bool TryGetPersistentUnitID(string unitName, out int id)
{
EnsureUnitIDsLoaded();
return PersistentUnitIDs.TryGetValue(unitName, out id);
}
public static bool HasPersistentUnitID(string unitName)
{
EnsureUnitIDsLoaded();
return PersistentUnitIDs.ContainsKey(unitName);
}
static Uti()
{
PersistentUnitIDs = new Dictionary<string, int>(StringComparer.Ordinal);
unitIDsLoaded = false;
}
}
public enum AssetType
{
Prop,
UnitBase,
Faction,
Ability,
Weapon,
Projectile,
Unit
}
public static AssetBundle bundle;
}
public static class UTISttc
{
public static object ForceGetField<T>(this T self, string name) where T : class
{
FieldInfo field = typeof(T).GetField(name, (BindingFlags)(-1));
if (field != null)
{
return field.GetValue(self);
}
return null;
}
public static T ForceSetField<T>(this T self, string name, object value) where T : class
{
FieldInfo field = typeof(T).GetField(name, (BindingFlags)(-1));
if (field != null)
{
field.SetValue(self, value);
}
return self;
}
public static Component CatchOrAddComponent(Type typeToSeek, GameObject obj)
{
Component val = obj.GetComponentInChildren(typeToSeek, true);
if ((Object)(object)val == (Object)null)
{
val = obj.AddComponent(typeToSeek);
}
return val;
}
public static T[] AddItem<T>(this T[] source, T newValue)
{
if (source == null)
{
return new T[1] { newValue };
}
int num = source.Length;
Array.Resize(ref source, num + 1);
source[num] = newValue;
return source;
}
}
}
namespace RunicSpellsScripts
{
public class InstaBeamBehaviour : MonoBehaviour
{
public AnimationCurve widthCurve;
public float duration = 0.5f;
public float widthMultiplier;
private float timer;
private SpellTarget target;
public float lerpAmount = 1000f;
public DelayEvent delayEvent;
private float peakTime;
private bool peakTriggered;
public float peakDuration = 0.1f;
private LineRenderer[] lineRenderers;
private void Update()
{
timer += Time.deltaTime;
float num = timer / duration;
float num2 = widthCurve.Evaluate(num);
LineRenderer[] array = lineRenderers;
for (int i = 0; i < array.Length; i++)
{
array[i].widthMultiplier = num2 * widthMultiplier;
}
if (!peakTriggered && num >= peakTime)
{
peakTriggered = true;
if ((Object)(object)delayEvent != (Object)null)
{
delayEvent.Go();
}
EnableDamage(setActive: true);
}
if (peakTriggered && num >= peakTime + peakDuration)
{
EnableDamage(setActive: false);
}
}
public InstaBeamBehaviour()
{
widthMultiplier = 1f;
}
private void Start()
{
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: 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_007c: 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_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
lineRenderers = ((Component)this).GetComponentsInChildren<LineRenderer>(true);
target = ((Component)((Component)this).transform.root).GetComponentInChildren<SpellTarget>();
delayEvent = ((Component)this).GetComponentInChildren<DelayEvent>();
EnableDamage(setActive: false);
FindPeakTime();
LineRenderer[] array = lineRenderers;
foreach (LineRenderer val in array)
{
val.SetPositions((Vector3[])(object)new Vector3[2]
{
((Component)val).transform.position,
((Component)val).transform.position - ((Component)this).transform.position + Vector3.LerpUnclamped(((Component)this).transform.position, target.rig.position, lerpAmount)
});
}
}
private void FindPeakTime()
{
peakTime = 0f;
if (widthCurve == null || widthCurve.length == 0)
{
return;
}
Keyframe[] keys = widthCurve.keys;
float num = float.MinValue;
for (int i = 0; i < keys.Length; i++)
{
if (((Keyframe)(ref keys[i])).value > num)
{
num = ((Keyframe)(ref keys[i])).value;
peakTime = ((Keyframe)(ref keys[i])).time;
}
}
}
public void EnableDamage(bool setActive)
{
BoxCollider[] componentsInChildren = ((Component)this).GetComponentsInChildren<BoxCollider>(true);
for (int i = 0; i < componentsInChildren.Length; i++)
{
((Component)componentsInChildren[i]).gameObject.SetActive(setActive);
}
}
}
public class DamageTriggerZoneBehaviour : MonoBehaviour
{
public Unit unit;
public float damage = 2000f;
public UnitEffectBase EffectPrefab;
public string hitSoundName = "Effects/MagicMissileSmite";
public float hitSoundVolume = 1f;
public float hitSoundPitch = 1f;
public float timer = 10f;
public TeamHolder teamHolder;
public bool destroyOnHit;
private readonly Dictionary<Unit, float> lastHitTime = new Dictionary<Unit, float>(128);
private readonly HashSet<Unit> activeUnits = new HashSet<Unit>();
private float cleanupTimer;
private const float cleanupInterval = 1f;
private void Start()
{
if (!Object.op_Implicit((Object)(object)teamHolder))
{
teamHolder = ((Component)((Component)this).transform.root).GetComponentInChildren<TeamHolder>();
}
if (!Object.op_Implicit((Object)(object)unit))
{
unit = ((Component)((Component)this).transform.root).GetComponentInChildren<Unit>();
if (!Object.op_Implicit((Object)(object)unit) && Object.op_Implicit((Object)(object)teamHolder) && Object.op_Implicit((Object)(object)teamHolder.spawner))
{
unit = teamHolder.spawner.GetComponentInChildren<Unit>();
}
}
}
private void OnTriggerStay(Collider other)
{
//IL_0028: 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_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: 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_0146: Unknown result type (might be due to invalid IL or missing references)
//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
Unit componentInChildren = ((Component)((Component)other).transform.root).GetComponentInChildren<Unit>();
if (!Object.op_Implicit((Object)(object)componentInChildren) || (Object)(object)componentInChildren == (Object)(object)unit || componentInChildren.Team == unit.Team || (Object)(object)componentInChildren.data == (Object)null || componentInChildren.data.Dead || (Object)(object)componentInChildren.data.healthHandler == (Object)null)
{
return;
}
if (!lastHitTime.TryGetValue(componentInChildren, out var value))
{
value = -999f;
}
if (!(Time.time - value >= timer))
{
return;
}
lastHitTime[componentInChildren] = Time.time;
if (!string.IsNullOrEmpty(hitSoundName))
{
SoundPlayer service = ServiceLocator.GetService<SoundPlayer>();
if ((Object)(object)service != (Object)null)
{
service.PlaySoundEffect(hitSoundName, hitSoundVolume, ((Component)other).transform.position, (MaterialType)0, (Transform)null, 0.5f);
}
}
float num = damage;
((Damagable)componentInChildren.data.healthHandler).TakeDamage(num, ((Component)other).transform.position, unit, (DamageType)0);
Rigidbody[] allRigs = componentInChildren.data.allRigs.AllRigs;
foreach (Rigidbody val in allRigs)
{
ParticlePlayer service2 = ServiceLocator.GetService<ParticlePlayer>();
if ((Object)(object)service2 != (Object)null)
{
service2.PlayEffect(1, val.position, Vector3.up, (SkinnedMeshRenderer)null);
}
}
if (Object.op_Implicit((Object)(object)EffectPrefab))
{
Type type = ((object)EffectPrefab).GetType();
Component componentInChildren2 = ((Component)((Component)componentInChildren).transform).GetComponentInChildren(type);
UnitEffectBase val2 = (UnitEffectBase)(object)((componentInChildren2 is UnitEffectBase) ? componentInChildren2 : null);
if ((Object)(object)val2 == (Object)null)
{
GameObject obj = Object.Instantiate<GameObject>(((Component)EffectPrefab).gameObject, ((Component)componentInChildren).transform);
obj.transform.position = componentInChildren.data.mainRig.position;
UnitEffectBase componentInChildren3 = obj.GetComponentInChildren<UnitEffectBase>();
if (Object.op_Implicit((Object)(object)componentInChildren3))
{
componentInChildren3.Ping();
componentInChildren3.DoEffect();
}
}
else
{
val2.Ping();
}
}
if (destroyOnHit)
{
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
private void Update()
{
cleanupTimer += Time.deltaTime;
if (cleanupTimer >= 1f)
{
cleanupTimer = 0f;
CleanupDeadUnits();
}
}
private void OnTriggerEnter(Collider other)
{
//IL_0028: 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)
Unit componentInChildren = ((Component)((Component)other).transform.root).GetComponentInChildren<Unit>();
if (Object.op_Implicit((Object)(object)componentInChildren) && (Object)(object)componentInChildren != (Object)(object)unit && componentInChildren.Team != unit.Team)
{
activeUnits.Add(componentInChildren);
}
}
private void OnTriggerExit(Collider other)
{
Unit componentInChildren = ((Component)((Component)other).transform.root).GetComponentInChildren<Unit>();
if ((Object)(object)componentInChildren != (Object)null)
{
activeUnits.Remove(componentInChildren);
lastHitTime.Remove(componentInChildren);
}
}
private void CleanupDeadUnits()
{
foreach (Unit activeUnit in activeUnits)
{
if ((Object)(object)activeUnit == (Object)null || (Object)(object)activeUnit.data == (Object)null || activeUnit.data.Dead)
{
lastHitTime.Remove(activeUnit);
activeUnits.Remove(activeUnit);
break;
}
}
}
}
}