Decompiled source of JewelForge v1.0.0

JewelForge.dll

Decompiled 2 weeks ago
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<string>("JewelForge");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("] v");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("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<string>("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<string>("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("<color=#FFCC00>[JewelForge]</color> <color=white>The JewelForge is now open!</color>");
				}
			}
			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<string>(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<string>(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<User>() });
			NativeArray<Entity> val2 = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
			Enumerator<Entity> enumerator = val2.GetEnumerator();
			while (enumerator.MoveNext())
			{
				Entity current = enumerator.Current;
				if (((EntityManager)(ref entityManager)).HasComponent<User>(current))
				{
					User componentData = ((EntityManager)(ref entityManager)).GetComponentData<User>(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<bool>? EnableCommand;

		public static ConfigEntry<bool>? AdminOnlyCommand;

		public static ConfigEntry<int>? TierLevel;

		public static ConfigEntry<float>? SkillModPower;

		public static ConfigEntry<int>? RequiredItemGUID;

		public static ConfigEntry<int>? RequiredItemAmount;

		public static ConfigEntry<string>? ItemName;

		public static void SettingsInit()
		{
			EnableCommand = Conf.Bind<bool>("JewelForge", "Enabled", true, "Enable the 'JewelForge' command.");
			AdminOnlyCommand = Conf.Bind<bool>("JewelForge", "AdminOnly", false, "Restrict the 'JewelForge' command to admins only.");
			RequiredItemGUID = Conf.Bind<int>("JewelForge", "RequiredItemGUID", -598100816, "PrefabGUID of the item required for the JewelForge command.");
			RequiredItemAmount = Conf.Bind<int>("JewelForge", "RequiredItemAmount", 1000, "Number of required items for the JewelForge command.");
			ItemName = Conf.Bind<string>("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<InventoryBuffer>(val))
			{
				return false;
			}
			DynamicBuffer<InventoryBuffer> buffer = ((EntityManager)(ref entityManager)).GetBuffer<InventoryBuffer>(val, false);
			int num = 0;
			Enumerator<InventoryBuffer> 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<InventoryBuffer>(val))
			{
				return false;
			}
			DynamicBuffer<InventoryBuffer> buffer = ((EntityManager)(ref entityManager)).GetBuffer<InventoryBuffer>(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<string, string> skillSynonyms = new Dictionary<string, string> { { "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("<color=red> This command is currently disabled.</color>");
			}
			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("<color=green>[JewelForge]</color> Config reloaded successfully!");
			}
			catch (Exception ex)
			{
				ctx.Reply("<color=red>[JewelForge]</color> 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<string> list = DB.SkillClass.Keys.ToList();
				list.Sort();
				StringBuilder stringBuilder = new StringBuilder();
				stringBuilder.AppendLine("<color=yellow> Available schools:</color>");
				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("<color=white>");
					handler.AppendFormatted(i + 1);
					handler.AppendLiteral(".</color> <color=");
					handler.AppendFormatted(colorForSkill);
					handler.AppendLiteral(">");
					handler.AppendFormatted(value);
					handler.AppendLiteral("</color>");
					stringBuilder3.AppendLine(ref handler);
				}
				ctx.Reply(stringBuilder.ToString());
				return;
			}
			if (!DB.SkillClass.ContainsKey(categoryName.ToLower()))
			{
				ctx.Reply("<color=red> Unknown school '" + categoryName + "'</color>");
				return;
			}
			List<string> 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("<color=");
			handler.AppendFormatted(colorForSkill2);
			handler.AppendLiteral("> Spells in '");
			handler.AppendFormatted(value2);
			handler.AppendLiteral("' school:</color>");
			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("<color=white>");
				handler.AppendFormatted(j + 1);
				handler.AppendLiteral(".</color> <color=");
				handler.AppendFormatted(colorForSkill2);
				handler.AppendLiteral(">");
				handler.AppendFormatted(Capitalize(input));
				handler.AppendLiteral("</color>");
				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("<color=red> Skill '" + userSkillName + "' not found.</color>");
				return;
			}
			string colorForSkill = DB.GetColorForSkill(realSkillName.ToLower());
			string value2 = Capitalize(userSkillName);
			List<string> list = new List<string> { $"<color={colorForSkill}> Modifiers for skill '{value2}':</color>" };
			List<KeyValuePair<string, CreateJevelLegendStruct>> list2 = value.OrderBy((KeyValuePair<string, CreateJevelLegendStruct> k) => int.Parse(k.Key)).ToList();
			foreach (KeyValuePair<string, CreateJevelLegendStruct> item in list2)
			{
				string key = item.Key;
				string description = item.Value.Description;
				list.Add($"<color={colorForSkill}>{key}.</color> <color=white>{description}</color>");
			}
			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("<color=red> Skill '" + userSkillName + "' not found.</color>");
				return;
			}
			if (modsArg.Length != 4)
			{
				ctx.Reply("<color=red> You must provide exactly 4 modifiers.</color>");
				return;
			}
			string[] array = new string[4];
			for (int i = 0; i < 4; i++)
			{
				string text = modsArg[i].ToString();
				if (!value.ContainsKey(text))
				{
					ctx.Reply($"<color=red> Modifier '{text}' is invalid for skill '{userSkillName}'.</color>");
					return;
				}
				array[i] = text;
			}
			if (HasDuplicateModifiers(array))
			{
				ctx.Reply("<color=red> Modifiers cannot be duplicated.</color>");
				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($"<color=red> The forge requires {requiredItemAmount} {value2} to create a jewel.</color>");
			}
			else if (!JewelForgeInventorySystem.TryRemoveItem(senderCharacterEntity, itemGuid, requiredItemAmount))
			{
				ctx.Reply("<color=red> Failed to remove the required items from your inventory.</color>");
			}
			else
			{
				string colorForSkill = DB.GetColorForSkill(realSkillName.ToLower());
				string value3 = Capitalize(userSkillName);
				ctx.Reply($"<color=green> Payment successful.</color> <color=white>Creating your <color={colorForSkill}>{value3}</color> jewel...</color>");
				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<string> 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<PrefabCollectionSystem>();

		private static Dictionary<string, PrefabGUID> 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<string, CreateJevelLegendStruct> 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<DebugEventsSystem>().CreateJewelEvent(user.Index, ref val2);
		}

		private static World GetWorld(string name)
		{
			Enumerator<World> 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<string, ConcurrentDictionary<string, CreateJevelLegendStruct>> SkillModList = new ConcurrentDictionary<string, ConcurrentDictionary<string, CreateJevelLegendStruct>>();

		public static ImmutableDictionary<string, List<string>> SkillClass = ImmutableDictionary.Create<string, List<string>>().Add("blood", new List<string> { "bloodfountain", "bloodrage", "bloodrite", "sanguinecoil", "shadowbolt", "veilofblood" }).Add("chaos", new List<string> { "aftershock", "chaosbarrier", "powersurge", "void", "volley", "veilofchaos" })
			.Add("frost", new List<string> { "coldsnap", "crystallance", "frostbarrier", "frostbat", "icenova", "veiloffrost" })
			.Add("illusion", new List<string> { "misttrance", "mosquito", "phantomaegis", "spectralwolf", "wraithspear", "veilofillusion" })
			.Add("storm", new List<string> { "balllightning", "cyclone", "discharge", "lightningwall", "polarityshift", "veilofstorm" })
			.Add("unholy", new List<string> { "corpseexplosion", "corruptedskull", "deathknight", "soulburn", "wardofthedamned", "veilofbones" });

		public static ImmutableDictionary<string, string> abilityNames = ImmutableDictionary.Create<string, string>().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<string, List<string>> 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<string, CreateJevelLegendStruct> orAdd = SkillModList.GetOrAdd("bloodfountain", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd2 = SkillModList.GetOrAdd("bloodrage", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd3 = SkillModList.GetOrAdd("bloodrite", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd4 = SkillModList.GetOrAdd("sanguinecoil", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd5 = SkillModList.GetOrAdd("shadowbolt", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd6 = SkillModList.GetOrAdd("veilofblood", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd7 = SkillModList.GetOrAdd("aftershock", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd8 = SkillModList.GetOrAdd("chaosbarrier", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd9 = SkillModList.GetOrAdd("powersurge", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd10 = SkillModList.GetOrAdd("void", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd11 = SkillModList.GetOrAdd("volley", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd12 = SkillModList.GetOrAdd("veilofchaos", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd13 = SkillModList.GetOrAdd("coldsnap", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd14 = SkillModList.GetOrAdd("crystallance", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd15 = SkillModList.GetOrAdd("frostbarrier", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd16 = SkillModList.GetOrAdd("frostbat", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd17 = SkillModList.GetOrAdd("icenova", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd18 = SkillModList.GetOrAdd("veiloffrost", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd19 = SkillModList.GetOrAdd("misttrance", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd20 = SkillModList.GetOrAdd("mosquito", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd21 = SkillModList.GetOrAdd("phantomaegis", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd22 = SkillModList.GetOrAdd("spectralwolf", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd23 = SkillModList.GetOrAdd("wraithspear", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd24 = SkillModList.GetOrAdd("veilofillusion", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd25 = SkillModList.GetOrAdd("balllightning", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd26 = SkillModList.GetOrAdd("cyclone", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd27 = SkillModList.GetOrAdd("discharge", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd28 = SkillModList.GetOrAdd("lightningwall", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd29 = SkillModList.GetOrAdd("polarityshift", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd30 = SkillModList.GetOrAdd("veilofstorm", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd31 = SkillModList.GetOrAdd("deathknight", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd32 = SkillModList.GetOrAdd("soulburn", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd33 = SkillModList.GetOrAdd("wardofthedamned", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd34 = SkillModList.GetOrAdd("veilofbones", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd35 = SkillModList.GetOrAdd("corruptedskull", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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<string, CreateJevelLegendStruct> orAdd36 = SkillModList.GetOrAdd("corpseexplosion", new ConcurrentDictionary<string, CreateJevelLegendStruct>());
			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;
		}
	}
}