Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Runestone Trials v1.1.0
RuneStoneTrials.dll
Decompiled 6 hours agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Splatform; 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: AssemblyTitle("AngryRuneStones")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("AngryRuneStones")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("738a6982-9f9e-40a8-9e9a-b49a7f3aeb83")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyVersion("1.0.0.0")] public class CustomRaid { public enum Phase { Spawning, Fighting, Boss, Completed, Failed } public string RaidName; public string StonePrefix; public string EndMessage; public string MinionMessage; public string BossMessageSingle; public string ExitMessage; public bool HasBoss; public string BossPrefab; public int DifficultyLevel; public string DifficultyName; public MinionConfig[] MinionConfigs; public Vector3 RaidCenter; public float RaidRadius = 64f; public Phase CurrentPhase = Phase.Spawning; public GameObject RuneStone; private List<GameObject> _spawnedCreatures = new List<GameObject>(); private List<GameObject> _spawnedBosses = new List<GameObject>(); public int EnemyMultiplier = 1; private float[] _spawnTimers; private int[] _targetCounts; private int[] _spawnedCounts; private int _totalToSpawn; private int _totalSpawned; private bool _spawnStopped; private float _counterUpdateTimer; public int MinionMinLevel = 1; public int MinionMaxLevel = 5; public float[] LevelChances = new float[4] { 10f, 6f, 4f, 2f }; public float BossSpawnChance = 100f; public int TotalToSpawn => _totalToSpawn; public bool IsActive => CurrentPhase != Phase.Completed && CurrentPhase != Phase.Failed; public void Start() { //IL_00ab: Unknown result type (might be due to invalid IL or missing references) CurrentPhase = Phase.Spawning; int num = MinionConfigs.Length; _spawnTimers = new float[num]; _targetCounts = new int[num]; _spawnedCounts = new int[num]; _totalToSpawn = 0; for (int i = 0; i < num; i++) { _spawnTimers[i] = 0f; _targetCounts[i] = MinionConfigs[i].GetRandomCount() * DifficultyLevel * EnemyMultiplier; _spawnedCounts[i] = 0; _totalToSpawn += _targetCounts[i]; } _totalSpawned = 0; _spawnStopped = false; CustomRaidZoneDisplay.ShowZone(RaidCenter, RaidRadius); CustomRaidMessages.ShowStartMessage("[" + DifficultyName + "] Прислужники приближаются!"); } public void Update(float dt) { if (!IsActive) { return; } if (!IsPlayerInZone()) { Fail(); return; } switch (CurrentPhase) { case Phase.Spawning: UpdateSpawning(dt); break; case Phase.Fighting: UpdateFighting(); break; case Phase.Boss: UpdateBoss(); break; } } private void UpdateSpawning(float dt) { for (int i = 0; i < MinionConfigs.Length; i++) { if (_spawnedCounts[i] < _targetCounts[i]) { _spawnTimers[i] += dt; if (_spawnTimers[i] >= MinionConfigs[i].SpawnInterval) { _spawnTimers[i] = 0f; SpawnWave(i); } } } bool flag = true; for (int j = 0; j < MinionConfigs.Length; j++) { if (_spawnedCounts[j] < _targetCounts[j]) { flag = false; break; } } if (!_spawnStopped && flag && _totalToSpawn > 0) { _spawnStopped = true; CurrentPhase = Phase.Fighting; } UpdateCounter(); } private void UpdateFighting() { int num = CountAlive(_spawnedCreatures); UpdateCounter(); if (num != 0) { return; } if (HasBoss) { CurrentPhase = Phase.Boss; SpawnBosses(); if (_spawnedBosses.Count > 0) { CustomRaidMessages.HideCounter(); string text = "The Big evil has arrived!"; CustomRaidMessages.ShowBossMessage(text); } else { Complete(); } } else { Complete(); } } private void UpdateBoss() { if (CountAlive(_spawnedBosses) == 0 && _spawnedBosses.Count == 0) { Complete(); } } private void UpdateCounter() { _counterUpdateTimer += Time.deltaTime; if (!(_counterUpdateTimer < 0.1f)) { _counterUpdateTimer = 0f; int num = CountAlive(_spawnedCreatures); int num2 = _totalSpawned - num; if (num2 < 0) { num2 = 0; } if (num2 > _totalToSpawn) { num2 = _totalToSpawn; } CustomRaidMessages.ShowCounter(num2, _totalToSpawn); } } private void SpawnWave(int typeIndex) { MinionConfig minionConfig = MinionConfigs[typeIndex]; GameObject prefab = ZNetScene.instance.GetPrefab(minionConfig.PrefabName); if ((Object)(object)prefab == (Object)null) { return; } int num = _targetCounts[typeIndex] - _spawnedCounts[typeIndex]; int num2 = Mathf.Min(Random.Range(minionConfig.GroupSizeMin, minionConfig.GroupSizeMax + 1), num); for (int i = 0; i < num2; i++) { GameObject val = SpawnCreature(prefab); if ((Object)(object)val != (Object)null) { EnableHunt(val); _spawnedCreatures.Add(val); _spawnedCounts[typeIndex]++; _totalSpawned++; } } } private void SpawnBosses() { if (Random.Range(0f, 100f) > BossSpawnChance || string.IsNullOrEmpty(BossPrefab)) { return; } GameObject prefab = ZNetScene.instance.GetPrefab(BossPrefab); if (!((Object)(object)prefab == (Object)null)) { GameObject val = SpawnCreature(prefab); if ((Object)(object)val != (Object)null) { EnableHunt(val); _spawnedBosses.Add(val); } } } private GameObject SpawnCreature(GameObject prefab) { //IL_0001: 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_0016: 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_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_002d: 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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0049: 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_005c: Unknown result type (might be due to invalid IL or missing references) Vector2 val = Random.insideUnitCircle * RaidRadius * 0.5f; Vector3 val2 = RaidCenter + new Vector3(val.x, 0f, val.y); float num = default(float); Heightmap.GetHeight(val2, ref num); val2.y = Mathf.Max(val2.y, num); GameObject val3 = Object.Instantiate<GameObject>(prefab, val2, Quaternion.identity); if (MinionMaxLevel > 1) { Character component = val3.GetComponent<Character>(); if ((Object)(object)component != (Object)null) { int num2 = RollLevel(); if (num2 > 1) { component.SetLevel(num2); } } } return val3; } private int RollLevel() { int num = 1; float num2 = Random.Range(0f, 100f); float num3 = 0f; for (int i = 0; i < LevelChances.Length; i++) { num3 += LevelChances[i]; if (num2 < num3) { num = i + 2; break; } } return Mathf.Clamp(num, MinionMinLevel, MinionMaxLevel); } private void EnableHunt(GameObject go) { ZNetView component = go.GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null && component.IsValid()) { component.ClaimOwnership(); component.GetZDO().Set(ZDOVars.s_huntPlayer, true); } BaseAI component2 = go.GetComponent<BaseAI>(); if ((Object)(object)component2 != (Object)null) { component2.SetHuntPlayer(true); } } private int CountAlive(List<GameObject> list) { for (int num = list.Count - 1; num >= 0; num--) { if ((Object)(object)list[num] == (Object)null) { list.RemoveAt(num); } else { Character component = list[num].GetComponent<Character>(); if ((Object)(object)component == (Object)null || component.IsDead()) { list.RemoveAt(num); } } } return list.Count; } private bool IsPlayerInZone() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Player.m_localPlayer == (Object)null) { return false; } return Vector3.Distance(((Component)Player.m_localPlayer).transform.position, RaidCenter) < RaidRadius; } public void Fail() { CurrentPhase = Phase.Failed; DestroyAll(); CustomRaidZoneDisplay.HideZone(); CustomRaidMessages.ShowEndMessage(ExitMessage); } public void Complete() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //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_0096: 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_006b: 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) CurrentPhase = Phase.Completed; CustomRaidZoneDisplay.HideZone(); CustomRaidMessages.ShowEndMessage(EndMessage); if ((Object)(object)RuneStone != (Object)null) { Vector3 position = RuneStone.transform.position; Quaternion rotation = RuneStone.transform.rotation; GameObject prefab = ZNetScene.instance.GetPrefab("fx_flametalnode_destruction"); if ((Object)(object)prefab != (Object)null) { Object.Instantiate<GameObject>(prefab, position, rotation); } DestroyLocationProxy(RuneStone.transform); ZNetScene.instance.Destroy(RuneStone); CustomRaidLoot.CreateLootChest(position, rotation, this); } } private void DestroyLocationProxy(Transform t) { while ((Object)(object)t != (Object)null) { LocationProxy component = ((Component)t).GetComponent<LocationProxy>(); if ((Object)(object)component != (Object)null) { ZNetView component2 = ((Component)t).GetComponent<ZNetView>(); if ((Object)(object)component2 != (Object)null && component2.IsValid()) { component2.ClaimOwnership(); ZDOMan.instance.DestroyZDO(component2.GetZDO()); } break; } t = t.parent; } } public void DestroyAll() { foreach (GameObject spawnedCreature in _spawnedCreatures) { if ((Object)(object)spawnedCreature != (Object)null) { ZNetScene.instance.Destroy(spawnedCreature); } } foreach (GameObject spawnedBoss in _spawnedBosses) { if ((Object)(object)spawnedBoss != (Object)null) { ZNetScene.instance.Destroy(spawnedBoss); } } _spawnedCreatures.Clear(); _spawnedBosses.Clear(); } } public static class CustomRaidFactory { public static CustomRaid CreateRaid(string stonePrefix, int difficulty) { if (stonePrefix.StartsWith("RuneStone_Meadows")) { return CreateMeadowsRaid(difficulty); } if (stonePrefix.StartsWith("RuneStone_BlackForest")) { return CreateBlackForestRaid(difficulty); } if (stonePrefix.StartsWith("RuneStone_Boars")) { return CreateBoarsRaid(difficulty); } if (stonePrefix.StartsWith("RuneStone_Greydwarfs")) { return CreateGreydwarfsRaid(difficulty); } if (stonePrefix.StartsWith("RuneStone_Swamps")) { return CreateSwampsRaid(difficulty); } if (stonePrefix.StartsWith("RuneStone_Draugr")) { return CreateDraugrRaid(difficulty); } if (stonePrefix.StartsWith("RuneStone_Mountains")) { return CreateMountainsRaid(difficulty); } if (stonePrefix.StartsWith("RuneStone_Plains")) { return CreatePlainsRaid(difficulty); } if (stonePrefix.StartsWith("RuneStone_Mistlands")) { return CreateMistLandsRaid(difficulty); } if (stonePrefix.StartsWith("RuneStone_Ashlands")) { return CreateAshlandsRaid(difficulty); } return null; } private static CustomRaid CreateMeadowsRaid(int difficulty) { CustomRaid customRaid = new CustomRaid(); customRaid.RaidName = "RuneStoneRaidMeadows"; customRaid.StonePrefix = "RuneStone_Meadows"; customRaid.EndMessage = "The ancient evil has been defeated! The stone crumbled to dust."; customRaid.MinionMessage = "Goal kills"; customRaid.ExitMessage = "You have left the trial area! The stone remained untouched."; customRaid.HasBoss = true; customRaid.BossPrefab = "Eikthyr"; customRaid.DifficultyLevel = difficulty; customRaid.BossSpawnChance = 100f; customRaid.DifficultyName = GetDifficultyName(difficulty); customRaid.MinionMinLevel = 1; customRaid.MinionMaxLevel = 3; customRaid.MinionConfigs = new MinionConfig[3] { new MinionConfig("Boar", 5, 6, 3f, 2, 3), new MinionConfig("Greyling", 10, 15, 1f, 2, 5), new MinionConfig("Neck", 3, 5, 5f, 1, 3) }; return customRaid; } private static CustomRaid CreateBlackForestRaid(int difficulty) { CustomRaid customRaid = new CustomRaid(); customRaid.RaidName = "RuneStoneRaidBlackForest"; customRaid.StonePrefix = "RuneStone_BlackForest"; customRaid.EndMessage = "The ancient evil has been defeated! The stone crumbled to dust."; customRaid.MinionMessage = "Goal kills"; customRaid.ExitMessage = "You have left the trial area! The stone remained untouched."; customRaid.HasBoss = true; customRaid.BossPrefab = "gd_king"; customRaid.DifficultyLevel = difficulty; customRaid.BossSpawnChance = 70f; customRaid.DifficultyName = GetDifficultyName(difficulty); customRaid.MinionMinLevel = 1; customRaid.MinionMaxLevel = 3; customRaid.MinionConfigs = new MinionConfig[4] { new MinionConfig("Greydwarf", 8, 12, 5f, 3, 5), new MinionConfig("Greydwarf_Elite", 2, 5, 10f, 1, 2), new MinionConfig("Troll", 1, 2, 20f, 1, 1), new MinionConfig("Greydwarf_Shaman", 1, 3, 15f, 1, 2) }; return customRaid; } private static CustomRaid CreateBoarsRaid(int difficulty) { CustomRaid customRaid = new CustomRaid(); customRaid.RaidName = "RuneStoneRaidBoars"; customRaid.StonePrefix = "RuneStone_Boars"; customRaid.EndMessage = "The ancient evil has been defeated! The stone crumbled to dust."; customRaid.MinionMessage = "Goal kills"; customRaid.BossMessageSingle = ""; customRaid.ExitMessage = "You have left the trial area! The stone remained untouched."; customRaid.HasBoss = false; customRaid.BossPrefab = ""; customRaid.DifficultyLevel = difficulty; customRaid.DifficultyName = GetDifficultyName(difficulty); customRaid.MinionMinLevel = 1; customRaid.MinionMaxLevel = 2; customRaid.MinionConfigs = new MinionConfig[1] { new MinionConfig("Boar", 15, 20, 2f, 2, 3) }; return customRaid; } private static CustomRaid CreateGreydwarfsRaid(int difficulty) { CustomRaid customRaid = new CustomRaid(); customRaid.RaidName = "RuneStoneGreydwarfs"; customRaid.StonePrefix = "RuneStone_Greydwarfs"; customRaid.EndMessage = "The ancient evil has been defeated! The stone crumbled to dust."; customRaid.MinionMessage = "Goal kills"; customRaid.BossMessageSingle = ""; customRaid.ExitMessage = "You have left the trial area! The stone remained untouched."; customRaid.HasBoss = false; customRaid.BossPrefab = ""; customRaid.DifficultyLevel = difficulty; customRaid.DifficultyName = GetDifficultyName(difficulty); customRaid.MinionMinLevel = 1; customRaid.MinionMaxLevel = 2; customRaid.MinionConfigs = new MinionConfig[2] { new MinionConfig("Greyling", 12, 20, 3f, 1, 3), new MinionConfig("Greydwarf_Shaman", 1, 3, 6f, 1, 2) }; return customRaid; } private static CustomRaid CreateSwampsRaid(int difficulty) { CustomRaid customRaid = new CustomRaid(); customRaid.RaidName = "RuneStoneSwamps"; customRaid.StonePrefix = "RuneStone_Swamps"; customRaid.EndMessage = "The ancient evil has been defeated! The stone crumbled to dust."; customRaid.MinionMessage = "Goal kills"; customRaid.ExitMessage = "You have left the trial area! The stone remained untouched."; customRaid.HasBoss = true; customRaid.BossPrefab = "Bonemass"; customRaid.DifficultyLevel = difficulty; customRaid.BossSpawnChance = 60f; customRaid.DifficultyName = GetDifficultyName(difficulty); customRaid.MinionMinLevel = 1; customRaid.MinionMaxLevel = 3; customRaid.MinionConfigs = new MinionConfig[6] { new MinionConfig("Skeleton", 3, 6, 3f, 1, 2), new MinionConfig("Draugr", 6, 10, 5f, 1, 2), new MinionConfig("Draugr_Ranged", 3, 5, 5f, 1, 2), new MinionConfig("Surtling", 3, 6, 15f, 1, 2), new MinionConfig("Wraith", 1, 1, 20f, 1, 1), new MinionConfig("Blob", 1, 3, 12f, 1, 1) }; return customRaid; } private static CustomRaid CreateDraugrRaid(int difficulty) { CustomRaid customRaid = new CustomRaid(); customRaid.RaidName = "RuneStoneDraugr"; customRaid.StonePrefix = "RuneStone_Draugr"; customRaid.EndMessage = "The ancient evil has been defeated! The stone crumbled to dust."; customRaid.MinionMessage = "Goal kills"; customRaid.BossMessageSingle = ""; customRaid.ExitMessage = "You have left the trial area! The stone remained untouched."; customRaid.HasBoss = false; customRaid.BossPrefab = ""; customRaid.DifficultyLevel = difficulty; customRaid.DifficultyName = GetDifficultyName(difficulty); customRaid.MinionMinLevel = 1; customRaid.MinionMaxLevel = 3; customRaid.MinionConfigs = new MinionConfig[4] { new MinionConfig("Draugr", 12, 20, 3f, 1, 2), new MinionConfig("Draugr_Ranged", 2, 4, 6f, 1), new MinionConfig("Draugr_Elite", 3, 5, 10f, 1, 2), new MinionConfig("Abomination", 1, 1, 30f, 1, 1) }; return customRaid; } private static CustomRaid CreateMountainsRaid(int difficulty) { CustomRaid customRaid = new CustomRaid(); customRaid.RaidName = "RuneStoneMountains"; customRaid.StonePrefix = "RuneStone_Mountains"; customRaid.EndMessage = "The ancient evil has been defeated! The stone crumbled to dust."; customRaid.MinionMessage = "Goal kills"; customRaid.ExitMessage = "You have left the trial area! The stone remained untouched."; customRaid.HasBoss = true; customRaid.BossPrefab = "Dragon"; customRaid.BossSpawnChance = 50f; customRaid.DifficultyLevel = difficulty; customRaid.DifficultyName = GetDifficultyName(difficulty); customRaid.MinionMinLevel = 1; customRaid.MinionMaxLevel = 4; customRaid.MinionConfigs = new MinionConfig[5] { new MinionConfig("Wolf", 5, 8, 3f, 1, 3), new MinionConfig("Hatchling", 3, 4, 15f, 1, 2), new MinionConfig("StoneGolem", 1, 1, 30f, 1, 1), new MinionConfig("Fenring_Cultist", 1, 2, 15f, 1, 2), new MinionConfig("Fenring", 1, 1, 30f, 1, 1) }; return customRaid; } private static CustomRaid CreatePlainsRaid(int difficulty) { CustomRaid customRaid = new CustomRaid(); customRaid.RaidName = "RuneStonePlains"; customRaid.StonePrefix = "RuneStone_Plains"; customRaid.EndMessage = "The ancient evil has been defeated! The stone crumbled to dust."; customRaid.MinionMessage = "Goal kills"; customRaid.ExitMessage = "You have left the trial area! The stone remained untouched."; customRaid.HasBoss = true; customRaid.BossPrefab = "GoblinKing"; customRaid.BossSpawnChance = 50f; customRaid.DifficultyLevel = difficulty; customRaid.DifficultyName = GetDifficultyName(difficulty); customRaid.MinionMinLevel = 1; customRaid.MinionMaxLevel = 5; customRaid.MinionConfigs = new MinionConfig[4] { new MinionConfig("Goblin", 10, 20, 5f, 1, 3), new MinionConfig("GoblinArcher", 2, 4, 12f, 1, 2), new MinionConfig("GoblinBrute", 1, 2, 20f, 1, 1), new MinionConfig("GoblinShaman", 2, 6, 15f, 1, 1) }; return customRaid; } private static CustomRaid CreateMistLandsRaid(int difficulty) { CustomRaid customRaid = new CustomRaid(); customRaid.RaidName = "RuneStoneMistlands"; customRaid.StonePrefix = "RuneStone_Mistlands"; customRaid.EndMessage = "The ancient evil has been defeated! The stone crumbled to dust."; customRaid.MinionMessage = "Goal kills"; customRaid.ExitMessage = "You have left the trial area! The stone remained untouched."; customRaid.HasBoss = true; customRaid.BossPrefab = "SeekerQueen"; customRaid.BossSpawnChance = 50f; customRaid.DifficultyLevel = difficulty; customRaid.DifficultyName = GetDifficultyName(difficulty); customRaid.MinionMinLevel = 1; customRaid.MinionMaxLevel = 5; customRaid.MinionConfigs = new MinionConfig[4] { new MinionConfig("Seeker", 12, 25, 5f, 1, 3), new MinionConfig("SeekerBrute", 1, 3, 15f, 1, 1), new MinionConfig("Tick", 1, 5, 20f, 1, 5), new MinionConfig("Gjall", 1, 1, 30f, 1, 1) }; return customRaid; } private static CustomRaid CreateAshlandsRaid(int difficulty) { CustomRaid customRaid = new CustomRaid(); customRaid.RaidName = "RuneStoneAshlands"; customRaid.StonePrefix = "RuneStone_Ashlands"; customRaid.EndMessage = "The ancient evil has been defeated! The stone crumbled to dust."; customRaid.MinionMessage = "Goal kills"; customRaid.ExitMessage = "You have left the trial area! The stone remained untouched."; customRaid.HasBoss = true; customRaid.BossPrefab = "Fader"; customRaid.BossSpawnChance = 50f; customRaid.DifficultyLevel = difficulty; customRaid.DifficultyName = GetDifficultyName(difficulty); customRaid.MinionMinLevel = 1; customRaid.MinionMaxLevel = 5; customRaid.MinionConfigs = new MinionConfig[7] { new MinionConfig("Charred_Melee", 6, 12, 5f, 1, 3), new MinionConfig("Charred_Archer", 2, 4, 10f, 1, 2), new MinionConfig("Charred_Mage", 1, 2, 20f, 1, 2), new MinionConfig("Morgen", 1, 1, 40f, 1, 1), new MinionConfig("FallenValkyrie", 1, 1, 30f, 1, 1), new MinionConfig("Asksvin", 1, 3, 20f, 1, 2), new MinionConfig("Charred_Twitcher", 1, 3, 25f, 1, 3) }; return customRaid; } public static int RollDifficulty() { float num = Random.Range(0f, 100f); if (num < 50f) { return 1; } if (num < 80f) { return 2; } return 3; } public static string GetDifficultyName(int level) { return level switch { 1 => "Easy", 2 => "Medium", 3 => "Hard", _ => "???", }; } } public static class CustomRaidLoot { private static readonly string[] Meadows_Item1 = new string[5] { "QueenBee", "Feathers", "Dandelion", "Resin", "Flint" }; private static readonly int[] Meadows_Item1Min = new int[5] { 1, 5, 3, 12, 3 }; private static readonly int[] Meadows_Item1Max = new int[5] { 2, 12, 8, 20, 12 }; private static readonly string[] Meadows_Item2 = new string[5] { "fish1", "DeerHide", "ArrowFire", "LeatherScraps", "MeadHealthMedium" }; private static readonly int[] Meadows_Item2Min = new int[5] { 1, 8, 20, 8, 1 }; private static readonly int[] Meadows_Item2Max = new int[5] { 5, 20, 30, 20, 2 }; private static readonly string[] Meadows_Item3 = new string[5] { "Ruby", "Amber", "AmberPearl", "SurtlingCore", "MeadHasty" }; private static readonly int[] Meadows_Item3Min = new int[5] { 3, 3, 3, 2, 1 }; private static readonly int[] Meadows_Item3Max = new int[5] { 5, 7, 6, 4, 2 }; private const int Meadows_CoinsPerMinion = 30; private const int Meadows_CoinsPerBoss = 100; private static readonly string[] BF_Item1 = new string[5] { "GreydwarfEye", "TrollHide", "Thunderstone", "Copper", "Tin" }; private static readonly int[] BF_Item1Min = new int[5] { 10, 4, 2, 20, 20 }; private static readonly int[] BF_Item1Max = new int[5] { 13, 8, 3, 30, 30 }; private static readonly string[] BF_Item2 = new string[5] { "Bronze", "Thistle", "MeadStaminaMedium", "MeadSwimmer", "MeadPoisonResist" }; private static readonly int[] BF_Item2Min = new int[5] { 10, 8, 2, 2, 2 }; private static readonly int[] BF_Item2Max = new int[5] { 20, 15, 3, 3, 3 }; private static readonly string[] BF_Item3 = new string[5] { "Ruby", "Amber", "AmberPearl", "SurtlingCore", "MeadLightfoot" }; private static readonly int[] BF_Item3Min = new int[5] { 3, 3, 3, 2, 1 }; private static readonly int[] BF_Item3Max = new int[5] { 5, 7, 6, 4, 2 }; private const int BF_CoinsPerMinion = 40; private const int BF_CoinsPerBoss = 200; private static readonly string[] BR_Item1 = new string[5] { "CookedMeat", "MeadHealthMinor", "MeadStaminaMinor", "BoarJerky", "Honey" }; private static readonly int[] BR_Item1Min = new int[5] { 5, 1, 1, 5, 10 }; private static readonly int[] BR_Item1Max = new int[5] { 10, 2, 2, 10, 30 }; private static readonly string[] BR_Item2 = new string[5] { "BombOoze", "BombBlob_Poison", "NeckTail", "CookedLoxMeat", "CookedWolfMeat" }; private static readonly int[] BR_Item2Min = new int[5] { 5, 3, 5, 1, 1 }; private static readonly int[] BR_Item2Max = new int[5] { 10, 6, 15, 2, 2 }; private static readonly string[] BR_Item3 = new string[5] { "Ruby", "Amber", "AmberPearl", "SurtlingCore", "MeadLightfoot" }; private static readonly int[] BR_Item3Min = new int[5] { 3, 3, 3, 2, 1 }; private static readonly int[] BR_Item3Max = new int[5] { 5, 7, 6, 4, 2 }; private const int BR_CoinsPerMinion = 20; private const int BR_CoinsPerBoss = 0; private static readonly string[] GDF_Item1 = new string[5] { "QueensJam", "MeadTasty", "MeadStaminaMinor", "BoarJerky", "Honey" }; private static readonly int[] GDF_Item1Min = new int[5] { 5, 1, 1, 5, 10 }; private static readonly int[] GDF_Item1Max = new int[5] { 10, 2, 2, 10, 30 }; private static readonly string[] GDF_Item2 = new string[5] { "BombOoze", "BombBlob_Poison", "Resin", "CookedLoxMeat", "CookedWolfMeat" }; private static readonly int[] GDF_Item2Min = new int[5] { 5, 3, 30, 1, 1 }; private static readonly int[] GDF_Item2Max = new int[5] { 10, 6, 40, 2, 2 }; private static readonly string[] GDF_Item3 = new string[5] { "Ruby", "Amber", "AmberPearl", "SurtlingCore", "MeadLightfoot" }; private static readonly int[] GDF_Item3Min = new int[5] { 3, 3, 3, 2, 1 }; private static readonly int[] GDF_Item3Max = new int[5] { 5, 7, 6, 4, 2 }; private const int GDF_CoinsPerMinion = 25; private const int GDF_CoinsPerBoss = 0; private static readonly string[] SW_Item1 = new string[5] { "IronScrap", "Iron", "Chain", "Iron", "IronScrap" }; private static readonly int[] SW_Item1Min = new int[5] { 40, 20, 5, 10, 20 }; private static readonly int[] SW_Item1Max = new int[5] { 70, 30, 10, 20, 40 }; private static readonly string[] SW_Item2 = new string[5] { "TurnipSeeds", "MeadBzerker", "MeadHealthMajor", "PiquantPie", "MeadPoisonResist" }; private static readonly int[] SW_Item2Min = new int[5] { 8, 2, 3, 2, 5 }; private static readonly int[] SW_Item2Max = new int[5] { 15, 4, 4, 4, 12 }; private static readonly string[] SW_Item3 = new string[5] { "Ruby", "Amber", "AmberPearl", "SurtlingCore", "MeadFrostResist" }; private static readonly int[] SW_Item3Min = new int[5] { 5, 5, 5, 3, 3 }; private static readonly int[] SW_Item3Max = new int[5] { 10, 15, 15, 6, 5 }; private const int SW_CoinsPerMinion = 50; private const int SW_CoinsPerBoss = 300; private static readonly string[] DG_Item1 = new string[5] { "IronScrap", "Iron", "Chain", "Iron", "IronScrap" }; private static readonly int[] DG_Item1Min = new int[5] { 40, 20, 5, 10, 20 }; private static readonly int[] DG_Item1Max = new int[5] { 70, 30, 10, 20, 40 }; private static readonly string[] DG_Item2 = new string[5] { "TurnipSeeds", "MeadBzerker", "MeadHealthMajor", "PiquantPie", "MeadPoisonResist" }; private static readonly int[] DG_Item2Min = new int[5] { 8, 2, 3, 2, 5 }; private static readonly int[] DG_Item2Max = new int[5] { 15, 4, 4, 4, 12 }; private static readonly string[] DG_Item3 = new string[5] { "Ruby", "Amber", "AmberPearl", "SurtlingCore", "MeadFrostResist" }; private static readonly int[] DG_Item3Min = new int[5] { 5, 5, 5, 3, 3 }; private static readonly int[] DG_Item3Max = new int[5] { 10, 15, 15, 6, 5 }; private const int DG_CoinsPerMinion = 55; private const int DG_CoinsPerBoss = 0; private static readonly string[] DR_Item1 = new string[5] { "Silver", "Crystal", "SilverOre", "Silver", "SilverOre" }; private static readonly int[] DR_Item1Min = new int[5] { 40, 50, 50, 30, 30 }; private static readonly int[] DR_Item1Max = new int[5] { 70, 100, 120, 50, 40 }; private static readonly string[] DR_Item2 = new string[5] { "WolfClaw", "DragonEgg", "DragonTear", "OnionSeeds", "JuteRed" }; private static readonly int[] DR_Item2Min = new int[5] { 5, 1, 10, 30, 10 }; private static readonly int[] DR_Item2Max = new int[5] { 10, 1, 20, 40, 20 }; private static readonly string[] DR_Item3 = new string[5] { "Ruby", "Amber", "AmberPearl", "SurtlingCore", "MeatPlatter" }; private static readonly int[] DR_Item3Min = new int[5] { 8, 10, 10, 3, 10 }; private static readonly int[] DR_Item3Max = new int[5] { 10, 15, 15, 6, 12 }; private const int DR_CoinsPerMinion = 60; private const int DR_CoinsPerBoss = 400; private static readonly string[] PL_Item1 = new string[5] { "BlackMetal", "BlackMetal", "YagluthDrop", "Tar", "Barley" }; private static readonly int[] PL_Item1Min = new int[5] { 30, 50, 10, 50, 50 }; private static readonly int[] PL_Item1Max = new int[5] { 40, 60, 20, 100, 70 }; private static readonly string[] PL_Item2 = new string[5] { "ChickenEgg", "fish6", "Needle", "LinenThread", "GoblinTotem" }; private static readonly int[] PL_Item2Min = new int[5] { 3, 10, 15, 30, 10 }; private static readonly int[] PL_Item2Max = new int[5] { 6, 15, 25, 40, 20 }; private static readonly string[] PL_Item3 = new string[5] { "Ruby", "Amber", "AmberPearl", "SurtlingCore", "SilverNecklace" }; private static readonly int[] PL_Item3Min = new int[5] { 15, 15, 15, 3, 10 }; private static readonly int[] PL_Item3Max = new int[5] { 20, 20, 20, 6, 15 }; private const int PL_CoinsPerMinion = 65; private const int PL_CoinsPerBoss = 500; private static readonly string[] ML_Item1 = new string[5] { "YggdrasilWood", "SoftTissue", "BlackMarble", "SeekerAspic", "MeadEitrMinor" }; private static readonly int[] ML_Item1Min = new int[5] { 20, 10, 20, 5, 5 }; private static readonly int[] ML_Item1Max = new int[5] { 30, 20, 30, 7, 10 }; private static readonly string[] ML_Item2 = new string[5] { "BlackCore", "Sap", "QueenDrop", "Mandible", "Bilebag" }; private static readonly int[] ML_Item2Min = new int[5] { 3, 10, 2, 5, 5 }; private static readonly int[] ML_Item2Max = new int[5] { 5, 15, 4, 6, 6 }; private static readonly string[] ML_Item3 = new string[5] { "Ruby", "Amber", "AmberPearl", "SurtlingCore", "Eitr" }; private static readonly int[] ML_Item3Min = new int[5] { 15, 15, 15, 5, 5 }; private static readonly int[] ML_Item3Max = new int[5] { 20, 20, 20, 6, 15 }; private const int ML_CoinsPerMinion = 70; private const int ML_CoinsPerBoss = 600; private static readonly string[] AL_Item1 = new string[5] { "FlametalNew", "FlametalNew", "AskHide", "AskBladder", "BonemawSerpentTooth" }; private static readonly int[] AL_Item1Min = new int[5] { 20, 10, 10, 10, 10 }; private static readonly int[] AL_Item1Max = new int[5] { 30, 30, 20, 20, 20 }; private static readonly string[] AL_Item2 = new string[5] { "GemstoneGreen", "GemstoneBlue", "GemstoneGreen", "ProustitePowder", "FaderDrop" }; private static readonly int[] AL_Item2Min = new int[5] { 5, 5, 5, 10, 3 }; private static readonly int[] AL_Item2Max = new int[5] { 15, 15, 15, 20, 6 }; private static readonly string[] AL_Item3 = new string[5] { "Ruby", "Amber", "AmberPearl", "SurtlingCore", "Bell" }; private static readonly int[] AL_Item3Min = new int[5] { 15, 15, 15, 5, 1 }; private static readonly int[] AL_Item3Max = new int[5] { 20, 20, 20, 6, 1 }; private const int AL_CoinsPerMinion = 70; private const int AL_CoinsPerBoss = 600; public static void CreateLootChest(Vector3 pos, Quaternion rot, CustomRaid raid) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) GameObject prefab = ZNetScene.instance.GetPrefab("piece_chest_wood"); if ((Object)(object)prefab == (Object)null) { return; } GameObject val = Object.Instantiate<GameObject>(prefab, pos, rot); Container component = val.GetComponent<Container>(); if ((Object)(object)component == (Object)null) { return; } Inventory inventory = component.GetInventory(); if (inventory == null) { return; } string[] prefabs = Meadows_Item1; string[] prefabs2 = Meadows_Item2; string[] prefabs3 = Meadows_Item3; int[] minStack = Meadows_Item1Min; int[] maxStack = Meadows_Item1Max; int[] minStack2 = Meadows_Item2Min; int[] maxStack2 = Meadows_Item2Max; int[] minStack3 = Meadows_Item3Min; int[] maxStack3 = Meadows_Item3Max; int num = 30; int num2 = 100; if (raid.RaidName == "RuneStoneRaidBlackForest") { num = 40; num2 = 200; prefabs = BF_Item1; prefabs2 = BF_Item2; prefabs3 = BF_Item3; minStack = BF_Item1Min; maxStack = BF_Item1Max; minStack2 = BF_Item2Min; maxStack2 = BF_Item2Max; minStack3 = BF_Item3Min; maxStack3 = BF_Item3Max; } else if (raid.RaidName == "RuneStoneRaidBoars") { num = 20; num2 = 0; prefabs = BR_Item1; prefabs2 = BR_Item2; prefabs3 = BR_Item3; minStack = BR_Item1Min; maxStack = BR_Item1Max; minStack2 = BR_Item2Min; maxStack2 = BR_Item2Max; minStack3 = BR_Item3Min; maxStack3 = BR_Item3Max; } else if (raid.RaidName == "RuneStoneGreydwarfs") { num = 25; num2 = 0; prefabs = GDF_Item1; prefabs2 = GDF_Item2; prefabs3 = GDF_Item3; minStack = GDF_Item1Min; maxStack = GDF_Item1Max; minStack2 = GDF_Item2Min; maxStack2 = GDF_Item2Max; minStack3 = GDF_Item3Min; maxStack3 = GDF_Item3Max; } else if (raid.RaidName == "RuneStoneSwamps") { num = 50; num2 = 300; prefabs = SW_Item1; prefabs2 = SW_Item2; prefabs3 = SW_Item3; minStack = SW_Item1Min; maxStack = SW_Item1Max; minStack2 = SW_Item2Min; maxStack2 = SW_Item2Max; minStack3 = SW_Item3Min; maxStack3 = SW_Item3Max; } else if (raid.RaidName == "RuneStoneDraugr") { num = 55; num2 = 0; prefabs = DG_Item1; prefabs2 = DG_Item2; prefabs3 = DG_Item3; minStack = DG_Item1Min; maxStack = DG_Item1Max; minStack2 = DG_Item2Min; maxStack2 = DG_Item2Max; minStack3 = DG_Item3Min; maxStack3 = DG_Item3Max; } else if (raid.RaidName == "RuneStoneMountains") { num = 60; num2 = 400; prefabs = DR_Item1; prefabs2 = DR_Item2; prefabs3 = DR_Item3; minStack = DR_Item1Min; maxStack = DR_Item1Max; minStack2 = DR_Item2Min; maxStack2 = DR_Item2Max; minStack3 = DR_Item3Min; maxStack3 = DR_Item3Max; } else if (raid.RaidName == "RuneStonePlains") { num = 65; num2 = 500; prefabs = PL_Item1; prefabs2 = PL_Item2; prefabs3 = PL_Item3; minStack = PL_Item1Min; maxStack = PL_Item1Max; minStack2 = PL_Item2Min; maxStack2 = PL_Item2Max; minStack3 = PL_Item3Min; maxStack3 = PL_Item3Max; } else if (raid.RaidName == "RuneStoneMistlands") { num = 70; num2 = 600; prefabs = ML_Item1; prefabs2 = ML_Item2; prefabs3 = ML_Item3; minStack = ML_Item1Min; maxStack = ML_Item1Max; minStack2 = ML_Item2Min; maxStack2 = ML_Item2Max; minStack3 = ML_Item3Min; maxStack3 = ML_Item3Max; } else if (raid.RaidName == "RuneStoneAshlands") { num = 70; num2 = 600; prefabs = AL_Item1; prefabs2 = AL_Item2; prefabs3 = AL_Item3; minStack = AL_Item1Min; maxStack = AL_Item1Max; minStack2 = AL_Item2Min; maxStack2 = AL_Item2Max; minStack3 = AL_Item3Min; maxStack3 = AL_Item3Max; } int num3 = raid.TotalToSpawn * num + raid.DifficultyLevel * num2; if (num3 > 0) { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("Coins"); if ((Object)(object)itemPrefab != (Object)null) { ItemDrop component2 = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component2 != (Object)null) { ItemData val2 = component2.m_itemData.Clone(); val2.m_stack = num3; val2.m_dropPrefab = itemPrefab; inventory.AddItem(val2); } } } AddRandomItem(inventory, prefabs, minStack, maxStack, raid.DifficultyLevel); AddRandomItem(inventory, prefabs2, minStack2, maxStack2, raid.DifficultyLevel); AddRandomItem(inventory, prefabs3, minStack3, maxStack3, raid.DifficultyLevel); ZNetView component3 = val.GetComponent<ZNetView>(); if ((Object)(object)component3 != (Object)null && component3.IsValid()) { component3.GetZDO().Set(ZDOVars.s_addedDefaultItems, true); } } private static void AddRandomItem(Inventory inv, string[] prefabs, int[] minStack, int[] maxStack, int difficulty) { int num = Random.Range(0, prefabs.Length); string text = prefabs[num]; if (text == "none") { return; } GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(text); if ((Object)(object)itemPrefab == (Object)null) { return; } ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component == (Object)null) { return; } int num2 = Random.Range(minStack[num], maxStack[num] + 1) * difficulty; if (num2 > 0) { int maxStackSize = component.m_itemData.m_shared.m_maxStackSize; while (num2 > 0) { int num3 = Mathf.Min(num2, maxStackSize); num2 -= num3; ItemData val = component.m_itemData.Clone(); val.m_stack = num3; val.m_dropPrefab = itemPrefab; inv.AddItem(val); } } } } public class CustomRaidManager : MonoBehaviour { private List<CustomRaid> _activeRaids = new List<CustomRaid>(); public static CustomRaidManager Instance { get; private set; } private void Awake() { Instance = this; } private void Update() { float deltaTime = Time.deltaTime; for (int num = _activeRaids.Count - 1; num >= 0; num--) { CustomRaid customRaid = _activeRaids[num]; customRaid.Update(deltaTime); if (!customRaid.IsActive) { _activeRaids.RemoveAt(num); } } } public bool HasActiveRaidOnStone(GameObject stone) { foreach (CustomRaid activeRaid in _activeRaids) { if ((Object)(object)activeRaid.RuneStone == (Object)(object)stone) { return true; } } return false; } public bool HasActiveRaid(string raidName) { foreach (CustomRaid activeRaid in _activeRaids) { if (activeRaid.RaidName == raidName) { return true; } } return false; } public bool HasActiveRaid() { return _activeRaids.Count > 0; } public void RegisterRaid(CustomRaid raid) { raid.Start(); _activeRaids.Add(raid); } public void StartCoroutine(IEnumerator routine) { ((MonoBehaviour)this).StartCoroutine(routine); } } public static class CustomRaidMessages { private static GameObject _counterObject; private static Text _counterText; public static void ShowStartMessage(string text) { if ((Object)(object)MessageHud.instance != (Object)null) { MessageHud.instance.ShowMessage((MessageType)2, text, 0, (Sprite)null, false); } } public static void ShowCounter(int killed, int total) { if ((Object)(object)_counterObject == (Object)null) { CreateCounterUI(); } if ((Object)(object)_counterText != (Object)null) { _counterText.text = $"Goal kills: {killed}/{total}"; _counterObject.SetActive(true); } } private static void CreateCounterUI() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown //IL_00ae: 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_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0108: 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_0134: 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_0156: Unknown result type (might be due to invalid IL or missing references) Hud instance = Hud.instance; Transform val = ((instance != null) ? ((Component)instance).transform : null); if (!((Object)(object)val == (Object)null)) { Canvas componentInParent = ((Component)val).GetComponentInParent<Canvas>(); if (!((Object)(object)componentInParent == (Object)null)) { _counterObject = new GameObject("CustomRaidCounter"); _counterObject.transform.SetParent(((Component)componentInParent).transform, false); _counterText = _counterObject.AddComponent<Text>(); _counterText.font = Resources.GetBuiltinResource<Font>("LegacyRuntime.ttf"); _counterText.fontSize = 28; ((Graphic)_counterText).color = new Color(1f, 0.85f, 0.3f, 1f); _counterText.alignment = (TextAnchor)1; Outline val2 = _counterObject.AddComponent<Outline>(); ((Shadow)val2).effectColor = Color.black; ((Shadow)val2).effectDistance = new Vector2(1f, -1f); RectTransform component = _counterObject.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0.5f, 0.9f); component.anchorMax = new Vector2(0.5f, 0.9f); component.pivot = new Vector2(0.5f, 0.5f); component.sizeDelta = new Vector2(500f, 50f); component.anchoredPosition = Vector2.zero; } } } public static void HideCounter() { if ((Object)(object)_counterObject != (Object)null) { Object.Destroy((Object)(object)_counterObject); _counterObject = null; _counterText = null; } } public static void ShowBossMessage(string text) { ShowStartMessage(text); } public static void ShowEndMessage(string text) { HideCounter(); if ((Object)(object)MessageHud.instance != (Object)null) { MessageHud.instance.ShowMessage((MessageType)2, text, 0, (Sprite)null, false); } } } [BepInPlugin("lizzardfyll.runestonetrials", "Runestone Trials", "1.1.0")] public class CustomRaidPlugin : BaseUnityPlugin { public static ConfigEntry<bool> ShowStoneMarkers; public static ConfigEntry<int> EnemyMultiplier; private void Awake() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown ShowStoneMarkers = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ShowStoneMarkers", true, "Show runestone markers on the minimap when nearby"); EnemyMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("General", "EnemyMultiplier", 1, new ConfigDescription("If you don't have enough enemies, you can multiply their total number. (1-3)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 3), Array.Empty<object>())); GameObject val = new GameObject("CustomRaidManager"); val.AddComponent<CustomRaidManager>(); val.AddComponent<RunestoneMarkerUpdater>(); Object.DontDestroyOnLoad((Object)(object)val); Harmony val2 = new Harmony("lizzardfyll.runestonetrials"); val2.PatchAll(); } } [HarmonyPatch(typeof(RuneStone), "Interact")] public static class CustomRaidStonePatch { private static void Postfix(RuneStone __instance, Humanoid character, bool hold, bool alt) { //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) if (hold) { return; } Player val = (Player)(object)((character is Player) ? character : null); if (!((Object)(object)val == (Object)null) && !((Object)(object)CustomRaidManager.Instance == (Object)null) && !CustomRaidManager.Instance.HasActiveRaidOnStone(((Component)__instance).gameObject)) { int difficulty = CustomRaidFactory.RollDifficulty(); CustomRaid customRaid = CustomRaidFactory.CreateRaid(((Object)__instance).name, difficulty); if (customRaid != null) { customRaid.RaidCenter = ((Component)val).transform.position; customRaid.RuneStone = ((Component)__instance).gameObject; customRaid.EnemyMultiplier = CustomRaidPlugin.EnemyMultiplier.Value; CustomRaidManager.Instance.RegisterRaid(customRaid); } } } } public static class CustomRaidZoneDisplay { private static PinData _areaPin; private static PinData _eventPin; public static void ShowZone(Vector3 center, float radius) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) HideZone(); _areaPin = Minimap.instance.AddPin(center, (PinType)13, "", false, false, 0L, default(PlatformUserID)); _areaPin.m_worldSize = radius * 2f * 0.9f; _eventPin = Minimap.instance.AddPin(center, (PinType)11, "", false, false, 0L, default(PlatformUserID)); _eventPin.m_animate = true; _eventPin.m_doubleSize = true; } public static void HideZone() { if (_areaPin != null) { Minimap.instance.RemovePin(_areaPin); _areaPin = null; } if (_eventPin != null) { Minimap.instance.RemovePin(_eventPin); _eventPin = null; } } } public class MinionConfig { public string PrefabName; public int MinCount; public int MaxCount; public float SpawnInterval; public int GroupSizeMin; public int GroupSizeMax; public MinionConfig(string prefabName, int minCount, int maxCount, float spawnInterval = 4f, int groupSizeMin = 2, int groupSizeMax = 4) { PrefabName = prefabName; MinCount = minCount; MaxCount = maxCount; SpawnInterval = spawnInterval; GroupSizeMin = groupSizeMin; GroupSizeMax = groupSizeMax; } public int GetRandomCount() { return Random.Range(MinCount, MaxCount + 1); } } public static class RunestoneMarkers { private static HashSet<Vector3> _markedPositions = new HashSet<Vector3>(); public static void FindAndMarkStones(Vector3 playerPos) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: 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) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) RuneStone[] array = Object.FindObjectsByType<RuneStone>((FindObjectsSortMode)0); RuneStone[] array2 = array; foreach (RuneStone val in array2) { Vector3 position = ((Component)val).transform.position; if (!_markedPositions.Contains(position)) { float num = Vector3.Distance(playerPos, position); if (num < 160f) { Minimap.instance.AddPin(position, (PinType)3, "RuneStone", true, false, 0L, default(PlatformUserID)); _markedPositions.Add(position); } } } CheckDestroyedStones(array); } private static void CheckDestroyedStones(RuneStone[] activeStones) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0076: 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) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) HashSet<Vector3> hashSet = new HashSet<Vector3>(); foreach (RuneStone val in activeStones) { hashSet.Add(((Component)val).transform.position); } List<Vector3> list = new List<Vector3>(); foreach (Vector3 markedPosition in _markedPositions) { if (!hashSet.Contains(markedPosition)) { Minimap.instance.RemovePin(markedPosition, 1f); list.Add(markedPosition); } } foreach (Vector3 item in list) { _markedPositions.Remove(item); } } public static void RemoveAllMarkers() { _markedPositions.Clear(); } } public class RunestoneMarkerUpdater : MonoBehaviour { private float _timer; private void Update() { //IL_0072: Unknown result type (might be due to invalid IL or missing references) if (CustomRaidPlugin.ShowStoneMarkers.Value && !((Object)(object)Minimap.instance == (Object)null) && !((Object)(object)Player.m_localPlayer == (Object)null)) { _timer += Time.deltaTime; if (_timer >= 4f) { _timer = 0f; RunestoneMarkers.FindAndMarkStones(((Component)Player.m_localPlayer).transform.position); } } } private void OnDestroy() { RunestoneMarkers.RemoveAllMarkers(); } }