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 AuroraEventManager v1.0.5
plugins/AuroraEventManager.dll
Decompiled 2 weeks ago
The result has been truncated due to the large size, download it to view full contents!
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.Versioning; using System.Security; using System.Security.Permissions; using AuroraEventManager.Core; using AuroraEventManager.Data; using AuroraEventManager.Events; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("AuroraEventManager")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("AuroraEventManager")] [assembly: AssemblyTitle("AuroraEventManager")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace AuroraEventManager { [BepInPlugin("com.peepsquick.auroraeventmanager", "Aurora Event Manager", "2.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class AuroraEventManagerPlugin : BaseUnityPlugin { public const string PluginGUID = "com.peepsquick.auroraeventmanager"; public const string PluginName = "Aurora Event Manager"; public const string PluginVersion = "2.0.0"; private static Harmony _harmony; public static ConfigEntry<string> ModPassword; private const string ValidPassword = "peaches"; public static ConfigEntry<int> MinEventDelay; public static ConfigEntry<int> MaxEventDelay; public static ConfigEntry<int> TriviaAnswerTime; public static ConfigEntry<bool> EnableTrivia; public static ConfigEntry<int> MonsterEventDuration; public static ConfigEntry<bool> EnableTreasureGiant; public static ConfigEntry<bool> EnableTreasureSwarm; public static ConfigEntry<bool> EnableFavorGiant; public static ConfigEntry<bool> EnableFavorSwarm; public static ConfigEntry<bool> EnableMeatGiant; public static ConfigEntry<bool> EnableMeatSwarm; public static ConfigEntry<bool> EnableMosquitoGiant; public static ConfigEntry<bool> EnableMosquitoSwarm; public static ConfigEntry<bool> EnableBlessingRested; public static ConfigEntry<bool> EnableBlessingWeight; public static ConfigEntry<bool> EnableBlessingEikthyr; public static ConfigEntry<bool> EnableBlessingElder; public static ConfigEntry<bool> EnableBlessingBonemass; public static ConfigEntry<bool> EnableBlessingModer; public static ConfigEntry<bool> EnableBlessingYagluth; public static ConfigEntry<bool> EnableBlessingQueen; public static ConfigEntry<bool> EnableBlessingFader; public static ConfigEntry<bool> EnableBlessingDamage; public static ConfigEntry<bool> EnableBlessingDefense; public static ConfigEntry<bool> EnableGuessNumber; public static ConfigEntry<bool> EnableTeleportHaldor; public static ConfigEntry<bool> EnableTeleportHildir; public static ConfigEntry<bool> EnableTeleportChokepointA; public static ConfigEntry<bool> EnableTeleportChokepointB; public static ConfigEntry<bool> EnableTeleportChokepointC; public static ConfigEntry<bool> EnableReaction; public static ConfigEntry<bool> EnableActivityCrate; public static ConfigEntry<int> ActivityCratePayoutDay; public static ConfigEntry<int> ActivityCratePayoutHour; public static ConfigEntry<bool> EnableHiddenHaldor; public static ConfigEntry<bool> EnableDancingRitual; public static ConfigEntry<bool> EnablePraiseOdin; public static ConfigEntry<bool> EnableFreyjasFury; public static ConfigEntry<bool> EnableTyrsWoodenRain; public static ConfigEntry<bool> EnablePvPDuel; public static ConfigEntry<bool> EnableArrowRain; public static ConfigEntry<bool> EnableChainRain; public static ConfigEntry<bool> EnableMetalRain; public static ConfigEntry<bool> EnableAmbush; public static ConfigEntry<bool> EnableHourlyBlueprintReward; public static ConfigEntry<int> HourlyBlueprintIntervalMinutes; public static ConfigEntry<bool> EnableHourlyWeightBuff; public static ConfigEntry<int> HourlyWeightBuffIntervalMinutes; public static ConfigEntry<float> WeightBuffAmount; public static ConfigEntry<float> WeightBuffDurationHours; public static ConfigEntry<bool> EnableDailyGift; public static ConfigEntry<int> DailyGiftIntervalHours; public static ConfigEntry<bool> EnableDanceEvent; public static ConfigEntry<bool> EnableVibeEvent; private void Awake() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Invalid comparison between Unknown and I4 //IL_0795: Unknown result type (might be due to invalid IL or missing references) //IL_079f: Expected O, but got Unknown ModPassword = ((BaseUnityPlugin)this).Config.Bind<string>("Security", "Password", "ashatasthvbahs", "Server authentication password (only checked on dedicated servers)"); if ((int)SystemInfo.graphicsDeviceType == 4 && ModPassword.Value != "peaches") { Debug.LogError((object)"[AuroraEventManager] Invalid server password. Mod disabled."); ((BaseUnityPlugin)this).Logger.LogError((object)"Aurora Event Manager: Invalid password. Mod will not load on this server."); return; } ((BaseUnityPlugin)this).Logger.LogMessage((object)"═══════════════════════════════════════════════════"); ((BaseUnityPlugin)this).Logger.LogMessage((object)"Aurora Event Manager - The most advanced event system in Valheim"); ((BaseUnityPlugin)this).Logger.LogMessage((object)"═══════════════════════════════════════════════════"); Debug.Log((object)"[AuroraEventManager] ═══════════════════════════════════════════════════"); Debug.Log((object)"[AuroraEventManager] Aurora Event Manager - The most advanced event system in Valheim"); Debug.Log((object)"[AuroraEventManager] ═══════════════════════════════════════════════════"); MinEventDelay = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MinEventDelay", 5, "Minimum minutes between events"); MaxEventDelay = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MaxEventDelay", 500, "Maximum minutes between events"); TriviaAnswerTime = ((BaseUnityPlugin)this).Config.Bind<int>("Trivia", "AnswerTime", 60, "Seconds players have to answer trivia questions"); EnableTrivia = ((BaseUnityPlugin)this).Config.Bind<bool>("Trivia", "EnableTrivia", true, "Enable the Trivia event"); MonsterEventDuration = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterEvents", "Duration", 60, "Seconds before event monsters despawn"); EnableTreasureGiant = ((BaseUnityPlugin)this).Config.Bind<bool>("MonsterEvents", "EnableTreasureGiant", true, "Enable the Treasure Giant event"); EnableTreasureSwarm = ((BaseUnityPlugin)this).Config.Bind<bool>("MonsterEvents", "EnableTreasureSwarm", true, "Enable the Treasure Swarm event"); EnableFavorGiant = ((BaseUnityPlugin)this).Config.Bind<bool>("MonsterEvents", "EnableFavorGiant", true, "Enable the Favor Giant event"); EnableFavorSwarm = ((BaseUnityPlugin)this).Config.Bind<bool>("MonsterEvents", "EnableFavorSwarm", true, "Enable the Favor Swarm event"); EnableMeatGiant = ((BaseUnityPlugin)this).Config.Bind<bool>("MonsterEvents", "EnableMeatGiant", true, "Enable the Meat Giant event"); EnableMeatSwarm = ((BaseUnityPlugin)this).Config.Bind<bool>("MonsterEvents", "EnableMeatSwarm", true, "Enable the Meat Swarm event"); EnableMosquitoGiant = ((BaseUnityPlugin)this).Config.Bind<bool>("MonsterEvents", "EnableMosquitoGiant", true, "Enable the Giant Mosquito event"); EnableMosquitoSwarm = ((BaseUnityPlugin)this).Config.Bind<bool>("MonsterEvents", "EnableMosquitoSwarm", true, "Enable the Mosquito Swarm event"); EnableBlessingRested = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingRested", true, "Enable the Rested blessing (30 min)"); EnableBlessingWeight = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingWeight", true, "Enable the Weight/Carry blessing (FreyjaWeightHour)"); EnableBlessingEikthyr = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingEikthyr", true, "Enable the Eikthyr guardian power blessing (20 min)"); EnableBlessingElder = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingElder", true, "Enable the Elder guardian power blessing (20 min)"); EnableBlessingBonemass = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingBonemass", true, "Enable the Bonemass guardian power blessing (20 min)"); EnableBlessingModer = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingModer", true, "Enable the Moder guardian power blessing (20 min)"); EnableBlessingYagluth = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingYagluth", true, "Enable the Yagluth guardian power blessing (20 min)"); EnableBlessingQueen = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingQueen", true, "Enable the Queen guardian power blessing (20 min)"); EnableBlessingFader = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingFader", true, "Enable the Fader guardian power blessing (20 min)"); EnableBlessingDamage = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingDamage", true, "Enable the Damage blessing (+50% damage, 30 min)"); EnableBlessingDefense = ((BaseUnityPlugin)this).Config.Bind<bool>("BlessingEvents", "EnableBlessingDefense", true, "Enable the Defense blessing (+50% defense, 30 min)"); EnableGuessNumber = ((BaseUnityPlugin)this).Config.Bind<bool>("MiniGameEvents", "EnableGuessNumber", true, "Enable the Guess the Number event"); EnableTeleportHaldor = ((BaseUnityPlugin)this).Config.Bind<bool>("MiniGameEvents", "EnableTeleportHaldor", true, "Enable free teleport to Haldor"); EnableTeleportHildir = ((BaseUnityPlugin)this).Config.Bind<bool>("MiniGameEvents", "EnableTeleportHildir", true, "Enable free teleport to Hildir"); EnableTeleportChokepointA = ((BaseUnityPlugin)this).Config.Bind<bool>("MiniGameEvents", "EnableTeleportChokepointA", true, "Enable free teleport to Chokepoint A"); EnableTeleportChokepointB = ((BaseUnityPlugin)this).Config.Bind<bool>("MiniGameEvents", "EnableTeleportChokepointB", true, "Enable free teleport to Chokepoint B"); EnableTeleportChokepointC = ((BaseUnityPlugin)this).Config.Bind<bool>("MiniGameEvents", "EnableTeleportChokepointC", true, "Enable free teleport to Chokepoint C"); EnableReaction = ((BaseUnityPlugin)this).Config.Bind<bool>("MiniGameEvents", "EnableReaction", true, "Enable the Reaction (type word first) event - requires 3+ players"); EnableActivityCrate = ((BaseUnityPlugin)this).Config.Bind<bool>("ActivityCrate", "EnableActivityCrate", true, "Enable the Activity Crate system for weekly rewards"); ActivityCratePayoutDay = ((BaseUnityPlugin)this).Config.Bind<int>("ActivityCrate", "PayoutDay", 0, "Day of week for payout (0=Sunday, 1=Monday, etc)"); ActivityCratePayoutHour = ((BaseUnityPlugin)this).Config.Bind<int>("ActivityCrate", "PayoutHour", 18, "Hour for payout (24-hour format, 18 = 6PM)"); EnableHiddenHaldor = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableHiddenHaldor", true, "Enable Hidden Haldor event - find the trader for treasure!"); EnableDancingRitual = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableDancingRitual", true, "Enable Dancing Ritual event - dance together to clear weather!"); EnablePraiseOdin = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnablePraiseOdin", true, "Enable Praise Odin event - shout praise to smelt ores instantly!"); EnableFreyjasFury = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableFreyjasFury", true, "Enable Freyja's Fury event - kills monsters around a player!"); EnableTyrsWoodenRain = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableTyrsWoodenRain", true, "Enable Tyr's Wooden Rain event - rains random wood on a player!"); EnablePvPDuel = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnablePvPDuel", true, "Enable PvP Duel event - players can shout 'pvp?' to initiate duels!"); EnableArrowRain = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableArrowRain", true, "Enable Ullr's Arrow Rain event - rains random arrows on a player!"); EnableChainRain = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableChainRain", true, "Enable Loki's Chain Rain event - rains chains on a player!"); EnableMetalRain = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableMetalRain", true, "Enable Sindri's Metal Rain event - rains a random metal ingot (Tin/Copper/Bronze/Iron/Silver/BlackMetal) on a player!"); EnableAmbush = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableAmbush", true, "Enable Ambush event - players opt-in to face waves of monsters!"); EnableHourlyBlueprintReward = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableHourlyBlueprintReward", true, "Enable hourly blueprint reward - every online player gets a random ABP_ blueprint added to their Activity Crate!"); HourlyBlueprintIntervalMinutes = ((BaseUnityPlugin)this).Config.Bind<int>("SpecialEvents", "HourlyBlueprintIntervalMinutes", 60, "Interval in minutes between hourly blueprint reward grants"); EnableHourlyWeightBuff = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableHourlyWeightBuff", true, "Enable Heimdall's Gift - every hour, one random online player gets +1000 carry weight for 6 hours (lasts until death/logout)"); HourlyWeightBuffIntervalMinutes = ((BaseUnityPlugin)this).Config.Bind<int>("SpecialEvents", "HourlyWeightBuffIntervalMinutes", 60, "Interval in minutes between Heimdall's Gift rolls"); WeightBuffAmount = ((BaseUnityPlugin)this).Config.Bind<float>("SpecialEvents", "WeightBuffAmount", 1000f, "Amount of bonus carry weight Heimdall's Gift grants"); WeightBuffDurationHours = ((BaseUnityPlugin)this).Config.Bind<float>("SpecialEvents", "WeightBuffDurationHours", 6f, "Duration of Heimdall's Gift in hours (effectively ends on death/logout)"); EnableDailyGift = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableDailyGift", true, "Enable Freyja's Bounty - every 24h, one random player gets a surprise gift in their Activity Crate"); DailyGiftIntervalHours = ((BaseUnityPlugin)this).Config.Bind<int>("SpecialEvents", "DailyGiftIntervalHours", 24, "Interval in hours between Freyja's Bounty rolls"); EnableDanceEvent = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableDanceEvent", true, "Enable Freyja's Circle - all online vikings must /dance to receive +1h Rested"); EnableVibeEvent = ((BaseUnityPlugin)this).Config.Bind<bool>("SpecialEvents", "EnableVibeEvent", true, "Enable Dwarven Work Song - all online vikings must /cheer to receive +1000 carry weight for 6h"); CreatureManager.OnVanillaCreaturesAvailable += RegisterEventCreatures; _harmony = new Harmony("com.peepsquick.auroraeventmanager"); _harmony.PatchAll(); Debug.Log((object)"[AuroraEventManager] Harmony PatchAll completed"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Aurora Event Manager 2.0.0 loaded!"); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } CreatureManager.OnVanillaCreaturesAvailable -= RegisterEventCreatures; EventManagerCore.Shutdown(); } private void RegisterEventCreatures() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Expected O, but got Unknown //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Expected O, but got Unknown //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Expected O, but got Unknown //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Expected O, but got Unknown //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Expected O, but got Unknown //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Expected O, but got Unknown //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Expected O, but got Unknown //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_0292: Unknown result type (might be due to invalid IL or missing references) //IL_0299: Expected O, but got Unknown //IL_02b1: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Expected O, but got Unknown //IL_02d4: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Unknown result type (might be due to invalid IL or missing references) //IL_0307: Expected O, but got Unknown //IL_031f: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Expected O, but got Unknown //IL_0342: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"[AuroraEventManager] Registering custom event creatures via Jötunn CreatureManager..."); try { CreatureConfig val = new CreatureConfig(); val.Name = "Treasure Giant"; CustomCreature val2 = new CustomCreature("AEM_TreasureGiant", "Goblin", val); ConfigureEventCreature(val2.Prefab, 5f, new Color(1f, 0.84f, 0f), 3000f, "Treasure Giant", isBoss: true); CreatureManager.Instance.AddCreature(val2); Debug.Log((object)"[AuroraEventManager] Registered: AEM_TreasureGiant"); CreatureConfig val3 = new CreatureConfig(); val3.Name = "Treasure Goblin"; CustomCreature val4 = new CustomCreature("AEM_TreasureGoblin", "Goblin", val3); ConfigureEventCreature(val4.Prefab, 1f, new Color(1f, 0.84f, 0f), 50f, "Treasure Goblin", isBoss: false); CreatureManager.Instance.AddCreature(val4); Debug.Log((object)"[AuroraEventManager] Registered: AEM_TreasureGoblin"); CreatureConfig val5 = new CreatureConfig(); val5.Name = "Favor Dragon"; CustomCreature val6 = new CustomCreature("AEM_FavorDragon", "Hatchling", val5); ConfigureEventCreature(val6.Prefab, 3f, new Color(0.3f, 0.5f, 1f), 5000f, "Favor Dragon", isBoss: true); CreatureManager.Instance.AddCreature(val6); Debug.Log((object)"[AuroraEventManager] Registered: AEM_FavorDragon"); CreatureConfig val7 = new CreatureConfig(); val7.Name = "Favor Drake"; CustomCreature val8 = new CustomCreature("AEM_FavorDrake", "Hatchling", val7); ConfigureEventCreature(val8.Prefab, 1f, new Color(0.3f, 0.5f, 1f), 30f, "Favor Drake", isBoss: false); CreatureManager.Instance.AddCreature(val8); Debug.Log((object)"[AuroraEventManager] Registered: AEM_FavorDrake"); CreatureConfig val9 = new CreatureConfig(); val9.Name = "Meat Giant"; CustomCreature val10 = new CustomCreature("AEM_MeatGiant", "Boar", val9); ConfigureEventCreature(val10.Prefab, 5f, new Color(1f, 0.4f, 0.5f), 2000f, "Meat Giant", isBoss: true); CreatureManager.Instance.AddCreature(val10); Debug.Log((object)"[AuroraEventManager] Registered: AEM_MeatGiant"); CreatureConfig val11 = new CreatureConfig(); val11.Name = "Meat Boar"; CustomCreature val12 = new CustomCreature("AEM_MeatBoar", "Boar", val11); ConfigureEventCreature(val12.Prefab, 1f, new Color(1f, 0.4f, 0.5f), 30f, "Meat Boar", isBoss: false); CreatureManager.Instance.AddCreature(val12); Debug.Log((object)"[AuroraEventManager] Registered: AEM_MeatBoar"); CreatureConfig val13 = new CreatureConfig(); val13.Name = "Giant Mosquito"; CustomCreature val14 = new CustomCreature("AEM_GiantMosquito", "Deathsquito", val13); ConfigureEventCreature(val14.Prefab, 5f, new Color(1f, 0.2f, 0.2f), 1500f, "Giant Mosquito", isBoss: true); CreatureManager.Instance.AddCreature(val14); Debug.Log((object)"[AuroraEventManager] Registered: AEM_GiantMosquito"); CreatureConfig val15 = new CreatureConfig(); val15.Name = "Void Mosquito"; CustomCreature val16 = new CustomCreature("AEM_VoidMosquito", "Deathsquito", val15); ConfigureEventCreature(val16.Prefab, 1f, new Color(1f, 0.2f, 0.2f), 20f, "Void Mosquito", isBoss: false); CreatureManager.Instance.AddCreature(val16); Debug.Log((object)"[AuroraEventManager] Registered: AEM_VoidMosquito"); Debug.Log((object)"[AuroraEventManager] Successfully registered 8 custom event creatures via Jötunn!"); } catch (Exception ex) { Debug.LogError((object)("[AuroraEventManager] Failed to register creatures: " + ex.Message + "\n" + ex.StackTrace)); } CreatureManager.OnVanillaCreaturesAvailable -= RegisterEventCreatures; } private void ConfigureEventCreature(GameObject prefab, float scale, Color glowColor, float health, string displayName, bool isBoss) { //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_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_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) prefab.transform.localScale = Vector3.one * scale; Character component = prefab.GetComponent<Character>(); prefab.GetComponent<Humanoid>(); MonsterAI component2 = prefab.GetComponent<MonsterAI>(); if ((Object)(object)component != (Object)null) { component.m_name = displayName; component.m_health = health; component.m_boss = isBoss; } CharacterDrop component3 = prefab.GetComponent<CharacterDrop>(); if ((Object)(object)component3 != (Object)null) { component3.m_drops = new List<Drop>(); } if ((Object)(object)component2 != (Object)null) { component2.m_attackPlayerObjects = false; component2.m_alertRange = 30f; } if ((Object)(object)prefab.transform.Find("AEM_Glow") == (Object)null) { GameObject val = new GameObject("AEM_Glow"); val.transform.SetParent(prefab.transform); val.transform.localPosition = Vector3.up * (isBoss ? 3f : 1f); Light obj = val.AddComponent<Light>(); obj.type = (LightType)2; obj.color = glowColor; obj.intensity = (isBoss ? 3f : 2f); obj.range = (isBoss ? 25f : 15f); val.AddComponent<PulsingLight>(); } } } public class PulsingLight : MonoBehaviour { private Light _light; private float _baseIntensity; private float _pulseSpeed = 2f; private float _pulseAmount = 0.5f; private void Start() { _light = ((Component)this).GetComponent<Light>(); if ((Object)(object)_light != (Object)null) { _baseIntensity = _light.intensity; } } private void Update() { if ((Object)(object)_light != (Object)null) { float num = Mathf.Sin(Time.time * _pulseSpeed) * _pulseAmount + 1f; _light.intensity = _baseIntensity * num; } } } [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetScene_Awake_Patch { [HarmonyPostfix] public static void Postfix(ZNetScene __instance) { if ((Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()) { Debug.Log((object)"[AuroraEventManager] Initializing Aurora Event Manager on server..."); EventManagerCore.Initialize(); ActivityTracker.Initialize(); ActivityCrateManager.Initialize(); NewPlayerTracker.Initialize(); PvPDuelEvent.Initialize(); } } } [HarmonyPatch(typeof(Game), "Start")] public static class Game_Start_Patch { [HarmonyPostfix] public static void Postfix() { Debug.Log((object)"[AuroraEventManager] Registering client RPC handlers..."); RewardHandler.RegisterClientRPCs(); ActivityCrateUI.Initialize(); ActivityCrateManager.Initialize(); } } [HarmonyPatch(typeof(Hud), "Awake")] public static class Hud_Awake_Patch { [HarmonyPostfix] public static void Postfix(Hud __instance) { Debug.Log((object)"[AuroraEventManager] HUD initialized, setting up crate button..."); ActivityCrateUI.Instance?.SetupCrateButton(); } } [HarmonyPatch(typeof(ZRoutedRpc), "HandleRoutedRPC")] public static class ZRoutedRpc_HandleRoutedRPC_Patch { } [HarmonyPatch(typeof(Chat), "SendText")] public static class Chat_SendText_Patch { [HarmonyPostfix] public static void Postfix(Chat __instance, Type type, string text) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 if ((int)type == 2 && text?.Trim()?.ToLower() == "pvp?" && ZRoutedRpc.instance != null && (Object)(object)Player.m_localPlayer != (Object)null) { string playerName = Player.m_localPlayer.GetPlayerName(); ZNet.GetUID(); ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "AEM_DuelRequest", new object[1] { playerName }); } } } [HarmonyPatch(typeof(Chat), "OnNewChatMessage")] public static class Chat_OnNewChatMessage_Patch { [HarmonyPostfix] public static void Postfix(GameObject go, long senderID, Vector3 pos, Type type, UserInfo sender, string text) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Invalid comparison between Unknown and I4 if (!((Object)(object)ZNet.instance == (Object)null) && ZNet.instance.IsServer() && sender != null && !(sender.Name == "Event Manager") && (Object)(object)EventManagerCore.Instance != (Object)null && (int)type == 2) { EventManagerCore.Instance.OnPlayerChat(sender.Name, text); } } } [HarmonyPatch(typeof(Character), "Damage")] public static class Character_Damage_Patch { private static Random _random = new Random(); [HarmonyPrefix] public static void Prefix(Character __instance, HitData hit) { if ((Object)(object)__instance == (Object)null || hit == null) { return; } Character attacker = hit.GetAttacker(); if (!((Object)(object)attacker != (Object)null)) { return; } string name = ((Object)((Component)attacker).gameObject).name; if (!IsEventMonster(((Component)attacker).gameObject)) { return; } Debug.Log((object)("[AuroraEventManager] Event monster " + name + " attacking " + ((Object)__instance).name)); Player val = (Player)(object)((__instance is Player) ? __instance : null); if (val != null) { ZNetView component = ((Component)attacker).GetComponent<ZNetView>(); if (((component != null) ? component.GetZDO() : null) != null) { string @string = component.GetZDO().GetString("AEM_StatusEffect", ""); if (!string.IsNullOrEmpty(@string)) { ApplyStatusEffect(val, @string); Debug.Log((object)("[AuroraEventManager] Applied " + @string + " debuff to " + val.GetPlayerName())); } else { Debug.Log((object)("[AuroraEventManager] No status effect configured for " + name)); } } } hit.m_damage.m_damage = 0f; hit.m_damage.m_blunt = 0f; hit.m_damage.m_slash = 0f; hit.m_damage.m_pierce = 0f; hit.m_damage.m_chop = 0f; hit.m_damage.m_pickaxe = 0f; hit.m_damage.m_fire = 0f; hit.m_damage.m_frost = 0f; hit.m_damage.m_lightning = 0f; hit.m_damage.m_poison = 0f; hit.m_damage.m_spirit = 0f; hit.m_pushForce = 0f; hit.m_backstabBonus = 0f; hit.m_staggerMultiplier = 0f; } [HarmonyPostfix] public static void Postfix(Character __instance, HitData hit) { //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance == (Object)null || hit == null) { return; } string name = ((Object)((Component)__instance).gameObject).name; if (!IsEventMonster(((Component)__instance).gameObject)) { return; } Debug.Log((object)("[AuroraEventManager] Event monster " + name + " was hit!")); ZNetView component = ((Component)__instance).GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null) { Debug.LogWarning((object)("[AuroraEventManager] No ZNetView on " + name)); return; } if (component.GetZDO() == null) { Debug.LogWarning((object)("[AuroraEventManager] No ZDO on " + name)); return; } if (!component.IsOwner()) { Debug.Log((object)("[AuroraEventManager] Not owner of " + name + ", skipping loot")); return; } ZDO zDO = component.GetZDO(); float @float = zDO.GetFloat("AEM_LastHitTime", 0f); if (Time.time - @float < 0.5f) { Debug.Log((object)("[AuroraEventManager] Cooldown active for " + name)); return; } zDO.Set("AEM_LastHitTime", Time.time); string @string = zDO.GetString("AEM_ItemPool", ""); if (string.IsNullOrEmpty(@string)) { Debug.LogWarning((object)("[AuroraEventManager] No item pool in ZDO for " + name)); return; } int @int = zDO.GetInt("AEM_HitDropMin", 1); int int2 = zDO.GetInt("AEM_HitDropMax", 3); string[] array = @string.Split(new char[1] { ',' }); string text = array[_random.Next(array.Length)]; int num = _random.Next(@int, int2 + 1); Vector3 val = ((hit.m_point != Vector3.zero) ? hit.m_point : ((Component)__instance).transform.position); Debug.Log((object)$"[AuroraEventManager] HIT LOOT: {num}x {text} at {val}"); RewardHandler.DropItemsAtPosition(text, num, val); } private static bool IsEventMonster(GameObject go) { if ((Object)(object)go == (Object)null) { return false; } if (((Object)go).name.Contains("AEM_")) { return true; } ZNetView component = go.GetComponent<ZNetView>(); if (((component != null) ? component.GetZDO() : null) != null && component.GetZDO().GetBool("AEM_IsEventMonster", false)) { return true; } return false; } private static void ApplyStatusEffect(Player player, string effectName) { if ((Object)(object)player == (Object)null || string.IsNullOrEmpty(effectName)) { return; } try { SEMan sEMan = ((Character)player).GetSEMan(); if (sEMan == null) { return; } if (ObjectDB.instance?.m_StatusEffects != null) { foreach (StatusEffect statusEffect in ObjectDB.instance.m_StatusEffects) { if ((Object)(object)statusEffect != (Object)null && ((Object)statusEffect).name == effectName) { StatusEffect val = sEMan.AddStatusEffect(statusEffect.NameHash(), true, 0, 0f); if ((Object)(object)val != (Object)null) { val.m_ttl = 1.5f; } return; } } } Debug.LogWarning((object)("[AuroraEventManager] Status effect '" + effectName + "' not found in ObjectDB")); } catch (Exception ex) { Debug.LogWarning((object)("[AuroraEventManager] Failed to apply status effect: " + ex.Message)); } } } [HarmonyPatch(typeof(Character), "OnDeath")] public static class Character_OnDeath_Patch { private static Random _random = new Random(); [HarmonyPrefix] public static void Prefix(Character __instance) { //IL_014f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance == (Object)null) { return; } string name = ((Object)((Component)__instance).gameObject).name; if (!name.Contains("AEM_")) { return; } Debug.Log((object)("[AuroraEventManager] Event monster dying: " + name)); ZNetView component = ((Component)__instance).GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null || component.GetZDO() == null) { Debug.LogWarning((object)("[AuroraEventManager] No ZNetView/ZDO on dying " + name)); return; } if (!component.IsOwner()) { Debug.Log((object)("[AuroraEventManager] Not owner of dying " + name + ", skipping death loot")); return; } ZDO zDO = component.GetZDO(); if (zDO.GetBool("AEM_DeathLootDropped", false)) { Debug.Log((object)("[AuroraEventManager] Death loot already dropped for " + name)); return; } zDO.Set("AEM_DeathLootDropped", true); string @string = zDO.GetString("AEM_ItemPool", ""); if (string.IsNullOrEmpty(@string)) { Debug.LogWarning((object)("[AuroraEventManager] No item pool in ZDO for dying " + name)); return; } int @int = zDO.GetInt("AEM_KillDropMin", 10); int int2 = zDO.GetInt("AEM_KillDropMax", 20); string[] array = @string.Split(new char[1] { ',' }); string text = array[_random.Next(array.Length)]; int num = _random.Next(@int, int2 + 1); Debug.Log((object)$"[AuroraEventManager] DEATH LOOT: {num}x {text}"); RewardHandler.DropItemsAtPosition(text, num, ((Component)__instance).transform.position); } } [HarmonyPatch(typeof(CharacterDrop), "OnDeath")] public static class CharacterDrop_OnDeath_Patch { [HarmonyPrefix] public static bool Prefix(CharacterDrop __instance) { string name = ((Object)((Component)__instance).gameObject).name; if (name.Contains("AEM_")) { Debug.Log((object)("[AuroraEventManager] Blocking vanilla loot for " + name)); return false; } return true; } } [HarmonyPatch(typeof(Character), "Start")] public static class Character_Start_Patch { [HarmonyPostfix] public static void Postfix(Character __instance) { if (!((Object)(object)__instance == (Object)null)) { string name = ((Object)((Component)__instance).gameObject).name; if (name.Contains("AEM_")) { ZNetView component = ((Component)__instance).GetComponent<ZNetView>(); bool flag = ((component != null) ? component.GetZDO() : null) != null; bool flag2 = component != null && component.IsOwner(); Debug.Log((object)$"[AuroraEventManager] Event monster started: {name}, hasZDO={flag}, isOwner={flag2}"); } } } } [HarmonyPatch(typeof(Trader), "Interact")] public static class Trader_Interact_Patch { [HarmonyPrefix] public static bool Prefix(Trader __instance, Humanoid character, bool hold, bool alt, ref bool __result) { if ((Object)(object)__instance == (Object)null || hold) { return true; } ZNetView component = ((Component)__instance).GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null || component.GetZDO() == null) { return true; } if (!component.GetZDO().GetBool("AEM_HiddenHaldor", false)) { return true; } Player val = (Player)(object)((character is Player) ? character : null); if ((Object)(object)val != (Object)null) { RewardHandler.NotifyHaldorFound(val.GetPlayerName()); ((Character)val).Message((MessageType)2, "You found Hidden Haldor!", 0, (Sprite)null); __result = true; return false; } return true; } } } namespace AuroraEventManager.Events { public enum MonsterEventType { Giant, Swarm } public abstract class BaseMonsterEvent : BaseEvent { protected float _eventStartTime; protected float _eventDuration; protected string _eventInstanceId; protected int _spawnCount; protected List<ZDOID> _spawnedZDOIDs = new List<ZDOID>(); protected abstract string CustomPrefabName { get; } protected abstract MonsterEventType EventType { get; } protected abstract string[] ItemPool { get; } protected abstract string StatusEffectOnHit { get; } protected abstract bool MonsterFlees { get; } protected virtual int HitDropMin { get { if (EventType != 0) { return 1; } return 2; } } protected virtual int HitDropMax { get { if (EventType != 0) { return 2; } return 5; } } protected virtual int KillDropMin { get { if (EventType != 0) { return 8; } return 30; } } protected virtual int KillDropMax { get { if (EventType != 0) { return 12; } return 50; } } protected virtual int SwarmCount => 5; public BaseMonsterEvent() { Config = new EventConfig { Enabled = true, Weight = 3, MinPlayers = 1, IsGlobalEvent = false, RequiresTargetPlayer = true }; } public override bool CanTrigger() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0020: 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_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) if (!base.CanTrigger()) { return false; } if (base.TargetPosition != Vector3.zero) { if (!BaseEvent.IsValidMonsterEventLocation(base.TargetPosition)) { Debug.Log((object)("[AuroraEventManager] " + EventName + " cannot trigger - player too close to workbench")); return false; } if (!PrivateArea.CheckAccess(base.TargetPosition, 0f, false, false)) { Debug.Log((object)("[AuroraEventManager] " + EventName + " cannot trigger - position is inside ward area")); return false; } PlayerBehaviorTracker instance = PlayerBehaviorTracker.Instance; if (instance.IsPositionSheltered(base.TargetPosition)) { Debug.Log((object)("[AuroraEventManager] " + EventName + " cannot trigger - position is sheltered")); return false; } if (instance.IsPositionInPlayerBase(base.TargetPosition)) { Debug.Log((object)("[AuroraEventManager] " + EventName + " cannot trigger - position is in player base")); return false; } } return true; } protected override void OnEventStart() { _eventDuration = AuroraEventManagerPlugin.MonsterEventDuration.Value; _eventStartTime = Time.time; _eventInstanceId = $"{EventId}_{DateTime.UtcNow.Ticks}"; _spawnCount = 0; _spawnedZDOIDs.Clear(); string text = ((EventType == MonsterEventType.Giant) ? "GIANT" : "SWARM"); string message = "<color=#00FFFF>[" + text + "]</color> A <color=#FFA500>" + EventName + "</color> has appeared near <color=#FFFF00>" + base.TargetPlayerName + "</color>! Hunt it down for loot!"; SendEventShout(message); SpawnMonsters(); Debug.Log((object)$"[AuroraEventManager] {EventName} started with {_spawnCount} monsters"); } protected override void OnEventStop() { DespawnAllMonsters(); EventManagerCore.Instance?.OnEventEnded(this); Debug.Log((object)("[AuroraEventManager] " + EventName + " ended")); } protected override void OnEventUpdate() { //IL_005d: 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_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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) if (Time.time - _eventStartTime < 3f) { return; } if (Time.time - _eventStartTime >= _eventDuration) { SendEventShout("<color=#FFA500>[EVENT]</color> The " + EventName + " has escaped! Time ran out."); Stop(); return; } int num = 0; foreach (ZDOID spawnedZDOID in _spawnedZDOIDs) { if (spawnedZDOID != ZDOID.None) { ZDOMan instance = ZDOMan.instance; if (((instance != null) ? instance.GetZDO(spawnedZDOID) : null) != null) { num++; } } } if (num == 0 && _spawnCount > 0) { SendEventShout("<color=#00FF00>[EVENT]</color> All " + EventName + " creatures have been defeated!"); Stop(); } } protected virtual void SpawnMonsters() { //IL_0018: 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_001f: 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_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) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) int num = ((EventType == MonsterEventType.Giant) ? 1 : SwarmCount); for (int i = 0; i < num; i++) { Vector3 spawnPosition = GetSpawnPosition(i); ZDOID val = SpawnEventMonster(spawnPosition); if (val != ZDOID.None) { _spawnedZDOIDs.Add(val); _spawnCount++; } } Debug.Log((object)$"[AuroraEventManager] Spawned {_spawnCount}x {CustomPrefabName}"); } protected Vector3 GetSpawnPosition(int index) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0042: 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_0004: Unknown result type (might be due to invalid IL or missing references) if (index == 0) { return base.TargetPosition; } float num = 360f / (float)SwarmCount * (float)index * ((float)Math.PI / 180f); float num2 = 3f; return base.TargetPosition + new Vector3(Mathf.Cos(num) * num2, 0f, Mathf.Sin(num) * num2); } protected virtual ZDOID SpawnEventMonster(Vector3 position) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005a: 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_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) ZNetScene instance = ZNetScene.instance; GameObject val = ((instance != null) ? instance.GetPrefab(CustomPrefabName) : null); if ((Object)(object)val == (Object)null) { Debug.LogError((object)("[AuroraEventManager] Custom prefab not found: " + CustomPrefabName)); return ZDOID.None; } Quaternion val2 = Quaternion.Euler(0f, (float)Random.Range(0, 360), 0f); GameObject val3 = Object.Instantiate<GameObject>(val, position, val2); if ((Object)(object)val3 == (Object)null) { Debug.LogError((object)("[AuroraEventManager] Failed to instantiate: " + CustomPrefabName)); return ZDOID.None; } ZNetView component = val3.GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null || component.GetZDO() == null) { Debug.LogError((object)"[AuroraEventManager] No ZNetView/ZDO on spawned monster"); Object.Destroy((Object)(object)val3); return ZDOID.None; } ZDOID uid = component.GetZDO().m_uid; ZDO zDO = component.GetZDO(); zDO.Set("AEM_IsEventMonster", true); zDO.Set("AEM_EventId", _eventInstanceId); zDO.Set("AEM_ItemPool", string.Join(",", ItemPool)); zDO.Set("AEM_HitDropMin", HitDropMin); zDO.Set("AEM_HitDropMax", HitDropMax); zDO.Set("AEM_KillDropMin", KillDropMin); zDO.Set("AEM_KillDropMax", KillDropMax); zDO.Set("AEM_StatusEffect", StatusEffectOnHit ?? ""); if (MonsterFlees) { MonsterAI component2 = val3.GetComponent<MonsterAI>(); Character component3 = val3.GetComponent<Character>(); if ((Object)(object)component2 != (Object)null) { component2.m_fleeIfLowHealth = 1f; component2.m_fleeIfNotAlerted = true; ((BaseAI)component2).m_avoidFire = true; } if ((Object)(object)component3 != (Object)null) { component3.m_speed *= 1.1f; component3.m_runSpeed *= 1.1f; } } Debug.Log((object)$"[AuroraEventManager] Spawned {CustomPrefabName} at {position}, ZDOID: {uid}"); return uid; } protected void DespawnAllMonsters() { //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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_001b: 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_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) int num = 0; foreach (ZDOID spawnedZDOID in _spawnedZDOIDs) { if (spawnedZDOID == ZDOID.None) { continue; } ZDOMan instance = ZDOMan.instance; ZDO val = ((instance != null) ? instance.GetZDO(spawnedZDOID) : null); if (val == null) { Debug.Log((object)$"[AuroraEventManager] ZDO {spawnedZDOID} already gone"); continue; } ZNetScene instance2 = ZNetScene.instance; ZNetView val2 = ((instance2 != null) ? instance2.FindInstance(val) : null); if ((Object)(object)val2 != (Object)null && (Object)(object)((Component)val2).gameObject != (Object)null) { try { val2.ClaimOwnership(); ZNetScene.instance.Destroy(((Component)val2).gameObject); num++; Debug.Log((object)$"[AuroraEventManager] Destroyed via local instance: {spawnedZDOID}"); } catch (Exception ex) { Debug.LogWarning((object)("[AuroraEventManager] Local destroy failed: " + ex.Message)); goto IL_00d6; } continue; } goto IL_00d6; IL_00d6: try { val.SetOwner(ZDOMan.GetSessionID()); ZDOMan.instance.DestroyZDO(val); num++; Debug.Log((object)$"[AuroraEventManager] Destroyed via ZDO: {spawnedZDOID}"); } catch (Exception ex2) { Debug.LogWarning((object)("[AuroraEventManager] ZDO destroy failed: " + ex2.Message)); } } _spawnedZDOIDs.Clear(); Debug.Log((object)$"[AuroraEventManager] Despawned {num} monsters total"); } } public abstract class BaseBlessingEvent : BaseEvent { private struct PlayerInfo { public string Name; public long UID; } private const float ALL_PLAYERS_CHANCE = 0.1f; protected abstract string BlessingName { get; } protected abstract string StatusEffectName { get; } protected abstract float Duration { get; } protected abstract Color AnnouncementColor { get; } public BaseBlessingEvent() { Config = new EventConfig { Enabled = true, Weight = 9, MinPlayers = 1, IsGlobalEvent = true, RequiresTargetPlayer = false }; } protected override void OnEventStart() { if (Random.value < 0.1f) { ApplyToAllPlayers(); } else { ApplyToRandomPlayer(); } Stop(); } protected override void OnEventStop() { EventManagerCore.Instance?.OnEventEnded(this); } protected override void OnEventUpdate() { } private void ApplyToAllPlayers() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) string text = ColorUtility.ToHtmlStringRGB(AnnouncementColor); string message = "<color=#FFD700>[BLESSING]</color> <color=#" + text + ">" + BlessingName + "</color> has been bestowed upon <color=#00FF00>ALL VIKINGS</color>!"; SendEventShout(message); ApplyBlessingViaRPC(toAll: true, 0L); Debug.Log((object)("[AuroraEventManager] Applied " + BlessingName + " to ALL players via RPC")); } private void ApplyToRandomPlayer() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) List<PlayerInfo> allPlayerInfos = GetAllPlayerInfos(); if (allPlayerInfos.Count != 0) { PlayerInfo playerInfo = allPlayerInfos[Random.Range(0, allPlayerInfos.Count)]; string name = playerInfo.Name; long uID = playerInfo.UID; string text = ColorUtility.ToHtmlStringRGB(AnnouncementColor); string message = "<color=#FFD700>[BLESSING]</color> <color=#" + text + ">" + BlessingName + "</color> has been bestowed upon <color=#FFFF00>" + name + "</color>!"; SendEventShout(message); ApplyBlessingViaRPC(toAll: false, uID); Debug.Log((object)$"[AuroraEventManager] Applied {BlessingName} to {name} (UID: {uID}) via RPC"); } } protected virtual void ApplyBlessingViaRPC(bool toAll, long playerUID) { if (string.IsNullOrEmpty(StatusEffectName)) { Debug.LogWarning((object)("[AuroraEventManager] No status effect name for " + BlessingName)); } else if (toAll) { RewardHandler.SendBlessingToAllPlayers(StatusEffectName, Duration); } else { RewardHandler.SendBlessingToPlayer(playerUID, StatusEffectName, Duration); } } private List<PlayerInfo> GetAllPlayerInfos() { List<PlayerInfo> list = new List<PlayerInfo>(); if ((Object)(object)ZNet.instance == (Object)null) { return list; } foreach (ZNetPeer peer in ZNet.instance.GetPeers()) { if (peer != null && peer.m_uid != 0L) { list.Add(new PlayerInfo { Name = peer.m_playerName, UID = peer.m_uid }); } } return list; } } public class RestedBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_rested"; public override string EventName => "Blessing of Rest"; protected override string BlessingName => "Blessing of Rest"; protected override string StatusEffectName => "Rested"; protected override float Duration => 1800f; protected override Color AnnouncementColor => new Color(0.5f, 0.8f, 1f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingRested.Value; } return false; } } public class WeightBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_weight"; public override string EventName => "Blessing of Strength"; protected override string BlessingName => "Blessing of Strength"; protected override string StatusEffectName => "FreyjaWeightHour"; protected override float Duration => 0f; protected override Color AnnouncementColor => new Color(1f, 0.6f, 0.2f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingWeight.Value; } return false; } } public class EikthyrBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_eikthyr"; public override string EventName => "Power of Eikthyr"; protected override string BlessingName => "Power of Eikthyr"; protected override string StatusEffectName => "GP_Eikthyr"; protected override float Duration => 1200f; protected override Color AnnouncementColor => new Color(0.8f, 0.9f, 1f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingEikthyr.Value; } return false; } } public class ElderBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_elder"; public override string EventName => "Power of The Elder"; protected override string BlessingName => "Power of The Elder"; protected override string StatusEffectName => "GP_TheElder"; protected override float Duration => 1200f; protected override Color AnnouncementColor => new Color(0.2f, 0.8f, 0.2f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingElder.Value; } return false; } } public class BonemassBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_bonemass"; public override string EventName => "Power of Bonemass"; protected override string BlessingName => "Power of Bonemass"; protected override string StatusEffectName => "GP_Bonemass"; protected override float Duration => 1200f; protected override Color AnnouncementColor => new Color(0.6f, 0.8f, 0.2f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingBonemass.Value; } return false; } } public class ModerBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_moder"; public override string EventName => "Power of Moder"; protected override string BlessingName => "Power of Moder"; protected override string StatusEffectName => "GP_Moder"; protected override float Duration => 1200f; protected override Color AnnouncementColor => new Color(0.7f, 0.9f, 1f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingModer.Value; } return false; } } public class YagluthBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_yagluth"; public override string EventName => "Power of Yagluth"; protected override string BlessingName => "Power of Yagluth"; protected override string StatusEffectName => "GP_Yagluth"; protected override float Duration => 1200f; protected override Color AnnouncementColor => new Color(1f, 0.4f, 0.1f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingYagluth.Value; } return false; } } public class QueenBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_queen"; public override string EventName => "Power of The Queen"; protected override string BlessingName => "Power of The Queen"; protected override string StatusEffectName => "GP_Queen"; protected override float Duration => 1200f; protected override Color AnnouncementColor => new Color(0.8f, 0.2f, 0.8f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingQueen.Value; } return false; } } public class FaderBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_fader"; public override string EventName => "Power of The Fader"; protected override string BlessingName => "Power of The Fader"; protected override string StatusEffectName => "GP_Fader"; protected override float Duration => 1200f; protected override Color AnnouncementColor => new Color(0.9f, 0.9f, 0.5f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingFader.Value; } return false; } } public class DamageBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_damage"; public override string EventName => "Blessing of Fury"; protected override string BlessingName => "Blessing of Fury (+50% Damage)"; protected override string StatusEffectName => "CorpseRun"; protected override float Duration => 1800f; protected override Color AnnouncementColor => new Color(1f, 0.2f, 0.2f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingDamage.Value; } return false; } } public class DefenseBlessingEvent : BaseBlessingEvent { public override string EventId => "blessing_defense"; public override string EventName => "Blessing of Iron Skin"; protected override string BlessingName => "Blessing of Iron Skin (+50% Defense)"; protected override string StatusEffectName => "GP_Bonemass"; protected override float Duration => 1800f; protected override Color AnnouncementColor => new Color(0.6f, 0.6f, 0.7f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableBlessingDefense.Value; } return false; } } public abstract class BaseEmoteEvent : BaseEvent { protected float _startTime; protected bool _completed; public static readonly HashSet<string> ActiveEmoters = new HashSet<string>(); public static string ActiveEmoteCode = null; public static BaseEmoteEvent ActiveEvent = null; protected abstract string EmoteCode { get; } protected abstract float EventDuration { get; } protected abstract string StartAnnouncement { get; } protected abstract string SuccessAnnouncement { get; } protected abstract string FailAnnouncement { get; } protected override void OnEventStart() { _startTime = Time.time; _completed = false; ActiveEmoters.Clear(); ActiveEmoteCode = EmoteCode; ActiveEvent = this; SendEventShout(StartAnnouncement); Debug.Log((object)("[AuroraEventManager] " + EventName + " started, listening for emote '" + EmoteCode + "'")); } protected override void OnEventStop() { ActiveEmoters.Clear(); ActiveEmoteCode = null; ActiveEvent = null; EventManagerCore.Instance?.OnEventEnded(this); } protected override void OnEventUpdate() { if (_completed) { return; } CheckEmoteZDOs(); List<string> realPlayerNames = GetRealPlayerNames(); if (realPlayerNames.Count > 0) { bool flag = true; foreach (string item in realPlayerNames) { if (!ActiveEmoters.Contains(item)) { flag = false; break; } } if (flag) { _completed = true; OnAllEmotesCompleted(realPlayerNames); SendEventShout(SuccessAnnouncement); Stop(); return; } } if (Time.time - _startTime >= EventDuration) { SendEventShout(FailAnnouncement); Stop(); } } protected abstract void OnAllEmotesCompleted(List<string> playerNames); private void CheckEmoteZDOs() { //IL_0072: Unknown result type (might be due to invalid IL or missing references) ZNet instance = ZNet.instance; List<ZNetPeer> list = ((instance != null) ? instance.GetPeers() : null); if (list == null) { return; } foreach (ZNetPeer item in list) { if (item == null || string.IsNullOrEmpty(item.m_playerName) || IsGhostName(item.m_playerName) || ActiveEmoters.Contains(item.m_playerName)) { continue; } ZDOMan instance2 = ZDOMan.instance; ZDO val = ((instance2 != null) ? instance2.GetZDO(item.m_characterID) : null); if (val != null) { string @string = val.GetString("emote", ""); if (!string.IsNullOrEmpty(@string) && @string.ToLower().Contains(EmoteCode.ToLower())) { ActiveEmoters.Add(item.m_playerName); Debug.Log((object)("[AuroraEventManager] " + EventName + ": " + item.m_playerName + " performed emote '" + @string + "'")); } } } if (!((Object)(object)Player.m_localPlayer != (Object)null)) { return; } string playerName = Player.m_localPlayer.GetPlayerName(); if (string.IsNullOrEmpty(playerName) || IsGhostName(playerName) || ActiveEmoters.Contains(playerName)) { return; } ZNetView component = ((Component)Player.m_localPlayer).GetComponent<ZNetView>(); ZDO val2 = ((component != null) ? component.GetZDO() : null); if (val2 != null) { string string2 = val2.GetString("emote", ""); if (!string.IsNullOrEmpty(string2) && string2.ToLower().Contains(EmoteCode.ToLower())) { ActiveEmoters.Add(playerName); } } } protected static bool IsGhostName(string name) { if (string.IsNullOrEmpty(name)) { return false; } if (!name.Equals("Aurora", StringComparison.OrdinalIgnoreCase)) { return name.StartsWith("Aurora", StringComparison.OrdinalIgnoreCase); } return true; } protected static List<string> GetRealPlayerNames() { List<string> list = new List<string>(); if ((Object)(object)Player.m_localPlayer != (Object)null) { string playerName = Player.m_localPlayer.GetPlayerName(); if (!string.IsNullOrEmpty(playerName) && !IsGhostName(playerName)) { list.Add(playerName); } } ZNet instance = ZNet.instance; List<ZNetPeer> list2 = ((instance != null) ? instance.GetPeers() : null); if (list2 != null) { foreach (ZNetPeer item in list2) { if (item != null && !string.IsNullOrEmpty(item.m_playerName) && !IsGhostName(item.m_playerName) && !list.Contains(item.m_playerName)) { list.Add(item.m_playerName); } } } return list; } public static void NotifyEmote(string playerName, string emote) { if (ActiveEvent != null && ActiveEmoteCode != null && !string.IsNullOrEmpty(playerName) && !string.IsNullOrEmpty(emote) && !IsGhostName(playerName) && emote.ToLower().Contains(ActiveEmoteCode.ToLower())) { ActiveEmoters.Add(playerName); Debug.Log((object)("[AuroraEventManager] NotifyEmote: " + playerName + " -> " + emote)); } } } public class DanceOfFreyjaEvent : BaseEmoteEvent { public override string EventId => "dance_of_freyja"; public override string EventName => "Freyja's Circle"; protected override string EmoteCode => "dance"; protected override float EventDuration => 90f; protected override string StartAnnouncement => "<color=#ffd700>[FREYJA'S CIRCLE]</color> <color=#ff88ff>Freyja the Golden</color> descends upon the realm! All vikings — type <color=#00ff00>/dance</color> or use the emote wheel (Dance) within <color=#ff6600>90 seconds</color> to earn her blessing: <color=#ffb6c1>+1 hour of Rested</color>!"; protected override string SuccessAnnouncement => "<color=#ffd700>[FREYJA'S CIRCLE]</color> The Vanir goddess is pleased! All vikings receive her blessing — <color=#ffb6c1>+1 hour of Rested</color>. Dance in her halls forever!"; protected override string FailAnnouncement => "<color=#ffd700>[FREYJA'S CIRCLE]</color> Not all vikings joined the dance. <color=#ff88ff>Freyja</color> turns away, disappointed."; public DanceOfFreyjaEvent() { Config = new EventConfig { Enabled = true, Weight = 7, MinPlayers = 1, IsGlobalEvent = true, RequiresTargetPlayer = false }; } public override bool CanStart() { if (!base.CanStart()) { return false; } if (AuroraEventManagerPlugin.EnableDanceEvent != null && !AuroraEventManagerPlugin.EnableDanceEvent.Value) { return false; } return true; } protected override void OnAllEmotesCompleted(List<string> playerNames) { RewardHandler.SendBlessingToAllPlayers("Rested", 3600f); Debug.Log((object)$"[AuroraEventManager] DanceOfFreyja: blessing granted to {playerNames.Count} vikings"); } } public class VibeWithDvergrEvent : BaseEmoteEvent { public override string EventId => "vibe_with_dvergr"; public override string EventName => "Dwarven Work Song"; protected override string EmoteCode => "vibe"; protected override float EventDuration => 90f; protected override string StartAnnouncement => "<color=#ffd700>[DWARVEN WORK SONG]</color> The <color=#00ffff>Dvergr craftsmen</color> beckon from their mountain halls! All vikings — type <color=#00ff00>/vibe</color> in chat within <color=#ff6600>90 seconds</color> to earn the strength of giants: <color=#ffd700>+1000 carry weight for 6 hours</color>!"; protected override string SuccessAnnouncement => "<color=#ffd700>[DWARVEN WORK SONG]</color> The Dvergr roar with pride! Their ancient work-song grants every viking <color=#ffd700>+1000 carry weight</color> for 6 hours. Haul your plunder home, warriors!"; protected override string FailAnnouncement => "<color=#ffd700>[DWARVEN WORK SONG]</color> The <color=#00ffff>Dvergr</color> shake their heads and return to their halls."; public VibeWithDvergrEvent() { Config = new EventConfig { Enabled = true, Weight = 7, MinPlayers = 1, IsGlobalEvent = true, RequiresTargetPlayer = false }; } public override bool CanStart() { if (!base.CanStart()) { return false; } if (AuroraEventManagerPlugin.EnableVibeEvent != null && !AuroraEventManagerPlugin.EnableVibeEvent.Value) { return false; } return true; } protected override void OnAllEmotesCompleted(List<string> playerNames) { foreach (string playerName in playerNames) { RewardHandler.ApplyWeightBuffToPlayer(playerName, 1000f, 21600f); } Debug.Log((object)$"[AuroraEventManager] VibeWithDvergr: weight buff granted to {playerNames.Count} vikings"); } } [HarmonyPatch(typeof(Player), "StartEmote")] public static class Player_StartEmote_Patch { [HarmonyPostfix] public static void Postfix(Player __instance, string emote) { try { if (!((Object)(object)__instance == (Object)null) && !string.IsNullOrEmpty(emote)) { BaseEmoteEvent.NotifyEmote(__instance.GetPlayerName(), emote); } } catch (Exception ex) { Debug.LogWarning((object)("[AuroraEventManager] Player_StartEmote_Patch error: " + ex.Message)); } } } [HarmonyPatch(typeof(Terminal), "TryRunCommand")] public static class Terminal_TryRunCommand_EmoteListener { [HarmonyPostfix] public static void Postfix(string text) { try { if (!string.IsNullOrEmpty(text)) { string text2 = text.Trim().TrimStart(new char[1] { '/' }).ToLowerInvariant(); if (!string.IsNullOrEmpty(text2) && BaseEmoteEvent.ActiveEmoteCode != null && text2.StartsWith(BaseEmoteEvent.ActiveEmoteCode.ToLowerInvariant()) && !((Object)(object)Player.m_localPlayer == (Object)null)) { BaseEmoteEvent.NotifyEmote(Player.m_localPlayer.GetPlayerName(), BaseEmoteEvent.ActiveEmoteCode); } } } catch (Exception ex) { Debug.LogWarning((object)("[AuroraEventManager] Terminal_TryRunCommand_EmoteListener error: " + ex.Message)); } } } [HarmonyPatch(typeof(Chat), "SendText")] public static class Chat_SendText_EmoteListener { [HarmonyPostfix] public static void Postfix(string text) { try { if (string.IsNullOrEmpty(text)) { return; } string text2 = text.Trim(); if (!text2.StartsWith("/")) { return; } string text3 = text2.Substring(1).ToLowerInvariant().Split(new char[1] { ' ' })[0]; if (BaseEmoteEvent.ActiveEmoteCode != null && !(text3 != BaseEmoteEvent.ActiveEmoteCode.ToLowerInvariant()) && !((Object)(object)Player.m_localPlayer == (Object)null)) { BaseEmoteEvent.NotifyEmote(Player.m_localPlayer.GetPlayerName(), BaseEmoteEvent.ActiveEmoteCode); if (ZRoutedRpc.instance != null && (Object)(object)ZNet.instance != (Object)null) { ZNet.instance.IsServer(); } } } catch (Exception ex) { Debug.LogWarning((object)("[AuroraEventManager] Chat_SendText_EmoteListener error: " + ex.Message)); } } } [HarmonyPatch(typeof(Chat), "RPC_ChatMessage")] public static class Chat_RPC_ChatMessage_ServerEmoteListener { [HarmonyPostfix] public static void Postfix(long sender, Vector3 position, int type, UserInfo userInfo, string text) { try { if ((Object)(object)ZNet.instance == (Object)null || !ZNet.instance.IsServer() || BaseEmoteEvent.ActiveEmoteCode == null || string.IsNullOrEmpty(text)) { return; } string text2 = text.Trim(); if (text2.StartsWith("/")) { text2 = text2.Substring(1); } if (!(text2.ToLowerInvariant().Split(new char[1] { ' ' })[0] != BaseEmoteEvent.ActiveEmoteCode.ToLowerInvariant())) { string text3 = userInfo?.Name; if (!string.IsNullOrEmpty(text3)) { BaseEmoteEvent.NotifyEmote(text3, BaseEmoteEvent.ActiveEmoteCode); } } } catch (Exception ex) { Debug.LogWarning((object)("[AuroraEventManager] Chat_RPC_ChatMessage_ServerEmoteListener error: " + ex.Message)); } } } public class GuessNumberEvent : BaseEvent { private int _targetNumber; private float _eventStartTime; private float _eventDuration = 60f; private Dictionary<string, int> _playerGuesses = new Dictionary<string, int>(); private bool _jackpotWon; public override string EventId => "guess_number"; public override string EventName => "Guess the Number"; public GuessNumberEvent() { Config = new EventConfig { Enabled = true, Weight = 8, MinPlayers = 1, IsGlobalEvent = true, RequiresTargetPlayer = false }; } public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableGuessNumber.Value; } return false; } protected override void OnEventStart() { _targetNumber = Random.Range(1, 101); _eventStartTime = Time.time; _playerGuesses.Clear(); _jackpotWon = false; string message = "<color=#FFD700>[GUESS THE NUMBER]</color> I'm thinking of a number between <color=#00FF00>1</color> and <color=#00FF00>100</color>! <color=#FFFF00>SHOUT your guess!</color> You have <color=#FF6600>60 seconds</color>! Jackpot for exact match: <color=#FFD700>5000 Coins + GoldIngot + 5 ReturnScroll!</color>"; SendEventShout(message); Debug.Log((object)$"[AuroraEventManager] Guess the Number started. Target: {_targetNumber}"); } protected override void OnEventStop() { if (!_jackpotWon) { DetermineWinner(); } EventManagerCore.Instance?.OnEventEnded(this); } protected override void OnEventUpdate() { if (!_jackpotWon && Time.time - _eventStartTime >= _eventDuration) { SendEventShout($"<color=#FFD700>[GUESS THE NUMBER]</color> Time's up! The number was <color=#00FF00>{_targetNumber}</color>!"); Stop(); } } public override void OnPlayerChat(string playerName, string message) { if (!_jackpotWon && int.TryParse(message.Trim(), out var result) && result >= 1 && result <= 100) { _playerGuesses[playerName] = result; Debug.Log((object)$"[AuroraEventManager] {playerName} guessed {result}"); if (result == _targetNumber) { _jackpotWon = true; string message2 = $"<color=#FFD700>★★★ JACKPOT! ★★★</color> <color=#FFFF00>{playerName}</color> guessed the exact number <color=#00FF00>{_targetNumber}</color>! " + "Reward: <color=#FFD700>5000 Coins, 1 GoldIngot, 5 ReturnScroll!</color>"; SendEventShout(message2); RewardHandler.GiveItemToPlayer(playerName, "Coins", 5000); RewardHandler.GiveItemToPlayer(playerName, "GoldIngot", 1); RewardHandler.GiveItemToPlayer(playerName, "ReturnScroll", 5); Stop(); } } } private void DetermineWinner() { if (_playerGuesses.Count == 0) { SendEventShout("<color=#FFD700>[GUESS THE NUMBER]</color> No valid guesses were made!"); return; } string text = null; int num = int.MaxValue; foreach (KeyValuePair<string, int> playerGuess in _playerGuesses) { int num2 = Math.Abs(playerGuess.Value - _targetNumber); if (num2 < num && num2 <= 5) { num = num2; text = playerGuess.Key; } } if (text == null) { SendEventShout($"<color=#FFD700>[GUESS THE NUMBER]</color> No one was close enough! The number was <color=#00FF00>{_targetNumber}</color>."); return; } int num3 = 0; switch (num) { case 1: num3 = 2000; break; case 2: num3 = 1000; break; case 3: num3 = 500; break; case 4: num3 = 200; break; case 5: num3 = 100; break; } if (num3 > 0) { int num4 = _playerGuesses[text]; string message = $"<color=#FFD700>[GUESS THE NUMBER]</color> <color=#FFFF00>{text}</color> was closest with <color=#00FF00>{num4}</color>! " + $"(Number was {_targetNumber}, off by {num}) Reward: <color=#FFD700>{num3} Coins!</color>"; SendEventShout(message); RewardHandler.GiveItemToPlayer(text, "Coins", num3); } } } public abstract class BaseTeleportEvent : BaseEvent { private float _eventStartTime; private float _eventDuration = 15f; private HashSet<string> _teleportedPlayers = new HashSet<string>(); protected abstract string LocationName { get; } protected abstract Vector3 TeleportPosition { get; } public BaseTeleportEvent() { Config = new EventConfig { Enabled = true, Weight = 9, MinPlayers = 1, IsGlobalEvent = true, RequiresTargetPlayer = false }; } protected override void OnEventStart() { _eventStartTime = Time.time; _teleportedPlayers.Clear(); string message = "<color=#00FFFF>[FREE TELEPORT]</color> Free teleport to <color=#FFD700>" + LocationName + "</color>! <color=#FFFF00>SHOUT 'GO' to travel!</color> You have <color=#FF6600>15 seconds!</color>"; SendEventShout(message); Debug.Log((object)("[AuroraEventManager] Free Teleport to " + LocationName + " started")); } protected override void OnEventStop() { SendEventShout($"<color=#00FFFF>[FREE TELEPORT]</color> Teleport to {LocationName} has ended. {_teleportedPlayers.Count} vikings traveled!"); EventManagerCore.Instance?.OnEventEnded(this); } protected override void OnEventUpdate() { if (Time.time - _eventStartTime >= _eventDuration) { Stop(); } } public override void OnPlayerChat(string playerName, string message) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) if (message.Trim().ToUpperInvariant() == "GO" && !_teleportedPlayers.Contains(playerName)) { _teleportedPlayers.Add(playerName); TeleportPlayer(playerName, TeleportPosition); string message2 = "<color=#00FFFF>[TELEPORT]</color> <color=#FFFF00>" + playerName + "</color> has teleported to <color=#FFD700>" + LocationName + "</color>!"; SendEventShout(message2); Debug.Log((object)$"[AuroraEventManager] Teleported {playerName} to {LocationName} at {TeleportPosition}"); } } private void TeleportPlayer(string playerName, Vector3 position) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)ZNet.instance == (Object)null) { return; } foreach (ZNetPeer peer in ZNet.instance.GetPeers()) { if (peer != null && peer.m_playerName == playerName) { RewardHandler.TeleportPlayer(peer.m_uid, position); break; } } } } public class TeleportHaldorEvent : BaseTeleportEvent { public override string EventId => "teleport_haldor"; public override string EventName => "Free Teleport to Haldor"; protected override string LocationName => "Haldor the Trader"; protected override Vector3 TeleportPosition => new Vector3(1613f, 40f, -3722f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableTeleportHaldor.Value; } return false; } } public class TeleportHildirEvent : BaseTeleportEvent { public override string EventId => "teleport_hildir"; public override string EventName => "Free Teleport to Hildir"; protected override string LocationName => "Hildir the Merchant"; protected override Vector3 TeleportPosition => new Vector3(512f, 50f, 1472f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableTeleportHildir.Value; } return false; } } public class TeleportChokepointAEvent : BaseTeleportEvent { public override string EventId => "teleport_chokepoint_a"; public override string EventName => "Free Teleport to Chokepoint A"; protected override string LocationName => "Chokepoint A"; protected override Vector3 TeleportPosition => new Vector3(389f, 35f, -389f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableTeleportChokepointA.Value; } return false; } } public class TeleportChokepointBEvent : BaseTeleportEvent { public override string EventId => "teleport_chokepoint_b"; public override string EventName => "Free Teleport to Chokepoint B"; protected override string LocationName => "Chokepoint B"; protected override Vector3 TeleportPosition => new Vector3(356f, 31f, 5099f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableTeleportChokepointB.Value; } return false; } } public class TeleportChokepointCEvent : BaseTeleportEvent { public override string EventId => "teleport_chokepoint_c"; public override string EventName => "Free Teleport to Chokepoint C"; protected override string LocationName => "Chokepoint C"; protected override Vector3 TeleportPosition => new Vector3(389f, 46f, -3644f); public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableTeleportChokepointC.Value; } return false; } } public class ReactionEvent : BaseEvent { private string _targetWord; private float _eventStartTime; private float _eventDuration = 30f; private bool _winnerFound; private static readonly string[] ReactionWords = new string[120] { "ENCYCLOPEDIA", "REVOLUTIONARY", "EXTRAORDINARY", "CONGRATULATIONS", "COMMUNICATION", "RESPONSIBILITY", "UNDERSTANDING", "INTERNATIONAL", "ENVIRONMENTAL", "REPRESENTATIVE", "UNFORTUNATELY", "ADMINISTRATION", "ARCHAEOLOGICAL", "AUTOBIOGRAPHY", "BIODEGRADABLE", "CARDIOVASCULAR", "CHOREOGRAPHER", "CIRCUMFERENCE", "CLAUSTROPHOBIC", "COMMERCIALIZE", "COMPREHENSIVE", "CONCENTRATION", "CONFEDERATION", "CONSCIOUSNESS", "CONSTELLATION", "CONTAMINATION", "CONTROVERSIAL", "CRYSTALLIZATION", "DEFORESTATION", "DEMONSTRATION", "DETERMINATION", "DISAPPOINTMENT", "DISCRIMINATORY", "ELECTROMAGNETIC", "ENCAPSULATION", "ENTERTAINMENT", "ESTABLISHMENT", "EXPERIMENTATION", "EXTRAVAGANZA", "FORTIFICATION", "GENERALIZATION", "HALLUCINATION", "HORTICULTURIST", "HOSPITALIZATION", "HYPERVENTILATE", "IDENTIFICATION", "IMMOBILIZATION", "IMPLEMENTATION", "IMPROVISATION", "INCARCERATION", "INDESCRIBABLE", "INDISPENSABLE", "INFRASTRUCTURE", "INITIALIZATION", "INSTRUMENTATION", "INTERCONTINENTAL", "INTERPRETATION", "INVESTIGATION", "JUSTIFICATION", "KALEIDOSCOPE", "KNOWLEDGEABLE", "MATHEMATICIAN", "MEDITERRANEAN", "METEOROLOGICAL", "MICROPROCESSOR", "MISCELLANEOUS", "MISUNDERSTANDING", "MULTIPLICATION", "NATIONALIZATION", "NEIGHBORHOOD", "OBJECTIFICATION", "ORGANIZATIONAL", "OUTSTANDINGLY", "OVERCOMPENSATE", "OVERWHELMING", "PARLIAMENTARIAN", "PHARMACEUTICAL", "PHOTOSYNTHESIS", "PHYSIOTHERAPIST", "POLITICIZATION", "PREDETERMINATION", "PROFESSIONALISM", "PROPORTIONALLY", "PSYCHOLOGICALLY", "QUADRILATERAL", "QUALIFICATIONS", "QUESTIONNAIRE", "RATIONALIZATION", "RECOMMENDATION", "RECONCILIATION", "REHABILITATION", "REIMBURSEMENT", "REINFORCEMENT", "REORGANIZATION", "REPRESENTATIVE", "STANDARDIZATION", "STEREOTYPICAL", "SUBCONSCIOUSLY", "SUPERINTENDENT", "SUPPLEMENTARY", "SYNCHRONIZATION", "TECHNOLOGICAL", "TELECOMMUNICATIONS", "TEMPERAMENTAL", "THERMODYNAMICS", "TRANSFORMATION", "TRANSLITERATION", "TRANSPORTATION", "TROUBLESHOOTING", "ULTRAVIOLET", "UNCOMFORTABLE", "UNDERESTIMATE", "UNPRECEDENTED", "UNQUESTIONABLE", "VASCULARIZATION", "VISUALIZATION", "VULNERABILITIES", "WEATHERIZATION", "WHISTLEBLOWER", "WORKMANSHIP" }; public override string EventId => "reaction"; public override string EventName => "Reaction Challenge"; public ReactionEvent() { Config = new EventConfig { Enabled = true, Weight = 8, MinPlayers = 3, IsGlobalEvent = true, RequiresTargetPlayer = false }; } public override bool CanStart() { if (!base.CanStart()) { return false; } if (!AuroraEventManagerPlugin.EnableReaction.Value) { return false; } ZNet instance = ZNet.instance; return ((instance == null) ? null : instance.GetPeers()?.Count).GetValueOrDefault() >= 3; } protected override void OnEventStart() { _targetWord = ReactionWords[Random.Range(0, ReactionWords.Length)]; _eventStartTime = Time.time; _winnerFound = false; string message = "<color=#FF00FF>[REACTION]</color> <color=#FFFF00>TYPE THIS WORD FIRST:</color> <color=#00FF00>" + _targetWord + "</color> <color=#AAAAAA>(SHOUT it!)</color>"; SendEventShout(message); Debug.Log((object)("[AuroraEventManager] Reaction challenge started. Word: " + _targetWord)); } protected override void OnEventStop() { if (!_winnerFound) { SendEventShout("<color=#FF00FF>[REACTION]</color> Time's up! No one typed <color=#00FF00>" + _targetWord + "</color> correctly!"); } EventManagerCore.Instance?.OnEventEnded(this); } protected override void OnEventUpdate() { if (!_winnerFound && Time.time - _eventStartTime >= _eventDuration) { Stop(); } } public override void OnPlayerChat(string playerName, string message) { if (!_winnerFound && message.Trim().ToUpperInvariant() == _targetWord) { _winnerFound = true; float num = Time.time - _eventStartTime; string message2 = "<color=#FF00FF>[REACTION]</color> <color=#FFD700>★ WINNER ★</color> " + $"<color=#FFFF00>{playerName}</color> typed it first in <color=#00FF00>{num:F2}s</color>!"; SendEventShout(message2); GiveReactionReward(playerName); Stop(); } } private void GiveReactionReward(string playerName) { string[] array = new string[6] { "Coins", "Amber", "AmberPearl", "Ruby", "SilverNecklace", "GoldNecklace" }; int[] obj = new int[6] { 500, 5, 3, 2, 1, 1 }; int num = Random.Range(0, array.Length); string text = array[num]; int num2 = obj[num]; RewardHandler.GiveItemToPlayer(playerName, text, num2); Debug.Log((object)$"[AuroraEventManager] Reaction reward: {num2}x {text} to {playerName}"); } } public class TreasureGiantEvent : BaseMonsterEvent { public override string EventId => "treasure_giant"; public override string EventName => "Treasure Giant"; protected override string CustomPrefabName => "AEM_TreasureGiant"; protected override MonsterEventType EventType => MonsterEventType.Giant; protected override string StatusEffectOnHit => "Frost"; protected override bool MonsterFlees => false; protected override string[] ItemPool => new string[5] { "Coins", "Amber", "AmberPearl", "Ruby", "SilverNecklace" }; protected override int HitDropMin => 5; protected override int HitDropMax => 15; protected override int KillDropMin => 100; protected override int KillDropMax => 200; public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableTreasureGiant.Value; } return false; } } public class TreasureSwarmEvent : BaseMonsterEvent { public override string EventId => "treasure_swarm"; public override string EventName => "Treasure Swarm"; protected override string CustomPrefabName => "AEM_TreasureGoblin"; protected override MonsterEventType EventType => MonsterEventType.Swarm; protected override string StatusEffectOnHit => ""; protected override bool MonsterFlees => true; protected override string[] ItemPool => new string[3] { "Coins", "Amber", "AmberPearl" }; protected override int HitDropMin => 2; protected override int HitDropMax => 5; protected override int KillDropMin => 20; protected override int KillDropMax => 40; public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableTreasureSwarm.Value; } return false; } } public class FavorGiantEvent : BaseMonsterEvent { public override string EventId => "favor_giant"; public override string EventName => "Favor Dragon"; protected override string CustomPrefabName => "AEM_FavorDragon"; protected override MonsterEventType EventType => MonsterEventType.Giant; protected override string StatusEffectOnHit => "Frost"; protected override bool MonsterFlees => false; protected override string[] ItemPool => new string[1] { "Favor" }; protected override int HitDropMin => 1; protected override int HitDropMax => 3; protected override int KillDropMin => 20; protected override int KillDropMax => 40; public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableFavorGiant.Value; } return false; } } public class FavorSwarmEvent : BaseMonsterEvent { public override string EventId => "favor_swarm"; public override string EventName => "Favor Swarm"; protected override string CustomPrefabName => "AEM_FavorDrake"; protected override MonsterEventType EventType => MonsterEventType.Swarm; protected override string StatusEffectOnHit => ""; protected override bool MonsterFlees => true; protected override string[] ItemPool => new string[1] { "Favor" }; protected override int HitDropMin => 1; protected override int HitDropMax => 2; protected override int KillDropMin => 5; protected override int KillDropMax => 10; public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableFavorSwarm.Value; } return false; } } public class MeatGiantEvent : BaseMonsterEvent { public override string EventId => "meat_giant"; public override string EventName => "Meat Giant"; protected override string CustomPrefabName => "AEM_MeatGiant"; protected override MonsterEventType EventType => MonsterEventType.Giant; protected override string StatusEffectOnHit => "Burning"; protected override bool MonsterFlees => false; protected override string[] ItemPool => new string[3] { "RawMeat", "CookedMeat", "LeatherScraps" }; protected override int HitDropMin => 3; protected override int HitDropMax => 8; protected override int KillDropMin => 50; protected override int KillDropMax => 100; public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableMeatGiant.Value; } return false; } } public class MeatSwarmEvent : BaseMonsterEvent { public override string EventId => "meat_swarm"; public override string EventName => "Meat Swarm"; protected override string CustomPrefabName => "AEM_MeatBoar"; protected override MonsterEventType EventType => MonsterEventType.Swarm; protected override string StatusEffectOnHit => ""; protected override bool MonsterFlees => true; protected override string[] ItemPool => new string[2] { "RawMeat", "LeatherScraps" }; protected override int HitDropMin => 1; protected override int HitDropMax => 3; protected override int KillDropMin => 10; protected override int KillDropMax => 20; public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableMeatSwarm.Value; } return false; } } public class MosquitoGiantEvent : BaseMonsterEvent { public override string EventId => "mosquito_giant"; public override string EventName => "Giant Mosquito"; protected override string CustomPrefabName => "AEM_GiantMosquito"; protected override MonsterEventType EventType => MonsterEventType.Giant; protected override string StatusEffectOnHit => "Poison"; protected override bool MonsterFlees => false; protected override string[] ItemPool => new string[2] { "VoidShardRed", "VoidShardBlue" }; protected override int HitDropMin => 2; protected override int HitDropMax => 5; protected override int KillDropMin => 30; protected override int KillDropMax => 60; public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableMosquitoGiant.Value; } return false; } } public class MosquitoSwarmEvent : BaseMonsterEvent { public override string EventId => "mosquito_swarm"; public override string EventName => "Mosquito Swarm"; protected override string CustomPrefabName => "AEM_VoidMosquito"; protected override MonsterEventType EventType => MonsterEventType.Swarm; protected override string StatusEffectOnHit => ""; protected override bool MonsterFlees => true; protected override string[] ItemPool => new string[2] { "VoidShardRed", "VoidShardBlue" }; protected override int HitDropMin => 1; protected override int HitDropMax => 2; protected override int KillDropMin => 8; protected override int KillDropMax => 15; public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableMosquitoSwarm.Value; } return false; } } public class ArrowRainEvent : BaseEvent { private float _eventStartTime; private float _eventDuration = 60f; private float _lastDropTime; private float _dropInterval; private int _totalDropped; private int _maxDrops = 250; private string _arrowType; private long _targetPlayerUID; private static readonly string[] ArrowPrefabs = new string[14] { "ArrowWood", "ArrowFire", "ArrowFlint", "ArrowBronze", "ArrowIron", "ArrowSilver", "ArrowObsidian", "ArrowPoison", "ArrowFrost", "ArrowNeedle", "ArrowCarapace", "ArrowSpine", "ArrowFlametal", "ArrowFlametalNew" }; public override string EventId => "arrow_rain"; public override string EventName => "Ullr's Arrow Rain"; public ArrowRainEvent() { Config = new EventConfig { Enabled = true, Weight = 8, MinPlayers = 1, IsGlobalEvent = false, RequiresTargetPlayer = true }; } public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableArrowRain.Value; } return false; } protected override void OnEventStart() { _eventStartTime = Time.time; _lastDropTime = Time.time; _totalDropped = 0; _maxDrops = Random.Range(20, 667); _dropInterval = _eventDuration / (float)_maxDrops; if (_dropInterval < 0.05f) { _dropInterval = 0.05f; } _arrowType = ArrowPrefabs[Random.Range(0, ArrowPrefabs.Length)]; _targetPlayerUID = GetPlayerUID(base.TargetPlayerName); string itemDisplayName = GetItemDisplayName(_arrowType); SendEventShout("<color=#8B4513>[ULLR'S ARROWS]</color> <color=#FFD700>Ullr the Hunter</color> blesses <color=#FFFF00>" + base.TargetPlayerName + "</color> with his arrows: <color=#90EE90>" + itemDisplayName + "</color>!"); Debug.Log((object)$"[AuroraEventManager] Arrow Rain started for {base.TargetPlayerName} - {_arrowType} x{_maxDrops}"); } protected override void OnEventStop() { SendEventShout($"<color=#8B4513>[ULLR'S ARROWS]</color> The arrow rain ends. <color=#FFFF00>{base.TargetPlayerName}</color> received <color=#90EE90>{_totalDropped}</color> drops!"); EventManagerCore.Instance?.OnEventEnded(this); } protected override void OnEventUpdate() { if (Time.time - _eventStartTime >= _eventDuration || _totalDropped >= _maxDrops) { Stop(); } else if (Time.time - _lastDropTime >= _dropInterval) { _lastDropTime = Time.time; DropArrowAbovePlayer(); } } private void DropArrowAbovePlayer() { //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_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: 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_004d: 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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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) Vector3 currentPlayerPosition = GetCurrentPlayerPosition(); if (currentPlayerPosition == Vector3.zero) { return; } float num = Random.Range(-5f, 5f); float num2 = Random.Range(-5f, 5f); Vector3 val = currentPlayerPosition + new Vector3(num, 15f + Random.Range(0f, 5f), num2); ObjectDB instance = ObjectDB.instance; GameObject val2 = ((instance != null) ? instance.GetItemPrefab(_arrowType) : null); if ((Object)(object)val2 == (Object)null) { Debug.LogWarning((object)("[AuroraEventManager] Arrow prefab not found: " + _arrowType)); _totalDropped++; return; } ItemDrop component = Object.Instantiate<GameObject>(val2, val, Quaternion.identity).GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { component.m_itemData.m_stack = Random.Range(3, 16); } _totalDropped++; } private Vector3 GetCurrentPlayerPosition() { //IL_0015: 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_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) ZNet instance = ZNet.instance; List<ZNetPeer> list = ((instance != null) ? instance.GetPeers() : null); if (list == null) { return Vector3.zero; } foreach (ZNetPeer item in list) { if (item == null || item.m_uid != _targetPlayerUID) { continue; } ZDOID characterID = item.m_characterID; if (!((ZDOID)(ref characterID)).IsNone()) { ZDOMan instance2 = ZDOMan.instance; ZDO val = ((instance2 != null) ? instance2.GetZDO(characterID) : null); if (val != null) { return val.GetPosition(); } } } return base.TargetPosition; } private long GetPlayerUID(string playerName) { ZNet instance = ZNet.instance; List<ZNetPeer> list = ((instance != null) ? instance.GetPeers() : null); if (list == null) { return 0L; } foreach (ZNetPeer item in list) { if (item != null && item.m_playerName == playerName) { return item.m_uid; } } return 0L; } private string GetItemDisplayName(string prefabName) { try { ObjectDB instance = ObjectDB.instance; GameObject val = ((instance != null) ? instance.GetItemPrefab(prefabName) : null); if ((Object)(object)val != (Object)null) { ItemDrop component = val.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { return Localization.instance.Localize(component.m_itemData.m_shared.m_name); } } } catch { } return prefabName; } } public class ChainRainEvent : BaseEvent { private float _eventStartTime; private float _eventDuration = 60f; private float _lastDropTime; private float _dropInterval; private int _totalDropped; private int _maxDrops = 250; private long _targetPlayerUID; public override string EventId => "chain_rain"; public override string EventName => "Loki's Chain Rain"; public ChainRainEvent() { Config = new EventConfig { Enabled = true, Weight = 3, MinPlayers = 1, IsGlobalEvent = false, RequiresTargetPlayer = true }; } public override bool CanStart() { if (base.CanStart()) { return AuroraEventManagerPlugin.EnableChainRain.Value; } return false; } protected override void OnEventStart() { _eventStartTime = Time.time; _lastDropTime = Time.time; _totalDropped = 0; _maxDrops = Random.Range(1, 41); _dropInterval = _eventDuration / (float)_maxDrops; if (_dropInterval < 0.05f) { _dropInterval = 0.05f; } _targetPlayerUID = GetPlayerUID(base.TargetPlayerName); SendEventShout("<color=#888888>[LOKI'S CHAINS]</color> <color=#FFD700>Loki's chains</color> rain from the sky upon <color=#FFFF00>" + base.TargetPlayerName + "</color>!"); Debug.Log((object)$"[AuroraEventManager] Chain Rain started for {base.TargetPlayerName} - x{_maxDrops}"); } protected override void OnEventStop() { SendEventShout($"<color=#888888>[LOKI'S CHAINS]</color> The chains stop falling. <color=#FFFF00>{base.TargetPlayerName}</color> received <color=#90EE90>{_totalDropped}</color> chains!"); EventManagerCore.Instance?.OnEventEnded(this); } protected override void OnEventUpdate() { if (Time.time - _eventStartTime >= _eventDuration || _totalDropped >= _maxDrops) { Stop(); } else if (Time.time - _lastDropTime >= _dropInterval) { _lastDropTime = Time.time; DropChainAbovePlayer(); } } private void DropChainAbovePlayer() { //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_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: 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_004d: 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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) Vector3 currentPlayerPosition = GetCurrentPlayerPosition(); if (currentPlayerPosition == Vector3.zero) { return; } float num = Random.Range(-5f, 5f); float num2 = Random.Range(-5f, 5f); Vector3 val = currentPlayerPosition + new Vector3(num, 15f + Random.Range(0f, 5f), num2); ObjectDB instance = ObjectDB.instance; GameObject val2 = ((instance != null) ? instance.GetItemPrefab("Chain") : null); if ((Object)(object)val2 == (Object)null) { Debug.LogWarning((object)"[AuroraEventManager] Chain prefab not found!"); _totalDropped++; return; } ItemDrop component = Object.Instantiate<GameObject>(val2, val, Quaternion.identity).GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { component.m_itemData.m_stack = 1; } _totalDropped++; } private Vector3 GetCurrentPlayerPosition() { //IL_0015: 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_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (migh