using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; 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 System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using Bloodstone.API; using Bloodstone.Hooks; using HarmonyLib; using Il2CppSystem.Collections.Generic; using JewelForge.Configs; using JewelForge.Database; using JewelForge.Inventory; using JewelForge.Utils; using Microsoft.CodeAnalysis; using ProjectM; using ProjectM.Network; using Stunlock.Core; using Unity.Collections; using Unity.Entities; using Unity.Mathematics; using UnityEngine; using VampireCommandFramework; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("JewelForge")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Creates a perfect jewel for a cost.")] [assembly: AssemblyFileVersion("0.1.10.0")] [assembly: AssemblyInformationalVersion("0.1.10+1.Branch.main.Sha.c33d0879382e1a0da34861ec55914ba7e637a80e")] [assembly: AssemblyProduct("JewelForge")] [assembly: AssemblyTitle("JewelForge")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.1.10.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 JewelForge { [BepInPlugin("JewelForge", "JewelForge", "0.1.10")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [Reloadable] public class Plugin : BasePlugin { private Harmony? _harmony; public static ManualLogSource? Logger; private static bool _forgeSchedulerFound; private static MethodInfo? _shouldEnableMethod; public override void Load() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Expected O, but got Unknown if (Helper.IsServer) { Logger = ((BasePlugin)this).Log; ManualLogSource log = ((BasePlugin)this).Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(15, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("["); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("JewelForge"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("] v"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("0.1.10"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" loading..."); } log.LogInfo(val); MainConfig.SettingsInit(); DB.inits(); CommandRegistry.RegisterAll(); _harmony = new Harmony("JewelForge"); _harmony.PatchAll(Assembly.GetExecutingAssembly()); TryDetectForgeScheduler(); GameFrame.Initialize(); GameFrame.OnUpdate += new GameFrameUpdateEventHandler(OnFrameUpdate); ManualLogSource log2 = ((BasePlugin)this).Log; val = new BepInExInfoLogInterpolatedStringHandler(28, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("["); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("JewelForge"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("] initialized successfully."); } log2.LogInfo(val); } else { ((BasePlugin)this).Log.LogFatal((object)"No Server world found. Did you install a server mod on the client?"); } } public override bool Unload() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown CommandRegistry.UnregisterAssembly(); Harmony? harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } GameFrame.OnUpdate -= new GameFrameUpdateEventHandler(OnFrameUpdate); GameFrame.Uninitialize(); ManualLogSource log = ((BasePlugin)this).Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(12, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("["); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("JewelForge"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("] unloaded."); } log.LogInfo(val); return true; } private void OnFrameUpdate() { //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Expected O, but got Unknown if (!_forgeSchedulerFound || _shouldEnableMethod == null) { return; } try { object obj = _shouldEnableMethod.Invoke(null, null); if (!(obj is bool)) { return; } bool flag = (bool)obj; if (1 == 0) { return; } if (!flag && DB.EnabledCommand) { DB.EnabledCommand = false; ManualLogSource? logger = Logger; if (logger != null) { logger.LogInfo((object)"[JewelForge] Disabled by day-based automation."); } } else if (flag && !DB.EnabledCommand) { DB.EnabledCommand = true; ManualLogSource? logger2 = Logger; if (logger2 != null) { logger2.LogInfo((object)"[JewelForge] Enabled by day-based automation."); } BroadcastMessage("[JewelForge] The JewelForge is now open!"); } } catch (Exception ex) { ManualLogSource logger3 = Logger; if (logger3 != null) { bool flag2 = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(45, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[JewelForge] Error calling ForgeScheduler => "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } logger3.LogWarning(val); } } } private void TryDetectForgeScheduler() { //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Expected O, but got Unknown try { Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => a.GetName().Name == "ForgeScheduler"); if (assembly == null) { ManualLogSource? logger = Logger; if (logger != null) { logger.LogWarning((object)"[JewelForge] ForgeScheduler not found => no day-based override."); } return; } Type type = assembly.GetType("ForgeScheduler.JewelForgeScheduleManager"); if (type == null) { ManualLogSource? logger2 = Logger; if (logger2 != null) { logger2.LogWarning((object)"[JewelForge] Found 'ForgeScheduler' assembly but not 'JewelForgeScheduleManager' => ignoring override."); } return; } _shouldEnableMethod = type.GetMethod("ShouldEnableJewelForge", BindingFlags.Static | BindingFlags.Public); if (_shouldEnableMethod != null) { _forgeSchedulerFound = true; ManualLogSource? logger3 = Logger; if (logger3 != null) { logger3.LogInfo((object)"[JewelForge] Detected JewelForgeScheduleManager => day-based override active!"); } } else { ManualLogSource? logger4 = Logger; if (logger4 != null) { logger4.LogWarning((object)"[JewelForge] JewelForgeScheduleManager found but no 'ShouldEnableJewelForge()' => ignoring override."); } } } catch (Exception ex) { ManualLogSource logger5 = Logger; if (logger5 != null) { bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(47, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[JewelForge] Error detecting ForgeScheduler => "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } logger5.LogWarning(val); } } } private void BroadcastMessage(string text) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_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_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: 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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) EntityManager entityManager = VWorld.Server.EntityManager; EntityQuery val = ((EntityManager)(ref entityManager)).CreateEntityQuery((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly() }); NativeArray val2 = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)); Enumerator enumerator = val2.GetEnumerator(); while (enumerator.MoveNext()) { Entity current = enumerator.Current; if (((EntityManager)(ref entityManager)).HasComponent(current)) { User componentData = ((EntityManager)(ref entityManager)).GetComponentData(current); ServerChatUtils.SendSystemMessageToClient(entityManager, componentData, text); } } val2.Dispose(); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "JewelForge"; public const string PLUGIN_NAME = "JewelForge"; public const string PLUGIN_VERSION = "0.1.10"; } } namespace JewelForge.Configs { internal class MainConfig { private static readonly string FileDirectory = Path.Combine("BepInEx", "config"); private static readonly string FileName = "JewelForge.cfg"; private static readonly string FullPath = Path.Combine(FileDirectory, FileName); private static readonly ConfigFile Conf = new ConfigFile(FullPath, true); public static ConfigEntry? EnableCommand; public static ConfigEntry? AdminOnlyCommand; public static ConfigEntry? TierLevel; public static ConfigEntry? SkillModPower; public static ConfigEntry? RequiredItemGUID; public static ConfigEntry? RequiredItemAmount; public static ConfigEntry? ItemName; public static void SettingsInit() { EnableCommand = Conf.Bind("JewelForge", "Enabled", true, "Enable the 'JewelForge' command."); AdminOnlyCommand = Conf.Bind("JewelForge", "AdminOnly", false, "Restrict the 'JewelForge' command to admins only."); RequiredItemGUID = Conf.Bind("JewelForge", "RequiredItemGUID", -598100816, "PrefabGUID of the item required for the JewelForge command."); RequiredItemAmount = Conf.Bind("JewelForge", "RequiredItemAmount", 1000, "Number of required items for the JewelForge command."); ItemName = Conf.Bind("JewelForge", "ItemName", "Thistle", "Name of the item required for the JewelForge command."); SettingsBind(); } public static void SettingsBind() { if (TierLevel != null) { TierLevel.Value = 4; } if (SkillModPower != null) { SkillModPower.Value = 1f; } DB.AdminOnlyCommand = AdminOnlyCommand?.Value ?? false; DB.EnabledCommand = EnableCommand?.Value ?? true; DB.JewelTier = (TierLevel?.Value ?? 4) - 1; DB.SkillPower = SkillModPower?.Value ?? 1f; DB.RequiredItemGUID = RequiredItemGUID?.Value ?? (-598100816); DB.RequiredItemAmount = RequiredItemAmount?.Value ?? 5; DB.ItemName = ItemName?.Value ?? "Unknown Item"; } public static void Reload() { Conf.Reload(); Conf.Save(); SettingsBind(); } } } namespace JewelForge.Inventory { internal static class JewelForgeInventorySystem { public static bool HasEnoughOfItem(Entity playerEntity, PrefabGUID itemGuid, int neededAmount) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) EntityManager entityManager = VWorld.Server.EntityManager; Entity val = default(Entity); if (!InventoryUtilities.TryGetInventoryEntity(entityManager, playerEntity, ref val, 0)) { return false; } if (!((EntityManager)(ref entityManager)).HasComponent(val)) { return false; } DynamicBuffer buffer = ((EntityManager)(ref entityManager)).GetBuffer(val, false); int num = 0; Enumerator enumerator = buffer.GetEnumerator(); while (enumerator.MoveNext()) { InventoryBuffer current = enumerator.Current; if (current.ItemType == itemGuid) { num += current.Amount; if (num >= neededAmount) { return true; } } } return num >= neededAmount; } public static bool TryRemoveItem(Entity playerEntity, PrefabGUID itemGuid, int removeAmount) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_003f: 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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: 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_00a8: 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 (removeAmount <= 0) { return true; } EntityManager entityManager = VWorld.Server.EntityManager; Entity val = default(Entity); if (!InventoryUtilities.TryGetInventoryEntity(entityManager, playerEntity, ref val, 0)) { return false; } if (!((EntityManager)(ref entityManager)).HasComponent(val)) { return false; } DynamicBuffer buffer = ((EntityManager)(ref entityManager)).GetBuffer(val, false); int num = removeAmount; for (int i = 0; i < buffer.Length; i++) { if (num <= 0) { break; } InventoryBuffer val2 = buffer[i]; if (val2.ItemType == itemGuid && val2.Amount > 0) { int num2 = math.min(val2.Amount, num); InventoryUtilitiesServer.TryRemoveItemAtIndex(entityManager, playerEntity, val2.ItemType, num2, i, false); num -= num2; } } return num <= 0; } } } namespace JewelForge.Commands { internal class JewelForgeCommands { private static readonly Dictionary skillSynonyms = new Dictionary { { "lightningcurtain", "lightningwall" } }; [Command("j", "j", ".j ?", "Create or query a jewel (or list by school).", null, false)] public static void JewelForgeCommand(ChatCommandContext ctx, string arg1 = "", string arg2 = "") { string userSkillName = arg1; if (skillSynonyms.TryGetValue(arg1.ToLower(), out var value)) { arg1 = value; } if (!DB.EnabledCommand) { ctx.Reply(" This command is currently disabled."); } else if (arg1.Equals("school", StringComparison.OrdinalIgnoreCase)) { HandleSchoolCommand(ctx, arg2); } else if (string.IsNullOrEmpty(arg1) || arg1 == "?") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(" [Skill Name] [Skill Modifiers]"); stringBuilder.AppendLine("Example: .j bloodrage 1234."); stringBuilder.AppendLine("Use '.j [Skill Name] ?' to list available modifiers for that skill."); stringBuilder.AppendLine("Use '.j school [blood/chaos/etc.]' to list spells in a school."); ctx.Reply(stringBuilder.ToString()); } else if (arg2 == "?") { HandleSkillModifiersQuery(ctx, arg1, userSkillName); } else { HandleJewelCreation(ctx, arg1, arg2, userSkillName); } } [Command("jewelreload", null, null, "Reloads the JewelForge config file.", null, true)] public static void ReloadJewelForgeConfig(ChatCommandContext ctx) { try { MainConfig.Reload(); ctx.Reply("[JewelForge] Config reloaded successfully!"); } catch (Exception ex) { ctx.Reply("[JewelForge] Failed to reload config: " + ex.Message); } } private static void HandleSchoolCommand(ChatCommandContext ctx, string categoryName) { StringBuilder stringBuilder2; StringBuilder.AppendInterpolatedStringHandler handler; if (string.IsNullOrEmpty(categoryName) || categoryName == "?") { List list = DB.SkillClass.Keys.ToList(); list.Sort(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(" Available schools:"); for (int i = 0; i < list.Count; i++) { string text = list[i]; string colorForSkill = DB.GetColorForSkill(text); string value = Capitalize(text); stringBuilder2 = stringBuilder; StringBuilder stringBuilder3 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(39, 3, stringBuilder2); handler.AppendLiteral(""); handler.AppendFormatted(i + 1); handler.AppendLiteral(". "); handler.AppendFormatted(value); handler.AppendLiteral(""); stringBuilder3.AppendLine(ref handler); } ctx.Reply(stringBuilder.ToString()); return; } if (!DB.SkillClass.ContainsKey(categoryName.ToLower())) { ctx.Reply(" Unknown school '" + categoryName + "'"); return; } List list2 = DB.SkillClass[categoryName.ToLower()]; string colorForSkill2 = DB.GetColorForSkill(categoryName.ToLower()); string value2 = Capitalize(categoryName); StringBuilder stringBuilder4 = new StringBuilder(); stringBuilder2 = stringBuilder4; StringBuilder stringBuilder5 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(37, 2, stringBuilder2); handler.AppendLiteral(" Spells in '"); handler.AppendFormatted(value2); handler.AppendLiteral("' school:"); stringBuilder5.AppendLine(ref handler); for (int j = 0; j < list2.Count; j++) { string input = list2[j]; stringBuilder2 = stringBuilder4; StringBuilder stringBuilder6 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(39, 3, stringBuilder2); handler.AppendLiteral(""); handler.AppendFormatted(j + 1); handler.AppendLiteral(". "); handler.AppendFormatted(Capitalize(input)); handler.AppendLiteral(""); stringBuilder6.AppendLine(ref handler); } ctx.Reply(stringBuilder4.ToString()); } private static void HandleSkillModifiersQuery(ChatCommandContext ctx, string realSkillName, string userSkillName) { if (!DB.SkillModList.TryGetValue(realSkillName.ToLower(), out var value)) { ctx.Reply(" Skill '" + userSkillName + "' not found."); return; } string colorForSkill = DB.GetColorForSkill(realSkillName.ToLower()); string value2 = Capitalize(userSkillName); List list = new List { $" Modifiers for skill '{value2}':" }; List> list2 = value.OrderBy((KeyValuePair k) => int.Parse(k.Key)).ToList(); foreach (KeyValuePair item in list2) { string key = item.Key; string description = item.Value.Description; list.Add($"{key}. {description}"); } SendMultiLineSafeReply(ctx, list, 460); } private static void HandleJewelCreation(ChatCommandContext ctx, string realSkillName, string modsArg, string userSkillName) { //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) if (!DB.SkillModList.TryGetValue(realSkillName.ToLower(), out var value)) { ctx.Reply(" Skill '" + userSkillName + "' not found."); return; } if (modsArg.Length != 4) { ctx.Reply(" You must provide exactly 4 modifiers."); return; } string[] array = new string[4]; for (int i = 0; i < 4; i++) { string text = modsArg[i].ToString(); if (!value.ContainsKey(text)) { ctx.Reply($" Modifier '{text}' is invalid for skill '{userSkillName}'."); return; } array[i] = text; } if (HasDuplicateModifiers(array)) { ctx.Reply(" Modifiers cannot be duplicated."); return; } PrefabGUID itemGuid = default(PrefabGUID); ((PrefabGUID)(ref itemGuid))..ctor(DB.RequiredItemGUID); int requiredItemAmount = DB.RequiredItemAmount; string value2 = MainConfig.ItemName?.Value ?? "Unknown Item"; Entity senderCharacterEntity = ctx.Event.SenderCharacterEntity; if (!JewelForgeInventorySystem.HasEnoughOfItem(senderCharacterEntity, itemGuid, requiredItemAmount)) { ctx.Reply($" The forge requires {requiredItemAmount} {value2} to create a jewel."); } else if (!JewelForgeInventorySystem.TryRemoveItem(senderCharacterEntity, itemGuid, requiredItemAmount)) { ctx.Reply(" Failed to remove the required items from your inventory."); } else { string colorForSkill = DB.GetColorForSkill(realSkillName.ToLower()); string value3 = Capitalize(userSkillName); ctx.Reply($" Payment successful. Creating your {value3} jewel..."); Helper.CreateJewel(ctx.Event.User, realSkillName.ToLower(), array, value); } } private static bool HasDuplicateModifiers(string[] mods) { for (int i = 0; i < mods.Length; i++) { for (int j = i + 1; j < mods.Length; j++) { if (mods[i] == mods[j]) { return true; } } } return false; } private static string Capitalize(string input) { if (string.IsNullOrEmpty(input)) { return input; } return char.ToUpper(input[0]) + input.Substring(1).ToLower(); } private static void SendMultiLineSafeReply(ChatCommandContext ctx, IEnumerable lines, int maxLength) { StringBuilder stringBuilder = new StringBuilder(); foreach (string line in lines) { if (stringBuilder.Length + line.Length + 1 > maxLength) { ctx.Reply(stringBuilder.ToString().TrimEnd()); stringBuilder.Clear(); } stringBuilder.AppendLine(line); } if (stringBuilder.Length > 0) { ctx.Reply(stringBuilder.ToString().TrimEnd()); } } } } namespace JewelForge.Utils { internal static class Helper { private static World? _serverWorld; private static PrefabCollectionSystem PrefabCollectionSystem => Server.GetExistingSystemManaged(); private static Dictionary NameToPrefab => PrefabCollectionSystem.NameToPrefabGuidDictionary; public static World Server { get { if (_serverWorld != null) { return _serverWorld; } _serverWorld = GetWorld("Server") ?? throw new Exception("Server world not found. Did you install a server mod?"); return _serverWorld; } } public static bool IsServer => Application.productName == "VRisingServer"; public static void CreateJewel(User user, string ability, string[] mods, ConcurrentDictionary modList) { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: 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_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) PrefabGUID[] array = (PrefabGUID[])(object)new PrefabGUID[mods.Length]; float[] array2 = new float[mods.Length]; for (int i = 0; i < mods.Length; i++) { if (mods[i] != "0" && modList.TryGetValue(mods[i], out var value)) { array[i] = NameToPrefab[value.Mod]; array2[i] = value.Power; } else { array[i] = new PrefabGUID(0); array2[i] = 0f; } } CreateJewelDebugEventV2 val = default(CreateJewelDebugEventV2); val.AbilityPrefabGuid = NameToPrefab[DB.abilityNames[ability]]; val.Equip = false; val.SpellMod1 = array[0]; val.SpellMod1Power = array2[0]; val.SpellMod2 = array[1]; val.SpellMod2Power = array2[1]; val.SpellMod3 = array[2]; val.SpellMod3Power = array2[2]; val.SpellMod4 = array[3]; val.SpellMod4Power = array2[3]; val.Tier = DB.JewelTier; CreateJewelDebugEventV2 val2 = val; Server.GetExistingSystemManaged().CreateJewelEvent(user.Index, ref val2); } private static World GetWorld(string name) { Enumerator enumerator = World.s_AllWorlds.GetEnumerator(); while (enumerator.MoveNext()) { World current = enumerator.Current; if (current.Name == name) { return current; } } throw new Exception("World '" + name + "' not found."); } } } namespace JewelForge.Database { internal class DB { public static float SkillPower = 0f; public static int JewelTier = 0; public static bool EnabledCommand = true; public static bool AdminOnlyCommand = false; public static ConcurrentDictionary> SkillModList = new ConcurrentDictionary>(); public static ImmutableDictionary> SkillClass = ImmutableDictionary.Create>().Add("blood", new List { "bloodfountain", "bloodrage", "bloodrite", "sanguinecoil", "shadowbolt", "veilofblood" }).Add("chaos", new List { "aftershock", "chaosbarrier", "powersurge", "void", "volley", "veilofchaos" }) .Add("frost", new List { "coldsnap", "crystallance", "frostbarrier", "frostbat", "icenova", "veiloffrost" }) .Add("illusion", new List { "misttrance", "mosquito", "phantomaegis", "spectralwolf", "wraithspear", "veilofillusion" }) .Add("storm", new List { "balllightning", "cyclone", "discharge", "lightningwall", "polarityshift", "veilofstorm" }) .Add("unholy", new List { "corpseexplosion", "corruptedskull", "deathknight", "soulburn", "wardofthedamned", "veilofbones" }); public static ImmutableDictionary abilityNames = ImmutableDictionary.Create().Add("bloodfountain", "AB_Blood_BloodFountain_AbilityGroup").Add("bloodrage", "AB_Blood_BloodRage_AbilityGroup") .Add("bloodrite", "AB_Blood_BloodRite_AbilityGroup") .Add("sanguinecoil", "AB_Blood_SanguineCoil_AbilityGroup") .Add("shadowbolt", "AB_Blood_Shadowbolt_AbilityGroup") .Add("veilofblood", "AB_Vampire_VeilOfBlood_Group") .Add("aftershock", "AB_Chaos_Aftershock_Group") .Add("chaosbarrier", "AB_Chaos_Barrier_AbilityGroup") .Add("powersurge", "AB_Chaos_PowerSurge_AbilityGroup") .Add("void", "AB_Chaos_Void_AbilityGroup") .Add("volley", "AB_Chaos_Volley_AbilityGroup") .Add("veilofchaos", "AB_Vampire_VeilOfChaos_Group") .Add("coldsnap", "AB_Frost_ColdSnap_AbilityGroup") .Add("crystallance", "AB_Frost_CrystalLance_AbilityGroup") .Add("frostbarrier", "AB_FrostBarrier_AbilityGroup") .Add("frostbat", "AB_Frost_FrostBat_AbilityGroup") .Add("icenova", "AB_Frost_IceNova_AbilityGroup") .Add("veiloffrost", "AB_Vampire_VeilOfFrost_Group") .Add("misttrance", "AB_Illusion_MistTrance_AbilityGroup") .Add("mosquito", "AB_Illusion_Mosquito_AbilityGroup") .Add("phantomaegis", "AB_Illusion_PhantomAegis_AbilityGroup") .Add("spectralwolf", "AB_Illusion_SpectralWolf_AbilityGroup") .Add("wraithspear", "AB_Illusion_WraithSpear_AbilityGroup") .Add("veilofillusion", "AB_Vampire_VeilOfIllusion_AbilityGroup") .Add("balllightning", "AB_Storm_BallLightning_AbilityGroup") .Add("cyclone", "AB_Storm_Cyclone_AbilityGroup") .Add("discharge", "AB_Storm_Discharge_AbilityGroup") .Add("lightningwall", "AB_Storm_LightningWall_AbilityGroup") .Add("polarityshift", "AB_Storm_PolarityShift_AbilityGroup") .Add("veilofstorm", "AB_Vampire_VeilOfStorm_Group") .Add("corpseexplosion", "AB_Unholy_CorpseExplosion_AbilityGroup") .Add("corruptedskull", "AB_Unholy_CorruptedSkull_AbilityGroup") .Add("deathknight", "AB_Unholy_DeathKnight_AbilityGroup") .Add("soulburn", "AB_Unholy_Soulburn_AbilityGroup") .Add("wardofthedamned", "AB_Unholy_WardOfTheDamned_AbilityGroup") .Add("veilofbones", "AB_Vampire_VeilOfBones_AbilityGroup"); public static int RequiredItemGUID { get; set; } public static string ItemName { get; set; } = "Unknown Item"; public static int RequiredItemAmount { get; set; } public static string GetColorForSkill(string skillName) { string text = skillName.ToLower(); if (SkillClass.ContainsKey(text)) { return text switch { "blood" => "red", "chaos" => "#B19CD9", "frost" => "#87CEFA", "illusion" => "#90ee90", "storm" => "yellow", "unholy" => "green", _ => "white", }; } foreach (KeyValuePair> item in SkillClass) { if (item.Value.Contains(text)) { return item.Key.ToLower() switch { "blood" => "red", "chaos" => "#B19CD9", "frost" => "#87CEFA", "illusion" => "#90ee90", "storm" => "yellow", "unholy" => "green", _ => "white", }; } } return "white"; } public static void inits() { ConcurrentDictionary orAdd = SkillModList.GetOrAdd("bloodfountain", new ConcurrentDictionary()); orAdd.TryAdd("1", new CreateJevelLegendStruct("SpellMod_BloodFountain_FirstImpactApplyLeech", SkillPower, "Initial hit inflicts Leech.")); orAdd.TryAdd("2", new CreateJevelLegendStruct("SpellMod_BloodFountain_FirstImpactDispell", SkillPower, "Removes negative effects.")); orAdd.TryAdd("3", new CreateJevelLegendStruct("SpellMod_BloodFountain_FirstImpactFadingSnare", SkillPower, "Initial impact inflicts fading snare.")); orAdd.TryAdd("4", new CreateJevelLegendStruct("SpellMod_BloodFountain_FirstImpactHealIncrease", SkillPower, "Increases initial hit healing.")); orAdd.TryAdd("5", new CreateJevelLegendStruct("SpellMod_BloodFountain_RecastLesser", SkillPower, "Recast to conjure a lesser blood fountain.")); orAdd.TryAdd("6", new CreateJevelLegendStruct("SpellMod_BloodFountain_SecondImpactDamageIncrease", SkillPower, "Eruption impact deals bonus damage.")); orAdd.TryAdd("7", new CreateJevelLegendStruct("SpellMod_BloodFountain_SecondImpactHealIncrease", SkillPower, "Increases eruption healing.")); orAdd.TryAdd("8", new CreateJevelLegendStruct("SpellMod_BloodFountain_SecondImpactKnockback", SkillPower, "Eruption hit knocks enemies back.")); orAdd.TryAdd("9", new CreateJevelLegendStruct("SpellMod_BloodFountain_SecondImpactSpeedBuff", SkillPower, "Eruption hit increases ally movement speed.")); ConcurrentDictionary orAdd2 = SkillModList.GetOrAdd("bloodrage", new ConcurrentDictionary()); orAdd2.TryAdd("1", new CreateJevelLegendStruct("SpellMod_BloodRage_DamageBoost", SkillPower, "Increases physical damage output during effect.")); orAdd2.TryAdd("2", new CreateJevelLegendStruct("SpellMod_BloodRage_HealOnKill", SkillPower, "Killing an enemy during effect heals you.")); orAdd2.TryAdd("3", new CreateJevelLegendStruct("SpellMod_BloodRage_IncreaseLifetime", SkillPower, "Extends effect duration.")); orAdd2.TryAdd("4", new CreateJevelLegendStruct("SpellMod_BloodRage_IncreaseMoveSpeed", SkillPower, "Boosts movement speed.")); orAdd2.TryAdd("5", new CreateJevelLegendStruct("SpellMod_BloodRage_Shield", SkillPower, "Shields self and nearby allies.")); orAdd2.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_ApplyFadingSnare_Medium", SkillPower, "Inflicts fading snare.")); orAdd2.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Shared_DispellDebuffs", SkillPower, "Removes negative effects.")); ConcurrentDictionary orAdd3 = SkillModList.GetOrAdd("bloodrite", new ConcurrentDictionary()); orAdd3.TryAdd("1", new CreateJevelLegendStruct("SpellMod_BloodRite_ApplyFadingSnare", SkillPower, "Inflicts fading snare on enemies.")); orAdd3.TryAdd("2", new CreateJevelLegendStruct("SpellMod_BloodRite_BonusDamage", SkillPower, "Increases damage.")); orAdd3.TryAdd("3", new CreateJevelLegendStruct("SpellMod_BloodRite_DamageOnAttack", SkillPower, "Next primary attack deals bonus damage.")); orAdd3.TryAdd("4", new CreateJevelLegendStruct("SpellMod_BloodRite_HealOnTrigger", SkillPower, "When triggered, heals self.")); orAdd3.TryAdd("5", new CreateJevelLegendStruct("SpellMod_BloodRite_IncreaseLifetime", SkillPower, "Extends immaterial duration.")); orAdd3.TryAdd("6", new CreateJevelLegendStruct("SpellMod_BloodRite_Stealth", SkillPower, "Turn invisible during immaterial duration.")); orAdd3.TryAdd("7", new CreateJevelLegendStruct("SpellMod_BloodRite_TossDaggers", SkillPower, "Throw daggers at nearby enemies.")); orAdd3.TryAdd("8", new CreateJevelLegendStruct("SpellMod_Shared_IncreaseMoveSpeedDuringChannel_High", SkillPower, "Increases movement speed when channeling.")); ConcurrentDictionary orAdd4 = SkillModList.GetOrAdd("sanguinecoil", new ConcurrentDictionary()); orAdd4.TryAdd("1", new CreateJevelLegendStruct("SpellMod_SanguineCoil_AddBounces", SkillPower, "Bounces to an additional target after first hit.")); orAdd4.TryAdd("2", new CreateJevelLegendStruct("SpellMod_SanguineCoil_BonusDamage", SkillPower, "Increases damage.")); orAdd4.TryAdd("3", new CreateJevelLegendStruct("SpellMod_SanguineCoil_BonusHealing", SkillPower, "Boosts ally healing.")); orAdd4.TryAdd("4", new CreateJevelLegendStruct("SpellMod_SanguineCoil_BonusLifeLeech", SkillPower, "Enhances life drain.")); orAdd4.TryAdd("5", new CreateJevelLegendStruct("SpellMod_SanguineCoil_KillRecharge", SkillPower, "Lethal attacks restore one charge.")); orAdd4.TryAdd("6", new CreateJevelLegendStruct("SpellMod_SanguineCoil_LeechBonusDamage", SkillPower, "Hitting targets with Leech deals bonus damage.")); orAdd4.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Shared_AddCharges", SkillPower, "Increases maximum charges.")); orAdd4.TryAdd("8", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_RangeAndVelocity", SkillPower, "Increases projectile range and speed.")); ConcurrentDictionary orAdd5 = SkillModList.GetOrAdd("shadowbolt", new ConcurrentDictionary()); orAdd5.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Shadowbolt_ExplodeOnHit", SkillPower, "Explodes on hit inflicting Leech on nearby enemies.")); orAdd5.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Shadowbolt_LeechBonusDamage", SkillPower, "Hitting targets with Leech deals bonus damage.")); orAdd5.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Shadowbolt_VampiricCurse", SkillPower, "Inflicts Vampiric Curse.")); orAdd5.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Shared_Blood_ConsumeLeechSelfHeal_Small", SkillPower, "Hitting targets with Leech heals self.")); orAdd5.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_CastRate", SkillPower, "Increases cast rate.")); orAdd5.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Cooldown_Medium", SkillPower, "Reduces cooldown.")); orAdd5.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Shared_KnockbackOnHit_Medium", SkillPower, "Knocks targets back on hit.")); orAdd5.TryAdd("8", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_RangeAndVelocity", SkillPower, "Increases projectile range and speed.")); ConcurrentDictionary orAdd6 = SkillModList.GetOrAdd("veilofblood", new ConcurrentDictionary()); orAdd6.TryAdd("1", new CreateJevelLegendStruct("SpellMod_VeilOfBlood_AttackInflictFadingSnare", SkillPower, "Next primary attack inflicts fading snare.")); orAdd6.TryAdd("2", new CreateJevelLegendStruct("SpellMod_VeilOfBlood_DashInflictLeech", SkillPower, "Dashing through an enemy inflicts Leech.")); orAdd6.TryAdd("3", new CreateJevelLegendStruct("SpellMod_VeilOfBlood_Empower", SkillPower, "Hitting enemies with Leech boosts your physical damage.")); orAdd6.TryAdd("4", new CreateJevelLegendStruct("SpellMod_VeilOfBlood_SelfHealing", SkillPower, "Increases maximum healing percentage.")); orAdd6.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BonusDamageOnPrimary", SkillPower, "Increases next primary attack damage.")); orAdd6.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BuffAndIllusionDuration", SkillPower, "Extends elude duration.")); ConcurrentDictionary orAdd7 = SkillModList.GetOrAdd("aftershock", new ConcurrentDictionary()); orAdd7.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Chaos_Aftershock_BonusDamage", SkillPower, "Increases damage.")); orAdd7.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Chaos_Aftershock_InflictSlowOnProjectile", SkillPower, "Initial wave inflicts fading snare.")); orAdd7.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Chaos_Aftershock_KnockbackArea", SkillPower, "Knocks nearby enemies back on cast.")); orAdd7.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Shared_Chaos_ConsumeIgniteAgonizingFlames", SkillPower, "Hitting targets with Ignite engulfs them in flames, dealing damage and healing self over time.")); orAdd7.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Cooldown_Medium", SkillPower, "Reduces cooldown.")); orAdd7.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_IncreaseRange_Medium", SkillPower, "Increases projectile range.")); ConcurrentDictionary orAdd8 = SkillModList.GetOrAdd("chaosbarrier", new ConcurrentDictionary()); orAdd8.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Chaos_Barrier_BonusDamage", SkillPower, "Increases damage per charge.")); orAdd8.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Chaos_Barrier_ConsumeAttackReduceCooldownXTimes", SkillPower, "Absorbing attacks reduces cooldown.")); orAdd8.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Chaos_Barrier_ExplodeOnHit", SkillPower, "Explodes on hit, dealing damage and inflicting Ignite on nearby enemies.")); orAdd8.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Chaos_Barrier_LesserPowerSurge", SkillPower, "When fully charged, gain a lesser Power Surge for a short duration.")); orAdd8.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Chaos_Barrier_StunOnHit", SkillPower, "Charged chaos bolt stuns target on hit.")); orAdd8.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_IncreaseMoveSpeedDuringChannel_Low", SkillPower, "Increases movement speed when channeling.")); ConcurrentDictionary orAdd9 = SkillModList.GetOrAdd("powersurge", new ConcurrentDictionary()); orAdd9.TryAdd("1", new CreateJevelLegendStruct("SpellMod_PowerSurge_AttackSpeed", SkillPower, "Boosts attack speed during effect.")); orAdd9.TryAdd("2", new CreateJevelLegendStruct("SpellMod_PowerSurge_EmpowerPhysical", SkillPower, "Increases physical damage output during effect.")); orAdd9.TryAdd("3", new CreateJevelLegendStruct("SpellMod_PowerSurge_Haste", SkillPower, "Increases movement speed during effect.")); orAdd9.TryAdd("4", new CreateJevelLegendStruct("SpellMod_PowerSurge_IncreaseDurationOnKill", SkillPower, "extend duration.")); orAdd9.TryAdd("5", new CreateJevelLegendStruct("SpellMod_PowerSurge_Lifetime", SkillPower, "Extends effect duration.")); orAdd9.TryAdd("6", new CreateJevelLegendStruct("SpellMod_PowerSurge_RecastDestonate", SkillPower, "Recast to consume effect.")); orAdd9.TryAdd("7", new CreateJevelLegendStruct("SpellMod_PowerSurge_Shield", SkillPower, "Shields target.")); orAdd9.TryAdd("8", new CreateJevelLegendStruct("SpellMod_Shared_DispellDebuffs", SkillPower, "Removes negative effects.")); ConcurrentDictionary orAdd10 = SkillModList.GetOrAdd("void", new ConcurrentDictionary()); orAdd10.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Chaos_Void_BonusDamage", SkillPower, "Increases damage.")); orAdd10.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Chaos_Void_BurnArea", SkillPower, "Flames engulf area, dealing damage over time.")); orAdd10.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Chaos_Void_FragBomb", SkillPower, "Spawns exploding fragments, dealing damage and inflicting Ignite.")); orAdd10.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Chaos_Void_ReduceChargeCD", SkillPower, "Charges recharge faster.")); orAdd10.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Chaos_ConsumeIgniteAgonizingFlames", SkillPower, "Dealing damage and healing self over time.")); orAdd10.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_TargetAoE_IncreaseRange_Medium", SkillPower, "Increases range.")); ConcurrentDictionary orAdd11 = SkillModList.GetOrAdd("volley", new ConcurrentDictionary()); orAdd11.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Chaos_Volley_BonusDamage", SkillPower, "Increases damage.")); orAdd11.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Chaos_Volley_SecondProjectileBonusDamage", SkillPower, "different target hit deals bonus damage.")); orAdd11.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Shared_Chaos_ConsumeIgniteAgonizingFlames", SkillPower, "Dealing damage and healing self over time.")); orAdd11.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Shared_Cooldown_Medium", SkillPower, "Reduces cooldown.")); orAdd11.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_KnockbackOnHit_Light", SkillPower, "Knocks targets back on hit.")); orAdd11.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_RangeAndVelocity", SkillPower, "Increases projectile range and speed.")); ConcurrentDictionary orAdd12 = SkillModList.GetOrAdd("veilofchaos", new ConcurrentDictionary()); orAdd12.TryAdd("1", new CreateJevelLegendStruct("SpellMod_VeilOfChaos_ApplySnareOnExplode", SkillPower, "Illusion explosion inflicts fading snare.")); orAdd12.TryAdd("2", new CreateJevelLegendStruct("SpellMod_VeilOfChaos_BonusDamageOnExplode", SkillPower, "Increases damage when illusion explodes.")); orAdd12.TryAdd("3", new CreateJevelLegendStruct("SpellMod_VeilOfChaos_BonusIllusion", SkillPower, "Spawns second illusion on recast, dealing reduced damage.")); orAdd12.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Shared_Chaos_ConsumeIgniteAgonizingFlames_OnAttack", SkillPower, "Dealing damage and healing self over time..")); orAdd12.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BonusDamageOnPrimary", SkillPower, "Increases next primary attack damage.")); orAdd12.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BuffAndIllusionDuration", SkillPower, "Extends elude duration.")); ConcurrentDictionary orAdd13 = SkillModList.GetOrAdd("coldsnap", new ConcurrentDictionary()); orAdd13.TryAdd("1", new CreateJevelLegendStruct("SpellMod_ColdSnap_BonusAbsorb", SkillPower, "Shield absorbs more of your spell power.")); orAdd13.TryAdd("2", new CreateJevelLegendStruct("SpellMod_ColdSnap_BonusDamage", SkillPower, "Increases damage.")); orAdd13.TryAdd("3", new CreateJevelLegendStruct("SpellMod_ColdSnap_HasteWhileShielded", SkillPower, "Increases movement speed while shielded.")); orAdd13.TryAdd("4", new CreateJevelLegendStruct("SpellMod_ColdSnap_Immaterial", SkillPower, "Become immaterial when triggered.")); orAdd13.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Frost_IncreaseFreezeWhenChill", SkillPower, "Freeze lasts longer on Chilled targets.")); orAdd13.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_FrostWeapon", SkillPower, "Next attack deals bonus damage and inflicts Chill.")); orAdd13.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Shared_IncreaseMoveSpeedDuringChannel_High", SkillPower, "Increases movement speed when channeling.")); ConcurrentDictionary orAdd14 = SkillModList.GetOrAdd("crystallance", new ConcurrentDictionary()); orAdd14.TryAdd("1", new CreateJevelLegendStruct("SpellMod_CrystalLance_BonusDamageToFrosty", SkillPower, "Increases damage to Chilled and Frozen targets.")); orAdd14.TryAdd("2", new CreateJevelLegendStruct("SpellMod_CrystalLance_PierceEnemies", SkillPower, "Pierces multiple targets, reducing damage per target.")); orAdd14.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Shared_CastRate", SkillPower, "Increases cast rate.")); orAdd14.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Shared_Frost_IncreaseFreezeWhenChill", SkillPower, "Freeze lasts longer on Chilled targets.")); orAdd14.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Frost_ShieldOnFrosty", SkillPower, "Hitting Chilled or Frozen target shields you.")); orAdd14.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_RangeAndVelocity", SkillPower, "Increases projectile range and speed.")); ConcurrentDictionary orAdd15 = SkillModList.GetOrAdd("frostbarrier", new ConcurrentDictionary()); orAdd15.TryAdd("1", new CreateJevelLegendStruct("SpellMod_FrostBarrier_BonusDamage", SkillPower, "Increases damage.")); orAdd15.TryAdd("2", new CreateJevelLegendStruct("SpellMod_FrostBarrier_BonusSpellPowerOnAbsorb", SkillPower, "Absorbing an attack boosts your spell power.")); orAdd15.TryAdd("3", new CreateJevelLegendStruct("SpellMod_FrostBarrier_ConsumeAttackReduceCooldownXTimes", SkillPower, "Absorbing attacks reduces cooldown, up to several times.")); orAdd15.TryAdd("4", new CreateJevelLegendStruct("SpellMod_FrostBarrier_KnockbackOnRecast", SkillPower, "Cone of cold knocks targets back on hit.")); orAdd15.TryAdd("5", new CreateJevelLegendStruct("SpellMod_FrostBarrier_ShieldOnFrostyRecast", SkillPower, "Hitting Chilled or Frozen target with cone of cold shields you.")); orAdd15.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Frost_ConsumeChillIntoFreeze_Recast", SkillPower, "Cone of cold consumes Chill to inflict Freeze.")); orAdd15.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Shared_IncreaseMoveSpeedDuringChannel_Low", SkillPower, "Increases movement speed when channeling.")); ConcurrentDictionary orAdd16 = SkillModList.GetOrAdd("frostbat", new ConcurrentDictionary()); orAdd16.TryAdd("1", new CreateJevelLegendStruct("SpellMod_FrostBat_AreaDamage", SkillPower, "Frost impact blast damages surrounding enemies.")); orAdd16.TryAdd("2", new CreateJevelLegendStruct("SpellMod_FrostBat_BonusDamageToFrosty", SkillPower, "Increases damage to Chilled and Frozen targets.")); orAdd16.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Shared_CastRate", SkillPower, "Increases cast rate.")); orAdd16.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Shared_Frost_SplinterNovaOnFrosty", SkillPower, "Hitting Chilled or Frozen target shatters projectile into splinters.")); orAdd16.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Frost_ShieldOnFrosty", SkillPower, "Hitting Chilled or Frozen target shields you.")); orAdd16.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_RangeAndVelocity", SkillPower, "Increases projectile range and speed.")); ConcurrentDictionary orAdd17 = SkillModList.GetOrAdd("icenova", new ConcurrentDictionary()); orAdd17.TryAdd("1", new CreateJevelLegendStruct("SpellMod_IceNova_ApplyShield", SkillPower, "Nova shields self and allies.")); orAdd17.TryAdd("2", new CreateJevelLegendStruct("SpellMod_IceNova_BonusDamageToFrosty", SkillPower, "Increases damage to Chilled and Frozen targets.")); orAdd17.TryAdd("3", new CreateJevelLegendStruct("SpellMod_IceNova_RecastLesserNova", SkillPower, "Recast to conjure lesser ice nova dealing reduced damage.")); orAdd17.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Shared_Cooldown_Medium", SkillPower, "Reduces cooldown.")); orAdd17.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_TargetAoE_IncreaseRange_Medium", SkillPower, "Increases range.")); ConcurrentDictionary orAdd18 = SkillModList.GetOrAdd("veiloffrost", new ConcurrentDictionary()); orAdd18.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Shared_Frost_ConsumeChillIntoFreeze_OnAttack", SkillPower, "Next primary attack consumes Chill to inflict Freeze.")); orAdd18.TryAdd("2", new CreateJevelLegendStruct("SpellMod_VeilOfFrost_FrostNova", SkillPower, "Next primary attack conjures frost nova, dealing damage and inflicting Chill.")); orAdd18.TryAdd("3", new CreateJevelLegendStruct("SpellMod_VeilOfFrost_IllusionFrostBlast", SkillPower, "Illusion explodes in ice nova, dealing damage and inflicting Chill.")); orAdd18.TryAdd("4", new CreateJevelLegendStruct("SpellMod_VeilOfFrost_ShieldBonus", SkillPower, "Increases shield absorb amount.")); orAdd18.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BonusDamageOnPrimary", SkillPower, "Increases next primary attack damage.")); orAdd18.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BuffAndIllusionDuration", SkillPower, "Extends elude duration.")); ConcurrentDictionary orAdd19 = SkillModList.GetOrAdd("misttrance", new ConcurrentDictionary()); orAdd19.TryAdd("1", new CreateJevelLegendStruct("SpellMod_MIstTrance_DamageOnAttack", SkillPower, "When triggered, next primary attack deals bonus damage.")); orAdd19.TryAdd("2", new CreateJevelLegendStruct("SpellMod_MistTrance_FearOnTrigger", SkillPower, "When triggered, fears nearby enemies.")); orAdd19.TryAdd("3", new CreateJevelLegendStruct("SpellMod_MistTrance_HasteOnTrigger", SkillPower, "When triggered, increases movement speed for a short duration.")); orAdd19.TryAdd("4", new CreateJevelLegendStruct("SpellMod_MistTrance_PhantasmOnTrigger", SkillPower, "When triggered, grants stacks of Phantasm.")); orAdd19.TryAdd("5", new CreateJevelLegendStruct("SpellMod_MistTrance_ReduceSecondaryWeaponCD", SkillPower, "When triggered, reduces cooldown of secondary weapon skill.")); orAdd19.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_IncreaseMoveSpeedDuringChannel_High", SkillPower, "Increases movement speed when channeling.")); orAdd19.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Shared_KnockbackOnHit_Medium", SkillPower, "Knocks targets back on hit.")); orAdd19.TryAdd("8", new CreateJevelLegendStruct("SpellMod_Shared_TravelBuff_IncreaseRange_Medium", SkillPower, "Increases distance traveled.")); ConcurrentDictionary orAdd20 = SkillModList.GetOrAdd("mosquito", new ConcurrentDictionary()); orAdd20.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Mosquito_BonusDamage", SkillPower, "Increases damage.")); orAdd20.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Mosquito_BonusFearDuration", SkillPower, "Extends duration of fear.")); orAdd20.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Mosquito_BonusHealthAndSpeed", SkillPower, "Increases mosquito's health.")); orAdd20.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Mosquito_ShieldOnSpawn", SkillPower, "Shields nearby allies when mosquito is summoned.")); orAdd20.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Mosquito_WispsOnDestroy", SkillPower, "Spawns wisps healing self or allies when mosquito explodes.")); ConcurrentDictionary orAdd21 = SkillModList.GetOrAdd("phantomaegis", new ConcurrentDictionary()); orAdd21.TryAdd("1", new CreateJevelLegendStruct("SpellMod_PhantomAegis_ConsumeShieldAndPullAlly", SkillPower, "Recast to consume barrier from an ally.")); orAdd21.TryAdd("2", new CreateJevelLegendStruct("SpellMod_PhantomAegis_ExplodeOnDestroy", SkillPower, "Barrier explodes if destroyed, inflicting Fear on nearby enemies.")); orAdd21.TryAdd("3", new CreateJevelLegendStruct("SpellMod_PhantomAegis_IncreaseLifetime", SkillPower, "Extends barrier's lifetime.")); orAdd21.TryAdd("4", new CreateJevelLegendStruct("SpellMod_PhantomAegis_IncreaseSpellPower", SkillPower, "Increases target's spell power while barrier lasts.")); orAdd21.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_DispellDebuffs", SkillPower, "Removes negative effects.")); orAdd21.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_KnockbackOnHit_Medium", SkillPower, "Knocks targets back on hit.")); orAdd21.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Shared_MovementSpeed_Normal", SkillPower, "Increases movement speed.")); ConcurrentDictionary orAdd22 = SkillModList.GetOrAdd("spectralwolf", new ConcurrentDictionary()); orAdd22.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Shared_Illusion_ConsumeWeakenSpawnWisp", SkillPower, "Consumes Weaken to spawn a wisp, healing self or ally.")); orAdd22.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Shared_Illusion_WeakenShield", SkillPower, "Hitting target with Weaken grants you a shield.")); orAdd22.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_RangeAndVelocity", SkillPower, "Increases projectile range and speed.")); orAdd22.TryAdd("4", new CreateJevelLegendStruct("SpellMod_SpectralWolf_AddBounces", SkillPower, "Increases maximum bounces.")); orAdd22.TryAdd("5", new CreateJevelLegendStruct("SpellMod_SpectralWolf_DecreaseBounceDamageReduction", SkillPower, "Reduces damage penalty per bounce.")); orAdd22.TryAdd("6", new CreateJevelLegendStruct("SpellMod_SpectralWolf_FirstBounceInflictFadingSnare", SkillPower, "Initial projectile inflicts fading snare on enemies hit.")); orAdd22.TryAdd("7", new CreateJevelLegendStruct("SpellMod_SpectralWolf_ReturnToOwner", SkillPower, "Wolf returns after last bounce, healing you.")); orAdd22.TryAdd("8", new CreateJevelLegendStruct("SpellMod_SpectralWolf_WeakenApplyXPhantasm", SkillPower, "Hitting target with Weaken grants stacks of Phantasm.")); ConcurrentDictionary orAdd23 = SkillModList.GetOrAdd("wraithspear", new ConcurrentDictionary()); orAdd23.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Shared_ApplyFadingSnare_Medium", SkillPower, "Inflicts fading snare on enemies hit.")); orAdd23.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Shared_Illusion_ConsumeWeakenSpawnWisp", SkillPower, "Consumes Weaken to spawn a wisp, healing self or ally.")); orAdd23.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Shared_Illusion_WeakenShield", SkillPower, "Hitting target with Weaken grants you a shield, stacking multiple times.")); orAdd23.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_IncreaseRange_Medium", SkillPower, "Increases projectile range.")); orAdd23.TryAdd("5", new CreateJevelLegendStruct("SpellMod_WraithSpear_BonusDamage", SkillPower, "Increases damage.")); orAdd23.TryAdd("6", new CreateJevelLegendStruct("SpellMod_WraithSpear_ReducedDamageReduction", SkillPower, "Reduces damage penalty per hit.")); orAdd23.TryAdd("7", new CreateJevelLegendStruct("SpellMod_WraithSpear_ShieldAlly", SkillPower, "Hitting an ally shields them.")); ConcurrentDictionary orAdd24 = SkillModList.GetOrAdd("veilofillusion", new ConcurrentDictionary()); orAdd24.TryAdd("1", new CreateJevelLegendStruct("SpellMod_VeilOfIllusion_AttackInflictFadingSnare", SkillPower, "Next primary attack inflicts fading snare.")); orAdd24.TryAdd("2", new CreateJevelLegendStruct("SpellMod_VeilOfIllusion_IllusionProjectileDamage", SkillPower, "Illusion projectiles deal damage.")); orAdd24.TryAdd("3", new CreateJevelLegendStruct("SpellMod_VeilOfIllusion_PhantasmOnHit", SkillPower, "Next primary attack grants stacks of Phantasm.")); orAdd24.TryAdd("4", new CreateJevelLegendStruct("SpellMod_VeilOfIllusion_RecastDetonate", SkillPower, "Detonate your illusion on recast, dealing damage and inflicting Weaken.")); orAdd24.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BonusDamageOnPrimary", SkillPower, "Increases next primary attack damage.")); orAdd24.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BuffAndIllusionDuration", SkillPower, "Extends elude duration.")); orAdd24.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Shared_Illusion_WeakenShield_OnAttack", SkillPower, "Hitting enemy with Weaken grants shield, stacking multiple times.")); ConcurrentDictionary orAdd25 = SkillModList.GetOrAdd("balllightning", new ConcurrentDictionary()); orAdd25.TryAdd("1", new CreateJevelLegendStruct("SpellMod_BallLightning_BonusDamage", SkillPower, "Increases damage per shock.")); orAdd25.TryAdd("2", new CreateJevelLegendStruct("SpellMod_BallLightning_DetonateOnRecast", SkillPower, "Recast to detonate orb early, explosion deals increased damage.")); orAdd25.TryAdd("3", new CreateJevelLegendStruct("SpellMod_BallLightning_Haste", SkillPower, "Increases allies' movement speed when orb explodes.")); orAdd25.TryAdd("4", new CreateJevelLegendStruct("SpellMod_BallLightning_KnockbackOnExplode", SkillPower, "Knocks enemies back when orb explodes.")); orAdd25.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_IncreaseRange_Medium", SkillPower, "Increases projectile range.")); orAdd25.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Storm_ConsumeStaticIntoStun_Explode", SkillPower, "Consumes Static to stun enemies when orb explodes.")); ConcurrentDictionary orAdd26 = SkillModList.GetOrAdd("cyclone", new ConcurrentDictionary()); orAdd26.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Cyclone_BonusDamage", SkillPower, "Increases damage.")); orAdd26.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Cyclone_IncreaseLifetime", SkillPower, "Extends projectile lifetime.")); orAdd26.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_RangeAndVelocity", SkillPower, "Increases projectile range and speed.")); orAdd26.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Shared_Storm_ConsumeStaticIntoStun", SkillPower, "Consumes Static to stun target.")); orAdd26.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Storm_ConsumeStaticIntoWeaponCharge", SkillPower, "Consumes Static to charge weapon.")); ConcurrentDictionary orAdd27 = SkillModList.GetOrAdd("discharge", new ConcurrentDictionary()); orAdd27.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Discharge_BonusDamage", SkillPower, "Increases damage done by storm shields.")); orAdd27.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Discharge_Immaterial", SkillPower, "Become immaterial if you have multiple storm shields when effect ends.")); orAdd27.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Discharge_IncreaseStunDuration", SkillPower, "Extends stun duration.")); orAdd27.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Discharge_RecastDetonate", SkillPower, "Recast to end effect, triggering explosion and knocking back enemies.")); orAdd27.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Discharge_SpellLeech", SkillPower, "Each active storm shield grants spell life leech.")); orAdd27.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_IncreaseMoveSpeedDuringChannel_High", SkillPower, "Increases movement speed when channeling.")); orAdd27.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Shared_Storm_GrantWeaponCharge", SkillPower, "When triggered, charges weapon, boosting next attack and inflicting Static.")); ConcurrentDictionary orAdd28 = SkillModList.GetOrAdd("lightningwall", new ConcurrentDictionary()); orAdd28.TryAdd("1", new CreateJevelLegendStruct("SpellMod_LightningWall_ApplyShield", SkillPower, "Passing through wall shields ally.")); orAdd28.TryAdd("2", new CreateJevelLegendStruct("SpellMod_LightningWall_BonusDamage", SkillPower, "Increases damage per hit.")); orAdd28.TryAdd("3", new CreateJevelLegendStruct("SpellMod_LightningWall_ConsumeProjectileWeaponCharge", SkillPower, "Blocking projectiles charges weapon.")); orAdd28.TryAdd("4", new CreateJevelLegendStruct("SpellMod_LightningWall_FadingSnare", SkillPower, "Inflicts fading snare on initial hit.")); orAdd28.TryAdd("5", new CreateJevelLegendStruct("SpellMod_LightningWall_IncreaseMovementSpeed", SkillPower, "Increases movement speed when passing through wall.")); ConcurrentDictionary orAdd29 = SkillModList.GetOrAdd("polarityshift", new ConcurrentDictionary()); orAdd29.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Shared_ApplyFadingSnare_Medium", SkillPower, "Inflicts fading snare on enemies hit.")); orAdd29.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_RangeAndVelocity", SkillPower, "Increases projectile range and speed.")); orAdd29.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Shared_Storm_ConsumeStaticIntoWeaponCharge", SkillPower, "Consumes Static to charge weapon, boosting next attack and inflicting Static.")); orAdd29.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Storm_PolarityShift_AreaImpactDestination", SkillPower, "Triggers lightning nova at destination, dealing damage and inflicting Static.")); orAdd29.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Storm_PolarityShift_AreaImpactOrigin", SkillPower, "Triggers lightning nova at origin, dealing damage and inflicting Static.")); ConcurrentDictionary orAdd30 = SkillModList.GetOrAdd("veilofstorm", new ConcurrentDictionary()); orAdd30.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Shared_Storm_ConsumeStaticIntoStun", SkillPower, "Consumes Static to stun target.")); orAdd30.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BonusDamageOnPrimary", SkillPower, "Increases next primary attack damage.")); orAdd30.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BuffAndIllusionDuration", SkillPower, "Extends elude duration.")); orAdd30.TryAdd("4", new CreateJevelLegendStruct("SpellMod_VeilOfStorm_AttackInflictFadingSnare", SkillPower, "Next primary attack inflicts fading snare.")); orAdd30.TryAdd("5", new CreateJevelLegendStruct("SpellMod_VeilOfStorm_DashInflictStatic", SkillPower, "Dashing through an enemy inflicts Static.")); orAdd30.TryAdd("6", new CreateJevelLegendStruct("SpellMod_VeilOfStorm_SparklingIllusion", SkillPower, "Illusion periodically shocks nearby enemy.")); ConcurrentDictionary orAdd31 = SkillModList.GetOrAdd("deathknight", new ConcurrentDictionary()); orAdd31.TryAdd("1", new CreateJevelLegendStruct("SpellMod_DeathKnight_BonusDamage", SkillPower, "Increases damage.")); orAdd31.TryAdd("2", new CreateJevelLegendStruct("SpellMod_DeathKnight_IncreaseLifetime", SkillPower, "Extends Death Knight's lifetime.")); orAdd31.TryAdd("3", new CreateJevelLegendStruct("SpellMod_DeathKnight_LifeLeech", SkillPower, "Damage done by the Death Knight heals you.")); orAdd31.TryAdd("4", new CreateJevelLegendStruct("SpellMod_DeathKnight_MaxHealth", SkillPower, "Increases Death Knight's health.")); orAdd31.TryAdd("5", new CreateJevelLegendStruct("SpellMod_DeathKnight_SkeletonMageOnLifetimeEnded", SkillPower, "Summons a Skeleton Mage when Death Knight's lifetime expires.")); orAdd31.TryAdd("6", new CreateJevelLegendStruct("SpellMod_DeathKnight_SnareEnemiesOnSummon", SkillPower, "Inflicts fading snare on enemies near the summoning location.")); ConcurrentDictionary orAdd32 = SkillModList.GetOrAdd("soulburn", new ConcurrentDictionary()); orAdd32.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Shared_DispellDebuffs_Self", SkillPower, "Removes negative effects from self when cast.")); orAdd32.TryAdd("2", new CreateJevelLegendStruct("SpellMod_Soulburn_BonusDamage", SkillPower, "Increases damage.")); orAdd32.TryAdd("3", new CreateJevelLegendStruct("SpellMod_Soulburn_BonusLifeDrain", SkillPower, "Increases life drain.")); orAdd32.TryAdd("4", new CreateJevelLegendStruct("SpellMod_Soulburn_ConsumeSkeletonEmpower", SkillPower, "Consumes up to three allied skeletons increasing spell and physical power.")); orAdd32.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Soulburn_ConsumeSkeletonHeal", SkillPower, "Consumes up to three allied skeletons, healing you per skeleton.")); orAdd32.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Soulburn_IncreasedSilenceDuration", SkillPower, "Increases silence duration.")); orAdd32.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Soulburn_IncreaseTriggerCount", SkillPower, "Increases targets hit.")); orAdd32.TryAdd("8", new CreateJevelLegendStruct("SpellMod_Soulburn_ReduceCooldownOnSilence", SkillPower, "Reduces cooldown for each target silenced.")); ConcurrentDictionary orAdd33 = SkillModList.GetOrAdd("wardofthedamned", new ConcurrentDictionary()); orAdd33.TryAdd("1", new CreateJevelLegendStruct("SpellMod_Shared_IncreaseMoveSpeedDuringChannel_Low", SkillPower, "Increases movement speed while channeling.")); orAdd33.TryAdd("2", new CreateJevelLegendStruct("SpellMod_WardOfTheDamned_BonusDamageOnRecast", SkillPower, "Increases damage of recast attack.")); orAdd33.TryAdd("3", new CreateJevelLegendStruct("SpellMod_WardOfTheDamned_DamageMeleeAttackers", SkillPower, "Melee attackers take damage when striking the barrier.")); orAdd33.TryAdd("4", new CreateJevelLegendStruct("SpellMod_WardOfTheDamned_EmpowerSkeletonsOnRecast", SkillPower, "Empowers allied skeletons hit by recast.")); orAdd33.TryAdd("5", new CreateJevelLegendStruct("SpellMod_WardOfTheDamned_HealOnAbsorbProjectile", SkillPower, "Absorbing a projectile heals you.")); orAdd33.TryAdd("6", new CreateJevelLegendStruct("SpellMod_WardOfTheDamned_KnockbackOnRecast", SkillPower, "Recast attack knocks targets back on hit.")); orAdd33.TryAdd("7", new CreateJevelLegendStruct("SpellMod_WardOfTheDamned_MightSpawnMageSkeleton", SkillPower, "Chance to spawn a Skeleton Mage instead.")); orAdd33.TryAdd("8", new CreateJevelLegendStruct("SpellMod_WardOfTheDamned_ShieldSkeletonsOnRecast", SkillPower, "Shields allied skeletons hit by recast.")); ConcurrentDictionary orAdd34 = SkillModList.GetOrAdd("veilofbones", new ConcurrentDictionary()); orAdd34.TryAdd("1", new CreateJevelLegendStruct("SpellMod_VeilOfBones_BonusDamageBelowThreshold", SkillPower, "Increases damage to targets below critical health.")); orAdd34.TryAdd("2", new CreateJevelLegendStruct("SpellMod_VeilOfBones_DashHealMinions", SkillPower, "Heals allied skeletons you dash through and resets their lifetime.")); orAdd34.TryAdd("3", new CreateJevelLegendStruct("SpellMod_VeilOfBones_DashInflictCondemn", SkillPower, "Dashing through an enemy inflicts Condemn.")); orAdd34.TryAdd("4", new CreateJevelLegendStruct("SpellMod_VeilOfBones_SpawnSkeletonMage", SkillPower, "Striking an enemy summons a Skeleton Mage instead of a Skeleton Warrior.")); orAdd34.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BonusDamageOnPrimary", SkillPower, "Increases next primary attack damage.")); orAdd34.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Veil_BuffAndIllusionDuration", SkillPower, "Extends elude duration.")); ConcurrentDictionary orAdd35 = SkillModList.GetOrAdd("corruptedskull", new ConcurrentDictionary()); orAdd35.TryAdd("1", new CreateJevelLegendStruct("SpellMod_CorruptedSkull_BoneSpirit", SkillPower, "Summons a bone spirit.")); orAdd35.TryAdd("2", new CreateJevelLegendStruct("SpellMod_CorruptedSkull_BonusDamage", SkillPower, "Boosts damage.")); orAdd35.TryAdd("3", new CreateJevelLegendStruct("SpellMod_CorruptedSkull_DetonateSkeleton", SkillPower, "Explodes an allied skeleton, dealing damage and inflicting Condemn.")); orAdd35.TryAdd("4", new CreateJevelLegendStruct("SpellMod_CorruptedSkull_LesserProjectiles", SkillPower, "Launches two spiraling projectiles, each dealing less damage.")); orAdd35.TryAdd("5", new CreateJevelLegendStruct("SpellMod_Shared_KnockbackOnHit_Medium", SkillPower, "Knocks targets back on hit.")); orAdd35.TryAdd("6", new CreateJevelLegendStruct("SpellMod_Shared_Projectile_RangeAndVelocity", SkillPower, "Increases projectile range and speed.")); ConcurrentDictionary orAdd36 = SkillModList.GetOrAdd("corpseexplosion", new ConcurrentDictionary()); orAdd36.TryAdd("1", new CreateJevelLegendStruct("SpellMod_CorpseExplosion_BonusDamage", SkillPower, "Boosts damage.")); orAdd36.TryAdd("2", new CreateJevelLegendStruct("SpellMod_CorpseExplosion_DoubleImpact", SkillPower, "Triggers a second explosion dealing damage.")); orAdd36.TryAdd("3", new CreateJevelLegendStruct("SpellMod_CorpseExplosion_HealMinions", SkillPower, "Heals allied skeletons and resets lifetime.")); orAdd36.TryAdd("4", new CreateJevelLegendStruct("SpellMod_CorpseExplosion_KillingBlow", SkillPower, "Deals bonus damage to low-health enemies.")); orAdd36.TryAdd("5", new CreateJevelLegendStruct("SpellMod_CorpseExplosion_SkullNova", SkillPower, "Spawns a nova of projectiles that deal damage and inflict Condemn.")); orAdd36.TryAdd("6", new CreateJevelLegendStruct("SpellMod_CorpseExplosion_SnareBonus", SkillPower, "Applies a short snare on enemies.")); orAdd36.TryAdd("7", new CreateJevelLegendStruct("SpellMod_Shared_Cooldown_Medium", SkillPower, "Reduces cooldown.")); orAdd36.TryAdd("8", new CreateJevelLegendStruct("SpellMod_Shared_TargetAoE_IncreaseRange_Medium", SkillPower, "Increases range.")); } } public struct CreateJevelLegendStruct { public string Mod { get; set; } public float Power { get; set; } public string Description { get; set; } public CreateJevelLegendStruct(string mod = "", float power = 1f, string desc = "null") { Mod = mod; Power = power; Description = desc; } } }