diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index ffbff04..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(mkdir:*)", - "Bash(grep:*)", - "Bash(rg:*)", - "Bash(sed:*)", - "Bash(find:*)", - "Bash(true)", - "Bash(rm:*)", - "Bash(cp:*)", - "Bash(chmod:*)", - "Bash(./cleanup.sh:*)", - "Bash(bash:*)", - "Bash(ls:*)", - "Bash(python3:*)", - "Bash(msbuild:*)", - "Bash(dotnet build:*)" - ] - }, - "enableAllProjectMcpServers": false -} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9fb5b30..9491a2f 100644 --- a/.gitignore +++ b/.gitignore @@ -360,9 +360,4 @@ MigrationBackup/ .ionide/ # Fody - auto-generated XML schema -FodyWeavers.xsd -/UI_Creation_Manual.md -/UI_Creation_VirindiViewService_Manual.md -/MosswartMassacre/Unused -/MosswartMassacre/Decal.Adapter.csproj -/MosswartMassacre/Decal.Interop.Core.csproj +FodyWeavers.xsd \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index bfdc9a1..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,78 +0,0 @@ -- when we porting flagtracker there mus be no simplification or trunkation of the code -- you can use utility belt for references about how to check views and create them perhaps also for quests. Same with the folder Mag-Tools - -# Icon Implementation Discoveries - -## DECAL Icon System - CRITICAL DIFFERENCES - -### Spell Icons vs Item Icons -**SPELL ICONS**: Use RAW icon values from DECAL FileService SpellTable -- Access via: `fileService.SpellTable.GetById(spellId)` then reflection to find icon property -- **NO OFFSET REQUIRED** - Use raw icon value directly -- Matches original Lua: `game.Character.SpellBook.Get(spellID).Icon` (no offset) - -**ITEM ICONS**: Require MagTools-style offset -- Format: `itemIcon + 0x6000000` -- Used for inventory items, weapons, armor, etc. - -### Working Implementation -```csharp -// For SPELL icons - NO offset -private int GetRealSpellIcon(int spellId) -{ - var fileService = CoreManager.Current.Filter(); - var spell = fileService.SpellTable.GetById(spellId); - // Use reflection to find icon property - return iconValue; // RAW value, no offset -} - -// For ITEM icons - WITH offset -int itemIconId = worldObject.Icon + 0x6000000; -``` - -### VVS Icon Display -- Use `DecalControls.IconColumn` in XML (NOT PictureColumn) -- IconColumn creates HudPictureBox controls automatically -- Set icon via: `((HudPictureBox)control).Image = iconId;` - -### Successful Applications -✅ **Flag Tracker Recalls Tab**: Real spell icons working perfectly -✅ **MagTools Reference**: Item icons with 0x6000000 offset -✅ **Original Lua Compatibility**: Exact replication of flagtracker behavior - -### Implemented Icon Applications -✅ **Flag Tracker Recalls Tab**: Real spell icons working perfectly -✅ **Flag Tracker Cantrips Tab**: Multi-layered icon system implemented -- **Attributes**: Spell icons (Strength, Endurance, etc.) with background support -- **Protection Auras**: Spell icons (Armor, Flame Ward, etc.) -- **Skills**: Dynamic skill icons from character training data - -### Cantrips Tab Icon System (Advanced Implementation) -Based on original Lua flagtracker's sophisticated 3-icon approach: - -```csharp -// Attributes: Background + Spell Icon overlay -["Strength"] = new CantripInfo { - SpellIconId = 1354, // StrengthSelf8 spell icon - BackgroundIconId = 0x060013F9 // UI background icon -}; - -// Protection Auras: Spell icons only -["Armor"] = new CantripInfo { - SpellIconId = 1397 // ArmorSelf8 spell icon -}; - -// Skills: Dynamic skill icons from character data -IconId = GetSkillIconId(skillId) // Real skill icon + 0x6000000 offset -``` - -### Icon Priority System -1. **Background + Spell Overlay**: For attributes (complex layering) -2. **Spell Icons Only**: For protection auras -3. **Skill Icons**: From character skill data (item-style offset) -4. **Fallback**: Default portal icon (0x6002D14) - -### Future Icon Usage -- **Weapons Tab**: 3-layer system (underlay + icon + overlay) from original Lua -- **Luminance Auras**: Could use custom UI icons -- **Society Items**: Could use item icons with proper offset \ No newline at end of file diff --git a/GearCycler/GearCore.cs b/GearCycler/GearCore.cs new file mode 100644 index 0000000..09b380a --- /dev/null +++ b/GearCycler/GearCore.cs @@ -0,0 +1,45 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using Decal.Adapter; +using Decal.Adapter.Wrappers; +using VirindiViewService; +using VirindiViewService.Controls; + +namespace GearCycler +{ + [ComVisible(true)] + [Guid("9b6a07e1-ae78-47f4-b09c-174f6a27d7a3")] // Replace with your own unique GUID if needed + [FriendlyName("GearCycler")] + public class GearCore : PluginBase + { + public HudView view; + private HudButton btnCycle; + + protected override void Startup() + { + try + { + string xml = File.ReadAllText("ViewXML\\mainview.xml"); + view = HudView.ReadXmlLayout(xml); + view.Visible = true; + + btnCycle = (HudButton)view.Controls["btnCycle"]; + btnCycle.Hit += (s, e) => + { + CoreManager.Current.Actions.AddChatText("[GearCycler] Button clicked!", 1); + }; + } + catch (Exception ex) + { + CoreManager.Current.Actions.AddChatText($"[GearCycler] Failed to load UI: {ex.Message}", 1); + } + } + + protected override void Shutdown() + { + btnCycle?.Dispose(); + view?.Dispose(); + } + } +} diff --git a/GearCycler/GearCycler.csproj b/GearCycler/GearCycler.csproj new file mode 100644 index 0000000..b4344de --- /dev/null +++ b/GearCycler/GearCycler.csproj @@ -0,0 +1,81 @@ + + + + + Debug + AnyCPU + {1293560E-2A56-417F-8116-8CE0420DC97C} + Library + Properties + GearCycler + GearCycler + v4.8 + 512 + true + + + true + full + false + bin\Debug\ + TRACE;DEBUG;VVS_REFERENCED;DECAL_INTEROP + prompt + 4 + x86 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\MosswartMassacre\lib\Decal.Adapter.dll + + + False + True + ..\MosswartMassacre\lib\Decal.Interop.Core.DLL + + + False + True + ..\MosswartMassacre\lib\Decal.Interop.Inject.dll + + + + + + + + + + + + ..\MosswartMassacre\lib\VirindiViewService.dll + + + + + + + True + True + Resources.resx + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + \ No newline at end of file diff --git a/GearCycler/Properties/AssemblyInfo.cs b/GearCycler/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c45a3b8 --- /dev/null +++ b/GearCycler/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GearCycler")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GearCycler")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f5462318-d26a-4ab0-8981-80edd9ec9c99")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/GearCycler/Properties/Resources.Designer.cs b/GearCycler/Properties/Resources.Designer.cs new file mode 100644 index 0000000..40b9adf --- /dev/null +++ b/GearCycler/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GearCycler.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GearCycler.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/GearCycler/Properties/Resources.resx b/GearCycler/Properties/Resources.resx new file mode 100644 index 0000000..4fdb1b6 --- /dev/null +++ b/GearCycler/Properties/Resources.resx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/GearCycler/ViewXML/mainView.xml b/GearCycler/ViewXML/mainView.xml new file mode 100644 index 0000000..1300d02 --- /dev/null +++ b/GearCycler/ViewXML/mainView.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/GearCycler/lib/Decal.Adapter.dll b/GearCycler/lib/Decal.Adapter.dll new file mode 100644 index 0000000..c27e132 Binary files /dev/null and b/GearCycler/lib/Decal.Adapter.dll differ diff --git a/GearCycler/lib/Decal.Interop.Core.DLL b/GearCycler/lib/Decal.Interop.Core.DLL new file mode 100644 index 0000000..b8de808 Binary files /dev/null and b/GearCycler/lib/Decal.Interop.Core.DLL differ diff --git a/GearCycler/lib/Decal.Interop.Inject.dll b/GearCycler/lib/Decal.Interop.Inject.dll new file mode 100644 index 0000000..f186c93 Binary files /dev/null and b/GearCycler/lib/Decal.Interop.Inject.dll differ diff --git a/GearCycler/lib/VirindiViewService.dll b/GearCycler/lib/VirindiViewService.dll new file mode 100644 index 0000000..1e3f4fc Binary files /dev/null and b/GearCycler/lib/VirindiViewService.dll differ diff --git a/GearCycler/lib/VirindiViewService.xml b/GearCycler/lib/VirindiViewService.xml new file mode 100644 index 0000000..c43230e --- /dev/null +++ b/GearCycler/lib/VirindiViewService.xml @@ -0,0 +1,386 @@ + + + + VirindiViewService + + + + + Implies Top and Left + + + + + Provides theme elements, which can be drawn by controls. + + + + + Displays an element from the current theme. + + + + + The base class for all Virindi Views controls. + + + + + Called after this control is added to a ControlGroup. This is when the Name and details have been set. + + + + + Add and initialize a child control of this control. The child may be removed by disposing it. + + + + + + Called when a child of this control is disposed. + + + + + + Recursively disposes all children and removes this control from the view, if it is initialized. + + + + + Handles a mouse wheel event. Parent controls must pass this on to applicable children if necessary. + + + + + + + Fires the MouseEvent event for mouse down, and sets this control as the focus control if CanTakeFocus is true. + + Parent controls must pass this on to applicable children if necessary. + + + + + + Fires the MouseEvent event for mouse up as well as the Hit event. + + Parent controls must pass this on to applicable children if necessary. + + + + + + + Fired when the mousedown originated outside the current view. The base version of this method + passes on the event to all children if the 'up' point is within its saved rect. + + Mouseup point + + + + Tracks mouseover and fires the MouseOverChange event, as well as the MouseEvent event for mouse move. + + Parent controls must pass this on to applicable children if necessary. + + + + + + Parses a key message and fires the specific key event methods. + + Key events are only sent to the control with focus. + + + + + + + + + WARNING: ONLY A PARENT CONTROL SHOULD CALL THIS METHOD. + + This method is overridden in derived controls to handle the actual control drawing. Overridden methods should call + the base, draw, and recursively call this method on all child controls. + + + + + + WARNING: ONLY A PARENT CONTROL SHOULD CALL THIS METHOD. + + Notifies a control of changed saved draw options. This method saves its parameters in the Savedxxx properties. + Parent controls should override this method and recursively notify children of their new draw options, altering + their pClipRegion to reflect their new position in the View. + + This base method also fires the DrawStateChange and ThemeChanged events. + + This control's area, relative to the view area. + The theme applied to this control. + The context of this control, eg. inside a listbox. + The position of the View, in game window coordinates. + + + + WARNING: ONLY A PARENT CONTROL SHOULD SET THIS PROPERTY. + + + + + List of XmlAttributes present on the XmlNode that was used to construct this control, if the control was loaded from XML. Otherwise, empty. + + + + + The XmlNode used to construct this control, if the control was loaded from XML. Otherwise, null. + + + + + The name that this control will be initialized with. + + + + + A multiline uneditable scrolling text box. + + + + + A single image control. + + + + + A button using custom images. + + + + + A doubly-linked list with a Dictionary index. Duplicate items are not allowed. + -Add is O(1) + -Contains is O(1) + -Remove is O(1) + -Get/set by index is O(n) + -Insert is O(n) + -RemoveAt is O(n) + Additionally, a cached pointer (with associated index) is kept pointing to the last used index item. + When looking up an item by index, the list is walked from the head, tail, or cached index pointer. + Thus, doing multiple operations in index order is O(1) even without an enumerator. + + + + + + This method gets the node corresponding to a particular index. To get there, + the list is traversed from the head, tail, or cached index pointer (if valid). + + + + + + + Web browser control, using Awesomium (free license version) + + + + + A horizontal scrollbar. + + + + + Summary description for ByteCursor. + + + + + A checkbox with optional associated text. Uses its parent to provide the background. + + + + + A single-line text input box. + + + + + Called before render so the required size of the new target area can be calculated. + The returned value is the size of the desired draw area, not including outer borders and + style-dependent padding. This size must be less than or equal to MaximumSize in each dimension. + + + + + + + Draw this element. When this is called, the background and borders will already have been drawn, and + target will already be in BeginRender. This method should leave the target in render mode. + + + + + + + + A renderer for string-only tooltips. + + + + + Represents an unordered set of items. Duplicates are not allowed. + (This is really just a dictionary which only holds keys.) + Should be used when a collection of non-duplicate items is needed and + the order doesn't matter. + + + + + A series of titled tabs along the top, each one having an associated control which appears + on the bottom when its tab is enabled. + + + + + A progressbar. + + + + + A regular pushbutton-style control. + + + + + Calls the non-hooked IDirect3DDevice9::BeginScene function. When rendering inside a VVS view or texture, use DxTexture.BeginRender() instead. + + + + + + Calls the non-hooked IDirect3DDevice9::EndScene function. When rendering inside a VVS view or texture, use DxTexture.EndRender() instead. + + + + + + Gets the current instance of the VVS bar. + + + + + A console containing game chat. + + + + + Initializes Direct3D drawing and sets the rendertarget to this texture. Calls to this method should be minimized to improve performance. DxTexture.EndRender() must be called after calling this method. + + + + + + + + + + Ends Direct3D rendering and resets the rendertarget. Must be called after DxTexture.BeginRender(). + + + + + Note: Before use, FlushSprite() may need to be called to ensure correct ordering. + + + + + + + + + Note: Before use, you must call BeginUserDrawOperation(). + + + + + + + + + Note: Before use, you must call BeginUserDrawOperation(). + + + + + + + + + + A vertically scrolling list, containing a number of rows and columns. Every row + has the same number and types of columns. Each column contains a specified control type. + + + + + A number of images on top of each other, which always draw in the proper order. + + + + + A simple text display control. Uses its parent to provide the background. + + + + + A container for multiple controls with set locations and sizes within. + + + + + A dropdown list. + + + + + If the context menu is not visible, it is created at the specified point. + + + + + If the context menu is not visible, it is created at the specified point with the specified theme. + + + + + Provides information about an associated tooltip. + + + + + The HudControl that the tip is attached to. + + + + + Deprecated. + Returns the text associated with a tooltip only if the tip contains a cStringRenderer. + + + + + A vertical scrollbar. + + + + + A horizontal slider. + + + + + A control that allows easy access to underlying draw methods. + + + + diff --git a/GearCycler/mainView.xml b/GearCycler/mainView.xml new file mode 100644 index 0000000..d68a2a3 --- /dev/null +++ b/GearCycler/mainView.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/MosswartMassacre.Loader/LoaderCore.cs b/MosswartMassacre.Loader/LoaderCore.cs deleted file mode 100644 index 4aae64c..0000000 --- a/MosswartMassacre.Loader/LoaderCore.cs +++ /dev/null @@ -1,264 +0,0 @@ -using System; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using Microsoft.Win32; -using Decal.Adapter; - -namespace MosswartMassacre.Loader -{ - [FriendlyName("MosswartMassacre.Loader")] - public class LoaderCore : FilterBase - { - private Assembly pluginAssembly; - private Type pluginType; - private object pluginInstance; - private FileSystemWatcher pluginWatcher; - private bool isSubscribedToRenderFrame = false; - private bool needsReload; - - public static string PluginAssemblyNamespace => "MosswartMassacre"; - public static string PluginAssemblyName => $"{PluginAssemblyNamespace}.dll"; - public static string PluginAssemblyGuid => "{8C97E839-4D05-4A5F-B0C8-E8E778654322}"; - - public static bool IsPluginLoaded { get; private set; } - - /// - /// Assembly directory (contains both loader and plugin dlls) - /// - public static string AssemblyDirectory => System.IO.Path.GetDirectoryName(Assembly.GetAssembly(typeof(LoaderCore)).Location); - - public DateTime LastDllChange { get; private set; } - - #region Event Handlers - protected override void Startup() - { - try - { - Core.PluginInitComplete += Core_PluginInitComplete; - Core.PluginTermComplete += Core_PluginTermComplete; - Core.FilterInitComplete += Core_FilterInitComplete; - - // Set up assembly resolution for hot-loaded plugin dependencies - AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; - - // watch the AssemblyDirectory for any .dll file changes - pluginWatcher = new FileSystemWatcher(); - pluginWatcher.Path = AssemblyDirectory; - pluginWatcher.NotifyFilter = NotifyFilters.LastWrite; - pluginWatcher.Filter = "*.dll"; - pluginWatcher.Changed += PluginWatcher_Changed; - pluginWatcher.EnableRaisingEvents = true; - } - catch (Exception ex) - { - Log(ex); - } - } - - private void Core_FilterInitComplete(object sender, EventArgs e) - { - Core.EchoFilter.ClientDispatch += EchoFilter_ClientDispatch; - } - - private void EchoFilter_ClientDispatch(object sender, NetworkMessageEventArgs e) - { - try - { - // Login_SendEnterWorldRequest - if (e.Message.Type == 0xF7C8) - { - //EnsurePluginIsDisabledInRegistry(); - } - } - catch (Exception ex) - { - Log(ex); - } - } - - private void Core_PluginInitComplete(object sender, EventArgs e) - { - try - { - LoadPluginAssembly(); - } - catch (Exception ex) - { - Log(ex); - } - } - - private void Core_PluginTermComplete(object sender, EventArgs e) - { - try - { - UnloadPluginAssembly(); - } - catch (Exception ex) - { - Log(ex); - } - } - - protected override void Shutdown() - { - try - { - Core.PluginInitComplete -= Core_PluginInitComplete; - Core.PluginTermComplete -= Core_PluginTermComplete; - Core.FilterInitComplete -= Core_FilterInitComplete; - AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve; - UnloadPluginAssembly(); - } - catch (Exception ex) - { - Log(ex); - } - } - - private void Core_RenderFrame(object sender, EventArgs e) - { - try - { - if (IsPluginLoaded && needsReload && DateTime.UtcNow - LastDllChange > TimeSpan.FromSeconds(1)) - { - needsReload = false; - Core.RenderFrame -= Core_RenderFrame; - isSubscribedToRenderFrame = false; - LoadPluginAssembly(); - } - } - catch (Exception ex) - { - Log(ex); - } - } - - private void PluginWatcher_Changed(object sender, FileSystemEventArgs e) - { - try - { - // Only reload if it's the main plugin DLL - if (e.Name == PluginAssemblyName) - { - LastDllChange = DateTime.UtcNow; - needsReload = true; - - if (!isSubscribedToRenderFrame) - { - isSubscribedToRenderFrame = true; - Core.RenderFrame += Core_RenderFrame; - } - } - } - catch (Exception ex) - { - Log(ex); - } - } - - private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) - { - try - { - // Extract just the assembly name (without version info) - string assemblyName = args.Name.Split(',')[0] + ".dll"; - string assemblyPath = System.IO.Path.Combine(AssemblyDirectory, assemblyName); - - // If the dependency exists in our plugin directory, load it - if (File.Exists(assemblyPath)) - { - return Assembly.LoadFrom(assemblyPath); - } - } - catch (Exception ex) - { - Log($"AssemblyResolve failed for {args.Name}: {ex.Message}"); - } - - // Return null to let default resolution continue - return null; - } - #endregion - - #region Plugin Loading/Unloading - internal void LoadPluginAssembly() - { - try - { - if (IsPluginLoaded) - { - UnloadPluginAssembly(); - try - { - CoreManager.Current.Actions.AddChatText($"[MosswartMassacre] Reloading {PluginAssemblyName}", 5); - } - catch { } - } - - pluginAssembly = Assembly.Load(File.ReadAllBytes(System.IO.Path.Combine(AssemblyDirectory, PluginAssemblyName))); - pluginType = pluginAssembly.GetType($"{PluginAssemblyNamespace}.PluginCore"); - pluginInstance = Activator.CreateInstance(pluginType); - - // Set the AssemblyDirectory property if it exists - var assemblyDirProperty = pluginType.GetProperty("AssemblyDirectory", BindingFlags.Public | BindingFlags.Static); - assemblyDirProperty?.SetValue(null, AssemblyDirectory); - - // Set the IsHotReload flag if it exists - var isHotReloadProperty = pluginType.GetProperty("IsHotReload", BindingFlags.Public | BindingFlags.Static); - isHotReloadProperty?.SetValue(null, true); - - // The original template doesn't set up Host - it just calls Startup - // The plugin should use CoreManager.Current.Actions instead of MyHost for hot reload scenarios - // We'll set a flag so the plugin knows it's being hot loaded - - // Call Startup method - var startupMethod = pluginType.GetMethod("Startup", BindingFlags.NonPublic | BindingFlags.Instance); - startupMethod.Invoke(pluginInstance, new object[] { }); - - IsPluginLoaded = true; - } - catch (Exception ex) - { - Log(ex); - } - } - - private void UnloadPluginAssembly() - { - try - { - if (pluginInstance != null && pluginType != null) - { - MethodInfo shutdownMethod = pluginType.GetMethod("Shutdown", BindingFlags.NonPublic | BindingFlags.Instance); - shutdownMethod.Invoke(pluginInstance, null); - pluginInstance = null; - pluginType = null; - pluginAssembly = null; - } - IsPluginLoaded = false; - } - catch (Exception ex) - { - Log(ex); - } - } - #endregion - - private void Log(Exception ex) - { - Log(ex.ToString()); - } - - private void Log(string message) - { - File.AppendAllText(System.IO.Path.Combine(AssemblyDirectory, "loader_log.txt"), $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {message}\n"); - try - { - CoreManager.Current.Actions.AddChatText($"[MosswartMassacre.Loader] {message}", 3); - } - catch { } - } - } -} \ No newline at end of file diff --git a/MosswartMassacre.Loader/MosswartMassacre.Loader.csproj b/MosswartMassacre.Loader/MosswartMassacre.Loader.csproj deleted file mode 100644 index 59c8e03..0000000 --- a/MosswartMassacre.Loader/MosswartMassacre.Loader.csproj +++ /dev/null @@ -1,37 +0,0 @@ - - - - net48 - Library - true - x86 - 1.0.0 - 8 - {A1B2C3D4-E5F6-7890-1234-567890ABCDEF} - MosswartMassacre.Loader - MosswartMassacre.Loader - true - - - ..\MosswartMassacre\bin\Debug\ - true - full - - - ..\MosswartMassacre\bin\Release\ - pdbonly - true - - - - ..\MosswartMassacre\lib\Decal.Adapter.dll - False - - - False - False - ..\..\..\..\..\..\Program Files (x86)\Decal 3.0\.NET 4.0 PIA\Decal.Interop.Core.DLL - False - - - \ No newline at end of file diff --git a/MosswartMassacre/.claude/settings.local.json b/MosswartMassacre/.claude/settings.local.json deleted file mode 100644 index e8f289d..0000000 --- a/MosswartMassacre/.claude/settings.local.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "enableAllProjectMcpServers": false -} \ No newline at end of file diff --git a/MosswartMassacre/CLAUDE.md b/MosswartMassacre/CLAUDE.md deleted file mode 100644 index 1c3329b..0000000 --- a/MosswartMassacre/CLAUDE.md +++ /dev/null @@ -1,375 +0,0 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Build Commands - -Build the project: -``` -msbuild MosswartMassacre.csproj /p:Configuration=Release /p:Platform=AnyCPU -``` - -Build debug version: -``` -msbuild MosswartMassacre.csproj /p:Configuration=Debug /p:Platform=AnyCPU -``` - -Restore NuGet packages: -``` -nuget restore packages.config -``` - -Generate installer (post-build, Windows only): -``` -powershell -File scripts/post-build.ps1 -NuGetPackageRoot "%USERPROFILE%\.nuget\packages" -ProjectDir "./" -``` - -Build entire solution from parent directory: -``` -msbuild ../mossy.sln -``` - -## Architecture Overview - -This is a DECAL plugin for Asheron's Call that tracks monster kills and rare item discoveries. The plugin architecture consists of several key components: - -### Core Plugin Framework -- **PluginCore.cs**: Main plugin entry point inheriting from `PluginBase`. Handles Startup/Shutdown lifecycle, event subscriptions (chat, spawn/despawn, login), and coordinates all subsystems. -- **PluginSettings.cs**: Per-character YAML configuration management using YamlDotNet. Settings are stored as `.yaml` in the plugin directory. - -### UI System (VVS Direct Integration) -- **Views/VVSTabbedMainView.cs**: Main tabbed UI using direct VirindiViewService integration. Displays kill stats, rare counts, elapsed time, settings, statistics, and navigation controls. -- **Views/VVSBaseView.cs**: Base class for VVS-based views providing common functionality like window positioning, control access, and resource management. -- **ViewXML/mainViewTabbed.xml**: XML layout definition for the tabbed UI overlay. - -### Communication Systems -- **WebSocket.cs**: Bidirectional WebSocket client connecting to `wss://overlord.snakedesert.se/websocket/` for real-time data streaming (spawns, chat, rares) and remote command reception. -- **HttpCommandServer.cs**: Local HTTP server on port 8085 accepting POST commands for remote control. -- **Telemetry.cs**: Periodic HTTP POST of player stats/position to configured endpoint. - -### Game Integration -- **vTank.cs + VtankControl.cs**: Interface with vTank automation bot for meta state control and **NAVIGATION CONTROL** ✅ -- **MossyInventory.cs**: Inventory change monitoring and logging. -- **DelayedCommandManager.cs**: Queue system for executing chat commands with delays. - -### Utility Components -- **Coordinates.cs + Geometry.cs**: Game coordinate system handling and spatial calculations. -- **Utils.cs**: General utility functions for player position, distance calculations, etc. -- **ManyHook.cs**: Low-level Windows message hooking functionality. - -### Event Processing Flow -1. **Chat Events**: `OnChatText()` in PluginCore.cs:217 parses kill messages using regex patterns, rare discovery messages, and remote commands from allegiance chat. -2. **World Events**: `OnSpawn()`/`OnDespawn()` in PluginCore.cs:150,171 track monster spawning for WebSocket streaming. -3. **Command Processing**: `/mm` command handler in `HandleMmCommand()` at PluginCore.cs:448 provides comprehensive plugin control interface. - -### Important Implementation Notes -- All regex patterns for kill detection are in `IsKilledByMeMessage()` at PluginCore.cs:337 -- Settings auto-save on shutdown and load after character login complete -- WebSocket uses session-based authentication with SharedSecret -- Plugin requires `AllowUnsafeBlocks=true` for P/Invoke operations - -### Dependencies -- **DECAL Framework**: Core AC plugin framework (Decal.Adapter, Decal.Interop.Core, Decal.Interop.D3DService) -- **VirindiViewService**: UI system for game overlays - used directly without wrapper abstraction -- **Newtonsoft.Json**: JSON serialization for WebSocket/HTTP communication -- **YamlDotNet**: YAML configuration file handling -- **utank2-i.dll**: vTank integration library - -### Key Configuration -- Target Framework: .NET Framework 4.8 -- Platform: x86 (required for AC integration) -- Unsafe blocks enabled for low-level operations -- VVS direct integration (no wrapper abstraction layer) -- Post-build script generates NSIS installer - -### Shared Code Structure -The project links to shared code in `../Shared/` containing common utilities for multiple AC plugins including constants, world object wrappers, settings management, and VCS chat system integration. - -## Navigation Visualization Feature ✅ COMPLETED - -### Overview -Successfully implemented complete navigation route comparison feature allowing visualization of VTank .nav files alongside UtilityBelt's active route visualization. Feature is **FULLY FUNCTIONAL** as of May 29, 2025. - -### Key Components Added -1. **NavRoute.cs** - VTank nav file parser and D3D line visualizer -2. **NavVisualization.cs** - Route management and file discovery -3. **Enhanced TabbedMainView.cs** - Navigation tab with controls -4. **Navigation Tab UI** - Dropdown selection, enable/disable, status display - -### Features Implemented -- ✅ Complete VTank .nav file format parsing (all waypoint types) -- ✅ 3D route visualization with red colored lines -- ✅ Support for all nav types: Circular, Linear, Target, Once -- ✅ Registry-based VTank directory detection -- ✅ Tabbed UI integration with existing interface -- ✅ Enable/disable visualization controls -- ✅ Route loading and clearing functionality -- ✅ Comprehensive debug logging system - -### Usage Instructions -1. **Enable**: Check "Enable Navigation Visualization" in Navigation tab -2. **Configure**: Set VTank profiles path in Settings tab (auto-detected) -3. **Select**: Choose route from dropdown and click "Load Route" -4. **View**: Red lines appear in 3D game world showing route path - -### Technical Details -- **Dependencies**: Added Decal.Interop.D3DService reference -- **Performance**: Optimized for large routes (max 500 line segments) -- **Integration**: Seamless addition to existing plugin architecture -- **Memory Management**: Proper D3D object disposal and cleanup - -### Reference Documentation -See `NAVIGATION_IMPLEMENTATION_SUMMARY.md` for complete technical details, implementation notes, and future enhancement opportunities. - ---- - -## GUI Architecture (Enhanced with Navigation Feature) - -### Current Implementation Status -✅ **Tabbed Interface**: Successfully implemented with Navigation, Settings, and Statistics tabs -✅ **BaseView Architecture**: Inherited from UtilityBelt's BaseView pattern -✅ **Advanced Controls**: Dropdown lists, checkboxes, buttons with proper event handling -✅ **Settings Integration**: VTank path configuration in Settings tab -✅ **Resource Management**: Proper disposal and memory management - -### Tabs Implemented -1. **Main Tab**: Kill tracking functionality (original) -2. **Settings Tab**: Configuration including VTank profiles path -3. **Statistics Tab**: Enhanced statistics display -4. **Navigation Tab**: ✅ Route visualization controls (NEW) - -### Future Enhancement Opportunities -1. **Multiple Route Support**: Visualize several routes simultaneously -2. **Route Analysis**: Distance calculations and efficiency metrics -3. **Advanced Visualization**: Waypoint icons and route optimization -4. **Export Features**: Save custom routes or export comparisons - -## VTank Navigation Control Feature ✅ COMPLETED - -### Overview -Successfully implemented complete programmatic control of VTank's navigation system, allowing remote waypoint advancement through the `/mm nextwp` command. Feature is **FULLY FUNCTIONAL** as of May 29, 2025. - -### Breakthrough Achievement -Cracked VTank's internal architecture through reverse engineering and reflection to enable seamless integration between Mosswart Massacre and VTank's navigation system. - -### Key Implementation -- **VtankControl.cs:114-223** - `VtAdvanceWaypoint()` method using precise reflection -- **PluginCore.cs:661-671** - `/mm nextwp` command handler with user feedback -- **Decompiled Analysis** - Complete VTank internal structure mapping - -### Technical Solution -Resolved "Ambiguous match found" reflection error by specifying exact method signatures: -```csharp -Type[] parameterTypes = new Type[] { typeof(object), assembly.GetType("MetaViewWrappers.MVControlEventArgs") }; -var advanceMethod = pluginCoreType.GetMethod("i", - System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, - null, parameterTypes, null); -``` - -### Features Implemented -- ✅ Programmatic waypoint advancement via `/mm nextwp` -- ✅ Navigation state validation (waypoint count, position, nav type) -- ✅ VTank business logic compliance (Target/Once type restrictions) -- ✅ Comprehensive error handling and user feedback -- ✅ Fallback mechanisms for maximum reliability -- ✅ Assembly-based reflection for internal access - -### Architecture Discovery -**VTank Internal Structure**: -``` -vTank.Instance (cExternalInterfaceTrustedRelay) - └── Assembly: utank2-i.dll - └── Type: uTank2.PluginCore - ├── Static Field: PC (PluginCore instance) - │ └── Method: i(object, MVControlEventArgs) ← TARGET - └── Static Field: dz (fallback direct access) - └── Field: o.l (current waypoint index) -``` - -### Usage -Simply type `/mm nextwp` in-game to advance VTank to the next waypoint. Works with Circular and Linear navigation types. - -### Reference Documentation -See `FINDINGS.md` for complete technical breakthrough details, implementation analysis, and reverse engineering discoveries. - -## Universal Plugin Message Interception via Harmony ✅ SUCCESSFULLY IMPLEMENTED - -### Current Status: FULLY FUNCTIONAL - Harmony 1.2.0.1 Integration Complete - -Successfully implemented **universal plugin message interception** using UtilityBelt's Harmony 1.2.0.1 DLL to patch DECAL's core chat methods. All plugin messages are now being captured and streamed! - -### ✅ **IMPLEMENTATION SUCCESS**: -- ✅ **UtilityBelt Compatibility Resolved**: Using same Harmony 1.2.0.1 DLL as UB -- ✅ **Plugin Message Capture Working**: Successfully intercepting [UB], [VI], [VGI], [VTank] messages -- ✅ **WebSocket Streaming Active**: All intercepted messages stream to remote server -- ✅ **No Plugin Conflicts**: All plugins functioning normally with our patches - -### 🎯 What's Working -- **Harmony Framework**: Complete DECAL method interception using Harmony 1.2.0.1 (old API) -- **Dual-Mode Patching**: Successfully patches `HooksWrapper.AddChatText()` and `AddChatTextRaw()` -- **Universal Capture**: Capturing plugin messages from UtilityBelt, VI, VGI, VTank -- **Debug System**: `/mm decalstatus`, `/mm decaldebug`, `/mm harmonyraw` commands -- **WebSocket Integration**: Real-time streaming of all intercepted messages -- **Duplicate Prevention**: Smart logic prevents double-patching same instance - -### 🔧 Technical Solution Implemented - -#### **Harmony Version Resolution** -- **Solution Applied**: Using UtilityBelt's 0Harmony.dll (version 1.2.0.1) -- **API Conversion**: Changed from Harmony 2.x API to Harmony 1.x API -- **Key Changes**: - - `HarmonyLib.Harmony` → `Harmony.HarmonyInstance` - - `new Harmony()` → `HarmonyInstance.Create()` - - Reference points to `C:\Games\Decal Plugins\UtilityBelt\0Harmony.dll` - -#### **Current Patching Architecture** - -1. **DecalHarmonyClean.cs** ✅ WORKING - - **Harmony 1.x Integration**: Uses `Harmony.HarmonyInstance` API - - **Smart Patching**: Avoids duplicates by checking if Host.Actions == HooksWrapper - - **Methods Patched**: `AddChatText(string, int)`, `AddChatText(string, int, int)`, `AddChatTextRaw` variants - - **Debug Logging**: Internal queue-based logging with `/mm harmonyraw` command - -2. **Message Processing Flow** - - All messages (including [Mosswart Massacre]) are captured and streamed - - Debug output filtered to prevent spam but streaming remains active - - WebSocket streaming requires both `AggressiveChatStreamingEnabled` and `WebSocketEnabled` - -### 📊 Performance & Results -- **Messages Intercepted**: Successfully capturing 100+ messages per session -- **Plugin Coverage**: [UB], [VI], [VGI], [VTank] messages all captured -- **Streaming Reliability**: All messages successfully sent to WebSocket endpoint -- **No Performance Impact**: Harmony patches execute efficiently - -### ✅ **COMPLETED: Code Cleanup Plan - All Phases Done (May 31, 2025)** - -**Successfully completed comprehensive codebase cleanup to resolve API JSON encoding errors and remove experimental code:** - -#### **✅ Phase 1: Remove Unused Harmony Experiments** - COMPLETED -**Files Removed (Previously):** -- All experimental Harmony files removed in earlier cleanup sessions -- Kept: `DecalHarmonyClean.cs` (working implementation) - -#### **✅ Phase 2: Remove Failed Direct Hook Attempts** - COMPLETED -**Files Removed (Previously):** -- All failed hook attempt files removed in earlier cleanup sessions -- Direct hooks, COM interceptors, and window monitoring approaches removed - -#### **✅ Phase 3: Clean Debug & Test Commands** - COMPLETED -**Status:** All debug commands were already cleaned up, no obsolete commands found - -#### **✅ Phase 4: Remove Rich Text Formatting** - COMPLETED -**API Error Resolution:** -- **Root Cause Found:** Emoji characters (🎯, ✅, ❌, 🔧, 🔍, 🔄) in chat messages were causing JSON encoding errors -- **Fixed:** All emoji replaced with plain text markers ([OK], [FAIL], [INFO], [WARN]) -- **Files Updated:** `PluginCore.cs`, `VTankChatIntegration.cs`, `VCSIntegration.cs`, `PluginLoadDiagnostic.cs` -- **Result:** API JSON encoding errors resolved - -#### **✅ Phase 5: Clean Project References** - COMPLETED -**Status:** Project references and packages.config were already clean, no unnecessary dependencies found - -#### **✅ Phase 6: Consolidate Integration Classes** - COMPLETED -**Files Removed:** -- `UtilityBeltControl.cs` - Unused UtilityBelt integration (superseded by Harmony) -- `VTankChatIntegration.cs` - Unused VTank chat integration (superseded by Harmony) -- `VCSIntegration.cs` - Unused VCS integration (superseded by Harmony) -- **Project File Updated:** Removed references to deleted integration classes - -#### **✅ Phase 7: Clean Verbose Debug Output** - COMPLETED -**Issue:** Harmony initialization was producing 20+ lines of debug spam in chat -**Resolution:** -- **DecalHarmonyClean.cs:** Removed all verbose `PluginCore.WriteToChat()` debug messages -- **PluginCore.cs:** Simplified Harmony initialization to single success/failure message -- **Result:** Clean startup with just `[OK] Plugin message interception active` - -#### **✅ Phase 8: Remove Development Scaffolding** - COMPLETED -**Files Removed:** -- `PluginLoadDiagnostic.cs` - Development testing utility no longer needed -- **Syntax Errors Fixed:** Corrected string interpolation issues in `DecalHarmonyClean.cs` -- **Project File Updated:** Removed reference to diagnostic file - -### 📋 **Final Testing Checklist** -1. ✅ `/mm decalstatus` - Verify Harmony patches still active -2. ✅ `/mm decaldebug enable` - Test plugin message capture -3. ✅ WebSocket streaming - Confirm no JSON encoding errors -4. ✅ Plugin compatibility - No conflicts with UtilityBelt/VTank -5. ✅ Build verification - All syntax errors resolved -6. ✅ Clean startup - No verbose debug spam, single initialization message - -### 🏗️ Build Configuration -- **Harmony Reference**: `C:\Games\Decal Plugins\UtilityBelt\0Harmony.dll` -- **Copy Local**: False (uses UB's loaded assembly) -- **Target Framework**: .NET 4.8 -- **Platform**: x86 - -## Flag Tracker Feature ✅ IN PROGRESS - VVS Integration - -### Overview -Successfully implemented comprehensive Flag Tracker feature porting the complete flagtracker Lua plugin from UBS to C# using VirindiViewService (VVS). This is a major new feature providing character tracking for augmentations, luminance auras, recall spells, society quests, character flags, cantrips, and weapons. - -### Implementation Status -✅ **Core Framework Completed**: -- FlagTrackerView.cs - Complete 10-tab VVS window -- FlagTrackerData.cs - All data structures ported from Lua -- QuestManager.cs - Quest tracking system -- flagTracker.xml - Comprehensive UI layout - -✅ **Integration Completed**: -- Added Flag Tracker tab to main tabbed view -- Button launches dedicated Flag Tracker window -- VVS inheritance from VVSBaseView -- Proper event handling and resource management - -### Current Issue: VVS HudList Column Access -**Problem**: "Column out of range" errors when populating VVS HudList controls -**Root Cause**: VVS HudList column creation from XML may not be working as expected -**Status**: Implementing safe column access patterns with detailed debugging - -### Files Implemented -1. **Views/FlagTrackerView.cs** - Main Flag Tracker window - - 10-tab structure: Augs, Lum, Recalls, Society, FacHub, Flags, Cantrips, Weapons, Quests, Settings - - VVS HudList population methods with SafeSetListText() helper - - Complete event handling for all refresh buttons - -2. **FlagTrackerData.cs** - Data management - - Complete augmentation data (Death, Skill, Rating, Stat, Resistance, Spec, Misc) - - Luminance aura categories (Nalicana, Seer) - - Recall spell definitions - - Society quest structures - - Character flag categories - - Cantrip and weapon data structures - - Reflection-based DECAL property access - -3. **QuestManager.cs** - Quest tracking system - - DECAL CoreManager integration - - Quest refresh and parsing - -4. **ViewXML/flagTracker.xml** - UI Layout - - 10-tab notebook control - - HudList controls with column definitions - - Comprehensive button and settings controls - -### Technical Approach -- **VVS Direct Integration**: No wrapper abstraction, direct VirindiViewService usage -- **Safe Column Access**: SafeSetListText() method with IndexOutOfRangeException handling -- **Reflection-Based Data Access**: Bypasses DECAL type system issues using raw integer property access -- **Complete Data Preservation**: "No simplification or truncation" as requested by user - -### Architecture Integration -- **Main View Integration**: Flag Tracker button added to mainViewTabbed.xml -- **Event Handling**: OnOpenFlagTrackerClick() in VVSTabbedMainView.cs -- **Static Interface**: OpenFlagTracker(), CloseFlagTracker(), IsOpen() methods -- **Resource Management**: Proper disposal in base VVSBaseView pattern - -### Debug Features Added -- Control initialization status reporting -- Safe column access with detailed error messages -- Column existence validation before access - -### Next Steps -1. Resolve VVS HudList column creation from XML -2. Complete remaining tab data population -3. Implement actual character data retrieval -4. Add settings persistence - ---- \ No newline at end of file diff --git a/MosswartMassacre/ClientTelemetry.cs b/MosswartMassacre/ClientTelemetry.cs deleted file mode 100644 index 78a9791..0000000 --- a/MosswartMassacre/ClientTelemetry.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Diagnostics; -using System.Threading; -using System; - -public class ClientTelemetry -{ - private readonly Process _proc; - - public ClientTelemetry() - { - _proc = Process.GetCurrentProcess(); - } - - /// Working-set memory in bytes. - public long MemoryBytes => _proc.WorkingSet64; - - /// Total open handles. - public int HandleCount => _proc.HandleCount; - - /// CPU utilisation (%) averaged over . - public float GetCpuUsage(int sampleMs = 500) - { - // you can keep your PerformanceCounter variant, but here’s a simpler PID-based way: - var startCpu = _proc.TotalProcessorTime; - var start = DateTime.UtcNow; - Thread.Sleep(sampleMs); - var endCpu = _proc.TotalProcessorTime; - var end = DateTime.UtcNow; - - // CPU‐time used across all cores: - var cpuMs = (endCpu - startCpu).TotalMilliseconds; - var elapsedMs = (end - start).TotalMilliseconds * Environment.ProcessorCount; - return (float)(cpuMs / elapsedMs * 100.0); - } -} diff --git a/MosswartMassacre/DecalHarmonyClean.cs b/MosswartMassacre/DecalHarmonyClean.cs deleted file mode 100644 index 5a6e740..0000000 --- a/MosswartMassacre/DecalHarmonyClean.cs +++ /dev/null @@ -1,557 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Decal.Adapter; -using Decal.Adapter.Wrappers; -using Harmony; // UtilityBelt's Harmony 1.2.0.1 uses old Harmony namespace - -namespace MosswartMassacre -{ - /// - /// Clean Harmony implementation using UtilityBelt's exact pattern - /// Uses same namespace convention, same API, same Harmony package (Lib.Harmony 2.2.2) - /// - public static class DecalHarmonyClean - { - // Use UtilityBelt's namespace pattern - private static readonly string harmonyNamespace = "com.mosswartmassacre.decal"; - private static HarmonyInstance harmonyDecal; - private static bool patchesApplied = false; - internal static int messagesIntercepted = 0; - - // Debug logging for troubleshooting - private static readonly Queue debugLog = new Queue(); - private const int MAX_DEBUG_ENTRIES = 50; - - /// - /// Initialize Harmony patches using UtilityBelt's exact pattern - /// - public static bool Initialize() - { - try - { - // Use UtilityBelt's exact pattern: lazy initialization check + new Harmony() - if (harmonyDecal == null) - harmonyDecal = HarmonyInstance.Create(harmonyNamespace + ".patches"); - - // Apply patches using UtilityBelt's approach - ApplyDecalPatches(); - - return patchesApplied; - } - catch (Exception ex) - { - // Only log critical initialization failures - PluginCore.WriteToChat($"[DECAL] Critical initialization error: {ex.Message}"); - return false; - } - } - - /// - /// Apply patches to DECAL's AddChatText methods using UtilityBelt approach - /// - private static void ApplyDecalPatches() - { - try - { - // PATHWAY 1: Target HooksWrapper.AddChatText - PatchHooksWrapper(); - - // PATHWAY 2: Target Host.Actions.AddChatText (what our plugin uses) - PatchHostActions(); - } - catch - { - // Only log if completely unable to apply any patches - } - } - - /// - /// Patch HooksWrapper.AddChatText methods - /// - private static void PatchHooksWrapper() - { - try - { - Type hooksWrapperType = typeof(HooksWrapper); - - var allAddChatTextMethods = hooksWrapperType.GetMethods(BindingFlags.Public | BindingFlags.Instance) - .Where(m => m.Name == "AddChatText" || m.Name == "AddChatTextRaw").ToArray(); - - foreach (var method in allAddChatTextMethods) - { - var parameters = method.GetParameters(); - - string prefixMethodName = parameters.Length == 2 ? "AddChatTextPrefixHooks" : - parameters.Length == 3 ? "AddChatTextPrefixHooks3" : - "AddChatTextPrefixHooksGeneric"; - - try - { - ApplySinglePatch(method, prefixMethodName); - } - catch - { - } - } - } - catch - { - } - } - - /// - /// Patch Host.Actions.AddChatText methods (what our plugin uses) - /// - private static void PatchHostActions() - { - try - { - if (PluginCore.MyHost?.Actions == null) - { - return; - } - - Type actionsType = PluginCore.MyHost.Actions.GetType(); - - // Check if Host.Actions is already a HooksWrapper (to avoid double patching) - if (actionsType == typeof(HooksWrapper)) - { - // PATHWAY 3: Try to patch at PluginHost level - PatchPluginHost(); - return; - } - - var hostAddChatTextMethods = actionsType.GetMethods(BindingFlags.Public | BindingFlags.Instance) - .Where(m => m.Name == "AddChatText" || m.Name == "AddChatTextRaw").ToArray(); - - foreach (var method in hostAddChatTextMethods) - { - var parameters = method.GetParameters(); - - string prefixMethodName = parameters.Length == 3 ? "AddChatTextPrefixHost" : - parameters.Length == 4 ? "AddChatTextPrefixHost4" : - "AddChatTextPrefixHostGeneric"; - - try - { - ApplySinglePatch(method, prefixMethodName); - } - catch - { - } - } - - // PATHWAY 3: Try to patch at PluginHost level - PatchPluginHost(); - } - catch - { - } - } - - /// - /// Try a different approach - patch the actual chat system or find global instances - /// - private static void PatchPluginHost() - { - try - { - // Try to patch CoreManager.Current.Actions if it's different - try - { - var coreActions = CoreManager.Current?.Actions; - if (coreActions != null && coreActions != PluginCore.MyHost?.Actions) - { - var coreActionsMethods = coreActions.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance) - .Where(m => m.Name == "AddChatText" || m.Name == "AddChatTextRaw" || m.Name == "AddStatusText").ToArray(); - - foreach (var method in coreActionsMethods) - { - var parameters = method.GetParameters(); - - try - { - string prefixMethodName = "AddChatTextPrefixCore" + parameters.Length; - ApplySinglePatch(method, prefixMethodName); - } - catch - { - } - } - } - } - catch - { - } - } - catch - { - } - } - - /// - /// Apply a single patch using UtilityBelt's method - /// - private static void ApplySinglePatch(MethodInfo targetMethod, string prefixMethodName) - { - try - { - // Get our prefix method - var prefixMethod = typeof(DecalPatchMethods).GetMethod(prefixMethodName, - BindingFlags.Static | BindingFlags.Public); - - if (prefixMethod != null) - { - // Use UtilityBelt's exact approach - harmonyDecal.Patch(targetMethod, new HarmonyMethod(prefixMethod)); - patchesApplied = true; - } - } - catch - { - } - } - - /// - /// List available methods for debugging - /// - private static void ListAvailableMethods(Type type) - { - var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance) - .Where(m => m.Name == "AddChatText").ToArray(); - - foreach (var method in methods) - { - var parameters = method.GetParameters(); - string paramInfo = string.Join(", ", parameters.Select(p => p.ParameterType.Name)); - } - } - - /// - /// Clean up patches using UtilityBelt's pattern - /// - public static void Cleanup() - { - try - { - if (harmonyDecal != null && patchesApplied) - { - // Use UtilityBelt's cleanup pattern - harmonyDecal.UnpatchAll(harmonyNamespace + ".patches"); - } - patchesApplied = false; - } - catch - { - } - } - - /// - /// Status checks - /// - public static bool IsActive() => patchesApplied && harmonyDecal != null; - public static int GetMessagesIntercepted() => messagesIntercepted; - - /// - /// Add debug log entry - /// - public static void AddDebugLog(string message) - { - lock (debugLog) - { - debugLog.Enqueue($"{DateTime.Now:HH:mm:ss.fff} {message}"); - while (debugLog.Count > MAX_DEBUG_ENTRIES) - { - debugLog.Dequeue(); - } - } - } - - /// - /// Get debug log entries - /// - public static string[] GetDebugLog() - { - lock (debugLog) - { - return debugLog.ToArray(); - } - } - } - - /// - /// Patch methods for DECAL interception using UtilityBelt's approach - /// - public static class DecalPatchMethods - { - /// - /// Prefix method for HooksWrapper.AddChatText(string, int) - intercepts plugin messages via HooksWrapper - /// - public static bool AddChatTextPrefixHooks(string text, int color) - { - try - { - // Always increment to verify patch is working - DecalHarmonyClean.messagesIntercepted++; - - if (PluginCore.AggressiveChatStreamingEnabled) - { - } - - // Process ALL messages (including our own) for streaming - if (!string.IsNullOrEmpty(text)) - { - // Process the intercepted message - ProcessInterceptedMessage(text, color, "HooksWrapper-2param"); - - // Silent operation - debug output removed - } - - // Always return true to let the original AddChatText continue - return true; - } - catch - { - // Never let our interception break other plugins - return true; - } - } - - /// - /// Prefix method for HooksWrapper.AddChatText(string, int, int) - 3-parameter version - /// - public static bool AddChatTextPrefixHooks3(string text, int color, int target) - { - try - { - DecalHarmonyClean.messagesIntercepted++; - - if (!string.IsNullOrEmpty(text)) - { - ProcessInterceptedMessage(text, color, $"HooksWrapper-3param(target={target})"); - - // Silent operation - debug output removed - } - - return true; - } - catch - { - return true; - } - } - - /// - /// Generic prefix method for any other HooksWrapper AddChatText overloads - /// - public static bool AddChatTextPrefixHooksGeneric(string text) - { - try - { - DecalHarmonyClean.messagesIntercepted++; - - if (!string.IsNullOrEmpty(text)) - { - ProcessInterceptedMessage(text, 0, "HooksWrapper-generic"); - - // Silent operation - debug output removed - } - - return true; - } - catch - { - return true; - } - } - - /// - /// Process intercepted plugin messages - /// - private static void ProcessInterceptedMessage(string text, int color, string source) - { - try - { - // Identify source plugin - string sourcePlugin = IdentifySourcePlugin(text); - - // Add timestamp - var timestamp = DateTime.Now.ToString("HH:mm:ss"); - var fullMessage = $"{timestamp} [{sourcePlugin}] {text}"; - - // Debug logging - - // Stream to WebSocket if both debug streaming AND WebSocket are enabled - if (PluginCore.AggressiveChatStreamingEnabled && PluginCore.WebSocketEnabled) - { - Task.Run(() => WebSocket.SendChatTextAsync(color, text)); - } - } - catch - { - } - } - - /// - /// Identify which plugin sent the message using UtilityBelt's patterns - /// - private static string IdentifySourcePlugin(string text) - { - // Known plugin prefixes - if (text.StartsWith("[VTank]")) return "VTank"; - if (text.StartsWith("[UB]") || text.Contains("UtilityBelt")) return "UtilityBelt"; - if (text.StartsWith("[VGI]")) return "VGI"; - if (text.StartsWith("[VI]")) return "VirindiIntegrator"; - if (text.StartsWith("[GoArrow]")) return "GoArrow"; - if (text.StartsWith("[Meta]")) return "Meta"; - if (text.StartsWith("[VTClassic]")) return "VTClassic"; - - // Pattern-based detection for messages without prefixes - if (text.Contains("Macro started") || text.Contains("Macro stopped")) return "VTank"; - if (text.Contains("Quest data updated")) return "UtilityBelt"; - if (text.Contains("Database read complete")) return "VGI"; - if (text.Contains("Disconnected, retry")) return "VI"; - - return "Unknown"; - } - - // ===== HOST.ACTIONS PREFIX METHODS ===== - - /// - /// Prefix method for Host.Actions.AddChatText(string, int, int) - 3-parameter version - /// - public static bool AddChatTextPrefixHost(string text, int color, int target) - { - try - { - DecalHarmonyClean.messagesIntercepted++; - - if (PluginCore.AggressiveChatStreamingEnabled) - { - } - - if (!string.IsNullOrEmpty(text) && !text.Contains("[Mosswart Massacre]")) - { - ProcessInterceptedMessage(text, color, $"Host.Actions-3param(target={target})"); - - // Silent operation - debug output removed - } - - return true; - } - catch - { - return true; - } - } - - /// - /// Prefix method for Host.Actions.AddChatText(string, int, int, int) - 4-parameter version - /// - public static bool AddChatTextPrefixHost4(string text, int color, int target, int window) - { - try - { - DecalHarmonyClean.messagesIntercepted++; - - if (!string.IsNullOrEmpty(text) && !text.Contains("[Mosswart Massacre]")) - { - ProcessInterceptedMessage(text, color, $"Host.Actions-4param(target={target},window={window})"); - - // Silent operation - debug output removed - } - - return true; - } - catch - { - return true; - } - } - - /// - /// Generic prefix method for any other Host.Actions.AddChatText overloads - /// - public static bool AddChatTextPrefixHostGeneric(string text) - { - try - { - DecalHarmonyClean.messagesIntercepted++; - - if (!string.IsNullOrEmpty(text) && !text.Contains("[Mosswart Massacre]")) - { - ProcessInterceptedMessage(text, 0, "Host.Actions-generic"); - - // Silent operation - debug output removed - } - - return true; - } - catch - { - return true; - } - } - - // ===== COREMANAGER.ACTIONS PREFIX METHODS ===== - - /// - /// Prefix method for CoreManager.Actions methods - trying different instances - /// - public static bool AddChatTextPrefixCore2(string text, int color) - { - try - { - DecalHarmonyClean.messagesIntercepted++; - - if (PluginCore.AggressiveChatStreamingEnabled) - { - } - - if (!string.IsNullOrEmpty(text) && !text.Contains("[Mosswart Massacre]")) - { - ProcessInterceptedMessage(text, color, "CoreActions-2param"); - - // Silent operation - debug output removed - } - - return true; - } - catch - { - return true; - } - } - - /// - /// Prefix method for CoreManager.Actions 3-param methods - /// - public static bool AddChatTextPrefixCore3(string text, int color, int target) - { - try - { - DecalHarmonyClean.messagesIntercepted++; - - if (PluginCore.AggressiveChatStreamingEnabled) - { - } - - if (!string.IsNullOrEmpty(text) && !text.Contains("[Mosswart Massacre]")) - { - ProcessInterceptedMessage(text, color, $"CoreActions-3param(target={target})"); - - // Silent operation - debug output removed - } - - return true; - } - catch - { - return true; - } - } - } -} \ No newline at end of file diff --git a/MosswartMassacre/DelayedCommandManager.cs b/MosswartMassacre/DelayedCommandManager.cs index bf7a400..4976e4b 100644 --- a/MosswartMassacre/DelayedCommandManager.cs +++ b/MosswartMassacre/DelayedCommandManager.cs @@ -28,8 +28,8 @@ namespace MosswartMassacre { while (delayedCommands.Count > 0 && delayedCommands[0].RunAt <= DateTime.UtcNow) { - // Use Decal_DispatchOnChatCommand to ensure other plugins can intercept - PluginCore.DispatchChatToBoxWithPluginIntercept(delayedCommands[0].Command); + PluginCore.WriteToChat($"[Debug] Executing delayed: {delayedCommands[0].Command}"); + CoreManager.Current.Actions.InvokeChatParser(delayedCommands[0].Command); delayedCommands.RemoveAt(0); } diff --git a/MosswartMassacre/FINDINGS.md b/MosswartMassacre/FINDINGS.md deleted file mode 100644 index 0af01a5..0000000 --- a/MosswartMassacre/FINDINGS.md +++ /dev/null @@ -1,304 +0,0 @@ -# VTank Next Waypoint Control - BREAKTHROUGH FINDINGS - -## SUCCESS: VTank Waypoint Advancement WORKING ✅ - -**Date**: May 29, 2025 -**Status**: FULLY FUNCTIONAL -**Command**: `/mm nextwp` - -## The Challenge - -Implementing programmatic control of VTank's "Advance Current Point" button functionality to skip to the next waypoint in a navigation route. This required deep reverse engineering of VTank's internal architecture. - -## Key Technical Breakthrough - -### The "Ambiguous Match Found" Problem -The critical issue was that VTank's `PluginCore` class contains multiple methods named `i`, causing reflection to fail with "Ambiguous match found" when trying to invoke the waypoint advance method. - -### The Solution -Specified exact method signature using parameter types in the `GetMethod()` call: - -```csharp -Type[] parameterTypes = new Type[] { typeof(object), assembly.GetType("MetaViewWrappers.MVControlEventArgs") }; -var advanceMethod = pluginCoreType.GetMethod("i", - System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, - null, parameterTypes, null); -``` - -## Complete VTank Architecture Discovery - -### Core Architecture Components - -#### 1. External Interface Layer -- **Type**: `cExternalInterfaceTrustedRelay` -- **Access**: `vTank.Instance` (singleton pattern) -- **Purpose**: Safe public API facade with permission checking -- **Assembly**: `utank2-i.dll` -- **Permission Levels**: Uses `eExternalsPermissionLevel` enum for access control - -#### 2. Internal Core Logic -- **Type**: `uTank2.PluginCore` -- **Static Instance**: `PC` field (PluginCore singleton) -- **Purpose**: Main plugin implementation containing all core functionality -- **Access Pattern**: External interface delegates to internal PluginCore methods - -#### 3. Navigation System Architecture -``` -Navigation Data Flow: -ExternalInterface.NavCurrent - └── calls: a(eExternalsPermissionLevel.FullUnderlying) - └── returns: PC.NavCurrent - └── accesses: dz.o.l (actual waypoint index storage) -``` - -### Deep Navigation Implementation Details - -#### Navigation State Management -- **Current Waypoint**: `dz.o.l` (int field chain) -- **Total Waypoints**: `dz.o` contains waypoint collection -- **Navigation Type**: Enum values (0=Circular, 1=Linear, 2=Target, 4=Once) -- **Meta State Integration**: `dz.at.f()` and `dz.at.b(value)` for meta state control - -#### Waypoint Advancement Logic (from decompiled source) -```csharp -// VTank's internal advance logic: -if (navType != 2 && navType != 4) // Not Target or Once -{ - if (dz.o.l < totalWaypoints - 1) // Not at end - { - dz.o.l++; // Advance waypoint - } -} -``` - -#### Button Click Handler Chain -1. **UI Button**: "Advance Current Point" in VTank interface -2. **Event Handler**: `i(object A_0, MVControlEventArgs A_1)` method -3. **Permission Check**: Validates navigation state and type -4. **Core Logic**: Calls internal waypoint advancement -5. **State Update**: Updates `dz.o.l` and refreshes UI - -### Permission and Security Model - -#### Access Levels (eExternalsPermissionLevel) -- **LogicObject**: Basic access to cLogic object -- **FullUnderlying**: Complete access to internal state (required for navigation) -- **Permission Validation**: `a(level)` method checks permissions before access - -#### Trust Relationship -- External plugins must be "trusted" to access navigation functions -- VTank validates calling assembly and permission levels -- Reflection bypasses normal permission checks (security consideration) - -### Method Signature Discovery - -#### Navigation Methods in PluginCore -- **Multiple 'i' Methods**: Caused "Ambiguous match found" error -- **Target Method**: `i(object A_0, MVControlEventArgs A_1)` - button event handler -- **Parameter Types**: - - `object` - sender/source object (can be null) - - `MetaViewWrappers.MVControlEventArgs` - VVS event args (can be null) - -#### Reflection Access Pattern -```csharp -// Critical discovery: Must specify exact parameter types -Type[] parameterTypes = new Type[] { - typeof(object), - assembly.GetType("MetaViewWrappers.MVControlEventArgs") -}; -var method = type.GetMethod("i", flags, null, parameterTypes, null); -``` - -### Navigation Type Behaviors - -#### Circular Navigation (Type 0) -- ✅ Advance allowed at any waypoint -- Wraps from last waypoint back to first -- Most common navigation pattern - -#### Linear Navigation (Type 1) -- ✅ Advance allowed until last waypoint -- Stops at final waypoint (no wrap-around) -- Used for point-to-point routes - -#### Target Navigation (Type 2) -- ❌ Advance blocked by design -- Single destination waypoint -- Navigation automatically stops at target - -#### Once Navigation (Type 4) -- ❌ Advance blocked by design -- One-time route execution -- Cannot manually advance waypoints - -### Meta State Integration - -#### Current Meta State Access -- **Getter**: `dz.at.f()` returns current meta state string -- **Setter**: `dz.at.b(value)` sets new meta state -- **Integration**: Navigation events can trigger meta state changes -- **Example**: Rare discoveries trigger "loot_rare" meta state - -### Assembly and Type Discovery - -#### Key Assembly Information -- **File**: `utank2-i.dll` (interface assembly) -- **Namespace**: `uTank2` -- **Main Type**: `PluginCore` -- **Static Fields**: `PC` (PluginCore instance), `dz` (navigation data) - -#### Critical Type Relationships -``` -uTank2.PluginCore (main logic) -├── Static PC: PluginCore instance -├── Static dz: Navigation data container -│ └── Field o: Navigation object -│ └── Field l: Current waypoint index (int) -└── Method i(object, MVControlEventArgs): Advance handler -``` - -### Error Patterns and Solutions - -#### Common Reflection Errors -1. **"Ambiguous match found"**: Multiple methods with same name - - **Solution**: Specify exact parameter types in GetMethod() -2. **Permission Denied**: External interface blocks access - - **Solution**: Use assembly-level reflection to bypass interface -3. **Null Reference**: Static fields not initialized - - **Solution**: Validate object hierarchy before access - -#### Debugging Techniques Used -1. **Type Inspection**: `GetType().Name` to identify actual types -2. **Assembly Analysis**: Loading and inspecting utank2-i.dll -3. **Field Enumeration**: Discovering static fields via reflection -4. **Method Signature Analysis**: Identifying parameter requirements - -### Access Pattern Hierarchy -``` -Application Level: - /mm nextwp command - └── VtankControl.VtAdvanceWaypoint() - └── Validation (waypoints, nav type, position) - └── Assembly.GetType("uTank2.PluginCore") - └── GetField("PC").GetValue(null) - └── GetMethod("i", paramTypes).Invoke(instance, params) - └── VTank Internal Navigation Logic - └── dz.o.l++ (waypoint advancement) -``` - -### Performance Characteristics -- **Reflection Overhead**: Minimal (only on command execution) -- **Memory Impact**: No persistent references to VTank objects -- **UI Responsiveness**: No blocking operations -- **Error Recovery**: Graceful fallback to direct field manipulation - -## Implementation Details - -### File: VtankControl.cs:114-223 -Added `VtAdvanceWaypoint()` method with: -- Navigation validation (waypoint count, current position, nav type) -- Assembly-based reflection to access internal VTank types -- Primary approach: Method invocation via PluginCore.PC.i() -- Fallback approach: Direct field manipulation of dz.o.l -- Comprehensive error handling and user feedback - -### File: PluginCore.cs:661-671 -Added `/mm nextwp` command handler with success/failure messaging. - -## Navigation Type Restrictions -Correctly implemented VTank's business logic: -- **Circular/Linear**: ✅ Advance allowed -- **Target/Once**: ❌ Advance blocked (matches VTank UI behavior) - -## Testing Results -- ✅ Successfully advances waypoint in Circular navigation -- ✅ Properly validates navigation state before advancing -- ✅ Provides clear user feedback on success/failure -- ✅ Handles edge cases (no waypoints, at end of route) -- ✅ Respects VTank's navigation type restrictions - -## Technical Lessons Learned - -1. **Reflection Precision**: When dealing with obfuscated/complex assemblies, always specify exact method signatures using parameter types to avoid ambiguity. - -2. **Assembly Navigation**: External interfaces often provide facade access to internal implementations via assembly type lookups. - -3. **Static Field Patterns**: Many plugin architectures use static fields (like `PC`) to maintain singleton instances for cross-component access. - -4. **Decompiled Code Value**: Reverse engineering provided exact field names (`dz.o.l`) and method signatures crucial for implementation. - -5. **Fallback Strategies**: Implementing multiple access approaches (method invocation + direct field access) increases reliability. - -## Future Enhancement Opportunities - -1. **Previous Waypoint**: Implement `/mm prevwp` command using similar reflection techniques -2. **Jump to Waypoint**: `/mm gotowp ` for direct waypoint targeting -3. **Route Management**: Integration with VTank's route loading/saving functionality -4. **Navigation State Monitoring**: Real-time tracking of waypoint advancement - -## Security Considerations -- Uses private reflection to access VTank internals -- Requires appropriate permissions and trust levels -- No modification of VTank files or persistent state -- Read-only access to navigation configuration - -## Chat Capture System - CRITICAL LOOP PREVENTION ⚠️ - -### The Recursive Loop Problem -When implementing unified chat capture (native + plugin-generated), there's a serious risk of infinite recursion: - -1. Plugin calls `WriteToChat()` → Adds text to chat window -2. Window monitor detects new text → Fires chat event -3. Chat handler encounters error → Calls `WriteToChat()` again -4. **INFINITE LOOP** leading to stack overflow and crash - -### Prevention Mechanisms Implemented - -#### 1. Message Filtering -```csharp -// Block our own plugin messages from being processed -if (text.Contains("[Mosswart Massacre]")) return false; -if (text.Contains("[UnifiedChat]")) return false; -// ... other plugin prefixes -``` - -#### 2. Safe Error Handling -```csharp -catch (Exception ex) -{ - // NEVER use WriteToChat in error handlers! - System.Diagnostics.Debug.WriteLine($"Error: {ex}"); // Safe alternative -} -``` - -#### 3. Recursion Detection -```csharp -private static bool DetectPotentialRecursion() -{ - // Monitor call frequency - if >10 calls in 100ms, likely a loop - if (_recursionDetectionCount > 10) return true; -} -``` - -#### 4. Multiple Safety Layers -- **Content filtering**: Block plugin-generated messages -- **Debug logging**: Use `Debug.WriteLine()` instead of `WriteToChat()` in handlers -- **Frequency monitoring**: Detect rapid-fire calls indicating loops -- **Circuit breaker**: Temporarily disable monitor if recursion detected - -### Implementation Notes -- **NEVER** call `WriteToChat()` from within chat event handlers -- **ALWAYS** filter out your own plugin's messages -- **USE** `System.Diagnostics.Debug.WriteLine()` for error logging in chat handlers -- **TEST** thoroughly with `/mm chattest` command - -This prevention system is **CRITICAL** for stability - without it, the plugin would crash AC client on any WebSocket error. - -## Performance Impact -- Minimal: Reflection calls only on command execution -- No continuous polling or background processing -- Lightweight validation checks before expensive reflection operations - ---- - -**CONCLUSION**: Complete programmatic control of VTank navigation achieved through precise reflection engineering. The `/mm nextwp` command now provides seamless integration between Mosswart Massacre and VTank's navigation system. \ No newline at end of file diff --git a/MosswartMassacre/FlagTrackerData.cs b/MosswartMassacre/FlagTrackerData.cs deleted file mode 100644 index 9ac261d..0000000 --- a/MosswartMassacre/FlagTrackerData.cs +++ /dev/null @@ -1,1932 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Decal.Adapter; -using Decal.Adapter.Wrappers; -using Decal.Filters; -using Mag.Shared.Constants; - -namespace MosswartMassacre -{ - /// - /// Data management class for Flag Tracker - /// Ported from UBS Lua flagtracker data structures - /// - public class FlagTrackerData : IDisposable - { - public FlagTrackerData() - { - InitializeDataStructures(); - } - #region Augmentation Data Structures - public class AugmentationInfo - { - public string Name { get; set; } - public int? IntId { get; set; } - public int Repeatable { get; set; } - public string Trainer { get; set; } - public string Location { get; set; } - public int CurrentValue { get; set; } - public bool IsMaxed => CurrentValue >= Repeatable; - } - - public Dictionary> AugmentationCategories { get; private set; } - - #endregion - - #region Luminance Aura Data Structures - public class LuminanceAuraInfo - { - public string Name { get; set; } - public int IntId { get; set; } - public int Cap { get; set; } - public string QuestFlag { get; set; } // For Seer auras only - public int CurrentValue { get; set; } - } - - public Dictionary> LuminanceAuraCategories { get; private set; } - #endregion - - #region Recall Spell Data Structures - public class RecallSpellInfo - { - public string Name { get; set; } - public int SpellId { get; set; } - public bool IsKnown { get; set; } - public int IconId { get; set; } - public string Category { get; set; } - } - - public List RecallSpells { get; private set; } - #endregion - - #region Society Quest Data Structures - public class SocietyQuestInfo - { - public string Name { get; set; } - public string StartTag { get; set; } - public string EndTag { get; set; } - public QuestType Type { get; set; } - public object[] ExtraData { get; set; } // For type-specific data - } - - public enum QuestType - { - Other = 0, - KillTask = 1, - CollectItem = 2, - QuestTag = 3, - MultiQuestTag = 4 - } - - public Dictionary> SocietyQuests { get; private set; } - #endregion - - #region Character Flag Data Structures - public class CharacterFlagInfo - { - public string Name { get; set; } - public string QuestFlag { get; set; } - public QuestInfoType InfoType { get; set; } - } - - public enum QuestInfoType - { - SolveCount = 1, - ReadyCheck = 2, - StampCheck = 3 - } - - public Dictionary> CharacterFlags { get; private set; } - #endregion - - #region Cantrip Data Structures - public class CantripInfo - { - public string Name { get; set; } - public string Value { get; set; } // "Minor", "Major", "Epic", etc. - public System.Drawing.Color Color { get; set; } - public int? IconId { get; set; } // Skill icon from character skills - public int? SpellIconId { get; set; } // Spell icon (for attributes) - public int? BackgroundIconId { get; set; } // Background icon (for attributes) - public int ComputedIconId { get; set; } // Final resolved icon for display - } - - public Dictionary> Cantrips { get; private set; } - - // Skill name mappings for cantrips that have different names than their skills - private readonly Dictionary SkillCantripReplacements = new Dictionary - { - [15] = "MagicResistance", // MagicDefense - [6] = "Invulnerability", // MeleeDefense - [7] = "Impgrenability", // MissileDefense - [47] = "MissileWeapon", // MissileWeapons - [44] = "HeavyWeapon", // HeavyWeapons - [45] = "LightWeapon", // LightWeapons - [46] = "FinesseWeapon" // FinesseWeapons - }; - #endregion - - #region Weapon Data Structures (Legacy - to be removed) - // Old weapon structure - keeping for compatibility but unused - #endregion - - #region Cached Data - private DateTime lastUpdateTime = DateTime.MinValue; - private Dictionary cachedValues = new Dictionary(); - #endregion - - #region Initialization - private void InitializeDataStructures() - { - InitializeAugmentationData(); - InitializeLuminanceAuraData(); - InitializeRecallSpellData(); - InitializeSocietyQuestData(); - InitializeCharacterFlagData(); - InitializeCantripData(); - InitializeNewWeaponData(); - } - - private void InitializeAugmentationData() - { - AugmentationCategories = new Dictionary> - { - ["Death Augs"] = new List - { - new AugmentationInfo { Name = "Keep Items", IntId = 231, Repeatable = 3, Trainer = "Rohula bint Ludun", Location = "Ayan Baqur" }, // AugmentationLessDeathItemLoss - new AugmentationInfo { Name = "Keep Spells", IntId = 232, Repeatable = 1, Trainer = "Erik Festus", Location = "Ayan Baqur" } // AugmentationSpellsRemainPastDeath - }, - ["Skill Augs"] = new List - { - new AugmentationInfo { Name = "+5 All Skills", IntId = 326, Repeatable = 1, Trainer = "Arianna the Adept", Location = "Bandit Castle" }, // AugmentationJackOfAllTrades - new AugmentationInfo { Name = "+10 Melee Skills", IntId = 300, Repeatable = 1, Trainer = "Carlito Gallo", Location = "Silyun" }, // AugmentationSkilledMelee - new AugmentationInfo { Name = "+10 Magic Skills", IntId = 302, Repeatable = 1, Trainer = "Rahina bint Zalanis", Location = "Zaikhal" }, // AugmentationSkilledMagic - new AugmentationInfo { Name = "+10 Missile Skills", IntId = 301, Repeatable = 1, Trainer = "Kilaf", Location = "Zaikhal" } // AugmentationSkilledMissile - }, - ["Rating Augs"] = new List - { - new AugmentationInfo { Name = "25% Crit Protection", IntId = 233, Repeatable = 1, Trainer = "Piersanti Linante", Location = "Sanamar" }, // AugmentationCriticalDefense - new AugmentationInfo { Name = "1% Critical Chance", IntId = 298, Repeatable = 1, Trainer = "Anfram Mellow", Location = "Ayan Baqur" }, // AugmentationCriticalExpertise - new AugmentationInfo { Name = "3% Critical Damage", IntId = 299, Repeatable = 1, Trainer = "Alishia bint Aldan", Location = "Ayan Baqur" }, // AugmentationCriticalPower - new AugmentationInfo { Name = "3% Damage Rating", IntId = 309, Repeatable = 1, Trainer = "Neela Nashua", Location = "Bandit Castle" }, // AugmentationDamageBonus - new AugmentationInfo { Name = "3% Damage Reduction", IntId = 310, Repeatable = 1, Trainer = "Emily Yarow", Location = "Cragstone" } // AugmentationDamageReduction - }, - ["Burden / Pack Augs"] = new List - { - new AugmentationInfo { Name = "Extra Carrying Capacity", IntId = 230, Repeatable = 5, Trainer = "Husoon", Location = "Zaikhal" }, // AugmentationIncreasedCarryingCapacity - new AugmentationInfo { Name = "Extra Pack Slot", IntId = 229, Repeatable = 1, Trainer = "Dumida bint Ruminre", Location = "Zaikhal" }, // AugmentationExtraPackSlot - new AugmentationInfo { Name = "Infused War Magic", IntId = 297, Repeatable = 1, Trainer = "Raphel Detante", Location = "Silyun" }, // AugmentationInfusedWarMagic - new AugmentationInfo { Name = "Infused Void Magic", IntId = 328, Repeatable = 1, Trainer = "Morathe", Location = "Candeth Keep" }, // AugmentationInfusedVoidMagic - new AugmentationInfo { Name = "Infused Creature Magic", IntId = 294, Repeatable = 1, Trainer = "Gustuv Lansdown", Location = "Cragstone" }, // AugmentationInfusedCreatureMagic - new AugmentationInfo { Name = "Infused Life Magic", IntId = 296, Repeatable = 1, Trainer = "Akemi Fei", Location = "Hebian-To" }, // AugmentationInfusedLifeMagic - new AugmentationInfo { Name = "Infused Item Magic", IntId = 295, Repeatable = 1, Trainer = "Gan Fo", Location = "Hebian-To" } // AugmentationInfusedItemMagic - }, - ["Misc Augs"] = new List - { - new AugmentationInfo { Name = "10% Health Increase", IntId = null, Repeatable = 1, Trainer = "Donatello Linante", Location = "Silyun" }, // No specific property - new AugmentationInfo { Name = "Increased Spell Duration", IntId = 238, Repeatable = 5, Trainer = "Nawamara Ujio", Location = "Mayoi" }, // AugmentationIncreasedSpellDuration - new AugmentationInfo { Name = "Faster HP Regen", IntId = 237, Repeatable = 2, Trainer = "Alison Dulane", Location = "Bandit Castle" }, // AugmentationFasterRegen - new AugmentationInfo { Name = "5% Experience Increase", IntId = 234, Repeatable = 1, Trainer = "Rickard Dumalia", Location = "Silyun" } // AugmentationBonusXp - }, - ["Salvage Augs"] = new List - { - new AugmentationInfo { Name = "Specialized Weapon Tinkering", IntId = 228, Repeatable = 1, Trainer = "Lenor Turk", Location = "Cragstone" }, // AugmentationSpecializeWeaponTinkering - new AugmentationInfo { Name = "Specialized Armor Tinkering", IntId = 226, Repeatable = 1, Trainer = "Joshun Felden", Location = "Cragstone" }, // AugmentationSpecializeArmorTinkering - new AugmentationInfo { Name = "Specialized Item Tinkering", IntId = 225, Repeatable = 1, Trainer = "Brienne Carlus", Location = "Cragstone" }, // AugmentationSpecializeItemTinkering - new AugmentationInfo { Name = "Specialized Magic Item Tinkering", IntId = 227, Repeatable = 1, Trainer = "Burrell Sammrun", Location = "Cragstone" }, // AugmentationSpecializeMagicItemTinkering - new AugmentationInfo { Name = "Specialized Salvaging", IntId = 224, Repeatable = 1, Trainer = "Robert Crow", Location = "Cragstone" }, // AugmentationSpecializeSalvaging - new AugmentationInfo { Name = "25% More Salvage", IntId = 235, Repeatable = 4, Trainer = "Kris Cennis", Location = "Cragstone" }, // AugmentationBonusSalvage - new AugmentationInfo { Name = "5% Imbue Chance", IntId = 236, Repeatable = 1, Trainer = "Lug", Location = "Oolutanga's Refuge" } // AugmentationBonusImbueChance - }, - ["Stat Augs"] = new List - { - new AugmentationInfo { Name = "All Stats", IntId = 217, Repeatable = 10, Trainer = "", Location = "" }, // AugmentationInnateFamily - new AugmentationInfo { Name = "Strength", IntId = 218, Repeatable = 10, Trainer = "Fiun Luunere", Location = "Fiun Outpost" }, // AugmentationInnateStrength - new AugmentationInfo { Name = "Endurance", IntId = 219, Repeatable = 10, Trainer = "Fiun Ruun", Location = "Fiun Outpost" }, // AugmentationInnateEndurance - new AugmentationInfo { Name = "Coordination", IntId = 220, Repeatable = 10, Trainer = "Fiun Bayaas", Location = "Fiun Outpost" }, // AugmentationInnateCoordination - new AugmentationInfo { Name = "Quickness", IntId = 221, Repeatable = 10, Trainer = "Fiun Riish", Location = "Fiun Outpost" }, // AugmentationInnateQuickness - new AugmentationInfo { Name = "Focus", IntId = 222, Repeatable = 10, Trainer = "Fiun Vasherr", Location = "Fiun Outpost" }, // AugmentationInnateFocus - new AugmentationInfo { Name = "Self", IntId = 223, Repeatable = 10, Trainer = "Fiun Noress", Location = "Fiun Outpost" } // AugmentationInnateSelf - }, - ["Resistance Augs"] = new List - { - new AugmentationInfo { Name = "All Resistances", IntId = 239, Repeatable = 2, Trainer = "", Location = "" }, // AugmentationResistanceFamily - new AugmentationInfo { Name = "Blunt", IntId = 242, Repeatable = 2, Trainer = "Nawamara Dia", Location = "Hebian-To" }, // AugmentationResistanceBlunt - new AugmentationInfo { Name = "Pierce", IntId = 241, Repeatable = 2, Trainer = "Kyujo Rujen", Location = "Hebian-To" }, // AugmentationResistancePierce - new AugmentationInfo { Name = "Slashing", IntId = 240, Repeatable = 2, Trainer = "Ilin Wis", Location = "Hebian-To" }, // AugmentationResistanceSlash - new AugmentationInfo { Name = "Fire", IntId = 244, Repeatable = 2, Trainer = "Rikshen Ri", Location = "Hebian-To" }, // AugmentationResistanceFire - new AugmentationInfo { Name = "Frost", IntId = 245, Repeatable = 2, Trainer = "Lu Bao", Location = "Hebian-To" }, // AugmentationResistanceFrost - new AugmentationInfo { Name = "Acid", IntId = 243, Repeatable = 2, Trainer = "Shujio Milao", Location = "Hebian-To" }, // AugmentationResistanceAcid - new AugmentationInfo { Name = "Lightning", IntId = 246, Repeatable = 2, Trainer = "Enli Yuo", Location = "Hebian-To" } // AugmentationResistanceLightning - } - }; - } - - private void InitializeLuminanceAuraData() - { - LuminanceAuraCategories = new Dictionary> - { - ["Nalicana Auras"] = new List - { - new LuminanceAuraInfo { Name = "+1 Aetheria Proc Rating", IntId = 338, Cap = 5 }, // LumAugSurgeChanceRating - new LuminanceAuraInfo { Name = "+1 Damage Reduction Rating", IntId = 334, Cap = 5 }, // LumAugDamageReductionRating - new LuminanceAuraInfo { Name = "+1 Crit Reduction Rating", IntId = 336, Cap = 5 }, // LumAugCritReductionRating - new LuminanceAuraInfo { Name = "+1 Damage Rating", IntId = 333, Cap = 5 }, // LumAugDamageRating - new LuminanceAuraInfo { Name = "+1 Crit Damage Rating", IntId = 335, Cap = 5 }, // LumAugCritDamageRating - new LuminanceAuraInfo { Name = "+1 Heal Rating", IntId = 342, Cap = 5 }, // LumAugHealingRating - new LuminanceAuraInfo { Name = "+1 Equipment Mana Rating", IntId = 339, Cap = 5 }, // LumAugItemManaUsage - new LuminanceAuraInfo { Name = "+1 Mana Stone Rating", IntId = 340, Cap = 5 }, // LumAugItemManaGain - new LuminanceAuraInfo { Name = "+1 Crafting Skills", IntId = 343, Cap = 5 }, // LumAugSkilledCraft - new LuminanceAuraInfo { Name = "+1 All Skills", IntId = 365, Cap = 10 } // LumAugAllSkills - }, - ["Seer Auras"] = new List - { - new LuminanceAuraInfo { Name = "(Ka'hiri) +2 Specialized Skills", IntId = 344, Cap = 5, QuestFlag = "LoyalToKahiri" }, // LumAugSkilledSpec - new LuminanceAuraInfo { Name = "(Ka'hiri) +1 Damage Rating", IntId = 333, Cap = 5, QuestFlag = "LoyalToKahiri" }, // LumAugDamageRating - new LuminanceAuraInfo { Name = "(Shade of Lady Adja) +2 Specialized Skills", IntId = 344, Cap = 5, QuestFlag = "LoyalToShadeOfLadyAdja" }, // LumAugSkilledSpec - new LuminanceAuraInfo { Name = "(Shade of Lady Adja) +1 Damage Reduction Rating", IntId = 334, Cap = 5, QuestFlag = "LoyalToShadeOfLadyAdja" }, // LumAugDamageReductionRating - new LuminanceAuraInfo { Name = "(Liam of Gelid) +1 Damage Rating", IntId = 333, Cap = 5, QuestFlag = "LoyalToLiamOfGelid" }, // LumAugDamageRating - new LuminanceAuraInfo { Name = "(Liam of Gelid) +1 Crit Damage Rating", IntId = 335, Cap = 5, QuestFlag = "LoyalToLiamOfGelid" }, // LumAugCritDamageRating - new LuminanceAuraInfo { Name = "(Lord Tyragar) +1 Crit Reduction Rating", IntId = 336, Cap = 5, QuestFlag = "LoyalToLordTyragar" }, // LumAugCritReductionRating - new LuminanceAuraInfo { Name = "(Lord Tyragar) +1 Damage Reduction Rating", IntId = 334, Cap = 5, QuestFlag = "LoyalToLordTyragar" } // LumAugDamageReductionRating - } - }; - } - - private void InitializeRecallSpellData() - { - RecallSpells = new List - { - new RecallSpellInfo { Name = "Recall the Sanctuary", SpellId = 2023, IconId = 0, Category = "Basic Recalls" }, - new RecallSpellInfo { Name = "Aerlinthe Recall", SpellId = 2041, IconId = 0, Category = "Island Recalls" }, - new RecallSpellInfo { Name = "Mount Lethe Recall", SpellId = 2813, IconId = 0, Category = "Island Recalls" }, - new RecallSpellInfo { Name = "Recall Aphus Lassel", SpellId = 2931, IconId = 0, Category = "Island Recalls" }, - new RecallSpellInfo { Name = "Ulgrim's Recall", SpellId = 2941, IconId = 0, Category = "Special Recalls" }, - new RecallSpellInfo { Name = "Recall to the Singularity Caul", SpellId = 2943, IconId = 0, Category = "Island Recalls" }, - new RecallSpellInfo { Name = "Glenden Wood Recall", SpellId = 3865, IconId = 0, Category = "Town Recalls" }, - new RecallSpellInfo { Name = "Bur Recall", SpellId = 4084, IconId = 0, Category = "Town Recalls" }, - new RecallSpellInfo { Name = "Call of the Mhoire Forge", SpellId = 4128, IconId = 0, Category = "Special Recalls" }, - new RecallSpellInfo { Name = "Paradox-touched Olthoi Infested Area Recall", SpellId = 4198, IconId = 0, Category = "Special Recalls" }, - new RecallSpellInfo { Name = "Colosseum Recall", SpellId = 4213, IconId = 0, Category = "Special Recalls" }, - new RecallSpellInfo { Name = "Return to the Keep", SpellId = 4214, IconId = 0, Category = "Special Recalls" }, - new RecallSpellInfo { Name = "Gear Knight Invasion Area Camp Recall", SpellId = 5330, IconId = 0, Category = "Special Recalls" }, - new RecallSpellInfo { Name = "Lost City of Neftet Recall", SpellId = 5541, IconId = 0, Category = "Special Recalls" }, - new RecallSpellInfo { Name = "Rynthid Recall", SpellId = 6150, IconId = 0, Category = "Special Recalls" }, - new RecallSpellInfo { Name = "Viridian Rise Recall", SpellId = 6321, IconId = 0, Category = "Special Recalls" }, - new RecallSpellInfo { Name = "Viridian Rise Great Tree Recall", SpellId = 6322, IconId = 0, Category = "Special Recalls" } - }; - } - - private void InitializeSocietyQuestData() - { - SocietyQuests = new Dictionary>(); - // TODO: Initialize society quest data from Lua - } - - private void InitializeCharacterFlagData() - { - CharacterFlags = new Dictionary> - { - ["Additional Skill Credits"] = new List - { - new CharacterFlagInfo { Name = "+1 Skill Lum Aura", QuestFlag = "lumaugskillquest", InfoType = QuestInfoType.SolveCount }, - new CharacterFlagInfo { Name = "+1 Skill Aun Ralirea", QuestFlag = "arantahkill1", InfoType = QuestInfoType.SolveCount }, - new CharacterFlagInfo { Name = "+1 Skill Chasing Oswald", QuestFlag = "oswaldmanualcompleted", InfoType = QuestInfoType.SolveCount } - }, - ["Aetheria"] = new List - { - new CharacterFlagInfo { Name = "Blue Aetheria (75)", QuestFlag = "efulcentermanafieldused", InfoType = QuestInfoType.StampCheck }, - new CharacterFlagInfo { Name = "Yellow Aetheria (150)", QuestFlag = "efmlcentermanafieldused", InfoType = QuestInfoType.StampCheck }, - new CharacterFlagInfo { Name = "Red Aetheria (225)", QuestFlag = "efllcentermanafieldused", InfoType = QuestInfoType.StampCheck } - } - // TODO: Add remaining character flag categories - }; - } - - private void InitializeCantripData() - { - Cantrips = new Dictionary> - { - ["Specialized Skills"] = new Dictionary(), // Dynamically populated - ["Trained Skills"] = new Dictionary(), // Dynamically populated - ["Attributes"] = new Dictionary(), // Dynamically populated when cantrips are detected - ["Protection Auras"] = new Dictionary - { - // Pre-populate all protection auras so they show as red when missing - ["Armor"] = new CantripInfo { Name = "Armor", Value = "N/A", Color = System.Drawing.Color.White }, - ["Bludgeoning Ward"] = new CantripInfo { Name = "Bludgeoning Ward", Value = "N/A", Color = System.Drawing.Color.White }, - ["Piercing Ward"] = new CantripInfo { Name = "Piercing Ward", Value = "N/A", Color = System.Drawing.Color.White }, - ["Slashing Ward"] = new CantripInfo { Name = "Slashing Ward", Value = "N/A", Color = System.Drawing.Color.White }, - ["Flame Ward"] = new CantripInfo { Name = "Flame Ward", Value = "N/A", Color = System.Drawing.Color.White }, - ["Frost Ward"] = new CantripInfo { Name = "Frost Ward", Value = "N/A", Color = System.Drawing.Color.White }, - ["Acid Ward"] = new CantripInfo { Name = "Acid Ward", Value = "N/A", Color = System.Drawing.Color.White }, - ["Storm Ward"] = new CantripInfo { Name = "Storm Ward", Value = "N/A", Color = System.Drawing.Color.White } - } - }; - } - - #endregion - - #region Refresh Methods - public void RefreshAll() - { - RefreshCachedData(); - RefreshAugmentations(); - RefreshLuminanceAuras(); - RefreshRecallSpells(); - RefreshSocietyQuests(); - RefreshFacilityHubQuests(); - RefreshCharacterFlags(); - RefreshCantrips(); - } - - public void RefreshCachedData() - { - try - { - if (CoreManager.Current?.CharacterFilter?.Name != null) - { - // Update cached values - var character = CoreManager.Current.CharacterFilter; - lastUpdateTime = DateTime.Now; - - // TODO: Implement cached data refresh - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing cached data: {ex.Message}"); - } - } - - public void RefreshAugmentations() - { - try - { - if (CoreManager.Current?.CharacterFilter?.Name == null) return; - - var character = CoreManager.Current.CharacterFilter; - - // Update augmentation values - foreach (var category in AugmentationCategories) - { - foreach (var aug in category.Value) - { - if (aug.IntId.HasValue) - { - // Get augmentation value from character data using DECAL API - try - { - if (CoreManager.Current?.CharacterFilter != null) - { - var characterFilter = CoreManager.Current.CharacterFilter; - var playerObject = CoreManager.Current.WorldFilter[characterFilter.Id]; - - if (playerObject != null) - { - // Use CharacterFilter.GetCharProperty for character properties - try - { - // DECAL API uses CharacterFilter.GetCharProperty for character properties - aug.CurrentValue = characterFilter.GetCharProperty(aug.IntId.Value); - } - catch - { - // Try alternative access using reflection - try - { - var valuesMethod = playerObject.GetType().GetMethod("Values", new Type[] { typeof(int) }); - if (valuesMethod != null) - { - aug.CurrentValue = (int)valuesMethod.Invoke(playerObject, new object[] { aug.IntId.Value }); - } - else - { - aug.CurrentValue = 0; - } - } - catch - { - aug.CurrentValue = 0; - } - } - } - else - { - aug.CurrentValue = 0; - } - } - else - { - aug.CurrentValue = 0; - } - } - catch - { - aug.CurrentValue = 0; - } - } - else - { - // Handle special case for Asheron's Lesser Benediction (inventory count) - if (aug.Name == "Asheron's Lesser Benediction") - { - // Count Asheron's Lesser Benediction items in inventory - aug.CurrentValue = CountAsheronsLesserBenediction(); - } - } - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing augmentations: {ex.Message}"); - } - } - - private int CountAsheronsLesserBenediction() - { - try - { - int count = 0; - - // Search inventory for Asheron's Lesser Benediction - foreach (WorldObject item in CoreManager.Current.WorldFilter.GetInventory()) - { - if (item.Name.Contains("Asheron's Lesser Benediction")) - { - // Use stack size for item count (default to 1 for non-stackable items) - try - { - // Access stack size using reflection to avoid type issues - var stackMethod = item.GetType().GetMethod("Values", new Type[] { typeof(int) }); - if (stackMethod != null) - { - int stackSize = (int)stackMethod.Invoke(item, new object[] { 12 }); // 12 = StackSize - count += Math.Max(1, stackSize); - } - else - { - count += 1; // Default to 1 - } - } - catch - { - count += 1; // Default fallback - } - } - } - - return count; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error counting Asheron's Lesser Benediction: {ex.Message}"); - return 0; - } - } - - public void RefreshLuminanceAuras() - { - try - { - if (CoreManager.Current?.CharacterFilter?.Name == null) return; - - var characterFilter = CoreManager.Current.CharacterFilter; - - // Update luminance aura values - foreach (var category in LuminanceAuraCategories) - { - foreach (var aura in category.Value) - { - try - { - // Use CharacterFilter.GetCharProperty for luminance auras - aura.CurrentValue = characterFilter.GetCharProperty(aura.IntId); - } - catch - { - aura.CurrentValue = 0; - } - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing luminance auras: {ex.Message}"); - } - } - - public void RefreshRecallSpells() - { - try - { - if (CoreManager.Current?.CharacterFilter?.Name == null) return; - - var characterFilter = CoreManager.Current.CharacterFilter; - int knownCount = 0; - - // Check each recall spell to see if the character knows it - foreach (var recall in RecallSpells) - { - try - { - // Use DECAL API to check if the character knows this spell - recall.IsKnown = characterFilter.IsSpellKnown(recall.SpellId); - if (recall.IsKnown) knownCount++; - - // Get spell icon from FileService if not already set - if (recall.IconId == 0) - { - recall.IconId = GetSpellIcon(recall.SpellId); - } - } - catch - { - recall.IsKnown = false; - } - } - - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing recall spells: {ex.Message}"); - } - } - - private int GetSpellIcon(int spellId) - { - try - { - // Try to get real spell icon first (matches original Lua approach) - int realSpellIcon = GetRealSpellIcon(spellId); - if (realSpellIcon != 0) - { - return realSpellIcon; - } - - // Fallback to known recall spell icons - var recallSpellIcons = new Dictionary - { - // Recall spell icons from AC spell data - [2023] = 2943, // Recall the Sanctuary - [2041] = 2814, // Aerlinthe Recall - [2813] = 2813, // Mount Lethe Recall - [2931] = 2931, // Recall Aphus Lassel - [2943] = 2943, // Recall to the Singularity Caul - [3865] = 3864, // Glenden Wood Recall - [4084] = 4084, // Bur Recall - [2941] = 2814, // Ulgrim's Recall (uses portal icon) - [4128] = 4128, // Call of the Mhoire Forge - [4198] = 4197, // Paradox-touched Olthoi Infested Area Recall - [4213] = 4213, // Colosseum Recall - [4214] = 4199, // Return to the Keep - [5330] = 5175, // Gear Knight Invasion Area Camp Recall - [5541] = 5541, // Lost City of Neftet Recall - [6150] = 6150, // Rynthid Recall - [6321] = 6321, // Viridian Rise Recall - [6322] = 6322 // Viridian Rise Great Tree Recall - }; - - if (recallSpellIcons.ContainsKey(spellId)) - { - // Add offset for spell icons - return recallSpellIcons[spellId] + 0x6000000; - } - - // Final fallback - default portal/recall icon - return 0x6002D14; - } - catch - { - return 0x6002D14; // Default icon on error - } - } - - private int GetRealSpellIcon(int spellId) - { - try - { - // Method 1: Use DECAL FileService SpellTable directly (proper API approach) - try - { - var fileService = CoreManager.Current.Filter(); - if (fileService?.SpellTable != null) - { - var spell = fileService.SpellTable.GetById(spellId); - if (spell != null) - { - // Use reflection to access the internal Spell_Class object - // DECAL's Spell wrapper has an internal m_pSpell field that contains the actual data - var spellType = spell.GetType(); - - // Try to get the internal spell object first - var internalSpellField = spellType.GetField("m_pSpell", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - if (internalSpellField != null) - { - var internalSpell = internalSpellField.GetValue(spell); - if (internalSpell != null) - { - // Now get the icon from the internal spell object - var internalType = internalSpell.GetType(); - - // Try icon properties on the internal object - string[] iconPropertyNames = { "Icon", "icon", "IconId", "iconId", "IconID", "iconID" }; - foreach (var propName in iconPropertyNames) - { - try - { - // Try as property - var iconProperty = internalType.GetProperty(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - if (iconProperty != null) - { - var iconValue = iconProperty.GetValue(internalSpell, null); - if (iconValue is int iconInt && iconInt > 0) - { - // Spell icons use raw values (no offset) - return iconInt; - } - else if (iconValue is uint iconUint && iconUint > 0) - { - return (int)iconUint; - } - } - - // Try as field - var iconField = internalType.GetField(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - if (iconField != null) - { - var iconValue = iconField.GetValue(internalSpell); - if (iconValue is int iconInt && iconInt > 0) - { - return iconInt; - } - else if (iconValue is uint iconUint && iconUint > 0) - { - return (int)iconUint; - } - } - } - catch - { - // Continue trying other property names - } - } - } - } - - // Fallback: Try direct properties on the wrapper - string[] wrapperPropertyNames = { "Icon", "IconId", "IconID" }; - foreach (var propName in wrapperPropertyNames) - { - var iconProperty = spellType.GetProperty(propName, BindingFlags.Public | BindingFlags.Instance); - if (iconProperty != null) - { - var iconValue = iconProperty.GetValue(spell, null); - if (iconValue is int iconId && iconId > 0) - { - return iconId; - } - } - } - } - } - } - catch - { - } - - // Method 2: Use known spell icon mappings for cantrips - // These are based on AC spell icon IDs from spell data - var cantripSpellIcons = new Dictionary - { - // Strength cantrips - use Strength Self VIII icon - [2091] = 1332, // Major Strength - [4325] = 1332, // Epic Strength - [6107] = 1332, // Legendary Strength - - // Endurance cantrips - use Endurance Self VIII icon - [2061] = 1354, // Major Endurance - [4226] = 1354, // Epic Endurance - [6104] = 1354, // Legendary Endurance - - // Coordination cantrips - use Coordination Self VIII icon - [2059] = 1378, // Major Coordination - [4296] = 1378, // Epic Coordination - [6102] = 1378, // Legendary Coordination - - // Quickness cantrips - use Quickness Self VIII icon - [2081] = 1409, // Major Quickness - [4319] = 1409, // Epic Quickness - [6106] = 1409, // Legendary Quickness - - // Focus cantrips - use Focus Self VIII icon - [2067] = 1426, // Major Focus - [4304] = 1426, // Epic Focus - [6105] = 1426, // Legendary Focus - - // Willpower/Self cantrips - use Willpower Self VIII icon - [2091] = 1450, // Major Willpower - [4329] = 1450, // Epic Willpower - [6101] = 1450, // Legendary Willpower - - // Protection Auras - Armor - use Armor Self VIII icon - [2113] = 1316, // Major Armor - [4291] = 1316, // Epic Armor - [6095] = 1316, // Legendary Armor - - // Protection Auras - Physical - [2245] = 1023, // Major Piercing Ward - use Blade Protection Self VIII - [4306] = 1023, // Epic Piercing Ward - [6096] = 1023, // Legendary Piercing Ward - - [2244] = 1114, // Major Slashing Ward - use Piercing Protection Self VIII - [4321] = 1114, // Epic Slashing Ward - [6097] = 1114, // Legendary Slashing Ward - - [2243] = 1138, // Major Bludgeoning Ward - use Bludgeoning Protection Self VIII - [4293] = 1138, // Epic Bludgeoning Ward - [6098] = 1138, // Legendary Bludgeoning Ward - - // Protection Auras - Elemental - [2157] = 1096, // Major Frost Ward - use Cold Protection Self VIII - [4309] = 1096, // Epic Frost Ward - [6100] = 1096, // Legendary Frost Ward - - [2158] = 1035, // Major Flame Ward - use Fire Protection Self VIII - [4294] = 1035, // Epic Flame Ward - [6099] = 1035, // Legendary Flame Ward - - [2149] = 1078, // Major Acid Ward - use Acid Protection Self VIII - [4290] = 1078, // Epic Acid Ward - [6094] = 1078, // Legendary Acid Ward - - [2159] = 1161, // Major Storm Ward - use Lightning Protection Self VIII - [4322] = 1161, // Epic Storm Ward - [6079] = 1161, // Legendary Storm Ward - - // Magic Defense cantrips - use Magic Resistance Self VIII icon - [2249] = 610, // Major Magic Resistance - [4314] = 610, // Epic Magic Resistance - [6067] = 610, // Legendary Magic Resistance - - // Melee Defense cantrips - use Invulnerability Self VIII icon - [2248] = 562, // Major Invulnerability - [4312] = 562, // Epic Invulnerability - [6051] = 562, // Legendary Invulnerability - - // Missile Defense cantrips - use Impregnability Self VIII icon - [2247] = 1562, // Major Impregnability - [4311] = 1562, // Epic Impregnability - [6055] = 1562, // Legendary Impregnability - - // Life Magic cantrips - use Life Magic Mastery Self VIII icon - [2156] = 610, // Major Life Magic Aptitude - [4700] = 610, // Epic Life Magic Aptitude - [6044] = 610, // Legendary Life Magic Aptitude - - // War Magic cantrips - use War Magic Mastery Self VIII icon - [2183] = 634, // Major War Magic Aptitude - [4715] = 634, // Epic War Magic Aptitude - [6075] = 634, // Legendary War Magic Aptitude - - // Creature Enchantment cantrips - use Creature Enchantment Mastery Self VIII icon - [2215] = 586, // Major Creature Enchantment Aptitude - [4689] = 586, // Epic Creature Enchantment Aptitude - [6042] = 586, // Legendary Creature Enchantment Aptitude - - // Item Enchantment cantrips - use Item Enchantment Mastery Self VIII icon - [2249] = 658, // Major Item Enchantment Aptitude - [4697] = 658, // Epic Item Enchantment Aptitude - [6043] = 658, // Legendary Item Enchantment Aptitude - - // Void Magic cantrips - use Void Magic Mastery Self VI icon (no VIII version) - [5427] = 5418, // Major Void Magic Aptitude - [5428] = 5418, // Epic Void Magic Aptitude - [5429] = 5418, // Legendary Void Magic Aptitude - - // Weapon cantrips - [2223] = 522, // Major Heavy Weapon Aptitude - use Heavy Weapon Mastery Self VIII - [4624] = 522, // Epic Heavy Weapon Aptitude - [6073] = 522, // Legendary Heavy Weapon Aptitude - - [2226] = 327, // Major Light Weapon Aptitude - use Light Weapon Mastery Self VI - [4639] = 327, // Epic Light Weapon Aptitude - [6074] = 327, // Legendary Light Weapon Aptitude - - [2227] = 350, // Major Finesse Weapon Aptitude - use Finesse Weapon Mastery Self VI - [4638] = 350, // Epic Finesse Weapon Aptitude - [6072] = 350, // Legendary Finesse Weapon Aptitude - - [2230] = 473, // Major Missile Weapon Aptitude - use Missile Weapon Mastery Self VI - [4713] = 473, // Epic Missile Weapon Aptitude - [6071] = 473, // Legendary Missile Weapon Aptitude - - // Mana Conversion cantrips - use Mana Conversion Mastery Self VIII icon - [2152] = 658, // Major Mana Conversion Prowess - [4705] = 658, // Epic Mana Conversion Prowess - [6048] = 658, // Legendary Mana Conversion Prowess - }; - - if (cantripSpellIcons.ContainsKey(spellId)) - { - int iconId = cantripSpellIcons[spellId]; - // Add offset for spell icons to display correctly in VVS - // Based on MagTools pattern, spell icons need the offset for display - int finalIconId = iconId + 0x6000000; - return finalIconId; - } - - return 0; // No real icon found - } - catch - { - return 0; - } - } - - public void RefreshSocietyQuests() - { - try - { - // TODO: Implement society quest refresh - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing society quests: {ex.Message}"); - } - } - - public void RefreshFacilityHubQuests() - { - try - { - // TODO: Implement facility hub quest refresh - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing facility hub quests: {ex.Message}"); - } - } - - public void RefreshCharacterFlags() - { - try - { - // TODO: Implement character flag refresh - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing character flags: {ex.Message}"); - } - } - - public void RefreshCantrips() - { - try - { - - if (CoreManager.Current?.CharacterFilter?.Name == null) - { - return; - } - - var characterFilter = CoreManager.Current.CharacterFilter; - var playerObject = CoreManager.Current.WorldFilter[characterFilter.Id]; - - if (playerObject == null) - { - return; - } - - - // Clear dynamic skill lists - Cantrips["Specialized Skills"].Clear(); - Cantrips["Trained Skills"].Clear(); - - // Populate skills dynamically based on character's actual training - PopulateCharacterSkills(characterFilter); - - // Reset all cantrips to "N/A" - foreach (var category in Cantrips) - { - foreach (var cantrip in category.Value.Values) - { - cantrip.Value = "N/A"; - cantrip.Color = System.Drawing.Color.White; - } - } - - // Scan active spells for cantrips using CharacterFilter.Enchantments - var enchantments = characterFilter.Enchantments; - if (enchantments != null) - { - for (int i = 0; i < enchantments.Count; i++) - { - var ench = enchantments[i]; - var spell = SpellManager.GetSpell(ench.SpellId); - if (spell != null && spell.CantripLevel != Mag.Shared.Spells.Spell.CantripLevels.None) - { - DetectCantrip(ench.SpellId); - } - } - } - else - { - } - - // Compute final icon IDs for all cantrips after refresh - foreach (var category in Cantrips) - { - foreach (var cantrip in category.Value.Values) - { - cantrip.ComputedIconId = ComputeCantripIcon(cantrip); - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing cantrips: {ex.Message}"); - } - } - - private void PopulateCharacterSkills(CharacterFilter characterFilter) - { - try - { - // Map of skill IDs to skill names - based on DECAL CharFilterSkillType enumeration - // Reference: DECAL API documentation and AC development sources - var skillIdToName = new Dictionary - { - [1] = "Axe", // Retired weapon skill - [2] = "Bow", // Retired weapon skill - [3] = "Crossbow", // Retired weapon skill - [4] = "Dagger", // Retired weapon skill - [5] = "Mace", // Retired weapon skill - [6] = "Melee Defense", // Active defense skill - [7] = "Missile Defense", // Active defense skill - [8] = "Sling", // Retired weapon skill - [9] = "Spear", // Retired weapon skill - [10] = "Staff", // Retired weapon skill - [11] = "Sword", // Retired weapon skill - [12] = "Thrown Weapons", // Retired weapon skill - [13] = "Unarmed Combat", // Retired weapon skill - [14] = "Arcane Lore", // Active magic skill - [15] = "Magic Defense", // Active defense skill - [16] = "Mana Conversion", // Active magic skill - [17] = "Spellcraft", // Unused/Reserved - [18] = "Item Tinkering", // Active tinker skill - [19] = "Assess Person", // Active misc skill - [20] = "Deception", // Active misc skill - [21] = "Healing", // Active misc skill - [22] = "Jump", // Active misc skill - [23] = "Lockpick", // Active misc skill - [24] = "Run", // Active misc skill - [25] = "Awareness", // Unused/Reserved - [26] = "Arms and Armor Repair", // Unused/Reserved - [27] = "Assess Creature", // Active misc skill - [28] = "Weapon Tinkering", // Active tinker skill - [29] = "Armor Tinkering", // Active tinker skill - [30] = "Magic Item Tinkering", // Active tinker skill - [31] = "Creature Enchantment", // Active magic skill - [32] = "Item Enchantment", // Active magic skill - [33] = "Life Magic", // Active magic skill - [34] = "War Magic", // Active magic skill - [35] = "Leadership", // Active misc skill - [36] = "Loyalty", // Active misc skill - [37] = "Fletching", // Active tinker skill - [38] = "Alchemy", // Active tinker skill - [39] = "Cooking", // Active tinker skill - [40] = "Salvaging", // Active tinker skill - [41] = "Two Handed Combat", // Active weapon skill - [42] = "Gearcraft", // Retired tinker skill - [43] = "Void Magic", // Active magic skill - [44] = "Heavy Weapons", // Active weapon skill - [45] = "Light Weapons", // Active weapon skill - [46] = "Finesse Weapons", // Active weapon skill - [47] = "Missile Weapons", // Active weapon skill - [48] = "Shield", // Active weapon skill - [49] = "Dual Wield", // Active weapon skill - [50] = "Recklessness", // Active weapon skill - [51] = "Sneak Attack", // Active weapon skill - [52] = "Dirty Fighting", // Active weapon skill - [53] = "Threat Assessment", // Unused/Reserved - [54] = "Summoning" // Active magic skill - }; - - // Check each skill's training status - foreach (var kvp in skillIdToName) - { - int skillId = kvp.Key; - string skillName = kvp.Value; - - try - { - // Get skill training status using CharacterFilter.Skills - var skillInfo = characterFilter.Skills[(Decal.Adapter.Wrappers.CharFilterSkillType)skillId]; - if (skillInfo == null) continue; - - // Apply skill name replacements for cantrips - if (SkillCantripReplacements.ContainsKey(skillId)) - { - skillName = SkillCantripReplacements[skillId]; - } - - if (skillInfo.Training == Decal.Adapter.Wrappers.TrainingType.Specialized) - { - Cantrips["Specialized Skills"][skillName] = new CantripInfo - { - Name = skillName, - Value = "N/A", - Color = System.Drawing.Color.White - // IconId removed - will be set by spell icon when cantrips are detected - }; - } - else if (skillInfo.Training == Decal.Adapter.Wrappers.TrainingType.Trained) - { - Cantrips["Trained Skills"][skillName] = new CantripInfo - { - Name = skillName, - Value = "N/A", - Color = System.Drawing.Color.White - // IconId removed - will be set by spell icon when cantrips are detected - }; - } - } - catch - { - // Skill not available on this character, skip it - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error populating character skills: {ex.Message}"); - } - } - - private int? GetSkillIconId(int skillId) - { - try - { - var characterFilter = CoreManager.Current.CharacterFilter; - if (characterFilter == null) - { - return GetFallbackSkillIcon(skillId); - } - - // Validate skillId range for DECAL API - if (skillId < 1 || skillId > 54) - { - return GetFallbackSkillIcon(skillId); - } - - try - { - var skillInfo = characterFilter.Skills[(Decal.Adapter.Wrappers.CharFilterSkillType)skillId]; - if (skillInfo == null) - { - return GetFallbackSkillIcon(skillId); - } - - - // Try to access skill icon via reflection (DECAL's SkillInfoWrapper.Dat property) - var skillType = skillInfo.GetType(); - - // Method 1: Try FileService SkillTable approach (most reliable) - int realIconId = GetRealSkillIconFromDat(skillId); - if (realIconId > 0) - { - return realIconId + 0x6000000; - } - - // Method 2: Reflection on SkillInfoWrapper.Dat - var datProperty = skillType.GetProperty("Dat", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - if (datProperty != null) - { - var datObject = datProperty.GetValue(skillInfo, null); - if (datObject != null) - { - var datType = datObject.GetType(); - - // Try the exact property names from AC system - string[] iconPropertyNames = { "IconID", "Icon", "IconId", "uiGraphic", "GraphicID" }; - - foreach (var propName in iconPropertyNames) - { - var iconProperty = datType.GetProperty(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - if (iconProperty != null) - { - var iconValue = iconProperty.GetValue(datObject, null); - if (iconValue != null) - { - if (iconValue is int iconId && iconId > 0) - { - return iconId + 0x6000000; - } - else if (iconValue is uint uiconId && uiconId > 0) - { - return (int)uiconId + 0x6000000; - } - } - } - else - { - // Try as field - var iconField = datType.GetField(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - if (iconField != null) - { - var iconValue = iconField.GetValue(datObject); - if (iconValue != null) - { - if (iconValue is int iconId && iconId > 0) - { - return iconId + 0x6000000; - } - else if (iconValue is uint uiconId && uiconId > 0) - { - return (int)uiconId + 0x6000000; - } - } - } - } - } - - foreach (var prop in datType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) - { - try - { - var val = prop.GetValue(datObject, null); - PluginCore.WriteToChat($" {prop.Name}: {val} ({prop.PropertyType.Name})"); - } - catch (Exception ex) - { - PluginCore.WriteToChat($" {prop.Name}: ({prop.PropertyType.Name})"); - } - } - } - else - { - } - } - else - { - } - - // Method 3: Try direct properties on SkillInfoWrapper - string[] directPropertyNames = { "IconID", "Icon", "IconId", "GraphicID" }; - foreach (var propName in directPropertyNames) - { - var iconProperty = skillType.GetProperty(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - if (iconProperty != null) - { - var iconValue = iconProperty.GetValue(skillInfo, null); - if (iconValue is int iconId && iconId > 0) - { - return iconId + 0x6000000; - } - } - } - } - catch - { - } - - // Fallback to predefined mapping - return GetFallbackSkillIcon(skillId); - } - catch - { - return GetFallbackSkillIcon(skillId); - } - } - - private string GetSkillName(int skillId) - { - var skillNames = new Dictionary - { - [1] = "Axe", [2] = "Bow", [3] = "Crossbow", [4] = "Dagger", [5] = "Mace", - [6] = "Melee Defense", [7] = "Missile Defense", [8] = "Sling", [9] = "Spear", [10] = "Staff", - [11] = "Sword", [12] = "Thrown Weapons", [13] = "Unarmed Combat", [14] = "Arcane Lore", [15] = "Magic Defense", - [16] = "Mana Conversion", [17] = "Spellcraft", [18] = "Item Tinkering", [19] = "Assess Person", [20] = "Deception", - [21] = "Healing", [22] = "Jump", [23] = "Lockpick", [24] = "Run", [25] = "Awareness", - [26] = "Arms and Armor Repair", [27] = "Assess Creature", [28] = "Weapon Tinkering", [29] = "Armor Tinkering", [30] = "Magic Item Tinkering", - [31] = "Creature Enchantment", [32] = "Item Enchantment", [33] = "Life Magic", [34] = "War Magic", [35] = "Leadership", - [36] = "Loyalty", [37] = "Fletching", [38] = "Alchemy", [39] = "Cooking", [40] = "Salvaging", - [41] = "Two Handed Combat", [42] = "Gearcraft", [43] = "Void Magic", [44] = "Heavy Weapons", [45] = "Light Weapons", - [46] = "Finesse Weapons", [47] = "Missile Weapons", [48] = "Shield", [49] = "Dual Wield", [50] = "Recklessness", - [51] = "Sneak Attack", [52] = "Dirty Fighting", [53] = "Threat Assessment", [54] = "Summoning" - }; - - return skillNames.ContainsKey(skillId) ? skillNames[skillId] : $"Unknown({skillId})"; - } - - private int GetRealSkillIconFromDat(int skillId) - { - try - { - // Try using FileService SkillTable directly (similar to CharacterCreation.cs pattern) - var fileService = CoreManager.Current.Filter(); - if (fileService?.SkillTable != null) - { - // Try to get skill data from the skill table - try - { - // Access SkillTable via reflection to get skill data - var skillTableType = fileService.SkillTable.GetType(); - - // Look for methods that can get skill by ID - var methods = skillTableType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - foreach (var method in methods) - { - if (method.Name.Contains("Get") || method.Name.Contains("get") || method.Name == "Item") - { - var parameters = method.GetParameters(); - if (parameters.Length == 1 && (parameters[0].ParameterType == typeof(int) || parameters[0].ParameterType == typeof(uint))) - { - try - { - var skillData = method.Invoke(fileService.SkillTable, new object[] { skillId }); - if (skillData != null) - { - - // Look for icon properties on the skill data - var skillDataType = skillData.GetType(); - string[] iconProps = { "IconID", "Icon", "IconId", "GraphicID", "uiGraphic" }; - - foreach (var propName in iconProps) - { - var iconProp = skillDataType.GetProperty(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - if (iconProp != null) - { - var iconValue = iconProp.GetValue(skillData, null); - if (iconValue is int iconInt && iconInt > 0) - { - return iconInt; - } - else if (iconValue is uint iconUint && iconUint > 0) - { - return (int)iconUint; - } - } - } - } - } - catch - { - // Method call failed, try next one - } - } - } - } - } - catch - { - } - } - else - { - } - - return 0; // No icon found - } - catch - { - return 0; - } - } - - private int? GetFallbackSkillIcon(int skillId) - { - // Use proven working icon IDs from the recall spells system - // These icons are confirmed to display correctly in VVS - var skillIconMap = new Dictionary - { - // Magic Skills - Use magical/mystical icons (from recalls system) - [14] = 0x6002D14, // Arcane Lore - Portal icon (default recall icon) - [16] = 0x60011F9, // Mana Conversion - Green circle (confirmed working) - [31] = 0x6002D14, // Creature Enchantment - Portal icon - [32] = 0x6002D14, // Item Enchantment - Portal icon - [33] = 0x60011F9, // Life Magic - Green circle (life/healing) - [34] = 0x60011F8, // War Magic - Red circle (destruction) - [43] = 0x600287A, // Void Magic - Gray dot (void) - [54] = 0x6002D14, // Summoning - Portal icon - - // Combat Skills - Use distinct working icons - [41] = 0x60011F8, // Two Handed Combat - Red circle - [44] = 0x60011F8, // Heavy Weapons - Red circle - [45] = 0x60028FC, // Light Weapons - Up arrow (from recalls) - [46] = 0x60028FD, // Finesse Weapons - Down arrow (from recalls) - [47] = 0x60020B5, // Missile Weapons - Question mark (from recalls) - [48] = 0x600287A, // Shield - Gray dot - [49] = 0x60011F8, // Dual Wield - Red circle - [50] = 0x60011F8, // Recklessness - Red circle - [51] = 0x600287A, // Sneak Attack - Gray dot - [52] = 0x60011F8, // Dirty Fighting - Red circle - - // Defense Skills - Use defensive icons - [6] = 0x600287A, // Melee Defense - Gray dot - [7] = 0x600287A, // Missile Defense - Gray dot - [15] = 0x600287A, // Magic Defense - Gray dot - - // Misc Skills - Use varied working icons - [19] = 0x60020B5, // Assess Person - Question mark (from recalls) - [20] = 0x60020B5, // Deception - Question mark - [21] = 0x60011F9, // Healing - Green circle - [22] = 0x60028FC, // Jump - Up arrow (motion) - [23] = 0x60020B5, // Lockpick - Question mark - [24] = 0x60028FC, // Run - Up arrow (motion) - [27] = 0x60020B5, // Assess Creature - Question mark - [35] = 0x60020B5, // Leadership - Question mark - [36] = 0x60020B5, // Loyalty - Question mark - - // Craft Skills - Use working craft icons - [18] = 0x600287A, // Item Tinkering - Gray dot - [28] = 0x600287A, // Weapon Tinkering - Gray dot - [29] = 0x600287A, // Armor Tinkering - Gray dot - [30] = 0x600287A, // Magic Item Tinkering - Gray dot - [37] = 0x600287A, // Fletching - Gray dot - [38] = 0x600287A, // Alchemy - Gray dot - [39] = 0x600287A, // Cooking - Gray dot - [40] = 0x600287A, // Salvaging - Gray dot - - // Retired weapon skills - Use weapon-style icons - [1] = 0x60011F8, // Axe - Red circle - [2] = 0x60028FC, // Bow - Up arrow (projectile) - [3] = 0x60028FC, // Crossbow - Up arrow (projectile) - [4] = 0x60011F8, // Dagger - Red circle - [5] = 0x60011F8, // Mace - Red circle - [8] = 0x60028FC, // Sling - Up arrow (projectile) - [9] = 0x60011F8, // Spear - Red circle - [10] = 0x60011F8, // Staff - Red circle - [11] = 0x60011F8, // Sword - Red circle - [12] = 0x60028FC, // Thrown Weapons - Up arrow (projectile) - [13] = 0x60011F8 // Unarmed Combat - Red circle - }; - - if (skillIconMap.ContainsKey(skillId)) - { - return skillIconMap[skillId]; - } - - // Final fallback to proven working icon from recalls system - return 0x6002D14; // Portal icon - confirmed working in recalls - } - - private int ComputeCantripIcon(CantripInfo cantrip) - { - try - { - // Green circle for active cantrips, red circle for missing cantrips - if (cantrip.Value != "N/A") - { - return 0x60011F9; // Green circle - has cantrip - } - else - { - return 0x60011F8; // Red circle - missing cantrip - } - } - catch - { - return 0x60011F8; // Red circle on error - } - } - - private void DetectCantrip(int spellId) - { - try - { - // Get spell name from SpellManager - string spellName = GetSpellName(spellId); - if (string.IsNullOrEmpty(spellName)) - { - return; - } - - // Debug output to see what spells we're processing - - // Define cantrip levels and their patterns - var cantripPatterns = new Dictionary - { - ["Minor"] = ("Minor", System.Drawing.Color.White), - ["Moderate"] = ("Moderate", System.Drawing.Color.Green), - ["Major"] = ("Major", System.Drawing.Color.Blue), - ["Epic"] = ("Epic", System.Drawing.Color.Purple), - ["Legendary"] = ("Legendary", System.Drawing.Color.Orange) - }; - - // Check each cantrip level - foreach (var cantripPattern in cantripPatterns) - { - string pattern = cantripPattern.Key; - var (level, color) = cantripPattern.Value; - - if (!spellName.StartsWith(pattern + " ")) continue; - - // Remove the level prefix to get the skill/attribute name - string skillPart = spellName.Substring(pattern.Length + 1); - - // Get the spell icon for this cantrip spell - int spellIconId = GetRealSpellIcon(spellId); - if (spellIconId == 0) - { - spellIconId = 0x6002D14; // Default fallback icon - } - else - { - } - - // Try to match Protection Auras first (exact format: "Minor Armor", "Epic Bludgeoning Ward") - if (MatchProtectionAura(skillPart, level, color, spellIconId)) - { - return; - } - - // Try to match Attributes (exact format: "Minor Strength", "Epic Focus") - if (MatchAttribute(skillPart, level, color, spellIconId)) - { - return; - } - - // Try to match Skills using the replacement mappings - if (MatchSkill(skillPart, level, color, spellIconId)) - { - return; - } - - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error detecting cantrip for spell {spellId}: {ex.Message}"); - } - } - - private bool MatchProtectionAura(string skillPart, string level, System.Drawing.Color color, int spellIconId) - { - // Map AC cantrip spell names to protection aura names - var protectionMappings = new Dictionary - { - ["Armor"] = "Armor", - ["Bludgeoning Ward"] = "Bludgeoning Ward", - ["Piercing Ward"] = "Piercing Ward", - ["Slashing Ward"] = "Slashing Ward", - ["Flame Ward"] = "Flame Ward", - ["Frost Ward"] = "Frost Ward", - ["Cold Ward"] = "Frost Ward", // AC also uses "Cold Ward" - ["Acid Ward"] = "Acid Ward", - ["Storm Ward"] = "Storm Ward", // AC spell is "Storm Ward" - ["Lightning Ward"] = "Storm Ward", // AC also uses "Lightning Ward" - - // Add more variations that might appear in AC spell names - ["Bludgeoning Protection"] = "Bludgeoning Ward", - ["Piercing Protection"] = "Piercing Ward", - ["Slashing Protection"] = "Slashing Ward", - ["Fire Protection"] = "Flame Ward", - ["Cold Protection"] = "Frost Ward", - ["Acid Protection"] = "Acid Ward", - ["Lightning Protection"] = "Storm Ward", - - // Single word variations - ["Bludgeoning"] = "Bludgeoning Ward", - ["Piercing"] = "Piercing Ward", - ["Slashing"] = "Slashing Ward", - ["Fire"] = "Flame Ward", - ["Flame"] = "Flame Ward", - ["Cold"] = "Frost Ward", - ["Frost"] = "Frost Ward", - ["Acid"] = "Acid Ward", - ["Lightning"] = "Storm Ward", - ["Storm"] = "Storm Ward" - }; - - foreach (var mapping in protectionMappings) - { - if (skillPart.Equals(mapping.Key, StringComparison.OrdinalIgnoreCase)) - { - // Create the cantrip entry if it doesn't exist - if (!Cantrips["Protection Auras"].ContainsKey(mapping.Value)) - { - Cantrips["Protection Auras"][mapping.Value] = new CantripInfo - { - Name = mapping.Value, - Value = "N/A", - Color = System.Drawing.Color.White - }; - } - - var cantrip = Cantrips["Protection Auras"][mapping.Value]; - if (cantrip.Value == "N/A" || IsHigherCantripLevel(level, cantrip.Value)) - { - cantrip.Value = level; - cantrip.Color = color; - cantrip.SpellIconId = spellIconId; // Use the actual spell icon from the cantrip - } - return true; - } - } - return false; - } - - private bool MatchAttribute(string skillPart, string level, System.Drawing.Color color, int spellIconId) - { - // Clean the skill part - remove extra spaces and normalize - string cleanedSkillPart = skillPart.Trim(); - - var attributeMappings = new Dictionary - { - ["Strength"] = "Strength", - ["Endurance"] = "Endurance", - ["Coordination"] = "Coordination", - ["Quickness"] = "Quickness", - ["Focus"] = "Focus", - ["Self"] = "Willpower", // "Minor Self" -> Willpower - ["Willpower"] = "Willpower" // "Epic Willpower" -> Willpower - }; - - - foreach (var mapping in attributeMappings) - { - if (cleanedSkillPart.Equals(mapping.Key, StringComparison.OrdinalIgnoreCase)) - { - - // Create the cantrip entry if it doesn't exist - if (!Cantrips["Attributes"].ContainsKey(mapping.Value)) - { - Cantrips["Attributes"][mapping.Value] = new CantripInfo - { - Name = mapping.Value, - Value = "N/A", - Color = System.Drawing.Color.White - }; - } - - var cantrip = Cantrips["Attributes"][mapping.Value]; - if (cantrip.Value == "N/A" || IsHigherCantripLevel(level, cantrip.Value)) - { - cantrip.Value = level; - cantrip.Color = color; - cantrip.SpellIconId = spellIconId; // Use the actual spell icon from the cantrip - } - return true; - } - } - - // Try more flexible matching - check if the cleaned skill part contains any of our attributes - foreach (var mapping in attributeMappings) - { - if (cleanedSkillPart.IndexOf(mapping.Key, StringComparison.OrdinalIgnoreCase) >= 0) - { - - // Create the cantrip entry if it doesn't exist - if (!Cantrips["Attributes"].ContainsKey(mapping.Value)) - { - Cantrips["Attributes"][mapping.Value] = new CantripInfo - { - Name = mapping.Value, - Value = "N/A", - Color = System.Drawing.Color.White - }; - } - - var cantrip = Cantrips["Attributes"][mapping.Value]; - if (cantrip.Value == "N/A" || IsHigherCantripLevel(level, cantrip.Value)) - { - cantrip.Value = level; - cantrip.Color = color; - cantrip.SpellIconId = spellIconId; // Use the actual spell icon from the cantrip - } - return true; - } - } - - return false; - } - - private bool MatchSkill(string skillPart, string level, System.Drawing.Color color, int spellIconId) - { - // Map actual cantrip spell names to our skill names - var skillMappings = new Dictionary - { - // Defense skills (with AC spell name mappings) - ["Magic Resistance"] = "MagicResistance", - ["Invulnerability"] = "Invulnerability", - ["Impregnability"] = "Impgrenability", // Note: AC uses "Impregnability" not "Impgrenability" - - // Weapon skills (with AC spell name patterns) - ["Heavy Weapon Aptitude"] = "HeavyWeapon", - ["Light Weapon Aptitude"] = "LightWeapon", - ["Finesse Weapon Aptitude"] = "FinesseWeapon", - ["Missile Weapon Aptitude"] = "MissileWeapon", - - // Craft skills (with AC spell name patterns) - ["Alchemical Prowess"] = "Alchemy", - ["Arcane Prowess"] = "Arcane Lore", - ["Armor Tinkering Expertise"] = "Armor Tinkering", - ["Assess Creature"] = "Assess Creature", - ["Assess Person"] = "Assess Person", - ["Cooking Prowess"] = "Cooking", - ["Deception Prowess"] = "Deception", - ["Fletching Prowess"] = "Fletching", - ["Healing Prowess"] = "Healing", - ["Item Tinkering Expertise"] = "Item Tinkering", - ["Leadership"] = "Leadership", - ["Lockpick Prowess"] = "Lockpick", - ["Fealty"] = "Loyalty", // AC uses "Fealty" for Loyalty - ["Magic Item Tinkering Expertise"] = "Magic Item Tinkering", - ["Mana Conversion Prowess"] = "Mana Conversion", - ["Jumping Prowess"] = "Jump", // AC has Jump cantrips - ["Salvaging Aptitude"] = "Salvaging", - ["Weapon Tinkering Expertise"] = "Weapon Tinkering", - - // Magic schools (with AC spell name patterns) - ["War Magic Aptitude"] = "War Magic", - ["Life Magic Aptitude"] = "Life Magic", - ["Creature Enchantment Aptitude"] = "Creature Enchantment", - ["Item Enchantment Aptitude"] = "Item Enchantment", - ["Void Magic Aptitude"] = "Void Magic", - ["Summoning Prowess"] = "Summoning", - - // Combat skills - ["Two Handed Combat Aptitude"] = "Two Handed Combat", - ["Dual Wield Aptitude"] = "Dual Wield", - ["Shield Aptitude"] = "Shield", - ["Sneak Attack Prowess"] = "Sneak Attack", - ["Dirty Fighting Prowess"] = "Dirty Fighting", - ["Recklessness"] = "Recklessness" - }; - - foreach (var mapping in skillMappings) - { - if (skillPart.Equals(mapping.Key, StringComparison.OrdinalIgnoreCase)) - { - // Check both specialized and trained skills - foreach (var category in new[] { "Specialized Skills", "Trained Skills" }) - { - if (Cantrips[category].ContainsKey(mapping.Value)) - { - var cantrip = Cantrips[category][mapping.Value]; - if (cantrip.Value == "N/A" || IsHigherCantripLevel(level, cantrip.Value)) - { - cantrip.Value = level; - cantrip.Color = color; - cantrip.SpellIconId = spellIconId; // Use the actual spell icon instead of skill icon - cantrip.IconId = null; // Clear any skill icon reference - } - return true; - } - } - } - } - return false; - } - - private string GetSpellName(int spellId) - { - try - { - // Use our existing SpellManager that was already working - var spell = SpellManager.GetSpell(spellId); - if (spell != null) - { - return spell.Name; - } - return ""; - } - catch - { - return ""; - } - } - - private bool IsHigherCantripLevel(string newLevel, string currentLevel) - { - var levels = new Dictionary - { - ["Minor"] = 1, - ["Moderate"] = 2, - ["Major"] = 3, - ["Epic"] = 4, - ["Legendary"] = 5 - }; - - if (!levels.ContainsKey(newLevel) || !levels.ContainsKey(currentLevel)) - return false; - - return levels[newLevel] > levels[currentLevel]; - } - - private void TestCantripDetection() - { - try - { - // Test real AC cantrip spell names to verify the detection logic - var testSpells = new[] - { - "Major Strength", // Attribute cantrip - "Epic Coordination", // Attribute cantrip - "Legendary Focus", // Attribute cantrip - "Major Willpower", // Willpower attribute - "Major Invulnerability", // Melee Defense skill - "Major Impregnability", // Missile Defense skill - "Major Alchemical Prowess", // Alchemy skill - "Major Arcane Prowess", // Arcane Lore skill - "Epic Life Magic Aptitude", // Life Magic skill - "Major Fealty", // Loyalty skill - "Major Armor", // Protection aura - "Epic Flame Ward", // Protection aura - "Legendary Storm Ward" // Protection aura - }; - - foreach (var spellName in testSpells) - { - TestDetectCantripByName(spellName); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in test cantrip detection: {ex.Message}"); - } - } - - private void TestDetectCantripByName(string spellName) - { - try - { - // Simulate the detection logic with a fake spell name - - // Define cantrip levels and their patterns - var cantripPatterns = new Dictionary - { - ["Minor"] = ("Minor", System.Drawing.Color.White), - ["Moderate"] = ("Moderate", System.Drawing.Color.Green), - ["Major"] = ("Major", System.Drawing.Color.Blue), - ["Epic"] = ("Epic", System.Drawing.Color.Purple), - ["Legendary"] = ("Legendary", System.Drawing.Color.Orange) - }; - - // Check each cantrip level - foreach (var cantripPattern in cantripPatterns) - { - string pattern = cantripPattern.Key; - var (level, color) = cantripPattern.Value; - - if (!spellName.StartsWith(pattern + " ")) continue; - - // Remove the level prefix to get the skill/attribute name - string skillPart = spellName.Substring(pattern.Length + 1); - - - // Get a test spell icon (use default for testing) - int testSpellIconId = 0x6002D14; - - // Try to match Protection Auras first - if (MatchProtectionAura(skillPart, level, color, testSpellIconId)) - { - return; - } - - // Try to match Attributes - if (MatchAttribute(skillPart, level, color, testSpellIconId)) - { - return; - } - - // Try to match Skills - if (MatchSkill(skillPart, level, color, testSpellIconId)) - { - return; - } - - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error testing cantrip detection: {ex.Message}"); - } - } - - #region Weapon Data Structures - public class TrackedWeaponInfo - { - public string Name { get; set; } - public string Category { get; set; } - public string WeaponType { get; set; } - public string Status { get; set; } - public bool IsAcquired { get; set; } - public int ItemId { get; set; } - public int IconId { get; set; } - } - - public Dictionary> WeaponCategories { get; private set; } - #endregion - - public void RefreshWeapons() - { - try - { - if (CoreManager.Current?.CharacterFilter?.Name == null) return; - - InitializeNewWeaponData(); - CheckAcquiredWeapons(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing weapons: {ex.Message}"); - } - } - - private void InitializeNewWeaponData() - { - WeaponCategories = new Dictionary> - { - ["Legendary Weapons"] = new List - { - new TrackedWeaponInfo { Name = "Bow of the Quiddity", Category = "Legendary Weapons", WeaponType = "Bow", ItemId = 23044, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Sword of the Quiddity", Category = "Legendary Weapons", WeaponType = "Sword", ItemId = 23039, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Mace of the Quiddity", Category = "Legendary Weapons", WeaponType = "Mace", ItemId = 23040, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Atlatl of the Quiddity", Category = "Legendary Weapons", WeaponType = "Atlatl", ItemId = 23043, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Staff of the Quiddity", Category = "Legendary Weapons", WeaponType = "Staff", ItemId = 23041, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Dagger of the Quiddity", Category = "Legendary Weapons", WeaponType = "Dagger", ItemId = 23042, Status = "Unknown" } - }, - ["Slayer Weapons"] = new List - { - new TrackedWeaponInfo { Name = "Shadowfire Isparian Bow", Category = "Slayer Weapons", WeaponType = "Bow", ItemId = 20636, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Shadowfire Isparian Sword", Category = "Slayer Weapons", WeaponType = "Sword", ItemId = 20631, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Shadowfire Isparian Staff", Category = "Slayer Weapons", WeaponType = "Staff", ItemId = 20633, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Shadowfire Isparian Dagger", Category = "Slayer Weapons", WeaponType = "Dagger", ItemId = 20634, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Shadowfire Isparian Axe", Category = "Slayer Weapons", WeaponType = "Axe", ItemId = 20635, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Shadowfire Isparian Mace", Category = "Slayer Weapons", WeaponType = "Mace", ItemId = 20632, Status = "Unknown" } - }, - ["Society Weapons"] = new List - { - new TrackedWeaponInfo { Name = "Radiant Blood Sword", Category = "Society Weapons", WeaponType = "Sword", ItemId = 32834, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Celestial Hand Sword", Category = "Society Weapons", WeaponType = "Sword", ItemId = 32835, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Eldritch Web Sword", Category = "Society Weapons", WeaponType = "Sword", ItemId = 32836, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Radiant Blood Bow", Category = "Society Weapons", WeaponType = "Bow", ItemId = 32837, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Celestial Hand Bow", Category = "Society Weapons", WeaponType = "Bow", ItemId = 32838, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Eldritch Web Bow", Category = "Society Weapons", WeaponType = "Bow", ItemId = 32839, Status = "Unknown" } - }, - ["Atlan Weapons"] = new List - { - new TrackedWeaponInfo { Name = "Atlan Sword", Category = "Atlan Weapons", WeaponType = "Sword", ItemId = 11648, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Atlan Axe", Category = "Atlan Weapons", WeaponType = "Axe", ItemId = 11649, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Atlan Mace", Category = "Atlan Weapons", WeaponType = "Mace", ItemId = 11650, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Atlan Spear", Category = "Atlan Weapons", WeaponType = "Spear", ItemId = 11651, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Atlan Staff", Category = "Atlan Weapons", WeaponType = "Staff", ItemId = 11652, Status = "Unknown" }, - new TrackedWeaponInfo { Name = "Atlan Dagger", Category = "Atlan Weapons", WeaponType = "Dagger", ItemId = 11653, Status = "Unknown" } - } - }; - } - - private void CheckAcquiredWeapons() - { - try - { - // Get inventory items - var worldFilter = CoreManager.Current.WorldFilter; - var inventoryItems = worldFilter.GetInventory().Cast().ToList(); - - // Check each weapon category - foreach (var category in WeaponCategories) - { - foreach (var weapon in category.Value) - { - // Check if weapon is acquired by name matching - var foundItem = inventoryItems.FirstOrDefault(item => - item.Name.Contains(weapon.Name) || - weapon.Name.Contains(item.Name)); - - if (foundItem != null) - { - weapon.IsAcquired = true; - weapon.Status = "Acquired"; - weapon.IconId = foundItem.Icon + 0x6000000; - } - else - { - weapon.IsAcquired = false; - weapon.Status = "Not Acquired"; - weapon.IconId = 0x6002D14; // Default icon - } - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error checking acquired weapons: {ex.Message}"); - } - } - #endregion - - #region Cleanup - public void Dispose() - { - // Cleanup if needed - } - #endregion - } -} \ No newline at end of file diff --git a/MosswartMassacre/FodyWeavers.xml b/MosswartMassacre/FodyWeavers.xml deleted file mode 100644 index 8c6d208..0000000 --- a/MosswartMassacre/FodyWeavers.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - YamlDotNet - Newtonsoft.Json - - - \ No newline at end of file diff --git a/MosswartMassacre/MainView.cs b/MosswartMassacre/MainView.cs new file mode 100644 index 0000000..063e7f7 --- /dev/null +++ b/MosswartMassacre/MainView.cs @@ -0,0 +1,96 @@ +using System; +using MyClasses.MetaViewWrappers; + +namespace MosswartMassacre +{ + internal static class MainView + { + private static IView View; + private static IStaticText lblTotalKills; + private static IStaticText lblKillsPer5Min; + private static IStaticText lblKillsPerHour; + private static IStaticText lblElapsedTime; + private static IStaticText lblRareCount; + private static IButton btnRestart; + private static IButton btnToggleRareMeta; + + public static void ViewInit() + { + try + { + // Load the view from the embedded XML resource + View = MyClasses.MetaViewWrappers.ViewSystemSelector.CreateViewResource( + PluginCore.MyHost, "MosswartMassacre.ViewXML.mainView.xml"); + + // Get references to controls + lblTotalKills = (IStaticText)View["lblTotalKills"]; + lblKillsPer5Min = (IStaticText)View["lblKillsPer5Min"]; + lblKillsPerHour = (IStaticText)View["lblKillsPerHour"]; + lblElapsedTime = (IStaticText)View["lblElapsedTime"]; + lblRareCount = (IStaticText)View["lblRareCount"]; + btnRestart = (IButton)View["btnRestart"]; + btnRestart.Hit += OnRestartClick; + btnToggleRareMeta = (IButton)View["btnToggleRareMeta"]; + btnToggleRareMeta.Hit += OnToggleRareMetaClick; + btnToggleRareMeta.Text = "Meta: ON"; + + PluginCore.WriteToChat("View initialized."); + } + catch (Exception ex) + { + PluginCore.WriteToChat("Error initializing view: " + ex.Message); + } + } + + public static void ViewDestroy() + { + try + { + View.Dispose(); + PluginCore.WriteToChat("View destroyed."); + btnRestart.Hit -= OnRestartClick; + btnToggleRareMeta.Hit -= OnToggleRareMetaClick; + } + catch (Exception ex) + { + PluginCore.WriteToChat("Error destroying view: " + ex.Message); + } + } + + public static void UpdateKillStats(int totalKills, double killsPer5Min, double killsPerHour) + { + lblTotalKills.Text = $"Total Kills: {totalKills}"; + lblKillsPer5Min.Text = $"Kills per 5 Min: {killsPer5Min:F2}"; + lblKillsPerHour.Text = $"Kills per Hour: {killsPerHour:F2}"; + } + + public static void UpdateElapsedTime(TimeSpan elapsed) + { + int days = elapsed.Days; + int hours = elapsed.Hours; + int minutes = elapsed.Minutes; + int seconds = elapsed.Seconds; + + if (days > 0) + lblElapsedTime.Text = $"Time: {days}d {hours:D2}:{minutes:D2}:{seconds:D2}"; + else + lblElapsedTime.Text = $"Time: {hours:D2}:{minutes:D2}:{seconds:D2}"; + } + public static void UpdateRareCount(int rareCount) + { + lblRareCount.Text = $"Rare Count: {rareCount}"; + } + private static void OnRestartClick(object sender, EventArgs e) + { + PluginCore.RestartStats(); + } + private static void OnToggleRareMetaClick(object sender, EventArgs e) + { + PluginCore.ToggleRareMeta(); + } + public static void SetRareMetaToggleState(bool enabled) + { + btnToggleRareMeta.Text = enabled ? "Meta: ON" : "Meta: OFF"; + } + } +} diff --git a/MosswartMassacre/MosswartMassacre.csproj b/MosswartMassacre/MosswartMassacre.csproj index 93891ca..ac9acd5 100644 --- a/MosswartMassacre/MosswartMassacre.csproj +++ b/MosswartMassacre/MosswartMassacre.csproj @@ -29,45 +29,25 @@ pdbonly true bin\Release\ - TRACE;VVS_REFERENCED;DECAL_INTEROP + TRACE prompt 4 - - C:\Games\Decal Plugins\UtilityBelt\0Harmony.dll - False - lib\Decal.Adapter.dll False - - ..\..\..\..\..\..\Program Files (x86)\Decal 3.0\Decal.FileService.dll - False False - ..\..\..\..\..\..\Program Files (x86)\Decal 3.0\.NET 4.0 PIA\Decal.Interop.Core.DLL - False - - - False - False - ..\..\..\..\..\..\Program Files (x86)\Decal 3.0\.NET 4.0 PIA\Decal.Interop.Filters.DLL - False + lib\Decal.Interop.Core.DLL False False lib\Decal.Interop.Inject.dll - - False - False - ..\..\..\..\..\..\Program Files (x86)\Decal 3.0\.NET 4.0 PIA\Decal.Interop.D3DService.DLL - False - ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll @@ -75,7 +55,6 @@ - @@ -87,9 +66,6 @@ False bin\Debug\utank2-i.dll - - ..\..\..\..\..\..\Games\Decal Plugins\Virindi\VirindiChatSystem5\VCS5.dll - lib\VirindiViewService.dll @@ -98,76 +74,6 @@ - - Shared\Constants\BoolValueKey.cs - - - Shared\Constants\Dictionaries.cs - - - Shared\Spells\Spell.cs - - - Shared\Constants\DoubleValueKey.cs - - - Shared\Constants\EphemeralAttribute.cs - - - Shared\Constants\IntValueKey.cs - - - Shared\Constants\SendOnLoginAttribute.cs - - - Shared\Constants\ServerOnlyAttribute.cs - - - Shared\Constants\StringValueKey.cs - - - Shared\Debug.cs - - - Shared\DecalProxy.cs - - - Shared\MyWorldObject.cs - - - Shared\MyWorldObjectCreator.cs - - - Shared\PostMessageTools.cs - - - Shared\RateLimiter.cs - - - Shared\SerializableDictionary.cs - - - Shared\Settings\Setting.cs - - - Shared\Settings\SettingsFile.cs - - - Shared\User32.cs - - - Shared\Util.cs - - - Shared\VCS_Connector.cs - - - - - - - - @@ -177,20 +83,19 @@ + - - True True Resources.resx - - - - - + + + + + @@ -199,45 +104,11 @@ - - - - Shared\Spells\Spells.csv - - - - {FF7F5F6D-34E0-4B6F-B3BB-8141DE2EF732} - 2 - 0 - 0 - primary - False - False - - - {572B87C4-93BD-46B3-A291-CD58181D25DC} - 2 - 0 - 0 - primary - False - True - - - - - - This project references NuGet package(s) that are missing on this machine. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - \ No newline at end of file diff --git a/MosswartMassacre/MossyInventory.cs b/MosswartMassacre/MossyInventory.cs deleted file mode 100644 index 299b130..0000000 --- a/MosswartMassacre/MossyInventory.cs +++ /dev/null @@ -1,336 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Newtonsoft.Json; - -using Mag.Shared; - -using Decal.Adapter; -using Decal.Adapter.Wrappers; -using System.Diagnostics; -using YamlDotNet.Serialization; - -namespace MosswartMassacre -{ - class MossyInventory : IDisposable - { - - private string InventoryFileName - { - get - { - // 1) Character name - var characterName = CoreManager.Current.CharacterFilter.Name; - - // 2) Plugin folder - handle hot reload scenarios - string pluginFolder; - if (!string.IsNullOrEmpty(PluginCore.AssemblyDirectory)) - { - pluginFolder = PluginCore.AssemblyDirectory; - } - else - { - pluginFolder = Path.GetDirectoryName( - System.Reflection.Assembly - .GetExecutingAssembly() - .Location - ); - } - - // 3) Character-specific folder path - var characterFolder = Path.Combine(pluginFolder, characterName); - - // 4) Ensure directory exists (can do it here, thread-safe for most single-user plugin cases) - if (!Directory.Exists(characterFolder)) - Directory.CreateDirectory(characterFolder); - - // 5) Return full path to the .json file inside the character folder - return Path.Combine(characterFolder, $"{characterName}.json"); - } - } - - public MossyInventory() - { - try - { - CoreManager.Current.CharacterFilter.LoginComplete += CharacterFilter_LoginComplete; - CoreManager.Current.WorldFilter.CreateObject += WorldFilter_CreateObject; - CoreManager.Current.WorldFilter.ChangeObject += WorldFilter_ChangeObject; - CoreManager.Current.CharacterFilter.Logoff += CharacterFilter_Logoff; - PluginCore.WriteToChat($"[INV] {InventoryFileName}"); - PluginCore.WriteToChat("Started MOSSY!"); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[INV] {ex}"); - } - } - - private bool disposed; - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - protected virtual void Dispose(bool disposing) - { - if (disposed) return; - if (disposing) - { - CoreManager.Current.CharacterFilter.LoginComplete -= CharacterFilter_LoginComplete; - CoreManager.Current.WorldFilter.CreateObject -= WorldFilter_CreateObject; - CoreManager.Current.WorldFilter.ChangeObject -= WorldFilter_ChangeObject; - CoreManager.Current.CharacterFilter.Logoff -= CharacterFilter_Logoff; - } - disposed = true; - } - - private bool loginComplete; - private bool loggedInAndWaitingForIdData; - private readonly List requestedIds = new List(); - - private void CharacterFilter_LoginComplete(object sender, EventArgs e) - { - try - { - loginComplete = true; - - // Defensive check - settings might not be initialized yet due to event handler order - bool inventoryLogEnabled; - try - { - inventoryLogEnabled = PluginSettings.Instance.InventoryLog; - } - catch (InvalidOperationException) - { - PluginCore.WriteToChat("[INV] Settings not ready, skipping inventory check"); - return; - } - - if (!inventoryLogEnabled) - return; - - if (!File.Exists(InventoryFileName)) - { - PluginCore.WriteToChat("Requesting id information for all armor/weapon inventory. This will take a few minutes..."); - foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory()) - { - if (!wo.HasIdData && ObjectClassNeedsIdent(wo.ObjectClass, wo.Name)) - CoreManager.Current.Actions.RequestId(wo.Id); - } - loggedInAndWaitingForIdData = true; - } - else - { - DumpInventoryToFile(true); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[INV] {ex}"); - } - } - - private void WorldFilter_CreateObject(object sender, CreateObjectEventArgs e) - { - if (!loginComplete) return; - - try - { - if (!PluginSettings.Instance.InventoryLog) return; - } - catch (InvalidOperationException) - { - return; // Settings not ready, skip silently - } - - if (!e.New.HasIdData && ObjectClassNeedsIdent(e.New.ObjectClass, e.New.Name) - && !requestedIds.Contains(e.New.Id) - && e.New.Container == CoreManager.Current.CharacterFilter.Id) - { - requestedIds.Add(e.New.Id); - CoreManager.Current.Actions.RequestId(e.New.Id); - } - } - - private void WorldFilter_ChangeObject(object sender, ChangeObjectEventArgs e) - { - if (!loginComplete) return; - - try - { - if (!PluginSettings.Instance.InventoryLog) return; - } - catch (InvalidOperationException) - { - return; // Settings not ready, skip silently - } - - if (loggedInAndWaitingForIdData) - { - bool allHaveId = true; - foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory()) - { - if (!wo.HasIdData && ObjectClassNeedsIdent(wo.ObjectClass, wo.Name)) - { - allHaveId = false; - break; - } - } - if (allHaveId) - { - loggedInAndWaitingForIdData = false; - DumpInventoryToFile(); - PluginCore.WriteToChat("Requesting id information for all armor/weapon inventory completed. Log file written."); - } - } - else - { - if (!e.Changed.HasIdData && ObjectClassNeedsIdent(e.Changed.ObjectClass, e.Changed.Name) - && !requestedIds.Contains(e.Changed.Id) - && e.Changed.Container == CoreManager.Current.CharacterFilter.Id) - { - requestedIds.Add(e.Changed.Id); - CoreManager.Current.Actions.RequestId(e.Changed.Id); - } - } - - } - - private void CharacterFilter_Logoff(object sender, Decal.Adapter.Wrappers.LogoffEventArgs e) - { - try - { - try - { - if (!PluginSettings.Instance.InventoryLog) return; - } - catch (InvalidOperationException) - { - return; // Settings not ready, skip silently - } - DumpInventoryToFile(true); // Request IDs if missing to ensure complete data - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[INV] {ex}"); - } - } - - private void DumpInventoryToFile(bool requestIdsIfMissing = false) - { - var previouslySaved = new List(); - - if (File.Exists(InventoryFileName)) - { - try - { - string oldJson = File.ReadAllText(InventoryFileName); - previouslySaved = JsonConvert.DeserializeObject>(oldJson) - ?? new List(); - } - catch (Exception) - { - PluginCore.WriteToChat("Inventory file is corrupt."); - } - } - - var currentList = new List(); - foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory()) - { - // Check to see if we already have some information for this item - foreach (var prev in previouslySaved) - { - if (prev.Id == wo.Id && prev.ObjectClass == (int)wo.ObjectClass) - { - // If neither our past nor our current item HadIdData, but it should, lets request it - if (requestIdsIfMissing && !prev.HasIdData && !wo.HasIdData && ObjectClassNeedsIdent(wo.ObjectClass, wo.Name)) - { - CoreManager.Current.Actions.RequestId(wo.Id); - currentList.Add(MyWorldObjectCreator.Create(wo)); - } - else - { - // Add the WorldObject to the MyWorldObject data so we have up to date information - currentList.Add(MyWorldObjectCreator.Combine(prev, wo)); - } - - goto end; - } - } - - if (requestIdsIfMissing && !wo.HasIdData && ObjectClassNeedsIdent(wo.ObjectClass, wo.Name)) - CoreManager.Current.Actions.RequestId(wo.Id); - - currentList.Add(MyWorldObjectCreator.Create(wo)); - - end: ; - } - - var fi = new FileInfo(InventoryFileName); - if (fi.Directory != null && !fi.Directory.Exists) - fi.Directory.Create(); - - string json = JsonConvert.SerializeObject(currentList, Formatting.Indented); - File.WriteAllText(InventoryFileName, json); - - // Send full inventory via WebSocket - if (PluginCore.WebSocketEnabled) - { - _ = WebSocket.SendFullInventoryAsync(currentList); - PluginCore.WriteToChat("Inventory sent to MosswartOverlord"); - } - } - - private bool ObjectClassNeedsIdent(ObjectClass oc, string name) - { - return oc == ObjectClass.Armor - || oc == ObjectClass.Clothing - || oc == ObjectClass.MeleeWeapon - || oc == ObjectClass.MissileWeapon - || oc == ObjectClass.WandStaffOrb - || oc == ObjectClass.Jewelry - || (oc == ObjectClass.Gem && !string.IsNullOrEmpty(name) && name.Contains("Aetheria")) - || (oc == ObjectClass.Misc && !string.IsNullOrEmpty(name) && name.Contains("Essence")); - } - - /// - /// Forces an inventory upload with ID requests - guarantees complete data - /// - public void ForceInventoryUpload() - { - try - { - // Check if inventory logging is enabled - try - { - if (!PluginSettings.Instance.InventoryLog) - { - PluginCore.WriteToChat("[INV] Inventory logging is disabled"); - return; - } - } - catch (InvalidOperationException) - { - PluginCore.WriteToChat("[INV] Settings not ready"); - return; - } - - // Check if WebSocket is enabled - if (!PluginCore.WebSocketEnabled) - { - PluginCore.WriteToChat("[INV] WebSocket streaming is disabled"); - return; - } - - PluginCore.WriteToChat("[INV] Forcing inventory upload with ID requests..."); - DumpInventoryToFile(true); // Request IDs if missing - PluginCore.WriteToChat("[INV] Inventory upload completed"); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[INV] Force upload failed: {ex.Message}"); - } - } - } -} diff --git a/MosswartMassacre/NavRoute.cs b/MosswartMassacre/NavRoute.cs deleted file mode 100644 index 6f3ccfa..0000000 --- a/MosswartMassacre/NavRoute.cs +++ /dev/null @@ -1,412 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using Decal.Adapter; -using Decal.Adapter.Wrappers; - -namespace MosswartMassacre -{ - public class NavWaypoint - { - public double NS { get; set; } - public double EW { get; set; } - public double Z { get; set; } - public int Type { get; set; } - public NavWaypoint Previous { get; set; } - } - - public class NavRoute : IDisposable - { - private bool disposed = false; - private List waypoints = new List(); - private List lineObjects = new List(); - private Color routeColor; - private bool isVisible = false; - - public string FilePath { get; private set; } - public string FileName => Path.GetFileNameWithoutExtension(FilePath); - public bool IsVisible => isVisible; - public int WaypointCount => waypoints.Count; - - public NavRoute(string filePath, Color color) - { - FilePath = filePath; - routeColor = color; - } - - public bool LoadFromFile() - { - try - { - ClearRoute(); - waypoints.Clear(); - - if (!File.Exists(FilePath)) - { - PluginCore.WriteToChat($"Nav file not found: {FilePath}"); - return false; - } - - PluginCore.WriteToChat($"Navigation: Loading {FileName}..."); - - using (StreamReader sr = File.OpenText(FilePath)) - { - // Read header - string header = sr.ReadLine(); - if (string.IsNullOrEmpty(header) || !header.StartsWith("uTank2 NAV")) - { - PluginCore.WriteToChat($"Navigation: Invalid file format - {FileName}"); - return false; - } - - // Read nav type - string navTypeLine = sr.ReadLine(); - if (string.IsNullOrEmpty(navTypeLine) || !int.TryParse(navTypeLine.Trim(), out int navType)) - { - PluginCore.WriteToChat($"Navigation: Failed to parse route type - {FileName}"); - return false; - } - - string navTypeDescription = ""; - switch (navType) - { - case 0: - navTypeDescription = "Linear"; - break; - case 1: - navTypeDescription = "Circular"; - break; - case 2: - navTypeDescription = "Linear"; - break; - case 3: - navTypeDescription = "Target (follow player/object)"; - break; - case 4: - navTypeDescription = "Once"; - break; - default: - navTypeDescription = $"Unknown ({navType})"; - PluginCore.WriteToChat($"Navigation: Unknown route type {navType} in {FileName}"); - break; - } - - // Handle target nav (type 3) - follows a specific player/object - if (navType == 3) - { - if (sr.EndOfStream) - { - PluginCore.WriteToChat($"Navigation: Target route file is empty - {FileName}"); - return false; - } - - string targetName = sr.ReadLine(); - if (sr.EndOfStream) - { - PluginCore.WriteToChat($"Navigation: Target route missing target ID - {FileName}"); - return false; - } - - string targetIdLine = sr.ReadLine(); - - PluginCore.WriteToChat($"Navigation: Target route '{targetName}' cannot be visualized"); - return true; // Successfully loaded but can't visualize - } - - // Read record count - string recordCountLine = sr.ReadLine(); - if (string.IsNullOrEmpty(recordCountLine) || !int.TryParse(recordCountLine.Trim(), out int recordCount)) - { - PluginCore.WriteToChat($"Navigation: Failed to parse waypoint count - {FileName}"); - return false; - } - - if (recordCount <= 0 || recordCount > 10000) // Sanity check - { - PluginCore.WriteToChat($"Navigation: Invalid waypoint count {recordCount} - {FileName}"); - return false; - } - - NavWaypoint previous = null; - int waypointsRead = 0; - - while (!sr.EndOfStream && waypointsRead < recordCount) - { - // Read waypoint type - string waypointTypeLine = sr.ReadLine(); - - if (string.IsNullOrEmpty(waypointTypeLine) || !int.TryParse(waypointTypeLine.Trim(), out int waypointType)) - { - PluginCore.WriteToChat($"Navigation: Failed to parse waypoint {waypointsRead + 1} in {FileName}"); - break; // Skip this waypoint, don't fail entirely - } - - // Read coordinates (all waypoint types have EW, NS, Z, Unknown) - string ewLine = sr.ReadLine(); - string nsLine = sr.ReadLine(); - string zLine = sr.ReadLine(); - string unknownLine = sr.ReadLine(); // Unknown value (always 0) - - if (string.IsNullOrEmpty(ewLine) || string.IsNullOrEmpty(nsLine) || string.IsNullOrEmpty(zLine) || string.IsNullOrEmpty(unknownLine)) - { - PluginCore.WriteToChat($"Navigation: Missing coordinates at waypoint {waypointsRead + 1} in {FileName}"); - break; - } - - if (!double.TryParse(ewLine.Trim(), out double ew) || - !double.TryParse(nsLine.Trim(), out double ns) || - !double.TryParse(zLine.Trim(), out double z)) - { - PluginCore.WriteToChat($"Navigation: Invalid coordinates at waypoint {waypointsRead + 1} in {FileName}"); - break; // Skip this waypoint - } - - var waypoint = new NavWaypoint - { - NS = ns, - EW = ew, - Z = z, - Type = waypointType, - Previous = previous - }; - - waypoints.Add(waypoint); - previous = waypoint; - waypointsRead++; - - // Skip additional data based on waypoint type - if (!SkipWaypointData(sr, waypointType)) - { - PluginCore.WriteToChat($"Navigation: Failed to parse waypoint {waypointsRead + 1} data in {FileName}"); - break; // Don't continue if we can't parse properly - } - } - - if (waypoints.Count > 0) - { - PluginCore.WriteToChat($"Navigation: Loaded {FileName} ({waypoints.Count} waypoints)"); - } - else - { - PluginCore.WriteToChat($"Navigation: No valid waypoints found in {FileName}"); - } - - return waypoints.Count > 0; - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Navigation: Error loading {FileName} - {ex.Message}"); - return false; - } - } - - private bool SkipWaypointData(StreamReader sr, int waypointType) - { - try - { - // Skip additional lines based on waypoint type (base 4 lines already read) - switch (waypointType) - { - case 0: // Point - no additional data (4 lines total) - break; - case 1: // Portal - 5 additional lines (9 lines total) - sr.ReadLine(); // Name - sr.ReadLine(); // ObjectClass - sr.ReadLine(); // "true" - sr.ReadLine(); // PortalNS - sr.ReadLine(); // PortalEW - sr.ReadLine(); // PortalZ - break; - case 2: // Recall - 1 additional line (5 lines total) - sr.ReadLine(); // RecallSpellId - break; - case 3: // Pause - 1 additional line (5 lines total) - sr.ReadLine(); // Pause milliseconds - break; - case 4: // ChatCommand - 1 additional line (5 lines total) - sr.ReadLine(); // Message - break; - case 5: // OpenVendor - 2 additional lines (6 lines total) - sr.ReadLine(); // Id - sr.ReadLine(); // Name - break; - case 6: // Portal2 - same as Portal (9 lines total) - sr.ReadLine(); // Name - sr.ReadLine(); // ObjectClass - sr.ReadLine(); // "true" - sr.ReadLine(); // PortalNS - sr.ReadLine(); // PortalEW - sr.ReadLine(); // PortalZ - break; - case 7: // UseNPC - 5 additional lines (9 lines total) - sr.ReadLine(); // Name - sr.ReadLine(); // ObjectClass - sr.ReadLine(); // "true" - sr.ReadLine(); // NpcEW - sr.ReadLine(); // NpcNS - sr.ReadLine(); // NpcZ - break; - case 8: // Checkpoint - no additional data (4 lines total) - break; - case 9: // Jump - 3 additional lines (7 lines total) - sr.ReadLine(); // Heading - sr.ReadLine(); // ShiftJump - sr.ReadLine(); // Milliseconds - break; - default: - // Unknown waypoint type - skip silently - break; - } - return true; - } - catch - { - // Silently handle parsing errors - return false; - } - } - - public void Show() - { - if (isVisible) return; - - if (waypoints.Count == 0) - { - PluginCore.WriteToChat($"Navigation: No waypoints to visualize in {FileName}"); - return; - } - - CreateLineObjects(); - isVisible = true; - PluginCore.WriteToChat($"Navigation: Showing {FileName} ({waypoints.Count} waypoints)"); - } - - public void Hide() - { - if (!isVisible) return; - - ClearRoute(); - isVisible = false; - PluginCore.WriteToChat($"Navigation: Hidden {FileName}"); - } - - private void CreateLineObjects() - { - try - { - // Check D3DService availability - if (CoreManager.Current?.D3DService == null) - { - PluginCore.WriteToChat($"Navigation: 3D service unavailable"); - return; - } - - // Limit the number of lines to prevent lag - int maxLines = Math.Min(waypoints.Count - 1, 500); // Max 500 lines - - int linesCreated = 0; - for (int i = 1; i <= maxLines; i++) - { - var current = waypoints[i]; - var previous = waypoints[i - 1]; - - if (CreateLineBetweenWaypoints(previous, current)) - { - linesCreated++; - } - - // Add small delay every 50 lines to prevent UI freezing - if (i % 50 == 0) - { - System.Threading.Thread.Sleep(1); - } - } - - if (waypoints.Count > 501) - { - PluginCore.WriteToChat($"Navigation: Large route - showing {maxLines} of {waypoints.Count} segments"); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Navigation: Error creating visualization - {ex.Message}"); - } - } - - private bool CreateLineBetweenWaypoints(NavWaypoint from, NavWaypoint to) - { - try - { - // Calculate distance - double distance = Math.Sqrt( - Math.Pow((to.NS - from.NS) * 240, 2) + - Math.Pow((to.EW - from.EW) * 240, 2) + - Math.Pow((to.Z - from.Z) * 240, 2) - ); - - if (distance <= 0) return false; - - // Create D3D line object - var lineObj = CoreManager.Current.D3DService.NewD3DObj(); - if (lineObj == null) return false; - - lineObj.SetShape(D3DShape.Cube); - lineObj.Color = routeColor.ToArgb(); - - // Position at midpoint between waypoints - float midNS = (float)(from.NS + to.NS) / 2; - float midEW = (float)(from.EW + to.EW) / 2; - float midZ = (float)((from.Z + to.Z) * 120) + 0.1f; // Slightly higher than UtilityBelt - - lineObj.Anchor(midNS, midEW, midZ); - - // Orient toward destination - float orientNS = (float)from.NS; - float orientEW = (float)from.EW; - float orientZ = (float)(from.Z * 240) + 0.1f; - - lineObj.OrientToCoords(orientNS, orientEW, orientZ, true); - - // Scale to create line effect - lineObj.ScaleX = 0.3f; // Slightly thicker than UtilityBelt - lineObj.ScaleZ = 0.3f; - lineObj.ScaleY = (float)distance; - - lineObj.Visible = true; - lineObjects.Add(lineObj); - - return true; - } - catch - { - return false; - } - } - - private void ClearRoute() - { - foreach (var obj in lineObjects) - { - try - { - obj.Visible = false; - obj.Dispose(); - } - catch { } - } - lineObjects.Clear(); - } - - public void Dispose() - { - if (!disposed) - { - ClearRoute(); - waypoints.Clear(); - disposed = true; - } - } - } -} \ No newline at end of file diff --git a/MosswartMassacre/NavVisualization.cs b/MosswartMassacre/NavVisualization.cs deleted file mode 100644 index 824462f..0000000 --- a/MosswartMassacre/NavVisualization.cs +++ /dev/null @@ -1,246 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using Decal.Adapter; -using Microsoft.Win32; - -namespace MosswartMassacre -{ - public class NavVisualization : IDisposable - { - private bool disposed = false; - private NavRoute currentRoute = null; - private string vtankProfilesDirectory = ""; - private List availableNavFiles = new List(); - - // Default comparison route color (red) - private readonly Color comparisonRouteColor = Color.FromArgb(255, 255, 100, 100); - - public bool IsEnabled { get; private set; } = false; - public bool HasRouteLoaded => currentRoute != null && currentRoute.WaypointCount > 0; - public string CurrentRouteFile => currentRoute?.FileName ?? "None"; - public List AvailableNavFiles => availableNavFiles.ToList(); - - public event EventHandler RouteChanged; - - public NavVisualization() - { - InitializeVTankDirectory(); - RefreshNavFileList(); - } - - private void InitializeVTankDirectory() - { - try - { - // First, check if user has configured a custom path - if (!string.IsNullOrEmpty(PluginSettings.Instance?.VTankProfilesPath)) - { - vtankProfilesDirectory = PluginSettings.Instance.VTankProfilesPath; - return; - } - - // Try to get VTank directory from Windows Registry (same method as UtilityBelt) - var defaultPath = @"C:\Games\VirindiPlugins\VirindiTank\"; - try - { - var regKey = Registry.LocalMachine.OpenSubKey("Software\\Decal\\Plugins\\{642F1F48-16BE-48BF-B1D4-286652C4533E}"); - if (regKey != null) - { - var profilePath = regKey.GetValue("ProfilePath")?.ToString(); - if (!string.IsNullOrEmpty(profilePath)) - { - vtankProfilesDirectory = profilePath; - return; - } - } - } - catch - { - } - - // Fall back to default path - vtankProfilesDirectory = defaultPath; - // Using default path - user can configure in Settings if needed - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[NavViz] Error finding VTank directory: {ex.Message}"); - vtankProfilesDirectory = ""; - } - } - - /// - /// Scan VTank directory for .nav files and populate available routes list - /// Filters out follow files and temporary files, sorts alphabetically - /// - public void RefreshNavFileList() - { - // Re-initialize directory in case settings changed - InitializeVTankDirectory(); - - availableNavFiles.Clear(); - - - if (string.IsNullOrEmpty(vtankProfilesDirectory)) - { - PluginCore.WriteToChat("VTank directory not configured. Set path in Settings tab."); - return; - } - - if (!Directory.Exists(vtankProfilesDirectory)) - { - PluginCore.WriteToChat($"VTank directory not found: {vtankProfilesDirectory}"); - return; - } - - try - { - // Get all files and filter for .nav files only, excluding follow/temporary files - var allFiles = Directory.GetFiles(vtankProfilesDirectory); - var navFiles = allFiles - .Where(file => Path.GetExtension(file).Equals(".nav", StringComparison.OrdinalIgnoreCase)) - .Select(file => Path.GetFileNameWithoutExtension(file)) - .Where(name => !string.IsNullOrEmpty(name) && - !name.StartsWith("follow", StringComparison.OrdinalIgnoreCase) && - !name.StartsWith("--", StringComparison.OrdinalIgnoreCase)) - .OrderBy(name => name) - .ToList(); - - availableNavFiles.AddRange(navFiles); - - // Only report summary - no need to spam chat with every file - if (navFiles.Count > 0) - { - PluginCore.WriteToChat($"Navigation: Found {navFiles.Count} route files"); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Navigation: Error scanning files - {ex.Message}"); - } - } - - /// - /// Load a specific navigation route file for visualization - /// Clears current route if "None" specified, otherwise loads .nav file - /// - /// Name of .nav file (without extension) or "None" - /// True if route loaded successfully, false otherwise - public bool LoadRoute(string navFileName) - { - try - { - // Clear current route - if (currentRoute != null) - { - currentRoute.Dispose(); - currentRoute = null; - } - - if (string.IsNullOrEmpty(navFileName) || navFileName == "None") - { - RouteChanged?.Invoke(this, EventArgs.Empty); - return true; - } - - string fullPath = Path.Combine(vtankProfilesDirectory, navFileName + ".nav"); - - if (!File.Exists(fullPath)) - { - PluginCore.WriteToChat($"Navigation file '{navFileName}' not found"); - return false; - } - - currentRoute = new NavRoute(fullPath, comparisonRouteColor); - - if (!currentRoute.LoadFromFile()) - { - currentRoute.Dispose(); - currentRoute = null; - return false; - } - - // Show route if visualization is enabled - if (IsEnabled) - { - currentRoute.Show(); - } - - RouteChanged?.Invoke(this, EventArgs.Empty); - return true; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Navigation: Failed to load '{navFileName}' - {ex.Message}"); - return false; - } - } - - /// - /// Enable or disable navigation route visualization in 3D world - /// Shows/hides the currently loaded route based on enabled state - /// - /// True to show route lines, false to hide - public void SetEnabled(bool enabled) - { - // No change needed if already in desired state - if (IsEnabled == enabled) return; - - IsEnabled = enabled; - - if (currentRoute != null) - { - if (enabled) - { - currentRoute.Show(); - } - else - { - currentRoute.Hide(); - } - } - else - { - } - - PluginCore.WriteToChat($"Navigation visualization {(enabled ? "enabled" : "disabled")}"); - } - - public void ToggleEnabled() - { - SetEnabled(!IsEnabled); - } - - public string GetStatus() - { - if (currentRoute == null) - return "No route loaded"; - - string status = $"{currentRoute.FileName} ({currentRoute.WaypointCount} points)"; - if (IsEnabled && currentRoute.IsVisible) - status += " - Visible"; - else if (IsEnabled) - status += " - Hidden"; - else - status += " - Disabled"; - - return status; - } - - public void Dispose() - { - if (!disposed) - { - if (currentRoute != null) - { - currentRoute.Dispose(); - currentRoute = null; - } - disposed = true; - } - } - } -} \ No newline at end of file diff --git a/MosswartMassacre/PluginCore.backup.cs b/MosswartMassacre/PluginCore.backup.cs deleted file mode 100644 index 543fa88..0000000 --- a/MosswartMassacre/PluginCore.backup.cs +++ /dev/null @@ -1,1654 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Globalization; -using System.Linq; -using System.Net; -using System.Runtime.InteropServices; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Timers; -using Decal.Adapter; -using Decal.Adapter.Wrappers; -using MosswartMassacre.Views; -using Mag.Shared.Constants; - -namespace MosswartMassacre -{ - [FriendlyName("Mosswart Massacre")] - public class PluginCore : PluginBase - { - // Hot Reload Support Properties - public static string AssemblyDirectory { get; set; } - public static bool IsHotReload { get; set; } - - internal static PluginHost MyHost; - internal static int totalKills = 0; - internal static int rareCount = 0; - internal static int sessionDeaths = 0; // Deaths this session - internal static int totalDeaths = 0; // Total deaths from character - internal static int cachedPrismaticCount = 0; // Cached Prismatic Taper count - internal static int lastPrismaticCount = 0; // For delta calculation - - // Track taper items and their containers for accurate release detection - private static readonly Dictionary trackedTaperContainers = new Dictionary(); - private static readonly Dictionary lastKnownStackSizes = new Dictionary(); - internal static DateTime lastKillTime = DateTime.Now; - internal static double killsPer5Min = 0; - internal static double killsPerHour = 0; - internal static DateTime statsStartTime = DateTime.Now; - internal static Timer updateTimer; - private static Timer vitalsTimer; - private static System.Windows.Forms.Timer commandTimer; - private static readonly Queue pendingCommands = new Queue(); - public static bool RareMetaEnabled { get; set; } = true; - - // VVS View Management - private static class ViewManager - { - public static void ViewInit() - { - Views.VVSTabbedMainView.ViewInit(); - } - - public static void ViewDestroy() - { - Views.VVSTabbedMainView.ViewDestroy(); - } - - public static void UpdateKillStats(int totalKills, double killsPer5Min, double killsPerHour) - { - Views.VVSTabbedMainView.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); - } - - public static void UpdateElapsedTime(TimeSpan elapsed) - { - Views.VVSTabbedMainView.UpdateElapsedTime(elapsed); - } - - public static void UpdateRareCount(int rareCount) - { - Views.VVSTabbedMainView.UpdateRareCount(rareCount); - } - - public static void SetRareMetaToggleState(bool enabled) - { - Views.VVSTabbedMainView.SetRareMetaToggleState(enabled); - } - - public static void RefreshSettingsFromConfig() - { - Views.VVSTabbedMainView.RefreshSettingsFromConfig(); - } - } - public static bool RemoteCommandsEnabled { get; set; } = false; - public static bool HttpServerEnabled { get; set; } = false; - public static string CharTag { get; set; } = ""; - public static bool TelemetryEnabled { get; set; } = false; - public static bool WebSocketEnabled { get; set; } = false; - public bool InventoryLogEnabled { get; set; } = false; - public static bool AggressiveChatStreamingEnabled { get; set; } = true; - private MossyInventory _inventoryLogger; - public static NavVisualization navVisualization; - - // Quest Management for always-on quest streaming - public static QuestManager questManager; - private static Timer questStreamingTimer; - - private static Queue rareMessageQueue = new Queue(); - private static DateTime _lastSent = DateTime.MinValue; - private static readonly Queue _chatQueue = new Queue(); - - protected override void Startup() - { - try - { - // DEBUG: Add startup debug message - WriteToChat("[DEBUG] PluginCore.Startup() called"); - - // Set MyHost - for hot reload scenarios, Host might be null - if (Host != null) - { - MyHost = Host; - } - else if (MyHost == null) - { - // Hot reload fallback - this is okay, WriteToChat will handle it - MyHost = null; - } - - // Check if this is a hot reload - var isCharacterLoaded = CoreManager.Current.CharacterFilter.LoginStatus == 3; - if (IsHotReload || isCharacterLoaded) - { - // Hot reload detected - reinitialize connections and state - WriteToChat("[INFO] Hot reload detected - reinitializing plugin"); - - // Reload settings if character is already logged in - if (isCharacterLoaded) - { - try - { - WriteToChat("Hot reload - reinitializing character-dependent systems"); - // Don't call LoginComplete - create hot reload specific initialization - InitializeForHotReload(); - WriteToChat("[INFO] Hot reload initialization complete"); - } - catch (Exception ex) - { - WriteToChat($"[ERROR] Hot reload initialization failed: {ex.Message}"); - } - } - } - - // Note: Startup messages will appear after character login - // Subscribe to chat message event - WriteToChat("[DEBUG] Subscribing to events..."); - CoreManager.Current.ChatBoxMessage += new EventHandler(OnChatText); - CoreManager.Current.ChatBoxMessage += new EventHandler(AllChatText); - CoreManager.Current.CommandLineText += OnChatCommand; - WriteToChat("[DEBUG] About to subscribe to LoginComplete event"); - CoreManager.Current.CharacterFilter.LoginComplete += CharacterFilter_LoginComplete; - WriteToChat("[DEBUG] LoginComplete event subscription successful"); - CoreManager.Current.CharacterFilter.Death += OnCharacterDeath; - CoreManager.Current.WorldFilter.CreateObject += OnSpawn; - CoreManager.Current.WorldFilter.CreateObject += OnPortalDetected; - CoreManager.Current.WorldFilter.ReleaseObject += OnDespawn; - // Subscribe to inventory change events for taper tracking - CoreManager.Current.WorldFilter.CreateObject += OnInventoryCreate; - CoreManager.Current.WorldFilter.ReleaseObject += OnInventoryRelease; - CoreManager.Current.WorldFilter.ChangeObject += OnInventoryChange; - // Initialize VVS view after character login - ViewManager.ViewInit(); - - // Initialize the timer - updateTimer = new Timer(1000); // Update every second - updateTimer.Elapsed += UpdateStats; - updateTimer.Start(); - - // Initialize vitals streaming timer - vitalsTimer = new Timer(5000); // Send vitals every 5 seconds - vitalsTimer.Elapsed += SendVitalsUpdate; - vitalsTimer.Start(); - - // Initialize command processing timer (Windows Forms timer for main thread) - commandTimer = new System.Windows.Forms.Timer(); - commandTimer.Interval = 10; // Process commands every 10ms - commandTimer.Tick += ProcessPendingCommands; - commandTimer.Start(); - - // Note: View initialization moved to LoginComplete for VVS compatibility - - // Enable TLS1.2 - ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; - //Enable vTank interface - vTank.Enable(); - //lyssna på commands - WebSocket.OnServerCommand += HandleServerCommand; - //starta inventory. Hanterar subscriptions i den med - - _inventoryLogger = new MossyInventory(); - - // Initialize navigation visualization system - navVisualization = new NavVisualization(); - - // Note: DECAL Harmony patches will be initialized in LoginComplete event - // where the chat system is available for error messages - - } - catch (Exception ex) - { - WriteToChat("Error during startup: " + ex.Message); - } - } - - protected override void Shutdown() - { - try - { - PluginSettings.Save(); - if (TelemetryEnabled) - Telemetry.Stop(); // ensure no dangling timer / HttpClient - WriteToChat("Mosswart Massacre is shutting down..."); - - // Unsubscribe from chat message event - CoreManager.Current.ChatBoxMessage -= new EventHandler(OnChatText); - CoreManager.Current.CommandLineText -= OnChatCommand; - CoreManager.Current.ChatBoxMessage -= new EventHandler(AllChatText); - CoreManager.Current.CharacterFilter.Death -= OnCharacterDeath; - CoreManager.Current.WorldFilter.CreateObject -= OnSpawn; - CoreManager.Current.WorldFilter.CreateObject -= OnPortalDetected; - CoreManager.Current.WorldFilter.ReleaseObject -= OnDespawn; - // Unsubscribe from inventory change events - CoreManager.Current.WorldFilter.CreateObject -= OnInventoryCreate; - CoreManager.Current.WorldFilter.ReleaseObject -= OnInventoryRelease; - CoreManager.Current.WorldFilter.ChangeObject -= OnInventoryChange; - - - // Stop and dispose of the timers - if (updateTimer != null) - { - updateTimer.Stop(); - updateTimer.Dispose(); - updateTimer = null; - } - - if (vitalsTimer != null) - { - vitalsTimer.Stop(); - vitalsTimer.Dispose(); - vitalsTimer = null; - } - - if (commandTimer != null) - { - commandTimer.Stop(); - commandTimer.Dispose(); - commandTimer = null; - } - - // Stop and dispose quest streaming timer - if (questStreamingTimer != null) - { - questStreamingTimer.Stop(); - questStreamingTimer.Elapsed -= OnQuestStreamingUpdate; - questStreamingTimer.Dispose(); - questStreamingTimer = null; - } - - // Dispose quest manager - if (questManager != null) - { - questManager.Dispose(); - questManager = null; - } - - // Clean up the view - ViewManager.ViewDestroy(); - //Disable vtank interface - vTank.Disable(); - // sluta lyssna på commands - WebSocket.OnServerCommand -= HandleServerCommand; - WebSocket.Stop(); - //shutdown inv - _inventoryLogger.Dispose(); - - // Clean up navigation visualization - if (navVisualization != null) - { - navVisualization.Dispose(); - navVisualization = null; - } - - // Clean up taper tracking - trackedTaperContainers.Clear(); - lastKnownStackSizes.Clear(); - - // Clean up Harmony patches - DecalHarmonyClean.Cleanup(); - - MyHost = null; - } - catch (Exception ex) - { - WriteToChat("Error during shutdown: " + ex.Message); - } - } - private void CharacterFilter_LoginComplete(object sender, EventArgs e) - { - WriteToChat("[DEBUG] CharacterFilter_LoginComplete event fired!"); - CoreManager.Current.CharacterFilter.LoginComplete -= CharacterFilter_LoginComplete; - - WriteToChat("Mosswart Massacre has started!"); - - - - PluginSettings.Initialize(); // Safe to call now - - // Apply the values - RareMetaEnabled = PluginSettings.Instance.RareMetaEnabled; - WebSocketEnabled = PluginSettings.Instance.WebSocketEnabled; - RemoteCommandsEnabled = PluginSettings.Instance.RemoteCommandsEnabled; - HttpServerEnabled = PluginSettings.Instance.HttpServerEnabled; - TelemetryEnabled = PluginSettings.Instance.TelemetryEnabled; - CharTag = PluginSettings.Instance.CharTag; - ViewManager.SetRareMetaToggleState(RareMetaEnabled); - ViewManager.RefreshSettingsFromConfig(); // Refresh all UI settings after loading - if (TelemetryEnabled) - Telemetry.Start(); - if (WebSocketEnabled) - WebSocket.Start(); - - // Initialize Harmony patches using UtilityBelt's loaded DLL - try - { - bool success = DecalHarmonyClean.Initialize(); - if (success) - WriteToChat("[OK] Plugin message interception active"); - else - WriteToChat("[FAIL] Could not initialize message interception"); - } - catch (Exception ex) - { - WriteToChat($"[ERROR] Harmony initialization failed: {ex.Message}"); - } - - // Initialize death tracking - totalDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); - sessionDeaths = 0; - - // Initialize cached Prismatic Taper count - InitializePrismaticTaperCount(); - - // Initialize quest manager for always-on quest streaming - try - { - questManager = new QuestManager(); - questManager.RefreshQuests(); - - // Initialize quest streaming timer (30 seconds) - questStreamingTimer = new Timer(30000); - questStreamingTimer.Elapsed += OnQuestStreamingUpdate; - questStreamingTimer.AutoReset = true; - questStreamingTimer.Start(); - - WriteToChat("[OK] Quest streaming initialized"); - } - catch (Exception ex) - { - WriteToChat($"[ERROR] Quest streaming initialization failed: {ex.Message}"); - } - - } - - #region Quest Streaming Methods - private static void OnQuestStreamingUpdate(object sender, ElapsedEventArgs e) - { - try - { - // Stream high priority quest data via WebSocket - if (WebSocketEnabled && questManager?.QuestList != null && questManager.QuestList.Count > 0) - { - var currentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); - - // Find and stream priority quests (deduplicated by quest ID) - var priorityQuests = questManager.QuestList - .Where(q => IsHighPriorityQuest(q.Id)) - .GroupBy(q => q.Id) - .Select(g => g.First()) // Take first occurrence of each quest ID - .ToList(); - - foreach (var quest in priorityQuests) - { - try - { - string questName = questManager.GetFriendlyQuestName(quest.Id); - long timeRemaining = quest.ExpireTime - currentTime; - string countdown = FormatCountdown(timeRemaining); - - // Stream quest data - System.Threading.Tasks.Task.Run(() => WebSocket.SendQuestDataAsync(questName, countdown)); - } - catch (Exception) - { - // Silently handle individual quest streaming errors - } - } - } - } - catch (Exception) - { - // Silently handle quest streaming errors to avoid spam - } - } - - private static bool IsHighPriorityQuest(string questId) - { - return questId == "stipendtimer_0812" || // Changed from stipendtimer_monthly to stipendtimer_0812 - questId == "augmentationblankgemacquired" || - questId == "insatiableeaterjaw"; - } - - private static string FormatCountdown(long seconds) - { - if (seconds <= 0) - return "READY"; - - var timeSpan = TimeSpan.FromSeconds(seconds); - - if (timeSpan.TotalDays >= 1) - return $"{(int)timeSpan.TotalDays}d {timeSpan.Hours:D2}h"; - else if (timeSpan.TotalHours >= 1) - return $"{timeSpan.Hours}h {timeSpan.Minutes:D2}m"; - else if (timeSpan.TotalMinutes >= 1) - return $"{timeSpan.Minutes}m {timeSpan.Seconds:D2}s"; - else - return $"{timeSpan.Seconds}s"; - } - #endregion - - private void InitializeForHotReload() - { - // This method handles initialization that depends on character being logged in - // Similar to LoginComplete but designed for hot reload scenarios - - WriteToChat("Mosswart Massacre hot reload initialization started!"); - - // 1. Initialize settings - CRITICAL first step - PluginSettings.Initialize(); - - // 2. Apply the values from settings - RareMetaEnabled = PluginSettings.Instance.RareMetaEnabled; - WebSocketEnabled = PluginSettings.Instance.WebSocketEnabled; - RemoteCommandsEnabled = PluginSettings.Instance.RemoteCommandsEnabled; - HttpServerEnabled = PluginSettings.Instance.HttpServerEnabled; - TelemetryEnabled = PluginSettings.Instance.TelemetryEnabled; - CharTag = PluginSettings.Instance.CharTag; - - // 3. Update UI with current settings - ViewManager.SetRareMetaToggleState(RareMetaEnabled); - ViewManager.RefreshSettingsFromConfig(); - - // 4. Restart services if they were enabled (stop first, then start) - if (TelemetryEnabled) - { - Telemetry.Stop(); // Stop existing - Telemetry.Start(); // Restart - } - - if (WebSocketEnabled) - { - WebSocket.Stop(); // Stop existing - WebSocket.Start(); // Restart - } - - if (HttpServerEnabled) - { - HttpCommandServer.Stop(); // Stop existing - HttpCommandServer.Start(); // Restart - } - - // 5. Initialize Harmony patches (only if not already done) - // Note: Harmony patches are global and don't need reinitialization - if (!DecalHarmonyClean.IsActive()) - { - try - { - bool success = DecalHarmonyClean.Initialize(); - if (success) - WriteToChat("[OK] Plugin message interception active"); - else - WriteToChat("[FAIL] Could not initialize message interception"); - } - catch (Exception ex) - { - WriteToChat($"[ERROR] Harmony initialization failed: {ex.Message}"); - } - } - - // 6. Reinitialize death tracking - totalDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); - // Don't reset sessionDeaths - keep the current session count - - // 7. Reinitialize cached Prismatic Taper count - InitializePrismaticTaperCount(); - - WriteToChat("Hot reload initialization completed!"); - } - - private void InitializePrismaticTaperCount() - { - try - { - lastPrismaticCount = cachedPrismaticCount; - cachedPrismaticCount = Utils.GetItemStackSize("Prismatic Taper"); - - // Initialize tracking for existing tapers - trackedTaperContainers.Clear(); - lastKnownStackSizes.Clear(); - - foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory()) - { - if (wo.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase) && - IsPlayerOwnedContainer(wo.Container)) - { - int stackCount = wo.Values(LongValueKey.StackCount, 1); - trackedTaperContainers[wo.Id] = wo.Container; - lastKnownStackSizes[wo.Id] = stackCount; - } - } - - } - catch (Exception ex) - { - WriteToChat($"[TAPER] Error initializing count: {ex.Message}"); - cachedPrismaticCount = 0; - lastPrismaticCount = 0; - trackedTaperContainers.Clear(); - lastKnownStackSizes.Clear(); - } - } - - private bool IsPlayerOwnedContainer(int containerId) - { - try - { - // Check if it's the player's main inventory - if (containerId == CoreManager.Current.CharacterFilter.Id) - return true; - - // Check if it's one of the player's containers (side packs) - // Get the container object to verify it belongs to the player - WorldObject container = CoreManager.Current.WorldFilter[containerId]; - if (container != null && - container.ObjectClass == ObjectClass.Container && - container.Container == CoreManager.Current.CharacterFilter.Id) - { - return true; - } - - return false; - } - catch - { - return false; - } - } - - private void OnInventoryCreate(object sender, CreateObjectEventArgs e) - { - try - { - var item = e.New; - if (IsPlayerOwnedContainer(item.Container) && - item.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) - { - lastPrismaticCount = cachedPrismaticCount; - int stackCount = item.Values(LongValueKey.StackCount, 1); - cachedPrismaticCount += stackCount; - int delta = cachedPrismaticCount - lastPrismaticCount; - - // Initialize tracking for this new taper - trackedTaperContainers[item.Id] = item.Container; - lastKnownStackSizes[item.Id] = stackCount; - - } - } - catch (Exception ex) - { - WriteToChat($"[TAPER] Error in OnInventoryCreate: {ex.Message}"); - } - } - - private void OnInventoryRelease(object sender, ReleaseObjectEventArgs e) - { - try - { - var item = e.Released; - if (item.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) - { - // Check where this taper WAS before being released (not where it's going) - if (trackedTaperContainers.TryGetValue(item.Id, out int previousContainer)) - { - if (IsPlayerOwnedContainer(previousContainer)) - { - // This taper was in our inventory and is now being released - lastPrismaticCount = cachedPrismaticCount; - int stackCount = item.Values(LongValueKey.StackCount, 1); - cachedPrismaticCount -= stackCount; - } - - // Clean up tracking - trackedTaperContainers.Remove(item.Id); - lastKnownStackSizes.Remove(item.Id); - } - else - { - // Fallback: recalculate total count when untracked taper is released - lastPrismaticCount = cachedPrismaticCount; - cachedPrismaticCount = Utils.GetItemStackSize("Prismatic Taper"); - } - } - } - catch (Exception ex) - { - WriteToChat($"[TAPER] Error in OnInventoryRelease: {ex.Message}"); - } - } - - private void OnInventoryChange(object sender, ChangeObjectEventArgs e) - { - try - { - var item = e.Changed; - if (item.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) - { - bool isInPlayerContainer = IsPlayerOwnedContainer(item.Container); - - // Track container location for release detection - if (isInPlayerContainer) - { - bool wasAlreadyTracked = trackedTaperContainers.ContainsKey(item.Id); - trackedTaperContainers[item.Id] = item.Container; - - // Handle stack size changes with pure delta math - int currentStack = item.Values(LongValueKey.StackCount, 1); - - // Check if this is a pickup from ground (item not previously tracked) - if (!wasAlreadyTracked) - { - // This is likely a pickup from ground - increment count - lastPrismaticCount = cachedPrismaticCount; - cachedPrismaticCount += currentStack; - } - else if (lastKnownStackSizes.TryGetValue(item.Id, out int previousStack)) - { - int stackDelta = currentStack - previousStack; - if (stackDelta != 0) - { - lastPrismaticCount = cachedPrismaticCount; - cachedPrismaticCount += stackDelta; - } - } - - lastKnownStackSizes[item.Id] = currentStack; - } - // Item is no longer in player containers - // DON'T clean up tracking here - let OnInventoryRelease handle cleanup - // This ensures tracking data is available for the Release event - } - } - catch (Exception ex) - { - WriteToChat($"[TAPER] Error in OnInventoryChange: {ex.Message}"); - } - } - - private async void OnSpawn(object sender, CreateObjectEventArgs e) - { - var mob = e.New; - if (mob.ObjectClass != ObjectClass.Monster) return; - - try - { - // Get DECAL coordinates - var decalCoords = mob.Coordinates(); - if (decalCoords == null) return; - - const string fmt = "F7"; - string ns = decalCoords.NorthSouth.ToString(fmt, CultureInfo.InvariantCulture); - string ew = decalCoords.EastWest.ToString(fmt, CultureInfo.InvariantCulture); - - // Get Z coordinate using RawCoordinates() for accurate world Z position - string zCoord = "0"; - try - { - var rawCoords = mob.RawCoordinates(); - if (rawCoords != null) - { - zCoord = rawCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - else - { - // Fallback to player Z approximation if RawCoordinates fails - var playerCoords = Coordinates.Me; - if (Math.Abs(playerCoords.Z) > 0.1) - { - zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - } - } - catch - { - // Fallback to player Z approximation on error - try - { - var playerCoords = Coordinates.Me; - if (Math.Abs(playerCoords.Z) > 0.1) - { - zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - } - catch - { - zCoord = "0"; - } - } - - await WebSocket.SendSpawnAsync(ns, ew, zCoord, mob.Name); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[WS] Spawn send failed: {ex}"); - } - } - - private async void OnPortalDetected(object sender, CreateObjectEventArgs e) - { - var portal = e.New; - if (portal.ObjectClass != ObjectClass.Portal) return; - - try - { - // Get portal coordinates from DECAL - var decalCoords = portal.Coordinates(); - if (decalCoords == null) return; - - const string fmt = "F7"; - string ns = decalCoords.NorthSouth.ToString(fmt, CultureInfo.InvariantCulture); - string ew = decalCoords.EastWest.ToString(fmt, CultureInfo.InvariantCulture); - - // Get Z coordinate using RawCoordinates() for accurate world Z position - string zCoord = "0"; - try - { - var rawCoords = portal.RawCoordinates(); - if (rawCoords != null) - { - zCoord = rawCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - else - { - // Fallback to player Z approximation if RawCoordinates fails - var playerCoords = Coordinates.Me; - if (Math.Abs(playerCoords.Z) > 0.1) - { - zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - } - } - catch - { - // Fallback to player Z approximation on error - try - { - var playerCoords = Coordinates.Me; - if (Math.Abs(playerCoords.Z) > 0.1) - { - zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - } - catch - { - zCoord = "0"; - } - } - - await WebSocket.SendPortalAsync(ns, ew, zCoord, portal.Name); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[PORTAL ERROR] {ex.Message}"); - PluginCore.WriteToChat($"[WS] Portal send failed: {ex}"); - } - } - - - private void OnDespawn(object sender, ReleaseObjectEventArgs e) - { - var mob = e.Released; - if (mob.ObjectClass != ObjectClass.Monster) return; - - - // var c = mob.Coordinates(); - // PluginCore.WriteToChat( - // $"[Despawn] {mob.Name} @ (NS={c.NorthSouth:F1}, EW={c.EastWest:F1})"); - } - - private async void AllChatText(object sender, ChatTextInterceptEventArgs e) - { - try - { - string cleaned = NormalizeChatLine(e.Text); - - // Send to WebSocket - await WebSocket.SendChatTextAsync(e.Color, cleaned); - - // Note: Plugin message analysis is now handled by Harmony patches - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[WS] Chat send failed: {ex}"); - } - } - - private static string NormalizeChatLine(string raw) - { - if (string.IsNullOrEmpty(raw)) - return raw; - - // 1) Remove all <…> tags - var noTags = Regex.Replace(raw, "<[^>]+>", ""); - - // 2) Trim trailing newline or carriage-return - var trimmed = noTags.TrimEnd('\r', '\n'); - - // 3) Collapse multiple spaces into one - var collapsed = Regex.Replace(trimmed, @"[ ]{2,}", " "); - - return collapsed; - } - - private void OnCharacterDeath(object sender, Decal.Adapter.Wrappers.DeathEventArgs e) - { - sessionDeaths++; - totalDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); - } - - private void HandleServerCommand(CommandEnvelope env) - { - // This is called from WebSocket thread - queue for main thread execution - lock (pendingCommands) - { - pendingCommands.Enqueue(env.Command); - } - } - - private void ProcessPendingCommands(object sender, EventArgs e) - { - // This runs on the main UI thread via Windows Forms timer - string command = null; - - lock (pendingCommands) - { - if (pendingCommands.Count > 0) - command = pendingCommands.Dequeue(); - } - - if (command != null) - { - try - { - // Execute ALL WebSocket commands on main thread - fast and reliable - DispatchChatToBoxWithPluginIntercept(command); - } - catch (Exception ex) - { - WriteToChat($"[WS] Command execution error: {ex.Message}"); - } - } - } - - private void OnChatText(object sender, ChatTextInterceptEventArgs e) - { - try - { - - if (IsKilledByMeMessage(e.Text)) - { - totalKills++; - lastKillTime = DateTime.Now; - CalculateKillsPerInterval(); - ViewManager.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); - } - - if (IsRareDiscoveryMessage(e.Text, out string rareText)) - { - rareCount++; - ViewManager.UpdateRareCount(rareCount); - - if (RareMetaEnabled) - { - Decal_DispatchOnChatCommand("/vt setmetastate loot_rare"); - } - - DelayedCommandManager.AddDelayedCommand($"/a {rareText}", 3000); - // Fire and forget: we don't await, since sending is not critical and we don't want to block. - _ = WebSocket.SendRareAsync(rareText); - } - - if (e.Color == 18 && e.Text.EndsWith("!report\"")) - { - TimeSpan elapsed = DateTime.Now - statsStartTime; - string reportMessage = $"Total Kills: {totalKills}, Kills per Hour: {killsPerHour:F2}, Elapsed Time: {elapsed:dd\\.hh\\:mm\\:ss}, Rares Found: {rareCount}"; - WriteToChat($"[Mosswart Massacre] Reporting to allegiance: {reportMessage}"); - MyHost.Actions.InvokeChatParser($"/a {reportMessage}"); - } - if (RemoteCommandsEnabled && e.Color == 18) - { - string characterName = Regex.Escape(CoreManager.Current.CharacterFilter.Name); - string pattern = $@"^\[Allegiance\].*Dunking Rares.*say[s]?, \""!do {characterName} (?.+)\""$"; - string tag = Regex.Escape(PluginCore.CharTag); - string patterntag = $@"^\[Allegiance\].*Dunking Rares.*say[s]?, \""!dot {tag} (?.+)\""$"; - - - var match = Regex.Match(e.Text, pattern); - var matchtag = Regex.Match(e.Text, patterntag); - - if (match.Success) - { - string command = match.Groups["command"].Value; - DispatchChatToBoxWithPluginIntercept(command); - DelayedCommandManager.AddDelayedCommand($"/a [Remote] Executing: {command}", 2000); - } - else if (matchtag.Success) - { - string command = matchtag.Groups["command"].Value; - DispatchChatToBoxWithPluginIntercept(command); - DelayedCommandManager.AddDelayedCommand($"/a [Remote] Executing: {command}", 2000); - } - - } - - - - - - - - - } - catch (Exception ex) - { - WriteToChat("Error processing chat message: " + ex.Message); - } - } - private void OnChatCommand(object sender, ChatParserInterceptEventArgs e) - { - try - { - if (e.Text.StartsWith("/mm", StringComparison.OrdinalIgnoreCase)) - { - e.Eat = true; // Prevent the message from showing in chat - HandleMmCommand(e.Text); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[Error] Failed to process /mm command: {ex.Message}"); - } - } - - private void UpdateStats(object sender, ElapsedEventArgs e) - { - try - { - // Update the elapsed time - TimeSpan elapsed = DateTime.Now - statsStartTime; - ViewManager.UpdateElapsedTime(elapsed); - - // Recalculate kill rates - CalculateKillsPerInterval(); - ViewManager.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); - - } - catch (Exception ex) - { - WriteToChat("Error updating stats: " + ex.Message); - } - } - - private static void SendVitalsUpdate(object sender, ElapsedEventArgs e) - { - try - { - // Only send if WebSocket is enabled - if (!WebSocketEnabled) - return; - - // Collect vitals data - int currentHealth = CoreManager.Current.Actions.Vital[VitalType.CurrentHealth]; - int currentStamina = CoreManager.Current.Actions.Vital[VitalType.CurrentStamina]; - int currentMana = CoreManager.Current.Actions.Vital[VitalType.CurrentMana]; - - int maxHealth = CoreManager.Current.Actions.Vital[VitalType.MaximumHealth]; - int maxStamina = CoreManager.Current.Actions.Vital[VitalType.MaximumStamina]; - int maxMana = CoreManager.Current.Actions.Vital[VitalType.MaximumMana]; - - int vitae = CoreManager.Current.CharacterFilter.Vitae; - - // Create vitals data structure - var vitalsData = new - { - type = "vitals", - timestamp = DateTime.UtcNow.ToString("o"), - character_name = CoreManager.Current.CharacterFilter.Name, - health_current = currentHealth, - health_max = maxHealth, - health_percentage = maxHealth > 0 ? Math.Round((double)currentHealth / maxHealth * 100, 1) : 0, - stamina_current = currentStamina, - stamina_max = maxStamina, - stamina_percentage = maxStamina > 0 ? Math.Round((double)currentStamina / maxStamina * 100, 1) : 0, - mana_current = currentMana, - mana_max = maxMana, - mana_percentage = maxMana > 0 ? Math.Round((double)currentMana / maxMana * 100, 1) : 0, - vitae = vitae - }; - - // Send via WebSocket - _ = WebSocket.SendVitalsAsync(vitalsData); - } - catch (Exception ex) - { - WriteToChat($"Error sending vitals: {ex.Message}"); - } - } - - private void CalculateKillsPerInterval() - { - double minutesElapsed = (DateTime.Now - statsStartTime).TotalMinutes; - - if (minutesElapsed > 0) - { - killsPer5Min = (totalKills / minutesElapsed) * 5; - killsPerHour = (totalKills / minutesElapsed) * 60; - } - } - - private bool IsKilledByMeMessage(string text) - { - string[] killPatterns = new string[] - { - @"^You flatten (?.+)'s body with the force of your assault!$", - @"^You bring (?.+) to a fiery end!$", - @"^You beat (?.+) to a lifeless pulp!$", - @"^You smite (?.+) mightily!$", - @"^You obliterate (?.+)!$", - @"^You run (?.+) through!$", - @"^You reduce (?.+) to a sizzling, oozing mass!$", - @"^You knock (?.+) into next Morningthaw!$", - @"^You split (?.+) apart!$", - @"^You cleave (?.+) in twain!$", - @"^You slay (?.+) viciously enough to impart death several times over!$", - @"^You reduce (?.+) to a drained, twisted corpse!$", - @"^Your killing blow nearly turns (?.+) inside-out!$", - @"^Your attack stops (?.+) cold!$", - @"^Your lightning coruscates over (?.+)'s mortal remains!$", - @"^Your assault sends (?.+) to an icy death!$", - @"^You killed (?.+)!$", - @"^The thunder of crushing (?.+) is followed by the deafening silence of death!$", - @"^The deadly force of your attack is so strong that (?.+)'s ancestors feel it!$", - @"^(?.+)'s seared corpse smolders before you!$", - @"^(?.+) is reduced to cinders!$", - @"^(?.+) is shattered by your assault!$", - @"^(?.+) catches your attack, with dire consequences!$", - @"^(?.+) is utterly destroyed by your attack!$", - @"^(?.+) suffers a frozen fate!$", - @"^(?.+)'s perforated corpse falls before you!$", - @"^(?.+) is fatally punctured!$", - @"^(?.+)'s death is preceded by a sharp, stabbing pain!$", - @"^(?.+) is torn to ribbons by your assault!$", - @"^(?.+) is liquified by your attack!$", - @"^(?.+)'s last strength dissolves before you!$", - @"^Electricity tears (?.+) apart!$", - @"^Blistered by lightning, (?.+) falls!$", - @"^(?.+)'s last strength withers before you!$", - @"^(?.+) is dessicated by your attack!$", - @"^(?.+) is incinerated by your assault!$" - }; - - foreach (string pattern in killPatterns) - { - if (Regex.IsMatch(text, pattern)) - return true; - } - - return false; - } - private bool IsRareDiscoveryMessage(string text, out string rareTextOnly) - { - rareTextOnly = null; - - // Match pattern: " has discovered the !" - string pattern = @"^(?['A-Za-z ]+)\shas discovered the (?.*?)!$"; - Match match = Regex.Match(text, pattern); - - if (match.Success && match.Groups["name"].Value == CoreManager.Current.CharacterFilter.Name) - { - rareTextOnly = match.Groups["item"].Value; // just "Ancient Pickle" - return true; - } - - return false; - } - public static void WriteToChat(string message) - { - try - { - // For hot reload scenarios where MyHost might be null, use CoreManager directly - if (MyHost != null) - { - MyHost.Actions.AddChatText("[Mosswart Massacre] " + message, 0, 1); - } - else - { - // Hot reload fallback - use CoreManager directly like the original template - CoreManager.Current.Actions.AddChatText("[Mosswart Massacre] " + message, 1); - } - } - catch (Exception ex) - { - // Last resort fallback - try CoreManager even if MyHost was supposed to work - try - { - CoreManager.Current.Actions.AddChatText($"[Mosswart Massacre] {message} (WriteToChat error: {ex.Message})", 1); - } - catch - { - // Give up - can't write to chat at all - } - } - } - public static void RestartStats() - { - totalKills = 0; - rareCount = 0; - sessionDeaths = 0; // Reset session deaths only - statsStartTime = DateTime.Now; - killsPer5Min = 0; - killsPerHour = 0; - - WriteToChat($"Stats have been reset. Session deaths: {sessionDeaths}, Total deaths: {totalDeaths}"); - ViewManager.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); - ViewManager.UpdateRareCount(rareCount); - } - public static void ToggleRareMeta() - { - PluginSettings.Instance.RareMetaEnabled = !PluginSettings.Instance.RareMetaEnabled; - RareMetaEnabled = PluginSettings.Instance.RareMetaEnabled; - ViewManager.SetRareMetaToggleState(RareMetaEnabled); - } - - [DllImport("Decal.dll")] - private static extern int DispatchOnChatCommand(ref IntPtr str, [MarshalAs(UnmanagedType.U4)] int target); - - public static bool Decal_DispatchOnChatCommand(string cmd) - { - IntPtr bstr = Marshal.StringToBSTR(cmd); - - try - { - bool eaten = (DispatchOnChatCommand(ref bstr, 1) & 0x1) > 0; - return eaten; - } - finally - { - Marshal.FreeBSTR(bstr); - } - } - public static void DispatchChatToBoxWithPluginIntercept(string cmd) - { - if (!Decal_DispatchOnChatCommand(cmd)) - CoreManager.Current.Actions.InvokeChatParser(cmd); - } - private void HandleMmCommand(string text) - { - // Remove the /mm prefix and trim extra whitespace - string[] args = text.Substring(3).Trim().Split(' '); - - if (args.Length == 0 || string.IsNullOrEmpty(args[0])) - { - WriteToChat("Usage: /mm . Try /mm help"); - return; - } - - string subCommand = args[0].ToLower(); - - switch (subCommand) - { - case "telemetry": - if (args.Length > 1) - { - if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) - { - TelemetryEnabled = true; - Telemetry.Start(); - PluginSettings.Instance.TelemetryEnabled = true; - WriteToChat("Telemetry streaming ENABLED."); - } - else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) - { - TelemetryEnabled = false; - Telemetry.Stop(); - PluginSettings.Instance.TelemetryEnabled = false; - WriteToChat("Telemetry streaming DISABLED."); - } - else - { - WriteToChat("Usage: /mm telemetry "); - } - } - else - { - WriteToChat("Usage: /mm telemetry "); - } - break; - case "ws": - if (args.Length > 1) - { - if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) - { - WebSocketEnabled = true; - WebSocket.Start(); - PluginSettings.Instance.WebSocketEnabled = true; - WriteToChat("WS streaming ENABLED."); - } - else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) - { - WebSocketEnabled = false; - WebSocket.Stop(); - PluginSettings.Instance.WebSocketEnabled = false; - WriteToChat("WS streaming DISABLED."); - } - else - { - WriteToChat("Usage: /mm ws "); - } - } - - else - { - WriteToChat("Usage: /mm ws "); - } - break; - case "help": - WriteToChat("Mosswart Massacre Commands:"); - WriteToChat("/mm report - Show current stats"); - WriteToChat("/mm loc - Show current location"); - WriteToChat("/mm telemetry - Telemetry streaming enable|disable"); - WriteToChat("/mm ws - Websocket streaming enable|disable"); - WriteToChat("/mm reset - Reset all counters"); - WriteToChat("/mm meta - Toggle rare meta state"); - WriteToChat("/mm http - Local http-command server enable|disable"); - WriteToChat("/mm remotecommand - Listen to allegiance !do/!dot enable|disable"); - WriteToChat("/mm getmetastate - Gets the current metastate"); - WriteToChat("/mm nextwp - Advance VTank to next waypoint"); - WriteToChat("/mm decalstatus - Check Harmony patch status (UtilityBelt version)"); - WriteToChat("/mm decaldebug - Enable/disable plugin message debug output + WebSocket streaming"); - WriteToChat("/mm harmonyraw - Show raw intercepted messages (debug output)"); - WriteToChat("/mm testprismatic - Test Prismatic Taper detection and icon lookup"); - WriteToChat("/mm deathstats - Show current death tracking statistics"); - WriteToChat("/mm testtaper - Test cached Prismatic Taper tracking"); - WriteToChat("/mm debugtaper - Show detailed taper tracking debug info"); - WriteToChat("/mm gui - Manually initialize/reinitialize GUI!!!"); - break; - case "report": - TimeSpan elapsed = DateTime.Now - statsStartTime; - string reportMessage = $"Total Kills: {totalKills}, Kills per Hour: {killsPerHour:F2}, Elapsed Time: {elapsed:dd\\.hh\\:mm\\:ss}, Rares Found: {rareCount}, Session Deaths: {sessionDeaths}, Total Deaths: {totalDeaths}"; - WriteToChat(reportMessage); - break; - case "getmetastate": - string metaState = VtankControl.VtGetMetaState(); - WriteToChat(metaState); - break; - - case "loc": - Coordinates here = Coordinates.Me; - var pos = Utils.GetPlayerPosition(); - WriteToChat($"Location: {here} (X={pos.X:F1}, Y={pos.Y:F1}, Z={pos.Z:F1})"); - break; - case "reset": - RestartStats(); - break; - case "meta": - RareMetaEnabled = !RareMetaEnabled; - WriteToChat($"Rare meta state is now {(RareMetaEnabled ? "ON" : "OFF")}"); - ViewManager.SetRareMetaToggleState(RareMetaEnabled); // <-- sync the UI - break; - case "http": - if (args.Length > 1) - { - if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) - { - PluginSettings.Instance.HttpServerEnabled = true; - HttpServerEnabled = true; - HttpCommandServer.Start(); - } - else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) - { - PluginSettings.Instance.HttpServerEnabled = false; - HttpServerEnabled = false; - HttpCommandServer.Stop(); - } - else - { - WriteToChat("Usage: /mm http "); - } - } - else - { - WriteToChat("Usage: /mm http "); - } - break; - - case "remotecommands": - if (args.Length > 1) - { - if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) - { - PluginSettings.Instance.RemoteCommandsEnabled = true; - RemoteCommandsEnabled = true; - WriteToChat("Remote command listening is now ENABLED."); - } - else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) - { - PluginSettings.Instance.RemoteCommandsEnabled = false; - RemoteCommandsEnabled = false; - WriteToChat("Remote command listening is now DISABLED."); - } - else - { - WriteToChat("Invalid remotecommands argument. Use 'enable' or 'disable'."); - } - } - else - { - WriteToChat("Usage: /mm remotecommands "); - } - break; - - case "nextwp": - double result = VtankControl.VtAdvanceWaypoint(); - if (result == 1) - { - WriteToChat("Advanced VTank to next waypoint."); - } - else - { - WriteToChat("Failed to advance VTank waypoint. Is VTank running?"); - } - break; - - case "vtanktest": - try - { - WriteToChat("Testing VTank interface..."); - WriteToChat($"VTank Instance: {(vTank.Instance != null ? "Found" : "NULL")}"); - WriteToChat($"VTank Type: {vTank.Instance?.GetType()?.Name ?? "NULL"}"); - WriteToChat($"NavCurrent: {vTank.Instance?.NavCurrent ?? -1}"); - WriteToChat($"NavNumPoints: {vTank.Instance?.NavNumPoints ?? -1}"); - WriteToChat($"NavType: {vTank.Instance?.NavType}"); - WriteToChat($"MacroEnabled: {vTank.Instance?.MacroEnabled}"); - } - catch (Exception ex) - { - WriteToChat($"VTank test error: {ex.Message}"); - } - break; - - case "decalstatus": - try - { - WriteToChat("=== Harmony Patch Status (UtilityBelt Pattern) ==="); - WriteToChat($"Patches Active: {DecalHarmonyClean.IsActive()}"); - WriteToChat($"Messages Intercepted: {DecalHarmonyClean.GetMessagesIntercepted()}"); - WriteToChat($"WebSocket Streaming: {(AggressiveChatStreamingEnabled && WebSocketEnabled ? "ACTIVE" : "INACTIVE")}"); - - // Test Harmony availability - WriteToChat("=== Harmony Version Status ==="); - try - { - var harmonyTest = Harmony.HarmonyInstance.Create("test.version.check"); - WriteToChat($"[OK] Harmony Available (ID: {harmonyTest.Id})"); - - // Check Harmony assembly version - var harmonyAssembly = typeof(Harmony.HarmonyInstance).Assembly; - WriteToChat($"[OK] Harmony Version: {harmonyAssembly.GetName().Version}"); - WriteToChat($"[OK] Harmony Location: {harmonyAssembly.Location}"); - } - catch (Exception harmonyEx) - { - WriteToChat($"[FAIL] Harmony Test Failed: {harmonyEx.Message}"); - } - } - catch (Exception ex) - { - WriteToChat($"Status check error: {ex.Message}"); - } - break; - - case "decaldebug": - if (args.Length > 1) - { - if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) - { - AggressiveChatStreamingEnabled = true; - WriteToChat("[OK] DECAL debug streaming ENABLED - will show captured messages + stream via WebSocket"); - } - else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) - { - AggressiveChatStreamingEnabled = false; - WriteToChat("[FAIL] DECAL debug streaming DISABLED - WebSocket streaming also disabled"); - } - else - { - WriteToChat("Usage: /mm decaldebug "); - } - } - else - { - WriteToChat("Usage: /mm decaldebug "); - } - break; - - - case "harmonyraw": - // Debug functionality removed - break; - - case "initgui": - case "gui": - try - { - WriteToChat("Attempting to manually initialize GUI..."); - ViewManager.ViewDestroy(); // Clean up any existing view - ViewManager.ViewInit(); // Reinitialize - WriteToChat("GUI initialization attempt completed."); - } - catch (Exception ex) - { - WriteToChat($"GUI initialization error: {ex.Message}"); - } - break; - - case "testprismatic": - try - { - WriteToChat("=== FULL INVENTORY DUMP ==="); - var worldFilter = CoreManager.Current.WorldFilter; - var playerInv = CoreManager.Current.CharacterFilter.Id; - - WriteToChat("Listing ALL items in your main inventory:"); - int itemNum = 1; - - foreach (WorldObject item in worldFilter.GetByContainer(playerInv)) - { - if (!string.IsNullOrEmpty(item.Name)) - { - int stackCount = item.Values(LongValueKey.StackCount, 0); - WriteToChat($"{itemNum:D2}: '{item.Name}' (count: {stackCount}, icon: 0x{item.Icon:X}, class: {item.ObjectClass})"); - itemNum++; - - // Highlight anything that might be a taper - string nameLower = item.Name.ToLower(); - if (nameLower.Contains("taper") || nameLower.Contains("prismatic") || - nameLower.Contains("prism") || nameLower.Contains("component")) - { - WriteToChat($" *** POSSIBLE MATCH: '{item.Name}' ***"); - } - } - } - - WriteToChat($"=== Total items listed: {itemNum - 1} ==="); - - // Now test our utility functions on the found Prismatic Taper - WriteToChat("=== Testing Utility Functions on Prismatic Taper ==="); - var foundItem = Utils.FindItemByName("Prismatic Taper"); - if (foundItem != null) - { - WriteToChat($"SUCCESS! Found: '{foundItem.Name}'"); - WriteToChat($"Utils.GetItemStackSize: {Utils.GetItemStackSize("Prismatic Taper")}"); - WriteToChat($"Utils.GetItemIcon: 0x{Utils.GetItemIcon("Prismatic Taper"):X}"); - WriteToChat($"Utils.GetItemDisplayIcon: 0x{Utils.GetItemDisplayIcon("Prismatic Taper"):X}"); - WriteToChat("=== TELEMETRY WILL NOW WORK! ==="); - } - else - { - WriteToChat("ERROR: Still can't find Prismatic Taper with utility functions!"); - } - } - catch (Exception ex) - { - WriteToChat($"Search error: {ex.Message}"); - } - break; - - case "deathstats": - try - { - WriteToChat("=== Death Tracking Statistics ==="); - WriteToChat($"Session Deaths: {sessionDeaths}"); - WriteToChat($"Total Deaths: {totalDeaths}"); - - // Get current character death count to verify sync - int currentCharDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); - WriteToChat($"Character Property NumDeaths: {currentCharDeaths}"); - - if (currentCharDeaths != totalDeaths) - { - WriteToChat($"[WARNING] Death count sync issue detected!"); - WriteToChat($"Updating totalDeaths from {totalDeaths} to {currentCharDeaths}"); - totalDeaths = currentCharDeaths; - } - - WriteToChat("Death tracking is active and will increment on character death."); - } - catch (Exception ex) - { - WriteToChat($"Death stats error: {ex.Message}"); - } - break; - - case "testdeath": - try - { - WriteToChat("=== Manual Death Test ==="); - WriteToChat($"Current sessionDeaths variable: {sessionDeaths}"); - WriteToChat($"Current totalDeaths variable: {totalDeaths}"); - - // Read directly from character property - int currentCharDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); - WriteToChat($"Character Property NumDeaths (43): {currentCharDeaths}"); - - // Manually increment session deaths for testing - sessionDeaths++; - WriteToChat($"Manually incremented sessionDeaths to: {sessionDeaths}"); - WriteToChat("Note: This doesn't simulate a real death, just tests the tracking variables."); - - // Check if death event is properly subscribed - WriteToChat($"Death event subscription check:"); - var deathEvent = typeof(Decal.Adapter.Wrappers.CharacterFilter).GetEvent("Death"); - WriteToChat($"Death event exists: {deathEvent != null}"); - } - catch (Exception ex) - { - WriteToChat($"Test death error: {ex.Message}"); - } - break; - - case "testtaper": - try - { - WriteToChat("=== Cached Taper Tracking Test ==="); - WriteToChat($"Cached Count: {cachedPrismaticCount}"); - WriteToChat($"Last Count: {lastPrismaticCount}"); - - // Compare with Utils function - int utilsCount = Utils.GetItemStackSize("Prismatic Taper"); - WriteToChat($"Utils Count: {utilsCount}"); - - if (cachedPrismaticCount == utilsCount) - { - WriteToChat("[OK] Cached count matches Utils count"); - } - else - { - WriteToChat($"[WARNING] Count mismatch! Cached: {cachedPrismaticCount}, Utils: {utilsCount}"); - WriteToChat("Refreshing cached count..."); - InitializePrismaticTaperCount(); - } - - WriteToChat("=== Container Analysis ==="); - int mainPackCount = 0; - int sidePackCount = 0; - int playerId = CoreManager.Current.CharacterFilter.Id; - - foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory()) - { - if (wo.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) - { - int stackCount = wo.Values(LongValueKey.StackCount, 1); - if (wo.Container == playerId) - { - mainPackCount += stackCount; - } - else - { - sidePackCount += stackCount; - } - } - } - - WriteToChat($"Main Pack Tapers: {mainPackCount}"); - WriteToChat($"Side Pack Tapers: {sidePackCount}"); - WriteToChat($"Total: {mainPackCount + sidePackCount}"); - - WriteToChat("=== Event System Status ==="); - WriteToChat($"Tracking {trackedTaperContainers.Count} taper stacks for delta detection"); - WriteToChat($"Known stack sizes: {lastKnownStackSizes.Count} items"); - WriteToChat("Pure delta tracking - NO expensive inventory scans during events!"); - WriteToChat("Now tracks: consumption, drops, trades, container moves"); - WriteToChat("Try moving tapers between containers and casting spells!"); - } - catch (Exception ex) - { - WriteToChat($"Taper test error: {ex.Message}"); - } - break; - - case "debugtaper": - // Debug functionality removed - break; - - case "finditem": - if (args.Length > 1) - { - string itemName = string.Join(" ", args, 1, args.Length - 1).Trim('"'); - WriteToChat($"=== Searching for: '{itemName}' ==="); - - var foundItem = Utils.FindItemByName(itemName); - if (foundItem != null) - { - WriteToChat($"FOUND: '{foundItem.Name}'"); - WriteToChat($"Count: {foundItem.Values(LongValueKey.StackCount, 0)}"); - WriteToChat($"Icon: 0x{foundItem.Icon:X}"); - WriteToChat($"Display Icon: 0x{(foundItem.Icon + 0x6000000):X}"); - WriteToChat($"Object Class: {foundItem.ObjectClass}"); - } - else - { - WriteToChat($"NOT FOUND: '{itemName}'"); - WriteToChat("Make sure the name is exactly as it appears in-game."); - } - } - else - { - WriteToChat("Usage: /mm finditem \"Item Name\""); - WriteToChat("Example: /mm finditem \"Prismatic Taper\""); - } - break; - - - default: - WriteToChat($"Unknown /mm command: {subCommand}. Try /mm help"); - break; - } - } - - - } -} - - diff --git a/MosswartMassacre/PluginCore.cs b/MosswartMassacre/PluginCore.cs index 1882e76..95e1858 100644 --- a/MosswartMassacre/PluginCore.cs +++ b/MosswartMassacre/PluginCore.cs @@ -1,129 +1,30 @@ using System; using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Globalization; -using System.Linq; using System.Net; using System.Runtime.InteropServices; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; using System.Timers; using Decal.Adapter; using Decal.Adapter.Wrappers; -using MosswartMassacre.Views; -using Mag.Shared.Constants; namespace MosswartMassacre { [FriendlyName("Mosswart Massacre")] public class PluginCore : PluginBase { - // Hot Reload Support Properties - private static string _assemblyDirectory = null; - public static string AssemblyDirectory - { - get - { - if (_assemblyDirectory == null) - { - try - { - _assemblyDirectory = System.IO.Path.GetDirectoryName(typeof(PluginCore).Assembly.Location); - } - catch - { - _assemblyDirectory = Environment.CurrentDirectory; - } - } - return _assemblyDirectory; - } - set - { - _assemblyDirectory = value; - } - } - public static bool IsHotReload { get; set; } - internal static PluginHost MyHost; internal static int totalKills = 0; internal static int rareCount = 0; - internal static int sessionDeaths = 0; // Deaths this session - internal static int totalDeaths = 0; // Total deaths from character - internal static int cachedPrismaticCount = 0; // Cached Prismatic Taper count - internal static int lastPrismaticCount = 0; // For delta calculation - - // Track taper items and their containers for accurate release detection - private static readonly Dictionary trackedTaperContainers = new Dictionary(); - private static readonly Dictionary lastKnownStackSizes = new Dictionary(); internal static DateTime lastKillTime = DateTime.Now; internal static double killsPer5Min = 0; internal static double killsPerHour = 0; internal static DateTime statsStartTime = DateTime.Now; internal static Timer updateTimer; - private static Timer vitalsTimer; - private static System.Windows.Forms.Timer commandTimer; - private static readonly Queue pendingCommands = new Queue(); public static bool RareMetaEnabled { get; set; } = true; - - // VVS View Management - private static class ViewManager - { - public static void ViewInit() - { - Views.VVSTabbedMainView.ViewInit(); - } - - public static void ViewDestroy() - { - Views.VVSTabbedMainView.ViewDestroy(); - } - - public static void UpdateKillStats(int totalKills, double killsPer5Min, double killsPerHour) - { - Views.VVSTabbedMainView.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); - } - - public static void UpdateElapsedTime(TimeSpan elapsed) - { - Views.VVSTabbedMainView.UpdateElapsedTime(elapsed); - } - - public static void UpdateRareCount(int rareCount) - { - Views.VVSTabbedMainView.UpdateRareCount(rareCount); - } - - public static void SetRareMetaToggleState(bool enabled) - { - Views.VVSTabbedMainView.SetRareMetaToggleState(enabled); - } - - public static void RefreshSettingsFromConfig() - { - Views.VVSTabbedMainView.RefreshSettingsFromConfig(); - } - - public static void RefreshUpdateStatus() - { - Views.VVSTabbedMainView.RefreshUpdateStatus(); - } - } public static bool RemoteCommandsEnabled { get; set; } = false; public static bool HttpServerEnabled { get; set; } = false; public static string CharTag { get; set; } = ""; public static bool TelemetryEnabled { get; set; } = false; - public static bool WebSocketEnabled { get; set; } = false; - public bool InventoryLogEnabled { get; set; } = false; - public static bool AggressiveChatStreamingEnabled { get; set; } = true; - private MossyInventory _inventoryLogger; - public static NavVisualization navVisualization; - - // Quest Management for always-on quest streaming - public static QuestManager questManager; - private static Timer questStreamingTimer; - private static Queue rareMessageQueue = new Queue(); private static DateTime _lastSent = DateTime.MinValue; private static readonly Queue _chatQueue = new Queue(); @@ -132,92 +33,27 @@ namespace MosswartMassacre { try { - // Set MyHost - for hot reload scenarios, Host might be null - if (Host != null) - { - MyHost = Host; - } - else if (MyHost == null) - { - // Hot reload fallback - this is okay, WriteToChat will handle it - MyHost = null; - } - - // Check if this is a hot reload - var isCharacterLoaded = CoreManager.Current.CharacterFilter.LoginStatus == 3; - if (IsHotReload || isCharacterLoaded) - { - // Hot reload detected - reinitialize connections and state - WriteToChat("[INFO] Hot reload detected - reinitializing plugin"); - - // Reload settings if character is already logged in - if (isCharacterLoaded) - { - try - { - WriteToChat("Hot reload - reinitializing character-dependent systems"); - // Don't call LoginComplete - create hot reload specific initialization - InitializeForHotReload(); - WriteToChat("[INFO] Hot reload initialization complete"); - } - catch (Exception ex) - { - WriteToChat($"[ERROR] Hot reload initialization failed: {ex.Message}"); - } - } - } - - // Note: Startup messages will appear after character login + MyHost = Host; + + WriteToChat("Mosswart Massacre has started!"); + // Subscribe to chat message event CoreManager.Current.ChatBoxMessage += new EventHandler(OnChatText); - CoreManager.Current.ChatBoxMessage += new EventHandler(AllChatText); CoreManager.Current.CommandLineText += OnChatCommand; CoreManager.Current.CharacterFilter.LoginComplete += CharacterFilter_LoginComplete; - CoreManager.Current.CharacterFilter.Death += OnCharacterDeath; - CoreManager.Current.WorldFilter.CreateObject += OnSpawn; - CoreManager.Current.WorldFilter.CreateObject += OnPortalDetected; - CoreManager.Current.WorldFilter.ReleaseObject += OnDespawn; - // Subscribe to inventory change events for taper tracking - CoreManager.Current.WorldFilter.CreateObject += OnInventoryCreate; - CoreManager.Current.WorldFilter.ReleaseObject += OnInventoryRelease; - CoreManager.Current.WorldFilter.ChangeObject += OnInventoryChange; - // Initialize VVS view after character login - ViewManager.ViewInit(); // Initialize the timer updateTimer = new Timer(1000); // Update every second updateTimer.Elapsed += UpdateStats; updateTimer.Start(); - // Initialize vitals streaming timer - vitalsTimer = new Timer(5000); // Send vitals every 5 seconds - vitalsTimer.Elapsed += SendVitalsUpdate; - vitalsTimer.Start(); - - // Initialize command processing timer (Windows Forms timer for main thread) - commandTimer = new System.Windows.Forms.Timer(); - commandTimer.Interval = 10; // Process commands every 10ms - commandTimer.Tick += ProcessPendingCommands; - commandTimer.Start(); - - // Note: View initialization moved to LoginComplete for VVS compatibility + // Initialize the view (UI) + MainView.ViewInit(); // Enable TLS1.2 ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; //Enable vTank interface vTank.Enable(); - //lyssna på commands - WebSocket.OnServerCommand += HandleServerCommand; - //starta inventory. Hanterar subscriptions i den med - - _inventoryLogger = new MossyInventory(); - - // Initialize navigation visualization system - navVisualization = new NavVisualization(); - - // Note: DECAL Harmony patches will be initialized in LoginComplete event - // where the chat system is available for error messages - } catch (Exception ex) { @@ -232,25 +68,13 @@ namespace MosswartMassacre PluginSettings.Save(); if (TelemetryEnabled) Telemetry.Stop(); // ensure no dangling timer / HttpClient - WriteToChat("Mosswart Massacre is shutting down. Bye!"); - - + WriteToChat("Mosswart Massacre is shutting down..."); // Unsubscribe from chat message event CoreManager.Current.ChatBoxMessage -= new EventHandler(OnChatText); CoreManager.Current.CommandLineText -= OnChatCommand; - CoreManager.Current.ChatBoxMessage -= new EventHandler(AllChatText); - CoreManager.Current.CharacterFilter.Death -= OnCharacterDeath; - CoreManager.Current.WorldFilter.CreateObject -= OnSpawn; - CoreManager.Current.WorldFilter.CreateObject -= OnPortalDetected; - CoreManager.Current.WorldFilter.ReleaseObject -= OnDespawn; - // Unsubscribe from inventory change events - CoreManager.Current.WorldFilter.CreateObject -= OnInventoryCreate; - CoreManager.Current.WorldFilter.ReleaseObject -= OnInventoryRelease; - CoreManager.Current.WorldFilter.ChangeObject -= OnInventoryChange; - - // Stop and dispose of the timers + // Stop and dispose of the timer if (updateTimer != null) { updateTimer.Stop(); @@ -258,59 +82,10 @@ namespace MosswartMassacre updateTimer = null; } - if (vitalsTimer != null) - { - vitalsTimer.Stop(); - vitalsTimer.Dispose(); - vitalsTimer = null; - } - - if (commandTimer != null) - { - commandTimer.Stop(); - commandTimer.Dispose(); - commandTimer = null; - } - - // Stop and dispose quest streaming timer - if (questStreamingTimer != null) - { - questStreamingTimer.Stop(); - questStreamingTimer.Elapsed -= OnQuestStreamingUpdate; - questStreamingTimer.Dispose(); - questStreamingTimer = null; - } - - // Dispose quest manager - if (questManager != null) - { - questManager.Dispose(); - questManager = null; - } - // Clean up the view - ViewManager.ViewDestroy(); + MainView.ViewDestroy(); //Disable vtank interface vTank.Disable(); - // sluta lyssna på commands - WebSocket.OnServerCommand -= HandleServerCommand; - WebSocket.Stop(); - //shutdown inv - _inventoryLogger.Dispose(); - - // Clean up navigation visualization - if (navVisualization != null) - { - navVisualization.Dispose(); - navVisualization = null; - } - - // Clean up taper tracking - trackedTaperContainers.Clear(); - lastKnownStackSizes.Clear(); - - // Clean up Harmony patches - DecalHarmonyClean.Cleanup(); MyHost = null; } @@ -323,684 +98,71 @@ namespace MosswartMassacre { CoreManager.Current.CharacterFilter.LoginComplete -= CharacterFilter_LoginComplete; - WriteToChat("Mosswart Massacre has started!"); - - - PluginSettings.Initialize(); // Safe to call now // Apply the values RareMetaEnabled = PluginSettings.Instance.RareMetaEnabled; - WebSocketEnabled = PluginSettings.Instance.WebSocketEnabled; RemoteCommandsEnabled = PluginSettings.Instance.RemoteCommandsEnabled; HttpServerEnabled = PluginSettings.Instance.HttpServerEnabled; TelemetryEnabled = PluginSettings.Instance.TelemetryEnabled; CharTag = PluginSettings.Instance.CharTag; - ViewManager.SetRareMetaToggleState(RareMetaEnabled); - ViewManager.RefreshSettingsFromConfig(); // Refresh all UI settings after loading + MainView.SetRareMetaToggleState(RareMetaEnabled); if (TelemetryEnabled) Telemetry.Start(); - if (WebSocketEnabled) - WebSocket.Start(); - // Initialize Harmony patches using UtilityBelt's loaded DLL - try - { - bool success = DecalHarmonyClean.Initialize(); - if (success) - WriteToChat("[OK] Plugin message interception active"); - else - WriteToChat("[FAIL] Could not initialize message interception"); - } - catch (Exception ex) - { - WriteToChat($"[ERROR] Harmony initialization failed: {ex.Message}"); - } - // Initialize death tracking - totalDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); - sessionDeaths = 0; - // Initialize cached Prismatic Taper count - InitializePrismaticTaperCount(); - - // Initialize quest manager for always-on quest streaming - try - { - questManager = new QuestManager(); - - // Trigger full quest data refresh (same as clicking refresh button) - Views.FlagTrackerView.RefreshQuestData(); - - // Initialize quest streaming timer (30 seconds) - questStreamingTimer = new Timer(30000); - questStreamingTimer.Elapsed += OnQuestStreamingUpdate; - questStreamingTimer.AutoReset = true; - questStreamingTimer.Start(); - - WriteToChat("[OK] Quest streaming initialized with full data refresh"); - } - catch (Exception ex) - { - WriteToChat($"[ERROR] Quest streaming initialization failed: {ex.Message}"); - } - - } - - #region Quest Streaming Methods - private static void OnQuestStreamingUpdate(object sender, ElapsedEventArgs e) - { - try - { - // Debug: Log when timer fires - if (PluginSettings.Instance?.VerboseLogging == true) - { - WriteToChat("[QUEST-STREAM] Timer fired, checking conditions..."); - } - - // Stream high priority quest data via WebSocket - if (!WebSocketEnabled) - { - if (PluginSettings.Instance?.VerboseLogging == true) - { - WriteToChat("[QUEST-STREAM] WebSocket not enabled, skipping"); - } - return; - } - - if (questManager?.QuestList == null || questManager.QuestList.Count == 0) - { - if (PluginSettings.Instance?.VerboseLogging == true) - { - WriteToChat($"[QUEST-STREAM] No quest data available (null: {questManager?.QuestList == null}, count: {questManager?.QuestList?.Count ?? 0})"); - } - return; - } - - var currentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); - - // Find and stream priority quests (deduplicated by quest ID) - var priorityQuests = questManager.QuestList - .Where(q => IsHighPriorityQuest(q.Id)) - .GroupBy(q => q.Id) - .Select(g => g.First()) // Take first occurrence of each quest ID - .ToList(); - - if (PluginSettings.Instance?.VerboseLogging == true) - { - WriteToChat($"[QUEST-STREAM] Found {priorityQuests.Count} priority quests to stream"); - } - - foreach (var quest in priorityQuests) - { - try - { - string questName = questManager.GetFriendlyQuestName(quest.Id); - long timeRemaining = quest.ExpireTime - currentTime; - string countdown = FormatCountdown(timeRemaining); - - if (PluginSettings.Instance?.VerboseLogging == true) - { - WriteToChat($"[QUEST-STREAM] Sending: {questName} - {countdown}"); - } - - // Stream quest data - System.Threading.Tasks.Task.Run(() => WebSocket.SendQuestDataAsync(questName, countdown)); - } - catch (Exception ex) - { - WriteToChat($"[QUEST-STREAM] Error streaming quest {quest.Id}: {ex.Message}"); - } - } - } - catch (Exception ex) - { - WriteToChat($"[QUEST-STREAM] Error in timer handler: {ex.Message}"); - } - } - - private static bool IsHighPriorityQuest(string questId) - { - return questId == "stipendtimer_0812" || // Changed from stipendtimer_monthly to stipendtimer_0812 - questId == "augmentationblankgemacquired" || - questId == "insatiableeaterjaw"; - } - - private static string FormatCountdown(long seconds) - { - if (seconds <= 0) - return "READY"; - - var timeSpan = TimeSpan.FromSeconds(seconds); - - if (timeSpan.TotalDays >= 1) - return $"{(int)timeSpan.TotalDays}d {timeSpan.Hours:D2}h"; - else if (timeSpan.TotalHours >= 1) - return $"{timeSpan.Hours}h {timeSpan.Minutes:D2}m"; - else if (timeSpan.TotalMinutes >= 1) - return $"{timeSpan.Minutes}m {timeSpan.Seconds:D2}s"; - else - return $"{timeSpan.Seconds}s"; - } - #endregion - - private void InitializeForHotReload() - { - // This method handles initialization that depends on character being logged in - // Similar to LoginComplete but designed for hot reload scenarios - - WriteToChat("Mosswart Massacre hot reload initialization started!"); - - // 1. Initialize settings - CRITICAL first step - PluginSettings.Initialize(); - - // 2. Apply the values from settings - RareMetaEnabled = PluginSettings.Instance.RareMetaEnabled; - WebSocketEnabled = PluginSettings.Instance.WebSocketEnabled; - RemoteCommandsEnabled = PluginSettings.Instance.RemoteCommandsEnabled; - HttpServerEnabled = PluginSettings.Instance.HttpServerEnabled; - TelemetryEnabled = PluginSettings.Instance.TelemetryEnabled; - CharTag = PluginSettings.Instance.CharTag; - - // 3. Update UI with current settings - ViewManager.SetRareMetaToggleState(RareMetaEnabled); - ViewManager.RefreshSettingsFromConfig(); - - // 4. Restart services if they were enabled (stop first, then start) - if (TelemetryEnabled) - { - Telemetry.Stop(); // Stop existing - Telemetry.Start(); // Restart - } - - if (WebSocketEnabled) - { - WebSocket.Stop(); // Stop existing - WebSocket.Start(); // Restart - } - - if (HttpServerEnabled) - { - HttpCommandServer.Stop(); // Stop existing - HttpCommandServer.Start(); // Restart - } - - // 5. Initialize Harmony patches (only if not already done) - // Note: Harmony patches are global and don't need reinitialization - if (!DecalHarmonyClean.IsActive()) - { - try - { - bool success = DecalHarmonyClean.Initialize(); - if (success) - WriteToChat("[OK] Plugin message interception active"); - else - WriteToChat("[FAIL] Could not initialize message interception"); - } - catch (Exception ex) - { - WriteToChat($"[ERROR] Harmony initialization failed: {ex.Message}"); - } - } - - // 6. Reinitialize death tracking - totalDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); - // Don't reset sessionDeaths - keep the current session count - - // 7. Reinitialize cached Prismatic Taper count - InitializePrismaticTaperCount(); - - // 8. Reinitialize quest manager for hot reload - try - { - if (questManager == null) - { - questManager = new QuestManager(); - WriteToChat("[OK] Quest manager reinitialized"); - } - else - { - WriteToChat("[INFO] Quest manager already active"); - } - - // Trigger full quest data refresh (same as clicking refresh button) - Views.FlagTrackerView.RefreshQuestData(); - WriteToChat("[INFO] Quest data refresh triggered for hot reload"); - } - catch (Exception ex) - { - WriteToChat($"[ERROR] Quest manager hot reload failed: {ex.Message}"); - } - - // 9. Reinitialize quest streaming timer for hot reload - try - { - // Stop existing timer if any - if (questStreamingTimer != null) - { - questStreamingTimer.Stop(); - questStreamingTimer.Elapsed -= OnQuestStreamingUpdate; - questStreamingTimer.Dispose(); - questStreamingTimer = null; - } - - // Create new timer - questStreamingTimer = new Timer(30000); // 30 seconds - questStreamingTimer.Elapsed += OnQuestStreamingUpdate; - questStreamingTimer.AutoReset = true; - questStreamingTimer.Start(); - - WriteToChat("[OK] Quest streaming timer reinitialized (30s interval)"); - } - catch (Exception ex) - { - WriteToChat($"[ERROR] Quest streaming timer hot reload failed: {ex.Message}"); - } - - WriteToChat("Hot reload initialization completed!"); - } - - private void InitializePrismaticTaperCount() - { - try - { - lastPrismaticCount = cachedPrismaticCount; - cachedPrismaticCount = Utils.GetItemStackSize("Prismatic Taper"); - - // Initialize tracking for existing tapers - trackedTaperContainers.Clear(); - lastKnownStackSizes.Clear(); - - foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory()) - { - if (wo.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase) && - IsPlayerOwnedContainer(wo.Container)) - { - int stackCount = wo.Values(LongValueKey.StackCount, 1); - trackedTaperContainers[wo.Id] = wo.Container; - lastKnownStackSizes[wo.Id] = stackCount; - } - } - - } - catch (Exception ex) - { - WriteToChat($"[TAPER] Error initializing count: {ex.Message}"); - cachedPrismaticCount = 0; - lastPrismaticCount = 0; - trackedTaperContainers.Clear(); - lastKnownStackSizes.Clear(); - } - } - - private bool IsPlayerOwnedContainer(int containerId) - { - try - { - // Check if it's the player's main inventory - if (containerId == CoreManager.Current.CharacterFilter.Id) - return true; - - // Check if it's one of the player's containers (side packs) - // Get the container object to verify it belongs to the player - WorldObject container = CoreManager.Current.WorldFilter[containerId]; - if (container != null && - container.ObjectClass == ObjectClass.Container && - container.Container == CoreManager.Current.CharacterFilter.Id) - { - return true; - } - - return false; - } - catch - { - return false; - } - } - - private void OnInventoryCreate(object sender, CreateObjectEventArgs e) - { - try - { - var item = e.New; - if (IsPlayerOwnedContainer(item.Container) && - item.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) - { - lastPrismaticCount = cachedPrismaticCount; - int stackCount = item.Values(LongValueKey.StackCount, 1); - cachedPrismaticCount += stackCount; - int delta = cachedPrismaticCount - lastPrismaticCount; - - // Initialize tracking for this new taper - trackedTaperContainers[item.Id] = item.Container; - lastKnownStackSizes[item.Id] = stackCount; - - } - } - catch (Exception ex) - { - WriteToChat($"[TAPER] Error in OnInventoryCreate: {ex.Message}"); - } - } - - private void OnInventoryRelease(object sender, ReleaseObjectEventArgs e) - { - try - { - var item = e.Released; - if (item.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) - { - // Check where this taper WAS before being released (not where it's going) - if (trackedTaperContainers.TryGetValue(item.Id, out int previousContainer)) - { - if (IsPlayerOwnedContainer(previousContainer)) - { - // This taper was in our inventory and is now being released - lastPrismaticCount = cachedPrismaticCount; - int stackCount = item.Values(LongValueKey.StackCount, 1); - cachedPrismaticCount -= stackCount; - } - - // Clean up tracking - trackedTaperContainers.Remove(item.Id); - lastKnownStackSizes.Remove(item.Id); - } - else - { - // Fallback: recalculate total count when untracked taper is released - lastPrismaticCount = cachedPrismaticCount; - cachedPrismaticCount = Utils.GetItemStackSize("Prismatic Taper"); - } - } - } - catch (Exception ex) - { - WriteToChat($"[TAPER] Error in OnInventoryRelease: {ex.Message}"); - } - } - - private void OnInventoryChange(object sender, ChangeObjectEventArgs e) - { - try - { - var item = e.Changed; - if (item.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) - { - bool isInPlayerContainer = IsPlayerOwnedContainer(item.Container); - - // Track container location for release detection - if (isInPlayerContainer) - { - bool wasAlreadyTracked = trackedTaperContainers.ContainsKey(item.Id); - trackedTaperContainers[item.Id] = item.Container; - - // Handle stack size changes with pure delta math - int currentStack = item.Values(LongValueKey.StackCount, 1); - - // Check if this is a pickup from ground (item not previously tracked) - if (!wasAlreadyTracked) - { - // This is likely a pickup from ground - increment count - lastPrismaticCount = cachedPrismaticCount; - cachedPrismaticCount += currentStack; - } - else if (lastKnownStackSizes.TryGetValue(item.Id, out int previousStack)) - { - int stackDelta = currentStack - previousStack; - if (stackDelta != 0) - { - lastPrismaticCount = cachedPrismaticCount; - cachedPrismaticCount += stackDelta; - } - } - - lastKnownStackSizes[item.Id] = currentStack; - } - // Item is no longer in player containers - // DON'T clean up tracking here - let OnInventoryRelease handle cleanup - // This ensures tracking data is available for the Release event - } - } - catch (Exception ex) - { - WriteToChat($"[TAPER] Error in OnInventoryChange: {ex.Message}"); - } - } - - private async void OnSpawn(object sender, CreateObjectEventArgs e) - { - var mob = e.New; - if (mob.ObjectClass != ObjectClass.Monster) return; - - try - { - // Get DECAL coordinates - var decalCoords = mob.Coordinates(); - if (decalCoords == null) return; - - const string fmt = "F7"; - string ns = decalCoords.NorthSouth.ToString(fmt, CultureInfo.InvariantCulture); - string ew = decalCoords.EastWest.ToString(fmt, CultureInfo.InvariantCulture); - - // Get Z coordinate using RawCoordinates() for accurate world Z position - string zCoord = "0"; - try - { - var rawCoords = mob.RawCoordinates(); - if (rawCoords != null) - { - zCoord = rawCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - else - { - // Fallback to player Z approximation if RawCoordinates fails - var playerCoords = Coordinates.Me; - if (Math.Abs(playerCoords.Z) > 0.1) - { - zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - } - } - catch - { - // Fallback to player Z approximation on error - try - { - var playerCoords = Coordinates.Me; - if (Math.Abs(playerCoords.Z) > 0.1) - { - zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - } - catch - { - zCoord = "0"; - } - } - - await WebSocket.SendSpawnAsync(ns, ew, zCoord, mob.Name); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[WS] Spawn send failed: {ex}"); - } - } - - private async void OnPortalDetected(object sender, CreateObjectEventArgs e) - { - var portal = e.New; - if (portal.ObjectClass != ObjectClass.Portal) return; - - try - { - // Get portal coordinates from DECAL - var decalCoords = portal.Coordinates(); - if (decalCoords == null) return; - - const string fmt = "F7"; - string ns = decalCoords.NorthSouth.ToString(fmt, CultureInfo.InvariantCulture); - string ew = decalCoords.EastWest.ToString(fmt, CultureInfo.InvariantCulture); - - // Get Z coordinate using RawCoordinates() for accurate world Z position - string zCoord = "0"; - try - { - var rawCoords = portal.RawCoordinates(); - if (rawCoords != null) - { - zCoord = rawCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - else - { - // Fallback to player Z approximation if RawCoordinates fails - var playerCoords = Coordinates.Me; - if (Math.Abs(playerCoords.Z) > 0.1) - { - zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - } - } - catch - { - // Fallback to player Z approximation on error - try - { - var playerCoords = Coordinates.Me; - if (Math.Abs(playerCoords.Z) > 0.1) - { - zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); - } - } - catch - { - zCoord = "0"; - } - } - - await WebSocket.SendPortalAsync(ns, ew, zCoord, portal.Name); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[PORTAL ERROR] {ex.Message}"); - PluginCore.WriteToChat($"[WS] Portal send failed: {ex}"); - } - } - - - private void OnDespawn(object sender, ReleaseObjectEventArgs e) - { - var mob = e.Released; - if (mob.ObjectClass != ObjectClass.Monster) return; - - - // var c = mob.Coordinates(); - // PluginCore.WriteToChat( - // $"[Despawn] {mob.Name} @ (NS={c.NorthSouth:F1}, EW={c.EastWest:F1})"); - } - - private async void AllChatText(object sender, ChatTextInterceptEventArgs e) - { - try - { - string cleaned = NormalizeChatLine(e.Text); - - // Send to WebSocket - await WebSocket.SendChatTextAsync(e.Color, cleaned); - - // Note: Plugin message analysis is now handled by Harmony patches - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[WS] Chat send failed: {ex}"); - } - } - - private static string NormalizeChatLine(string raw) - { - if (string.IsNullOrEmpty(raw)) - return raw; - - // 1) Remove all <…> tags - var noTags = Regex.Replace(raw, "<[^>]+>", ""); - - // 2) Trim trailing newline or carriage-return - var trimmed = noTags.TrimEnd('\r', '\n'); - - // 3) Collapse multiple spaces into one - var collapsed = Regex.Replace(trimmed, @"[ ]{2,}", " "); - - return collapsed; - } - - private void OnCharacterDeath(object sender, Decal.Adapter.Wrappers.DeathEventArgs e) - { - sessionDeaths++; - totalDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); - } - - private void HandleServerCommand(CommandEnvelope env) - { - // This is called from WebSocket thread - queue for main thread execution - lock (pendingCommands) - { - pendingCommands.Enqueue(env.Command); - } - } - - private void ProcessPendingCommands(object sender, EventArgs e) - { - // This runs on the main UI thread via Windows Forms timer - string command = null; - - lock (pendingCommands) - { - if (pendingCommands.Count > 0) - command = pendingCommands.Dequeue(); - } - - if (command != null) - { - try - { - // Execute ALL WebSocket commands on main thread - fast and reliable - DispatchChatToBoxWithPluginIntercept(command); - } - catch (Exception ex) - { - WriteToChat($"[WS] Command execution error: {ex.Message}"); - } - } } private void OnChatText(object sender, ChatTextInterceptEventArgs e) { try { + // WriteToChat($"[Debug] Chat Color: {e.Color}, Message: {e.Text}"); if (IsKilledByMeMessage(e.Text)) { totalKills++; lastKillTime = DateTime.Now; CalculateKillsPerInterval(); - ViewManager.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); + MainView.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); } if (IsRareDiscoveryMessage(e.Text, out string rareText)) { rareCount++; - ViewManager.UpdateRareCount(rareCount); + MainView.UpdateRareCount(rareCount); if (RareMetaEnabled) { Decal_DispatchOnChatCommand("/vt setmetastate loot_rare"); } - - DelayedCommandManager.AddDelayedCommand($"/a {rareText}", 3000); - // Fire and forget: we don't await, since sending is not critical and we don't want to block. - _ = WebSocket.SendRareAsync(rareText); - } + DelayedCommandManager.AddDelayedCommand($"/a {rareText}", 3000); + } + // if (e.Text.EndsWith("!testrare\"")) + // { + // string simulatedText = $"{CoreManager.Current.CharacterFilter.Name} has discovered the Ancient Pickle!"; + // + // if (IsRareDiscoveryMessage(simulatedText, out string simulatedRareText)) + // { + // rareCount++; + // MainView.UpdateRareCount(rareCount); + // + // if (RareMetaEnabled) + // { + // Decal_DispatchOnChatCommand("/vt setmetastate loot_rare"); + // } + // + // DelayedCommandManager.AddDelayedCommand($"/a {simulatedRareText}", 3000); + // } + // else + // { + // WriteToChat("[Test] Simulated rare message didn't match the regex."); + // } + // + // return; + // } if (e.Color == 18 && e.Text.EndsWith("!report\"")) { TimeSpan elapsed = DateTime.Now - statsStartTime; @@ -1069,12 +231,11 @@ namespace MosswartMassacre { // Update the elapsed time TimeSpan elapsed = DateTime.Now - statsStartTime; - ViewManager.UpdateElapsedTime(elapsed); + MainView.UpdateElapsedTime(elapsed); // Recalculate kill rates CalculateKillsPerInterval(); - ViewManager.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); - + MainView.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); } catch (Exception ex) { @@ -1082,52 +243,6 @@ namespace MosswartMassacre } } - private static void SendVitalsUpdate(object sender, ElapsedEventArgs e) - { - try - { - // Only send if WebSocket is enabled - if (!WebSocketEnabled) - return; - - // Collect vitals data - int currentHealth = CoreManager.Current.Actions.Vital[VitalType.CurrentHealth]; - int currentStamina = CoreManager.Current.Actions.Vital[VitalType.CurrentStamina]; - int currentMana = CoreManager.Current.Actions.Vital[VitalType.CurrentMana]; - - int maxHealth = CoreManager.Current.Actions.Vital[VitalType.MaximumHealth]; - int maxStamina = CoreManager.Current.Actions.Vital[VitalType.MaximumStamina]; - int maxMana = CoreManager.Current.Actions.Vital[VitalType.MaximumMana]; - - int vitae = CoreManager.Current.CharacterFilter.Vitae; - - // Create vitals data structure - var vitalsData = new - { - type = "vitals", - timestamp = DateTime.UtcNow.ToString("o"), - character_name = CoreManager.Current.CharacterFilter.Name, - health_current = currentHealth, - health_max = maxHealth, - health_percentage = maxHealth > 0 ? Math.Round((double)currentHealth / maxHealth * 100, 1) : 0, - stamina_current = currentStamina, - stamina_max = maxStamina, - stamina_percentage = maxStamina > 0 ? Math.Round((double)currentStamina / maxStamina * 100, 1) : 0, - mana_current = currentMana, - mana_max = maxMana, - mana_percentage = maxMana > 0 ? Math.Round((double)currentMana / maxMana * 100, 1) : 0, - vitae = vitae - }; - - // Send via WebSocket - _ = WebSocket.SendVitalsAsync(vitalsData); - } - catch (Exception ex) - { - WriteToChat($"Error sending vitals: {ex.Message}"); - } - } - private void CalculateKillsPerInterval() { double minutesElapsed = (DateTime.Now - statsStartTime).TotalMinutes; @@ -1194,12 +309,12 @@ namespace MosswartMassacre rareTextOnly = null; // Match pattern: " has discovered the !" - string pattern = @"^(?['A-Za-z ]+)\shas discovered the (?.*?)!$"; + string pattern = @"^(?['A-Za-z ]+)\s(?has discovered the .*!$)"; Match match = Regex.Match(text, pattern); if (match.Success && match.Groups["name"].Value == CoreManager.Current.CharacterFilter.Name) { - rareTextOnly = match.Groups["item"].Value; // just "Ancient Pickle" + rareTextOnly = match.Groups["text"].Value; // just "has discovered the Ancient Pickle!" return true; } @@ -1207,50 +322,25 @@ namespace MosswartMassacre } public static void WriteToChat(string message) { - try - { - // For hot reload scenarios where MyHost might be null, use CoreManager directly - if (MyHost != null) - { - MyHost.Actions.AddChatText("[Mosswart Massacre] " + message, 0, 1); - } - else - { - // Hot reload fallback - use CoreManager directly like the original template - CoreManager.Current.Actions.AddChatText("[Mosswart Massacre] " + message, 1); - } - } - catch (Exception ex) - { - // Last resort fallback - try CoreManager even if MyHost was supposed to work - try - { - CoreManager.Current.Actions.AddChatText($"[Mosswart Massacre] {message} (WriteToChat error: {ex.Message})", 1); - } - catch - { - // Give up - can't write to chat at all - } - } + MyHost.Actions.AddChatText("[Mosswart Massacre] " + message, 0, 1); } public static void RestartStats() { totalKills = 0; rareCount = 0; - sessionDeaths = 0; // Reset session deaths only statsStartTime = DateTime.Now; killsPer5Min = 0; killsPerHour = 0; - WriteToChat($"Stats have been reset. Session deaths: {sessionDeaths}, Total deaths: {totalDeaths}"); - ViewManager.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); - ViewManager.UpdateRareCount(rareCount); + WriteToChat("Stats have been reset."); + MainView.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); + MainView.UpdateRareCount(rareCount); } public static void ToggleRareMeta() { PluginSettings.Instance.RareMetaEnabled = !PluginSettings.Instance.RareMetaEnabled; RareMetaEnabled = PluginSettings.Instance.RareMetaEnabled; - ViewManager.SetRareMetaToggleState(RareMetaEnabled); + MainView.SetRareMetaToggleState(RareMetaEnabled); } [DllImport("Decal.dll")] @@ -1317,65 +407,21 @@ namespace MosswartMassacre WriteToChat("Usage: /mm telemetry "); } break; - case "ws": - if (args.Length > 1) - { - if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) - { - WebSocketEnabled = true; - WebSocket.Start(); - PluginSettings.Instance.WebSocketEnabled = true; - WriteToChat("WS streaming ENABLED."); - } - else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) - { - WebSocketEnabled = false; - WebSocket.Stop(); - PluginSettings.Instance.WebSocketEnabled = false; - WriteToChat("WS streaming DISABLED."); - } - else - { - WriteToChat("Usage: /mm ws "); - } - } - - else - { - WriteToChat("Usage: /mm ws "); - } - break; case "help": WriteToChat("Mosswart Massacre Commands:"); WriteToChat("/mm report - Show current stats"); WriteToChat("/mm loc - Show current location"); - WriteToChat("/mm telemetry - Telemetry streaming enable|disable"); - WriteToChat("/mm ws - Websocket streaming enable|disable"); + WriteToChat("/mm telemetry - Telemetry streaming enable|disable"); // NEW WriteToChat("/mm reset - Reset all counters"); - WriteToChat("/mm meta - Toggle rare meta state!!"); + WriteToChat("/mm meta - Toggle rare meta state"); WriteToChat("/mm http - Local http-command server enable|disable"); WriteToChat("/mm remotecommand - Listen to allegiance !do/!dot enable|disable"); WriteToChat("/mm getmetastate - Gets the current metastate"); - WriteToChat("/mm nextwp - Advance VTank to next waypoint"); - WriteToChat("/mm decalstatus - Check Harmony patch status (UtilityBelt version)"); - WriteToChat("/mm decaldebug - Enable/disable plugin message debug output + WebSocket streaming"); - WriteToChat("/mm harmonyraw - Show raw intercepted messages (debug output)"); - WriteToChat("/mm testprismatic - Test Prismatic Taper detection and icon lookup"); - WriteToChat("/mm deathstats - Show current death tracking statistics"); - WriteToChat("/mm testtaper - Test cached Prismatic Taper tracking"); - WriteToChat("/mm debugtaper - Show detailed taper tracking debug info"); - WriteToChat("/mm gui - Manually initialize/reinitialize GUI!!!"); - WriteToChat("/mm checkforupdate - Check for plugin updates"); - WriteToChat("/mm update - Download and install update (if available)"); - WriteToChat("/mm debugupdate - Debug update UI controls"); - WriteToChat("/mm sendinventory - Force inventory upload with ID requests"); - WriteToChat("/mm refreshquests - Force quest data refresh for Flag Tracker"); - WriteToChat("/mm queststatus - Show quest streaming status and diagnostics"); - WriteToChat("/mm verbose - Toggle verbose debug logging"); break; + case "report": TimeSpan elapsed = DateTime.Now - statsStartTime; - string reportMessage = $"Total Kills: {totalKills}, Kills per Hour: {killsPerHour:F2}, Elapsed Time: {elapsed:dd\\.hh\\:mm\\:ss}, Rares Found: {rareCount}, Session Deaths: {sessionDeaths}, Total Deaths: {totalDeaths}"; + string reportMessage = $"Total Kills: {totalKills}, Kills per Hour: {killsPerHour:F2}, Elapsed Time: {elapsed:dd\\.hh\\:mm\\:ss}, Rares Found: {rareCount}"; WriteToChat(reportMessage); break; case "getmetastate": @@ -1394,8 +440,9 @@ namespace MosswartMassacre case "meta": RareMetaEnabled = !RareMetaEnabled; WriteToChat($"Rare meta state is now {(RareMetaEnabled ? "ON" : "OFF")}"); - ViewManager.SetRareMetaToggleState(RareMetaEnabled); // <-- sync the UI + MainView.SetRareMetaToggleState(RareMetaEnabled); // <-- sync the UI break; + case "http": if (args.Length > 1) { @@ -1448,408 +495,6 @@ namespace MosswartMassacre } break; - case "nextwp": - double result = VtankControl.VtAdvanceWaypoint(); - if (result == 1) - { - WriteToChat("Advanced VTank to next waypoint."); - } - else - { - WriteToChat("Failed to advance VTank waypoint. Is VTank running?"); - } - break; - - case "vtanktest": - try - { - WriteToChat("Testing VTank interface..."); - WriteToChat($"VTank Instance: {(vTank.Instance != null ? "Found" : "NULL")}"); - WriteToChat($"VTank Type: {vTank.Instance?.GetType()?.Name ?? "NULL"}"); - WriteToChat($"NavCurrent: {vTank.Instance?.NavCurrent ?? -1}"); - WriteToChat($"NavNumPoints: {vTank.Instance?.NavNumPoints ?? -1}"); - WriteToChat($"NavType: {vTank.Instance?.NavType}"); - WriteToChat($"MacroEnabled: {vTank.Instance?.MacroEnabled}"); - } - catch (Exception ex) - { - WriteToChat($"VTank test error: {ex.Message}"); - } - break; - - case "decalstatus": - try - { - WriteToChat("=== Harmony Patch Status (UtilityBelt Pattern) ==="); - WriteToChat($"Patches Active: {DecalHarmonyClean.IsActive()}"); - WriteToChat($"Messages Intercepted: {DecalHarmonyClean.GetMessagesIntercepted()}"); - WriteToChat($"WebSocket Streaming: {(AggressiveChatStreamingEnabled && WebSocketEnabled ? "ACTIVE" : "INACTIVE")}"); - - // Test Harmony availability - WriteToChat("=== Harmony Version Status ==="); - try - { - var harmonyTest = Harmony.HarmonyInstance.Create("test.version.check"); - WriteToChat($"[OK] Harmony Available (ID: {harmonyTest.Id})"); - - // Check Harmony assembly version - var harmonyAssembly = typeof(Harmony.HarmonyInstance).Assembly; - WriteToChat($"[OK] Harmony Version: {harmonyAssembly.GetName().Version}"); - WriteToChat($"[OK] Harmony Location: {harmonyAssembly.Location}"); - } - catch (Exception harmonyEx) - { - WriteToChat($"[FAIL] Harmony Test Failed: {harmonyEx.Message}"); - } - } - catch (Exception ex) - { - WriteToChat($"Status check error: {ex.Message}"); - } - break; - - case "decaldebug": - if (args.Length > 1) - { - if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) - { - AggressiveChatStreamingEnabled = true; - WriteToChat("[OK] DECAL debug streaming ENABLED - will show captured messages + stream via WebSocket"); - } - else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) - { - AggressiveChatStreamingEnabled = false; - WriteToChat("[FAIL] DECAL debug streaming DISABLED - WebSocket streaming also disabled"); - } - else - { - WriteToChat("Usage: /mm decaldebug "); - } - } - else - { - WriteToChat("Usage: /mm decaldebug "); - } - break; - - - case "harmonyraw": - // Debug functionality removed - break; - - case "initgui": - case "gui": - try - { - WriteToChat("Attempting to manually initialize GUI..."); - ViewManager.ViewDestroy(); // Clean up any existing view - ViewManager.ViewInit(); // Reinitialize - WriteToChat("GUI initialization attempt completed."); - } - catch (Exception ex) - { - WriteToChat($"GUI initialization error: {ex.Message}"); - } - break; - - case "testprismatic": - try - { - WriteToChat("=== FULL INVENTORY DUMP ==="); - var worldFilter = CoreManager.Current.WorldFilter; - var playerInv = CoreManager.Current.CharacterFilter.Id; - - WriteToChat("Listing ALL items in your main inventory:"); - int itemNum = 1; - - foreach (WorldObject item in worldFilter.GetByContainer(playerInv)) - { - if (!string.IsNullOrEmpty(item.Name)) - { - int stackCount = item.Values(LongValueKey.StackCount, 0); - WriteToChat($"{itemNum:D2}: '{item.Name}' (count: {stackCount}, icon: 0x{item.Icon:X}, class: {item.ObjectClass})"); - itemNum++; - - // Highlight anything that might be a taper - string nameLower = item.Name.ToLower(); - if (nameLower.Contains("taper") || nameLower.Contains("prismatic") || - nameLower.Contains("prism") || nameLower.Contains("component")) - { - WriteToChat($" *** POSSIBLE MATCH: '{item.Name}' ***"); - } - } - } - - WriteToChat($"=== Total items listed: {itemNum - 1} ==="); - - // Now test our utility functions on the found Prismatic Taper - WriteToChat("=== Testing Utility Functions on Prismatic Taper ==="); - var foundItem = Utils.FindItemByName("Prismatic Taper"); - if (foundItem != null) - { - WriteToChat($"SUCCESS! Found: '{foundItem.Name}'"); - WriteToChat($"Utils.GetItemStackSize: {Utils.GetItemStackSize("Prismatic Taper")}"); - WriteToChat($"Utils.GetItemIcon: 0x{Utils.GetItemIcon("Prismatic Taper"):X}"); - WriteToChat($"Utils.GetItemDisplayIcon: 0x{Utils.GetItemDisplayIcon("Prismatic Taper"):X}"); - WriteToChat("=== TELEMETRY WILL NOW WORK! ==="); - } - else - { - WriteToChat("ERROR: Still can't find Prismatic Taper with utility functions!"); - } - } - catch (Exception ex) - { - WriteToChat($"Search error: {ex.Message}"); - } - break; - - case "deathstats": - try - { - WriteToChat("=== Death Tracking Statistics ==="); - WriteToChat($"Session Deaths: {sessionDeaths}"); - WriteToChat($"Total Deaths: {totalDeaths}"); - - // Get current character death count to verify sync - int currentCharDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); - WriteToChat($"Character Property NumDeaths: {currentCharDeaths}"); - - if (currentCharDeaths != totalDeaths) - { - WriteToChat($"[WARNING] Death count sync issue detected!"); - WriteToChat($"Updating totalDeaths from {totalDeaths} to {currentCharDeaths}"); - totalDeaths = currentCharDeaths; - } - - WriteToChat("Death tracking is active and will increment on character death."); - } - catch (Exception ex) - { - WriteToChat($"Death stats error: {ex.Message}"); - } - break; - - case "testdeath": - try - { - WriteToChat("=== Manual Death Test ==="); - WriteToChat($"Current sessionDeaths variable: {sessionDeaths}"); - WriteToChat($"Current totalDeaths variable: {totalDeaths}"); - - // Read directly from character property - int currentCharDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); - WriteToChat($"Character Property NumDeaths (43): {currentCharDeaths}"); - - // Manually increment session deaths for testing - sessionDeaths++; - WriteToChat($"Manually incremented sessionDeaths to: {sessionDeaths}"); - WriteToChat("Note: This doesn't simulate a real death, just tests the tracking variables."); - - // Check if death event is properly subscribed - WriteToChat($"Death event subscription check:"); - var deathEvent = typeof(Decal.Adapter.Wrappers.CharacterFilter).GetEvent("Death"); - WriteToChat($"Death event exists: {deathEvent != null}"); - } - catch (Exception ex) - { - WriteToChat($"Test death error: {ex.Message}"); - } - break; - - case "testtaper": - try - { - WriteToChat("=== Cached Taper Tracking Test ==="); - WriteToChat($"Cached Count: {cachedPrismaticCount}"); - WriteToChat($"Last Count: {lastPrismaticCount}"); - - // Compare with Utils function - int utilsCount = Utils.GetItemStackSize("Prismatic Taper"); - WriteToChat($"Utils Count: {utilsCount}"); - - if (cachedPrismaticCount == utilsCount) - { - WriteToChat("[OK] Cached count matches Utils count"); - } - else - { - WriteToChat($"[WARNING] Count mismatch! Cached: {cachedPrismaticCount}, Utils: {utilsCount}"); - WriteToChat("Refreshing cached count..."); - InitializePrismaticTaperCount(); - } - - WriteToChat("=== Container Analysis ==="); - int mainPackCount = 0; - int sidePackCount = 0; - int playerId = CoreManager.Current.CharacterFilter.Id; - - foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory()) - { - if (wo.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) - { - int stackCount = wo.Values(LongValueKey.StackCount, 1); - if (wo.Container == playerId) - { - mainPackCount += stackCount; - } - else - { - sidePackCount += stackCount; - } - } - } - - WriteToChat($"Main Pack Tapers: {mainPackCount}"); - WriteToChat($"Side Pack Tapers: {sidePackCount}"); - WriteToChat($"Total: {mainPackCount + sidePackCount}"); - - WriteToChat("=== Event System Status ==="); - WriteToChat($"Tracking {trackedTaperContainers.Count} taper stacks for delta detection"); - WriteToChat($"Known stack sizes: {lastKnownStackSizes.Count} items"); - WriteToChat("Pure delta tracking - NO expensive inventory scans during events!"); - WriteToChat("Now tracks: consumption, drops, trades, container moves"); - WriteToChat("Try moving tapers between containers and casting spells!"); - } - catch (Exception ex) - { - WriteToChat($"Taper test error: {ex.Message}"); - } - break; - - case "debugtaper": - // Debug functionality removed - break; - - case "finditem": - if (args.Length > 1) - { - string itemName = string.Join(" ", args, 1, args.Length - 1).Trim('"'); - WriteToChat($"=== Searching for: '{itemName}' ==="); - - var foundItem = Utils.FindItemByName(itemName); - if (foundItem != null) - { - WriteToChat($"FOUND: '{foundItem.Name}'"); - WriteToChat($"Count: {foundItem.Values(LongValueKey.StackCount, 0)}"); - WriteToChat($"Icon: 0x{foundItem.Icon:X}"); - WriteToChat($"Display Icon: 0x{(foundItem.Icon + 0x6000000):X}"); - WriteToChat($"Object Class: {foundItem.ObjectClass}"); - } - else - { - WriteToChat($"NOT FOUND: '{itemName}'"); - WriteToChat("Make sure the name is exactly as it appears in-game."); - } - } - else - { - WriteToChat("Usage: /mm finditem \"Item Name\""); - WriteToChat("Example: /mm finditem \"Prismatic Taper\""); - } - break; - - case "checkforupdate": - // Run the update check asynchronously - Task.Run(async () => - { - await UpdateManager.CheckForUpdateAsync(); - // Update UI if available - try - { - ViewManager.RefreshUpdateStatus(); - } - catch (Exception ex) - { - WriteToChat($"Error refreshing UI: {ex.Message}"); - } - }); - break; - - case "update": - // Run the update installation asynchronously - Task.Run(async () => - { - await UpdateManager.DownloadAndInstallUpdateAsync(); - }); - break; - - case "debugupdate": - Views.VVSTabbedMainView.DebugUpdateControls(); - break; - - case "sendinventory": - // Force inventory upload with ID requests - if (_inventoryLogger != null) - { - _inventoryLogger.ForceInventoryUpload(); - } - else - { - WriteToChat("[INV] Inventory system not initialized"); - } - break; - - case "refreshquests": - // Force quest data refresh (same as clicking refresh button) - try - { - WriteToChat("[QUEST] Refreshing quest data..."); - Views.FlagTrackerView.RefreshQuestData(); - } - catch (Exception ex) - { - WriteToChat($"[QUEST] Refresh failed: {ex.Message}"); - } - break; - - case "queststatus": - // Show quest streaming status - try - { - WriteToChat("=== Quest Streaming Status ==="); - WriteToChat($"Timer Active: {questStreamingTimer != null && questStreamingTimer.Enabled}"); - WriteToChat($"WebSocket Enabled: {WebSocketEnabled}"); - WriteToChat($"Quest Manager: {(questManager != null ? "Active" : "Not Active")}"); - WriteToChat($"Quest Count: {questManager?.QuestList?.Count ?? 0}"); - - if (questManager?.QuestList != null) - { - var priorityQuests = questManager.QuestList - .Where(q => IsHighPriorityQuest(q.Id)) - .GroupBy(q => q.Id) - .Select(g => g.First()) - .ToList(); - WriteToChat($"Priority Quests Found: {priorityQuests.Count}"); - foreach (var quest in priorityQuests) - { - string questName = questManager.GetFriendlyQuestName(quest.Id); - WriteToChat($" - {questName} ({quest.Id})"); - } - } - - WriteToChat($"Verbose Logging: {PluginSettings.Instance?.VerboseLogging ?? false}"); - WriteToChat("Use '/mm verbose' to toggle debug logging"); - } - catch (Exception ex) - { - WriteToChat($"[QUEST] Status check failed: {ex.Message}"); - } - break; - - case "verbose": - // Toggle verbose logging - if (PluginSettings.Instance != null) - { - PluginSettings.Instance.VerboseLogging = !PluginSettings.Instance.VerboseLogging; - WriteToChat($"Verbose logging: {(PluginSettings.Instance.VerboseLogging ? "ENABLED" : "DISABLED")}"); - } - else - { - WriteToChat("Settings not initialized"); - } - break; - default: WriteToChat($"Unknown /mm command: {subCommand}. Try /mm help"); break; diff --git a/MosswartMassacre/PluginSettings.cs b/MosswartMassacre/PluginSettings.cs index 03c5cac..e59f09e 100644 --- a/MosswartMassacre/PluginSettings.cs +++ b/MosswartMassacre/PluginSettings.cs @@ -17,53 +17,17 @@ namespace MosswartMassacre private bool _rareMetaEnabled = true; private bool _httpServerEnabled = false; private bool _telemetryEnabled = false; - private bool _webSocketEnabled = false; - private bool _inventorylog = true; private string _charTag = "default"; - private int _mainWindowX = 100; - private int _mainWindowY = 100; - private bool _useTabbedInterface = true; - private string _vtankProfilesPath = ""; - private bool _verboseLogging = false; public static PluginSettings Instance => _instance ?? throw new InvalidOperationException("PluginSettings not initialized"); public static void Initialize() { - // determine plugin folder and character-specific folder + // determine settings file path string characterName = CoreManager.Current.CharacterFilter.Name; - - // For hot reload scenarios, use the AssemblyDirectory set by the Loader - // For normal loading, fall back to the executing assembly location - string pluginFolder; - if (!string.IsNullOrEmpty(PluginCore.AssemblyDirectory)) - { - pluginFolder = PluginCore.AssemblyDirectory; - } - else - { - pluginFolder = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); - } - - // Path for character-specific folder - string characterFolder = Path.Combine(pluginFolder, characterName); - - // Create the character folder if it doesn't exist - if (!Directory.Exists(characterFolder)) - { - try - { - Directory.CreateDirectory(characterFolder); - } - catch (Exception ex) - { - PluginCore.DispatchChatToBoxWithPluginIntercept($"[Settings] Failed to create character folder: {ex.Message}"); - } - } - - // YAML file is now in the character-specific folder - _filePath = Path.Combine(characterFolder, $"{characterName}.yaml"); + string pluginFolder = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + _filePath = Path.Combine(pluginFolder, $"{characterName}.yaml"); // build serializer/deserializer once var builder = new DeserializerBuilder() @@ -159,50 +123,11 @@ namespace MosswartMassacre get => _telemetryEnabled; set { _telemetryEnabled = value; Save(); } } - public bool WebSocketEnabled - { - get => _webSocketEnabled; - set { _webSocketEnabled = value; Save(); } - } + public string CharTag { get => _charTag; set { _charTag = value; Save(); } } - public bool InventoryLog - { - get => _inventorylog; - set { _inventorylog = value; Save(); } - } - - public int MainWindowX - { - get => _mainWindowX; - set { _mainWindowX = value; Save(); } - } - - public int MainWindowY - { - get => _mainWindowY; - set { _mainWindowY = value; Save(); } - } - - public bool UseTabbedInterface - { - get => _useTabbedInterface; - set { _useTabbedInterface = value; Save(); } - } - - public string VTankProfilesPath - { - get => _vtankProfilesPath; - set { _vtankProfilesPath = value; Save(); } - } - - public bool VerboseLogging - { - get => _verboseLogging; - set { _verboseLogging = value; Save(); } - } } } diff --git a/MosswartMassacre/Properties/AssemblyInfo.cs b/MosswartMassacre/Properties/AssemblyInfo.cs index cad7b23..744091c 100644 --- a/MosswartMassacre/Properties/AssemblyInfo.cs +++ b/MosswartMassacre/Properties/AssemblyInfo.cs @@ -26,5 +26,5 @@ using System.Runtime.InteropServices; // Minor Version // Build Number // Revision -[assembly: AssemblyVersion("4.0.0.2")] -[assembly: AssemblyFileVersion("4.0.0.2")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file diff --git a/MosswartMassacre/QuestManager.cs b/MosswartMassacre/QuestManager.cs deleted file mode 100644 index a357e51..0000000 --- a/MosswartMassacre/QuestManager.cs +++ /dev/null @@ -1,313 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using Decal.Adapter; -using Decal.Adapter.Wrappers; - -namespace MosswartMassacre -{ - /// - /// Quest tracking and management system - /// Ported from UBS Lua quest system - /// - public class QuestManager : IDisposable - { - #region Quest Data Structures - public class Quest - { - public string Id { get; set; } - public int Solves { get; set; } - public int Timestamp { get; set; } - public string Description { get; set; } - public int MaxSolves { get; set; } - public int Delta { get; set; } - public int ExpireTime { get; set; } - } - #endregion - - #region Properties - public List QuestList { get; private set; } - public Dictionary QuestDictionary { get; private set; } - #endregion - - #region Events and State - private bool isRefreshing = false; - private DateTime lastRefreshTime = DateTime.MinValue; - #endregion - - public QuestManager() - { - QuestList = new List(); - QuestDictionary = new Dictionary(); - - // Hook into chat events for quest parsing - InitializeChatHooks(); - } - - #region Initialization - private void InitializeChatHooks() - { - try - { - if (CoreManager.Current != null) - { - CoreManager.Current.ChatBoxMessage += OnChatBoxMessage; - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error initializing quest chat hooks: {ex.Message}"); - } - } - #endregion - - #region Quest Name Mapping - public string GetFriendlyQuestName(string questStamp) - { - return QuestNames.GetFriendlyName(questStamp); - } - - public string GetQuestDisplayName(string questStamp) - { - return QuestNames.GetDisplayName(questStamp); - } - - public int GetQuestNameMappingsCount() - { - return QuestNames.QuestStampToName.Count; - } - #endregion - - #region Quest Parsing - private void OnChatBoxMessage(object sender, ChatTextInterceptEventArgs e) - { - try - { - if (!isRefreshing || string.IsNullOrEmpty(e.Text)) - return; - - // Parse quest information from /myquests output - ParseQuestLine(e.Text); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error parsing quest line: {ex.Message}"); - } - } - - private void ParseQuestLine(string text) - { - try - { - // Quest line format: TaskName - Solves solves (Timestamp)"Description" MaxSolves Delta - // Example: "SomeQuest - 5 solves (1640995200)"Quest description here" 10 3600 - var pattern = @"([^\-]+) - (\d+) solves \((\d+)\)""([^""]+)"" (-?\d+) (\d+)"; - var match = Regex.Match(text, pattern); - - if (match.Success) - { - var quest = new Quest - { - Id = match.Groups[1].Value.Trim(), - Solves = int.Parse(match.Groups[2].Value), - Timestamp = int.Parse(match.Groups[3].Value), - Description = match.Groups[4].Value, - MaxSolves = int.Parse(match.Groups[5].Value), - Delta = int.Parse(match.Groups[6].Value) - }; - - quest.ExpireTime = quest.Timestamp + quest.Delta; - - // Add to collections - QuestList.Add(quest); - QuestDictionary[quest.Id] = quest; - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error parsing quest line '{text}': {ex.Message}"); - } - } - #endregion - - #region Quest Management - public void RefreshQuests() - { - try - { - if (isRefreshing) - return; - - ClearQuests(); - isRefreshing = true; - - // Issue /myquests command to refresh quest data - CoreManager.Current.Actions.InvokeChatParser("/myquests"); - - // Stop listening after a delay - System.Threading.Timer stopTimer = null; - stopTimer = new System.Threading.Timer(_ => - { - isRefreshing = false; - stopTimer?.Dispose(); - lastRefreshTime = DateTime.Now; - }, null, 3000, System.Threading.Timeout.Infinite); - } - catch (Exception ex) - { - isRefreshing = false; - PluginCore.WriteToChat($"Error refreshing quests: {ex.Message}"); - } - } - - public void ClearQuests() - { - QuestList.Clear(); - QuestDictionary.Clear(); - } - - public bool IsQuestAvailable(string questStamp) - { - if (!QuestDictionary.TryGetValue(questStamp, out Quest quest)) - return true; // If quest not found, assume available - - var currentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); - return quest.ExpireTime < currentTime; - } - - public bool IsQuestMaxSolved(string questStamp) - { - if (!QuestDictionary.TryGetValue(questStamp, out Quest quest)) - return false; - - return quest.Solves >= quest.MaxSolves; - } - - public bool HasQuestFlag(string questStamp) - { - return QuestDictionary.ContainsKey(questStamp); - } - - public string GetTimeUntilExpire(Quest quest) - { - if (quest == null) - return "Unknown"; - - var currentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); - var timeLeft = quest.ExpireTime - currentTime; - - if (timeLeft <= 0) - return "Ready"; - - return FormatSeconds((int)timeLeft); - } - - public string FormatTimeStamp(int timestamp) - { - try - { - var dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime; - return dateTime.ToString("MM/dd/yyyy HH:mm:ss"); - } - catch - { - return "Invalid"; - } - } - - public string FormatSeconds(int seconds) - { - if (seconds <= 0) - return "0s"; - - var days = seconds / 86400; - seconds %= 86400; - var hours = seconds / 3600; - seconds %= 3600; - var minutes = seconds / 60; - seconds %= 60; - - var result = ""; - if (days > 0) result += $"{days}d "; - if (hours > 0) result += $"{hours}h "; - if (minutes > 0) result += $"{minutes}m "; - if (seconds > 0 || string.IsNullOrEmpty(result)) result += $"{seconds}s"; - - return result.Trim(); - } - - public object GetFieldByID(Quest quest, int id) - { - if (quest == null) - return null; - - switch (id) - { - case 1: return quest.Id; - case 2: return quest.Solves; - case 3: return quest.Timestamp; - case 4: return quest.MaxSolves; - case 5: return quest.Delta; - case 6: return quest.ExpireTime; - default: return quest.Id; - } - } - #endregion - - #region Society Quest Helpers - public string GetSocietyName(int factionBits) - { - switch (factionBits) - { - case 1: return "Celestial Hand"; - case 2: return "Eldrytch Web"; - case 4: return "Radiant Blood"; - default: return "Unknown"; - } - } - - public string GetSocietyRank(int ribbons) - { - if (ribbons >= 1001) return "Master"; - if (ribbons >= 601) return "Lord"; - if (ribbons >= 301) return "Knight"; - if (ribbons >= 101) return "Adept"; - if (ribbons >= 1) return "Initiate"; - return "None"; - } - - public int GetMaxRibbonsPerDay(string rank) - { - switch (rank) - { - case "Initiate": return 50; - case "Adept": return 100; - case "Knight": return 150; - case "Lord": return 200; - case "Master": return 250; - default: return 0; - } - } - #endregion - - #region Cleanup - public void Dispose() - { - try - { - if (CoreManager.Current != null) - { - CoreManager.Current.ChatBoxMessage -= OnChatBoxMessage; - } - - ClearQuests(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error disposing quest manager: {ex.Message}"); - } - } - #endregion - } -} \ No newline at end of file diff --git a/MosswartMassacre/QuestNames.cs b/MosswartMassacre/QuestNames.cs deleted file mode 100644 index 9c782b8..0000000 --- a/MosswartMassacre/QuestNames.cs +++ /dev/null @@ -1,228 +0,0 @@ -using System.Collections.Generic; - -namespace MosswartMassacre -{ - /// - /// Static quest name mappings from quest stamp to friendly display name - /// Based on questtracker repository data - /// - public static class QuestNames - { - /// - /// Dictionary mapping quest stamps to friendly quest names - /// - public static readonly Dictionary QuestStampToName = new Dictionary - { - // Character-specific Quest Stamps (from actual /myquests output) - ["30minattributes"] = "30 Minute Attribute Gems Timer", - ["academeyexittokengiven"] = "Academy Exit Token Received", - ["aerbaxchestkey2pickup"] = "Aerbax Chest Key #2 Pickup", - ["anekshaygemofknowledgetimer_monthly"] = "A'nekshay Gem of Knowledge Monthly Timer", - ["anekshaygemoflesserknowledgecollectedinamonth"] = "A'nekshay Gems of Lesser Knowledge Monthly Count", - ["anekshaygemoflesserknowledgetimer_monthly"] = "A'nekshay Gem of Lesser Knowledge Monthly Timer", - ["attributereset30day"] = "30-Day Attribute Reset Timer", - ["augmentationblankgemacquired"] = "Blank Augmentation Gem Pickup Timer", - ["bellowsnewbieturnedin"] = "Blacksmith's Bellows Turned In", - ["bonecrunchkeypickuptimer"] = "Bonecrunch's Key Pickup Timer", - ["callingstonegiven"] = "Calling Stone Turned Over", - ["defeatedbonecrunch"] = "Bonecrunch Defeated", - ["efmlcentermanafieldused"] = "EF Middle Level Center Mana Field Used", - ["efmleastmanafieldused"] = "EF Middle Level East Mana Field Used", - ["efmlnorthmanafieldused"] = "EF Middle Level North Mana Field Used", - ["efmlsouthmanafieldused"] = "EF Middle Level South Mana Field Used", - ["efmlwestmanafieldused"] = "EF Middle Level West Mana Field Used", - ["efulcentermanafieldused"] = "EF Upper Level Center Mana Field Used", - ["efuleastmanafieldused"] = "EF Upper Level East Mana Field Used", - ["efulnorthmanafieldused"] = "EF Upper Level North Mana Field Used", - ["efulsouthmanafieldused"] = "EF Upper Level South Mana Field Used", - ["efulwestmanafieldused"] = "EF Upper Level West Mana Field Used", - ["insatiableeaterjaw"] = "Insatiable Eater Jaw Collection", - ["pathwardencomplete"] = "Pathwarden Visit Complete", - ["pathwardenfound1111"] = "Pathwarden Greeter Encountered", - ["recallsingularitycaul"] = "Recall Singularity Bore Pickup", - ["stipendscollectedinamonth"] = "Monthly Stipends Collected Count", - ["stipendtimer_0812"] = "Stipend Collection Timer", - ["stipendtimer_monthly"] = "Monthly Stipend Timer", - ["upperinsatiablejaw"] = "Upper Insatiable Eater Jaw Collection", - ["usedattributereset"] = "Attribute Reset Used", - ["usedfreeattributereset"] = "Free Attribute Reset Used", - ["usedfreeskillreset"] = "Free Skill Reset Used", - ["usedskillreset"] = "Skill Reset Used", - ["virindiisland"] = "Singularity Island Visit", - - // Kill Tasks - ["turshscalp"] = "Tursh Scalp", - ["polarursuin"] = "Polar Ursuin Kill Task Main Flag Timer", - ["polarursuinkillcount"] = "Polar Ursuin Kill Counter", - ["polardillotask"] = "Polar Dillo Kill Task Main Flag", - ["polardillokills"] = "Polar Dillo Kill Counter", - ["repugnanteaterkilltask"] = "Repugnant Eater Kill Task", - ["repugeaterkillcount"] = "Repugnant Eater Kill Counter", - ["deathcap"] = "Deathcap Thrungus Kill Task", - ["deathcapkillcount"] = "Deathcap Thrungus Kill Counter", - ["grievverv"] = "Grievver Violator Kill Task", - ["grievvervkillcount"] = "Grievver Violator Kill Counter", - ["tuskerg"] = "Tusker Guard Kill Task Main Flag", - ["tuskergkillcount"] = "Tusker Guard Kill Counter", - - // Quest Timers and Pickups - ["blankaug"] = "Blank Aug Gem Pickup Timer", - ["greatcavepenguinegg"] = "Great Cave Penguin Egg Pickup Timer", - ["deathallurecd"] = "Death's Allure Timer Flag", - ["brewmastercover"] = "Brew Master Quest Pickup Timer Cover", - ["brewmasterback"] = "Brew Master Quest Pickup Timer Back", - ["brewmasterpages"] = "Brew Master Quest Pickup Timer Pages", - ["brewmasterspine"] = "Brew Master Quest Pickup Timer Spine", - ["eleonorasheart"] = "Elanora's Heart Quest Pickup Timer", - ["beacongemobtained"] = "Cooldown for obtaining another beacon gem", - ["beaconcomplete"] = "Beacon Quest Complete Timer", - ["sirginaziosword"] = "Pick up of Sir Ginazio's Sword", - - // Major Quests - ["maraudersjaw"] = "Marauder's Lair Quest", - ["fledgemastertusk"] = "Fledge Master's Tusk Quest", - ["crystallinekiller"] = "Crystalline Killer", - ["darkisledelivery"] = "Dark Isle Delivery", - ["defeatingvaeshok"] = "Defeating Vaeshok", - ["hollyjollyhelperquest"] = "Holly Jolly Helper Quest", - ["moarsmenjailbreak"] = "Moarsmen Jailbreak", - ["shamblingarchivistdestroyer"] = "Shambling Archivist Destroyer", - ["tracingthestone"] = "Tracing The Stone", - ["undeadjawcollection"] = "Undead Jaw Collection", - ["weedingofthederutree"] = "Weeding of the Deru Tree", - ["ironbladecommander"] = "Iron Blade Commander", - ["mumiyahhuntingneftet"] = "Mumiyah Hunting Neftet", - ["torgashstasks"] = "Torgash's Tasks", - - // Thrungus Hovels Items - ["stolenfryingpan"] = "Thrungus Hovels", - ["stolenring"] = "Thrungus Hovels", - ["stolenbrewkettle"] = "Thrungus Hovels", - ["stolenamulet"] = "Thrungus Hovels", - ["stolenewer"] = "Thrungus Hovels", - ["stolennecklace"] = "Thrungus Hovels", - ["stolenplatter"] = "Thrungus Hovels", - ["stolenbracelet"] = "Thrungus Hovels", - - // Special Items and Flags - ["ringofkarlun"] = "Knights of Karlun", - ["trainingacademycomplete"] = "Completion of Training Academy for Exit", - ["cowtipcounter"] = "Counter for Cow Tipping", - ["cowtip"] = "Main Timed Flag for Cow Tipping", - ["skillloweringgempickedup"] = "Picked up a forgetfulness gem", - - // Healing Machine Components - ["orbhealingmachine"] = "Healing Machine Orb", - ["pedestalhealingmachine"] = "Healing Machine Pedestal", - ["tihnhealingmachine"] = "Healing Machine Tihn", - ["lavushealingmachine"] = "Healing Machine Lavus", - ["hookhealingmachine"] = "Healing Machine Hook", - - // Eater Jaws - ["ravenouseaterjaw"] = "Ravenous Eater Jaw", - ["insatiableeaterjaw"] = "Insatiable Eater Jaw", - ["engorgedeaterjaw"] = "Engorged Eater Jaw", - ["voraciouseaterjaw"] = "Voracious Eater Jaw", - ["abhorrenteaterjaw"] = "Abhorrent Eater Jaw", - - // Kill Tasks (Extended) - ["altereddrudgekilltask"] = "Altered Drudge Kill Task", - ["altereddrudgekillcount"] = "Altered Drudge Kill Counter", - ["arcticmattekarkilltask"] = "Arctic Mattekar Kill Task", - ["arcticmattekarkillcount"] = "Arctic Mattekar Kill Counter", - ["armoredillohuntingneftetkilltask"] = "Armoredillo Hunting Neftet Kill Task", - ["armoredillohuntingneftetkillcount"] = "Armoredillo Hunting Neftet Kill Counter", - ["augmenteddrudgekilltask"] = "Augmented Drudge Kill Task", - ["augmenteddrudgekillcount"] = "Augmented Drudge Kill Counter", - ["banishedcreaturekilltask"] = "Banished Creature Kill Task", - ["banishedcreaturekillcount"] = "Banished Creature Kill Counter", - ["benekniffiskilltask"] = "Benek Niffis Kill Task", - ["benekniffiskillcount"] = "Benek Niffis Kill Counter", - ["blackcoralgolemkilltask"] = "Black Coral Golem Kill Task", - ["blackcoralgolemkillcount"] = "Black Coral Golem Kill Counter", - ["blessedmoarsmankilltask"] = "Blessed Moarsman Kill Task", - ["blessedmoarsmankillcount"] = "Blessed Moarsman Kill Counter", - ["blightedcoralgolemkilltask"] = "Blighted Coral Golem Kill Task", - ["blightedcoralgolemkillcount"] = "Blighted Coral Golem Kill Counter", - ["bloodshrethkilltask"] = "Blood Shreth Kill Task", - ["bloodshrethkillcount"] = "Blood Shreth Kill Counter", - ["bronzegauntlettrooperkilltask"] = "Bronze Gauntlet Trooper Kill Task", - ["bronzegauntlettrooperkillcount"] = "Bronze Gauntlet Trooper Kill Counter", - ["coppercogtrooperkilltask"] = "Copper Cog Trooper Kill Task", - ["coppercogtrooperkillcount"] = "Copper Cog Trooper Kill Counter", - ["coppergolemkingpinkilltask"] = "Copper Golem Kingpin Kill Task", - ["coppergolemkingpinkillcount"] = "Copper Golem Kingpin Kill Counter", - ["coralgolemkilltask"] = "Coral Golem Kill Task", - ["coralgolemkillcount"] = "Coral Golem Kill Counter", - ["coralgolemviceroykilltask"] = "Coral Golem Viceroy Kill Task", - ["coralgolemviceroykillcount"] = "Coral Golem Viceroy Kill Counter", - ["corruptedgravestonekilltask"] = "Corrupted Gravestone Kill Task", - ["corruptedgravestonekillcount"] = "Corrupted Gravestone Kill Counter", - ["deathcapthrunguskilltask"] = "Deathcap Thrungus Kill Task", - ["deathcapthrunguskillcount"] = "Deathcap Thrungus Kill Counter", - ["desertcactuskilltask"] = "Desert Cactus Kill Task", - ["desertcactuskillcount"] = "Desert Cactus Kill Counter", - ["devourermargulkilltask"] = "Devourer Margul Kill Task", - ["devourermargulkillcount"] = "Devourer Margul Kill Counter", - - // Society and Faction Quests - ["celestialhandintroductioncomplete"] = "Celestial Hand Introduction Complete", - ["eldrytchwebintroductioncomplete"] = "Eldrytch Web Introduction Complete", - ["radiantbloodintroductioncomplete"] = "Radiant Blood Introduction Complete", - ["celestialhandinitiatetest"] = "Celestial Hand Initiate Test", - ["eldrytchwebinitiatetest"] = "Eldrytch Web Initiate Test", - ["radiantbloodinitiatetest"] = "Radiant Blood Initiate Test", - - // Luminance Aura Related - ["aetheriaredemption"] = "Aetheria Redemption", - ["aegisofmerc"] = "Aegis of Merc", - ["lumaugtradein"] = "Luminance Augmentation Trade In", - - // Common AC Quests - ["holtburgtraderskill"] = "Holtburg Trader Skill Quest", - ["shoushitraderskill"] = "Shoushi Trader Skill Quest", - ["yaraqtraderskill"] = "Yaraq Trader Skill Quest", - ["newbiequests"] = "Newbie Academy Quests", - ["moarsmanraid"] = "Moarsman Raid", - ["virindiparadox"] = "Virindi Paradox", - ["portalspace"] = "Portal Space Exploration" - }; - - /// - /// Get friendly name for a quest stamp, with fallback to original stamp - /// - /// The quest stamp to lookup - /// Friendly name if found, otherwise the original quest stamp - public static string GetFriendlyName(string questStamp) - { - if (string.IsNullOrEmpty(questStamp)) - return questStamp; - - return QuestStampToName.TryGetValue(questStamp.ToLower(), out string friendlyName) - ? friendlyName - : questStamp; - } - - /// - /// Get display name with friendly name and original stamp in parentheses - /// - /// The quest stamp to format - /// Formatted display name - public static string GetDisplayName(string questStamp) - { - if (string.IsNullOrEmpty(questStamp)) - return questStamp; - - string friendlyName = GetFriendlyName(questStamp); - - // If we found a mapping, show friendly name with original in parentheses - if (!string.Equals(friendlyName, questStamp, System.StringComparison.OrdinalIgnoreCase)) - { - return $"{friendlyName} ({questStamp})"; - } - - // Otherwise just show the original - return questStamp; - } - } -} \ No newline at end of file diff --git a/MosswartMassacre/SpellManager.cs b/MosswartMassacre/SpellManager.cs deleted file mode 100644 index 5d3732b..0000000 --- a/MosswartMassacre/SpellManager.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using Mag.Shared.Spells; - -namespace MosswartMassacre -{ - /// - /// Manages spell identification and cantrip detection for the Flag Tracker - /// - public static class SpellManager - { - private static readonly Dictionary SpellsById = new Dictionary(); - private static readonly List SpellData = new List(); - private static bool isInitialized = false; - - static SpellManager() - { - Initialize(); - } - - private static void Initialize() - { - if (isInitialized) return; - - try - { - // Load spell data from embedded CSV resource - var assembly = Assembly.GetExecutingAssembly(); - - // Try to find the resource with different naming patterns - var availableResources = assembly.GetManifestResourceNames(); - var spellResource = availableResources.FirstOrDefault(r => r.Contains("Spells.csv")); - - if (string.IsNullOrEmpty(spellResource)) - { - // If not embedded, try to load from file system - var csvPath = Path.Combine(Path.GetDirectoryName(assembly.Location), "..", "Shared", "Spells", "Spells.csv"); - if (File.Exists(csvPath)) - { - LoadFromFile(csvPath); - isInitialized = true; - return; - } - } - else - { - using (var stream = assembly.GetManifestResourceStream(spellResource)) - { - if (stream != null) - { - using (var reader = new StreamReader(stream)) - { - LoadFromReader(reader); - } - } - } - } - - isInitialized = true; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"SpellManager initialization error: {ex.Message}"); - } - } - - private static void LoadFromFile(string path) - { - using (var reader = new StreamReader(path)) - { - LoadFromReader(reader); - } - } - - private static void LoadFromReader(StreamReader reader) - { - // Skip header line - var header = reader.ReadLine(); - - while (!reader.EndOfStream) - { - var line = reader.ReadLine(); - if (!string.IsNullOrWhiteSpace(line)) - { - var parts = line.Split(','); - if (parts.Length >= 6) // Minimum required fields - { - SpellData.Add(parts); - - // Parse spell data - if (int.TryParse(parts[0], out int id)) - { - var name = parts[1]; - int.TryParse(parts[3], out int difficulty); - int.TryParse(parts[4], out int duration); - int.TryParse(parts[5], out int family); - - var spell = new Spell(id, name, difficulty, duration, family); - SpellsById[id] = spell; - } - } - } - } - } - - /// - /// Gets a spell by its ID - /// - public static Spell GetSpell(int id) - { - if (SpellsById.TryGetValue(id, out var spell)) - return spell; - return null; - } - - /// - /// Gets a spell by its name (case-insensitive) - /// - public static Spell GetSpell(string name) - { - return SpellsById.Values.FirstOrDefault(s => - string.Equals(s.Name, name, StringComparison.OrdinalIgnoreCase)); - } - - /// - /// Gets the total number of spells loaded - /// - public static int GetSpellCount() - { - return SpellsById.Count; - } - - /// - /// Detects if a spell is a cantrip and returns its info - /// - public static CantripInfo DetectCantrip(Spell spell) - { - if (spell == null || spell.CantripLevel == Spell.CantripLevels.None) - return null; - - var info = new CantripInfo - { - SpellId = spell.Id, - Name = spell.Name, - Level = GetCantripLevelName(spell.CantripLevel), - Color = GetCantripColor(spell.CantripLevel) - }; - - // Extract skill/attribute name from spell name - info.SkillName = ExtractSkillFromSpellName(spell.Name, info.Level); - - return info; - } - - private static string GetCantripLevelName(Spell.CantripLevels level) - { - switch (level) - { - case Spell.CantripLevels.Minor: return "Minor"; - case Spell.CantripLevels.Moderate: return "Moderate"; - case Spell.CantripLevels.Major: return "Major"; - case Spell.CantripLevels.Epic: return "Epic"; - case Spell.CantripLevels.Legendary: return "Legendary"; - default: return "N/A"; - } - } - - private static System.Drawing.Color GetCantripColor(Spell.CantripLevels level) - { - switch (level) - { - case Spell.CantripLevels.Minor: return System.Drawing.Color.White; - case Spell.CantripLevels.Moderate: return System.Drawing.Color.Green; - case Spell.CantripLevels.Major: return System.Drawing.Color.Blue; - case Spell.CantripLevels.Epic: return System.Drawing.Color.Purple; - case Spell.CantripLevels.Legendary: return System.Drawing.Color.Orange; - default: return System.Drawing.Color.White; - } - } - - private static string ExtractSkillFromSpellName(string spellName, string level) - { - // Remove the cantrip level prefix - var skillPart = spellName; - if (!string.IsNullOrEmpty(level) && skillPart.StartsWith(level + " ")) - { - skillPart = skillPart.Substring(level.Length + 1); - } - - // Map common spell name patterns to skill names - if (skillPart.Contains("Strength")) return "Strength"; - if (skillPart.Contains("Endurance")) return "Endurance"; - if (skillPart.Contains("Coordination")) return "Coordination"; - if (skillPart.Contains("Quickness")) return "Quickness"; - if (skillPart.Contains("Focus")) return "Focus"; - if (skillPart.Contains("Self") || skillPart.Contains("Willpower")) return "Willpower"; - - // Protection mappings - if (skillPart.Contains("Armor")) return "Armor"; - if (skillPart.Contains("Bludgeoning")) return "Bludgeoning Ward"; - if (skillPart.Contains("Piercing")) return "Piercing Ward"; - if (skillPart.Contains("Slashing")) return "Slashing Ward"; - if (skillPart.Contains("Flame") || skillPart.Contains("Fire")) return "Flame Ward"; - if (skillPart.Contains("Frost") || skillPart.Contains("Cold")) return "Frost Ward"; - if (skillPart.Contains("Acid")) return "Acid Ward"; - if (skillPart.Contains("Lightning") || skillPart.Contains("Electric")) return "Storm Ward"; - - // Return the skill part as-is if no mapping found - return skillPart; - } - - /// - /// Information about a detected cantrip - /// - public class CantripInfo - { - public int SpellId { get; set; } - public string Name { get; set; } - public string SkillName { get; set; } - public string Level { get; set; } - public System.Drawing.Color Color { get; set; } - } - } -} \ No newline at end of file diff --git a/MosswartMassacre/Telemetry.cs b/MosswartMassacre/Telemetry.cs index b9f8e14..ce9bb79 100644 --- a/MosswartMassacre/Telemetry.cs +++ b/MosswartMassacre/Telemetry.cs @@ -85,10 +85,9 @@ namespace MosswartMassacre kills = PluginCore.totalKills, onlinetime = (DateTime.Now - PluginCore.statsStartTime).ToString(@"dd\.hh\:mm\:ss"), kills_per_hour = PluginCore.killsPerHour.ToString("F0"), - deaths = PluginCore.sessionDeaths.ToString(), - total_deaths = PluginCore.totalDeaths.ToString(), + deaths = 0, rares_found = PluginCore.rareCount, - prismatic_taper_count = PluginCore.cachedPrismaticCount.ToString(), + prismatic_taper_count = 0, vt_state = VtankControl.VtGetMetaState(), }; diff --git a/MosswartMassacre/UpdateManager.cs b/MosswartMassacre/UpdateManager.cs deleted file mode 100644 index 7f85741..0000000 --- a/MosswartMassacre/UpdateManager.cs +++ /dev/null @@ -1,233 +0,0 @@ -using System; -using System.IO; -using System.Net.Http; -using System.Security.Cryptography; -using System.Threading.Tasks; - -namespace MosswartMassacre -{ - public static class UpdateManager - { - private const string UPDATE_URL = "https://git.snakedesert.se/SawatoMosswartsEnjoyersClub/MosswartMassacre/raw/branch/spawn-detection/MosswartMassacre/bin/Release/MosswartMassacre.dll"; - - private static bool updateAvailable = false; - private static string remoteFileHash = string.Empty; - private static string localFileHash = string.Empty; - private static DateTime lastCheckTime = DateTime.MinValue; - - public static bool IsUpdateAvailable => updateAvailable; - public static DateTime LastCheckTime => lastCheckTime; - - /// - /// Calculate SHA256 hash of a file - /// - private static string CalculateFileHash(string filePath) - { - using (var sha256 = SHA256.Create()) - { - using (var stream = File.OpenRead(filePath)) - { - byte[] hashBytes = sha256.ComputeHash(stream); - return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); - } - } - } - - /// - /// Calculate SHA256 hash of byte array - /// - private static string CalculateHash(byte[] data) - { - using (var sha256 = SHA256.Create()) - { - byte[] hashBytes = sha256.ComputeHash(data); - return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); - } - } - - public static async Task CheckForUpdateAsync() - { - try - { - PluginCore.WriteToChat("[Update] Checking for updates..."); - - // Get local file hash - string localPath = GetLocalDllPath(); - if (!File.Exists(localPath)) - { - PluginCore.WriteToChat("[Update] Error: Could not find local DLL file"); - return false; - } - - PluginCore.WriteToChat("[Update] Calculating local file hash..."); - localFileHash = CalculateFileHash(localPath); - - // Download remote file and calculate hash - using (var client = new HttpClient()) - { - client.Timeout = TimeSpan.FromSeconds(30); - - PluginCore.WriteToChat("[Update] Downloading remote file for comparison..."); - var remoteData = await client.GetByteArrayAsync(UPDATE_URL); - - if (remoteData == null || remoteData.Length == 0) - { - PluginCore.WriteToChat("[Update] Error: Could not download remote file"); - return false; - } - - PluginCore.WriteToChat("[Update] Calculating remote file hash..."); - remoteFileHash = CalculateHash(remoteData); - } - - // Compare hashes - updateAvailable = !string.Equals(localFileHash, remoteFileHash, StringComparison.OrdinalIgnoreCase); - lastCheckTime = DateTime.Now; - - if (updateAvailable) - { - PluginCore.WriteToChat($"[Update] Update available!"); - PluginCore.WriteToChat($"[Update] Local hash: {localFileHash}"); - PluginCore.WriteToChat($"[Update] Remote hash: {remoteFileHash}"); - } - else - { - PluginCore.WriteToChat("[Update] Up to date - hashes match"); - } - - return true; - } - catch (HttpRequestException ex) - { - PluginCore.WriteToChat($"[Update] Network error: {ex.Message}"); - return false; - } - catch (TaskCanceledException) - { - PluginCore.WriteToChat("[Update] Request timed out"); - return false; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[Update] Check failed: {ex.Message}"); - return false; - } - } - - public static async Task DownloadAndInstallUpdateAsync() - { - if (!updateAvailable) - { - PluginCore.WriteToChat("[Update] No update available. Run /mm checkforupdate first."); - return false; - } - - try - { - PluginCore.WriteToChat("[Update] Downloading update..."); - - string localPath = GetLocalDllPath(); - string tempPath = localPath + ".tmp"; - string backupPath = localPath + ".bak"; - - // Download to temp file - using (var client = new HttpClient()) - { - client.Timeout = TimeSpan.FromSeconds(30); - - var response = await client.GetAsync(UPDATE_URL); - response.EnsureSuccessStatusCode(); - - using (var fileStream = File.Create(tempPath)) - { - await response.Content.CopyToAsync(fileStream); - } - } - - // Validate downloaded file by hash - PluginCore.WriteToChat("[Update] Validating downloaded file..."); - var downloadedHash = CalculateFileHash(tempPath); - if (!string.Equals(downloadedHash, remoteFileHash, StringComparison.OrdinalIgnoreCase)) - { - File.Delete(tempPath); - PluginCore.WriteToChat($"[Update] Download validation failed. Hash mismatch!"); - PluginCore.WriteToChat($"[Update] Expected: {remoteFileHash}"); - PluginCore.WriteToChat($"[Update] Got: {downloadedHash}"); - return false; - } - - PluginCore.WriteToChat("[Update] Download complete, installing..."); - - // Atomically replace current file with new version (creates backup automatically) - File.Replace(tempPath, localPath, backupPath); - - // Clear update flag - updateAvailable = false; - - PluginCore.WriteToChat("[Update] Update installed successfully!"); - PluginCore.WriteToChat("[Update] Previous version backed up as MosswartMassacre.dll.bak"); - - // Wait a moment for file system to settle, then trigger hot reload - await System.Threading.Tasks.Task.Delay(1000); - - try - { - // Touch the file to ensure FileSystemWatcher detects the change - File.SetLastWriteTime(localPath, DateTime.Now); - PluginCore.WriteToChat("[Update] Triggering hot reload..."); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[Update] Could not trigger hot reload: {ex.Message}"); - PluginCore.WriteToChat("[Update] Please use /mm gui to reload manually"); - } - - return true; - } - catch (HttpRequestException ex) - { - PluginCore.WriteToChat($"[Update] Download error: {ex.Message}"); - return false; - } - catch (TaskCanceledException) - { - PluginCore.WriteToChat("[Update] Download timed out"); - return false; - } - catch (UnauthorizedAccessException) - { - PluginCore.WriteToChat("[Update] File access denied. Make sure the plugin directory is writable."); - return false; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[Update] Install failed: {ex.Message}"); - return false; - } - } - - private static string GetLocalDllPath() - { - // Get the path to the current DLL - string assemblyPath = typeof(PluginCore).Assembly.Location; - - // If empty (hot reload scenario), use AssemblyDirectory + filename - if (string.IsNullOrEmpty(assemblyPath)) - { - return Path.Combine(PluginCore.AssemblyDirectory, "MosswartMassacre.dll"); - } - - return assemblyPath; - } - - public static string GetUpdateStatus() - { - if (lastCheckTime == DateTime.MinValue) - { - return "Update Status: Not checked"; - } - - return updateAvailable ? "Update Status: Update available" : "Update Status: Up to date"; - } - } -} \ No newline at end of file diff --git a/MosswartMassacre/Utils.cs b/MosswartMassacre/Utils.cs index 667c6aa..5a63a12 100644 --- a/MosswartMassacre/Utils.cs +++ b/MosswartMassacre/Utils.cs @@ -2,8 +2,6 @@ using Decal.Adapter; using Decal.Adapter.Wrappers; using System.Numerics; -using Mag.Shared.Constants; -using System.Linq; namespace MosswartMassacre { @@ -41,29 +39,6 @@ namespace MosswartMassacre } } - /// - /// Return any WorldObject's raw world position by reading the - /// physics-object pointer (same offsets: +0x84/88/8C). - /// - public static unsafe Vector3 GetWorldObjectPosition(int objectId) - { - try - { - if (!CoreManager.Current.Actions.IsValidObject(objectId)) - return new Vector3(); - - byte* p = (byte*)CoreManager.Current.Actions.Underlying.GetPhysicsObjectPtr(objectId); - return new Vector3( - *(float*)(p + 0x84), // X - *(float*)(p + 0x88), // Y - *(float*)(p + 0x8C)); // Z - } - catch - { - return new Vector3(); - } - } - /// /// Convenience: returns the current landcell (upper 16 bits of landblock). /// @@ -88,26 +63,6 @@ namespace MosswartMassacre return new Coordinates(ew, ns, pos.Z); } - /// - /// Get AC-style coordinates (EW/NS/Z) for any WorldObject. - /// - public static Coordinates GetWorldObjectCoordinates(WorldObject wo) - { - if (wo == null) return new Coordinates(); - - Vector3 pos = GetWorldObjectPosition(wo.Id); - - // Get landcell from the object's coordinates - var coordsObj = wo.Coordinates(); - if (coordsObj == null) return new Coordinates(); - - // Convert DECAL coords to our Coordinates with Z - double ew = coordsObj.EastWest; - double ns = coordsObj.NorthSouth; - - return new Coordinates(ew, ns, pos.Z); - } - /* ---------------------------------------------------------- * 3) Generic math helpers you may want later * -------------------------------------------------------- */ @@ -117,108 +72,5 @@ namespace MosswartMassacre public static double DegToRad(double deg) => deg * Math.PI / 180.0; public static double RadToDeg(double rad) => rad * 180.0 / Math.PI; - - /* ---------------------------------------------------------- - * 4) Generic item property access - * -------------------------------------------------------- */ - - /// - /// Find a WorldObject item by name in inventory - /// - /// Name of the item to find - /// WorldObject or null if not found - public static WorldObject FindItemByName(string itemName) - { - try - { - //var worldFilter = CoreManager.Current.WorldFilter; - //var playerInv = CoreManager.Current.CharacterFilter.Id; - - // Search inventory - - foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory()) - { - if (string.Equals(wo.Name, itemName, StringComparison.OrdinalIgnoreCase)) - return wo; - } - - return null; - } - catch - { - return null; - } - } - - /// - /// Get the stack size/quantity of a specific item by name - /// - /// Name of the item to find - /// Stack size or 0 if not found - /// - /// Return the total quantity of an item in the character’s inventory, - /// adding up every stack that shares . - /// - public static int GetItemStackSize(string itemName) - { - try - { - // 1. Pull every WorldObject in bags + containers - var inv = CoreManager.Current.WorldFilter.GetInventory(); - - // 2. Keep only those whose display name matches (case-insensitive) - // 3. For each one, use StackCount if it exists, otherwise treat as 1 - return inv.Where(wo => - string.Equals(wo.Name, itemName, - StringComparison.OrdinalIgnoreCase)) - .Sum(wo => - { - // Some items (weapons, armor) aren’t stackable; - // Values(LongValueKey.StackCount) throws if the key is absent. - try - { - return wo.Values(LongValueKey.StackCount); - } - catch - { - return 1; // non-stackable item = quantity 1 - } - }); - } - catch - { - return 0; - } - } - - - /// - /// Get the icon ID of a specific item by name - /// - /// Name of the item to find - /// Icon ID or 0 if not found - public static int GetItemIcon(string itemName) - { - try - { - var item = FindItemByName(itemName); - return item?.Icon ?? 0; - } - catch - { - return 0; - } - } - - /// - /// Get the display icon ID (with 0x6000000 offset) for an item by name - /// - /// Name of the item to find - /// Display icon ID or 0x6002D14 (default icon) if not found - public static int GetItemDisplayIcon(string itemName) - { - int rawIcon = GetItemIcon(itemName); - return rawIcon != 0 ? rawIcon + 0x6000000 : 0x6002D14; - } } } diff --git a/MosswartMassacre/ViewSystemSelector.cs b/MosswartMassacre/ViewSystemSelector.cs new file mode 100644 index 0000000..5e75b7a --- /dev/null +++ b/MosswartMassacre/ViewSystemSelector.cs @@ -0,0 +1,262 @@ +/////////////////////////////////////////////////////////////////////////////// +//File: ViewSystemSelector.cs +// +//Description: Contains the MyClasses.MetaViewWrappers.ViewSystemSelector class, +// which is used to determine whether the Virindi View Service is enabled. +// As with all the VVS wrappers, the VVS_REFERENCED compilation symbol must be +// defined for the VVS code to be compiled. Otherwise, only Decal views are used. +// +//References required: +// VirindiViewService (if VVS_REFERENCED is defined) +// Decal.Adapter +// Decal.Interop.Core +// +//This file is Copyright (c) 2009 VirindiPlugins +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Text; +using System.Reflection; + +#if METAVIEW_PUBLIC_NS +namespace MetaViewWrappers +#else +namespace MyClasses.MetaViewWrappers +#endif +{ + internal static class ViewSystemSelector + { + public enum eViewSystem + { + DecalInject, + VirindiViewService, + } + + + ///////////////////////////////System presence detection/////////////////////////////// + + public static bool IsPresent(Decal.Adapter.Wrappers.PluginHost pHost, eViewSystem VSystem) + { + switch (VSystem) + { + case eViewSystem.DecalInject: + return true; + case eViewSystem.VirindiViewService: + return VirindiViewsPresent(pHost); + default: + return false; + } + } + static bool VirindiViewsPresent(Decal.Adapter.Wrappers.PluginHost pHost) + { +#if VVS_REFERENCED + System.Reflection.Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); + + foreach (System.Reflection.Assembly a in asms) + { + AssemblyName nmm = a.GetName(); + if ((nmm.Name == "VirindiViewService") && (nmm.Version >= new System.Version("1.0.0.37"))) + { + try + { + return Curtain_VVS_Running(); + } + catch + { + return false; + } + } + } + + return false; +#else + return false; +#endif + } + public static bool VirindiViewsPresent(Decal.Adapter.Wrappers.PluginHost pHost, Version minver) + { +#if VVS_REFERENCED + System.Reflection.Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); + + foreach (System.Reflection.Assembly a in asms) + { + AssemblyName nm = a.GetName(); + if ((nm.Name == "VirindiViewService") && (nm.Version >= minver)) + { + try + { + return Curtain_VVS_Running(); + } + catch + { + return false; + } + } + } + + return false; +#else + return false; +#endif + } + +#if VVS_REFERENCED + static bool Curtain_VVS_Running() + { + return VirindiViewService.Service.Running; + } +#endif + + ///////////////////////////////CreateViewResource/////////////////////////////// + + public static IView CreateViewResource(Decal.Adapter.Wrappers.PluginHost pHost, string pXMLResource) + { +#if VVS_REFERENCED + if (IsPresent(pHost, eViewSystem.VirindiViewService)) + return CreateViewResource(pHost, pXMLResource, eViewSystem.VirindiViewService); + else +#endif + return CreateViewResource(pHost, pXMLResource, eViewSystem.DecalInject); + } + public static IView CreateViewResource(Decal.Adapter.Wrappers.PluginHost pHost, string pXMLResource, eViewSystem VSystem) + { + if (!IsPresent(pHost, VSystem)) return null; + switch (VSystem) + { + case eViewSystem.DecalInject: + return CreateDecalViewResource(pHost, pXMLResource); + case eViewSystem.VirindiViewService: +#if VVS_REFERENCED + return CreateMyHudViewResource(pHost, pXMLResource); +#else + break; +#endif + } + return null; + } + static IView CreateDecalViewResource(Decal.Adapter.Wrappers.PluginHost pHost, string pXMLResource) + { + IView ret = new DecalControls.View(); + ret.Initialize(pHost, pXMLResource); + return ret; + } + +#if VVS_REFERENCED + static IView CreateMyHudViewResource(Decal.Adapter.Wrappers.PluginHost pHost, string pXMLResource) + { + IView ret = new VirindiViewServiceHudControls.View(); + ret.Initialize(pHost, pXMLResource); + return ret; + } +#endif + + + ///////////////////////////////CreateViewXML/////////////////////////////// + + public static IView CreateViewXML(Decal.Adapter.Wrappers.PluginHost pHost, string pXML) + { +#if VVS_REFERENCED + if (IsPresent(pHost, eViewSystem.VirindiViewService)) + return CreateViewXML(pHost, pXML, eViewSystem.VirindiViewService); + else +#endif + return CreateViewXML(pHost, pXML, eViewSystem.DecalInject); + } + + public static IView CreateViewXML(Decal.Adapter.Wrappers.PluginHost pHost, string pXML, eViewSystem VSystem) + { + if (!IsPresent(pHost, VSystem)) return null; + switch (VSystem) + { + case eViewSystem.DecalInject: + return CreateDecalViewXML(pHost, pXML); + case eViewSystem.VirindiViewService: +#if VVS_REFERENCED + return CreateMyHudViewXML(pHost, pXML); +#else + break; +#endif + } + return null; + } + static IView CreateDecalViewXML(Decal.Adapter.Wrappers.PluginHost pHost, string pXML) + { + IView ret = new DecalControls.View(); + ret.InitializeRawXML(pHost, pXML); + return ret; + } + +#if VVS_REFERENCED + static IView CreateMyHudViewXML(Decal.Adapter.Wrappers.PluginHost pHost, string pXML) + { + IView ret = new VirindiViewServiceHudControls.View(); + ret.InitializeRawXML(pHost, pXML); + return ret; + } +#endif + + + ///////////////////////////////HasChatOpen/////////////////////////////// + + public static bool AnySystemHasChatOpen(Decal.Adapter.Wrappers.PluginHost pHost) + { + if (IsPresent(pHost, eViewSystem.VirindiViewService)) + if (HasChatOpen_VirindiViews()) return true; + if (pHost.Actions.ChatState) return true; + return false; + } + + static bool HasChatOpen_VirindiViews() + { +#if VVS_REFERENCED + if (VirindiViewService.HudView.FocusControl != null) + { + if (VirindiViewService.HudView.FocusControl.GetType() == typeof(VirindiViewService.Controls.HudTextBox)) + return true; + } + return false; +#else + return false; +#endif + } + + public delegate void delConditionalSplit(object data); + public static void ViewConditionalSplit(IView v, delConditionalSplit onDecal, delConditionalSplit onVVS, object data) + { + Type vtype = v.GetType(); + +#if VVS_REFERENCED + if (vtype == typeof(VirindiViewServiceHudControls.View)) + { + if (onVVS != null) + onVVS(data); + } +#endif + + if (vtype == typeof(DecalControls.View)) + { + if (onDecal != null) + onDecal(data); + } + } + } +} diff --git a/MosswartMassacre/ViewXML/flagTracker.xml b/MosswartMassacre/ViewXML/flagTracker.xml deleted file mode 100644 index 565f9d6..0000000 --- a/MosswartMassacre/ViewXML/flagTracker.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MosswartMassacre/ViewXML/mainViewTabbed.xml b/MosswartMassacre/ViewXML/mainViewTabbed.xml deleted file mode 100644 index 0707aae..0000000 --- a/MosswartMassacre/ViewXML/mainViewTabbed.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MosswartMassacre/Views/FlagTrackerView.cs b/MosswartMassacre/Views/FlagTrackerView.cs deleted file mode 100644 index b32ace9..0000000 --- a/MosswartMassacre/Views/FlagTrackerView.cs +++ /dev/null @@ -1,863 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using VirindiViewService.Controls; - -namespace MosswartMassacre.Views -{ - /// - /// Dedicated Flag Tracker window with comprehensive character tracking - /// Ported from UBS Lua flagtracker with full functionality preservation - /// - internal class FlagTrackerView : VVSBaseView - { - private static FlagTrackerView instance; - - #region Tab Control References - private HudTabView mainTabView; - - // Augmentations Tab - private HudList lstAugmentations; - private HudButton btnRefreshAugs; - - // Luminance Tab - private HudList lstLuminanceAuras; - private HudButton btnRefreshLum; - - // Recalls Tab - private HudList lstRecallSpells; - private HudButton btnRefreshRecalls; - - - // Cantrips Tab - private HudList lstCantrips; - private HudButton btnRefreshCantrips; - - // Quests Tab - private HudList lstQuests; - private HudButton btnRefreshQuests; - - #endregion - - #region Data Management - private FlagTrackerData data; - private System.Timers.Timer questUpdateTimer; - #endregion - - public FlagTrackerView(PluginCore core) : base(core) - { - try - { - instance = this; - data = new FlagTrackerData(); - - // Initialize quest update timer for real-time countdown - questUpdateTimer = new System.Timers.Timer(5000); // Update every 5 seconds - questUpdateTimer.Elapsed += OnQuestTimerUpdate; - questUpdateTimer.AutoReset = true; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[MossyTracker] Failed to initialize: {ex.Message}"); - } - } - - #region Static Interface - public static void OpenFlagTracker() - { - try - { - if (instance == null) - { - instance = new FlagTrackerView(null); - instance.InitializeView(); - } - else - { - // Bring existing window to front - if (instance.view != null) - { - instance.view.Visible = true; - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error opening Flag Tracker: {ex.Message}"); - } - } - - public static void CloseFlagTracker() - { - try - { - if (instance != null) - { - instance.Dispose(); - instance = null; - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error closing Flag Tracker: {ex.Message}"); - } - } - - public static bool IsOpen() - { - return instance != null && instance.view != null && instance.view.Visible; - } - - public static void RefreshQuestData() - { - try - { - if (PluginCore.questManager != null) - { - PluginCore.questManager.RefreshQuests(); - - // If Flag Tracker window is open, also refresh the UI - if (instance != null) - { - instance.PopulateQuestsList(); - - // Schedule another refresh in a few seconds to catch any data - System.Threading.Timer refreshTimer = null; - refreshTimer = new System.Threading.Timer(_ => - { - try - { - if (instance != null) - { - instance.PopulateQuestsList(); - } - } - catch (Exception timerEx) - { - PluginCore.WriteToChat($"[MossyTracker] Delayed refresh failed: {timerEx.Message}"); - } - finally - { - refreshTimer?.Dispose(); - } - }, null, 4000, System.Threading.Timeout.Infinite); - } - } - else - { - PluginCore.WriteToChat("[MossyTracker] Quest manager not available for refresh"); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[MossyTracker] Quest refresh failed: {ex.Message}"); - } - } - #endregion - - #region Initialization - private void InitializeView() - { - try - { - CreateFromXMLResource("MosswartMassacre.ViewXML.flagTracker.xml"); - - if (view == null) - { - PluginCore.WriteToChat("[MossyTracker] Failed to create view"); - return; - } - - InitializeTabControls(); - InitializeEventHandlers(); - Initialize(); - - if (view != null) - { - view.Visible = true; - view.ShowInBar = true; - view.Title = "Mossy Tracker v5.0.0.0"; - } - - RefreshAllData(); - - // Start quest update timer - if (questUpdateTimer != null) - { - questUpdateTimer.Start(); - } - - PluginCore.WriteToChat("[MossyTracker] Initialized successfully"); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[MossyTracker] Failed to initialize: {ex.Message}"); - } - } - - private void InitializeTabControls() - { - try - { - mainTabView = GetControl("mainTabView"); - lstAugmentations = GetControl("lstAugmentations"); - btnRefreshAugs = GetControl("btnRefreshAugs"); - lstLuminanceAuras = GetControl("lstLuminanceAuras"); - btnRefreshLum = GetControl("btnRefreshLum"); - lstRecallSpells = GetControl("lstRecallSpells"); - btnRefreshRecalls = GetControl("btnRefreshRecalls"); - lstCantrips = GetControl("lstCantrips"); - btnRefreshCantrips = GetControl("btnRefreshCantrips"); - lstQuests = GetControl("lstQuests"); - btnRefreshQuests = GetControl("btnRefreshQuests"); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[MossyTracker] Failed to initialize controls: {ex.Message}"); - } - } - - private void InitializeEventHandlers() - { - try - { - // Refresh button events - if (btnRefreshAugs != null) btnRefreshAugs.Hit += OnRefreshAugmentations; - if (btnRefreshLum != null) btnRefreshLum.Hit += OnRefreshLuminance; - if (btnRefreshRecalls != null) btnRefreshRecalls.Hit += OnRefreshRecalls; - if (btnRefreshCantrips != null) btnRefreshCantrips.Hit += OnRefreshCantrips; - if (btnRefreshQuests != null) btnRefreshQuests.Hit += OnRefreshQuests; - - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error initializing event handlers: {ex.Message}"); - } - } - #endregion - - #region Window Management Overrides - protected override void View_VisibleChanged(object sender, EventArgs e) - { - try - { - // Call base implementation first - base.View_VisibleChanged(sender, e); - - // If window becomes invisible and we're not already disposed, dispose it - // This handles the X button click case - if (view != null && !view.Visible && !_disposed) - { - // Use a small delay to ensure this isn't just a temporary hide - System.Threading.Timer disposeTimer = null; - disposeTimer = new System.Threading.Timer(_ => - { - try - { - // Double-check the window is still hidden and not disposed - if (view != null && !view.Visible && !_disposed) - { - Dispose(); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in delayed disposal: {ex.Message}"); - } - finally - { - disposeTimer?.Dispose(); - } - }, null, 100, System.Threading.Timeout.Infinite); // 100ms delay - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in FlagTracker VisibleChanged: {ex.Message}"); - } - } - #endregion - - #region Timer Event Handlers - private void OnQuestTimerUpdate(object sender, System.Timers.ElapsedEventArgs e) - { - try - { - // Update quest list display if quests tab is visible and we have quest data - if (view != null && view.Visible && PluginCore.questManager?.QuestList != null && PluginCore.questManager.QuestList.Count > 0) - { - // Only update the quest list to refresh countdown timers - PopulateQuestsList(); - } - } - catch (Exception) - { - // Silently handle timer update errors to avoid spam - } - } - - #endregion - - #region Event Handlers - private void OnRefreshAugmentations(object sender, EventArgs e) - { - try - { - data.RefreshAugmentations(); - PopulateAugmentationsList(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing augmentations: {ex.Message}"); - } - } - - private void OnRefreshLuminance(object sender, EventArgs e) - { - try - { - data.RefreshLuminanceAuras(); - PopulateLuminanceList(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing luminance auras: {ex.Message}"); - } - } - - private void OnRefreshRecalls(object sender, EventArgs e) - { - try - { - data.RefreshRecallSpells(); - PopulateRecallsList(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing recall spells: {ex.Message}"); - } - } - - - private void OnRefreshCantrips(object sender, EventArgs e) - { - try - { - data.RefreshCantrips(); - PopulateCantripsList(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing cantrips: {ex.Message}"); - } - } - - private void OnRefreshQuests(object sender, EventArgs e) - { - try - { - if (PluginCore.questManager != null) - { - PluginCore.questManager.RefreshQuests(); - PopulateQuestsList(); - - // Schedule another refresh in a few seconds to catch any data - System.Threading.Timer refreshTimer = null; - refreshTimer = new System.Threading.Timer(_ => - { - try - { - PopulateQuestsList(); - } - catch (Exception timerEx) - { - PluginCore.WriteToChat($"[MossyTracker] Refresh failed: {timerEx.Message}"); - } - finally - { - refreshTimer?.Dispose(); - } - }, null, 4000, System.Threading.Timeout.Infinite); - } - else - { - PluginCore.WriteToChat("[MossyTracker] Quest manager not available"); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[MossyTracker] Refresh failed: {ex.Message}"); - } - } - - #endregion - - #region Helper Methods - private void SafeSetListText(HudList.HudListRowAccessor row, int columnIndex, string text) - { - try - { - if (row != null && columnIndex >= 0) - { - // Check if the column exists - try - { - var control = row[columnIndex]; - if (control != null) - { - ((HudStaticText)control).Text = text ?? ""; - } - // Column control is null - ignore silently - } - catch (IndexOutOfRangeException) - { - // Column doesn't exist - ignore silently - } - } - // Invalid parameters - ignore silently - } - catch - { - // Ignore text setting errors silently - } - } - - private void SafeSetListColor(HudList.HudListRowAccessor row, int columnIndex, Color color) - { - try - { - if (row != null && columnIndex >= 0 && row[columnIndex] != null) - { - ((HudStaticText)row[columnIndex]).TextColor = color; - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error setting list color at column {columnIndex}: {ex.Message}"); - } - } - - private void SafeSetListImage(HudList.HudListRowAccessor row, int columnIndex, int iconId) - { - try - { - if (row != null && columnIndex >= 0) - { - try - { - var control = row[columnIndex]; - - if (control != null && control is VirindiViewService.Controls.HudPictureBox) - { - var pictureBox = (VirindiViewService.Controls.HudPictureBox)control; - pictureBox.Image = iconId; - } - } - catch (IndexOutOfRangeException) - { - // Column doesn't exist - ignore silently - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error setting list image at column {columnIndex}: {ex.Message}"); - } - } - - private string GetIconSymbol(string category) - { - switch (category) - { - case "Basic Recalls": - return "[B]"; // Basic recalls - case "Island Recalls": - return "[I]"; // Island recalls - case "Town Recalls": - return "[T]"; // Town recalls - case "Special Recalls": - return "[S]"; // Special recalls - default: - return "[?]"; // Unknown category - } - } - - private string FormatCountdown(long seconds) - { - if (seconds <= 0) - return "READY"; - - var timeSpan = TimeSpan.FromSeconds(seconds); - - if (timeSpan.TotalDays >= 1) - return $"{(int)timeSpan.TotalDays}d {timeSpan.Hours:D2}h"; - else if (timeSpan.TotalHours >= 1) - return $"{timeSpan.Hours}h {timeSpan.Minutes:D2}m"; - else if (timeSpan.TotalMinutes >= 1) - return $"{timeSpan.Minutes}m {timeSpan.Seconds:D2}s"; - else - return $"{timeSpan.Seconds}s"; - } - - #endregion - - #region Data Population Methods - private void RefreshAllData() - { - try - { - if (PluginCore.questManager != null) - { - PluginCore.questManager.RefreshQuests(); - } - - if (data != null) - { - try - { - data.RefreshAll(); - } - catch (Exception dataEx) - { - PluginCore.WriteToChat($"[MossyTracker] Data refresh failed: {dataEx.Message}"); - } - } - - PopulateAugmentationsList(); - PopulateLuminanceList(); - PopulateRecallsList(); - PopulateCantripsList(); - PopulateQuestsList(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[MossyTracker] Refresh failed: {ex.Message}"); - } - } - - private void PopulateAugmentationsList() - { - try - { - if (lstAugmentations == null) return; - - lstAugmentations.ClearRows(); - - if (data?.AugmentationCategories == null) - { - var row = lstAugmentations.AddRow(); - SafeSetListText(row, 0, "No augmentation data available"); - SafeSetListText(row, 1, "Click Refresh to load data"); - SafeSetListText(row, 2, ""); - SafeSetListText(row, 3, ""); - return; - } - - foreach (var category in data.AugmentationCategories) - { - // Add category header - var headerRow = lstAugmentations.AddRow(); - SafeSetListText(headerRow, 0, $"--- {category.Key} ---"); - SafeSetListText(headerRow, 1, ""); - SafeSetListText(headerRow, 2, ""); - SafeSetListText(headerRow, 3, ""); - - // Add augmentations in this category - foreach (var aug in category.Value) - { - var row = lstAugmentations.AddRow(); - - // Augmentation name with progress indicator - string progressText = aug.IsMaxed ? "[MAX]" : $"[{aug.CurrentValue}/{aug.Repeatable}]"; - SafeSetListText(row, 0, aug.Name); - SafeSetListText(row, 1, progressText); - SafeSetListText(row, 2, aug.Trainer); - SafeSetListText(row, 3, aug.Location); - - // Color code based on completion status - Color progressColor = Color.Red; - if (aug.IsMaxed) - { - progressColor = Color.Green; - } - else if (aug.CurrentValue > 0) - { - progressColor = Color.Yellow; - } - - // Apply color to progress text - SafeSetListColor(row, 1, progressColor); - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error populating augmentations list: {ex.Message}"); - } - } - - private void PopulateLuminanceList() - { - try - { - if (lstLuminanceAuras == null || data?.LuminanceAuraCategories == null) return; - - lstLuminanceAuras.ClearRows(); - - foreach (var category in data.LuminanceAuraCategories) - { - // Add category header - var headerRow = lstLuminanceAuras.AddRow(); - SafeSetListText(headerRow, 0, $"--- {category.Key} ---"); - SafeSetListText(headerRow, 1, ""); - SafeSetListText(headerRow, 2, ""); - - // Add luminance auras in this category - foreach (var aura in category.Value) - { - var row = lstLuminanceAuras.AddRow(); - - // Aura name - SafeSetListText(row, 0, aura.Name); - - // Progress (current/cap) - string progressText = $"{aura.CurrentValue}/{aura.Cap}"; - SafeSetListText(row, 1, progressText); - - // Category or quest flag for Seer auras - string categoryText = category.Key == "Seer Auras" && !string.IsNullOrEmpty(aura.QuestFlag) - ? aura.QuestFlag - : category.Key; - SafeSetListText(row, 2, categoryText); - - // Color code based on progress - Color progressColor = Color.Red; - if (aura.CurrentValue >= aura.Cap) - { - progressColor = Color.Green; - } - else if (aura.CurrentValue > 0) - { - progressColor = Color.Yellow; - } - - // Apply color to progress text - SafeSetListColor(row, 1, progressColor); - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error populating luminance list: {ex.Message}"); - } - } - - private void PopulateRecallsList() - { - try - { - if (lstRecallSpells == null) return; - - lstRecallSpells.ClearRows(); - - if (data?.RecallSpells == null) - { - var row = lstRecallSpells.AddRow(); - SafeSetListImage(row, 0, 0x6002D14); // Default portal icon - SafeSetListText(row, 1, "No recall data available - Click Refresh"); - SafeSetListText(row, 2, "Loading..."); - return; - } - - foreach (var recall in data.RecallSpells) - { - var row = lstRecallSpells.AddRow(); - - - // Column 0: Spell icon using MagTools approach - SafeSetListImage(row, 0, recall.IconId); - - // Column 1: Recall spell name - SafeSetListText(row, 1, recall.Name); - - // Column 2: Known status - string status = recall.IsKnown ? "Known" : "Unknown"; - SafeSetListText(row, 2, status); - - // Color code based on known status - Color statusColor = recall.IsKnown ? Color.Green : Color.Red; - SafeSetListColor(row, 2, statusColor); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error populating recalls list: {ex.Message}"); - } - } - - - private void PopulateCantripsList() - { - try - { - if (lstCantrips == null || data?.Cantrips == null) return; - - lstCantrips.ClearRows(); - - foreach (var category in data.Cantrips) - { - // Add category header - var headerRow = lstCantrips.AddRow(); - SafeSetListImage(headerRow, 0, 0x6002856); // Star icon for category headers - SafeSetListText(headerRow, 1, $"--- {category.Key} ---"); - SafeSetListText(headerRow, 2, ""); - - // Add cantrips in this category - foreach (var cantrip in category.Value) - { - var row = lstCantrips.AddRow(); - - // Column 0: Icon (green/red circle based on status) - SafeSetListImage(row, 0, cantrip.Value.ComputedIconId); - - // Column 1: Skill/Attribute name - SafeSetListText(row, 1, cantrip.Key); - - // Column 2: Cantrip level - SafeSetListText(row, 2, cantrip.Value.Value); - - // Apply color coding based on cantrip level - SafeSetListColor(row, 2, cantrip.Value.Color); - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error populating cantrips list: {ex.Message}"); - } - } - - private void PopulateQuestsList() - { - try - { - if (lstQuests == null) return; - - lstQuests.ClearRows(); - - // Add column headers - New order: Quest Name, Countdown, Last Solved, Cooldown, Solves - var headerRow = lstQuests.AddRow(); - SafeSetListText(headerRow, 0, "--- Quest Name ---"); - SafeSetListText(headerRow, 1, "Countdown"); - SafeSetListText(headerRow, 2, "Last Solved"); - SafeSetListText(headerRow, 3, "Cooldown"); - SafeSetListText(headerRow, 4, "Solves"); - - if (PluginCore.questManager?.QuestList != null && PluginCore.questManager.QuestList.Count > 0) - { - var currentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); - - // Filter out maxed quests and sort by solve count (highest to lowest) - var visibleQuests = PluginCore.questManager.QuestList - .Where(q => !(q.MaxSolves > 0 && q.Solves >= q.MaxSolves)) // Hide maxed quests - .OrderByDescending(q => q.Solves) - .ThenBy(q => PluginCore.questManager.GetFriendlyQuestName(q.Id)); - - foreach (var quest in visibleQuests) - { - var questRow = lstQuests.AddRow(); - - // Column 0: Quest Name (friendly name only, wider) - string questName = PluginCore.questManager.GetFriendlyQuestName(quest.Id); - SafeSetListText(questRow, 0, questName); - - // Column 1: Countdown Timer - long timeRemaining = quest.ExpireTime - currentTime; - string countdownText = FormatCountdown(timeRemaining); - SafeSetListText(questRow, 1, countdownText); - - // Column 2: Last Solved (date) - moved from Column 3 - SafeSetListText(questRow, 2, PluginCore.questManager.FormatTimeStamp(quest.Timestamp)); - - // Column 3: Cooldown (formatted duration) - moved from Column 4 - SafeSetListText(questRow, 3, PluginCore.questManager.FormatSeconds(quest.Delta)); - - // Column 4: Solves (white text) - moved from Column 5 - SafeSetListText(questRow, 4, quest.Solves.ToString()); - SafeSetListColor(questRow, 4, System.Drawing.Color.White); - - // Color code the countdown based on availability - if (quest.ExpireTime <= currentTime) - { - SafeSetListColor(questRow, 1, System.Drawing.Color.Green); // Ready - green countdown - } - else - { - SafeSetListColor(questRow, 1, System.Drawing.Color.Yellow); // On cooldown - yellow countdown - } - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error populating quests list: {ex.Message}"); - } - } - #endregion - - - #region Cleanup - private bool _disposed = false; - - protected override void Dispose(bool disposing) - { - if (_disposed) return; // Prevent double disposal - - if (disposing) - { - try - { - // Clear static instance reference if this is the current instance - if (instance == this) - { - instance = null; - } - - // Event handlers will be cleaned up by base class - - // Remove button event handlers - if (btnRefreshAugs != null) btnRefreshAugs.Hit -= OnRefreshAugmentations; - if (btnRefreshLum != null) btnRefreshLum.Hit -= OnRefreshLuminance; - if (btnRefreshRecalls != null) btnRefreshRecalls.Hit -= OnRefreshRecalls; - if (btnRefreshCantrips != null) btnRefreshCantrips.Hit -= OnRefreshCantrips; - if (btnRefreshQuests != null) btnRefreshQuests.Hit -= OnRefreshQuests; - - if (data != null) - { - data.Dispose(); - data = null; - } - - // Stop and dispose quest update timer - if (questUpdateTimer != null) - { - questUpdateTimer.Stop(); - questUpdateTimer.Elapsed -= OnQuestTimerUpdate; - questUpdateTimer.Dispose(); - questUpdateTimer = null; - } - - _disposed = true; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error disposing Flag Tracker: {ex.Message}"); - } - } - - base.Dispose(disposing); - } - #endregion - } -} \ No newline at end of file diff --git a/MosswartMassacre/Views/VVSBaseView.cs b/MosswartMassacre/Views/VVSBaseView.cs deleted file mode 100644 index 2f634e1..0000000 --- a/MosswartMassacre/Views/VVSBaseView.cs +++ /dev/null @@ -1,395 +0,0 @@ -using System; -using System.Drawing; -using System.Runtime.InteropServices; -using System.Timers; -using VirindiViewService; -using VirindiViewService.XMLParsers; - -namespace MosswartMassacre.Views -{ - /// - /// Base class for VVS (VirindiViewService) based views. - /// Replaces the wrapper-based BaseView with direct VVS integration. - /// - public class VVSBaseView : IDisposable - { - #region Windows API for boundary checking - [StructLayout(LayoutKind.Sequential)] - public struct RECT - { - public int Left; - public int Top; - public int Right; - public int Bottom; - - public int Width { get { return Right - Left; } } - public int Height { get { return Bottom - Top; } } - } - - [DllImport("user32.dll", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); - #endregion - - #region Core VVS Components - protected HudView view; - protected ViewProperties properties; - protected ControlGroup controls; - protected PluginCore pluginCore; - #endregion - - #region Position Management - private Timer positionSaveTimer; - #endregion - - public VVSBaseView(PluginCore core) - { - pluginCore = core; - InitializePositionTimer(); - } - - #region VVS Initialization - protected void CreateFromXMLResource(string resourcePath, bool doIcon = true, bool doTitle = true) - { - try - { - // Parse XML using VVS Decal3XMLParser - new Decal3XMLParser().ParseFromResource(resourcePath, out properties, out controls); - - // Set window properties - if (doTitle) - { - properties.Title = "Mosswart Massacre v5.0.0.0"; - } - - if (doIcon) - { - // Use default icon for now - can be customized later - properties.Icon = 7735; // Same icon as in XML - } - - // Create the HudView - view = new HudView(properties, controls); - - // Subscribe to essential events - view.VisibleChanged += View_VisibleChanged; - view.Moved += View_Moved; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error creating VVS view from {resourcePath}: {ex.Message}"); - PluginCore.WriteToChat($"Stack trace: {ex.StackTrace}"); - } - } - - protected void CreateFromXMLString(string xmlString, bool doIcon = true, bool doTitle = true) - { - try - { - // Parse XML string using VVS Decal3XMLParser - new Decal3XMLParser().Parse(xmlString, out properties, out controls); - - if (doTitle) - { - properties.Title = "Mosswart Massacre v5.0.0.0"; - } - - if (doIcon) - { - properties.Icon = 7735; - } - - view = new HudView(properties, controls); - view.VisibleChanged += View_VisibleChanged; - view.Moved += View_Moved; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error creating VVS view from XML string: {ex.Message}"); - } - } - #endregion - - #region Control Access - /// - /// Get a control by name with proper type casting. - /// Usage: var button = GetControl<HudButton>("btnExample"); - /// - protected T GetControl(string controlName) where T : class - { - try - { - if (view != null && view[controlName] != null) - { - return view[controlName] as T; - } - return null; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error getting control '{controlName}': {ex.Message}"); - return null; - } - } - - /// - /// Get a control by name (alternative syntax) - /// Usage: var button = (HudButton)GetControl("btnExample"); - /// - protected object GetControl(string controlName) - { - try - { - return view?[controlName]; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error getting control '{controlName}': {ex.Message}"); - return null; - } - } - #endregion - - #region Window Management - protected virtual void SaveWindowPosition() - { - try - { - if (view != null && PluginSettings.Instance != null) - { - PluginSettings.Instance.MainWindowX = view.Location.X; - PluginSettings.Instance.MainWindowY = view.Location.Y; - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error saving window position: {ex.Message}"); - } - } - - protected virtual void RestoreWindowPosition() - { - try - { - if (view != null && PluginSettings.Instance != null) - { - view.Location = new Point( - PluginSettings.Instance.MainWindowX, - PluginSettings.Instance.MainWindowY - ); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error restoring window position: {ex.Message}"); - } - } - - protected void KeepWindowInBounds() - { - try - { - if (view == null) return; - - RECT rect = new RECT(); - IntPtr gameWindowHandle = PluginCore.MyHost?.Decal?.Hwnd ?? IntPtr.Zero; - - if (gameWindowHandle != IntPtr.Zero && GetWindowRect(gameWindowHandle, ref rect)) - { - Point currentLocation = view.Location; - int viewWidth = view.Width; - int viewHeight = view.Height; - - bool needsUpdate = false; - - // Check right boundary - if (currentLocation.X + viewWidth > rect.Width) - { - currentLocation.X = rect.Width - viewWidth; - needsUpdate = true; - } - // Check left boundary - else if (currentLocation.X < 0) - { - currentLocation.X = 20; - needsUpdate = true; - } - - // Check bottom boundary - if (currentLocation.Y + viewHeight > rect.Height) - { - currentLocation.Y = rect.Height - viewHeight; - needsUpdate = true; - } - // Check top boundary - else if (currentLocation.Y < 0) - { - currentLocation.Y = 20; - needsUpdate = true; - } - - if (needsUpdate) - { - view.Location = currentLocation; - } - } - } - catch - { - // Silently ignore boundary check errors - } - } - #endregion - - #region Position Timer Management - private void InitializePositionTimer() - { - positionSaveTimer = new Timer(2000); // 2 second delay after movement stops - positionSaveTimer.Elapsed += (s, e) => { - SaveWindowPosition(); - positionSaveTimer.Stop(); - }; - } - - private void View_Moved(object sender, EventArgs e) - { - try - { - // Reset timer when window moves - if (positionSaveTimer != null) - { - if (positionSaveTimer.Enabled) - positionSaveTimer.Stop(); - - positionSaveTimer.Start(); - } - } - catch - { - // Ignore timer errors - } - } - - protected virtual void View_VisibleChanged(object sender, EventArgs e) - { - try - { - if (view.Visible) - { - KeepWindowInBounds(); - } - } - catch - { - // Ignore visibility change errors - } - } - #endregion - - #region Public Interface - public virtual void Initialize() - { - try - { - RestoreWindowPosition(); - KeepWindowInBounds(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error initializing VVS view: {ex.Message}"); - } - } - - public virtual void Show() - { - if (view != null) - { - view.Visible = true; - } - } - - public virtual void Hide() - { - if (view != null) - { - view.Visible = false; - } - } - - public virtual void Toggle() - { - if (view != null) - { - view.Visible = !view.Visible; - } - } - - public bool IsVisible - { - get { return view?.Visible ?? false; } - } - - public Point Location - { - get { return view?.Location ?? Point.Empty; } - set { if (view != null) view.Location = value; } - } - - public Size Size - { - get { return view != null ? new Size(view.Width, view.Height) : Size.Empty; } - } - #endregion - - #region IDisposable Support - private bool disposedValue = false; - - protected virtual void Dispose(bool disposing) - { - if (!disposedValue) - { - if (disposing) - { - try - { - // Save final position before disposal - SaveWindowPosition(); - - // Clean up timers - if (positionSaveTimer != null) - { - positionSaveTimer.Stop(); - positionSaveTimer.Dispose(); - positionSaveTimer = null; - } - - // Clean up VVS view - if (view != null) - { - view.VisibleChanged -= View_VisibleChanged; - view.Moved -= View_Moved; - view.Dispose(); - view = null; - } - - // Clean up VVS objects - properties = null; - controls = null; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error disposing VVS view: {ex.Message}"); - } - } - disposedValue = true; - } - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - #endregion - } -} \ No newline at end of file diff --git a/MosswartMassacre/Views/VVSTabbedMainView.cs b/MosswartMassacre/Views/VVSTabbedMainView.cs deleted file mode 100644 index bbaf284..0000000 --- a/MosswartMassacre/Views/VVSTabbedMainView.cs +++ /dev/null @@ -1,1051 +0,0 @@ -using System; -using System.Drawing; -using System.Timers; -using VirindiViewService.Controls; - -namespace MosswartMassacre.Views -{ - /// - /// VVS-based tabbed main view - direct VirindiViewService integration. - /// Replaces wrapper-based TabbedMainView with modern VVS controls. - /// - internal class VVSTabbedMainView : VVSBaseView - { - private static VVSTabbedMainView instance; - - #region Main Tab Controls - private HudStaticText lblTotalKills; - private HudStaticText lblKillsPer5Min; - private HudStaticText lblKillsPerHour; - private HudStaticText lblElapsedTime; - private HudStaticText lblRareCount; - private HudStaticText lblAutoLootRare; - private HudStaticText lblStatus; - private HudStaticText lblWebSocketStatus; - private HudButton btnCheckUpdate; - private HudButton btnInstallUpdate; - private HudStaticText lblUpdateStatus; - #endregion - - #region Settings Tab Controls - private HudCheckBox chkRareMetaEnabled; - private HudCheckBox chkRemoteCommandsEnabled; - private HudCheckBox chkHttpServerEnabled; - private HudCheckBox chkWebSocketEnabled; - private HudCheckBox chkTelemetryEnabled; - private HudTextBox txtCharTag; - private HudTextBox txtVTankPath; - #endregion - - #region Statistics Tab Controls - private HudStaticText lblDetailedKillsValue; - private HudStaticText lblBestHourValue; - private HudStaticText lblAverageKillsValue; - private HudStaticText lblRareStatsValue; - private HudStaticText lblRareRateValue; - private HudStaticText lblSessionTimeValue; - private HudStaticText lblLastKillValue; - private HudButton btnResetStats; - #endregion - - #region Navigation Tab Controls (Basic) - private HudCheckBox chkNavVisualizationEnabled; - private HudCombo cmbNavFiles; - private HudButton btnRefreshNavFiles; - private HudStaticText lblNavStatus; - private HudButton btnLoadRoute; - private HudButton btnClearRoute; - #endregion - - #region Flag Tracker Tab Controls - private HudButton btnOpenFlagTracker; - // lblFlagTrackerStatus removed - not present in XML - #endregion - - #region Statistics Tracking - private double bestHourlyKills = 0; - private DateTime sessionStartTime; - #endregion - - public VVSTabbedMainView(PluginCore core) : base(core) - { - instance = this; - sessionStartTime = DateTime.Now; - } - - #region Static Interface Methods - public static void ViewInit() - { - try - { - // Check if VVS is available - try - { - var testParser = new VirindiViewService.XMLParsers.Decal3XMLParser(); - } - catch (Exception vvsEx) - { - PluginCore.WriteToChat("[ERROR] VVS not available: " + vvsEx.Message); - return; - } - - if (instance == null) - { - instance = new VVSTabbedMainView(null); - } - - instance.InitializeView(); - } - catch (Exception ex) - { - PluginCore.WriteToChat("Error initializing VVS tabbed view: " + ex.Message); - PluginCore.WriteToChat("Stack trace: " + ex.StackTrace); - } - } - - public static void ViewDestroy() - { - try - { - if (instance != null) - { - instance.Dispose(); - instance = null; - } - } - catch (Exception ex) - { - PluginCore.WriteToChat("Error destroying VVS tabbed view: " + ex.Message); - } - } - #endregion - - #region Initialization - private void InitializeView() - { - try - { - // Create view from working original XML layout - CreateFromXMLResource("MosswartMassacre.ViewXML.mainViewTabbed.xml"); - - if (view == null) - { - PluginCore.WriteToChat("[ERROR] View creation failed - view is null!"); - return; - } - - // Initialize all tab controls - InitializeMainTabControls(); - InitializeSettingsTabControls(); - InitializeStatisticsTabControls(); - InitializeNavigationTabControls(); - InitializeFlagTrackerTabControls(); - - // Initialize the base view and set initial position - Initialize(); - - // Make the view visible and show in plugin bar - if (view != null) - { - view.Visible = true; - view.ShowInBar = true; - PluginCore.WriteToChat("GUI initialized successfully!"); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat("Error in VVS InitializeView: " + ex.Message); - PluginCore.WriteToChat("Stack trace: " + ex.StackTrace); - } - } - - private void InitializeMainTabControls() - { - try - { - // Main tab - existing functionality using VVS controls - lblTotalKills = GetControl("lblTotalKills"); - lblKillsPer5Min = GetControl("lblKillsPer5Min"); - lblKillsPerHour = GetControl("lblKillsPerHour"); - lblElapsedTime = GetControl("lblElapsedTime"); - lblRareCount = GetControl("lblRareCount"); - lblAutoLootRare = GetControl("lblAutoLootRare"); - lblStatus = GetControl("lblStatus"); - lblWebSocketStatus = GetControl("lblWebSocketStatus"); - btnCheckUpdate = GetControl("btnCheckUpdate"); - btnInstallUpdate = GetControl("btnInstallUpdate"); - lblUpdateStatus = GetControl("lblUpdateStatus"); - - // Hook up update button events - if (btnCheckUpdate != null) - btnCheckUpdate.Hit += OnCheckUpdateClicked; - if (btnInstallUpdate != null) - btnInstallUpdate.Hit += OnInstallUpdateClicked; - - // Update status displays immediately - UpdateStatus(); - UpdateAutoLootRareIndicator(); - UpdateWebSocketStatus(); - RefreshUpdateStatus(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error initializing main tab controls: {ex.Message}"); - } - } - - private void InitializeSettingsTabControls() - { - try - { - // Settings tab controls - chkRareMetaEnabled = GetControl("chkRareMetaEnabled"); - chkRemoteCommandsEnabled = GetControl("chkRemoteCommandsEnabled"); - chkHttpServerEnabled = GetControl("chkHttpServerEnabled"); - chkWebSocketEnabled = GetControl("chkWebSocketEnabled"); - chkTelemetryEnabled = GetControl("chkTelemetryEnabled"); - txtCharTag = GetControl("txtCharTag"); - txtVTankPath = GetControl("txtVTankPath"); - - // Hook up settings events - if (chkRareMetaEnabled != null) - chkRareMetaEnabled.Change += OnRareMetaSettingChanged; - if (chkRemoteCommandsEnabled != null) - chkRemoteCommandsEnabled.Change += OnRemoteCommandsSettingChanged; - if (chkHttpServerEnabled != null) - chkHttpServerEnabled.Change += OnHttpServerSettingChanged; - if (chkWebSocketEnabled != null) - chkWebSocketEnabled.Change += OnWebSocketSettingChanged; - if (chkTelemetryEnabled != null) - chkTelemetryEnabled.Change += OnTelemetrySettingChanged; - if (txtCharTag != null) - txtCharTag.Change += OnCharTagChanged; - if (txtVTankPath != null) - txtVTankPath.Change += OnVTankPathChanged; - - // Load current settings - LoadCurrentSettings(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error initializing settings tab controls: {ex.Message}"); - } - } - - private void InitializeStatisticsTabControls() - { - try - { - // Statistics tab controls - lblDetailedKillsValue = GetControl("lblDetailedKillsValue"); - lblBestHourValue = GetControl("lblBestHourValue"); - lblAverageKillsValue = GetControl("lblAverageKillsValue"); - lblRareStatsValue = GetControl("lblRareStatsValue"); - lblRareRateValue = GetControl("lblRareRateValue"); - lblSessionTimeValue = GetControl("lblSessionTimeValue"); - lblLastKillValue = GetControl("lblLastKillValue"); - btnResetStats = GetControl("btnResetStats"); - - // Hook up statistics events - if (btnResetStats != null) - btnResetStats.Hit += OnResetStatsClick; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error initializing statistics controls: {ex.Message}"); - } - } - - private void InitializeNavigationTabControls() - { - try - { - // Basic navigation tab controls - chkNavVisualizationEnabled = GetControl("chkNavVisualizationEnabled"); - cmbNavFiles = GetControl("cmbNavFiles"); - btnRefreshNavFiles = GetControl("btnRefreshNavFiles"); - lblNavStatus = GetControl("lblNavStatus"); - btnLoadRoute = GetControl("btnLoadRoute"); - btnClearRoute = GetControl("btnClearRoute"); - - // Hook up basic navigation events - if (chkNavVisualizationEnabled != null) - chkNavVisualizationEnabled.Change += OnNavVisualizationEnabledChanged; - if (btnRefreshNavFiles != null) - btnRefreshNavFiles.Hit += OnRefreshNavFilesClick; - if (btnLoadRoute != null) - btnLoadRoute.Hit += OnLoadRouteClick; - if (btnClearRoute != null) - btnClearRoute.Hit += OnClearRouteClick; - - // Initialize navigation system - InitializeNavigationSystem(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error initializing navigation controls: {ex.Message}"); - } - } - - private void InitializeFlagTrackerTabControls() - { - try - { - // Flag Tracker tab controls - btnOpenFlagTracker = GetControl("btnOpenFlagTracker"); - - // Hook up Flag Tracker events - if (btnOpenFlagTracker != null) - btnOpenFlagTracker.Hit += OnOpenFlagTrackerClick; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error initializing flag tracker controls: {ex.Message}"); - } - } - #endregion - - #region Event Handlers - Settings Tab - private void OnRareMetaSettingChanged(object sender, EventArgs e) - { - try - { - PluginSettings.Instance.RareMetaEnabled = chkRareMetaEnabled.Checked; - PluginCore.RareMetaEnabled = chkRareMetaEnabled.Checked; - UpdateAutoLootRareIndicator(); - PluginCore.WriteToChat($"Rare meta automation {(chkRareMetaEnabled.Checked ? "ENABLED" : "DISABLED")}."); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in rare meta setting change: {ex.Message}"); - } - } - - private void OnRemoteCommandsSettingChanged(object sender, EventArgs e) - { - try - { - PluginSettings.Instance.RemoteCommandsEnabled = chkRemoteCommandsEnabled.Checked; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in remote commands setting change: {ex.Message}"); - } - } - - private void OnHttpServerSettingChanged(object sender, EventArgs e) - { - try - { - PluginSettings.Instance.HttpServerEnabled = chkHttpServerEnabled.Checked; - if (chkHttpServerEnabled.Checked) - HttpCommandServer.Start(); - else - HttpCommandServer.Stop(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in HTTP server setting change: {ex.Message}"); - } - } - - private void OnWebSocketSettingChanged(object sender, EventArgs e) - { - try - { - PluginSettings.Instance.WebSocketEnabled = chkWebSocketEnabled.Checked; - PluginCore.WebSocketEnabled = chkWebSocketEnabled.Checked; - if (chkWebSocketEnabled.Checked) - { - WebSocket.Start(); - PluginCore.WriteToChat("WebSocket streaming ENABLED."); - } - else - { - WebSocket.Stop(); - PluginCore.WriteToChat("WebSocket streaming DISABLED."); - } - UpdateWebSocketStatus(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in WebSocket setting change: {ex.Message}"); - } - } - - private void OnTelemetrySettingChanged(object sender, EventArgs e) - { - try - { - PluginSettings.Instance.TelemetryEnabled = chkTelemetryEnabled.Checked; - if (chkTelemetryEnabled.Checked) - Telemetry.Start(); - else - Telemetry.Stop(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in telemetry setting change: {ex.Message}"); - } - } - - private void OnCharTagChanged(object sender, EventArgs e) - { - try - { - PluginSettings.Instance.CharTag = txtCharTag.Text; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in char tag change: {ex.Message}"); - } - } - - private void OnVTankPathChanged(object sender, EventArgs e) - { - try - { - PluginSettings.Instance.VTankProfilesPath = txtVTankPath.Text; - // Refresh navigation system with new path - if (PluginCore.navVisualization != null) - { - PluginCore.navVisualization.RefreshNavFileList(); - RefreshNavFileList(); - UpdateNavigationStatus(); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in VTank path change: {ex.Message}"); - } - } - - private void OnCheckUpdateClicked(object sender, EventArgs e) - { - try - { - // Run update check asynchronously - System.Threading.Tasks.Task.Run(async () => - { - await UpdateManager.CheckForUpdateAsync(); - // Update UI (VVS controls are thread-safe for simple property updates) - try - { - RefreshUpdateStatus(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error updating UI after check: {ex.Message}"); - } - }); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error checking for updates: {ex.Message}"); - } - } - - private void OnInstallUpdateClicked(object sender, EventArgs e) - { - try - { - // Check if update check was performed first - if (UpdateManager.LastCheckTime == DateTime.MinValue) - { - PluginCore.WriteToChat("[Update] Check for updates first"); - return; - } - - if (!UpdateManager.IsUpdateAvailable) - { - PluginCore.WriteToChat("[Update] No update available"); - return; - } - - // Run update installation asynchronously - System.Threading.Tasks.Task.Run(async () => - { - await UpdateManager.DownloadAndInstallUpdateAsync(); - // Update UI (VVS controls are thread-safe for simple property updates) - try - { - RefreshUpdateStatus(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error updating UI after install: {ex.Message}"); - } - }); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error installing update: {ex.Message}"); - } - } - - public static void RefreshUpdateStatus() - { - try - { - if (instance?.lblUpdateStatus != null) - { - if (UpdateManager.LastCheckTime == DateTime.MinValue) - { - // Not checked yet - instance.lblUpdateStatus.Text = ""; - } - else if (UpdateManager.IsUpdateAvailable) - { - // Update available - instance.lblUpdateStatus.Text = "Update available"; - } - else - { - // Up to date - instance.lblUpdateStatus.Text = "Up to date"; - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing update status: {ex.Message}"); - } - } - - public void RefreshUpdateStatusInstance() - { - RefreshUpdateStatus(); - } - - public static void DebugUpdateControls() - { - try - { - PluginCore.WriteToChat("=== Update UI Debug (Main Tab) ==="); - PluginCore.WriteToChat($"Instance exists: {instance != null}"); - if (instance != null) - { - PluginCore.WriteToChat($"btnCheckUpdate: {instance.btnCheckUpdate != null}"); - PluginCore.WriteToChat($"btnInstallUpdate: {instance.btnInstallUpdate != null}"); - PluginCore.WriteToChat($"lblUpdateStatus: {instance.lblUpdateStatus != null}"); - - if (instance.lblUpdateStatus != null) - { - PluginCore.WriteToChat($"Current status text: '{instance.lblUpdateStatus.Text}'"); - } - - PluginCore.WriteToChat($"UpdateManager.LastCheckTime: {UpdateManager.LastCheckTime}"); - PluginCore.WriteToChat($"UpdateManager.IsUpdateAvailable: {UpdateManager.IsUpdateAvailable}"); - - // Try to force refresh - RefreshUpdateStatus(); - PluginCore.WriteToChat("Forced refresh completed"); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Debug error: {ex.Message}"); - } - } - - private void LoadCurrentSettings() - { - try - { - if (PluginSettings.Instance != null) - { - if (chkRareMetaEnabled != null) - chkRareMetaEnabled.Checked = PluginSettings.Instance.RareMetaEnabled; - if (chkRemoteCommandsEnabled != null) - chkRemoteCommandsEnabled.Checked = PluginSettings.Instance.RemoteCommandsEnabled; - if (chkHttpServerEnabled != null) - chkHttpServerEnabled.Checked = PluginSettings.Instance.HttpServerEnabled; - if (chkWebSocketEnabled != null) - chkWebSocketEnabled.Checked = PluginSettings.Instance.WebSocketEnabled; - if (chkTelemetryEnabled != null) - chkTelemetryEnabled.Checked = PluginSettings.Instance.TelemetryEnabled; - if (txtCharTag != null) - txtCharTag.Text = PluginSettings.Instance.CharTag ?? "default"; - if (txtVTankPath != null) - txtVTankPath.Text = PluginSettings.Instance.VTankProfilesPath ?? ""; - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error loading settings: {ex.Message}"); - } - } - #endregion - - #region Event Handlers - Statistics Tab - private void OnResetStatsClick(object sender, EventArgs e) - { - try - { - PluginCore.RestartStats(); - sessionStartTime = DateTime.Now; - bestHourlyKills = 0; - UpdateStatistics(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error resetting stats: {ex.Message}"); - } - } - #endregion - - #region Event Handlers - Flag Tracker Tab - private void OnOpenFlagTrackerClick(object sender, EventArgs e) - { - try - { - // Open the Flag Tracker window - FlagTrackerView.OpenFlagTracker(); - PluginCore.WriteToChat("Flag Tracker window opened"); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error opening Flag Tracker: {ex.Message}"); - } - } - #endregion - - #region Event Handlers - Navigation Tab - private void OnNavVisualizationEnabledChanged(object sender, EventArgs e) - { - try - { - if (PluginCore.navVisualization != null) - { - PluginCore.navVisualization.SetEnabled(chkNavVisualizationEnabled.Checked); - UpdateNavigationStatus(); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in nav visualization change: {ex.Message}"); - } - } - - private void OnRefreshNavFilesClick(object sender, EventArgs e) - { - try - { - RefreshNavFileList(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing nav files: {ex.Message}"); - } - } - - private void OnLoadRouteClick(object sender, EventArgs e) - { - try - { - // Load from dropdown selection - string routeName = null; - - if (cmbNavFiles != null && cmbNavFiles.Current >= 0 && cmbNavFiles.Count > 0 && - cmbNavFiles.Current < cmbNavFiles.Count) - { - routeName = ((HudStaticText)cmbNavFiles[cmbNavFiles.Current]).Text; - } - - if (!string.IsNullOrEmpty(routeName) && routeName != "None") - { - PluginCore.navVisualization.LoadRoute(routeName); - UpdateNavigationStatus(); - } - else - { - PluginCore.WriteToChat("[NavViz] Please select a route from the dropdown"); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[NavViz] Error loading route: {ex.Message}"); - } - } - - private void OnClearRouteClick(object sender, EventArgs e) - { - try - { - if (PluginCore.navVisualization != null) - { - PluginCore.navVisualization.LoadRoute("None"); - // Clear dropdown selection - if (cmbNavFiles != null && cmbNavFiles.Count > 0) - { - cmbNavFiles.Current = 0; // Select "None" which should be at index 0 - } - UpdateNavigationStatus(); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error clearing route: {ex.Message}"); - } - } - - private void InitializeNavigationSystem() - { - try - { - RefreshNavFileList(); - UpdateNavigationStatus(); - - // Subscribe to route changes - if (PluginCore.navVisualization != null) - { - PluginCore.navVisualization.RouteChanged += (s, e) => UpdateNavigationStatus(); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error initializing navigation system: {ex.Message}"); - } - } - - private void RefreshNavFileList() - { - try - { - if (PluginCore.navVisualization != null) - { - PluginCore.navVisualization.RefreshNavFileList(); - - // Update the basic dropdown - PopulateNavFileDropdown(); - - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing nav file list: {ex.Message}"); - } - } - - private void UpdateNavigationStatus() - { - try - { - if (lblNavStatus != null && PluginCore.navVisualization != null) - { - lblNavStatus.Text = $"Status: {PluginCore.navVisualization.GetStatus()}"; - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error updating navigation status: {ex.Message}"); - } - } - #endregion - - #region Public Update Methods (maintain compatibility with existing code) - public static void UpdateKillStats(int totalKills, double killsPer5Min, double killsPerHour) - { - try - { - if (instance == null) return; - - if (instance.lblTotalKills != null) - instance.lblTotalKills.Text = $"Total Kills: {totalKills}"; - if (instance.lblKillsPer5Min != null) - instance.lblKillsPer5Min.Text = $"Kills per 5 Min: {killsPer5Min:F2}"; - if (instance.lblKillsPerHour != null) - instance.lblKillsPerHour.Text = $"Kills per Hour: {killsPerHour:F2}"; - - // Update detailed statistics - if (instance.lblDetailedKillsValue != null) - instance.lblDetailedKillsValue.Text = totalKills.ToString(); - if (instance.lblAverageKillsValue != null) - instance.lblAverageKillsValue.Text = $"{killsPerHour:F2} kills/hr"; - - // Track best hourly performance - if (killsPerHour > instance.bestHourlyKills) - { - instance.bestHourlyKills = killsPerHour; - if (instance.lblBestHourValue != null) - instance.lblBestHourValue.Text = $"{instance.bestHourlyKills:F2} kills/hr"; - } - - // Update status displays - instance.UpdateStatus(); - instance.UpdateAutoLootRareIndicator(); - instance.UpdateWebSocketStatus(); - instance.UpdateStatistics(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in UpdateKillStats: {ex.Message}"); - } - } - - public static void UpdateElapsedTime(TimeSpan elapsed) - { - try - { - if (instance?.lblElapsedTime != null) - { - int days = elapsed.Days; - int hours = elapsed.Hours; - int minutes = elapsed.Minutes; - int seconds = elapsed.Seconds; - - if (days > 0) - instance.lblElapsedTime.Text = $"Time: {days}d {hours:D2}:{minutes:D2}:{seconds:D2}"; - else - instance.lblElapsedTime.Text = $"Time: {hours:D2}:{minutes:D2}:{seconds:D2}"; - } - - if (instance?.lblSessionTimeValue != null && instance?.lblElapsedTime != null) - { - instance.lblSessionTimeValue.Text = instance.lblElapsedTime.Text.Replace("Time: ", ""); - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in UpdateElapsedTime: {ex.Message}"); - } - } - - public static void UpdateRareCount(int rareCount) - { - try - { - if (instance?.lblRareCount != null) - instance.lblRareCount.Text = $"Rare Count: {rareCount}"; - if (instance?.lblRareStatsValue != null) - instance.lblRareStatsValue.Text = rareCount.ToString(); - - // Calculate rare drop rate - int totalKills = PluginCore.totalKills; - if (totalKills > 0 && instance?.lblRareRateValue != null) - { - double rareRate = (double)rareCount / totalKills * 100; - instance.lblRareRateValue.Text = $"{rareRate:F2}%"; - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in UpdateRareCount: {ex.Message}"); - } - } - - public static void SetRareMetaToggleState(bool enabled) - { - try - { - if (instance?.chkRareMetaEnabled != null) - instance.chkRareMetaEnabled.Checked = enabled; - instance?.UpdateAutoLootRareIndicator(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error setting rare meta toggle state: {ex.Message}"); - } - } - - public static void RefreshSettingsFromConfig() - { - try - { - instance?.LoadCurrentSettings(); - instance?.UpdateAutoLootRareIndicator(); - instance?.UpdateWebSocketStatus(); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error refreshing settings from config: {ex.Message}"); - } - } - #endregion - - #region Status Update Methods - private void UpdateStatus() - { - try - { - if (lblStatus != null) - { - string metaState = VtankControl.VtGetMetaState(); - lblStatus.Text = $"Meta State: {metaState}"; - } - } - catch - { - if (lblStatus != null) - lblStatus.Text = "Meta State: Unknown"; - } - } - - private void UpdateAutoLootRareIndicator() - { - try - { - if (lblAutoLootRare != null) - { - bool isEnabled = PluginSettings.Instance?.RareMetaEnabled == true; - if (isEnabled) - { - lblAutoLootRare.Text = "Auto Loot Rare: [ON]"; - // Try to set green color for ON status - try { lblAutoLootRare.TextColor = System.Drawing.Color.FromArgb(0, 128, 0); } catch { } - } - else - { - lblAutoLootRare.Text = "Auto Loot Rare: [OFF]"; - // Try to set red color for OFF status - try { lblAutoLootRare.TextColor = System.Drawing.Color.FromArgb(255, 0, 0); } catch { } - } - } - } - catch - { - if (lblAutoLootRare != null) - lblAutoLootRare.Text = "Auto Loot Rare: Unknown"; - } - } - - private void UpdateWebSocketStatus() - { - try - { - if (lblWebSocketStatus != null) - { - bool isConnected = PluginSettings.Instance?.WebSocketEnabled == true; - if (isConnected) - { - lblWebSocketStatus.Text = "WebSocket: [CONNECTED]"; - // Try to set green color for CONNECTED status - try { lblWebSocketStatus.TextColor = System.Drawing.Color.FromArgb(0, 128, 0); } catch { } - } - else - { - lblWebSocketStatus.Text = "WebSocket: [DISCONNECTED]"; - // Try to set red color for DISCONNECTED status - try { lblWebSocketStatus.TextColor = System.Drawing.Color.FromArgb(255, 0, 0); } catch { } - } - } - } - catch - { - if (lblWebSocketStatus != null) - lblWebSocketStatus.Text = "WebSocket: Unknown"; - } - } - - private void UpdateStatistics() - { - try - { - // Update last kill time - if (lblLastKillValue != null) - { - if (PluginCore.lastKillTime != DateTime.MinValue) - { - TimeSpan timeSinceLastKill = DateTime.Now - PluginCore.lastKillTime; - if (timeSinceLastKill.TotalMinutes < 60) - lblLastKillValue.Text = $"{timeSinceLastKill.TotalMinutes:F0} min ago"; - else - lblLastKillValue.Text = $"{timeSinceLastKill.TotalHours:F1} hr ago"; - } - else - { - lblLastKillValue.Text = "Never"; - } - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error in UpdateStatistics: {ex.Message}"); - } - } - #endregion - - #region Helper Methods - private void PopulateNavFileDropdown() - { - try - { - if (cmbNavFiles != null && PluginCore.navVisualization != null) - { - cmbNavFiles.Clear(); - cmbNavFiles.AddItem("None", "None"); - - foreach (string navFile in PluginCore.navVisualization.AvailableNavFiles) - { - cmbNavFiles.AddItem(navFile, navFile); - } - - if (cmbNavFiles.Count > 0) - cmbNavFiles.Current = 0; // Select "None" which should be at index 0 - - } - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error populating nav file dropdown: {ex.Message}"); - } - } - #endregion - - #region IDisposable Override - protected override void Dispose(bool disposing) - { - if (disposing) - { - try - { - // Unsubscribe from events to prevent memory leaks - - // Settings tab event cleanup - if (chkRareMetaEnabled != null) - chkRareMetaEnabled.Change -= OnRareMetaSettingChanged; - if (chkRemoteCommandsEnabled != null) - chkRemoteCommandsEnabled.Change -= OnRemoteCommandsSettingChanged; - if (chkHttpServerEnabled != null) - chkHttpServerEnabled.Change -= OnHttpServerSettingChanged; - if (chkWebSocketEnabled != null) - chkWebSocketEnabled.Change -= OnWebSocketSettingChanged; - if (chkTelemetryEnabled != null) - chkTelemetryEnabled.Change -= OnTelemetrySettingChanged; - if (txtCharTag != null) - txtCharTag.Change -= OnCharTagChanged; - if (txtVTankPath != null) - txtVTankPath.Change -= OnVTankPathChanged; - if (btnCheckUpdate != null) - btnCheckUpdate.Hit -= OnCheckUpdateClicked; - if (btnInstallUpdate != null) - btnInstallUpdate.Hit -= OnInstallUpdateClicked; - - // Statistics tab event cleanup - if (btnResetStats != null) - btnResetStats.Hit -= OnResetStatsClick; - - // Navigation tab event cleanup - if (chkNavVisualizationEnabled != null) - chkNavVisualizationEnabled.Change -= OnNavVisualizationEnabledChanged; - if (btnRefreshNavFiles != null) - btnRefreshNavFiles.Hit -= OnRefreshNavFilesClick; - if (btnLoadRoute != null) - btnLoadRoute.Hit -= OnLoadRouteClick; - if (btnClearRoute != null) - btnClearRoute.Hit -= OnClearRouteClick; - - // No enhanced events to clean up - } - catch (Exception ex) - { - PluginCore.WriteToChat($"Error cleaning up VVS view events: {ex.Message}"); - } - } - - // Call base dispose - base.Dispose(disposing); - } - #endregion - } -} \ No newline at end of file diff --git a/MosswartMassacre/VirindiViews/ViewSystemSelector.cs b/MosswartMassacre/VirindiViews/ViewSystemSelector.cs new file mode 100644 index 0000000..5e75b7a --- /dev/null +++ b/MosswartMassacre/VirindiViews/ViewSystemSelector.cs @@ -0,0 +1,262 @@ +/////////////////////////////////////////////////////////////////////////////// +//File: ViewSystemSelector.cs +// +//Description: Contains the MyClasses.MetaViewWrappers.ViewSystemSelector class, +// which is used to determine whether the Virindi View Service is enabled. +// As with all the VVS wrappers, the VVS_REFERENCED compilation symbol must be +// defined for the VVS code to be compiled. Otherwise, only Decal views are used. +// +//References required: +// VirindiViewService (if VVS_REFERENCED is defined) +// Decal.Adapter +// Decal.Interop.Core +// +//This file is Copyright (c) 2009 VirindiPlugins +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Text; +using System.Reflection; + +#if METAVIEW_PUBLIC_NS +namespace MetaViewWrappers +#else +namespace MyClasses.MetaViewWrappers +#endif +{ + internal static class ViewSystemSelector + { + public enum eViewSystem + { + DecalInject, + VirindiViewService, + } + + + ///////////////////////////////System presence detection/////////////////////////////// + + public static bool IsPresent(Decal.Adapter.Wrappers.PluginHost pHost, eViewSystem VSystem) + { + switch (VSystem) + { + case eViewSystem.DecalInject: + return true; + case eViewSystem.VirindiViewService: + return VirindiViewsPresent(pHost); + default: + return false; + } + } + static bool VirindiViewsPresent(Decal.Adapter.Wrappers.PluginHost pHost) + { +#if VVS_REFERENCED + System.Reflection.Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); + + foreach (System.Reflection.Assembly a in asms) + { + AssemblyName nmm = a.GetName(); + if ((nmm.Name == "VirindiViewService") && (nmm.Version >= new System.Version("1.0.0.37"))) + { + try + { + return Curtain_VVS_Running(); + } + catch + { + return false; + } + } + } + + return false; +#else + return false; +#endif + } + public static bool VirindiViewsPresent(Decal.Adapter.Wrappers.PluginHost pHost, Version minver) + { +#if VVS_REFERENCED + System.Reflection.Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); + + foreach (System.Reflection.Assembly a in asms) + { + AssemblyName nm = a.GetName(); + if ((nm.Name == "VirindiViewService") && (nm.Version >= minver)) + { + try + { + return Curtain_VVS_Running(); + } + catch + { + return false; + } + } + } + + return false; +#else + return false; +#endif + } + +#if VVS_REFERENCED + static bool Curtain_VVS_Running() + { + return VirindiViewService.Service.Running; + } +#endif + + ///////////////////////////////CreateViewResource/////////////////////////////// + + public static IView CreateViewResource(Decal.Adapter.Wrappers.PluginHost pHost, string pXMLResource) + { +#if VVS_REFERENCED + if (IsPresent(pHost, eViewSystem.VirindiViewService)) + return CreateViewResource(pHost, pXMLResource, eViewSystem.VirindiViewService); + else +#endif + return CreateViewResource(pHost, pXMLResource, eViewSystem.DecalInject); + } + public static IView CreateViewResource(Decal.Adapter.Wrappers.PluginHost pHost, string pXMLResource, eViewSystem VSystem) + { + if (!IsPresent(pHost, VSystem)) return null; + switch (VSystem) + { + case eViewSystem.DecalInject: + return CreateDecalViewResource(pHost, pXMLResource); + case eViewSystem.VirindiViewService: +#if VVS_REFERENCED + return CreateMyHudViewResource(pHost, pXMLResource); +#else + break; +#endif + } + return null; + } + static IView CreateDecalViewResource(Decal.Adapter.Wrappers.PluginHost pHost, string pXMLResource) + { + IView ret = new DecalControls.View(); + ret.Initialize(pHost, pXMLResource); + return ret; + } + +#if VVS_REFERENCED + static IView CreateMyHudViewResource(Decal.Adapter.Wrappers.PluginHost pHost, string pXMLResource) + { + IView ret = new VirindiViewServiceHudControls.View(); + ret.Initialize(pHost, pXMLResource); + return ret; + } +#endif + + + ///////////////////////////////CreateViewXML/////////////////////////////// + + public static IView CreateViewXML(Decal.Adapter.Wrappers.PluginHost pHost, string pXML) + { +#if VVS_REFERENCED + if (IsPresent(pHost, eViewSystem.VirindiViewService)) + return CreateViewXML(pHost, pXML, eViewSystem.VirindiViewService); + else +#endif + return CreateViewXML(pHost, pXML, eViewSystem.DecalInject); + } + + public static IView CreateViewXML(Decal.Adapter.Wrappers.PluginHost pHost, string pXML, eViewSystem VSystem) + { + if (!IsPresent(pHost, VSystem)) return null; + switch (VSystem) + { + case eViewSystem.DecalInject: + return CreateDecalViewXML(pHost, pXML); + case eViewSystem.VirindiViewService: +#if VVS_REFERENCED + return CreateMyHudViewXML(pHost, pXML); +#else + break; +#endif + } + return null; + } + static IView CreateDecalViewXML(Decal.Adapter.Wrappers.PluginHost pHost, string pXML) + { + IView ret = new DecalControls.View(); + ret.InitializeRawXML(pHost, pXML); + return ret; + } + +#if VVS_REFERENCED + static IView CreateMyHudViewXML(Decal.Adapter.Wrappers.PluginHost pHost, string pXML) + { + IView ret = new VirindiViewServiceHudControls.View(); + ret.InitializeRawXML(pHost, pXML); + return ret; + } +#endif + + + ///////////////////////////////HasChatOpen/////////////////////////////// + + public static bool AnySystemHasChatOpen(Decal.Adapter.Wrappers.PluginHost pHost) + { + if (IsPresent(pHost, eViewSystem.VirindiViewService)) + if (HasChatOpen_VirindiViews()) return true; + if (pHost.Actions.ChatState) return true; + return false; + } + + static bool HasChatOpen_VirindiViews() + { +#if VVS_REFERENCED + if (VirindiViewService.HudView.FocusControl != null) + { + if (VirindiViewService.HudView.FocusControl.GetType() == typeof(VirindiViewService.Controls.HudTextBox)) + return true; + } + return false; +#else + return false; +#endif + } + + public delegate void delConditionalSplit(object data); + public static void ViewConditionalSplit(IView v, delConditionalSplit onDecal, delConditionalSplit onVVS, object data) + { + Type vtype = v.GetType(); + +#if VVS_REFERENCED + if (vtype == typeof(VirindiViewServiceHudControls.View)) + { + if (onVVS != null) + onVVS(data); + } +#endif + + if (vtype == typeof(DecalControls.View)) + { + if (onDecal != null) + onDecal(data); + } + } + } +} diff --git a/MosswartMassacre/VirindiViews/Wrapper.cs b/MosswartMassacre/VirindiViews/Wrapper.cs new file mode 100644 index 0000000..7cca722 --- /dev/null +++ b/MosswartMassacre/VirindiViews/Wrapper.cs @@ -0,0 +1,427 @@ +/////////////////////////////////////////////////////////////////////////////// +//File: Wrapper.cs +// +//Description: Contains the interface definitions for the MetaViewWrappers classes. +// +//References required: +// System.Drawing +// +//This file is Copyright (c) 2010 VirindiPlugins +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Text; + +#if METAVIEW_PUBLIC_NS +namespace MetaViewWrappers +#else +namespace MyClasses.MetaViewWrappers +#endif +{ +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + delegate void dClickedList(object sender, int row, int col); + + + #region EventArgs Classes + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVControlEventArgs : EventArgs + { + private int id; + + internal MVControlEventArgs(int ID) + { + this.id = ID; + } + + public int Id + { + get { return this.id; } + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVIndexChangeEventArgs : MVControlEventArgs + { + private int index; + + internal MVIndexChangeEventArgs(int ID, int Index) + : base(ID) + { + this.index = Index; + } + + public int Index + { + get { return this.index; } + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVListSelectEventArgs : MVControlEventArgs + { + private int row; + private int col; + + internal MVListSelectEventArgs(int ID, int Row, int Column) + : base(ID) + { + this.row = Row; + this.col = Column; + } + + public int Row + { + get { return this.row; } + } + + public int Column + { + get { return this.col; } + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVCheckBoxChangeEventArgs : MVControlEventArgs + { + private bool check; + + internal MVCheckBoxChangeEventArgs(int ID, bool Check) + : base(ID) + { + this.check = Check; + } + + public bool Checked + { + get { return this.check; } + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVTextBoxChangeEventArgs : MVControlEventArgs + { + private string text; + + internal MVTextBoxChangeEventArgs(int ID, string text) + : base(ID) + { + this.text = text; + } + + public string Text + { + get { return this.text; } + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVTextBoxEndEventArgs : MVControlEventArgs + { + private bool success; + + internal MVTextBoxEndEventArgs(int ID, bool success) + : base(ID) + { + this.success = success; + } + + public bool Success + { + get { return this.success; } + } + } + + #endregion EventArgs Classes + + + #region View + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IView: IDisposable + { + void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML); + void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML); + void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey); + void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey); + + void SetIcon(int icon, int iconlibrary); + void SetIcon(int portalicon); + + string Title { get; set; } + bool Visible { get; set; } +#if !VVS_WRAPPERS_PUBLIC + ViewSystemSelector.eViewSystem ViewType { get; } +#endif + + System.Drawing.Point Location { get; set; } + System.Drawing.Rectangle Position { get; set; } + System.Drawing.Size Size { get; } + + IControl this[string id] { get; } + + void Activate(); + void Deactivate(); + bool Activated { get; set; } + } + + #endregion View + + #region Controls + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IControl : IDisposable + { + string Name { get; } + bool Visible { get; set; } + string TooltipText { get; set;} + int Id { get; } + System.Drawing.Rectangle LayoutPosition { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IButton : IControl + { + string Text { get; set; } + event EventHandler Hit; + event EventHandler Click; + System.Drawing.Color TextColor { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface ICheckBox : IControl + { + string Text { get; set; } + bool Checked { get; set; } + event EventHandler Change; + event EventHandler Change_Old; + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface ITextBox : IControl + { + string Text { get; set; } + event EventHandler Change; + event EventHandler Change_Old; + event EventHandler End; + int Caret { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface ICombo : IControl + { + IComboIndexer Text { get; } + IComboDataIndexer Data { get; } + int Count { get; } + int Selected { get; set; } + event EventHandler Change; + event EventHandler Change_Old; + void Add(string text); + void Add(string text, object obj); + void Insert(int index, string text); + void RemoveAt(int index); + void Remove(int index); + void Clear(); + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IComboIndexer + { + string this[int index] { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IComboDataIndexer + { + object this[int index] { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface ISlider : IControl + { + int Position { get; set; } + event EventHandler Change; + event EventHandler Change_Old; + int Maximum { get; set; } + int Minimum { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IList : IControl + { + event EventHandler Selected; + event dClickedList Click; + void Clear(); + IListRow this[int row] { get; } + IListRow AddRow(); + IListRow Add(); + IListRow InsertRow(int pos); + IListRow Insert(int pos); + int RowCount { get; } + void RemoveRow(int index); + void Delete(int index); + int ColCount { get; } + int ScrollPosition { get; set;} + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IListRow + { + IListCell this[int col] { get; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IListCell + { + System.Drawing.Color Color { get; set; } + int Width { get; set; } + object this[int subval] { get; set; } + void ResetColor(); + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IStaticText : IControl + { + string Text { get; set; } + event EventHandler Click; + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface INotebook : IControl + { + event EventHandler Change; + int ActiveTab { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IProgressBar : IControl + { + int Position { get; set; } + int Value { get; set; } + string PreText { get; set; } + int MaxValue { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IImageButton : IControl + { + event EventHandler Click; + void SetImages(int unpressed, int pressed); + void SetImages(int hmodule, int unpressed, int pressed); + int Background { set; } + System.Drawing.Color Matte { set; } + } + + #endregion Controls +} diff --git a/MosswartMassacre/VirindiViews/Wrapper_Decal.cs b/MosswartMassacre/VirindiViews/Wrapper_Decal.cs new file mode 100644 index 0000000..a917ca8 --- /dev/null +++ b/MosswartMassacre/VirindiViews/Wrapper_Decal.cs @@ -0,0 +1,1120 @@ +/////////////////////////////////////////////////////////////////////////////// +//File: Wrapper_Decal.cs +// +//Description: Contains MetaViewWrapper classes implementing Decal views. +// +//References required: +// System.Drawing +// Decal.Adapter +// +//This file is Copyright (c) 2010 VirindiPlugins +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Text; + +#if METAVIEW_PUBLIC_NS +namespace MetaViewWrappers.DecalControls +#else +namespace MyClasses.MetaViewWrappers.DecalControls +#endif + +{ +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class View : IView + { + Decal.Adapter.Wrappers.ViewWrapper myView; + public Decal.Adapter.Wrappers.ViewWrapper Underlying { get { return myView; } } + + #region IView Members + + public void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML) + { + myView = p.LoadViewResource(pXML); + } + + public void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML) + { + myView = p.LoadView(pXML); + } + + public void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey) + { + myView = p.LoadViewResource(pXML); + } + + public void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey) + { + myView = p.LoadView(pXML); + } + + public void SetIcon(int icon, int iconlibrary) + { + myView.SetIcon(icon, iconlibrary); + } + + public void SetIcon(int portalicon) + { + //throw new Exception("The method or operation is not implemented."); + } + + public string Title + { + get + { + return myView.Title; + } + set + { + myView.Title = value; + } + } + + public bool Visible + { + get + { + return myView.Activated; + } + set + { + myView.Activated = value; + } + } + + public bool Activated + { + get + { + return Visible; + } + set + { + Visible = value; + } + } + + public void Activate() + { + Visible = true; + } + + public void Deactivate() + { + Visible = false; + } + + public System.Drawing.Point Location + { + get + { + return new System.Drawing.Point(myView.Position.X, myView.Position.Y); + } + set + { + int w = myView.Position.Width; + int h = myView.Position.Height; + myView.Position = new System.Drawing.Rectangle(value.X, value.Y, w, h); + } + } + + public System.Drawing.Rectangle Position + { + get + { + return myView.Position; + } + set + { + myView.Position = value; + } + } + + public System.Drawing.Size Size + { + get + { + return new System.Drawing.Size(myView.Position.Width, myView.Position.Height); + } + } + +#if VVS_WRAPPERS_PUBLIC + internal +#else + public +#endif + ViewSystemSelector.eViewSystem ViewType { get { return ViewSystemSelector.eViewSystem.DecalInject; } } + Dictionary CreatedControlsByName = new Dictionary(); + + public IControl this[string id] + { + get + { + if (CreatedControlsByName.ContainsKey(id)) return CreatedControlsByName[id]; + + Control ret = null; + Decal.Adapter.Wrappers.IControlWrapper iret = myView.Controls[id]; + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.PushButtonWrapper)) + ret = new Button(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.CheckBoxWrapper)) + ret = new CheckBox(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.TextBoxWrapper)) + ret = new TextBox(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.ChoiceWrapper)) + ret = new Combo(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.SliderWrapper)) + ret = new Slider(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.ListWrapper)) + ret = new List(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.StaticWrapper)) + ret = new StaticText(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.NotebookWrapper)) + ret = new Notebook(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.ProgressWrapper)) + ret = new ProgressBar(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.ButtonWrapper)) + ret = new ImageButton(); + + if (ret == null) return null; + + ret.myControl = iret; + ret.myName = id; + ret.Initialize(); + allocatedcontrols.Add(ret); + CreatedControlsByName[id] = ret; + return ret; + } + } + + List allocatedcontrols = new List(); + + #endregion + + #region IDisposable Members + + bool disposed = false; + public void Dispose() + { + if (disposed) return; + disposed = true; + GC.SuppressFinalize(this); + + foreach (Control c in allocatedcontrols) + c.Dispose(); + + myView.Dispose(); + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Control : IControl + { + internal Decal.Adapter.Wrappers.IControlWrapper myControl; + public Decal.Adapter.Wrappers.IControlWrapper Underlying { get { return myControl; } } + internal string myName; + + public virtual void Initialize() + { + + } + + #region IControl Members + + public string Name + { + get { return myName; } + } + + public bool Visible + { + get { return true; } + set { } + } + + public string TooltipText + { + get + { + return ""; + } + set + { + + } + } + + public int Id + { + get + { + return myControl.Id; + } + } + + public System.Drawing.Rectangle LayoutPosition + { + get + { +#if DECAL_INTEROP + //This is kinda bad, but whatever + Decal.Interop.Inject.ILayer Ly = (Decal.Interop.Inject.ILayer)(Underlying.Underlying); + Decal.Interop.Core.tagRECT rct = Ly.get_Position(); + return new System.Drawing.Rectangle(rct.left, rct.top, rct.right - rct.left, rct.bottom - rct.top); +#else +#warning DECAL_INTEROP not defined, MetaViewWrappers.DecalControls.Control.LayoutPosition will not be available. + return new System.Drawing.Rectangle(); +#endif + } + set + { +#if DECAL_INTEROP + Decal.Interop.Inject.ILayer Ly = (Decal.Interop.Inject.ILayer)(Underlying.Underlying); + Decal.Interop.Core.tagRECT rct = new Decal.Interop.Core.tagRECT(); + rct.left = value.Left; + rct.top = value.Top; + rct.right = value.Right; + rct.bottom = value.Bottom; + Ly.set_Position(ref rct); +#endif + } + } + + #endregion + + #region IDisposable Members + + bool disposed = false; + public virtual void Dispose() + { + if (disposed) return; + disposed = true; + + //myControl.Dispose(); + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Button : Control, IButton + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Hit += new EventHandler(Button_Hit); + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Click += new EventHandler(Button_Click); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Hit -= new EventHandler(Button_Hit); + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Click -= new EventHandler(Button_Click); + } + + void Button_Hit(object sender, Decal.Adapter.ControlEventArgs e) + { + if (Hit != null) + Hit(this, null); + } + + void Button_Click(object sender, Decal.Adapter.ControlEventArgs e) + { + if (Click != null) + Click(this, new MVControlEventArgs(this.Id)); + } + + #region IButton Members + + public string Text + { + get + { + return ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Text; + //throw new Exception("The method or operation is not implemented."); + } + set + { + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Text = value; + //throw new Exception("The method or operation is not implemented."); + } + } + + public System.Drawing.Color TextColor + { + get + { + return ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).TextColor; + } + set + { + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).TextColor = value; + } + } + + public event EventHandler Hit; + public event EventHandler Click; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class CheckBox : Control, ICheckBox + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Change += new EventHandler(CheckBox_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Change -= new EventHandler(CheckBox_Change); + } + + void CheckBox_Change(object sender, Decal.Adapter.CheckBoxChangeEventArgs e) + { + if (Change != null) + Change(this, new MVCheckBoxChangeEventArgs(this.Id, Checked)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ICheckBox Members + + public string Text + { + get + { + return ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Text; + } + set + { + ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Text = value; + } + } + + public bool Checked + { + get + { + return ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Checked; + } + set + { + ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Checked = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class TextBox : Control, ITextBox + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Change += new EventHandler(TextBox_Change); + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).End += new EventHandler(TextBox_End); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Change -= new EventHandler(TextBox_Change); + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).End -= new EventHandler(TextBox_End); + } + + void TextBox_Change(object sender, Decal.Adapter.TextBoxChangeEventArgs e) + { + if (Change != null) + Change(this, new MVTextBoxChangeEventArgs(this.Id, e.Text)); + if (Change_Old != null) + Change_Old(this, null); + } + + void TextBox_End(object sender, Decal.Adapter.TextBoxEndEventArgs e) + { + if (End != null) + End(this, new MVTextBoxEndEventArgs(this.Id, e.Success)); + } + + #region ITextBox Members + + public string Text + { + get + { + return ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Text; + } + set + { + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Text = value; + } + } + + public int Caret + { + get + { + return ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Caret; + } + set + { + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Caret = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + public event EventHandler End; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Combo : Control, ICombo + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Change += new EventHandler(Combo_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Change -= new EventHandler(Combo_Change); + } + + void Combo_Change(object sender, Decal.Adapter.IndexChangeEventArgs e) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, e.Index)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ICombo Members + + public IComboIndexer Text + { + get + { + return new ComboIndexer(this); + } + } + + public IComboDataIndexer Data + { + get + { + return new ComboDataIndexer(this); + } + } + + public int Count + { + get + { + return ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Count; + } + } + + public int Selected + { + get + { + return ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Selected; + } + set + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Selected = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + public void Add(string text) + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Add(text, null); + } + + public void Add(string text, object obj) + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Add(text, obj); + } + + public void Insert(int index, string text) + { + throw new Exception("The method or operation is not implemented."); + } + + public void RemoveAt(int index) + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Remove(index); + } + + public void Remove(int index) + { + RemoveAt(index); + } + + public void Clear() + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Clear(); + } + + #endregion + + internal class ComboIndexer: IComboIndexer + { + Combo myCombo; + internal ComboIndexer(Combo c) + { + myCombo = c; + } + + #region IComboIndexer Members + + public string this[int index] + { + get + { + return ((Decal.Adapter.Wrappers.ChoiceWrapper)myCombo.myControl).Text[index]; + } + set + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myCombo.myControl).Text[index] = value; + } + } + + #endregion + } + + internal class ComboDataIndexer : IComboDataIndexer + { + Combo myCombo; + internal ComboDataIndexer(Combo c) + { + myCombo = c; + } + + #region IComboIndexer Members + + public object this[int index] + { + get + { + return ((Decal.Adapter.Wrappers.ChoiceWrapper)myCombo.myControl).Data[index]; + } + set + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myCombo.myControl).Data[index] = value; + } + } + + #endregion + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Slider : Control, ISlider + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Change += new EventHandler(Slider_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Change -= new EventHandler(Slider_Change); + } + + void Slider_Change(object sender, Decal.Adapter.IndexChangeEventArgs e) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, e.Index)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ISlider Members + + public int Position + { + get + { + return ((Decal.Adapter.Wrappers.SliderWrapper)myControl).SliderPostition; + } + set + { + ((Decal.Adapter.Wrappers.SliderWrapper)myControl).SliderPostition = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + public int Maximum + { + get + { + return ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Maximum; + } + set + { + ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Maximum = value; + } + } + public int Minimum + { + get + { + return ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Minimum; + } + set + { + ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Minimum = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class List : Control, IList + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Selected += new EventHandler(List_Selected); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Selected -= new EventHandler(List_Selected); + } + + void List_Selected(object sender, Decal.Adapter.ListSelectEventArgs e) + { + if (Click != null) + Click(this, e.Row, e.Column); + if (Selected != null) + Selected(this, new MVListSelectEventArgs(this.Id, e.Row, e.Column)); + } + + #region IList Members + + public event dClickedList Click; + public event EventHandler Selected; + + public void Clear() + { + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Clear(); + } + + public IListRow this[int row] + { + get + { + return new ListRow(this, row); + } + } + + public IListRow AddRow() + { + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Add(); + return new ListRow(this, ((Decal.Adapter.Wrappers.ListWrapper)myControl).RowCount - 1); + } + + public IListRow Add() + { + return AddRow(); + } + + public IListRow InsertRow(int pos) + { + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Insert(pos); + return new ListRow(this, pos); + } + + public IListRow Insert(int pos) + { + return InsertRow(pos); + } + + public int RowCount + { + get { return ((Decal.Adapter.Wrappers.ListWrapper)myControl).RowCount; } + } + + public void RemoveRow(int index) + { + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Delete(index); + } + + public void Delete(int index) + { + RemoveRow(index); + } + + public int ColCount + { + get + { + return ((Decal.Adapter.Wrappers.ListWrapper)myControl).ColCount; + } + } + + public int ScrollPosition + { + get + { + return ((Decal.Adapter.Wrappers.ListWrapper)myControl).ScrollPosition; + } + set + { + ((Decal.Adapter.Wrappers.ListWrapper)myControl).ScrollPosition = value; + } + } + + #endregion + + public class ListRow : IListRow + { + internal List myList; + internal int myRow; + internal ListRow(List l, int r) + { + myList = l; + myRow = r; + } + + + #region IListRow Members + + public IListCell this[int col] + { + get { return new ListCell(myList, myRow, col); } + } + + #endregion + } + + public class ListCell : IListCell + { + internal List myList; + internal int myRow; + internal int myCol; + public ListCell(List l, int r, int c) + { + myList = l; + myRow = r; + myCol = c; + } + + #region IListCell Members + + public void ResetColor() + { + Color = System.Drawing.Color.White; + } + + public System.Drawing.Color Color + { + get + { + return ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol].Color; + } + set + { + ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol].Color = value; + } + } + + public int Width + { + get + { + return ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol].Width; + } + set + { + ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol].Width = value; + } + } + + public object this[int subval] + { + get + { + return ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol][subval]; + } + set + { + ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol][subval] = value; + } + } + + #endregion + } + + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class StaticText : Control, IStaticText + { + + #region IStaticText Members + + public string Text + { + get + { + return ((Decal.Adapter.Wrappers.StaticWrapper)myControl).Text; + } + set + { + ((Decal.Adapter.Wrappers.StaticWrapper)myControl).Text = value; + } + } + +#pragma warning disable 0067 + public event EventHandler Click; +#pragma warning restore 0067 + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Notebook : Control, INotebook + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.NotebookWrapper)myControl).Change += new EventHandler(Notebook_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.NotebookWrapper)myControl).Change -= new EventHandler(Notebook_Change); + } + + void Notebook_Change(object sender, Decal.Adapter.IndexChangeEventArgs e) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, e.Index)); + } + + #region INotebook Members + + public event EventHandler Change; + + public int ActiveTab + { + get + { + return ((Decal.Adapter.Wrappers.NotebookWrapper)myControl).ActiveTab; + } + set + { + ((Decal.Adapter.Wrappers.NotebookWrapper)myControl).ActiveTab = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class ProgressBar : Control, IProgressBar + { + + #region IProgressBar Members + + public int Position + { + get + { + return ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).Value; + } + set + { + ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).Value = value; + } + } + + public int Value + { + get + { + return Position; + } + set + { + Position = value; + } + } + + public string PreText + { + get + { + return ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).PreText; + } + set + { + ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).PreText = value; + } + } + + public int MaxValue + { + get + { + return ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).MaxValue; + } + set + { + ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).MaxValue = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class ImageButton : Control, IImageButton + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).Click += new EventHandler(ImageButton_Click); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).Click -= new EventHandler(ImageButton_Click); + } + + void ImageButton_Click(object sender, Decal.Adapter.ControlEventArgs e) + { + if (Click != null) + Click(this, new MVControlEventArgs(this.Id)); + } + + + #region IImageButton Members + + public event EventHandler Click; + + public void SetImages(int unpressed, int pressed) + { + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).SetImages(unpressed, pressed); + } + + public void SetImages(int hmodule, int unpressed, int pressed) + { + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).SetImages(hmodule, unpressed, pressed); + } + + public int Background + { + set + { + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).Background = value; + } + } + + public System.Drawing.Color Matte + { + set + { + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).Matte = value; + } + } + + #endregion + } +} + diff --git a/MosswartMassacre/VirindiViews/Wrapper_MyHuds.cs b/MosswartMassacre/VirindiViews/Wrapper_MyHuds.cs new file mode 100644 index 0000000..e2e097f --- /dev/null +++ b/MosswartMassacre/VirindiViews/Wrapper_MyHuds.cs @@ -0,0 +1,1225 @@ +/////////////////////////////////////////////////////////////////////////////// +//File: Wrapper_MyHuds.cs +// +//Description: Contains MetaViewWrapper classes implementing Virindi View Service +// views. These classes are only compiled if the VVS_REFERENCED symbol is defined. +// +//References required: +// System.Drawing +// VirindiViewService (if VVS_REFERENCED is defined) +// +//This file is Copyright (c) 2010 VirindiPlugins +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////// + +#if VVS_REFERENCED + +using System; +using System.Collections.Generic; +using System.Text; +using VirindiViewService; + +#if METAVIEW_PUBLIC_NS +namespace MetaViewWrappers.VirindiViewServiceHudControls +#else +namespace MyClasses.MetaViewWrappers.VirindiViewServiceHudControls +#endif +{ +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class View : IView + { + HudView myView; + public HudView Underlying { get { return myView; } } + + #region IView Members + + public void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML) + { + VirindiViewService.XMLParsers.Decal3XMLParser ps = new VirindiViewService.XMLParsers.Decal3XMLParser(); + ViewProperties iprop; + ControlGroup igroup; + ps.ParseFromResource(pXML, out iprop, out igroup); + myView = new VirindiViewService.HudView(iprop, igroup); + } + + public void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML) + { + VirindiViewService.XMLParsers.Decal3XMLParser ps = new VirindiViewService.XMLParsers.Decal3XMLParser(); + ViewProperties iprop; + ControlGroup igroup; + ps.Parse(pXML, out iprop, out igroup); + myView = new VirindiViewService.HudView(iprop, igroup); + } + + public void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey) + { + VirindiViewService.XMLParsers.Decal3XMLParser ps = new VirindiViewService.XMLParsers.Decal3XMLParser(); + ViewProperties iprop; + ControlGroup igroup; + ps.ParseFromResource(pXML, out iprop, out igroup); + myView = new VirindiViewService.HudView(iprop, igroup, pWindowKey); + } + + public void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey) + { + VirindiViewService.XMLParsers.Decal3XMLParser ps = new VirindiViewService.XMLParsers.Decal3XMLParser(); + ViewProperties iprop; + ControlGroup igroup; + ps.Parse(pXML, out iprop, out igroup); + myView = new VirindiViewService.HudView(iprop, igroup, pWindowKey); + } + + public void SetIcon(int icon, int iconlibrary) + { + myView.Icon = ACImage.FromIconLibrary(icon, iconlibrary); + } + + public void SetIcon(int portalicon) + { + myView.Icon = portalicon; + } + + public string Title + { + get + { + return myView.Title; + } + set + { + myView.Title = value; + } + } + + public bool Visible + { + get + { + return myView.Visible; + } + set + { + myView.Visible = value; + } + } + + public bool Activated + { + get + { + return Visible; + } + set + { + Visible = value; + } + } + + public void Activate() + { + Visible = true; + } + + public void Deactivate() + { + Visible = false; + } + + public System.Drawing.Point Location + { + get + { + return myView.Location; + } + set + { + myView.Location = value; + } + } + + public System.Drawing.Size Size + { + get + { + return new System.Drawing.Size(myView.Width, myView.Height); + } + } + + public System.Drawing.Rectangle Position + { + get + { + return new System.Drawing.Rectangle(Location, Size); + } + set + { + Location = value.Location; + myView.ClientArea = value.Size; + } + } + +#if VVS_WRAPPERS_PUBLIC + internal +#else + public +#endif + ViewSystemSelector.eViewSystem ViewType { get { return ViewSystemSelector.eViewSystem.VirindiViewService; } } + Dictionary CreatedControlsByName = new Dictionary(); + + public IControl this[string id] + { + get + { + if (CreatedControlsByName.ContainsKey(id)) return CreatedControlsByName[id]; + + Control ret = null; + VirindiViewService.Controls.HudControl iret = myView[id]; + if (iret.GetType() == typeof(VirindiViewService.Controls.HudButton)) + ret = new Button(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudCheckBox)) + ret = new CheckBox(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudTextBox)) + ret = new TextBox(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudCombo)) + ret = new Combo(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudHSlider)) + ret = new Slider(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudList)) + ret = new List(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudStaticText)) + ret = new StaticText(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudTabView)) + ret = new Notebook(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudProgressBar)) + ret = new ProgressBar(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudImageButton)) + ret = new ImageButton(); + + if (ret == null) return null; + + ret.myControl = iret; + ret.myName = id; + ret.Initialize(); + allocatedcontrols.Add(ret); + CreatedControlsByName[id] = ret; + return ret; + } + } + + #endregion + + #region IDisposable Members + + bool disposed = false; + public void Dispose() + { + if (disposed) return; + disposed = true; + GC.SuppressFinalize(this); + + foreach (Control c in allocatedcontrols) + c.Dispose(); + + myView.Dispose(); + } + + #endregion + + List allocatedcontrols = new List(); + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Control : IControl + { + internal VirindiViewService.Controls.HudControl myControl; + internal string myName; + public VirindiViewService.Controls.HudControl Underlying { get { return myControl; } } + + public virtual void Initialize() + { + + } + + #region IControl Members + + public string Name + { + get { return myName; } + } + + public bool Visible + { + get { return myControl.Visible; } + set { myControl.Visible = value; } + } + + VirindiViewService.TooltipSystem.cTooltipInfo itooltipinfo = null; + public string TooltipText + { + get + { + if (itooltipinfo != null) + return itooltipinfo.Text; + else + return ""; + } + set + { + if (itooltipinfo != null) + { + VirindiViewService.TooltipSystem.RemoveTooltip(itooltipinfo); + itooltipinfo = null; + } + if (!String.IsNullOrEmpty(value)) + { + itooltipinfo = VirindiViewService.TooltipSystem.AssociateTooltip(myControl, value); + } + } + } + + public int Id + { + get + { + return myControl.XMLID; + } + } + + public System.Drawing.Rectangle LayoutPosition + { + get + { + //Relative to what?!??! + if (Underlying.Group.HeadControl == null) + return new System.Drawing.Rectangle(); + + if (Underlying.Group.HeadControl.Name == Underlying.Name) + return new System.Drawing.Rectangle(); + + VirindiViewService.Controls.HudControl myparent = Underlying.Group.ParentOf(Underlying.Name); + + if (myparent == null) + return new System.Drawing.Rectangle(); + + //Position only valid inside fixedlayouts + VirindiViewService.Controls.HudFixedLayout layoutparent = myparent as VirindiViewService.Controls.HudFixedLayout; + + if (layoutparent == null) + return new System.Drawing.Rectangle(); + + return layoutparent.GetControlRect(Underlying); + } + set + { + if (Underlying.Group.HeadControl == null) + return; + + if (Underlying.Group.HeadControl.Name == Underlying.Name) + return; + + VirindiViewService.Controls.HudControl myparent = Underlying.Group.ParentOf(Underlying.Name); + + if (myparent == null) + return; + + //Position only valid inside fixedlayouts + VirindiViewService.Controls.HudFixedLayout layoutparent = myparent as VirindiViewService.Controls.HudFixedLayout; + + if (layoutparent == null) + return; + + layoutparent.SetControlRect(Underlying, value); + } + } + + #endregion + + #region IDisposable Members + + bool disposed = false; + public virtual void Dispose() + { + if (disposed) return; + disposed = true; + + myControl.Dispose(); + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Button : Control, IButton + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudButton)myControl).MouseEvent += new EventHandler(Button_MouseEvent); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudButton)myControl).MouseEvent -= new EventHandler(Button_MouseEvent); + } + + void Button_MouseEvent(object sender, VirindiViewService.Controls.ControlMouseEventArgs e) + { + switch (e.EventType) + { + case VirindiViewService.Controls.ControlMouseEventArgs.MouseEventType.MouseHit: + if (Click != null) + Click(this, new MVControlEventArgs(this.Id)); + return; + case VirindiViewService.Controls.ControlMouseEventArgs.MouseEventType.MouseDown: + if (Hit != null) + Hit(this, null); + return; + } + } + + #region IButton Members + + public string Text + { + get + { + return ((VirindiViewService.Controls.HudButton)myControl).Text; + } + set + { + ((VirindiViewService.Controls.HudButton)myControl).Text = value; + } + } + + public System.Drawing.Color TextColor + { + get + { + return System.Drawing.Color.Black; + } + set + { + + } + } + + public event EventHandler Hit; + public event EventHandler Click; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class CheckBox : Control, ICheckBox + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudCheckBox)myControl).Change += new EventHandler(CheckBox_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudCheckBox)myControl).Change -= new EventHandler(CheckBox_Change); + } + + void CheckBox_Change(object sender, EventArgs e) + { + if (Change != null) + Change(this, new MVCheckBoxChangeEventArgs(this.Id, Checked)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ICheckBox Members + + public string Text + { + get + { + return ((VirindiViewService.Controls.HudCheckBox)myControl).Text; + } + set + { + ((VirindiViewService.Controls.HudCheckBox)myControl).Text = value; + } + } + + public bool Checked + { + get + { + return ((VirindiViewService.Controls.HudCheckBox)myControl).Checked; + } + set + { + ((VirindiViewService.Controls.HudCheckBox)myControl).Checked = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class TextBox : Control, ITextBox + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudTextBox)myControl).Change += new EventHandler(TextBox_Change); + myControl.LostFocus += new EventHandler(myControl_LostFocus); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudTextBox)myControl).Change -= new EventHandler(TextBox_Change); + myControl.LostFocus -= new EventHandler(myControl_LostFocus); + } + + void TextBox_Change(object sender, EventArgs e) + { + if (Change != null) + Change(this, new MVTextBoxChangeEventArgs(this.Id, Text)); + if (Change_Old != null) + Change_Old(this, null); + } + + void myControl_LostFocus(object sender, EventArgs e) + { + if (!myControl.HasFocus) return; + + if (End != null) + End(this, new MVTextBoxEndEventArgs(this.Id, true)); + } + + #region ITextBox Members + + public string Text + { + get + { + return ((VirindiViewService.Controls.HudTextBox)myControl).Text; + } + set + { + ((VirindiViewService.Controls.HudTextBox)myControl).Text = value; + } + } + + public int Caret + { + get + { + return 0; + } + set + { + + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + public event EventHandler End; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Combo : Control, ICombo + { + List iData = new List(); + + public Combo() + { + //TODO: add data values from the xml + } + + public class ComboIndexer : IComboIndexer + { + Combo underlying; + internal ComboIndexer(Combo c) + { + underlying = c; + } + + #region IComboIndexer Members + + public string this[int index] + { + get + { + return ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudCombo)underlying.myControl)[index])).Text; + } + set + { + ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudCombo)underlying.myControl)[index])).Text = value; + } + } + + #endregion + } + + public class ComboDataIndexer : IComboDataIndexer + { + Combo underlying; + internal ComboDataIndexer(Combo c) + { + underlying = c; + } + + #region IComboIndexer Members + + public object this[int index] + { + get + { + return underlying.iData[index]; + } + set + { + underlying.iData[index] = value; + } + } + + #endregion + } + + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudCombo)myControl).Change += new EventHandler(Combo_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudCombo)myControl).Change -= new EventHandler(Combo_Change); + } + + void Combo_Change(object sender, EventArgs e) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, Selected)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ICombo Members + + public IComboIndexer Text + { + get { return new ComboIndexer(this); } + } + + public IComboDataIndexer Data + { + get { return new ComboDataIndexer(this); } + } + + public int Count + { + get { return ((VirindiViewService.Controls.HudCombo)myControl).Count; } + } + + public int Selected + { + get + { + return ((VirindiViewService.Controls.HudCombo)myControl).Current; + } + set + { + ((VirindiViewService.Controls.HudCombo)myControl).Current = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + public void Add(string text) + { + ((VirindiViewService.Controls.HudCombo)myControl).AddItem(text, null); + iData.Add(null); + } + + public void Add(string text, object obj) + { + ((VirindiViewService.Controls.HudCombo)myControl).AddItem(text, null); + iData.Add(obj); + } + + public void Insert(int index, string text) + { + ((VirindiViewService.Controls.HudCombo)myControl).InsertItem(index, text, null); + iData.Insert(index, null); + } + + public void RemoveAt(int index) + { + ((VirindiViewService.Controls.HudCombo)myControl).DeleteItem(index); + iData.RemoveAt(index); + } + + public void Remove(int index) + { + RemoveAt(index); + } + + public void Clear() + { + ((VirindiViewService.Controls.HudCombo)myControl).Clear(); + iData.Clear(); + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Slider : Control, ISlider + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudHSlider)myControl).Changed += new VirindiViewService.Controls.LinearPositionControl.delScrollChanged(Slider_Changed); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudHSlider)myControl).Changed -= new VirindiViewService.Controls.LinearPositionControl.delScrollChanged(Slider_Changed); + } + + void Slider_Changed(int min, int max, int pos) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, pos)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ISlider Members + + public int Position + { + get + { + return ((VirindiViewService.Controls.HudHSlider)myControl).Position; + } + set + { + ((VirindiViewService.Controls.HudHSlider)myControl).Position = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + public int Maximum + { + get + { + return ((VirindiViewService.Controls.HudHSlider)myControl).Max; + } + set + { + ((VirindiViewService.Controls.HudHSlider)myControl).Max = value; + } + } + public int Minimum + { + get + { + return ((VirindiViewService.Controls.HudHSlider)myControl).Min; + } + set + { + ((VirindiViewService.Controls.HudHSlider)myControl).Min = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class List : Control, IList + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudList)myControl).Click += new VirindiViewService.Controls.HudList.delClickedControl(List_Click); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudList)myControl).Click -= new VirindiViewService.Controls.HudList.delClickedControl(List_Click); + } + + void List_Click(object sender, int row, int col) + { + if (Click != null) + Click(this, row, col); + if (Selected != null) + Selected(this, new MVListSelectEventArgs(this.Id, row, col)); + } + + public class ListRow : IListRow + { + List myList; + int myRow; + internal ListRow(int row, List l) + { + myList = l; + myRow = row; + } + + #region IListRow Members + + public IListCell this[int col] + { + get { return new ListCell(myRow, col, myList); } + } + + #endregion + } + public class ListCell : IListCell + { + List myList; + int myRow; + int myCol; + internal ListCell(int row, int col, List l) + { + myRow = row; + myCol = col; + myList = l; + } + + #region IListCell Members + + public void ResetColor() + { + ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol])).ResetTextColor(); + } + + public System.Drawing.Color Color + { + get + { + return ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol])).TextColor; + } + set + { + ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol])).TextColor = value; + } + } + + public int Width + { + get + { + return ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol])).ClipRegion.Width; + } + set + { + throw new Exception("The method or operation is not implemented."); + } + } + + public object this[int subval] + { + get + { + VirindiViewService.Controls.HudControl c = ((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol]; + if (subval == 0) + { + if (c.GetType() == typeof(VirindiViewService.Controls.HudStaticText)) + return ((VirindiViewService.Controls.HudStaticText)c).Text; + if (c.GetType() == typeof(VirindiViewService.Controls.HudCheckBox)) + return ((VirindiViewService.Controls.HudCheckBox)c).Checked; + } + else if (subval == 1) + { + if (c.GetType() == typeof(VirindiViewService.Controls.HudPictureBox)) + return ((VirindiViewService.Controls.HudPictureBox)c).Image.PortalImageID; + } + return null; + } + set + { + VirindiViewService.Controls.HudControl c = ((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol]; + if (subval == 0) + { + if (c.GetType() == typeof(VirindiViewService.Controls.HudStaticText)) + ((VirindiViewService.Controls.HudStaticText)c).Text = (string)value; + if (c.GetType() == typeof(VirindiViewService.Controls.HudCheckBox)) + ((VirindiViewService.Controls.HudCheckBox)c).Checked = (bool)value; + } + else if (subval == 1) + { + if (c.GetType() == typeof(VirindiViewService.Controls.HudPictureBox)) + ((VirindiViewService.Controls.HudPictureBox)c).Image = (int)value; + } + } + } + + #endregion + } + + #region IList Members + + public event dClickedList Click; + public event EventHandler Selected; + + public void Clear() + { + ((VirindiViewService.Controls.HudList)myControl).ClearRows(); + } + + public IListRow this[int row] + { + get { return new ListRow(row, this); } + } + + public IListRow AddRow() + { + ((VirindiViewService.Controls.HudList)myControl).AddRow(); + return new ListRow(((VirindiViewService.Controls.HudList)myControl).RowCount - 1, this); + } + + public IListRow Add() + { + return AddRow(); + } + + public IListRow InsertRow(int pos) + { + ((VirindiViewService.Controls.HudList)myControl).InsertRow(pos); + return new ListRow(pos, this); + } + + public IListRow Insert(int pos) + { + return InsertRow(pos); + } + + public int RowCount + { + get { return ((VirindiViewService.Controls.HudList)myControl).RowCount; } + } + + public void RemoveRow(int index) + { + ((VirindiViewService.Controls.HudList)myControl).RemoveRow(index); + } + + public void Delete(int index) + { + RemoveRow(index); + } + + public int ColCount + { + get + { + return ((VirindiViewService.Controls.HudList)myControl).ColumnCount; + } + } + + public int ScrollPosition + { + get + { + return ((VirindiViewService.Controls.HudList)myControl).ScrollPosition; + } + set + { + ((VirindiViewService.Controls.HudList)myControl).ScrollPosition = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class StaticText : Control, IStaticText + { + public override void Initialize() + { + base.Initialize(); + //((VirindiViewService.Controls.HudStaticText)myControl) + } + + public override void Dispose() + { + base.Dispose(); + } + + #region IStaticText Members + + public string Text + { + get + { + return ((VirindiViewService.Controls.HudStaticText)myControl).Text; + } + set + { + ((VirindiViewService.Controls.HudStaticText)myControl).Text = value; + } + } + +#pragma warning disable 0067 + public event EventHandler Click; +#pragma warning restore 0067 + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Notebook : Control, INotebook + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudTabView)myControl).OpenTabChange += new EventHandler(Notebook_OpenTabChange); + } + + public override void Dispose() + { + ((VirindiViewService.Controls.HudTabView)myControl).OpenTabChange -= new EventHandler(Notebook_OpenTabChange); + base.Dispose(); + } + + void Notebook_OpenTabChange(object sender, EventArgs e) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, ActiveTab)); + } + + #region INotebook Members + + public event EventHandler Change; + + public int ActiveTab + { + get + { + return ((VirindiViewService.Controls.HudTabView)myControl).CurrentTab; + } + set + { + ((VirindiViewService.Controls.HudTabView)myControl).CurrentTab = value; + ((VirindiViewService.Controls.HudTabView)myControl).Invalidate(); + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class ProgressBar : Control, IProgressBar + { + + #region IProgressBar Members + + public int Position + { + get + { + return ((VirindiViewService.Controls.HudProgressBar)myControl).Position; + } + set + { + ((VirindiViewService.Controls.HudProgressBar)myControl).Position = value; + } + } + + public int Value + { + get + { + return Position; + } + set + { + Position = value; + } + } + + public string PreText + { + get + { + return ((VirindiViewService.Controls.HudProgressBar)myControl).PreText; + } + set + { + ((VirindiViewService.Controls.HudProgressBar)myControl).PreText = value; + } + } + + + public int MaxValue + { + get + { + return ((VirindiViewService.Controls.HudProgressBar)myControl).Max; + } + set + { + ((VirindiViewService.Controls.HudProgressBar)myControl).Max = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class ImageButton : Control, IImageButton + { + public override void Initialize() + { + base.Initialize(); + myControl.MouseEvent += new EventHandler(Button_MouseEvent); + } + + public override void Dispose() + { + base.Dispose(); + myControl.MouseEvent -= new EventHandler(Button_MouseEvent); + } + + void Button_MouseEvent(object sender, VirindiViewService.Controls.ControlMouseEventArgs e) + { + switch (e.EventType) + { + case VirindiViewService.Controls.ControlMouseEventArgs.MouseEventType.MouseHit: + if (Click != null) + Click(this, new MVControlEventArgs(this.Id)); + return; + } + } + + #region IImageButton Members + + public event EventHandler Click; + + public void SetImages(int unpressed, int pressed) + { + ACImage upimg; + if (!VirindiViewService.Service.PortalBitmapExists(unpressed | 0x06000000)) + upimg = new ACImage(); + else + upimg = new ACImage(unpressed, ACImage.eACImageDrawOptions.DrawStretch); + + ACImage pimg; + if (!VirindiViewService.Service.PortalBitmapExists(pressed | 0x06000000)) + pimg = new ACImage(); + else + pimg = new ACImage(pressed, ACImage.eACImageDrawOptions.DrawStretch); + + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Up = upimg; + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Up_Pressing = pimg; + } + + public void SetImages(int hmodule, int unpressed, int pressed) + { + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Up = ACImage.FromIconLibrary(unpressed, hmodule); + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Up_Pressing = ACImage.FromIconLibrary(pressed, hmodule); + } + + public int Background + { + set + { + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Background2 = new ACImage(value, ACImage.eACImageDrawOptions.DrawStretch); + } + } + + public System.Drawing.Color Matte + { + set + { + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Background = new ACImage(value); + } + } + + #endregion + } +} + +#else +#warning VVS_REFERENCED not defined, MetaViewWrappers for VVS will not be available. +#endif \ No newline at end of file diff --git a/MosswartMassacre/VirindiViews/Wrapper_WireupHelper.cs b/MosswartMassacre/VirindiViews/Wrapper_WireupHelper.cs new file mode 100644 index 0000000..63deeaf --- /dev/null +++ b/MosswartMassacre/VirindiViews/Wrapper_WireupHelper.cs @@ -0,0 +1,329 @@ +/////////////////////////////////////////////////////////////////////////////// +//File: Wrapper_WireupHelper.cs +// +//Description: A helper utility that emulates Decal.Adapter's automagic view +// creation and control/event wireup with the MetaViewWrappers. A separate set +// of attributes is used. +// +//References required: +// Wrapper.cs +// +//This file is Copyright (c) 2010 VirindiPlugins +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Text; +using System.Reflection; + +#if METAVIEW_PUBLIC_NS +namespace MetaViewWrappers +#else +namespace MyClasses.MetaViewWrappers +#endif +{ + #region Attribute Definitions + + [AttributeUsage(AttributeTargets.Class)] +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + sealed class MVWireUpControlEventsAttribute : Attribute + { + public MVWireUpControlEventsAttribute() { } + } + + [AttributeUsage(AttributeTargets.Field)] +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + sealed class MVControlReferenceAttribute : Attribute + { + string ctrl; + + // Summary: + // Construct a new ControlReference + // + // Parameters: + // control: + // Control to reference + public MVControlReferenceAttribute(string control) + { + ctrl = control; + } + + // Summary: + // The Control Name + public string Control + { + get + { + return ctrl; + } + } + } + + [AttributeUsage(AttributeTargets.Field)] +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + sealed class MVControlReferenceArrayAttribute : Attribute + { + private System.Collections.ObjectModel.Collection myControls; + + /// + /// Constructs a new ControlReference array + /// + /// Names of the controls to put in the array + public MVControlReferenceArrayAttribute(params string[] controls) + : base() + { + this.myControls = new System.Collections.ObjectModel.Collection(controls); + } + + /// + /// Control collection + /// + public System.Collections.ObjectModel.Collection Controls + { + get + { + return this.myControls; + } + } + } + + [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + sealed class MVViewAttribute : Attribute + { + string res; + + // Summary: + // Constructs a new view from the specified resource + // + // Parameters: + // Resource: + // Embedded resource path + public MVViewAttribute(string resource) + { + res = resource; + } + + // Summary: + // The resource to load + public string Resource + { + get + { + return res; + } + } + } + + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + sealed class MVControlEventAttribute : Attribute + { + string c; + string e; + // Summary: + // Constructs the ControlEvent + // + // Parameters: + // control: + // Control Name + // + // controlEvent: + // Event to Wire + public MVControlEventAttribute(string control, string eventName) + { + c = control; + e = eventName; + } + + // Summary: + // Control Name + public string Control + { + get + { + return c; + } + } + + // + // Summary: + // Event to Wire + public string EventName + { + get + { + return e; + } + } + } + + #endregion Attribute Definitions + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + static class MVWireupHelper + { + private class ViewObjectInfo + { + public List Views = new List(); + } + static Dictionary VInfo = new Dictionary(); + + public static MyClasses.MetaViewWrappers.IView GetDefaultView(object ViewObj) + { + if (!VInfo.ContainsKey(ViewObj)) + return null; + if (VInfo[ViewObj].Views.Count == 0) + return null; + return VInfo[ViewObj].Views[0]; + } + + public static void WireupStart(object ViewObj, Decal.Adapter.Wrappers.PluginHost Host) + { + if (VInfo.ContainsKey(ViewObj)) + WireupEnd(ViewObj); + ViewObjectInfo info = new ViewObjectInfo(); + VInfo[ViewObj] = info; + + Type ObjType = ViewObj.GetType(); + + //Start views + object[] viewattrs = ObjType.GetCustomAttributes(typeof(MVViewAttribute), true); + foreach (MVViewAttribute a in viewattrs) + { + info.Views.Add(MyClasses.MetaViewWrappers.ViewSystemSelector.CreateViewResource(Host, a.Resource)); + } + + //Wire up control references + foreach (FieldInfo fi in ObjType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)) + { + if (Attribute.IsDefined(fi, typeof(MVControlReferenceAttribute))) + { + MVControlReferenceAttribute attr = (MVControlReferenceAttribute)Attribute.GetCustomAttribute(fi, typeof(MVControlReferenceAttribute)); + MetaViewWrappers.IControl mycontrol = null; + + //Try each view + foreach (MyClasses.MetaViewWrappers.IView v in info.Views) + { + try + { + mycontrol = v[attr.Control]; + } + catch { } + if (mycontrol != null) + break; + } + + if (mycontrol == null) + throw new Exception("Invalid control reference \"" + attr.Control + "\""); + + if (!fi.FieldType.IsAssignableFrom(mycontrol.GetType())) + throw new Exception("Control reference \"" + attr.Control + "\" is of wrong type"); + + fi.SetValue(ViewObj, mycontrol); + } + else if (Attribute.IsDefined(fi, typeof(MVControlReferenceArrayAttribute))) + { + MVControlReferenceArrayAttribute attr = (MVControlReferenceArrayAttribute)Attribute.GetCustomAttribute(fi, typeof(MVControlReferenceArrayAttribute)); + + //Only do the first view + if (info.Views.Count == 0) + throw new Exception("No views to which a control reference can attach"); + + Array controls = Array.CreateInstance(fi.FieldType.GetElementType(), attr.Controls.Count); + + IView view = info.Views[0]; + for (int i = 0; i < attr.Controls.Count; ++i) + { + controls.SetValue(view[attr.Controls[i]], i); + } + + fi.SetValue(ViewObj, controls); + } + } + + //Wire up events + foreach (MethodInfo mi in ObjType.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)) + { + if (!Attribute.IsDefined(mi, typeof(MVControlEventAttribute))) + continue; + Attribute[] attrs = Attribute.GetCustomAttributes(mi, typeof(MVControlEventAttribute)); + + foreach (MVControlEventAttribute attr in attrs) + { + MetaViewWrappers.IControl mycontrol = null; + //Try each view + foreach (MyClasses.MetaViewWrappers.IView v in info.Views) + { + try + { + mycontrol = v[attr.Control]; + } + catch { } + if (mycontrol != null) + break; + } + + if (mycontrol == null) + throw new Exception("Invalid control reference \"" + attr.Control + "\""); + + EventInfo ei = mycontrol.GetType().GetEvent(attr.EventName); + ei.AddEventHandler(mycontrol, Delegate.CreateDelegate(ei.EventHandlerType, ViewObj, mi.Name)); + } + } + } + + public static void WireupEnd(object ViewObj) + { + if (!VInfo.ContainsKey(ViewObj)) + return; + + foreach (MyClasses.MetaViewWrappers.IView v in VInfo[ViewObj].Views) + v.Dispose(); + + VInfo.Remove(ViewObj); + } + } +} \ No newline at end of file diff --git a/MosswartMassacre/VtankControl.cs b/MosswartMassacre/VtankControl.cs index 7b5e4d6..686dcbb 100644 --- a/MosswartMassacre/VtankControl.cs +++ b/MosswartMassacre/VtankControl.cs @@ -104,125 +104,5 @@ namespace MosswartMassacre { return vTank.Instance.MacroEnabled; } - - /// - /// Advances VTank to the next waypoint in the current navigation route. - /// - /// - /// 1 if the waypoint was advanced successfully; 0 on failure. - /// - public static double VtAdvanceWaypoint() - { - try - { - var externalInterface = vTank.Instance; - - // Basic validation - if (externalInterface.NavNumPoints == 0) - { - return 0; // No waypoints - } - - int currentWaypoint = externalInterface.NavCurrent; - int totalWaypoints = externalInterface.NavNumPoints; - - // Check if we can advance - if (currentWaypoint >= totalWaypoints - 1) - { - return 0; // Already at last waypoint - } - - // Check navigation type - var navType = (int)externalInterface.NavType; - if (navType == 2 || navType == 4) // Target or Once - { - return 0; - } - - // Access the cExternalInterfaceTrustedRelay and get the PC (PluginCore) reference - // From decompiled code: external interface uses PC.NavCurrent which references dz.o.l - var interfaceType = externalInterface.GetType(); - - // Look for any way to get to the PluginCore instance - // The interface should have access to PC or some way to reach it - - // Try to get the underlying assembly and find the PC static field - var assembly = interfaceType.Assembly; - var pluginCoreType = assembly.GetType("uTank2.PluginCore"); - - if (pluginCoreType != null) - { - // Get the static PC field - var pcField = pluginCoreType.GetField("PC", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); - - if (pcField != null) - { - var pluginCoreInstance = pcField.GetValue(null); - - if (pluginCoreInstance != null) - { - // Try to call the advance method 'i' on the PluginCore instance - // Need to specify parameter types to avoid "Ambiguous match found" - Type[] parameterTypes = new Type[] { typeof(object), assembly.GetType("MetaViewWrappers.MVControlEventArgs") }; - var advanceMethod = pluginCoreType.GetMethod("i", - System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, - null, parameterTypes, null); - - if (advanceMethod != null) - { - // Call with parameters matching: i(object A_0, MVControlEventArgs A_1) - advanceMethod.Invoke(pluginCoreInstance, new object[] { null, null }); - return 1; - } - } - } - - // Fallback: try to access dz static field directly - var dzField = pluginCoreType.GetField("dz", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); - - if (dzField != null) - { - var dzObject = dzField.GetValue(null); - - if (dzObject != null) - { - // Navigate the dz.o.l path - var dzType = dzObject.GetType(); - var oField = dzType.GetField("o", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - - if (oField != null) - { - var oObject = oField.GetValue(dzObject); - if (oObject != null) - { - var oType = oObject.GetType(); - var lField = oType.GetField("l", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - - if (lField != null) - { - // Get current value and increment it - int current = (int)lField.GetValue(oObject); - current++; - if (current >= totalWaypoints) - { - current = totalWaypoints - 1; - } - lField.SetValue(oObject, current); - return 1; - } - } - } - } - } - } - - return 0; - } - catch (System.Exception ex) - { - PluginCore.WriteToChat("VTank advance error: " + ex.Message); - return 0; - } - } } } diff --git a/MosswartMassacre/WebSocket.cs b/MosswartMassacre/WebSocket.cs deleted file mode 100644 index 50279d5..0000000 --- a/MosswartMassacre/WebSocket.cs +++ /dev/null @@ -1,375 +0,0 @@ -// WebSocket.cs -using System; -using System.Collections.Generic; -using System.Net.WebSockets; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Decal.Adapter; -using Newtonsoft.Json; -using uTank2; - -namespace MosswartMassacre -{ - internal static class SessionInfo - { - - internal static readonly Guid Guid = Guid.NewGuid(); - - internal static readonly string GuidString = Guid.ToString("N"); - } - // 1) The envelope type for incoming commands - public class CommandEnvelope - { - [JsonProperty("player_name")] - public string PlayerName { get; set; } - - [JsonProperty("command")] - public string Command { get; set; } - } - - public static class WebSocket - { - // ─── configuration ────────────────────────── - private static readonly Uri WsEndpoint = new Uri("wss://overlord.snakedesert.se/websocket/"); - private const string SharedSecret = "your_shared_secret"; - private const int IntervalSec = 5; - private static string SessionId = ""; - - // ─── cached prismatic taper count ─── (now handled by PluginCore event system) - - // ─── runtime state ────────────────────────── - private static ClientWebSocket _ws; - private static CancellationTokenSource _cts; - private static bool _enabled; - private static readonly SemaphoreSlim _sendLock = new SemaphoreSlim(1, 1); - - /// - /// Fires when a valid CommandEnvelope arrives for this character. - /// - public static event Action OnServerCommand; - - // ─── public API ───────────────────────────── - - public static void Start() - { - if (_enabled) return; - _enabled = true; - _cts = new CancellationTokenSource(); - - PluginCore.WriteToChat("[WebSocket] connecting…"); - _ = Task.Run(ConnectAndLoopAsync); - - } - - public static void Stop() - { - if (!_enabled) return; - _enabled = false; - - _cts.Cancel(); - _ws?.Abort(); - _ws?.Dispose(); - _ws = null; - - PluginCore.WriteToChat("[WebSocket] DISABLED"); - } - - // ─── connect / receive / telemetry loop ────────────────────── - - private static async Task ConnectAndLoopAsync() - { - while (_enabled && !_cts.IsCancellationRequested) - { - try - { - // 1) Establish connection - _ws = new ClientWebSocket(); - _ws.Options.SetRequestHeader("X-Plugin-Secret", SharedSecret); - await _ws.ConnectAsync(WsEndpoint, _cts.Token); - PluginCore.WriteToChat("[WebSocket] CONNECTED"); - SessionId = $"{CoreManager.Current.CharacterFilter.Name}-{DateTime.UtcNow:yyyyMMdd-HHmmss}"; - - // ─── Register this socket under our character name ─── - var registerEnvelope = new - { - type = "register", - player_name = CoreManager.Current.CharacterFilter.Name - }; - var regJson = JsonConvert.SerializeObject(registerEnvelope); - await SendEncodedAsync(regJson, _cts.Token); - PluginCore.WriteToChat("[WebSocket] REGISTERED"); - - var buffer = new byte[4096]; - - // 2) Fire-and-forget receive loop - var receiveTask = Task.Run(async () => - { - while (_ws.State == WebSocketState.Open && !_cts.Token.IsCancellationRequested) - { - WebSocketReceiveResult result; - try - { - result = await _ws.ReceiveAsync(new ArraySegment(buffer), _cts.Token); - } - catch (OperationCanceledException) - { - break; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[WebSocket] receive error: {ex.Message}"); - break; - } - - if (result.MessageType == WebSocketMessageType.Close) - break; - - var msg = Encoding.UTF8.GetString(buffer, 0, result.Count).Trim(); - - // 3) Parse into CommandEnvelope - CommandEnvelope env; - try - { - env = JsonConvert.DeserializeObject(msg); - } - catch (JsonException) - { - continue; // skip malformed JSON - } - - // 4) Filter by this character name - if (string.Equals( - env.PlayerName, - CoreManager.Current.CharacterFilter.Name, - StringComparison.OrdinalIgnoreCase)) - { - // Fire event immediately - let PluginCore handle threading - OnServerCommand?.Invoke(env); - } - } - }); - - // 5) Inline telemetry loop - PluginCore.WriteToChat("[WebSocket] Starting telemetry loop"); - while (_ws.State == WebSocketState.Open && !_cts.Token.IsCancellationRequested) - { - try - { - var json = BuildPayloadJson(); - await SendEncodedAsync(json, _cts.Token); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[WebSocket] Telemetry failed: {ex.Message}"); - break; // Exit telemetry loop on failure - } - - try - { - await Task.Delay(TimeSpan.FromSeconds(IntervalSec), _cts.Token); - } - catch (OperationCanceledException) - { - PluginCore.WriteToChat("[WebSocket] Telemetry loop cancelled"); - break; - } - } - - // Log why telemetry loop exited - PluginCore.WriteToChat($"[WebSocket] Telemetry loop ended - State: {_ws?.State}, Cancelled: {_cts.Token.IsCancellationRequested}"); - - // Wait for receive loop to finish - await receiveTask; - } - catch (OperationCanceledException) - { - PluginCore.WriteToChat("[WebSocket] Connection cancelled"); - break; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[WebSocket] Connection error: {ex.Message}"); - } - finally - { - var finalState = _ws?.State.ToString() ?? "null"; - PluginCore.WriteToChat($"[WebSocket] Cleaning up connection - Final state: {finalState}"); - _ws?.Abort(); - _ws?.Dispose(); - _ws = null; - } - - // Pause before reconnecting - if (_enabled) - { - PluginCore.WriteToChat("[WebSocket] Reconnecting in 2 seconds..."); - try { await Task.Delay(2000, CancellationToken.None); } catch { } - } - } - } - - - // ─── fire-and-forget chat sender ──────────────────── - - public static async Task SendChatTextAsync(int colorIndex, string chatText) - { - var envelope = new - { - type = "chat", - timestamp = DateTime.UtcNow.ToString("o"), - character_name = CoreManager.Current.CharacterFilter.Name, - text = chatText, - color = colorIndex - - }; - var json = JsonConvert.SerializeObject(envelope); - await SendEncodedAsync(json, CancellationToken.None); - } - public static async Task SendSpawnAsync(string nsCoord, string ewCoord, string zCoord, string monster) - { - var envelope = new - { - type = "spawn", - timestamp = DateTime.UtcNow.ToString("o"), - character_name = CoreManager.Current.CharacterFilter.Name, - mob = monster, - ns = nsCoord, - ew = ewCoord, - z = zCoord - }; - var json = JsonConvert.SerializeObject(envelope); - await SendEncodedAsync(json, CancellationToken.None); - } - - public static async Task SendPortalAsync(string nsCoord, string ewCoord, string zCoord, string portalName) - { - var envelope = new - { - type = "portal", - timestamp = DateTime.UtcNow.ToString("o"), - character_name = CoreManager.Current.CharacterFilter.Name, - portal_name = portalName, - ns = nsCoord, - ew = ewCoord, - z = zCoord - }; - var json = JsonConvert.SerializeObject(envelope); - await SendEncodedAsync(json, CancellationToken.None); - } - public static async Task SendRareAsync(string rare) - { - var coords = Coordinates.Me; - var envelope = new - { - type = "rare", - timestamp = DateTime.UtcNow.ToString("o"), - character_name = CoreManager.Current.CharacterFilter.Name, - name = rare, - ew = coords.EW, - ns = coords.NS, - z = coords.Z - - }; - var json = JsonConvert.SerializeObject(envelope); - await SendEncodedAsync(json, CancellationToken.None); - } - - public static async Task SendFullInventoryAsync(List inventory) - { - var envelope = new - { - type = "full_inventory", - timestamp = DateTime.UtcNow.ToString("o"), - character_name = CoreManager.Current.CharacterFilter.Name, - item_count = inventory.Count, - items = inventory - - }; - var json = JsonConvert.SerializeObject(envelope); - await SendEncodedAsync(json, CancellationToken.None); - } - - public static async Task SendVitalsAsync(object vitalsData) - { - var json = JsonConvert.SerializeObject(vitalsData); - await SendEncodedAsync(json, CancellationToken.None); - } - - public static async Task SendQuestDataAsync(string questName, string countdown) - { - var envelope = new - { - type = "quest", - timestamp = DateTime.UtcNow.ToString("o"), - character_name = CoreManager.Current.CharacterFilter.Name, - quest_name = questName, - countdown = countdown - }; - var json = JsonConvert.SerializeObject(envelope); - await SendEncodedAsync(json, CancellationToken.None); - } - - // ─── shared send helper with locking ─────────────── - - private static async Task SendEncodedAsync(string text, CancellationToken token) - { - await _sendLock.WaitAsync(token); - try - { - if (_ws == null || _ws.State != WebSocketState.Open) - return; - - var bytes = Encoding.UTF8.GetBytes(text); - await _ws.SendAsync(new ArraySegment(bytes), - WebSocketMessageType.Text, - true, - token); - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[WebSocket] Send error: {ex.Message}"); - _ws?.Abort(); - _ws?.Dispose(); - _ws = null; - } - finally - { - _sendLock.Release(); - } - } - - // ─── payload builder ────────────────────────────── - - // Removed old cache system - now using PluginCore.cachedPrismaticCount - - private static string BuildPayloadJson() - { - var tele = new ClientTelemetry(); - var coords = Coordinates.Me; - var payload = new - { - type = "telemetry", - character_name = CoreManager.Current.CharacterFilter.Name, - char_tag = PluginCore.CharTag, - session_id = SessionInfo.GuidString, - timestamp = DateTime.UtcNow.ToString("o"), - ew = coords.EW, - ns = coords.NS, - z = coords.Z, - kills = PluginCore.totalKills, - kills_per_hour = PluginCore.killsPerHour.ToString("F0"), - onlinetime = (DateTime.Now - PluginCore.statsStartTime).ToString(@"dd\.hh\:mm\:ss"), - deaths = PluginCore.sessionDeaths.ToString(), - total_deaths = PluginCore.totalDeaths.ToString(), - prismatic_taper_count = PluginCore.cachedPrismaticCount.ToString(), - vt_state = VtankControl.VtGetMetaState(), - mem_mb = tele.MemoryBytes, - cpu_pct = tele.GetCpuUsage(), - mem_handles = tele.HandleCount - - }; - return JsonConvert.SerializeObject(payload); - } - } -} diff --git a/MosswartMassacre/Wrapper.cs b/MosswartMassacre/Wrapper.cs new file mode 100644 index 0000000..7cca722 --- /dev/null +++ b/MosswartMassacre/Wrapper.cs @@ -0,0 +1,427 @@ +/////////////////////////////////////////////////////////////////////////////// +//File: Wrapper.cs +// +//Description: Contains the interface definitions for the MetaViewWrappers classes. +// +//References required: +// System.Drawing +// +//This file is Copyright (c) 2010 VirindiPlugins +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Text; + +#if METAVIEW_PUBLIC_NS +namespace MetaViewWrappers +#else +namespace MyClasses.MetaViewWrappers +#endif +{ +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + delegate void dClickedList(object sender, int row, int col); + + + #region EventArgs Classes + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVControlEventArgs : EventArgs + { + private int id; + + internal MVControlEventArgs(int ID) + { + this.id = ID; + } + + public int Id + { + get { return this.id; } + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVIndexChangeEventArgs : MVControlEventArgs + { + private int index; + + internal MVIndexChangeEventArgs(int ID, int Index) + : base(ID) + { + this.index = Index; + } + + public int Index + { + get { return this.index; } + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVListSelectEventArgs : MVControlEventArgs + { + private int row; + private int col; + + internal MVListSelectEventArgs(int ID, int Row, int Column) + : base(ID) + { + this.row = Row; + this.col = Column; + } + + public int Row + { + get { return this.row; } + } + + public int Column + { + get { return this.col; } + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVCheckBoxChangeEventArgs : MVControlEventArgs + { + private bool check; + + internal MVCheckBoxChangeEventArgs(int ID, bool Check) + : base(ID) + { + this.check = Check; + } + + public bool Checked + { + get { return this.check; } + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVTextBoxChangeEventArgs : MVControlEventArgs + { + private string text; + + internal MVTextBoxChangeEventArgs(int ID, string text) + : base(ID) + { + this.text = text; + } + + public string Text + { + get { return this.text; } + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class MVTextBoxEndEventArgs : MVControlEventArgs + { + private bool success; + + internal MVTextBoxEndEventArgs(int ID, bool success) + : base(ID) + { + this.success = success; + } + + public bool Success + { + get { return this.success; } + } + } + + #endregion EventArgs Classes + + + #region View + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IView: IDisposable + { + void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML); + void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML); + void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey); + void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey); + + void SetIcon(int icon, int iconlibrary); + void SetIcon(int portalicon); + + string Title { get; set; } + bool Visible { get; set; } +#if !VVS_WRAPPERS_PUBLIC + ViewSystemSelector.eViewSystem ViewType { get; } +#endif + + System.Drawing.Point Location { get; set; } + System.Drawing.Rectangle Position { get; set; } + System.Drawing.Size Size { get; } + + IControl this[string id] { get; } + + void Activate(); + void Deactivate(); + bool Activated { get; set; } + } + + #endregion View + + #region Controls + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IControl : IDisposable + { + string Name { get; } + bool Visible { get; set; } + string TooltipText { get; set;} + int Id { get; } + System.Drawing.Rectangle LayoutPosition { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IButton : IControl + { + string Text { get; set; } + event EventHandler Hit; + event EventHandler Click; + System.Drawing.Color TextColor { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface ICheckBox : IControl + { + string Text { get; set; } + bool Checked { get; set; } + event EventHandler Change; + event EventHandler Change_Old; + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface ITextBox : IControl + { + string Text { get; set; } + event EventHandler Change; + event EventHandler Change_Old; + event EventHandler End; + int Caret { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface ICombo : IControl + { + IComboIndexer Text { get; } + IComboDataIndexer Data { get; } + int Count { get; } + int Selected { get; set; } + event EventHandler Change; + event EventHandler Change_Old; + void Add(string text); + void Add(string text, object obj); + void Insert(int index, string text); + void RemoveAt(int index); + void Remove(int index); + void Clear(); + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IComboIndexer + { + string this[int index] { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IComboDataIndexer + { + object this[int index] { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface ISlider : IControl + { + int Position { get; set; } + event EventHandler Change; + event EventHandler Change_Old; + int Maximum { get; set; } + int Minimum { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IList : IControl + { + event EventHandler Selected; + event dClickedList Click; + void Clear(); + IListRow this[int row] { get; } + IListRow AddRow(); + IListRow Add(); + IListRow InsertRow(int pos); + IListRow Insert(int pos); + int RowCount { get; } + void RemoveRow(int index); + void Delete(int index); + int ColCount { get; } + int ScrollPosition { get; set;} + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IListRow + { + IListCell this[int col] { get; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IListCell + { + System.Drawing.Color Color { get; set; } + int Width { get; set; } + object this[int subval] { get; set; } + void ResetColor(); + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IStaticText : IControl + { + string Text { get; set; } + event EventHandler Click; + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface INotebook : IControl + { + event EventHandler Change; + int ActiveTab { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IProgressBar : IControl + { + int Position { get; set; } + int Value { get; set; } + string PreText { get; set; } + int MaxValue { get; set; } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + interface IImageButton : IControl + { + event EventHandler Click; + void SetImages(int unpressed, int pressed); + void SetImages(int hmodule, int unpressed, int pressed); + int Background { set; } + System.Drawing.Color Matte { set; } + } + + #endregion Controls +} diff --git a/MosswartMassacre/Wrapper_Decal.cs b/MosswartMassacre/Wrapper_Decal.cs new file mode 100644 index 0000000..a917ca8 --- /dev/null +++ b/MosswartMassacre/Wrapper_Decal.cs @@ -0,0 +1,1120 @@ +/////////////////////////////////////////////////////////////////////////////// +//File: Wrapper_Decal.cs +// +//Description: Contains MetaViewWrapper classes implementing Decal views. +// +//References required: +// System.Drawing +// Decal.Adapter +// +//This file is Copyright (c) 2010 VirindiPlugins +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Text; + +#if METAVIEW_PUBLIC_NS +namespace MetaViewWrappers.DecalControls +#else +namespace MyClasses.MetaViewWrappers.DecalControls +#endif + +{ +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class View : IView + { + Decal.Adapter.Wrappers.ViewWrapper myView; + public Decal.Adapter.Wrappers.ViewWrapper Underlying { get { return myView; } } + + #region IView Members + + public void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML) + { + myView = p.LoadViewResource(pXML); + } + + public void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML) + { + myView = p.LoadView(pXML); + } + + public void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey) + { + myView = p.LoadViewResource(pXML); + } + + public void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey) + { + myView = p.LoadView(pXML); + } + + public void SetIcon(int icon, int iconlibrary) + { + myView.SetIcon(icon, iconlibrary); + } + + public void SetIcon(int portalicon) + { + //throw new Exception("The method or operation is not implemented."); + } + + public string Title + { + get + { + return myView.Title; + } + set + { + myView.Title = value; + } + } + + public bool Visible + { + get + { + return myView.Activated; + } + set + { + myView.Activated = value; + } + } + + public bool Activated + { + get + { + return Visible; + } + set + { + Visible = value; + } + } + + public void Activate() + { + Visible = true; + } + + public void Deactivate() + { + Visible = false; + } + + public System.Drawing.Point Location + { + get + { + return new System.Drawing.Point(myView.Position.X, myView.Position.Y); + } + set + { + int w = myView.Position.Width; + int h = myView.Position.Height; + myView.Position = new System.Drawing.Rectangle(value.X, value.Y, w, h); + } + } + + public System.Drawing.Rectangle Position + { + get + { + return myView.Position; + } + set + { + myView.Position = value; + } + } + + public System.Drawing.Size Size + { + get + { + return new System.Drawing.Size(myView.Position.Width, myView.Position.Height); + } + } + +#if VVS_WRAPPERS_PUBLIC + internal +#else + public +#endif + ViewSystemSelector.eViewSystem ViewType { get { return ViewSystemSelector.eViewSystem.DecalInject; } } + Dictionary CreatedControlsByName = new Dictionary(); + + public IControl this[string id] + { + get + { + if (CreatedControlsByName.ContainsKey(id)) return CreatedControlsByName[id]; + + Control ret = null; + Decal.Adapter.Wrappers.IControlWrapper iret = myView.Controls[id]; + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.PushButtonWrapper)) + ret = new Button(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.CheckBoxWrapper)) + ret = new CheckBox(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.TextBoxWrapper)) + ret = new TextBox(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.ChoiceWrapper)) + ret = new Combo(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.SliderWrapper)) + ret = new Slider(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.ListWrapper)) + ret = new List(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.StaticWrapper)) + ret = new StaticText(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.NotebookWrapper)) + ret = new Notebook(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.ProgressWrapper)) + ret = new ProgressBar(); + if (iret.GetType() == typeof(Decal.Adapter.Wrappers.ButtonWrapper)) + ret = new ImageButton(); + + if (ret == null) return null; + + ret.myControl = iret; + ret.myName = id; + ret.Initialize(); + allocatedcontrols.Add(ret); + CreatedControlsByName[id] = ret; + return ret; + } + } + + List allocatedcontrols = new List(); + + #endregion + + #region IDisposable Members + + bool disposed = false; + public void Dispose() + { + if (disposed) return; + disposed = true; + GC.SuppressFinalize(this); + + foreach (Control c in allocatedcontrols) + c.Dispose(); + + myView.Dispose(); + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Control : IControl + { + internal Decal.Adapter.Wrappers.IControlWrapper myControl; + public Decal.Adapter.Wrappers.IControlWrapper Underlying { get { return myControl; } } + internal string myName; + + public virtual void Initialize() + { + + } + + #region IControl Members + + public string Name + { + get { return myName; } + } + + public bool Visible + { + get { return true; } + set { } + } + + public string TooltipText + { + get + { + return ""; + } + set + { + + } + } + + public int Id + { + get + { + return myControl.Id; + } + } + + public System.Drawing.Rectangle LayoutPosition + { + get + { +#if DECAL_INTEROP + //This is kinda bad, but whatever + Decal.Interop.Inject.ILayer Ly = (Decal.Interop.Inject.ILayer)(Underlying.Underlying); + Decal.Interop.Core.tagRECT rct = Ly.get_Position(); + return new System.Drawing.Rectangle(rct.left, rct.top, rct.right - rct.left, rct.bottom - rct.top); +#else +#warning DECAL_INTEROP not defined, MetaViewWrappers.DecalControls.Control.LayoutPosition will not be available. + return new System.Drawing.Rectangle(); +#endif + } + set + { +#if DECAL_INTEROP + Decal.Interop.Inject.ILayer Ly = (Decal.Interop.Inject.ILayer)(Underlying.Underlying); + Decal.Interop.Core.tagRECT rct = new Decal.Interop.Core.tagRECT(); + rct.left = value.Left; + rct.top = value.Top; + rct.right = value.Right; + rct.bottom = value.Bottom; + Ly.set_Position(ref rct); +#endif + } + } + + #endregion + + #region IDisposable Members + + bool disposed = false; + public virtual void Dispose() + { + if (disposed) return; + disposed = true; + + //myControl.Dispose(); + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Button : Control, IButton + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Hit += new EventHandler(Button_Hit); + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Click += new EventHandler(Button_Click); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Hit -= new EventHandler(Button_Hit); + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Click -= new EventHandler(Button_Click); + } + + void Button_Hit(object sender, Decal.Adapter.ControlEventArgs e) + { + if (Hit != null) + Hit(this, null); + } + + void Button_Click(object sender, Decal.Adapter.ControlEventArgs e) + { + if (Click != null) + Click(this, new MVControlEventArgs(this.Id)); + } + + #region IButton Members + + public string Text + { + get + { + return ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Text; + //throw new Exception("The method or operation is not implemented."); + } + set + { + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).Text = value; + //throw new Exception("The method or operation is not implemented."); + } + } + + public System.Drawing.Color TextColor + { + get + { + return ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).TextColor; + } + set + { + ((Decal.Adapter.Wrappers.PushButtonWrapper)myControl).TextColor = value; + } + } + + public event EventHandler Hit; + public event EventHandler Click; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class CheckBox : Control, ICheckBox + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Change += new EventHandler(CheckBox_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Change -= new EventHandler(CheckBox_Change); + } + + void CheckBox_Change(object sender, Decal.Adapter.CheckBoxChangeEventArgs e) + { + if (Change != null) + Change(this, new MVCheckBoxChangeEventArgs(this.Id, Checked)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ICheckBox Members + + public string Text + { + get + { + return ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Text; + } + set + { + ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Text = value; + } + } + + public bool Checked + { + get + { + return ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Checked; + } + set + { + ((Decal.Adapter.Wrappers.CheckBoxWrapper)myControl).Checked = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class TextBox : Control, ITextBox + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Change += new EventHandler(TextBox_Change); + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).End += new EventHandler(TextBox_End); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Change -= new EventHandler(TextBox_Change); + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).End -= new EventHandler(TextBox_End); + } + + void TextBox_Change(object sender, Decal.Adapter.TextBoxChangeEventArgs e) + { + if (Change != null) + Change(this, new MVTextBoxChangeEventArgs(this.Id, e.Text)); + if (Change_Old != null) + Change_Old(this, null); + } + + void TextBox_End(object sender, Decal.Adapter.TextBoxEndEventArgs e) + { + if (End != null) + End(this, new MVTextBoxEndEventArgs(this.Id, e.Success)); + } + + #region ITextBox Members + + public string Text + { + get + { + return ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Text; + } + set + { + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Text = value; + } + } + + public int Caret + { + get + { + return ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Caret; + } + set + { + ((Decal.Adapter.Wrappers.TextBoxWrapper)myControl).Caret = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + public event EventHandler End; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Combo : Control, ICombo + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Change += new EventHandler(Combo_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Change -= new EventHandler(Combo_Change); + } + + void Combo_Change(object sender, Decal.Adapter.IndexChangeEventArgs e) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, e.Index)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ICombo Members + + public IComboIndexer Text + { + get + { + return new ComboIndexer(this); + } + } + + public IComboDataIndexer Data + { + get + { + return new ComboDataIndexer(this); + } + } + + public int Count + { + get + { + return ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Count; + } + } + + public int Selected + { + get + { + return ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Selected; + } + set + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Selected = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + public void Add(string text) + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Add(text, null); + } + + public void Add(string text, object obj) + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Add(text, obj); + } + + public void Insert(int index, string text) + { + throw new Exception("The method or operation is not implemented."); + } + + public void RemoveAt(int index) + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Remove(index); + } + + public void Remove(int index) + { + RemoveAt(index); + } + + public void Clear() + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myControl).Clear(); + } + + #endregion + + internal class ComboIndexer: IComboIndexer + { + Combo myCombo; + internal ComboIndexer(Combo c) + { + myCombo = c; + } + + #region IComboIndexer Members + + public string this[int index] + { + get + { + return ((Decal.Adapter.Wrappers.ChoiceWrapper)myCombo.myControl).Text[index]; + } + set + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myCombo.myControl).Text[index] = value; + } + } + + #endregion + } + + internal class ComboDataIndexer : IComboDataIndexer + { + Combo myCombo; + internal ComboDataIndexer(Combo c) + { + myCombo = c; + } + + #region IComboIndexer Members + + public object this[int index] + { + get + { + return ((Decal.Adapter.Wrappers.ChoiceWrapper)myCombo.myControl).Data[index]; + } + set + { + ((Decal.Adapter.Wrappers.ChoiceWrapper)myCombo.myControl).Data[index] = value; + } + } + + #endregion + } + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Slider : Control, ISlider + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Change += new EventHandler(Slider_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Change -= new EventHandler(Slider_Change); + } + + void Slider_Change(object sender, Decal.Adapter.IndexChangeEventArgs e) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, e.Index)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ISlider Members + + public int Position + { + get + { + return ((Decal.Adapter.Wrappers.SliderWrapper)myControl).SliderPostition; + } + set + { + ((Decal.Adapter.Wrappers.SliderWrapper)myControl).SliderPostition = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + public int Maximum + { + get + { + return ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Maximum; + } + set + { + ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Maximum = value; + } + } + public int Minimum + { + get + { + return ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Minimum; + } + set + { + ((Decal.Adapter.Wrappers.SliderWrapper)myControl).Minimum = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class List : Control, IList + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Selected += new EventHandler(List_Selected); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Selected -= new EventHandler(List_Selected); + } + + void List_Selected(object sender, Decal.Adapter.ListSelectEventArgs e) + { + if (Click != null) + Click(this, e.Row, e.Column); + if (Selected != null) + Selected(this, new MVListSelectEventArgs(this.Id, e.Row, e.Column)); + } + + #region IList Members + + public event dClickedList Click; + public event EventHandler Selected; + + public void Clear() + { + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Clear(); + } + + public IListRow this[int row] + { + get + { + return new ListRow(this, row); + } + } + + public IListRow AddRow() + { + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Add(); + return new ListRow(this, ((Decal.Adapter.Wrappers.ListWrapper)myControl).RowCount - 1); + } + + public IListRow Add() + { + return AddRow(); + } + + public IListRow InsertRow(int pos) + { + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Insert(pos); + return new ListRow(this, pos); + } + + public IListRow Insert(int pos) + { + return InsertRow(pos); + } + + public int RowCount + { + get { return ((Decal.Adapter.Wrappers.ListWrapper)myControl).RowCount; } + } + + public void RemoveRow(int index) + { + ((Decal.Adapter.Wrappers.ListWrapper)myControl).Delete(index); + } + + public void Delete(int index) + { + RemoveRow(index); + } + + public int ColCount + { + get + { + return ((Decal.Adapter.Wrappers.ListWrapper)myControl).ColCount; + } + } + + public int ScrollPosition + { + get + { + return ((Decal.Adapter.Wrappers.ListWrapper)myControl).ScrollPosition; + } + set + { + ((Decal.Adapter.Wrappers.ListWrapper)myControl).ScrollPosition = value; + } + } + + #endregion + + public class ListRow : IListRow + { + internal List myList; + internal int myRow; + internal ListRow(List l, int r) + { + myList = l; + myRow = r; + } + + + #region IListRow Members + + public IListCell this[int col] + { + get { return new ListCell(myList, myRow, col); } + } + + #endregion + } + + public class ListCell : IListCell + { + internal List myList; + internal int myRow; + internal int myCol; + public ListCell(List l, int r, int c) + { + myList = l; + myRow = r; + myCol = c; + } + + #region IListCell Members + + public void ResetColor() + { + Color = System.Drawing.Color.White; + } + + public System.Drawing.Color Color + { + get + { + return ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol].Color; + } + set + { + ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol].Color = value; + } + } + + public int Width + { + get + { + return ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol].Width; + } + set + { + ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol].Width = value; + } + } + + public object this[int subval] + { + get + { + return ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol][subval]; + } + set + { + ((Decal.Adapter.Wrappers.ListWrapper)myList.myControl)[myRow][myCol][subval] = value; + } + } + + #endregion + } + + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class StaticText : Control, IStaticText + { + + #region IStaticText Members + + public string Text + { + get + { + return ((Decal.Adapter.Wrappers.StaticWrapper)myControl).Text; + } + set + { + ((Decal.Adapter.Wrappers.StaticWrapper)myControl).Text = value; + } + } + +#pragma warning disable 0067 + public event EventHandler Click; +#pragma warning restore 0067 + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Notebook : Control, INotebook + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.NotebookWrapper)myControl).Change += new EventHandler(Notebook_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.NotebookWrapper)myControl).Change -= new EventHandler(Notebook_Change); + } + + void Notebook_Change(object sender, Decal.Adapter.IndexChangeEventArgs e) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, e.Index)); + } + + #region INotebook Members + + public event EventHandler Change; + + public int ActiveTab + { + get + { + return ((Decal.Adapter.Wrappers.NotebookWrapper)myControl).ActiveTab; + } + set + { + ((Decal.Adapter.Wrappers.NotebookWrapper)myControl).ActiveTab = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class ProgressBar : Control, IProgressBar + { + + #region IProgressBar Members + + public int Position + { + get + { + return ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).Value; + } + set + { + ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).Value = value; + } + } + + public int Value + { + get + { + return Position; + } + set + { + Position = value; + } + } + + public string PreText + { + get + { + return ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).PreText; + } + set + { + ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).PreText = value; + } + } + + public int MaxValue + { + get + { + return ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).MaxValue; + } + set + { + ((Decal.Adapter.Wrappers.ProgressWrapper)myControl).MaxValue = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class ImageButton : Control, IImageButton + { + public override void Initialize() + { + base.Initialize(); + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).Click += new EventHandler(ImageButton_Click); + } + + public override void Dispose() + { + base.Dispose(); + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).Click -= new EventHandler(ImageButton_Click); + } + + void ImageButton_Click(object sender, Decal.Adapter.ControlEventArgs e) + { + if (Click != null) + Click(this, new MVControlEventArgs(this.Id)); + } + + + #region IImageButton Members + + public event EventHandler Click; + + public void SetImages(int unpressed, int pressed) + { + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).SetImages(unpressed, pressed); + } + + public void SetImages(int hmodule, int unpressed, int pressed) + { + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).SetImages(hmodule, unpressed, pressed); + } + + public int Background + { + set + { + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).Background = value; + } + } + + public System.Drawing.Color Matte + { + set + { + ((Decal.Adapter.Wrappers.ButtonWrapper)myControl).Matte = value; + } + } + + #endregion + } +} + diff --git a/MosswartMassacre/Wrapper_MyHuds.cs b/MosswartMassacre/Wrapper_MyHuds.cs new file mode 100644 index 0000000..e2e097f --- /dev/null +++ b/MosswartMassacre/Wrapper_MyHuds.cs @@ -0,0 +1,1225 @@ +/////////////////////////////////////////////////////////////////////////////// +//File: Wrapper_MyHuds.cs +// +//Description: Contains MetaViewWrapper classes implementing Virindi View Service +// views. These classes are only compiled if the VVS_REFERENCED symbol is defined. +// +//References required: +// System.Drawing +// VirindiViewService (if VVS_REFERENCED is defined) +// +//This file is Copyright (c) 2010 VirindiPlugins +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////// + +#if VVS_REFERENCED + +using System; +using System.Collections.Generic; +using System.Text; +using VirindiViewService; + +#if METAVIEW_PUBLIC_NS +namespace MetaViewWrappers.VirindiViewServiceHudControls +#else +namespace MyClasses.MetaViewWrappers.VirindiViewServiceHudControls +#endif +{ +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class View : IView + { + HudView myView; + public HudView Underlying { get { return myView; } } + + #region IView Members + + public void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML) + { + VirindiViewService.XMLParsers.Decal3XMLParser ps = new VirindiViewService.XMLParsers.Decal3XMLParser(); + ViewProperties iprop; + ControlGroup igroup; + ps.ParseFromResource(pXML, out iprop, out igroup); + myView = new VirindiViewService.HudView(iprop, igroup); + } + + public void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML) + { + VirindiViewService.XMLParsers.Decal3XMLParser ps = new VirindiViewService.XMLParsers.Decal3XMLParser(); + ViewProperties iprop; + ControlGroup igroup; + ps.Parse(pXML, out iprop, out igroup); + myView = new VirindiViewService.HudView(iprop, igroup); + } + + public void Initialize(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey) + { + VirindiViewService.XMLParsers.Decal3XMLParser ps = new VirindiViewService.XMLParsers.Decal3XMLParser(); + ViewProperties iprop; + ControlGroup igroup; + ps.ParseFromResource(pXML, out iprop, out igroup); + myView = new VirindiViewService.HudView(iprop, igroup, pWindowKey); + } + + public void InitializeRawXML(Decal.Adapter.Wrappers.PluginHost p, string pXML, string pWindowKey) + { + VirindiViewService.XMLParsers.Decal3XMLParser ps = new VirindiViewService.XMLParsers.Decal3XMLParser(); + ViewProperties iprop; + ControlGroup igroup; + ps.Parse(pXML, out iprop, out igroup); + myView = new VirindiViewService.HudView(iprop, igroup, pWindowKey); + } + + public void SetIcon(int icon, int iconlibrary) + { + myView.Icon = ACImage.FromIconLibrary(icon, iconlibrary); + } + + public void SetIcon(int portalicon) + { + myView.Icon = portalicon; + } + + public string Title + { + get + { + return myView.Title; + } + set + { + myView.Title = value; + } + } + + public bool Visible + { + get + { + return myView.Visible; + } + set + { + myView.Visible = value; + } + } + + public bool Activated + { + get + { + return Visible; + } + set + { + Visible = value; + } + } + + public void Activate() + { + Visible = true; + } + + public void Deactivate() + { + Visible = false; + } + + public System.Drawing.Point Location + { + get + { + return myView.Location; + } + set + { + myView.Location = value; + } + } + + public System.Drawing.Size Size + { + get + { + return new System.Drawing.Size(myView.Width, myView.Height); + } + } + + public System.Drawing.Rectangle Position + { + get + { + return new System.Drawing.Rectangle(Location, Size); + } + set + { + Location = value.Location; + myView.ClientArea = value.Size; + } + } + +#if VVS_WRAPPERS_PUBLIC + internal +#else + public +#endif + ViewSystemSelector.eViewSystem ViewType { get { return ViewSystemSelector.eViewSystem.VirindiViewService; } } + Dictionary CreatedControlsByName = new Dictionary(); + + public IControl this[string id] + { + get + { + if (CreatedControlsByName.ContainsKey(id)) return CreatedControlsByName[id]; + + Control ret = null; + VirindiViewService.Controls.HudControl iret = myView[id]; + if (iret.GetType() == typeof(VirindiViewService.Controls.HudButton)) + ret = new Button(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudCheckBox)) + ret = new CheckBox(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudTextBox)) + ret = new TextBox(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudCombo)) + ret = new Combo(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudHSlider)) + ret = new Slider(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudList)) + ret = new List(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudStaticText)) + ret = new StaticText(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudTabView)) + ret = new Notebook(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudProgressBar)) + ret = new ProgressBar(); + if (iret.GetType() == typeof(VirindiViewService.Controls.HudImageButton)) + ret = new ImageButton(); + + if (ret == null) return null; + + ret.myControl = iret; + ret.myName = id; + ret.Initialize(); + allocatedcontrols.Add(ret); + CreatedControlsByName[id] = ret; + return ret; + } + } + + #endregion + + #region IDisposable Members + + bool disposed = false; + public void Dispose() + { + if (disposed) return; + disposed = true; + GC.SuppressFinalize(this); + + foreach (Control c in allocatedcontrols) + c.Dispose(); + + myView.Dispose(); + } + + #endregion + + List allocatedcontrols = new List(); + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Control : IControl + { + internal VirindiViewService.Controls.HudControl myControl; + internal string myName; + public VirindiViewService.Controls.HudControl Underlying { get { return myControl; } } + + public virtual void Initialize() + { + + } + + #region IControl Members + + public string Name + { + get { return myName; } + } + + public bool Visible + { + get { return myControl.Visible; } + set { myControl.Visible = value; } + } + + VirindiViewService.TooltipSystem.cTooltipInfo itooltipinfo = null; + public string TooltipText + { + get + { + if (itooltipinfo != null) + return itooltipinfo.Text; + else + return ""; + } + set + { + if (itooltipinfo != null) + { + VirindiViewService.TooltipSystem.RemoveTooltip(itooltipinfo); + itooltipinfo = null; + } + if (!String.IsNullOrEmpty(value)) + { + itooltipinfo = VirindiViewService.TooltipSystem.AssociateTooltip(myControl, value); + } + } + } + + public int Id + { + get + { + return myControl.XMLID; + } + } + + public System.Drawing.Rectangle LayoutPosition + { + get + { + //Relative to what?!??! + if (Underlying.Group.HeadControl == null) + return new System.Drawing.Rectangle(); + + if (Underlying.Group.HeadControl.Name == Underlying.Name) + return new System.Drawing.Rectangle(); + + VirindiViewService.Controls.HudControl myparent = Underlying.Group.ParentOf(Underlying.Name); + + if (myparent == null) + return new System.Drawing.Rectangle(); + + //Position only valid inside fixedlayouts + VirindiViewService.Controls.HudFixedLayout layoutparent = myparent as VirindiViewService.Controls.HudFixedLayout; + + if (layoutparent == null) + return new System.Drawing.Rectangle(); + + return layoutparent.GetControlRect(Underlying); + } + set + { + if (Underlying.Group.HeadControl == null) + return; + + if (Underlying.Group.HeadControl.Name == Underlying.Name) + return; + + VirindiViewService.Controls.HudControl myparent = Underlying.Group.ParentOf(Underlying.Name); + + if (myparent == null) + return; + + //Position only valid inside fixedlayouts + VirindiViewService.Controls.HudFixedLayout layoutparent = myparent as VirindiViewService.Controls.HudFixedLayout; + + if (layoutparent == null) + return; + + layoutparent.SetControlRect(Underlying, value); + } + } + + #endregion + + #region IDisposable Members + + bool disposed = false; + public virtual void Dispose() + { + if (disposed) return; + disposed = true; + + myControl.Dispose(); + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Button : Control, IButton + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudButton)myControl).MouseEvent += new EventHandler(Button_MouseEvent); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudButton)myControl).MouseEvent -= new EventHandler(Button_MouseEvent); + } + + void Button_MouseEvent(object sender, VirindiViewService.Controls.ControlMouseEventArgs e) + { + switch (e.EventType) + { + case VirindiViewService.Controls.ControlMouseEventArgs.MouseEventType.MouseHit: + if (Click != null) + Click(this, new MVControlEventArgs(this.Id)); + return; + case VirindiViewService.Controls.ControlMouseEventArgs.MouseEventType.MouseDown: + if (Hit != null) + Hit(this, null); + return; + } + } + + #region IButton Members + + public string Text + { + get + { + return ((VirindiViewService.Controls.HudButton)myControl).Text; + } + set + { + ((VirindiViewService.Controls.HudButton)myControl).Text = value; + } + } + + public System.Drawing.Color TextColor + { + get + { + return System.Drawing.Color.Black; + } + set + { + + } + } + + public event EventHandler Hit; + public event EventHandler Click; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class CheckBox : Control, ICheckBox + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudCheckBox)myControl).Change += new EventHandler(CheckBox_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudCheckBox)myControl).Change -= new EventHandler(CheckBox_Change); + } + + void CheckBox_Change(object sender, EventArgs e) + { + if (Change != null) + Change(this, new MVCheckBoxChangeEventArgs(this.Id, Checked)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ICheckBox Members + + public string Text + { + get + { + return ((VirindiViewService.Controls.HudCheckBox)myControl).Text; + } + set + { + ((VirindiViewService.Controls.HudCheckBox)myControl).Text = value; + } + } + + public bool Checked + { + get + { + return ((VirindiViewService.Controls.HudCheckBox)myControl).Checked; + } + set + { + ((VirindiViewService.Controls.HudCheckBox)myControl).Checked = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class TextBox : Control, ITextBox + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudTextBox)myControl).Change += new EventHandler(TextBox_Change); + myControl.LostFocus += new EventHandler(myControl_LostFocus); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudTextBox)myControl).Change -= new EventHandler(TextBox_Change); + myControl.LostFocus -= new EventHandler(myControl_LostFocus); + } + + void TextBox_Change(object sender, EventArgs e) + { + if (Change != null) + Change(this, new MVTextBoxChangeEventArgs(this.Id, Text)); + if (Change_Old != null) + Change_Old(this, null); + } + + void myControl_LostFocus(object sender, EventArgs e) + { + if (!myControl.HasFocus) return; + + if (End != null) + End(this, new MVTextBoxEndEventArgs(this.Id, true)); + } + + #region ITextBox Members + + public string Text + { + get + { + return ((VirindiViewService.Controls.HudTextBox)myControl).Text; + } + set + { + ((VirindiViewService.Controls.HudTextBox)myControl).Text = value; + } + } + + public int Caret + { + get + { + return 0; + } + set + { + + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + public event EventHandler End; + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Combo : Control, ICombo + { + List iData = new List(); + + public Combo() + { + //TODO: add data values from the xml + } + + public class ComboIndexer : IComboIndexer + { + Combo underlying; + internal ComboIndexer(Combo c) + { + underlying = c; + } + + #region IComboIndexer Members + + public string this[int index] + { + get + { + return ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudCombo)underlying.myControl)[index])).Text; + } + set + { + ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudCombo)underlying.myControl)[index])).Text = value; + } + } + + #endregion + } + + public class ComboDataIndexer : IComboDataIndexer + { + Combo underlying; + internal ComboDataIndexer(Combo c) + { + underlying = c; + } + + #region IComboIndexer Members + + public object this[int index] + { + get + { + return underlying.iData[index]; + } + set + { + underlying.iData[index] = value; + } + } + + #endregion + } + + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudCombo)myControl).Change += new EventHandler(Combo_Change); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudCombo)myControl).Change -= new EventHandler(Combo_Change); + } + + void Combo_Change(object sender, EventArgs e) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, Selected)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ICombo Members + + public IComboIndexer Text + { + get { return new ComboIndexer(this); } + } + + public IComboDataIndexer Data + { + get { return new ComboDataIndexer(this); } + } + + public int Count + { + get { return ((VirindiViewService.Controls.HudCombo)myControl).Count; } + } + + public int Selected + { + get + { + return ((VirindiViewService.Controls.HudCombo)myControl).Current; + } + set + { + ((VirindiViewService.Controls.HudCombo)myControl).Current = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + public void Add(string text) + { + ((VirindiViewService.Controls.HudCombo)myControl).AddItem(text, null); + iData.Add(null); + } + + public void Add(string text, object obj) + { + ((VirindiViewService.Controls.HudCombo)myControl).AddItem(text, null); + iData.Add(obj); + } + + public void Insert(int index, string text) + { + ((VirindiViewService.Controls.HudCombo)myControl).InsertItem(index, text, null); + iData.Insert(index, null); + } + + public void RemoveAt(int index) + { + ((VirindiViewService.Controls.HudCombo)myControl).DeleteItem(index); + iData.RemoveAt(index); + } + + public void Remove(int index) + { + RemoveAt(index); + } + + public void Clear() + { + ((VirindiViewService.Controls.HudCombo)myControl).Clear(); + iData.Clear(); + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Slider : Control, ISlider + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudHSlider)myControl).Changed += new VirindiViewService.Controls.LinearPositionControl.delScrollChanged(Slider_Changed); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudHSlider)myControl).Changed -= new VirindiViewService.Controls.LinearPositionControl.delScrollChanged(Slider_Changed); + } + + void Slider_Changed(int min, int max, int pos) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, pos)); + if (Change_Old != null) + Change_Old(this, null); + } + + #region ISlider Members + + public int Position + { + get + { + return ((VirindiViewService.Controls.HudHSlider)myControl).Position; + } + set + { + ((VirindiViewService.Controls.HudHSlider)myControl).Position = value; + } + } + + public event EventHandler Change; + public event EventHandler Change_Old; + + public int Maximum + { + get + { + return ((VirindiViewService.Controls.HudHSlider)myControl).Max; + } + set + { + ((VirindiViewService.Controls.HudHSlider)myControl).Max = value; + } + } + public int Minimum + { + get + { + return ((VirindiViewService.Controls.HudHSlider)myControl).Min; + } + set + { + ((VirindiViewService.Controls.HudHSlider)myControl).Min = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class List : Control, IList + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudList)myControl).Click += new VirindiViewService.Controls.HudList.delClickedControl(List_Click); + } + + public override void Dispose() + { + base.Dispose(); + ((VirindiViewService.Controls.HudList)myControl).Click -= new VirindiViewService.Controls.HudList.delClickedControl(List_Click); + } + + void List_Click(object sender, int row, int col) + { + if (Click != null) + Click(this, row, col); + if (Selected != null) + Selected(this, new MVListSelectEventArgs(this.Id, row, col)); + } + + public class ListRow : IListRow + { + List myList; + int myRow; + internal ListRow(int row, List l) + { + myList = l; + myRow = row; + } + + #region IListRow Members + + public IListCell this[int col] + { + get { return new ListCell(myRow, col, myList); } + } + + #endregion + } + public class ListCell : IListCell + { + List myList; + int myRow; + int myCol; + internal ListCell(int row, int col, List l) + { + myRow = row; + myCol = col; + myList = l; + } + + #region IListCell Members + + public void ResetColor() + { + ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol])).ResetTextColor(); + } + + public System.Drawing.Color Color + { + get + { + return ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol])).TextColor; + } + set + { + ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol])).TextColor = value; + } + } + + public int Width + { + get + { + return ((VirindiViewService.Controls.HudStaticText)(((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol])).ClipRegion.Width; + } + set + { + throw new Exception("The method or operation is not implemented."); + } + } + + public object this[int subval] + { + get + { + VirindiViewService.Controls.HudControl c = ((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol]; + if (subval == 0) + { + if (c.GetType() == typeof(VirindiViewService.Controls.HudStaticText)) + return ((VirindiViewService.Controls.HudStaticText)c).Text; + if (c.GetType() == typeof(VirindiViewService.Controls.HudCheckBox)) + return ((VirindiViewService.Controls.HudCheckBox)c).Checked; + } + else if (subval == 1) + { + if (c.GetType() == typeof(VirindiViewService.Controls.HudPictureBox)) + return ((VirindiViewService.Controls.HudPictureBox)c).Image.PortalImageID; + } + return null; + } + set + { + VirindiViewService.Controls.HudControl c = ((VirindiViewService.Controls.HudList)myList.myControl)[myRow][myCol]; + if (subval == 0) + { + if (c.GetType() == typeof(VirindiViewService.Controls.HudStaticText)) + ((VirindiViewService.Controls.HudStaticText)c).Text = (string)value; + if (c.GetType() == typeof(VirindiViewService.Controls.HudCheckBox)) + ((VirindiViewService.Controls.HudCheckBox)c).Checked = (bool)value; + } + else if (subval == 1) + { + if (c.GetType() == typeof(VirindiViewService.Controls.HudPictureBox)) + ((VirindiViewService.Controls.HudPictureBox)c).Image = (int)value; + } + } + } + + #endregion + } + + #region IList Members + + public event dClickedList Click; + public event EventHandler Selected; + + public void Clear() + { + ((VirindiViewService.Controls.HudList)myControl).ClearRows(); + } + + public IListRow this[int row] + { + get { return new ListRow(row, this); } + } + + public IListRow AddRow() + { + ((VirindiViewService.Controls.HudList)myControl).AddRow(); + return new ListRow(((VirindiViewService.Controls.HudList)myControl).RowCount - 1, this); + } + + public IListRow Add() + { + return AddRow(); + } + + public IListRow InsertRow(int pos) + { + ((VirindiViewService.Controls.HudList)myControl).InsertRow(pos); + return new ListRow(pos, this); + } + + public IListRow Insert(int pos) + { + return InsertRow(pos); + } + + public int RowCount + { + get { return ((VirindiViewService.Controls.HudList)myControl).RowCount; } + } + + public void RemoveRow(int index) + { + ((VirindiViewService.Controls.HudList)myControl).RemoveRow(index); + } + + public void Delete(int index) + { + RemoveRow(index); + } + + public int ColCount + { + get + { + return ((VirindiViewService.Controls.HudList)myControl).ColumnCount; + } + } + + public int ScrollPosition + { + get + { + return ((VirindiViewService.Controls.HudList)myControl).ScrollPosition; + } + set + { + ((VirindiViewService.Controls.HudList)myControl).ScrollPosition = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class StaticText : Control, IStaticText + { + public override void Initialize() + { + base.Initialize(); + //((VirindiViewService.Controls.HudStaticText)myControl) + } + + public override void Dispose() + { + base.Dispose(); + } + + #region IStaticText Members + + public string Text + { + get + { + return ((VirindiViewService.Controls.HudStaticText)myControl).Text; + } + set + { + ((VirindiViewService.Controls.HudStaticText)myControl).Text = value; + } + } + +#pragma warning disable 0067 + public event EventHandler Click; +#pragma warning restore 0067 + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class Notebook : Control, INotebook + { + public override void Initialize() + { + base.Initialize(); + ((VirindiViewService.Controls.HudTabView)myControl).OpenTabChange += new EventHandler(Notebook_OpenTabChange); + } + + public override void Dispose() + { + ((VirindiViewService.Controls.HudTabView)myControl).OpenTabChange -= new EventHandler(Notebook_OpenTabChange); + base.Dispose(); + } + + void Notebook_OpenTabChange(object sender, EventArgs e) + { + if (Change != null) + Change(this, new MVIndexChangeEventArgs(this.Id, ActiveTab)); + } + + #region INotebook Members + + public event EventHandler Change; + + public int ActiveTab + { + get + { + return ((VirindiViewService.Controls.HudTabView)myControl).CurrentTab; + } + set + { + ((VirindiViewService.Controls.HudTabView)myControl).CurrentTab = value; + ((VirindiViewService.Controls.HudTabView)myControl).Invalidate(); + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class ProgressBar : Control, IProgressBar + { + + #region IProgressBar Members + + public int Position + { + get + { + return ((VirindiViewService.Controls.HudProgressBar)myControl).Position; + } + set + { + ((VirindiViewService.Controls.HudProgressBar)myControl).Position = value; + } + } + + public int Value + { + get + { + return Position; + } + set + { + Position = value; + } + } + + public string PreText + { + get + { + return ((VirindiViewService.Controls.HudProgressBar)myControl).PreText; + } + set + { + ((VirindiViewService.Controls.HudProgressBar)myControl).PreText = value; + } + } + + + public int MaxValue + { + get + { + return ((VirindiViewService.Controls.HudProgressBar)myControl).Max; + } + set + { + ((VirindiViewService.Controls.HudProgressBar)myControl).Max = value; + } + } + + #endregion + } + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + class ImageButton : Control, IImageButton + { + public override void Initialize() + { + base.Initialize(); + myControl.MouseEvent += new EventHandler(Button_MouseEvent); + } + + public override void Dispose() + { + base.Dispose(); + myControl.MouseEvent -= new EventHandler(Button_MouseEvent); + } + + void Button_MouseEvent(object sender, VirindiViewService.Controls.ControlMouseEventArgs e) + { + switch (e.EventType) + { + case VirindiViewService.Controls.ControlMouseEventArgs.MouseEventType.MouseHit: + if (Click != null) + Click(this, new MVControlEventArgs(this.Id)); + return; + } + } + + #region IImageButton Members + + public event EventHandler Click; + + public void SetImages(int unpressed, int pressed) + { + ACImage upimg; + if (!VirindiViewService.Service.PortalBitmapExists(unpressed | 0x06000000)) + upimg = new ACImage(); + else + upimg = new ACImage(unpressed, ACImage.eACImageDrawOptions.DrawStretch); + + ACImage pimg; + if (!VirindiViewService.Service.PortalBitmapExists(pressed | 0x06000000)) + pimg = new ACImage(); + else + pimg = new ACImage(pressed, ACImage.eACImageDrawOptions.DrawStretch); + + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Up = upimg; + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Up_Pressing = pimg; + } + + public void SetImages(int hmodule, int unpressed, int pressed) + { + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Up = ACImage.FromIconLibrary(unpressed, hmodule); + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Up_Pressing = ACImage.FromIconLibrary(pressed, hmodule); + } + + public int Background + { + set + { + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Background2 = new ACImage(value, ACImage.eACImageDrawOptions.DrawStretch); + } + } + + public System.Drawing.Color Matte + { + set + { + ((VirindiViewService.Controls.HudImageButton)myControl).Image_Background = new ACImage(value); + } + } + + #endregion + } +} + +#else +#warning VVS_REFERENCED not defined, MetaViewWrappers for VVS will not be available. +#endif \ No newline at end of file diff --git a/MosswartMassacre/Wrapper_WireupHelper.cs b/MosswartMassacre/Wrapper_WireupHelper.cs new file mode 100644 index 0000000..63deeaf --- /dev/null +++ b/MosswartMassacre/Wrapper_WireupHelper.cs @@ -0,0 +1,329 @@ +/////////////////////////////////////////////////////////////////////////////// +//File: Wrapper_WireupHelper.cs +// +//Description: A helper utility that emulates Decal.Adapter's automagic view +// creation and control/event wireup with the MetaViewWrappers. A separate set +// of attributes is used. +// +//References required: +// Wrapper.cs +// +//This file is Copyright (c) 2010 VirindiPlugins +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Text; +using System.Reflection; + +#if METAVIEW_PUBLIC_NS +namespace MetaViewWrappers +#else +namespace MyClasses.MetaViewWrappers +#endif +{ + #region Attribute Definitions + + [AttributeUsage(AttributeTargets.Class)] +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + sealed class MVWireUpControlEventsAttribute : Attribute + { + public MVWireUpControlEventsAttribute() { } + } + + [AttributeUsage(AttributeTargets.Field)] +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + sealed class MVControlReferenceAttribute : Attribute + { + string ctrl; + + // Summary: + // Construct a new ControlReference + // + // Parameters: + // control: + // Control to reference + public MVControlReferenceAttribute(string control) + { + ctrl = control; + } + + // Summary: + // The Control Name + public string Control + { + get + { + return ctrl; + } + } + } + + [AttributeUsage(AttributeTargets.Field)] +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + sealed class MVControlReferenceArrayAttribute : Attribute + { + private System.Collections.ObjectModel.Collection myControls; + + /// + /// Constructs a new ControlReference array + /// + /// Names of the controls to put in the array + public MVControlReferenceArrayAttribute(params string[] controls) + : base() + { + this.myControls = new System.Collections.ObjectModel.Collection(controls); + } + + /// + /// Control collection + /// + public System.Collections.ObjectModel.Collection Controls + { + get + { + return this.myControls; + } + } + } + + [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + sealed class MVViewAttribute : Attribute + { + string res; + + // Summary: + // Constructs a new view from the specified resource + // + // Parameters: + // Resource: + // Embedded resource path + public MVViewAttribute(string resource) + { + res = resource; + } + + // Summary: + // The resource to load + public string Resource + { + get + { + return res; + } + } + } + + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + sealed class MVControlEventAttribute : Attribute + { + string c; + string e; + // Summary: + // Constructs the ControlEvent + // + // Parameters: + // control: + // Control Name + // + // controlEvent: + // Event to Wire + public MVControlEventAttribute(string control, string eventName) + { + c = control; + e = eventName; + } + + // Summary: + // Control Name + public string Control + { + get + { + return c; + } + } + + // + // Summary: + // Event to Wire + public string EventName + { + get + { + return e; + } + } + } + + #endregion Attribute Definitions + +#if VVS_WRAPPERS_PUBLIC + public +#else + internal +#endif + static class MVWireupHelper + { + private class ViewObjectInfo + { + public List Views = new List(); + } + static Dictionary VInfo = new Dictionary(); + + public static MyClasses.MetaViewWrappers.IView GetDefaultView(object ViewObj) + { + if (!VInfo.ContainsKey(ViewObj)) + return null; + if (VInfo[ViewObj].Views.Count == 0) + return null; + return VInfo[ViewObj].Views[0]; + } + + public static void WireupStart(object ViewObj, Decal.Adapter.Wrappers.PluginHost Host) + { + if (VInfo.ContainsKey(ViewObj)) + WireupEnd(ViewObj); + ViewObjectInfo info = new ViewObjectInfo(); + VInfo[ViewObj] = info; + + Type ObjType = ViewObj.GetType(); + + //Start views + object[] viewattrs = ObjType.GetCustomAttributes(typeof(MVViewAttribute), true); + foreach (MVViewAttribute a in viewattrs) + { + info.Views.Add(MyClasses.MetaViewWrappers.ViewSystemSelector.CreateViewResource(Host, a.Resource)); + } + + //Wire up control references + foreach (FieldInfo fi in ObjType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)) + { + if (Attribute.IsDefined(fi, typeof(MVControlReferenceAttribute))) + { + MVControlReferenceAttribute attr = (MVControlReferenceAttribute)Attribute.GetCustomAttribute(fi, typeof(MVControlReferenceAttribute)); + MetaViewWrappers.IControl mycontrol = null; + + //Try each view + foreach (MyClasses.MetaViewWrappers.IView v in info.Views) + { + try + { + mycontrol = v[attr.Control]; + } + catch { } + if (mycontrol != null) + break; + } + + if (mycontrol == null) + throw new Exception("Invalid control reference \"" + attr.Control + "\""); + + if (!fi.FieldType.IsAssignableFrom(mycontrol.GetType())) + throw new Exception("Control reference \"" + attr.Control + "\" is of wrong type"); + + fi.SetValue(ViewObj, mycontrol); + } + else if (Attribute.IsDefined(fi, typeof(MVControlReferenceArrayAttribute))) + { + MVControlReferenceArrayAttribute attr = (MVControlReferenceArrayAttribute)Attribute.GetCustomAttribute(fi, typeof(MVControlReferenceArrayAttribute)); + + //Only do the first view + if (info.Views.Count == 0) + throw new Exception("No views to which a control reference can attach"); + + Array controls = Array.CreateInstance(fi.FieldType.GetElementType(), attr.Controls.Count); + + IView view = info.Views[0]; + for (int i = 0; i < attr.Controls.Count; ++i) + { + controls.SetValue(view[attr.Controls[i]], i); + } + + fi.SetValue(ViewObj, controls); + } + } + + //Wire up events + foreach (MethodInfo mi in ObjType.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)) + { + if (!Attribute.IsDefined(mi, typeof(MVControlEventAttribute))) + continue; + Attribute[] attrs = Attribute.GetCustomAttributes(mi, typeof(MVControlEventAttribute)); + + foreach (MVControlEventAttribute attr in attrs) + { + MetaViewWrappers.IControl mycontrol = null; + //Try each view + foreach (MyClasses.MetaViewWrappers.IView v in info.Views) + { + try + { + mycontrol = v[attr.Control]; + } + catch { } + if (mycontrol != null) + break; + } + + if (mycontrol == null) + throw new Exception("Invalid control reference \"" + attr.Control + "\""); + + EventInfo ei = mycontrol.GetType().GetEvent(attr.EventName); + ei.AddEventHandler(mycontrol, Delegate.CreateDelegate(ei.EventHandlerType, ViewObj, mi.Name)); + } + } + } + + public static void WireupEnd(object ViewObj) + { + if (!VInfo.ContainsKey(ViewObj)) + return; + + foreach (MyClasses.MetaViewWrappers.IView v in VInfo[ViewObj].Views) + v.Dispose(); + + VInfo.Remove(ViewObj); + } + } +} \ No newline at end of file diff --git a/MosswartMassacre/app.config b/MosswartMassacre/app.config index 57fee1b..7237d3b 100644 --- a/MosswartMassacre/app.config +++ b/MosswartMassacre/app.config @@ -14,10 +14,6 @@ - - - - \ No newline at end of file diff --git a/MosswartMassacre/bin/Release/MosswartMassacre.Loader.dll b/MosswartMassacre/bin/Release/MosswartMassacre.Loader.dll deleted file mode 100644 index fa4ce16..0000000 Binary files a/MosswartMassacre/bin/Release/MosswartMassacre.Loader.dll and /dev/null differ diff --git a/MosswartMassacre/bin/Release/MosswartMassacre.dll b/MosswartMassacre/bin/Release/MosswartMassacre.dll index c916833..9c3dd30 100644 Binary files a/MosswartMassacre/bin/Release/MosswartMassacre.dll and b/MosswartMassacre/bin/Release/MosswartMassacre.dll differ diff --git a/MosswartMassacre/lib/0Harmony.dll b/MosswartMassacre/lib/0Harmony.dll deleted file mode 100644 index 6c0dd94..0000000 Binary files a/MosswartMassacre/lib/0Harmony.dll and /dev/null differ diff --git a/MosswartMassacre/lib/utank2-i.dll b/MosswartMassacre/lib/utank2-i.dll deleted file mode 100644 index 7696f05..0000000 Binary files a/MosswartMassacre/lib/utank2-i.dll and /dev/null differ diff --git a/MosswartMassacre/mainView.xml b/MosswartMassacre/mainView.xml new file mode 100644 index 0000000..1fc221d --- /dev/null +++ b/MosswartMassacre/mainView.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/MosswartMassacre/packages.config b/MosswartMassacre/packages.config index bcad711..62f1f9d 100644 --- a/MosswartMassacre/packages.config +++ b/MosswartMassacre/packages.config @@ -1,7 +1,5 @@  - - \ No newline at end of file diff --git a/MosswartMassacre/scripts/installer.nsi b/MosswartMassacre/scripts/installer.nsi deleted file mode 100644 index 2982fa0..0000000 --- a/MosswartMassacre/scripts/installer.nsi +++ /dev/null @@ -1,234 +0,0 @@ -; Define your application name - -!define APPNAME "MosswartMassacre" -!define SOFTWARECOMPANY "MosswartMassacre" -!define APPGUID "{8C97E839-4D05-4A5F-B0C8-E8E778654322}" -!define CLASSNAME "MosswartMassacre.PluginCore" -!define ASSEMBLY "MosswartMassacre.dll" -!define LOADERGUID "{A1B2C3D4-E5F6-7890-1234-567890ABCDEF}" -!define LOADERCLASS "MosswartMassacre.Loader.LoaderCore" -!define LOADERASSEMBLY "MosswartMassacre.Loader.dll" -InstallDir "C:\Games\DecalPlugins\${APPNAME}" -;Icon "Installer\Res\Decal.ico" - -!define BUILDPATH ".\..\bin\Release" - -!getdllversion "${BUILDPATH}\${ASSEMBLY}" Expv_ -!define VERSION ${Expv_1}.${Expv_2}.${Expv_3} - -OutFile "${BUILDPATH}\${APPNAME}Installer-${VERSION}.exe" - -; Main Install settings -; compressor goes first -SetCompressor LZMA - -Name "${APPNAME} ${VERSION}" -InstallDirRegKey HKLM "Software\${SOFTWARECOMPANY}\${APPNAME}" "" -;SetFont "Verdana" 8 - -; Use compression - -; Modern interface settings -!include "MUI.nsh" - -!define MUI_ABORTWARNING - -!insertmacro MUI_PAGE_WELCOME -;!insertmacro MUI_PAGE_COMPONENTS -!insertmacro MUI_PAGE_DIRECTORY -!insertmacro MUI_PAGE_INSTFILES -!insertmacro MUI_PAGE_FINISH - -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES - -; Set languages (first is default language) -!insertmacro MUI_LANGUAGE "English" -!insertmacro MUI_RESERVEFILE_LANGDLL - -; https://nsis.sourceforge.io/Download_and_Install_dotNET_45 -Function CheckAndDownloadDotNet48 - # Set up our Variables - Var /GLOBAL dotNET48IsThere - Var /GLOBAL dotNET_CMD_LINE - Var /GLOBAL EXIT_CODE - - # We are reading a version release DWORD that Microsoft says is the documented - # way to determine if .NET Framework 4.8 is installed - ReadRegDWORD $dotNET48IsThere HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release" - IntCmp $dotNET48IsThere 528049 is_equal is_less is_greater - - is_equal: - Goto done_compare_not_needed - is_greater: - Goto done_compare_not_needed - is_less: - Goto done_compare_needed - - done_compare_needed: - #.NET Framework 4.8 install is *NEEDED* - - # Microsoft Download Center EXE: - # Web Bootstrapper: https://go.microsoft.com/fwlink/?LinkId=2085155 - # Full Download: https://go.microsoft.com/fwlink/?linkid=2088631 - - # Setup looks for components\dotNET48Full.exe relative to the install EXE location - # This allows the installer to be placed on a USB stick (for computers without internet connections) - # If the .NET Framework 4.8 installer is *NOT* found, Setup will connect to Microsoft's website - # and download it for you - - # Reboot Required with these Exit Codes: - # 1641 or 3010 - - # Command Line Switches: - # /showrmui /passive /norestart - - # Silent Command Line Switches: - # /q /norestart - - - # Let's see if the user is doing a Silent install or not - IfSilent is_quiet is_not_quiet - - is_quiet: - StrCpy $dotNET_CMD_LINE "/q /norestart" - Goto LookForLocalFile - is_not_quiet: - StrCpy $dotNET_CMD_LINE "/showrmui /passive /norestart" - Goto LookForLocalFile - - LookForLocalFile: - # Let's see if the user stored the Full Installer - IfFileExists "$EXEPATH\components\dotNET48Full.exe" do_local_install do_network_install - - do_local_install: - # .NET Framework found on the local disk. Use this copy - - ExecWait '"$EXEPATH\components\dotNET48Full.exe" $dotNET_CMD_LINE' $EXIT_CODE - Goto is_reboot_requested - - # Now, let's Download the .NET - do_network_install: - - Var /GLOBAL dotNetDidDownload - NSISdl::download "https://go.microsoft.com/fwlink/?linkid=2088631" "$TEMP\dotNET48Web.exe" $dotNetDidDownload - - StrCmp $dotNetDidDownload success fail - success: - ExecWait '"$TEMP\dotNET45Web.exe" $dotNET_CMD_LINE' $EXIT_CODE - Goto is_reboot_requested - - fail: - MessageBox MB_OK|MB_ICONEXCLAMATION "Unable to download .NET Framework. ${PRODUCT_NAME} will be installed, but will not function without the Framework!" - Goto done_dotNET_function - - # $EXIT_CODE contains the return codes. 1641 and 3010 means a Reboot has been requested - is_reboot_requested: - ${If} $EXIT_CODE = 1641 - ${OrIf} $EXIT_CODE = 3010 - SetRebootFlag true - ${EndIf} - - done_compare_not_needed: - # Done dotNET Install - Goto done_dotNET_function - - #exit the function - done_dotNET_function: - -FunctionEnd - - -Section "" CoreSection -; Set Section properties - SetOverwrite on - - ; Set Section Files and Shortcuts - SetOutPath "$INSTDIR\" - - File "${BUILDPATH}\${ASSEMBLY}" - File "${BUILDPATH}\${APPNAME}.pdb" - File "${BUILDPATH}\${LOADERASSEMBLY}" - File "${BUILDPATH}\${APPNAME}.Loader.pdb" - ; File "${BUILDPATH}\UtilityBelt.Service.Installer.exe" - -SectionEnd - -Section -FinishSection - - WriteRegStr HKLM "Software\${SOFTWARECOMPANY}\${APPNAME}" "" "$INSTDIR" - WriteRegStr HKLM "Software\${SOFTWARECOMPANY}\${APPNAME}" "Version" "${VERSION}" - - ;Register in decal - ClearErrors - ReadRegStr $0 HKLM "Software\Decal\Plugins\${APPGUID}" "" - ${If} ${Errors} - WriteRegStr HKLM "Software\Decal\Plugins\${APPGUID}" "" "${APPNAME}" - WriteRegDWORD HKLM "Software\Decal\Plugins\${APPGUID}" "Enabled" "1" - WriteRegStr HKLM "Software\Decal\Plugins\${APPGUID}" "Object" "${CLASSNAME}" - WriteRegStr HKLM "Software\Decal\Plugins\${APPGUID}" "Assembly" "${ASSEMBLY}" - WriteRegStr HKLM "Software\Decal\Plugins\${APPGUID}" "Path" "$INSTDIR" - WriteRegStr HKLM "Software\Decal\Plugins\${APPGUID}" "Surrogate" "{71A69713-6593-47EC-0002-0000000DECA1}" - WriteRegStr HKLM "Software\Decal\Plugins\${APPGUID}" "Uninstaller" "${APPNAME}" - ${Else} - ${IF} $0 != "${APPNAME}" - MESSAGEBOX MB_OK|MB_ICONSTOP "Skipped decal plugin registration. A decal plugin with this GUID already exists ($0), and is not ${APPNAME}." - ${ENDIF} - ${EndIf} - - ;Register loader in decal as network filter - ClearErrors - ReadRegStr $0 HKLM "Software\Decal\NetworkFilters\${LOADERGUID}" "" - ${If} ${Errors} - WriteRegStr HKLM "Software\Decal\NetworkFilters\${LOADERGUID}" "" "${APPNAME}.Loader" - WriteRegDWORD HKLM "Software\Decal\NetworkFilters\${LOADERGUID}" "Enabled" "0" ; Disabled by default for normal use - WriteRegStr HKLM "Software\Decal\NetworkFilters\${LOADERGUID}" "Object" "${LOADERCLASS}" - WriteRegStr HKLM "Software\Decal\NetworkFilters\${LOADERGUID}" "Assembly" "${LOADERASSEMBLY}" - WriteRegStr HKLM "Software\Decal\NetworkFilters\${LOADERGUID}" "Path" "$INSTDIR" - WriteRegStr HKLM "Software\Decal\NetworkFilters\${LOADERGUID}" "Surrogate" "{71A69713-6593-47EC-0002-0000000DECA1}" - WriteRegStr HKLM "Software\Decal\NetworkFilters\${LOADERGUID}" "Uninstaller" "${APPNAME}" - ${Else} - ${IF} $0 != "${APPNAME}.Loader" - MESSAGEBOX MB_OK|MB_ICONSTOP "Skipped decal loader registration. A decal network filter with this GUID already exists ($0), and is not ${APPNAME}.Loader." - ${ENDIF} - ${EndIf} - - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$INSTDIR\uninstall.exe" - WriteUninstaller "$INSTDIR\uninstall.exe" - - ; make sure dotnet 4.8 is installed - Call CheckAndDownloadDotNet48 - -SectionEnd - -; Modern install component descriptions -!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${CoreSection} "" -!insertmacro MUI_FUNCTION_DESCRIPTION_END - -;Uninstall section -Section Uninstall - - ;Remove from registry... - DeleteRegKey HKLM "Software\${SOFTWARECOMPANY}\${APPNAME}" - DeleteRegKey HKLM "Software\Decal\Plugins\${APPGUID}" - DeleteRegKey HKLM "Software\Decal\NetworkFilters\${LOADERGUID}" - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" - - ; Delete self - Delete "$INSTDIR\uninstall.exe" - - ;Clean up - Delete "$INSTDIR\${ASSEMBLY}" - Delete "$INSTDIR\${APPNAME}.pdb" - Delete "$INSTDIR\${LOADERASSEMBLY}" - Delete "$INSTDIR\${APPNAME}.Loader.pdb" - Delete "$INSTDIR\loader_log.txt" - ; Delete "$INSTDIR\UtilityBelt.Service.Installer.exe" - - ;RMDir "$INSTDIR\" - -SectionEnd - -; eof \ No newline at end of file diff --git a/MosswartMassacre/scripts/post-build.ps1 b/MosswartMassacre/scripts/post-build.ps1 deleted file mode 100644 index 17a1872..0000000 --- a/MosswartMassacre/scripts/post-build.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -param( - [string]$NuGetPackageRoot, - [string]$ProjectDir -) - -if ($Env:OS -and $Env:OS -like '*Windows*') { - - $makensis = Join-Path $NuGetPackageRoot 'nsis-tool\3.0.8\tools\makensis.exe' - $installer = Join-Path $ProjectDir 'scripts\installer.nsi' - - Write-Verbose "Using makensis at $makensis" - & $makensis $installer -} -else { - # Only runs when building on Linux/macOS with makensis in PATH - & makensis "$ProjectDir/scripts/installer.nsi" -} diff --git a/README.md b/README.md index c006689..16858c3 100644 --- a/README.md +++ b/README.md @@ -1,220 +1,80 @@ -# MosswartMassacre - Advanced DECAL Plugin for Asheron's Call +# Mossy Plugins -> **Status**: Production Ready | VVS Direct Integration | Navigation Visualization Complete +A collection of DECAL plugins for Asheron's Call, providing utility overlays and automation features. -A comprehensive DECAL plugin for Asheron's Call that tracks monster kills, rare item discoveries, and provides advanced navigation route visualization with 3D rendering. + ## Contents + - `mossy.sln`: Visual Studio solution containing both projects. + - `GearCycler/`: Simple plugin with a UI button to cycle gear (placeholder behavior). + - `MosswartMassacre/`: Advanced plugin tracking monster kills, rare discoveries, and offering HTTP/telemetry features. + - `packages/`: Vendored NuGet packages (Newtonsoft.Json, YamlDotNet). -## 🚀 Features + ## Prerequisites + - Windows with .NET Framework 4.8 + - Visual Studio 2017+ (MSBuild Tools 15.0) or equivalent MSBuild environment + - DECAL Adapter installed for Asheron's Call + - VirindiViewService (included in each project's `lib/` folder) -### Core Functionality -- **Kill Tracking**: Real-time monster kill counting with rate calculations (kills/5min, kills/hour) -- **Rare Item Discovery**: Automatic rare detection and counter with optional meta state control -- **Statistics Dashboard**: Detailed session statistics with best hourly performance tracking -- **Multi-System Integration**: WebSocket streaming, HTTP command server, and telemetry support + ## Setup & Build + 1. Clone this repository. + 2. Ensure the DECAL and Virindi DLLs are present under `MosswartMassacre/lib/` and referenced by each project. + 3. Restore NuGet packages if needed (`nuget restore mossy.sln`). + 4. Open `mossy.sln` in Visual Studio and build the solution. + 5. The output DLLs will be in each project’s `bin/Debug/` or `bin/Release/` folder. + 6. Deploy the plugin DLLs (and any required XML or YAML files) to your DECAL plugin directory. -### 🗺️ Navigation Visualization -**Advanced VTank route visualization with 3D rendering capabilities** -- **3D Route Display**: Renders VTank .nav files as red lines in the game world -- **Route Comparison**: Side-by-side visualization with UtilityBelt's active navigation -- **Full Format Support**: All VTank nav types (Circular, Linear, Target, Once) and waypoint types -- **Auto-Discovery**: Automatically detects VTank installation and scans for .nav files -- **Performance Optimized**: Smart rendering limits and memory management + ## GearCycler + A minimal plugin demonstrating a VirindiViewService-based UI. + - UI layout: `GearCycler/ViewXML/mainView.xml`. + - Core logic in `GearCycler/GearCore.cs`. + - On button click, it logs a chat message; extend the `btnCycle.Hit` handler to add gear-cycling logic. -### 🎛️ User Interface -**Modern tabbed interface using direct VirindiViewService integration** -- **Main Tab**: Live kill stats, rare counts, elapsed time, and status indicators -- **Settings Tab**: Plugin configuration with real-time updates -- **Statistics Tab**: Enhanced analytics and session management -- **Navigation Tab**: Route selection, visualization controls, and status display + ## MosswartMassacre + Tracks monster kills and rare drops, with multiple utility features. -## 📥 Installation + ### Features + - **Kill Tracking**: Counts total kills and computes rates (kills/5 min, kills/hour). + - **Rare Discoveries**: Increments rare count and can automatically set rare meta state. + - **UI Overlay**: Displays stats and provides buttons to reset stats or toggle rare meta. + - **Command Interface** (`/mm` commands): + - `/mm help` : Show available commands. + - `/mm report` : Display current stats in chat. + - `/mm loc` : Show current map coordinates. + - `/mm reset` : Reset kill counters and timers. + - `/mm meta` : Toggle automatic rare meta state. + - `/mm http ` : Start/stop local HTTP command server (port 8085). + - `/mm remotecommands ` : Listen for remote commands from your allegiance chat. + - `/mm telemetry ` : Enable/disable periodic telemetry streaming. -### Prerequisites -- Windows with .NET Framework 4.8 -- Asheron's Call with DECAL Adapter installed -- VirindiViewService (included in lib/ folder) + ### HTTP Command Server + - Listens on `http://localhost:8085/`. + - Accepts POST data: `target=&command=`, then sends a /tell and executes the command. -### Quick Setup -1. Download the latest release from the releases page -2. Extract to your DECAL plugins directory -3. Restart DECAL and enable the plugin -4. Configure settings through the in-game UI + ### Configuration + - Per-character YAML config stored at `/.yaml`. + - Settings include: + - `remote_commands_enabled` + - `rare_meta_enabled` + - `http_server_enabled` + - `telemetry_enabled` + - `char_tag` + - Config is auto-generated on first run; modify it or use UI/commands to update. -### Building from Source -```bash -# Clone the repository -git clone [repository-url] -cd MosswartMassacre + ### Telemetry + - Periodically posts JSON snapshots of position and stats to a configurable endpoint. + - Configure `Endpoint`, `SharedSecret`, and `IntervalSec` in `Telemetry.cs`. -# Restore packages and build -nuget restore packages.config -msbuild MosswartMassacre.csproj /p:Configuration=Release /p:Platform=AnyCPU -``` + ## Dependencies + - Decal.Adapter (v2.9.8.3) + - Decal.Interop.Core & Decal.Interop.Inject + - VirindiViewService + - Newtonsoft.Json (v13.0.3) + - YamlDotNet (v16.3.0) -## 🎮 Usage + ## Contributing + 1. Fork the repository. + 2. Create a feature branch. + 3. Commit your changes and ensure the solution builds. + 4. Submit a pull request with a description of your changes. -### Basic Commands -Access all features through the `/mm` command interface: - -``` -/mm help - Show available commands -/mm report - Display current kill statistics -/mm loc - Show current map coordinates -/mm reset - Reset kill counters and timers -/mm meta - Toggle automatic rare meta state -/mm http - Control HTTP command server (port 8085) -/mm telemetry - Control telemetry streaming -``` - -### Navigation Visualization -1. **Enable**: Check "Enable Navigation Visualization" in Navigation tab -2. **Configure**: Set VTank profiles path in Settings (auto-detected) -3. **Select Route**: Choose from dropdown and click "Load Route" -4. **View**: Red route lines appear in 3D game world - -### Configuration -Settings are stored per-character in YAML format at `/.yaml`: - -```yaml -rare_meta_enabled: true -remote_commands_enabled: false -http_server_enabled: false -websocket_enabled: true -telemetry_enabled: false -char_tag: "default" -vtank_profiles_path: "C:\\Games\\VirindiPlugins\\VirindiTank\\" -main_window_x: 100 -main_window_y: 100 -``` - -## 🏗️ Architecture - -### Core Components -- **PluginCore.cs**: Main entry point and event coordination -- **PluginSettings.cs**: YAML-based per-character configuration -- **Views/VVSTabbedMainView.cs**: Main tabbed UI with direct VVS integration -- **Views/VVSBaseView.cs**: Base class for VVS-based views - -### Navigation System -- **NavRoute.cs**: VTank .nav file parser and 3D renderer -- **NavVisualization.cs**: Route management and file discovery -- **Registry Integration**: Automatic VTank directory detection - -### Communication Systems -- **WebSocket.cs**: Real-time data streaming to external services -- **HttpCommandServer.cs**: Local HTTP API for remote control -- **Telemetry.cs**: Periodic statistics reporting - -### Game Integration -- **VtankControl.cs**: vTank automation interface -- **MossyInventory.cs**: Inventory monitoring and rare detection -- **Utils.cs**: Game coordinate systems and utility functions - -## 🔧 Technical Details - -### Dependencies -- **DECAL Framework**: Core plugin system (Decal.Adapter, Decal.Interop.Core, Decal.Interop.D3DService) -- **VirindiViewService**: UI framework for game overlays -- **Newtonsoft.Json**: JSON serialization for APIs -- **YamlDotNet**: Configuration file management - -### Build Configuration -- **Target**: .NET Framework 4.8, x86 platform -- **Architecture**: Direct VVS integration (no wrapper abstraction) -- **Features**: Unsafe blocks enabled for P/Invoke operations - -### Navigation File Format Support -**Complete VTank .nav format compatibility:** -- **Nav Types**: Circular (1), Linear (0/2), Target (3), Once (4) -- **Waypoint Types**: Point, Portal, Recall, Pause, ChatCommand, OpenVendor, Portal2, UseNPC, Checkpoint, Jump -- **Performance**: Optimized for routes up to 10,000 waypoints with 500-segment rendering limit - -## 🔌 API Integration - -### HTTP Command Server -```bash -# Enable server -curl -X POST http://localhost:8085/ -d "target=PlayerName&command=report" - -# Available endpoints -POST / - Execute command for target player -``` - -### WebSocket Streaming -Real-time data streaming to `wss://overlord.snakedesert.se/websocket/` including: -- Monster spawn/despawn events -- Chat messages and rare discoveries -- Player position and statistics -- Session-based authentication with SharedSecret - -### Telemetry Data -Periodic JSON snapshots posted to configurable endpoints: -```json -{ - "timestamp": "2024-12-19T10:30:00Z", - "character": "PlayerName", - "position": {"x": 59.2, "y": -28.7, "z": 0.05}, - "stats": {"kills": 150, "rares": 3, "session_time": "02:15:30"} -} -``` - -## 🛠️ Development - -### Project Structure -``` -MosswartMassacre/ -├── Views/ # VVS-based UI components -│ ├── VVSBaseView.cs # Base view foundation -│ └── VVSTabbedMainView.cs # Main tabbed interface -├── ViewXML/ # UI layout definitions -│ └── mainViewTabbed.xml # Current layout -├── NavRoute.cs # Navigation file parser -├── NavVisualization.cs # Route visualization manager -├── PluginCore.cs # Main plugin logic -├── PluginSettings.cs # Configuration management -└── lib/ # External dependencies -``` - -### Development Environment -- **IDE**: Visual Studio 2017+ or VS Code with C# extension -- **Tools**: MSBuild, NuGet Package Manager -- **Testing**: In-game with Asheron's Call client and DECAL - -### Contributing -1. Fork the repository -2. Create feature branch (`git checkout -b feature/amazing-feature`) -3. Commit changes (`git commit -m 'Add amazing feature'`) -4. Push to branch (`git push origin feature/amazing-feature`) -5. Open a Pull Request - -## 📚 Related Documentation - -- **CLAUDE.md**: Claude AI development guidance and build commands -- **Development History**: Successful VVS migration completed, wrapper system removed -- **Architecture Evolution**: Migrated from wrapper-based to direct VVS integration - -## 📄 License - -This project is licensed under the MIT License - see the LICENSE file for details. - -## 🎯 Roadmap - -### Completed ✅ -- [x] VVS Direct Integration Migration -- [x] Navigation Visualization System -- [x] Tabbed UI Interface -- [x] WebSocket Streaming -- [x] HTTP Command API -- [x] Telemetry System -- [x] Architecture Cleanup (Phase 3) - -### Future Enhancements -- [ ] Multiple route visualization -- [ ] Route analysis and optimization tools -- [ ] Enhanced UI controls and themes -- [ ] Plugin integration marketplace -- [ ] Advanced statistics and reporting - ---- - -*Built with ❤️ for the Asheron's Call community* \ No newline at end of file + -- + _This README provides a high-level overview to get up and running quickly._ \ No newline at end of file diff --git a/Shared/Constants/BoolValueKey.cs b/Shared/Constants/BoolValueKey.cs deleted file mode 100644 index 3fb1bcb..0000000 --- a/Shared/Constants/BoolValueKey.cs +++ /dev/null @@ -1,187 +0,0 @@ - -namespace Mag.Shared.Constants -{ - // https://github.com/ACEmulator/ACE/blob/master/Source/ACE.Entity/Enum/Properties/PropertyBool.cs - public enum BoolValueKey - { - // properties marked as ServerOnly are properties we never saw in PCAPs, from here: - // http://ac.yotesfan.com/ace_object/not_used_enums.php - // source: @OptimShi - // description attributes are used by the weenie editor for a cleaner display name - - Undef = 0, - [Ephemeral][ServerOnly] - Stuck = 1, - [Ephemeral] - Open = 2, - Locked = 3, - RotProof = 4, - AllegianceUpdateRequest = 5, - AiUsesMana = 6, - AiUseHumanMagicAnimations = 7, - AllowGive = 8, - CurrentlyAttacking = 9, - AttackerAi = 10, - [ServerOnly] - IgnoreCollisions = 11, - [ServerOnly] - ReportCollisions = 12, - [ServerOnly] - Ethereal = 13, - [ServerOnly] - GravityStatus = 14, - [ServerOnly] - LightsStatus = 15, - [ServerOnly] - ScriptedCollision = 16, - [ServerOnly] - Inelastic = 17, - [ServerOnly][Ephemeral] - Visibility = 18, - [ServerOnly] - Attackable = 19, - SafeSpellComponents = 20, - AdvocateState = 21, - Inscribable = 22, - DestroyOnSell = 23, - UiHidden = 24, - IgnoreHouseBarriers = 25, - HiddenAdmin = 26, - PkWounder = 27, - PkKiller = 28, - NoCorpse = 29, - UnderLifestoneProtection = 30, - ItemManaUpdatePending = 31, - [Ephemeral] - GeneratorStatus = 32, - [Ephemeral] - ResetMessagePending = 33, - DefaultOpen = 34, - DefaultLocked = 35, - DefaultOn = 36, - OpenForBusiness = 37, - IsFrozen = 38, - DealMagicalItems = 39, - LogoffImDead = 40, - ReportCollisionsAsEnvironment = 41, - AllowEdgeSlide = 42, - AdvocateQuest = 43, - [Ephemeral][SendOnLogin] - IsAdmin = 44, - [Ephemeral][SendOnLogin] - IsArch = 45, - [Ephemeral][SendOnLogin] - IsSentinel = 46, - [SendOnLogin] - IsAdvocate = 47, - CurrentlyPoweringUp = 48, - [Ephemeral] - GeneratorEnteredWorld = 49, - NeverFailCasting = 50, - VendorService = 51, - AiImmobile = 52, - DamagedByCollisions = 53, - IsDynamic = 54, - IsHot = 55, - IsAffecting = 56, - AffectsAis = 57, - SpellQueueActive = 58, - [Ephemeral] - GeneratorDisabled = 59, - IsAcceptingTells = 60, - LoggingChannel = 61, - OpensAnyLock = 62, - UnlimitedUse = 63, - GeneratedTreasureItem = 64, - IgnoreMagicResist = 65, - IgnoreMagicArmor = 66, - AiAllowTrade = 67, - [SendOnLogin] - SpellComponentsRequired = 68, - IsSellable = 69, - IgnoreShieldsBySkill = 70, - NoDraw = 71, - ActivationUntargeted = 72, - HouseHasGottenPriorityBootPos = 73, - [Ephemeral] - GeneratorAutomaticDestruction = 74, - HouseHooksVisible = 75, - HouseRequiresMonarch = 76, - HouseHooksEnabled = 77, - HouseNotifiedHudOfHookCount = 78, - AiAcceptEverything = 79, - IgnorePortalRestrictions = 80, - RequiresBackpackSlot = 81, - DontTurnOrMoveWhenGiving = 82, - [ServerOnly] - NpcLooksLikeObject = 83, - IgnoreCloIcons = 84, - AppraisalHasAllowedWielder = 85, - ChestRegenOnClose = 86, - LogoffInMinigame = 87, - PortalShowDestination = 88, - PortalIgnoresPkAttackTimer = 89, - NpcInteractsSilently = 90, - Retained = 91, - IgnoreAuthor = 92, - Limbo = 93, - AppraisalHasAllowedActivator = 94, - ExistedBeforeAllegianceXpChanges = 95, - IsDeaf = 96, - [Ephemeral][SendOnLogin] - IsPsr = 97, - Invincible = 98, - Ivoryable = 99, - Dyable = 100, - CanGenerateRare = 101, - CorpseGeneratedRare = 102, - NonProjectileMagicImmune = 103, - [SendOnLogin] - ActdReceivedItems = 104, - Unknown105 = 105, - [Ephemeral] - FirstEnterWorldDone = 106, - RecallsDisabled = 107, - RareUsesTimer = 108, - ActdPreorderReceivedItems = 109, - Afk = 110, - IsGagged = 111, - ProcSpellSelfTargeted = 112, - IsAllegianceGagged = 113, - EquipmentSetTriggerPiece = 114, - Uninscribe = 115, - WieldOnUse = 116, - ChestClearedWhenClosed = 117, - NeverAttack = 118, - SuppressGenerateEffect = 119, - TreasureCorpse = 120, - EquipmentSetAddLevel = 121, - BarberActive = 122, - TopLayerPriority = 123, - NoHeldItemShown = 124, - LoginAtLifestone = 125, - OlthoiPk = 126, - [SendOnLogin] - Account15Days = 127, - HadNoVitae = 128, - NoOlthoiTalk = 129, - AutowieldLeft = 130, - - - // ACE Specific - /* custom */ - [ServerOnly] - LinkedPortalOneSummon = 9001, - [ServerOnly] - LinkedPortalTwoSummon = 9002, - [ServerOnly] - HouseEvicted = 9003, - [ServerOnly] - UntrainedSkills = 9004, - - - // Decal Specific - Lockable_Decal = 201326592, - Inscribable_Decal = 201326593, - } -} diff --git a/Shared/Constants/CoverageMask.cs b/Shared/Constants/CoverageMask.cs deleted file mode 100644 index 548f86f..0000000 --- a/Shared/Constants/CoverageMask.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Mag.Shared.Constants -{ - /// - /// This is the mapping for LongValueKey.Coverage. - /// It represents what body parts an armor piece covers when used in defensive/armor calculations. - /// - [Flags] - public enum CoverageMask - { - None = 0, - - Unknown = 0x00000001, // Original pants abdomen? - - UnderwearUpperLegs = 0x00000002, // I think... 0x13 = Abdomen/UpperLegs - UnderwearLowerLegs = 0x00000004, // I think... 0x16 = Abdomen/UpperLegs/LowerLegs - UnderwearChest = 0x00000008, - UnderwearAbdomen = 0x00000010, // Original shirt abdomen? - UnderwearUpperArms = 0x00000020, - UnderwearLowerArms = 0x00000040, - // = 0x00000080, - - OuterwearUpperLegs = 0x00000100, - OuterwearLowerLegs = 0x00000200, - OuterwearChest = 0x00000400, - OuterwearAbdomen = 0x00000800, - OuterwearUpperArms = 0x00001000, - OuterwearLowerArms = 0x00002000, - - Head = 0x00004000, - Hands = 0x00008000, - Feet = 0x00010000, - - Cloak = 0x00020000, - } - - public enum CoverageMaskHelper : uint - { - // for server comparison only - Underwear = CoverageMask.UnderwearUpperLegs | CoverageMask.UnderwearLowerLegs | CoverageMask.UnderwearChest | CoverageMask.UnderwearAbdomen | CoverageMask.UnderwearUpperArms | CoverageMask.UnderwearLowerArms, - Outerwear = CoverageMask.OuterwearUpperLegs | CoverageMask.OuterwearLowerLegs | CoverageMask.OuterwearChest | CoverageMask.OuterwearAbdomen | CoverageMask.OuterwearUpperArms | CoverageMask.OuterwearLowerArms | CoverageMask.Head | CoverageMask.Hands | CoverageMask.Feet, - - UnderwearLegs = CoverageMask.UnderwearUpperLegs | CoverageMask.UnderwearLowerLegs, - UnderwearArms = CoverageMask.UnderwearUpperArms | CoverageMask.UnderwearLowerArms, - - OuterwearLegs = CoverageMask.OuterwearUpperLegs | CoverageMask.OuterwearLowerLegs, - OuterwearArms = CoverageMask.OuterwearUpperArms | CoverageMask.OuterwearLowerArms, - - // exclude abdomen for searching - UnderwearShirt = CoverageMask.UnderwearChest | CoverageMask.UnderwearUpperArms | CoverageMask.UnderwearLowerArms, - UnderwearPants = CoverageMask.UnderwearUpperLegs | CoverageMask.UnderwearLowerLegs - } - - public static class CoverageMaskExtensions - { - public static int GetTotalBitsSet(this CoverageMask value) - { - int slotFlags = (int)value; - int bitsSet = 0; - - while (slotFlags != 0) - { - if ((slotFlags & 1) == 1) - bitsSet++; - slotFlags >>= 1; - } - - return bitsSet; - } - - public static bool IsBodyArmor(this CoverageMask value) { return ((int)value & 0x0001FF00) != 0; } - public static bool IsRobe(this CoverageMask value) { return ((int)value == 0x00013F00); } - public static bool IsUnderwear(this CoverageMask value) { return ((int)value & 0x0000007F) != 0; } - public static bool IsShirt(this CoverageMask value) { return ((int)value & 0x00000078) != 0; } - public static bool IsPants(this CoverageMask value) { return ((int)value & 0x00000017) != 0; } - - public static List ReductionOptions(this CoverageMask value) - { - List options = new List(); - - if (value.GetTotalBitsSet() <= 1 || !value.IsBodyArmor() || value.IsRobe()) - options.Add(value); - else - { - if (value == (CoverageMask.OuterwearUpperArms | CoverageMask.OuterwearLowerArms)) - { - options.Add(CoverageMask.OuterwearUpperArms); - options.Add(CoverageMask.OuterwearLowerArms); - } - else if (value == (CoverageMask.OuterwearUpperLegs | CoverageMask.OuterwearLowerLegs)) - { - options.Add(CoverageMask.OuterwearUpperLegs); - options.Add(CoverageMask.OuterwearLowerLegs); - } - else if (value == (CoverageMask.OuterwearLowerLegs | CoverageMask.Feet)) - options.Add(CoverageMask.Feet); - else if (value == (CoverageMask.OuterwearChest | CoverageMask.OuterwearAbdomen)) - options.Add(CoverageMask.OuterwearChest); - else if (value == (CoverageMask.OuterwearChest | CoverageMask.OuterwearAbdomen | CoverageMask.OuterwearUpperArms)) - options.Add(CoverageMask.OuterwearChest); - else if (value == (CoverageMask.OuterwearChest | CoverageMask.OuterwearUpperArms | CoverageMask.OuterwearLowerArms)) - options.Add(CoverageMask.OuterwearChest); - else if (value == (CoverageMask.OuterwearChest | CoverageMask.OuterwearUpperArms)) - options.Add(CoverageMask.OuterwearChest); - else if (value == (CoverageMask.OuterwearAbdomen | CoverageMask.OuterwearUpperLegs | CoverageMask.OuterwearLowerLegs)) - { - options.Add(CoverageMask.OuterwearAbdomen); - options.Add(CoverageMask.OuterwearUpperLegs); - options.Add(CoverageMask.OuterwearLowerLegs); - } - else if (value == (CoverageMask.OuterwearChest | CoverageMask.OuterwearAbdomen | CoverageMask.OuterwearUpperArms | CoverageMask.OuterwearLowerArms)) - options.Add(CoverageMask.OuterwearChest); - else if (value == (CoverageMask.OuterwearAbdomen | CoverageMask.OuterwearUpperLegs)) - { - // This is a emu piece that follows the pre-2010 retail guidelines - // https://asheron.fandom.com/wiki/Announcements_-_2010/04_-_Shedding_Skin - // For now, we assume only abdomen reduction - options.Add(CoverageMask.OuterwearAbdomen); - } - else - throw new Exception("Unable to determine reduction paths for CoverageMask of " + value); - } - - return options; - } - } -} diff --git a/Shared/Constants/Dictionaries.cs b/Shared/Constants/Dictionaries.cs deleted file mode 100644 index 24675df..0000000 --- a/Shared/Constants/Dictionaries.cs +++ /dev/null @@ -1,436 +0,0 @@ -using System.Collections.Generic; - -namespace Mag.Shared.Constants -{ - public static class Dictionaries - { - /// - /// Returns a dictionary of skill ids vs names - /// - /// - public static readonly Dictionary SkillInfo = new Dictionary - { - // This list was taken from the Alinco source - { 0x1, "Axe" }, - { 0x2, "Bow" }, - { 0x3, "Crossbow" }, - { 0x4, "Dagger" }, - { 0x5, "Mace" }, - { 0x6, "Melee Defense" }, - { 0x7, "Missile Defense" }, - { 0x8, "Sling" }, - { 0x9, "Spear" }, - { 0xA, "Staff" }, - { 0xB, "Sword" }, - { 0xC, "Thrown Weapons" }, - { 0xD, "Unarmed Combat" }, - { 0xE, "Arcane Lore" }, - { 0xF, "Magic Defense" }, - { 0x10, "Mana Conversion" }, - { 0x12, "Item Tinkering" }, - { 0x13, "Assess Person" }, - { 0x14, "Deception" }, - { 0x15, "Healing" }, - { 0x16, "Jump" }, - { 0x17, "Lockpick" }, - { 0x18, "Run" }, - { 0x1B, "Assess Creature" }, - { 0x1C, "Weapon Tinkering" }, - { 0x1D, "Armor Tinkering" }, - { 0x1E, "Magic Item Tinkering" }, - { 0x1F, "Creature Enchantment" }, - { 0x20, "Item Enchantment" }, - { 0x21, "Life Magic" }, - { 0x22, "War Magic" }, - { 0x23, "Leadership" }, - { 0x24, "Loyalty" }, - { 0x25, "Fletching" }, - { 0x26, "Alchemy" }, - { 0x27, "Cooking" }, - { 0x28, "Salvaging" }, - { 0x29, "Two Handed Combat" }, - { 0x2A, "Gearcraft"}, - { 0x2B, "Void" }, - { 0x2C, "Heavy Weapons" }, - { 0x2D, "Light Weapons" }, - { 0x2E, "Finesse Weapons" }, - { 0x2F, "Missile Weapons" }, - { 0x30, "Shield" }, - { 0x31, "Dual Wield" }, - { 0x32, "Recklessness" }, - { 0x33, "Sneak Attack" }, - { 0x34, "Dirty Fighting" }, - { 0x35, "Challenge" }, - { 0x36, "Summoning" }, - }; - - /// - /// Returns a dictionary of mastery ids vs names - /// - /// - public static Dictionary MasteryInfo = new Dictionary - { - { 1, "Unarmed Weapon" }, - { 2, "Sword" }, - { 3, "Axe" }, - { 4, "Mace" }, - { 5, "Spear" }, - { 6, "Dagger" }, - { 7, "Staff" }, - { 8, "Bow" }, - { 9, "Crossbow" }, - { 10, "Thrown" }, - { 11, "Two Handed Combat" }, - }; - - /// - /// Returns a dictionary of attribute set ids vs names - /// - /// - public static Dictionary AttributeSetInfo = new Dictionary - { - // This list was taken from Virindi Tank Loot Editor - // 01 - { 02, "Test"}, - // 03 - { 04, "Carraida's Benediction"}, - { 05, "Noble Relic Set" }, - { 06, "Ancient Relic Set" }, - { 07, "Relic Alduressa Set" }, - { 08, "Shou-jen Set" }, - { 09, "Empyrean Rings Set" }, - { 10, "Arm, Mind, Heart Set" }, - { 11, "Coat of the Perfect Light Set" }, - { 12, "Leggings of Perfect Light Set" }, - { 13, "Soldier's Set" }, - { 14, "Adept's Set" }, - { 15, "Archer's Set" }, - { 16, "Defender's Set" }, - { 17, "Tinker's Set" }, - { 18, "Crafter's Set" }, - { 19, "Hearty Set" }, - { 20, "Dexterous Set" }, - { 21, "Wise Set" }, - { 22, "Swift Set" }, - { 23, "Hardenend Set" }, - { 24, "Reinforced Set" }, - { 25, "Interlocking Set" }, - { 26, "Flame Proof Set" }, - { 27, "Acid Proof Set" }, - { 28, "Cold Proof Set" }, - { 29, "Lightning Proof Set" }, - { 30, "Dedication Set" }, - { 31, "Gladiatorial Clothing Set" }, - { 32, "Ceremonial Clothing" }, - { 33, "Protective Clothing" }, - { 34, "Noobie Armor" }, - { 35, "Sigil of Defense" }, - { 36, "Sigil of Destruction" }, - { 37, "Sigil of Fury" }, - { 38, "Sigil of Growth" }, - { 39, "Sigil of Vigor" }, - { 40, "Heroic Protector Set" }, - { 41, "Heroic Destroyer Set" }, - { 42, "Olthoi Armor D Red" }, - { 43, "Olthoi Armor C Rat" }, - { 44, "Olthoi Armor C Red" }, - { 45, "Olthoi Armor D Rat" }, - { 46, "Upgraded Relic Alduressa Set" }, - { 47, "Upgraded Ancient Relic Set" }, - { 48, "Upgraded Noble Relic Set" }, - { 49, "Weave of Alchemy" }, - { 50, "Weave of Arcane Lore" }, - { 51, "Weave of Armor Tinkering" }, - { 52, "Weave of Assess Person" }, - { 53, "Weave of Light Weapons" }, - { 54, "Weave of Missile Weapons" }, - { 55, "Weave of Cooking" }, - { 56, "Weave of Creature Enchantment" }, - { 57, "Weave of Missile Weapons" }, - { 58, "Weave of Finesse" }, - { 59, "Weave of Deception" }, - { 60, "Weave of Fletching" }, - { 61, "Weave of Healing" }, - { 62, "Weave of Item Enchantment" }, - { 63, "Weave of Item Tinkering" }, - { 64, "Weave of Leadership" }, - { 65, "Weave of Life Magic" }, - { 66, "Weave of Loyalty" }, - { 67, "Weave of Light Weapons" }, - { 68, "Weave of Magic Defense" }, - { 69, "Weave of Magic Item Tinkering" }, - { 70, "Weave of Mana Conversion" }, - { 71, "Weave of Melee Defense" }, - { 72, "Weave of Missile Defense" }, - { 73, "Weave of Salvaging" }, - { 74, "Weave of Light Weapons" }, - { 75, "Weave of Light Weapons" }, - { 76, "Weave of Heavy Weapons" }, - { 77, "Weave of Missile Weapons" }, - { 78, "Weave of Two Handed Combat" }, - { 79, "Weave of Light Weapons" }, - { 80, "Weave of Void Magic" }, - { 81, "Weave of War Magic" }, - { 82, "Weave of Weapon Tinkering" }, - { 83, "Weave of Assess Creature " }, - { 84, "Weave of Dirty Fighting" }, - { 85, "Weave of Dual Wield" }, - { 86, "Weave of Recklessness" }, - { 87, "Weave of Shield" }, - { 88, "Weave of Sneak Attack" }, - { 89, "Ninja_New" }, - { 90, "Weave of Summoning" }, - - { 91, "Shrouded Soul" }, - { 92, "Darkened Mind" }, - { 93, "Clouded Spirit" }, - { 94, "Minor Stinging Shrouded Soul" }, - { 95, "Minor Sparking Shrouded Soul" }, - { 96, "Minor Smoldering Shrouded Soul" }, - { 97, "Minor Shivering Shrouded Soul" }, - { 98, "Minor Stinging Darkened Mind" }, - { 99, "Minor Sparking Darkened Mind" }, - - { 100, "Minor Smoldering Darkened Mind" }, - { 101, "Minor Shivering Darkened Mind" }, - { 102, "Minor Stinging Clouded Spirit" }, - { 103, "Minor Sparking Clouded Spirit" }, - { 104, "Minor Smoldering Clouded Spirit" }, - { 105, "Minor Shivering Clouded Spirit" }, - { 106, "Major Stinging Shrouded Soul" }, - { 107, "Major Sparking Shrouded Soul" }, - { 108, "Major Smoldering Shrouded Soul" }, - { 109, "Major Shivering Shrouded Soul" }, - - { 110, "Major Stinging Darkened Mind" }, - { 111, "Major Sparking Darkened Mind" }, - { 112, "Major Smoldering Darkened Mind" }, - { 113, "Major Shivering Darkened Mind" }, - { 114, "Major Stinging Clouded Spirit" }, - { 115, "Major Sparking Clouded Spirit" }, - { 116, "Major Smoldering Clouded Spirit" }, - { 117, "Major Shivering Clouded Spirit" }, - { 118, "Blackfire Stinging Shrouded Soul" }, - { 119, "Blackfire Sparking Shrouded Soul" }, - - { 120, "Blackfire Smoldering Shrouded Soul" }, - { 121, "Blackfire Shivering Shrouded Soul" }, - { 122, "Blackfire Stinging Darkened Mind" }, - { 123, "Blackfire Sparking Darkened Mind" }, - { 124, "Blackfire Smoldering Darkened Mind" }, - { 125, "Blackfire Shivering Darkened Mind" }, - { 126, "Blackfire Stinging Clouded Spirit" }, - { 127, "Blackfire Sparking Clouded Spirit" }, - { 128, "Blackfire Smoldering Clouded Spirit" }, - { 129, "Blackfire Shivering Clouded Spirit" }, - - { 130, "Shimmering Shadows" }, - - { 131, "Brown Society Locket" }, - { 132, "Yellow Society Locket" }, - { 133, "Red Society Band" }, - { 134, "Green Society Band" }, - { 135, "Purple Society Band" }, - { 136, "Blue Society Band" }, - - { 137, "Gauntlet Garb" }, - - { 138, "UNKNOWN_138" }, // Possibly Paragon Missile Weapons - { 139, "UNKNOWN_139" }, // Possibly Paragon Casters - { 140, "UNKNOWN_140" }, // Possibly Paragon Melee Weapons - }; - - /// - /// Returns a dictionary of material ids vs names - /// - /// - public static Dictionary MaterialInfo = new Dictionary - { - { 1, "Ceramic" }, - { 2, "Porcelain" }, - // 3 - { 4, "Linen" }, - { 5, "Satin" }, - { 6, "Silk" }, - { 7, "Velvet" }, - { 8, "Wool" }, - // 9 - { 10, "Agate" }, - { 11, "Amber" }, - { 12, "Amethyst" }, - { 13, "Aquamarine" }, - { 14, "Azurite" }, - { 15, "Black Garnet" }, - { 16, "Black Opal" }, - { 17, "Bloodstone" }, - { 18, "Carnelian" }, - { 19, "Citrine" }, - { 20, "Diamond" }, - { 21, "Emerald" }, - { 22, "Fire Opal" }, - { 23, "Green Garnet" }, - { 24, "Green Jade" }, - { 25, "Hematite" }, - { 26, "Imperial Topaz" }, - { 27, "Jet" }, - { 28, "Lapis Lazuli" }, - { 29, "Lavender Jade" }, - { 30, "Malachite" }, - { 31, "Moonstone" }, - { 32, "Onyx" }, - { 33, "Opal" }, - { 34, "Peridot" }, - { 35, "Red Garnet" }, - { 36, "Red Jade" }, - { 37, "Rose Quartz" }, - { 38, "Ruby" }, - { 39, "Sapphire" }, - { 40, "Smokey Quartz" }, - { 41, "Sunstone" }, - { 42, "Tiger Eye" }, - { 43, "Tourmaline" }, - { 44, "Turquoise" }, - { 45, "White Jade" }, - { 46, "White Quartz" }, - { 47, "White Sapphire" }, - { 48, "Yellow Garnet" }, - { 49, "Yellow Topaz" }, - { 50, "Zircon" }, - { 51, "Ivory" }, - { 52, "Leather" }, - { 53, "Armoredillo Hide" }, - { 54, "Gromnie Hide" }, - { 55, "Reed Shark Hide" }, - // 56 - { 57, "Brass" }, - { 58, "Bronze" }, - { 59, "Copper" }, - { 60, "Gold" }, - { 61, "Iron" }, - { 62, "Pyreal" }, - { 63, "Silver" }, - { 64, "Steel" }, - // 65 - { 66, "Alabaster" }, - { 67, "Granite" }, - { 68, "Marble" }, - { 69, "Obsidian" }, - { 70, "Sandstone" }, - { 71, "Serpentine" }, - { 73, "Ebony" }, - { 74, "Mahogany" }, - { 75, "Oak" }, - { 76, "Pine" }, - { 77, "Teak" }, - }; - - public struct SpellInfo - { - public readonly int Key; - public readonly T Change; - public readonly T Bonus; - - public SpellInfo(int key, T change, T bonus = default(T)) - { - Key = key; - Change = change; - Bonus = bonus; - } - } - - // Taken from Decal.Adapter.Wrappers.LongValueKey - const int LongValueKey_MaxDamage = 218103842; - const int LongValueKey_ArmorLevel = 28; - - public static readonly Dictionary> LongValueKeySpellEffects = new Dictionary>() - { - // In 2012 they removed these item spells and converted them to auras that are cast on the player, not on the item. - { 1616, new SpellInfo(LongValueKey_MaxDamage, 20)}, // Blood Drinker VI - { 2096, new SpellInfo(LongValueKey_MaxDamage, 22)}, // Infected Caress - //{ 5183, new SpellInfo(LongValueKey_MaxDamage, 22)}, // Incantation of Blood Drinker Pre Feb-2013 - //{ 4395, new SpellInfo(LongValueKey_MaxDamage, 24, 2)}, // Incantation of Blood Drinker, this spell on the item adds 2 more points of damage over a user casted 8 Pre Feb-2013 - { 5183, new SpellInfo(LongValueKey_MaxDamage, 24)}, // Incantation of Blood Drinker Post Feb-2013 - { 4395, new SpellInfo(LongValueKey_MaxDamage, 24)}, // Incantation of Blood Drinker Post Feb-2013 - - { 2598, new SpellInfo(LongValueKey_MaxDamage, 2, 2)}, // Minor Blood Thirst - { 2586, new SpellInfo(LongValueKey_MaxDamage, 4, 4)}, // Major Blood Thirst - { 4661, new SpellInfo(LongValueKey_MaxDamage, 7, 7)}, // Epic Blood Thirst - { 6089, new SpellInfo(LongValueKey_MaxDamage, 10, 10)}, // Legendary Blood Thirst - - { 3688, new SpellInfo(LongValueKey_MaxDamage, 300)}, // Prodigal Blood Drinker - - - { 1486, new SpellInfo(LongValueKey_ArmorLevel, 200)}, // Impenetrability VI - { 2108, new SpellInfo(LongValueKey_ArmorLevel, 220)}, // Brogard's Defiance - { 4407, new SpellInfo(LongValueKey_ArmorLevel, 240)}, // Incantation of Impenetrability - - { 2604, new SpellInfo(LongValueKey_ArmorLevel, 20, 20)}, // Minor Impenetrability - { 2592, new SpellInfo(LongValueKey_ArmorLevel, 40, 40)}, // Major Impenetrability - { 4667, new SpellInfo(LongValueKey_ArmorLevel, 60, 60)}, // Epic Impenetrability - { 6095, new SpellInfo(LongValueKey_ArmorLevel, 80, 80)}, // Legendary Impenetrability - }; - - // Taken from Decal.Adapter.Wrappers.DoubleValueKey - const int DoubleValueKey_ElementalDamageVersusMonsters = 152; - const int DoubleValueKey_AttackBonus = 167772172; - const int DoubleValueKey_MeleeDefenseBonus = 29; - const int DoubleValueKey_ManaCBonus = 144; - - public static readonly Dictionary> DoubleValueKeySpellEffects = new Dictionary>() - { - // In 2012 they removed these item spells and converted them to auras that are cast on the player, not on the item. - { 3258, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .06)}, // Spirit Drinker VI - { 3259, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .07)}, // Infected Spirit Caress - //{ 5182, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .07)}, // Incantation of Spirit Drinker Pre Feb-2013 - //{ 4414, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .08, .01)}, // Incantation of Spirit Drinker, this spell on the item adds 1 more % of damage over a user casted 8 Pre Feb-2013 - { 5182, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .08)}, // Incantation of Spirit Drinker Post Feb-2013 - { 4414, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .08)}, // Incantation of Spirit Drinker, this spell on the item adds 1 more % of damage over a user casted 8 Post Feb-2013 - - { 3251, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .01, .01)}, // Minor Spirit Thirst - { 3250, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .03, .03)}, // Major Spirit Thirst - { 4670, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .05, .05)}, // Epic Spirit Thirst - { 6098, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .07, .07)}, // Legendary Spirit Thirst - - { 3735, new SpellInfo(DoubleValueKey_ElementalDamageVersusMonsters, .15)}, // Prodigal Spirit Drinker - - - // In 2012 they removed these item spells and converted them to auras that are cast on the player, not on the item. - { 1592, new SpellInfo(DoubleValueKey_AttackBonus, .15)}, // Heart Seeker VI - { 2106, new SpellInfo(DoubleValueKey_AttackBonus, .17)}, // Elysa's Sight - { 4405, new SpellInfo(DoubleValueKey_AttackBonus, .20)}, // Incantation of Heart Seeker - - { 2603, new SpellInfo(DoubleValueKey_AttackBonus, .03, .03)}, // Minor Heart Thirst - { 2591, new SpellInfo(DoubleValueKey_AttackBonus, .05, .05)}, // Major Heart Thirst - { 4666, new SpellInfo(DoubleValueKey_AttackBonus, .07, .07)}, // Epic Heart Thirst - { 6094, new SpellInfo(DoubleValueKey_AttackBonus, .09, .09)}, // Legendary Heart Thirst - - - // In 2012 they removed these item spells and converted them to auras that are cast on the player, not on the item. - { 1605, new SpellInfo(DoubleValueKey_MeleeDefenseBonus, .15)}, // Defender VI - { 2101, new SpellInfo(DoubleValueKey_MeleeDefenseBonus, .17)}, // Cragstone's Will - //{ 4400, new SpellInfo(DoubleValueKey_MeleeDefenseBonus, .17)}, // Incantation of Defender Pre Feb-2013 - { 4400, new SpellInfo(DoubleValueKey_MeleeDefenseBonus, .20)}, // Incantation of Defender Post Feb-2013 - - { 2600, new SpellInfo(DoubleValueKey_MeleeDefenseBonus, .03, .03)}, // Minor Defender - { 3985, new SpellInfo(DoubleValueKey_MeleeDefenseBonus, .04, .04)}, // Mukkir Sense - { 2588, new SpellInfo(DoubleValueKey_MeleeDefenseBonus, .05, .05)}, // Major Defender - { 4663, new SpellInfo(DoubleValueKey_MeleeDefenseBonus, .07, .07)}, // Epic Defender - { 6091, new SpellInfo(DoubleValueKey_MeleeDefenseBonus, .09, .09)}, // Legendary Defender - - { 3699, new SpellInfo(DoubleValueKey_MeleeDefenseBonus, .25)}, // Prodigal Defender - - - // In 2012 they removed these item spells and converted them to auras that are cast on the player, not on the item. - { 1480, new SpellInfo(DoubleValueKey_ManaCBonus, 1.60)}, // Hermetic Link VI - { 2117, new SpellInfo(DoubleValueKey_ManaCBonus, 1.70)}, // Mystic's Blessing - { 4418, new SpellInfo(DoubleValueKey_ManaCBonus, 1.80)}, // Incantation of Hermetic Link - - { 3201, new SpellInfo(DoubleValueKey_ManaCBonus, 1.05, 1.05)}, // Feeble Hermetic Link - { 3199, new SpellInfo(DoubleValueKey_ManaCBonus, 1.10, 1.10)}, // Minor Hermetic Link - { 3202, new SpellInfo(DoubleValueKey_ManaCBonus, 1.15, 1.15)}, // Moderate Hermetic Link - { 3200, new SpellInfo(DoubleValueKey_ManaCBonus, 1.20, 1.20)}, // Major Hermetic Link - { 6086, new SpellInfo(DoubleValueKey_ManaCBonus, 1.25, 1.25)}, // Epic Hermetic Link - { 6087, new SpellInfo(DoubleValueKey_ManaCBonus, 1.30, 1.30)}, // Legendary Hermetic Link - }; - } -} diff --git a/Shared/Constants/DoubleValueKey.cs b/Shared/Constants/DoubleValueKey.cs deleted file mode 100644 index d410239..0000000 --- a/Shared/Constants/DoubleValueKey.cs +++ /dev/null @@ -1,266 +0,0 @@ - -namespace Mag.Shared.Constants -{ - // https://github.com/ACEmulator/ACE/blob/master/Source/ACE.Entity/Enum/Properties/PropertyFloat.cs - public enum DoubleValueKey - { - // properties marked as ServerOnly are properties we never saw in PCAPs, from here: - // http://ac.yotesfan.com/ace_object/not_used_enums.php - // source: @OptimShi - // description attributes are used by the weenie editor for a cleaner display name - - Undef = 0, - HeartbeatInterval = 1, - [Ephemeral] - HeartbeatTimestamp = 2, - HealthRate = 3, - StaminaRate = 4, - ManaRate = 5, - HealthUponResurrection = 6, - StaminaUponResurrection = 7, - ManaUponResurrection = 8, - StartTime = 9, - StopTime = 10, - ResetInterval = 11, - Shade = 12, - ArmorModVsSlash = 13, - ArmorModVsPierce = 14, - ArmorModVsBludgeon = 15, - ArmorModVsCold = 16, - ArmorModVsFire = 17, - ArmorModVsAcid = 18, - ArmorModVsElectric = 19, - CombatSpeed = 20, - WeaponLength = 21, - DamageVariance = 22, - CurrentPowerMod = 23, - AccuracyMod = 24, - StrengthMod = 25, - MaximumVelocity = 26, - RotationSpeed = 27, - MotionTimestamp = 28, - WeaponDefense = 29, - WimpyLevel = 30, - VisualAwarenessRange = 31, - AuralAwarenessRange = 32, - PerceptionLevel = 33, - PowerupTime = 34, - MaxChargeDistance = 35, - ChargeSpeed = 36, - BuyPrice = 37, - SellPrice = 38, - DefaultScale = 39, - LockpickMod = 40, - RegenerationInterval = 41, - RegenerationTimestamp = 42, - GeneratorRadius = 43, - TimeToRot = 44, - DeathTimestamp = 45, - PkTimestamp = 46, - VictimTimestamp = 47, - LoginTimestamp = 48, - CreationTimestamp = 49, - MinimumTimeSincePk = 50, - DeprecatedHousekeepingPriority = 51, - AbuseLoggingTimestamp = 52, - LastPortalTeleportTimestamp = 53, - UseRadius = 54, - HomeRadius = 55, - ReleasedTimestamp = 56, - MinHomeRadius = 57, - Facing = 58, - ResetTimestamp = 59, - LogoffTimestamp = 60, - EconRecoveryInterval = 61, - WeaponOffense = 62, - DamageMod = 63, - ResistSlash = 64, - ResistPierce = 65, - ResistBludgeon = 66, - ResistFire = 67, - ResistCold = 68, - ResistAcid = 69, - ResistElectric = 70, - ResistHealthBoost = 71, - ResistStaminaDrain = 72, - ResistStaminaBoost = 73, - ResistManaDrain = 74, - ResistManaBoost = 75, - [Ephemeral] - Translucency = 76, - PhysicsScriptIntensity = 77, - Friction = 78, - Elasticity = 79, - AiUseMagicDelay = 80, - ItemMinSpellcraftMod = 81, - ItemMaxSpellcraftMod = 82, - ItemRankProbability = 83, - Shade2 = 84, - Shade3 = 85, - Shade4 = 86, - ItemEfficiency = 87, - ItemManaUpdateTimestamp = 88, - SpellGestureSpeedMod = 89, - SpellStanceSpeedMod = 90, - AllegianceAppraisalTimestamp = 91, - PowerLevel = 92, - AccuracyLevel = 93, - AttackAngle = 94, - AttackTimestamp = 95, - CheckpointTimestamp = 96, - SoldTimestamp = 97, - UseTimestamp = 98, - UseLockTimestamp = 99, - HealkitMod = 100, - FrozenTimestamp = 101, - HealthRateMod = 102, - AllegianceSwearTimestamp = 103, - ObviousRadarRange = 104, - HotspotCycleTime = 105, - HotspotCycleTimeVariance = 106, - SpamTimestamp = 107, - SpamRate = 108, - BondWieldedTreasure = 109, - BulkMod = 110, - SizeMod = 111, - GagTimestamp = 112, - GeneratorUpdateTimestamp = 113, - DeathSpamTimestamp = 114, - DeathSpamRate = 115, - WildAttackProbability = 116, - FocusedProbability = 117, - CrashAndTurnProbability = 118, - CrashAndTurnRadius = 119, - CrashAndTurnBias = 120, - GeneratorInitialDelay = 121, - AiAcquireHealth = 122, - AiAcquireStamina = 123, - AiAcquireMana = 124, - /// - /// this had a default of "1" - leaving comment to investigate potential options for defaulting these things (125) - /// - [SendOnLogin] - ResistHealthDrain = 125, - LifestoneProtectionTimestamp = 126, - AiCounteractEnchantment = 127, - AiDispelEnchantment = 128, - TradeTimestamp = 129, - AiTargetedDetectionRadius = 130, - EmotePriority = 131, - [Ephemeral] - LastTeleportStartTimestamp = 132, - EventSpamTimestamp = 133, - EventSpamRate = 134, - InventoryOffset = 135, - CriticalMultiplier = 136, - ManaStoneDestroyChance = 137, - SlayerDamageBonus = 138, - AllegianceInfoSpamTimestamp = 139, - AllegianceInfoSpamRate = 140, - NextSpellcastTimestamp = 141, - [Ephemeral] - AppraisalRequestedTimestamp = 142, - AppraisalHeartbeatDueTimestamp = 143, - ManaConversionMod = 144, - LastPkAttackTimestamp = 145, - FellowshipUpdateTimestamp = 146, - CriticalFrequency = 147, - LimboStartTimestamp = 148, - WeaponMissileDefense = 149, - WeaponMagicDefense = 150, - IgnoreShield = 151, - ElementalDamageMod = 152, - StartMissileAttackTimestamp = 153, - LastRareUsedTimestamp = 154, - IgnoreArmor = 155, - ProcSpellRate = 156, - ResistanceModifier = 157, - AllegianceGagTimestamp = 158, - AbsorbMagicDamage = 159, - CachedMaxAbsorbMagicDamage = 160, - GagDuration = 161, - AllegianceGagDuration = 162, - [SendOnLogin] - GlobalXpMod = 163, - HealingModifier = 164, - ArmorModVsNether = 165, - ResistNether = 166, - CooldownDuration = 167, - [SendOnLogin] - WeaponAuraOffense = 168, - [SendOnLogin] - WeaponAuraDefense = 169, - [SendOnLogin] - WeaponAuraElemental = 170, - [SendOnLogin] - WeaponAuraManaConv = 171, - - - // ACE Specific - [ServerOnly] - PCAPRecordedWorkmanship = 8004, - [ServerOnly] - PCAPRecordedVelocityX = 8010, - [ServerOnly] - PCAPRecordedVelocityY = 8011, - [ServerOnly] - PCAPRecordedVelocityZ = 8012, - [ServerOnly] - PCAPRecordedAccelerationX = 8013, - [ServerOnly] - PCAPRecordedAccelerationY = 8014, - [ServerOnly] - PCAPRecordedAccelerationZ = 8015, - [ServerOnly] - PCAPRecordeOmegaX = 8016, - [ServerOnly] - PCAPRecordeOmegaY = 8017, - [ServerOnly] - PCAPRecordeOmegaZ = 8018, - - - // Decal Specific - SlashProt_Decal = 167772160, - PierceProt_Decal = 167772161, - BludgeonProt_Decal = 167772162, - AcidProt_Decal = 167772163, - LightningProt_Decal = 167772164, - FireProt_Decal = 167772165, - ColdProt_Decal = 167772166, - Heading_Decal = 167772167, - ApproachDistance_Decal = 167772168, - SalvageWorkmanship_Decal = 167772169, - Scale_Decal = 167772170, - Variance_Decal = 167772171, - AttackBonus_Decal = 167772172, - Range_Decal = 167772173, - DamageBonus_Decal = 167772174, - } - - public static class DoubleValueKeyTools - { - /// - /// Converts a decal specific IntValueKey to the actual IntValueKey. - /// If this is not an IntValueKey, 0 will be returned. - /// - public static uint ConvertToDouble(DoubleValueKey input) - { - if (input == DoubleValueKey.SlashProt_Decal) return (int)DoubleValueKey.ArmorModVsSlash; - if (input == DoubleValueKey.PierceProt_Decal) return (int)DoubleValueKey.ArmorModVsPierce; - if (input == DoubleValueKey.BludgeonProt_Decal) return (int)DoubleValueKey.ArmorModVsBludgeon; - if (input == DoubleValueKey.AcidProt_Decal) return (int)DoubleValueKey.ArmorModVsAcid; - if (input == DoubleValueKey.LightningProt_Decal) return (int)DoubleValueKey.ArmorModVsElectric; - if (input == DoubleValueKey.FireProt_Decal) return (int)DoubleValueKey.ArmorModVsFire; - if (input == DoubleValueKey.ColdProt_Decal) return (int)DoubleValueKey.ArmorModVsCold; - - if (input == DoubleValueKey.ApproachDistance_Decal) return (int)DoubleValueKey.UseRadius; - if (input == DoubleValueKey.Scale_Decal) return (int)DoubleValueKey.DefaultScale; - if (input == DoubleValueKey.Variance_Decal) return (int)DoubleValueKey.DamageVariance; - if (input == DoubleValueKey.AttackBonus_Decal) return (int)DoubleValueKey.WeaponOffense;; - if (input == DoubleValueKey.Range_Decal) return (int)DoubleValueKey.MaximumVelocity; - if (input == DoubleValueKey.DamageBonus_Decal) return (int)DoubleValueKey.DamageMod; - - return 0; - } - } -} diff --git a/Shared/Constants/EphemeralAttribute.cs b/Shared/Constants/EphemeralAttribute.cs deleted file mode 100644 index e0216e1..0000000 --- a/Shared/Constants/EphemeralAttribute.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Mag.Shared.Constants -{ - /// - /// These are properties that aren't saved to the shard. - /// - public class EphemeralAttribute : Attribute - { - } -} diff --git a/Shared/Constants/EquipMask.cs b/Shared/Constants/EquipMask.cs deleted file mode 100644 index 8acc969..0000000 --- a/Shared/Constants/EquipMask.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System; - -namespace Mag.Shared.Constants -{ - /// - /// This is the mapping for LongValueKey.EquippableSlots. - /// It represents where you can drag items to on your paper doll. - /// - [Flags] - public enum EquipMask : uint - { - None = 0x00000000, - - HeadWear = 0x00000001, - - ChestWear = 0x00000002, - AbdomenWear = 0x00000004, - UpperArmWear = 0x00000008, - LowerArmWear = 0x00000010, - - HandWear = 0x00000020, - - UpperLegWear = 0x00000040, - LowerLegWear = 0x00000080, - - FootWear = 0x00000100, - ChestArmor = 0x00000200, - AbdomenArmor = 0x00000400, - UpperArmArmor = 0x00000800, - LowerArmArmor = 0x00001000, - UpperLegArmor = 0x00002000, - LowerLegArmor = 0x00004000, - - NeckWear = 0x00008000, - WristWearLeft = 0x00010000, - WristWearRight = 0x00020000, - FingerWearLeft = 0x00040000, - FingerWearRight = 0x00080000, - - MeleeWeapon = 0x00100000, - Shield = 0x00200000, - MissileWeapon = 0x00400000, - MissileAmmo = 0x00800000, - Held = 0x01000000, - TwoHanded = 0x02000000, - - TrinketOne = 0x04000000, - Cloak = 0x08000000, - - SigilOne = 0x10000000, // Blue - SigilTwo = 0x20000000, // Yellow - SigilThree = 0x40000000, // Red - - Clothing = 0x80000000 | HeadWear | ChestWear | AbdomenWear | UpperArmWear | LowerArmWear | HandWear | UpperLegWear | LowerLegWear | FootWear, - Armor = ChestArmor | AbdomenArmor | UpperArmArmor | LowerArmArmor | UpperLegArmor | LowerLegArmor | FootWear, - ArmorExclusive = ChestArmor | AbdomenArmor | UpperArmArmor | LowerArmArmor | UpperLegArmor | LowerLegArmor, - Extremity = HeadWear | HandWear | FootWear, - Jewelry = NeckWear | WristWearLeft | WristWearRight | FingerWearLeft | FingerWearRight | TrinketOne | Cloak | SigilOne | SigilTwo | SigilThree, - WristWear = WristWearLeft | WristWearRight, - FingerWear = FingerWearLeft | FingerWearRight, - Sigil = SigilOne | SigilTwo | SigilThree, - ReadySlot = Held | TwoHanded | TrinketOne | Cloak | SigilOne | SigilTwo, - Weapon = SigilTwo | TrinketOne | Held, - WeaponReadySlot = SigilOne | SigilTwo | TrinketOne | Held, - Selectable = MeleeWeapon | Shield | MissileWeapon | Held | TwoHanded, - SelectablePlusAmmo = Selectable | MissileAmmo, - All = 0x7FFFFFFF, - CanGoInReadySlot = 0x7FFFFFFF - } - - public static class EquipMaskExtensions - { - public static int GetTotalBitsSet(this EquipMask value) - { - int slotFlags = (int)value; - int bitsSet = 0; - - while (slotFlags != 0) - { - if ((slotFlags & 1) == 1) - bitsSet++; - slotFlags >>= 1; - } - - return bitsSet; - } - - // Some feet armor have EquipMask.Feet | EquipMask.PantsLowerLegs - - public static bool IsBodyArmor(this EquipMask value) - { - return ((int)value & 0x00007F21) != 0; - } - - public static bool IsCoreBodyArmor(this EquipMask value) - { - return (value & (EquipMask.ChestArmor | EquipMask.UpperArmArmor | EquipMask.LowerArmArmor | EquipMask.AbdomenArmor | EquipMask.UpperLegArmor | EquipMask.LowerLegArmor)) != 0; - } - - public static bool IsExtremityBodyArmor(this EquipMask value) - { - return (value & (EquipMask.FootWear | EquipMask.HandWear | EquipMask.HeadWear)) != 0; - } - - public static bool IsUnderwear(this EquipMask value) - { - if (value == (EquipMask.FootWear | EquipMask.LowerLegWear)) - return false; - - return ((int)value & 0x000000DE) != 0; - } - - public static bool IsShirt(this EquipMask value) - { - return ((int)value & 0x0000001A) != 0; - } - - public static bool IsPants(this EquipMask value) - { - if (value == (EquipMask.FootWear | EquipMask.LowerLegWear)) - return false; - - return ((int)value & 0x000000C4) != 0; - } - } -} diff --git a/Shared/Constants/IntValueKey.cs b/Shared/Constants/IntValueKey.cs deleted file mode 100644 index 0cdaaa7..0000000 --- a/Shared/Constants/IntValueKey.cs +++ /dev/null @@ -1,722 +0,0 @@ - -namespace Mag.Shared.Constants -{ - // https://github.com/ACEmulator/ACE/blob/master/Source/ACE.Entity/Enum/Properties/PropertyInt.cs - public enum IntValueKey - { - // properties marked as ServerOnly are properties we never saw in PCAPs, from here: - // http://ac.yotesfan.com/ace_object/not_used_enums.php - // source: @OptimShi - // description attributes are used by the weenie editor for a cleaner display name - - Undef = 0, - [ServerOnly] - ItemType = 1, - CreatureType = 2, - [ServerOnly] - PaletteTemplate = 3, - ClothingPriority = 4, - [SendOnLogin] - EncumbranceVal = 5, // ENCUMB_VAL_INT, - [SendOnLogin] - ItemsCapacity = 6, - [SendOnLogin] - ContainersCapacity = 7, - [ServerOnly] - Mass = 8, - [ServerOnly] - ValidLocations = 9, // LOCATIONS_INT - [ServerOnly] - CurrentWieldedLocation = 10, - [ServerOnly] - MaxStackSize = 11, - [ServerOnly] - StackSize = 12, - [ServerOnly] - StackUnitEncumbrance = 13, - [ServerOnly] - StackUnitMass = 14, - [ServerOnly] - StackUnitValue = 15, - [ServerOnly] - ItemUseable = 16, - RareId = 17, - [ServerOnly] - UiEffects = 18, - Value = 19, - [Ephemeral][SendOnLogin] - CoinValue = 20, - TotalExperience = 21, - AvailableCharacter = 22, - TotalSkillCredits = 23, - [SendOnLogin] - AvailableSkillCredits = 24, - [SendOnLogin] - Level = 25, - AccountRequirements = 26, - ArmorType = 27, - ArmorLevel = 28, - AllegianceCpPool = 29, - [SendOnLogin] - AllegianceRank = 30, - ChannelsAllowed = 31, - ChannelsActive = 32, - Bonded = 33, - MonarchsRank = 34, - AllegianceFollowers = 35, - ResistMagic = 36, - ResistItemAppraisal = 37, - ResistLockpick = 38, - DeprecatedResistRepair = 39, - [SendOnLogin] - CombatMode = 40, - CurrentAttackHeight = 41, - CombatCollisions = 42, - [SendOnLogin] - NumDeaths = 43, - Damage = 44, - DamageType = 45, - [ServerOnly] - DefaultCombatStyle = 46, - [SendOnLogin] - AttackType = 47, - WeaponSkill = 48, - WeaponTime = 49, - AmmoType = 50, - CombatUse = 51, - [ServerOnly] - ParentLocation = 52, - /// - /// TODO: Migrate inventory order away from this and instead use the new InventoryOrder property - /// TODO: PlacementPosition is used (very sparingly) in cache.bin, so it has (or had) a meaning at one point before we hijacked it - /// TODO: and used it for our own inventory order - /// - [ServerOnly] - PlacementPosition = 53, - WeaponEncumbrance = 54, - WeaponMass = 55, - ShieldValue = 56, - ShieldEncumbrance = 57, - MissileInventoryLocation = 58, - FullDamageType = 59, - WeaponRange = 60, - AttackersSkill = 61, - DefendersSkill = 62, - AttackersSkillValue = 63, - AttackersClass = 64, - [ServerOnly] - Placement = 65, - CheckpointStatus = 66, - Tolerance = 67, - TargetingTactic = 68, - CombatTactic = 69, - HomesickTargetingTactic = 70, - NumFollowFailures = 71, - FriendType = 72, - FoeType = 73, - MerchandiseItemTypes = 74, - MerchandiseMinValue = 75, - MerchandiseMaxValue = 76, - NumItemsSold = 77, - NumItemsBought = 78, - MoneyIncome = 79, - MoneyOutflow = 80, - [Ephemeral] - MaxGeneratedObjects = 81, - [Ephemeral] - InitGeneratedObjects = 82, - ActivationResponse = 83, - OriginalValue = 84, - NumMoveFailures = 85, - MinLevel = 86, - MaxLevel = 87, - LockpickMod = 88, - BoosterEnum = 89, - BoostValue = 90, - MaxStructure = 91, - Structure = 92, - [ServerOnly] - PhysicsState = 93, - [ServerOnly] - TargetType = 94, - RadarBlipColor = 95, - EncumbranceCapacity = 96, - LoginTimestamp = 97, - [SendOnLogin] - CreationTimestamp = 98, - PkLevelModifier = 99, - GeneratorType = 100, - AiAllowedCombatStyle = 101, - LogoffTimestamp = 102, - GeneratorDestructionType = 103, - ActivationCreateClass = 104, - ItemWorkmanship = 105, - ItemSpellcraft = 106, - ItemCurMana = 107, - ItemMaxMana = 108, - ItemDifficulty = 109, - ItemAllegianceRankLimit = 110, - PortalBitmask = 111, - AdvocateLevel = 112, - [SendOnLogin] - Gender = 113, - Attuned = 114, - ItemSkillLevelLimit = 115, - GateLogic = 116, - ItemManaCost = 117, - Logoff = 118, - Active = 119, - AttackHeight = 120, - NumAttackFailures = 121, - AiCpThreshold = 122, - AiAdvancementStrategy = 123, - Version = 124, - [SendOnLogin] - Age = 125, - VendorHappyMean = 126, - VendorHappyVariance = 127, - CloakStatus = 128, - [SendOnLogin] - VitaeCpPool = 129, - NumServicesSold = 130, - MaterialType = 131, - [SendOnLogin] - NumAllegianceBreaks = 132, - [Ephemeral] - ShowableOnRadar = 133, - [SendOnLogin] - PlayerKillerStatus = 134, - VendorHappyMaxItems = 135, - ScorePageNum = 136, - ScoreConfigNum = 137, - ScoreNumScores = 138, - [SendOnLogin] - DeathLevel = 139, - AiOptions = 140, - OpenToEveryone = 141, - GeneratorTimeType = 142, - GeneratorStartTime = 143, - GeneratorEndTime = 144, - GeneratorEndDestructionType = 145, - XpOverride = 146, - NumCrashAndTurns = 147, - ComponentWarningThreshold = 148, - HouseStatus = 149, - [ServerOnly] - HookPlacement = 150, - [ServerOnly] - HookType = 151, - [ServerOnly] - HookItemType = 152, - AiPpThreshold = 153, - GeneratorVersion = 154, - HouseType = 155, - PickupEmoteOffset = 156, - WeenieIteration = 157, - WieldRequirements = 158, - WieldSkillType = 159, - WieldDifficulty = 160, - HouseMaxHooksUsable = 161, - HouseCurrentHooksUsable = 162, - AllegianceMinLevel = 163, - AllegianceMaxLevel = 164, - HouseRelinkHookCount = 165, - SlayerCreatureType = 166, - ConfirmationInProgress = 167, - ConfirmationTypeInProgress = 168, - TsysMutationData = 169, - NumItemsInMaterial = 170, - NumTimesTinkered = 171, - AppraisalLongDescDecoration = 172, - AppraisalLockpickSuccessPercent = 173, - [Ephemeral] - AppraisalPages = 174, - [Ephemeral] - AppraisalMaxPages = 175, - AppraisalItemSkill = 176, - GemCount = 177, - GemType = 178, - ImbuedEffect = 179, - AttackersRawSkillValue = 180, - [SendOnLogin] - ChessRank = 181, - ChessTotalGames = 182, - ChessGamesWon = 183, - ChessGamesLost = 184, - TypeOfAlteration = 185, - SkillToBeAltered = 186, - SkillAlterationCount = 187, - [SendOnLogin] - HeritageGroup = 188, - TransferFromAttribute = 189, - TransferToAttribute = 190, - AttributeTransferCount = 191, - [SendOnLogin] - FakeFishingSkill = 192, - NumKeys = 193, - DeathTimestamp = 194, - PkTimestamp = 195, - VictimTimestamp = 196, - HookGroup = 197, - AllegianceSwearTimestamp = 198, - [SendOnLogin] - HousePurchaseTimestamp = 199, - RedirectableEquippedArmorCount = 200, - MeleeDefenseImbuedEffectTypeCache = 201, - MissileDefenseImbuedEffectTypeCache = 202, - MagicDefenseImbuedEffectTypeCache = 203, - ElementalDamageBonus = 204, - ImbueAttempts = 205, - ImbueSuccesses = 206, - CreatureKills = 207, - PlayerKillsPk = 208, - PlayerKillsPkl = 209, - RaresTierOne = 210, - RaresTierTwo = 211, - RaresTierThree = 212, - RaresTierFour = 213, - RaresTierFive = 214, - [SendOnLogin] - AugmentationStat = 215, - [SendOnLogin] - AugmentationFamilyStat = 216, - [SendOnLogin] - AugmentationInnateFamily = 217, - [SendOnLogin] - AugmentationInnateStrength = 218, - [SendOnLogin] - AugmentationInnateEndurance = 219, - [SendOnLogin] - AugmentationInnateCoordination = 220, - [SendOnLogin] - AugmentationInnateQuickness = 221, - [SendOnLogin] - AugmentationInnateFocus = 222, - [SendOnLogin] - AugmentationInnateSelf = 223, - [SendOnLogin] - AugmentationSpecializeSalvaging = 224, - [SendOnLogin] - AugmentationSpecializeItemTinkering = 225, - [SendOnLogin] - AugmentationSpecializeArmorTinkering = 226, - [SendOnLogin] - AugmentationSpecializeMagicItemTinkering = 227, - [SendOnLogin] - AugmentationSpecializeWeaponTinkering = 228, - [SendOnLogin] - AugmentationExtraPackSlot = 229, - [SendOnLogin] - AugmentationIncreasedCarryingCapacity = 230, - [SendOnLogin] - AugmentationLessDeathItemLoss = 231, - [SendOnLogin] - AugmentationSpellsRemainPastDeath = 232, - [SendOnLogin] - AugmentationCriticalDefense = 233, - [SendOnLogin] - AugmentationBonusXp = 234, - [SendOnLogin] - AugmentationBonusSalvage = 235, - [SendOnLogin] - AugmentationBonusImbueChance = 236, - [SendOnLogin] - AugmentationFasterRegen = 237, - [SendOnLogin] - AugmentationIncreasedSpellDuration = 238, - [SendOnLogin] - AugmentationResistanceFamily = 239, - [SendOnLogin] - AugmentationResistanceSlash = 240, - [SendOnLogin] - AugmentationResistancePierce = 241, - [SendOnLogin] - AugmentationResistanceBlunt = 242, - [SendOnLogin] - AugmentationResistanceAcid = 243, - [SendOnLogin] - AugmentationResistanceFire = 244, - [SendOnLogin] - AugmentationResistanceFrost = 245, - [SendOnLogin] - AugmentationResistanceLightning = 246, - RaresTierOneLogin = 247, - RaresTierTwoLogin = 248, - RaresTierThreeLogin = 249, - RaresTierFourLogin = 250, - RaresTierFiveLogin = 251, - RaresLoginTimestamp = 252, - RaresTierSix = 253, - RaresTierSeven = 254, - RaresTierSixLogin = 255, - RaresTierSevenLogin = 256, - ItemAttributeLimit = 257, - ItemAttributeLevelLimit = 258, - ItemAttribute2ndLimit = 259, - ItemAttribute2ndLevelLimit = 260, - CharacterTitleId = 261, - NumCharacterTitles = 262, - ResistanceModifierType = 263, - FreeTinkersBitfield = 264, - EquipmentSetId = 265, - PetClass = 266, - Lifespan = 267, - [Ephemeral] - RemainingLifespan = 268, - UseCreateQuantity = 269, - WieldRequirements2 = 270, - WieldSkillType2 = 271, - WieldDifficulty2 = 272, - WieldRequirements3 = 273, - WieldSkillType3 = 274, - WieldDifficulty3 = 275, - WieldRequirements4 = 276, - WieldSkillType4 = 277, - WieldDifficulty4 = 278, - Unique = 279, - SharedCooldown = 280, - Faction1Bits = 281, - Faction2Bits = 282, - Faction3Bits = 283, - Hatred1Bits = 284, - Hatred2Bits = 285, - Hatred3Bits = 286, - SocietyRankCelhan = 287, - SocietyRankEldweb = 288, - SocietyRankRadblo = 289, - HearLocalSignals = 290, - HearLocalSignalsRadius = 291, - Cleaving = 292, - [SendOnLogin] - AugmentationSpecializeGearcraft = 293, - [SendOnLogin] - AugmentationInfusedCreatureMagic = 294, - [SendOnLogin] - AugmentationInfusedItemMagic = 295, - [SendOnLogin] - AugmentationInfusedLifeMagic = 296, - [SendOnLogin] - AugmentationInfusedWarMagic = 297, - [SendOnLogin] - AugmentationCriticalExpertise = 298, - [SendOnLogin] - AugmentationCriticalPower = 299, - [SendOnLogin] - AugmentationSkilledMelee = 300, - [SendOnLogin] - AugmentationSkilledMissile = 301, - [SendOnLogin] - AugmentationSkilledMagic = 302, - ImbuedEffect2 = 303, - ImbuedEffect3 = 304, - ImbuedEffect4 = 305, - ImbuedEffect5 = 306, - [SendOnLogin] - DamageRating = 307, - [SendOnLogin] - DamageResistRating = 308, - [SendOnLogin] - AugmentationDamageBonus = 309, - [SendOnLogin] - AugmentationDamageReduction = 310, - ImbueStackingBits = 311, - [SendOnLogin] - HealOverTime = 312, - [SendOnLogin] - CritRating = 313, - [SendOnLogin] - CritDamageRating = 314, - [SendOnLogin] - CritResistRating = 315, - [SendOnLogin] - CritDamageResistRating = 316, - [SendOnLogin] - HealingResistRating = 317, - [SendOnLogin] - DamageOverTime = 318, - ItemMaxLevel = 319, - ItemXpStyle = 320, - EquipmentSetExtra = 321, - [SendOnLogin] - AetheriaBitfield = 322, - [SendOnLogin] - HealingBoostRating = 323, - HeritageSpecificArmor = 324, - AlternateRacialSkills = 325, - [SendOnLogin] - AugmentationJackOfAllTrades = 326, - [SendOnLogin] - AugmentationResistanceNether = 327, - [SendOnLogin] - AugmentationInfusedVoidMagic = 328, - [SendOnLogin] - WeaknessRating = 329, - [SendOnLogin] - NetherOverTime = 330, - [SendOnLogin] - NetherResistRating = 331, - LuminanceAward = 332, - [SendOnLogin] - LumAugDamageRating = 333, - [SendOnLogin] - LumAugDamageReductionRating = 334, - [SendOnLogin] - LumAugCritDamageRating = 335, - [SendOnLogin] - LumAugCritReductionRating = 336, - [SendOnLogin] - LumAugSurgeEffectRating = 337, - [SendOnLogin] - LumAugSurgeChanceRating = 338, - [SendOnLogin] - LumAugItemManaUsage = 339, - [SendOnLogin] - LumAugItemManaGain = 340, - [SendOnLogin] - LumAugVitality = 341, - [SendOnLogin] - LumAugHealingRating = 342, - [SendOnLogin] - LumAugSkilledCraft = 343, - [SendOnLogin] - LumAugSkilledSpec = 344, - [SendOnLogin] - LumAugNoDestroyCraft = 345, - RestrictInteraction = 346, - OlthoiLootTimestamp = 347, - OlthoiLootStep = 348, - UseCreatesContractId = 349, - [SendOnLogin] - DotResistRating = 350, - [SendOnLogin] - LifeResistRating = 351, - CloakWeaveProc = 352, - WeaponType = 353, - [SendOnLogin] - MeleeMastery = 354, - [SendOnLogin] - RangedMastery = 355, - SneakAttackRating = 356, - RecklessnessRating = 357, - DeceptionRating = 358, - CombatPetRange = 359, - [SendOnLogin] - WeaponAuraDamage = 360, - [SendOnLogin] - WeaponAuraSpeed = 361, - [SendOnLogin] - SummoningMastery = 362, - HeartbeatLifespan = 363, - UseLevelRequirement = 364, - [SendOnLogin] - LumAugAllSkills = 365, - UseRequiresSkill = 366, - UseRequiresSkillLevel = 367, - UseRequiresSkillSpec = 368, - UseRequiresLevel = 369, - [SendOnLogin] - GearDamage = 370, - [SendOnLogin] - GearDamageResist = 371, - [SendOnLogin] - GearCrit = 372, - [SendOnLogin] - GearCritResist = 373, - [SendOnLogin] - GearCritDamage = 374, - [SendOnLogin] - GearCritDamageResist = 375, - [SendOnLogin] - GearHealingBoost = 376, - [SendOnLogin] - GearNetherResist = 377, - [SendOnLogin] - GearLifeResist = 378, - [SendOnLogin] - GearMaxHealth = 379, - Unknown380 = 380, - [SendOnLogin] - PKDamageRating = 381, - [SendOnLogin] - PKDamageResistRating = 382, - [SendOnLogin] - GearPKDamageRating = 383, - [SendOnLogin] - GearPKDamageResistRating = 384, - Unknown385 = 385, - /// - /// Overpower chance % for endgame creatures. - /// - [SendOnLogin] - Overpower = 386, - [SendOnLogin] - OverpowerResist = 387, - // Client does not display accurately - [SendOnLogin] - GearOverpower = 388, - // Client does not display accurately - [SendOnLogin] - GearOverpowerResist = 389, - // Number of times a character has enlightened - [SendOnLogin] - Enlightenment = 390, - - - // ACE Specific - [ServerOnly] - PCAPRecordedAutonomousMovement = 8007, - [ServerOnly] - PCAPRecordedMaxVelocityEstimated = 8030, - [ServerOnly] - PCAPRecordedPlacement = 8041, - [ServerOnly] - PCAPRecordedAppraisalPages = 8042, - [ServerOnly] - PCAPRecordedAppraisalMaxPages = 8043, - - //[ServerOnly] - //TotalLogins = 9001, - //[ServerOnly] - //DeletionTimestamp = 9002, - //[ServerOnly] - //CharacterOptions1 = 9003, - //[ServerOnly] - //CharacterOptions2 = 9004, - //[ServerOnly] - //LootTier = 9005, - //[ServerOnly] - //GeneratorProbability = 9006, - //[ServerOnly] - //WeenieType = 9007 // I don't think this property type is needed anymore. We don't store the weenie type in the property bags, we store it as a separate field in the base objects. - [ServerOnly] - CurrentLoyaltyAtLastLogoff = 9008, - [ServerOnly] - CurrentLeadershipAtLastLogoff = 9009, - [ServerOnly] - AllegianceOfficerRank = 9010, - [ServerOnly] - HouseRentTimestamp = 9011, - /// - /// Stores the player's selected hairstyle at creation or after a barber use. This is used only for Gear Knights and Olthoi characters who have more than a single part/texture for a "hairstyle" (BodyStyle) - /// - [ServerOnly] - Hairstyle = 9012, - /// - /// Used to store the calculated Clothing Priority for use with armor reduced items and items like Over-Robes. - /// - [Ephemeral][ServerOnly] - VisualClothingPriority = 9013, - [ServerOnly] - SquelchGlobal = 9014, - - /// - /// TODO: This is a place holder for future use. See PlacementPosition - /// This is the sort order for items in a container - /// - [ServerOnly] - InventoryOrder = 9015, - - // Decal Specific - WeenieClassId_Decal = 218103808, - Icon_Decal_DID = 218103809, - Container_Decal_IID = 218103810, - Landblock_Decal = 218103811, - ItemSlots_Decal = 218103812, - PackSlots_Decal = 218103813, - StackCount_Decal = 218103814, - StackMax_Decal = 218103815, - Spell_Decal_DID = 218103816, - SlotLegacy_Decal = 218103817, - Wielder_Decal_IID = 218103818, - WieldingSlot_Decal = 218103819, - Monarch_Decal_IID = 218103820, - Coverage_Decal = 218103821, - EquipableSlots_Decal = 218103822, - EquipType_Decal = 218103823, - IconOutline_Decal = 218103824, - MissileType_Decal = 218103825, - UsageMask_Decal = 218103826, - HouseOwner_Decal_IID = 218103827, - HookMask_Decal = 218103828, - HookType_Decal = 218103829, - Setup_Decal_DID = 218103830, - ObjectDescriptionFlags_Decal = 218103831, - CreateFlags1_Decal = 218103832, - CreateFlags2_Decal = 218103833, - Category_Decal = 218103834, - Behavior_Decal = 218103835, - MagicDef_Decal = 218103836, - SpecialProps_Decal = 218103837, - SpellCount_Decal = 218103838, - WeapSpeed_Decal = 218103839, - EquipSkill_Decal = 218103840, - DamageType_Decal = 218103841, - MaxDamage_Decal = 218103842, - Unknown10_Decal = 218103843, // CurrentWieldLocation? - Unknown100000_Decal = 218103844, // RadarBlipColor ??? - Unknown800000_Decal = 218103845, - Unknown8000000_Decal = 218103846, - PhysicsDataFlags_Decal = 218103847, - ActiveSpellCount_Decal = 218103848, - IconOverlay_Decal_DID = 218103849, - IconUnderlay_Decal_DID = 218103850, - Slot_Decal = 231735296, - } - - public static class IntValueKeyTools - { - /// - /// Converts a decal specific IntValueKey to the actual IntValueKey. - /// If this is not an IntValueKey, 0 will be returned. - /// - public static uint ConvertToInt(IntValueKey input) - { - if (input == IntValueKey.Category_Decal) return (int)IntValueKey.ItemType; - if (input == IntValueKey.Coverage_Decal) return (int)IntValueKey.ClothingPriority; - if (input == IntValueKey.ItemSlots_Decal) return (int)IntValueKey.ItemsCapacity; - if (input == IntValueKey.PackSlots_Decal) return (int)IntValueKey.ContainersCapacity; - if (input == IntValueKey.EquipableSlots_Decal) return (int)IntValueKey.ValidLocations; - //if (input == IntValueKey.WieldingSlot_Decal) return (int)IntValueKey.CurrentWieldedLocation; - if (input == IntValueKey.StackMax_Decal) return (int)IntValueKey.MaxStackSize; - if (input == IntValueKey.StackCount_Decal) return (int)IntValueKey.StackSize; - if (input == IntValueKey.IconOutline_Decal) return (int)IntValueKey.UiEffects; - if (input == IntValueKey.MaxDamage_Decal) return (int)IntValueKey.Damage; - if (input == IntValueKey.DamageType_Decal) return (int)IntValueKey.DamageType; - if (input == IntValueKey.EquipSkill_Decal) return (int)IntValueKey.WeaponSkill; - if (input == IntValueKey.WeapSpeed_Decal) return (int)IntValueKey.WeaponTime; - if (input == IntValueKey.MissileType_Decal) return (int)IntValueKey.AmmoType; - if (input == IntValueKey.EquipType_Decal) return (int)IntValueKey.CombatUse; - if (input == IntValueKey.UsageMask_Decal) return (int)IntValueKey.TargetType; - if (input == IntValueKey.HookMask_Decal) return (int)IntValueKey.HookType; - - return 0; - } - - /// - /// If input is not a IID, 0 will be returned - /// - public static uint ConvertToIID(IntValueKey input) - { - if (input == IntValueKey.Container_Decal_IID) return 2; // CONTAINER_IID - if (input == IntValueKey.Wielder_Decal_IID) return 3; // WIELDER_IID - if (input == IntValueKey.Monarch_Decal_IID) return 26; // MONARCH_IID - if (input == IntValueKey.HouseOwner_Decal_IID) return 32; // HOUSE_OWNER_IID - - return 0; - } - - /// - /// If input is not a DID, 0 will be returned - /// - public static uint ConvertToDID(IntValueKey input) - { - if (input == IntValueKey.Setup_Decal_DID) return 1; // SETUP_DID - if (input == IntValueKey.Icon_Decal_DID) return 8; // ICON_DID - if (input == IntValueKey.Spell_Decal_DID) return 28; // SPELL_DID - if (input == IntValueKey.IconOverlay_Decal_DID) return 50; // ICON_OVERLAY_DID - if (input == IntValueKey.IconUnderlay_Decal_DID) return 52; // ICON_UNDERLAY_DID - - return 0; - } - } -} diff --git a/Shared/Constants/ItemType.cs b/Shared/Constants/ItemType.cs deleted file mode 100644 index 4b5e706..0000000 --- a/Shared/Constants/ItemType.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; - -namespace Mag.Shared.Constants -{ - [Flags] - public enum ItemType : uint - { - None = 0x00000000, - MeleeWeapon = 0x00000001, - Armor = 0x00000002, - Clothing = 0x00000004, - Jewelry = 0x00000008, - Creature = 0x00000010, - Food = 0x00000020, - Money = 0x00000040, - Misc = 0x00000080, - MissileWeapon = 0x00000100, - Container = 0x00000200, - Useless = 0x00000400, - Gem = 0x00000800, - SpellComponents = 0x00001000, - Writable = 0x00002000, - Key = 0x00004000, - Caster = 0x00008000, - Portal = 0x00010000, - Lockable = 0x00020000, - PromissoryNote = 0x00040000, - ManaStone = 0x00080000, - Service = 0x00100000, - MagicWieldable = 0x00200000, - CraftCookingBase = 0x00400000, - CraftAlchemyBase = 0x00800000, - CraftFletchingBase = 0x02000000, - CraftAlchemyIntermediate = 0x04000000, - CraftFletchingIntermediate = 0x08000000, - LifeStone = 0x10000000, - TinkeringTool = 0x20000000, - TinkeringMaterial = 0x40000000, - Gameboard = 0x80000000, - - PortalMagicTarget = Portal | LifeStone, - LockableMagicTarget = Misc | Container, - Vestements = Armor | Clothing, - Weapon = MeleeWeapon | MissileWeapon, - WeaponOrCaster = MeleeWeapon | MissileWeapon | Caster, - Item = MeleeWeapon | Armor | Clothing | Jewelry | Food | Money | Misc | MissileWeapon | Container | - Gem | SpellComponents | Writable | Key | Caster | Portal | PromissoryNote | ManaStone | MagicWieldable, - RedirectableItemEnchantmentTarget = MeleeWeapon | Armor | Clothing | MissileWeapon | Caster, - ItemEnchantableTarget = MeleeWeapon | Armor | Clothing | Jewelry | Misc | MissileWeapon | Container | Gem | Caster | ManaStone, - VendorShopKeep = MeleeWeapon | Armor | Clothing | Food | Misc | MissileWeapon | Container | Useless | Writable | Key | - PromissoryNote | CraftFletchingIntermediate | TinkeringMaterial, - VendorGrocer = Food | Container | Writable | Key | PromissoryNote | CraftCookingBase - } -} diff --git a/Shared/Constants/MaterialType.cs b/Shared/Constants/MaterialType.cs deleted file mode 100644 index 44eab94..0000000 --- a/Shared/Constants/MaterialType.cs +++ /dev/null @@ -1,80 +0,0 @@ - -namespace Mag.Shared.Constants -{ - public enum MaterialType : uint - { - Unknown = 0x00000000, - Ceramic = 0x00000001, - Porcelain = 0x00000002, - Linen = 0x00000004, - Satin = 0x00000005, - Silk = 0x00000006, - Velvet = 0x00000007, - Wool = 0x00000008, - Agate = 0x0000000A, - Amber = 0x0000000B, - Amethyst = 0x0000000C, - Aquamarine = 0x0000000D, - Azurite = 0x0000000E, - BlackGarnet = 0x0000000F, - BlackOpal = 0x00000010, - Bloodstone = 0x00000011, - Carnelian = 0x00000012, - Citrine = 0x00000013, - Diamond = 0x00000014, - Emerald = 0x00000015, - FireOpal = 0x00000016, - GreenGarnet = 0x00000017, - GreenJade = 0x00000018, - Hematite = 0x00000019, - ImperialTopaz = 0x0000001A, - Jet = 0x0000001B, - LapisLazuli = 0x0000001C, - LavenderJade = 0x0000001D, - Malachite = 0x0000001E, - Moonstone = 0x0000001F, - Onyx = 0x00000020, - Opal = 0x00000021, - Peridot = 0x00000022, - RedGarnet = 0x00000023, - RedJade = 0x00000024, - RoseQuartz = 0x00000025, - Ruby = 0x00000026, - Sapphire = 0x00000027, - SmokeyQuartz = 0x00000028, - Sunstone = 0x00000029, - TigerEye = 0x0000002A, - Tourmaline = 0x0000002B, - Turquoise = 0x0000002C, - WhiteJade = 0x0000002D, - WhiteQuartz = 0x0000002E, - WhiteSapphire = 0x0000002F, - YellowGarnet = 0x00000030, - YellowTopaz = 0x00000031, - Zircon = 0x00000032, - Ivory = 0x00000033, - Leather = 0x00000034, - ArmoredilloHide = 0x00000035, - GromnieHide = 0x00000036, - ReedSharkHide = 0x00000037, - Brass = 0x00000039, - Bronze = 0x0000003A, - Copper = 0x0000003B, - Gold = 0x0000003C, - Iron = 0x0000003D, - Pyreal = 0x0000003E, - Silver = 0x0000003F, - Steel = 0x00000040, - Alabaster = 0x00000042, - Granite = 0x00000043, - Marble = 0x00000044, - Obsidian = 0x00000045, - Sandstone = 0x00000046, - Serpentine = 0x00000047, - Ebony = 0x00000049, - Mahogany = 0x0000004A, - Oak = 0x0000004B, - Pine = 0x0000004C, - Teak = 0x0000004D, - } -} diff --git a/Shared/Constants/QuadValueKey.cs b/Shared/Constants/QuadValueKey.cs deleted file mode 100644 index c77eb48..0000000 --- a/Shared/Constants/QuadValueKey.cs +++ /dev/null @@ -1,33 +0,0 @@ - -namespace Mag.Shared.Constants -{ - // https://github.com/ACEmulator/ACE/blob/master/Source/ACE.Entity/Enum/Properties/PropertyInt64.cs - public enum QuadValueKey - { - Undef = 0, - [SendOnLogin] - TotalExperience = 1, - [SendOnLogin] - AvailableExperience = 2, - AugmentationCost = 3, - ItemTotalXp = 4, - ItemBaseXp = 5, - [SendOnLogin] - AvailableLuminance = 6, - [SendOnLogin] - MaximumLuminance = 7, - InteractionReqs = 8, - - - // ACE Specific - /* custom */ - [ServerOnly] - AllegianceXPCached = 9000, - [ServerOnly] - AllegianceXPGenerated = 9001, - [ServerOnly] - AllegianceXPReceived = 9002, - [ServerOnly] - VerifyXp = 9003 - } -} diff --git a/Shared/Constants/SendOnLoginAttribute.cs b/Shared/Constants/SendOnLoginAttribute.cs deleted file mode 100644 index c6f14e2..0000000 --- a/Shared/Constants/SendOnLoginAttribute.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Mag.Shared.Constants -{ - /// - /// These are properties that aren't saved to the shard. - /// - public class SendOnLoginAttribute : Attribute - { - } -} diff --git a/Shared/Constants/ServerOnlyAttribute.cs b/Shared/Constants/ServerOnlyAttribute.cs deleted file mode 100644 index 442b0de..0000000 --- a/Shared/Constants/ServerOnlyAttribute.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Mag.Shared.Constants -{ - /// - /// These are properties that aren't saved to the shard. - /// - public class ServerOnlyAttribute : Attribute - { - } -} diff --git a/Shared/Constants/Skill.cs b/Shared/Constants/Skill.cs deleted file mode 100644 index 891889d..0000000 --- a/Shared/Constants/Skill.cs +++ /dev/null @@ -1,67 +0,0 @@ - -namespace Mag.Shared.Constants -{ - /// - /// note: even though these are unnumbered, order is very important. values of "none" or commented - /// as retired or unused --ABSOLUTELY CANNOT-- be removed. Skills that are none, retired, or not - /// implemented have been removed from the SkillHelper.ValidSkills hashset below. - /// - public enum Skill - { - None, - Axe, /* Retired */ - Bow, /* Retired */ - Crossbow, /* Retired */ - Dagger, /* Retired */ - Mace, /* Retired */ - MeleeDefense, - MissileDefense, - Sling, /* Retired */ - Spear, /* Retired */ - Staff, /* Retired */ - Sword, /* Retired */ - ThrownWeapon, /* Retired */ - UnarmedCombat, /* Retired */ - ArcaneLore, - MagicDefense, - ManaConversion, - Spellcraft, /* Unimplemented */ - ItemTinkering, - AssessPerson, - Deception, - Healing, - Jump, - Lockpick, - Run, - Awareness, /* Unimplemented */ - ArmsAndArmorRepair, /* Unimplemented */ - AssessCreature, - WeaponTinkering, - ArmorTinkering, - MagicItemTinkering, - CreatureEnchantment, - ItemEnchantment, - LifeMagic, - WarMagic, - Leadership, - Loyalty, - Fletching, - Alchemy, - Cooking, - Salvaging, - TwoHandedCombat, - Gearcraft, /* Retired */ - VoidMagic, - HeavyWeapons, - LightWeapons, - FinesseWeapons, - MissileWeapons, - Shield, - DualWield, - Recklessness, - SneakAttack, - DirtyFighting, - Challenge, /* Unimplemented */ - Summoning - } -} diff --git a/Shared/Constants/SpellCategory.cs b/Shared/Constants/SpellCategory.cs deleted file mode 100644 index 0d79776..0000000 --- a/Shared/Constants/SpellCategory.cs +++ /dev/null @@ -1,707 +0,0 @@ - -namespace Mag.Shared.Constants -{ - public enum SpellCategory - { - Undefined, - Strength_Raising, - Strength_Lowering, - Endurance_Raising, - Endurance_Lowering, - Quickness_Raising, - Quickness_Lowering, - Coordination_Raising, - Coordination_Lowering, - Focus_Raising, - Focus_Lowering, - Self_Raising, - Self_Lowering, - Focus_Concentration, - Focus_Disruption, - Focus_Brilliance, - Focus_Dullness, - Axe_Raising, - Axe_Lowering, - Bow_Raising, - Bow_Lowering, - Crossbow_Raising, - Crossbow_Lowering, - Dagger_Raising, - Dagger_Lowering, - Mace_Raising, - Mace_Lowering, - Spear_Raising, - Spear_Lowering, - Staff_Raising, - Staff_Lowering, - Sword_Raising, - Sword_Lowering, - Thrown_Weapons_Raising, - Thrown_Weapons_Lowering, - Unarmed_Combat_Raising, - Unarmed_Combat_Lowering, - Melee_Defense_Raising, - Melee_Defense_Lowering, - Missile_Defense_Raising, - Missile_Defense_Lowering, - Magic_Defense_Raising, - Magic_Defense_Lowering, - Creature_Enchantment_Raising, - Creature_Enchantment_Lowering, - Item_Enchantment_Raising, - Item_Enchantment_Lowering, - Life_Magic_Raising, - Life_Magic_Lowering, - War_Magic_Raising, - War_Magic_Lowering, - Mana_Conversion_Raising, - Mana_Conversion_Lowering, - Arcane_Lore_Raising, - Arcane_Lore_Lowering, - Appraise_Armor_Raising, - Appraise_Armor_Lowering, - Appraise_Item_Raising, - Appraise_Item_Lowering, - Appraise_Magic_Item_Raising, - Appraise_Magic_Item_Lowering, - Appraise_Weapon_Raising, - Appraise_Weapon_Lowering, - Assess_Monster_Raising, - Assess_Monster_Lowering, - Deception_Raising, - Deception_Lowering, - Healing_Raising, - Healing_Lowering, - Jump_Raising, - Jump_Lowering, - Leadership_Raising, - Leadership_Lowering, - Lockpick_Raising, - Lockpick_Lowering, - Loyalty_Raising, - Loyalty_Lowering, - Run_Raising, - Run_Lowering, - Health_Raising, - Health_Lowering, - Stamina_Raising, - Stamina_Lowering, - Mana_Raising, - Mana_Lowering, - Mana_Remedy, - Mana_Malediction, - Health_Transfer_to_caster, - Health_Transfer_from_caster, - Stamina_Transfer_to_caster, - Stamina_Transfer_from_caster, - Mana_Transfer_to_caster, - Mana_Transfer_from_caster, - Health_Accelerating, - Health_Decelerating, - Stamina_Accelerating, - Stamina_Decelerating, - Mana_Accelerating, - Mana_Decelerating, - Vitae_Raising, - Vitae_Lowering, - Acid_Protection, - Acid_Vulnerability, - Bludgeon_Protection, - Bludgeon_Vulnerability, - Cold_Protection, - Cold_Vulnerability, - Electric_Protection, - Electric_Vulnerability, - Fire_Protection, - Fire_Vulnerability, - Pierce_Protection, - Pierce_Vulnerability, - Slash_Protection, - Slash_Vulnerability, - Armor_Raising, - Armor_Lowering, - Acid_Missile, - Bludgeoning_Missile, - Cold_Missile, - Electric_Missile, - Fire_Missile, - Piercing_Missile, - Slashing_Missile, - Acid_Seeker, - Bludgeoning_Seeker, - Cold_Seeker, - Electric_Seeker, - Fire_Seeker, - Piercing_Seeker, - Slashing_Seeker, - Acid_Burst, - Bludgeoning_Burst, - Cold_Burst, - Electric_Burst, - Fire_Burst, - Piercing_Burst, - Slashing_Burst, - Acid_Blast, - Bludgeoning_Blast, - Cold_Blast, - Electric_Blast, - Fire_Blast, - Piercing_Blast, - Slashing_Blast, - Acid_Scatter, - Bludgeoning_Scatter, - Cold_Scatter, - Electric_Scatter, - Fire_Scatter, - Piercing_Scatter, - Slashing_Scatter, - Attack_Mod_Raising, - Attack_Mod_Lowering, - Damage_Raising, - Damage_Lowering, - Defense_Mod_Raising, - Defense_Mod_Lowering, - Weapon_Time_Raising, - Weapon_Time_Lowering, - Armor_Value_Raising, - Armor_Value_Lowering, - Acid_Resistance_Raising, - Acid_Resistance_Lowering, - Bludgeon_Resistance_Raising, - Bludgeon_Resistance_Lowering, - Cold_Resistance_Raising, - Cold_Resistance_Lowering, - Electric_Resistance_Raising, - Electric_Resistance_Lowering, - Fire_Resistance_Raising, - Fire_Resistance_Lowering, - Pierce_Resistance_Raising, - Pierce_Resistance_Lowering, - Slash_Resistance_Raising, - Slash_Resistance_Lowering, - Bludgeoning_Resistance_Raising, - Bludgeoning_Resistance_Lowering, - Slashing_Resistance_Raising, - Slashing_Resistance_Lowering, - Piercing_Resistance_Raising, - Piercing_Resistance_Lowering, - Electrical_Resistance_Raising, - Electrical_Resistance_Lowering, - Frost_Resistance_Raising, - Frost_Resistance_Lowering, - Flame_Resistance_Raising, - Flame_Resistance_Lowering, - Acidic_Resistance_Raising, - Acidic_Resistance_Lowering, - Armor_Level_Raising, - Armor_Level_Lowering, - Lockpick_Resistance_Raising, - Lockpick_Resistance_Lowering, - Appraisal_Resistance_Raising, - Appraisal_Resistance_Lowering, - Vision_Raising, - Vision_Lowering, - Transparency_Raising, - Transparency_Lowering, - Portal_Tie, - Portal_Recall, - Portal_Creation, - Portal_Item_Creation, - Vitae, - Assess_Person_Raising, - Assess_Person_Lowering, - Acid_Volley, - Bludgeoning_Volley, - Frost_Volley, - Lightning_Volley, - Flame_Volley, - Force_Volley, - Blade_Volley, - Portal_Sending, - Lifestone_Sending, - Cooking_Raising, - Cooking_Lowering, - Fletching_Raising, - Fletching_Lowering, - Alchemy_Lowering, - Alchemy_Raising, - Acid_Ring, - Bludgeoning_Ring, - Cold_Ring, - Electric_Ring, - Fire_Ring, - Piercing_Ring, - Slashing_Ring, - Acid_Wall, - Bludgeoning_Wall, - Cold_Wall, - Electric_Wall, - Fire_Wall, - Piercing_Wall, - Slashing_Wall, - Acid_Strike, - Bludgeoning_Strike, - Cold_Strike, - Electric_Strike, - Fire_Strike, - Piercing_Strike, - Slashing_Strike, - Acid_Streak, - Bludgeoning_Streak, - Cold_Streak, - Electric_Streak, - Fire_Streak, - Piercing_Streak, - Slashing_Streak, - Dispel, - Creature_Mystic_Raising, - Creature_Mystic_Lowering, - Item_Mystic_Raising, - Item_Mystic_Lowering, - War_Mystic_Raising, - War_Mystic_Lowering, - Health_Restoring, - Health_Depleting, - Mana_Restoring, - Mana_Depleting, - Strength_Increase, - Strength_Decrease, - Endurance_Increase, - Endurance_Decrease, - Quickness_Increase, - Quickness_Decrease, - Coordination_Increase, - Coordination_Decrease, - Focus_Increase, - Focus_Decrease, - Self_Increase, - Self_Decrease, - GreatVitality_Raising, - PoorVitality_Lowering, - GreatVigor_Raising, - PoorVigor_Lowering, - GreaterIntellect_Raising, - LessorIntellect_Lowering, - LifeGiver_Raising, - LifeTaker_Lowering, - StaminaGiver_Raising, - StaminaTaker_Lowering, - ManaGiver_Raising, - ManaTaker_Lowering, - Acid_Ward_Protection, - Acid_Ward_Vulnerability, - Fire_Ward_Protection, - Fire_Ward_Vulnerability, - Cold_Ward_Protection, - Cold_Ward_Vulnerability, - Electric_Ward_Protection, - Electric_Ward_Vulnerability, - Leadership_Obedience_Raising, - Leadership_Obedience_Lowering, - Melee_Defense_Shelter_Raising, - Melee_Defense_Shelter_Lowering, - Missile_Defense_Shelter_Raising, - Missile_Defense_Shelter_Lowering, - Magic_Defense_Shelter_Raising, - Magic_Defense_Shelter_Lowering, - HuntersAcumen_Raising, - HuntersAcumen_Lowering, - StillWater_Raising, - StillWater_Lowering, - StrengthofEarth_Raising, - StrengthofEarth_Lowering, - Torrent_Raising, - Torrent_Lowering, - Growth_Raising, - Growth_Lowering, - CascadeAxe_Raising, - CascadeAxe_Lowering, - CascadeDagger_Raising, - CascadeDagger_Lowering, - CascadeMace_Raising, - CascadeMace_Lowering, - CascadeSpear_Raising, - CascadeSpear_Lowering, - CascadeStaff_Raising, - CascadeStaff_Lowering, - StoneCliffs_Raising, - StoneCliffs_Lowering, - MaxDamage_Raising, - MaxDamage_Lowering, - Bow_Damage_Raising, - Bow_Damage_Lowering, - Bow_Range_Raising, - Bow_Range_Lowering, - Extra_Defense_Mod_Raising, - Extra_Defense_Mod_Lowering, - Extra_Bow_Skill_Raising, - Extra_Bow_Skill_Lowering, - Extra_Alchemy_Skill_Raising, - Extra_Alchemy_Skill_Lowering, - Extra_Arcane_Lore_Skill_Raising, - Extra_Arcane_Lore_Skill_Lowering, - Extra_Appraise_Armor_Skill_Raising, - Extra_Appraise_Armor_Skill_Lowering, - Extra_Cooking_Skill_Raising, - Extra_Cooking_Skill_Lowering, - Extra_Crossbow_Skill_Raising, - Extra_Crossbow_Skill_Lowering, - Extra_Deception_Skill_Raising, - Extra_Deception_Skill_Lowering, - Extra_Loyalty_Skill_Raising, - Extra_Loyalty_Skill_Lowering, - Extra_Fletching_Skill_Raising, - Extra_Fletching_Skill_Lowering, - Extra_Healing_Skill_Raising, - Extra_Healing_Skill_Lowering, - Extra_Melee_Defense_Skill_Raising, - Extra_Melee_Defense_Skill_Lowering, - Extra_Appraise_Item_Skill_Raising, - Extra_Appraise_Item_Skill_Lowering, - Extra_Jumping_Skill_Raising, - Extra_Jumping_Skill_Lowering, - Extra_Life_Magic_Skill_Raising, - Extra_Life_Magic_Skill_Lowering, - Extra_Lockpick_Skill_Raising, - Extra_Lockpick_Skill_Lowering, - Extra_Appraise_Magic_Item_Skill_Raising, - Extra_Appraise_Magic_Item_Skill_Lowering, - Extra_Mana_Conversion_Skill_Raising, - Extra_Mana_Conversion_Skill_Lowering, - Extra_Assess_Creature_Skill_Raising, - Extra_Assess_Creature_Skill_Lowering, - Extra_Assess_Person_Skill_Raising, - Extra_Assess_Person_Skill_Lowering, - Extra_Run_Skill_Raising, - Extra_Run_Skill_Lowering, - Extra_Sword_Skill_Raising, - Extra_Sword_Skill_Lowering, - Extra_Thrown_Weapons_Skill_Raising, - Extra_Thrown_Weapons_Skill_Lowering, - Extra_Unarmed_Combat_Skill_Raising, - Extra_Unarmed_Combat_Skill_Lowering, - Extra_Appraise_Weapon_Skill_Raising, - Extra_Appraise_Weapon_Skill_Lowering, - Armor_Increase, - Armor_Decrease, - Extra_Acid_Resistance_Raising, - Extra_Acid_Resistance_Lowering, - Extra_Bludgeon_Resistance_Raising, - Extra_Bludgeon_Resistance_Lowering, - Extra_Fire_Resistance_Raising, - Extra_Fire_Resistance_Lowering, - Extra_Cold_Resistance_Raising, - Extra_Cold_Resistance_Lowering, - Extra_Attack_Mod_Raising, - Extra_Attack_Mod_Lowering, - Extra_Armor_Value_Raising, - Extra_Armor_Value_Lowering, - Extra_Pierce_Resistance_Raising, - Extra_Pierce_Resistance_Lowering, - Extra_Slash_Resistance_Raising, - Extra_Slash_Resistance_Lowering, - Extra_Electric_Resistance_Raising, - Extra_Electric_Resistance_Lowering, - Extra_Weapon_Time_Raising, - Extra_Weapon_Time_Lowering, - Bludgeon_Ward_Protection, - Bludgeon_Ward_Vulnerability, - Slash_Ward_Protection, - Slash_Ward_Vulnerability, - Pierce_Ward_Protection, - Pierce_Ward_Vulnerability, - Stamina_Restoring, - Stamina_Depleting, - Fireworks, - Health_Divide, - Stamina_Divide, - Mana_Divide, - Coordination_Increase2, - Strength_Increase2, - Focus_Increase2, - Endurance_Increase2, - Self_Increase2, - Melee_Defense_Multiply, - Missile_Defense_Multiply, - Magic_Defense_Multiply, - Attributes_Decrease, - LifeGiver_Raising2, - Item_Enchantment_Raising2, - Skills_Decrease, - Extra_Mana_Conversion_Bonus, - War_Mystic_Raising2, - War_Mystic_Lowering2, - Magic_Defense_Shelter_Raising2, - Extra_Life_Magic_Skill_Raising2, - Creature_Mystic_Raising2, - Item_Mystic_Raising2, - Mana_Raising2, - Self_Raising2, - CreatureEnchantment_Raising2, - Salvaging_Raising, - Extra_Salvaging_Raising, - Extra_Salvaging_Raising2, - CascadeAxe_Raising2, - Extra_Bow_Skill_Raising2, - Extra_Thrown_Weapons_Skill_Raising2, - Extra_Crossbow_Skill_Raising2, - CascadeDagger_Raising2, - CascadeMace_Raising2, - Extra_Unarmed_Combat_Skill_Raising2, - CascadeSpear_Raising2, - CascadeStaff_Raising2, - Extra_Sword_Skill_Raising2, - Acid_Protection_Rare, - Acid_Resistance_Raising_Rare, - Alchemy_Raising_Rare, - Appraisal_Resistance_Lowering_Rare, - Appraise_Armor_Raising_Rare, - Appraise_Item_Raising_Rare, - Appraise_Magic_Item_Raising_Rare, - Appraise_Weapon_Raising_Rare, - Arcane_Lore_Raising_Rare, - Armor_Raising_Rare, - Armor_Value_Raising_Rare, - Assess_Monster_Raising_Rare, - Assess_Person_Raising_Rare, - Attack_Mod_Raising_Rare, - Axe_Raising_Rare, - Bludgeon_Protection_Rare, - Bludgeon_Resistance_Raising_Rare, - Bow_Raising_Rare, - Cold_Protection_Rare, - Cold_Resistance_Raising_Rare, - Cooking_Raising_Rare, - Coordination_Raising_Rare, - Creature_Enchantment_Raising_Rare, - Crossbow_Raising_Rare, - Dagger_Raising_Rare, - Damage_Raising_Rare, - Deception_Raising_Rare, - Defense_Mod_Raising_Rare, - Electric_Protection_Rare, - Electric_Resistance_Raising_Rare, - Endurance_Raising_Rare, - Fire_Protection_Rare, - Fire_Resistance_Raising_Rare, - Fletching_Raising_Rare, - Focus_Raising_Rare, - Healing_Raising_Rare, - Health_Accelerating_Rare, - Item_Enchantment_Raising_Rare, - Jump_Raising_Rare, - Leadership_Raising_Rare, - Life_Magic_Raising_Rare, - Lockpick_Raising_Rare, - Loyalty_Raising_Rare, - Mace_Raising_Rare, - Magic_Defense_Raising_Rare, - Mana_Accelerating_Rare, - Mana_Conversion_Raising_Rare, - Melee_Defense_Raising_Rare, - Missile_Defense_Raising_Rare, - Pierce_Protection_Rare, - Pierce_Resistance_Raising_Rare, - Quickness_Raising_Rare, - Run_Raising_Rare, - Self_Raising_Rare, - Slash_Protection_Rare, - Slash_Resistance_Raising_Rare, - Spear_Raising_Rare, - Staff_Raising_Rare, - Stamina_Accelerating_Rare, - Strength_Raising_Rare, - Sword_Raising_Rare, - Thrown_Weapons_Raising_Rare, - Unarmed_Combat_Raising_Rare, - War_Magic_Raising_Rare, - Weapon_Time_Raising_Rare, - Armor_Increase_Inky_Armor, - Magic_Defense_Shelter_Raising_Fiun, - Extra_Run_Skill_Raising_Fiun, - Extra_Mana_Conversion_Skill_Raising_Fiun, - Attributes_Increase_Cantrip1, - Extra_Melee_Defense_Skill_Raising2, - ACTDPurchaseRewardSpell, - ACTDPurchaseRewardSpellHealth, - SaltAsh_Attack_Mod_Raising, - Quickness_Increase2, - Extra_Alchemy_Skill_Raising2, - Extra_Cooking_Skill_Raising2, - Extra_Fletching_Skill_Raising2, - Extra_Lockpick_Skill_Raising2, - MucorManaWell, - Stamina_Restoring2, - Allegiance_Raising, - Health_DoT, - Health_DoT_Secondary, - Health_DoT_Tertiary, - Health_HoT, - Health_HoT_Secondary, - Health_HoT_Tertiary, - Health_Divide_Secondary, - Health_Divide_Tertiary, - SetSword_Raising, - SetAxe_Raising, - SetDagger_Raising, - SetMace_Raising, - SetSpear_Raising, - SetStaff_Raising, - SetUnarmed_Raising, - SetBow_Raising, - SetCrossbow_Raising, - SetThrown_Raising, - SetItemEnchantment_Raising, - SetCreatureEnchantment_Raising, - SetWarMagic_Raising, - SetLifeMagic_Raising, - SetMeleeDefense_Raising, - SetMissileDefense_Raising, - SetMagicDefense_Raising, - SetStamina_Accelerating, - SetCooking_Raising, - SetFletching_Raising, - SetLockpick_Raising, - SetAlchemy_Raising, - SetSalvaging_Raising, - SetArmorExpertise_Raising, - SetWeaponExpertise_Raising, - SetItemTinkering_Raising, - SetMagicItemExpertise_Raising, - SetLoyalty_Raising, - SetStrength_Raising, - SetEndurance_Raising, - SetCoordination_Raising, - SetQuickness_Raising, - SetFocus_Raising, - SetWillpower_Raising, - SetHealth_Raising, - SetStamina_Raising, - SetMana_Raising, - SetSprint_Raising, - SetJumping_Raising, - SetSlashResistance_Raising, - SetBludgeonResistance_Raising, - SetPierceResistance_Raising, - SetFlameResistance_Raising, - SetAcidResistance_Raising, - SetFrostResistance_Raising, - SetLightningResistance_Raising, - Crafting_LockPick_Raising, - Crafting_Fletching_Raising, - Crafting_Cooking_Raising, - Crafting_Alchemy_Raising, - Crafting_ArmorTinkering_Raising, - Crafting_WeaponTinkering_Raising, - Crafting_MagicTinkering_Raising, - Crafting_ItemTinkering_Raising, - SkillPercent_Alchemy_Raising, - TwoHanded_Raising, - TwoHanded_Lowering, - Extra_TwoHanded_Skill_Raising, - Extra_TwoHanded_Skill_Lowering, - Extra_TwoHanded_Skill_Raising2, - TwoHanded_Raising_Rare, - SetTwoHanded_Raising, - GearCraft_Raising, - GearCraft_Lowering, - Extra_GearCraft_Skill_Raising, - Extra_GearCraft_Skill_Lowering, - Extra_GearCraft_Skill_Raising2, - GearCraft_Raising_Rare, - SetGearCraft_Raising, - LoyaltyMana_Raising, - LoyaltyStamina_Raising, - LeadershipHealth_Raising, - TrinketDamage_Raising, - TrinketDamage_Lowering, - TrinketHealth_Raising, - TrinketStamina_Raising, - TrinketMana_Raising, - TrinketXP_Raising, - DeceptionArcaneLore_Raising, - HealOverTime_Raising, - DamageOverTime_Raising, - HealingResistRating_Raising, - AetheriaDamageRating_Raising, - AetheriaDamageReduction_Raising, - SKIPPED, - AetheriaHealth_Raising, - AetheriaStamina_Raising, - AetheriaMana_Raising, - AetheriaCriticalDamage_Raising, - AetheriaHealingAmplification_Raising, - AetheriaProcDamageRating_Raising, - AetheriaProcDamageReduction_Raising, - AetheriaProcHealthOverTime_Raising, - AetheriaProcDamageOverTime_Raising, - AetheriaProcHealingReduction_Raising, - RareDamageRating_Raising, - RareDamageReductionRating_Raising, - AetheriaEndurance_Raising, - NetherDamageOverTime_Raising, - NetherDamageOverTime_Raising2, - NetherDamageOverTime_Raising3, - Nether_Streak, - Nether_Missile, - Nether_Ring, - NetherDamageRating_Lowering, - NetherDamageHealingReduction_Raising, - Void_Magic_Lowering, - Void_Magic_Raising, - Void_Mystic_Raising, - SetVoidMagic_Raising, - Void_Magic_Raising_Rare, - Void_Mystic_Raising2, - LuminanceDamageRating_Raising, - LuminanceDamageReduction_Raising, - LuminanceHealth_Raising, - AetheriaCriticalReduction_Raising, - Extra_Missile_Defense_Skill_Raising, - Extra_Missile_Defense_Skill_Lowering, - Extra_Missile_Defense_Skill_Raising2, - AetheriaHealthResistance_Raising, - AetheriaDotResistance_Raising, - Cloak_Skill_Raising, - Cloak_All_Skill_Raising, - Cloak_Magic_Defense_Lowering, - Cloak_Melee_Defense_Lowering, - Cloak_Missile_Defense_Lowering, - DirtyFighting_Lowering, - DirtyFighting_Raising, - Extra_DirtyFighting_Raising, - DualWield_Lowering, - DualWield_Raising, - Extra_DualWield_Raising, - Recklessness_Lowering, - Recklessness_Raising, - Extra_Recklessness_Raising, - Shield_Lowering, - Shield_Raising, - Extra_Shield_Raising, - SneakAttack_Lowering, - SneakAttack_Raising, - Extra_SneakAttack_Raising, - Rare_DirtyFighting_Raising, - Rare_DualWield_Raising, - Rare_Recklessness_Raising, - Rare_Shield_Raising, - Rare_SneakAttack_Raising, - DF_Attack_Skill_Debuff, - DF_Bleed_Damage, - DF_Defense_Skill_Debuff, - DF_Healing_Debuff, - SetDirtyFighting_Raising, - SetDualWield_Raising, - SetRecklessness_Raising, - SetShield_Raising, - SetSneakAttack_Raising, - LifeGiver_Mhoire, - RareDamageRating_Raising2, - Spell_Damage_Raising, - Summoning_Raising, - Summoning_Lowering, - Extra_Summoning_Skill_Raising, - SetSummoning_Raising - } -} diff --git a/Shared/Constants/StringValueKey.cs b/Shared/Constants/StringValueKey.cs deleted file mode 100644 index 0619517..0000000 --- a/Shared/Constants/StringValueKey.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System.ComponentModel; - -namespace Mag.Shared.Constants -{ - // https://github.com/ACEmulator/ACE/blob/master/Source/ACE.Entity/Enum/Properties/PropertyString.cs - public enum StringValueKey - { - // properties marked as ServerOnly are properties we never saw in PCAPs, from here: - // http://ac.yotesfan.com/ace_object/not_used_enums.php - // source: @OptimShi - // description attributes are used by the weenie editor for a cleaner display name - Undef = 0, - [SendOnLogin] - Name = 1, - /// - /// default "Adventurer" - /// - Title = 2, - Sex = 3, - HeritageGroup = 4, - Template = 5, - AttackersName = 6, - Inscription = 7, - [Description("Scribe Name")] - ScribeName = 8, - VendorsName = 9, - Fellowship = 10, - MonarchsName = 11, - [ServerOnly] - LockCode = 12, - [ServerOnly] - KeyCode = 13, - Use = 14, - ShortDesc = 15, - LongDesc = 16, - ActivationTalk = 17, - [ServerOnly] - UseMessage = 18, - ItemHeritageGroupRestriction = 19, - PluralName = 20, - MonarchsTitle = 21, - ActivationFailure = 22, - ScribeAccount = 23, - TownName = 24, - CraftsmanName = 25, - UsePkServerError = 26, - ScoreCachedText = 27, - ScoreDefaultEntryFormat = 28, - ScoreFirstEntryFormat = 29, - ScoreLastEntryFormat = 30, - ScoreOnlyEntryFormat = 31, - ScoreNoEntry = 32, - [ServerOnly] - Quest = 33, - GeneratorEvent = 34, - PatronsTitle = 35, - HouseOwnerName = 36, - QuestRestriction = 37, - AppraisalPortalDestination = 38, - TinkerName = 39, - ImbuerName = 40, - HouseOwnerAccount = 41, - DisplayName = 42, - DateOfBirth = 43, - ThirdPartyApi = 44, - KillQuest = 45, - Afk = 46, - AllegianceName = 47, - AugmentationAddQuest = 48, - KillQuest2 = 49, - KillQuest3 = 50, - UseSendsSignal = 51, - - [Description("Gear Plating Name")] - GearPlatingName = 52, - - - // ACE Specific - [ServerOnly] - PCAPRecordedCurrentMotionState = 8006, - [ServerOnly] - PCAPRecordedServerName = 8031, - [ServerOnly] - PCAPRecordedCharacterName = 8032, - - /* custom */ - [ServerOnly] - AllegianceMotd = 9001, - [ServerOnly] - AllegianceMotdSetBy = 9002, - [ServerOnly] - AllegianceSpeakerTitle = 9003, - [ServerOnly] - AllegianceSeneschalTitle = 9004, - [ServerOnly] - AllegianceCastellanTitle = 9005, - [ServerOnly] - GodState = 9006, - [ServerOnly] - TinkerLog = 9007, - - - // Decal Specific - SecondaryName_Decal = 184549376, - } -} diff --git a/Shared/Constants/WeenieType.cs b/Shared/Constants/WeenieType.cs deleted file mode 100644 index 1b2daf0..0000000 --- a/Shared/Constants/WeenieType.cs +++ /dev/null @@ -1,79 +0,0 @@ - -namespace Mag.Shared.Constants -{ - public enum WeenieType : uint - { - Undef, - Generic, - Clothing, - MissileLauncher, - Missile, - Ammunition, - MeleeWeapon, - Portal, - Book, - Coin, - Creature, - Admin, - Vendor, - HotSpot, - Corpse, - Cow, - AI, - Machine, - Food, - Door, - Chest, - Container, - Key, - Lockpick, - PressurePlate, - LifeStone, - Switch, - PKModifier, - Healer, - LightSource, - Allegiance, - UNKNOWN__GUESSEDNAME32, // NOTE: Missing 1 - SpellComponent, - ProjectileSpell, - Scroll, - Caster, - Channel, - ManaStone, - Gem, - AdvocateFane, - AdvocateItem, - Sentinel, - GSpellEconomy, - LSpellEconomy, - CraftTool, - LScoreKeeper, - GScoreKeeper, - GScoreGatherer, - ScoreBook, - EventCoordinator, - Entity, - Stackable, - HUD, - House, - Deed, - SlumLord, - Hook, - Storage, - BootSpot, - HousePortal, - Game, - GamePiece, - SkillAlterationDevice, - AttributeTransferDevice, - Hooker, - AllegianceBindstone, - InGameStatKeeper, - AugmentationDevice, - SocialManager, - Pet, - PetDevice, - CombatPet - } -} diff --git a/Shared/Constants/WieldRequirement.cs b/Shared/Constants/WieldRequirement.cs deleted file mode 100644 index 6b6d6c7..0000000 --- a/Shared/Constants/WieldRequirement.cs +++ /dev/null @@ -1,20 +0,0 @@ - -namespace Mag.Shared.Constants -{ - public enum WieldRequirement - { - Invalid, - Skill, - RawSkill, - Attrib, - RawAttrib, - SecondaryAttrib, - RawSecondaryAttrib, - Level, - Training, - IntStat, - BoolStat, - CreatureType, - HeritageType - } -} diff --git a/Shared/Debug.cs b/Shared/Debug.cs deleted file mode 100644 index 9d42758..0000000 --- a/Shared/Debug.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System; -using System.Globalization; -using System.IO; - -using Decal.Adapter; - -namespace Mag.Shared -{ - static class Debug - { - static string _debugLogPath; - static string _errorLogPath; - - static string _pluginName; - - public static void Init(string debugLogPath, string errorLogPath, string pluginName) - { - _debugLogPath = debugLogPath; - _errorLogPath = errorLogPath; - - _pluginName = pluginName; - } - - /// - /// This will write to the debug.txt - /// - public static void LogDebug(string message) - { - try - { - if (String.IsNullOrEmpty(_debugLogPath)) - return; - - FileInfo fileInfo = new FileInfo(_debugLogPath); - - // Limit the file to 1MB - bool append = !(fileInfo.Exists && fileInfo.Length > 1048576); - - using (StreamWriter writer = new StreamWriter(fileInfo.FullName, append)) - { - writer.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "," + message); - writer.Close(); - } - } - catch - { - // Eat the exception, yumm. - } - } - - /// - /// This will only write the exception to the errors.txt file if DebugEnabled is true. - /// - public static void LogException(Exception ex, string note = null) - { - try - { - //if (!Settings.SettingsManager.Misc.DebuggingEnabled.Value) - // return; - - if (note != null) - MyClasses.VCS_Connector.SendChatTextCategorized("Errors", "<{" + _pluginName + "}>: " + "Exception caught: " + ex.Message + Environment.NewLine + ex.Source + Environment.NewLine + ex.StackTrace + Environment.NewLine + "Note: " + note, 5); - else - MyClasses.VCS_Connector.SendChatTextCategorized("Errors", "<{" + _pluginName + "}>: " + "Exception caught: " + ex.Message + Environment.NewLine + ex.Source + Environment.NewLine + ex.StackTrace, 5); - - if (String.IsNullOrEmpty(_errorLogPath)) - return; - - FileInfo fileInfo = new FileInfo(_errorLogPath); - - // Limit the file to 1MB - bool append = !(fileInfo.Exists && fileInfo.Length > 1048576); - - using (StreamWriter writer = new StreamWriter(fileInfo.FullName, append)) - { - writer.WriteLine("============================================================================"); - - writer.WriteLine(DateTime.Now.ToString(CultureInfo.InvariantCulture)); - writer.WriteLine(ex); - - if (note != null) - writer.WriteLine("Note: " + note); - - writer.WriteLine("============================================================================"); - writer.WriteLine(""); - writer.Close(); - } - } - catch - { - // Eat the exception, yumm. - } - } - - public static void LogText(string text) - { - try - { - //if (!Settings.SettingsManager.Misc.DebuggingEnabled.Value) - // return; - - MyClasses.VCS_Connector.SendChatTextCategorized("CommandLine", "<{" + _pluginName + "}>: " + "Log Text: " + text, 5); - - if (String.IsNullOrEmpty(_errorLogPath)) - return; - - FileInfo fileInfo = new FileInfo(_errorLogPath); - - // Limit the file to 1MB - bool append = !(fileInfo.Exists && fileInfo.Length > 1048576); - - using (StreamWriter writer = new StreamWriter(fileInfo.FullName, append)) - { - writer.WriteLine(DateTime.Now + ": " + text); - writer.Close(); - } - } - catch (Exception ex) { LogException(ex); } - } - - /// - /// This will only write the message to the chat if DebugEnabled is true. - /// - /// - /// - /// - public static void WriteToChat(string message, int color = 5, int target = 1) - { - try - { - //if (!Settings.SettingsManager.Misc.DebuggingEnabled.Value) - // return; - - MyClasses.VCS_Connector.SendChatTextCategorized("CommandLine", "<{" + _pluginName + "}>: " + message, color, target); - } - catch (Exception ex) { LogException(ex); } - } - } -} diff --git a/Shared/DecalProxy.cs b/Shared/DecalProxy.cs deleted file mode 100644 index 7342ab2..0000000 --- a/Shared/DecalProxy.cs +++ /dev/null @@ -1,178 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -//File: DecalProxy.cs -// -//Description: Contains reflection-based calls of newer Decal methods, so that -// they can be easily invoked only if the currently running version contains -// the desired feature. -// -// -//This file is Copyright (c) 2013 VirindiPlugins -// -//Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -//The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -/////////////////////////////////////////////////////////////////////////////// - -//Virindi: yes, or you could just directly resize the window -//Virindi: note... -//Virindi: right now you have to call move after you call resize -//Virindi: so right now what you have to do if you use that resize is grab the location, resize, then move back to the original location - -using System; -using System.Runtime.InteropServices; -using System.Reflection; -using System.Drawing; - -using Decal.Adapter; - -namespace Mag.Shared -{ - internal static class DecalProxy - { - public enum UIElementType : int - { - Smartbox = 0x1000049A, - Chat = 0x10000601, - FloatChat1 = 0x10000505, - FloatChat2 = 0x1000050E, - FloatChat3 = 0x1000050F, - FloatChat4 = 0x10000510, - Examination = 0x100005F7, - Vitals = 0x100005FA, - EnvPack = 0x100005FD, - Panels = 0x100005FF, - TBar = 0x10000603, - Indicators = 0x10000611, - ProgressBar = 0x10000613, - Combat = 0x100006B5, - Radar = 0x100006D2, - } - - - static Version iCachedDecalVersion = null; - static Assembly iCachedDecalAssembly = null; - public static bool TestDecalVersion(Version v) - { - if (iCachedDecalVersion != null) return iCachedDecalVersion >= v; - - System.Reflection.Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); - - foreach (System.Reflection.Assembly a in asms) - { - AssemblyName nmm = a.GetName(); - if (nmm.Name == "Decal.Adapter") - { - iCachedDecalVersion = nmm.Version; - iCachedDecalAssembly = a; - return (nmm.Version >= v); - } - } - - return false; - } - - public static void Hooks_UIElementMove(Decal.Adapter.Wrappers.HooksWrapper hooks, UIElementType e, int x, int y) - { - //This will load the cached assembly. We don't actually care what the version is - //since we just check below if the required members are present. - TestDecalVersion(new Version()); - - int ee = (int)e; - - Type DecalType_UIElementType = iCachedDecalAssembly.GetType("Decal.Adapter.Wrappers.UIElementType"); - if (DecalType_UIElementType == null) return; - object e_decal = Enum.ToObject(DecalType_UIElementType, ee); - - Type DecalType_HooksWrapper = iCachedDecalAssembly.GetType("Decal.Adapter.Wrappers.HooksWrapper"); - if (DecalType_HooksWrapper == null) return; - MethodInfo call = DecalType_HooksWrapper.GetMethod("UIElementMove", new Type[] { DecalType_UIElementType, typeof(int), typeof(int) }); - if (call == null) return; - - call.Invoke(hooks, new object[] { e_decal, x, y }); - } - - public static void Hooks_UIElementResize(Decal.Adapter.Wrappers.HooksWrapper hooks, UIElementType e, int width, int height) - { - //This will load the cached assembly. We don't actually care what the version is - //since we just check below if the required members are present. - TestDecalVersion(new Version()); - - int ee = (int)e; - - Type DecalType_UIElementType = iCachedDecalAssembly.GetType("Decal.Adapter.Wrappers.UIElementType"); - if (DecalType_UIElementType == null) return; - object e_decal = Enum.ToObject(DecalType_UIElementType, ee); - - Type DecalType_HooksWrapper = iCachedDecalAssembly.GetType("Decal.Adapter.Wrappers.HooksWrapper"); - if (DecalType_HooksWrapper == null) return; - MethodInfo call = DecalType_HooksWrapper.GetMethod("UIElementResize", new Type[] { DecalType_UIElementType, typeof(int), typeof(int) }); - if (call == null) return; - - call.Invoke(hooks, new object[] { e_decal, width, height }); - } - - public static Rectangle Hooks_UIElementRegion(Decal.Adapter.Wrappers.HooksWrapper hooks, UIElementType e) - { - //This will load the cached assembly. We don't actually care what the version is - //since we just check below if the required members are present. - TestDecalVersion(new Version()); - - int ee = (int)e; - - Type DecalType_UIElementType = iCachedDecalAssembly.GetType("Decal.Adapter.Wrappers.UIElementType"); - if (DecalType_UIElementType == null) return Rectangle.Empty; - object e_decal = Enum.ToObject(DecalType_UIElementType, ee); - - Type DecalType_HooksWrapper = iCachedDecalAssembly.GetType("Decal.Adapter.Wrappers.HooksWrapper"); - if (DecalType_HooksWrapper == null) return Rectangle.Empty; - MethodInfo call = DecalType_HooksWrapper.GetMethod("UIElementRegion", new Type[] { DecalType_UIElementType }); - if (call == null) return Rectangle.Empty; - - return (Rectangle)call.Invoke(hooks, new object[] { e_decal }); - } - - - [DllImport("Decal.dll")] - static extern int DispatchOnChatCommand(ref IntPtr str, [MarshalAs(UnmanagedType.U4)] int target); - - static bool Decal_DispatchOnChatCommand(string cmd) - { - IntPtr bstr = Marshal.StringToBSTR(cmd); - - try - { - bool eaten = (DispatchOnChatCommand(ref bstr, 1) & 0x1) > 0; - - return eaten; - } - finally - { - Marshal.FreeBSTR(bstr); - } - } - - /// - /// This will first attempt to send the messages to all plugins. If no plugins set e.Eat to true on the message, it will then simply call InvokeChatParser. - /// - /// - public static void DispatchChatToBoxWithPluginIntercept(string cmd) - { - if (!Decal_DispatchOnChatCommand(cmd)) - CoreManager.Current.Actions.InvokeChatParser(cmd); - } - } -} \ No newline at end of file diff --git a/Shared/ItemInfo.cs b/Shared/ItemInfo.cs deleted file mode 100644 index 7d9fc3e..0000000 --- a/Shared/ItemInfo.cs +++ /dev/null @@ -1,355 +0,0 @@ -using System; -using System.Collections.Generic; - -using Mag.Shared.Constants; -using Mag.Shared.Spells; - -namespace Mag.Shared -{ - /// - /// Instantiate this object with the item you want info for. - /// ToString() this object for the info. - /// - public class ItemInfo - { - private readonly MyWorldObject mwo; - - public ItemInfo(MyWorldObject myWorldObject) - { - mwo = myWorldObject; - } - - public override string ToString() - { - return ToString(true, true); - } - - public string ToString(bool showBuffedValues, bool showValueAndBurden) - { - System.Text.StringBuilder sb = new System.Text.StringBuilder(); - - if (mwo.Values(IntValueKey.MaterialType) > 0) - { - if (Dictionaries.MaterialInfo.ContainsKey(mwo.Values(IntValueKey.MaterialType))) - sb.Append(Dictionaries.MaterialInfo[mwo.Values(IntValueKey.MaterialType)] + " "); - else - sb.Append("unknown material " + mwo.Values(IntValueKey.MaterialType) + " "); - } - - sb.Append(mwo.Name); - - if (mwo.Values((IntValueKey)353) > 0) - { - if (Dictionaries.MasteryInfo.ContainsKey(mwo.Values((IntValueKey)353))) - sb.Append(" (" + Dictionaries.MasteryInfo[mwo.Values((IntValueKey)353)] + ")"); - else - sb.Append(" (Unknown mastery " + mwo.Values((IntValueKey)353) + ")"); - } - - int set = mwo.Values((IntValueKey)265, 0); - if (set != 0) - { - sb.Append(", "); - if (Dictionaries.AttributeSetInfo.ContainsKey(set)) - sb.Append(Dictionaries.AttributeSetInfo[set]); - else - sb.Append("Unknown set " + set); - } - - if (mwo.Values(IntValueKey.ArmorLevel) > 0) - sb.Append(", AL " + mwo.Values(IntValueKey.ArmorLevel)); - - if (mwo.Values(IntValueKey.ImbuedEffect) > 0) - { - sb.Append(","); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 1) == 1) sb.Append(" CS"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 2) == 2) sb.Append(" CB"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 4) == 4) sb.Append(" AR"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 8) == 8) sb.Append(" SlashRend"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 16) == 16) sb.Append(" PierceRend"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 32) == 32) sb.Append(" BludgeRend"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 64) == 64) sb.Append(" AcidRend"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 128) == 128) sb.Append(" FrostRend"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 256) == 256) sb.Append(" LightRend"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 512) == 512) sb.Append(" FireRend"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 1024) == 1024) sb.Append(" MeleeImbue"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 4096) == 4096) sb.Append(" MagicImbue"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 8192) == 8192) sb.Append(" Hematited"); - if ((mwo.Values(IntValueKey.ImbuedEffect) & 536870912) == 536870912) sb.Append(" MagicAbsorb"); - } - - if (mwo.Values(IntValueKey.NumTimesTinkered) > 0) - sb.Append(", Tinks " + mwo.Values(IntValueKey.NumTimesTinkered)); - - if (mwo.Values(IntValueKey.MaxDamage_Decal) != 0 && mwo.Values(DoubleValueKey.Variance_Decal) != 0) - sb.Append(", " + (mwo.Values(IntValueKey.MaxDamage_Decal) - (mwo.Values(IntValueKey.MaxDamage_Decal) * mwo.Values(DoubleValueKey.Variance_Decal))).ToString("N2") + "-" + mwo.Values(IntValueKey.MaxDamage_Decal)); - else if (mwo.Values(IntValueKey.MaxDamage_Decal) != 0 && mwo.Values(DoubleValueKey.Variance_Decal) == 0) - sb.Append(", " + mwo.Values(IntValueKey.MaxDamage_Decal)); - - if (mwo.Values(IntValueKey.ElementalDamageBonus, 0) != 0) - sb.Append(", +" + mwo.Values(IntValueKey.ElementalDamageBonus)); - - if (mwo.Values(DoubleValueKey.DamageBonus_Decal, 1) != 1) - sb.Append(", +" + Math.Round(((mwo.Values(DoubleValueKey.DamageBonus_Decal) - 1) * 100)) + "%"); - - if (mwo.Values(DoubleValueKey.ElementalDamageMod, 1) != 1) - sb.Append(", +" + Math.Round(((mwo.Values(DoubleValueKey.ElementalDamageMod) - 1) * 100)) + "%vs. Monsters"); - - if (mwo.Values(DoubleValueKey.AttackBonus_Decal, 1) != 1) - sb.Append(", +" + Math.Round(((mwo.Values(DoubleValueKey.AttackBonus_Decal) - 1) * 100)) + "%a"); - - if (mwo.Values(DoubleValueKey.WeaponDefense, 1) != 1) - sb.Append(", " + Math.Round(((mwo.Values(DoubleValueKey.WeaponDefense) - 1) * 100)) + "%md"); - - if (mwo.Values(DoubleValueKey.WeaponMagicDefense, 1) != 1) - sb.Append(", " + Math.Round(((mwo.Values(DoubleValueKey.WeaponMagicDefense) - 1) * 100), 1) + "%mgc.d"); - - if (mwo.Values(DoubleValueKey.WeaponMissileDefense, 1) != 1) - sb.Append(", " + Math.Round(((mwo.Values(DoubleValueKey.WeaponMissileDefense) - 1) * 100), 1) + "%msl.d"); - - if (mwo.Values(DoubleValueKey.ManaConversionMod) != 0) - sb.Append(", " + Math.Round((mwo.Values(DoubleValueKey.ManaConversionMod) * 100)) + "%mc"); - - if (showBuffedValues && (mwo.ObjectClass == (int)ObjectClass.MeleeWeapon || mwo.ObjectClass == (int)ObjectClass.MissileWeapon || mwo.ObjectClass == (int)ObjectClass.WandStaffOrb)) - { - sb.Append(", ("); - - // (Damage) - if (mwo.ObjectClass == (int)ObjectClass.MeleeWeapon) - sb.Append(mwo.CalcedBuffedTinkedDoT.ToString("N1") + "/" + mwo.GetBuffedIntValueKey((int)IntValueKey.MaxDamage_Decal)); - - if (mwo.ObjectClass == (int)ObjectClass.MissileWeapon) - sb.Append(mwo.CalcedBuffedMissileDamage.ToString("N1")); - - if (mwo.ObjectClass == (int)ObjectClass.WandStaffOrb) - sb.Append(((mwo.GetBuffedDoubleValueKey((int)DoubleValueKey.ElementalDamageMod) - 1) * 100).ToString("N1")); - - // (AttackBonus/MeleeDefenseBonus/ManaCBonus) - sb.Append(" "); - - if (mwo.Values(DoubleValueKey.AttackBonus_Decal, 1) != 1) - sb.Append(Math.Round(((mwo.GetBuffedDoubleValueKey((int)DoubleValueKey.AttackBonus_Decal) - 1) * 100)).ToString("N1") + "/"); - - if (mwo.Values(DoubleValueKey.WeaponDefense, 1) != 1) - sb.Append(Math.Round(((mwo.GetBuffedDoubleValueKey((int)DoubleValueKey.WeaponDefense) - 1) * 100)).ToString("N1")); - - if (mwo.Values(DoubleValueKey.ManaConversionMod) != 0) - sb.Append("/" + Math.Round(mwo.GetBuffedDoubleValueKey((int)DoubleValueKey.ManaConversionMod) * 100)); - - sb.Append(")"); - } - - if (mwo.Spells.Count > 0) - { - List sortedSpellIds = new List(); - - foreach (var spell in mwo.Spells) - sortedSpellIds.Add(spell); - - sortedSpellIds.Sort(); - sortedSpellIds.Reverse(); - - foreach (int spellId in sortedSpellIds) - { - Spell spell = SpellTools.GetSpell(spellId); - - if (spell == null) - continue; - - // If the item is not loot generated, show all spells - if (!mwo.IntValues.ContainsKey((int)IntValueKey.MaterialType)) - goto ShowSpell; - - // Always show Minor/Major/Epic Impen - if (spell.Name.Contains("Minor Impenetrability") || spell.Name.Contains("Major Impenetrability") || spell.Name.Contains("Epic Impenetrability") || spell.Name.Contains("Legendary Impenetrability")) - goto ShowSpell; - - // Always show trinket spells - if (spell.Name.Contains("Augmented")) - goto ShowSpell; - - if (mwo.Values(IntValueKey.ResistMagic, 0) != 0) - { - // Show banes and impen on unenchantable equipment - if (spell.Name.Contains(" Bane") || spell.Name.Contains("Impen") || spell.Name.StartsWith("Brogard")) - goto ShowSpell; - } - else - { - // Hide banes and impen on enchantable equipment - if (spell.Name.Contains(" Bane") || spell.Name.Contains("Impen") || spell.Name.StartsWith("Brogard")) - continue; - } - - //Debug.WriteToChat(spellById.Name + ", Difficulty: " + spellById.Difficulty + ", Family: " + spellById.Family + ", Generation: " + spellById.Generation + ", Type: " + spellById.Type + ", " + spellById.Unknown1 + " " + spellById.Unknown2 + " " + spellById.Unknown3 + " " + spellById.Unknown4 + " " + spellById.Unknown5 + " " + spellById.Unknown6 + " " + spellById.Unknown7 + " " + spellById.Unknown8 + " " + spellById.Unknown9 + " " + spellById.Unknown10); - // <{Mag-Tools}>: Major Coordination, Difficulty: 15, Family: 267, Generation: 1, Type: 1, 0 1 1 2572 -2.07525870829232E+20 0 0 0 0 0 - // <{Mag-Tools}>: Epic Magic Resistance, Difficulty: 20, Family: 299, Generation: 1, Type: 1, 0 1 1 4704 -2.07525870829232E+20 0 0 0 0 0 - // <{Mag-Tools}>: Epic Life Magic Aptitude, Difficulty: 20, Family: 357, Generation: 1, Type: 1, 0 1 1 4700 -2.07525870829232E+20 0 0 0 0 0 - // <{Mag-Tools}>: Epic Endurance, Difficulty: 20, Family: 263, Generation: 1, Type: 1, 0 1 1 4226 -2.07525870829232E+20 0 0 0 0 0 - // <{Mag-Tools}>: Essence Glutton, Difficulty: 30, Family: 279, Generation: 1, Type: 1, 0 0 1 2666 -2.07525870829232E+20 0 0 0 0 0 - - // <{Mag-Tools}>: Might of the Lugians, Difficulty: 300, Family: 1, Generation: 1, Type: 1, 0 0 1 2087 -2.07525870829232E+20 0 0 0 0 0 - // <{Mag-Tools}>: Executor's Blessing, Difficulty: 300, Family: 115, Generation: 1, Type: 1, 0 0 1 2053 -2.07525870829232E+20 0 0 0 0 0 - // <{Mag-Tools}>: Regeneration Other Incantation, Difficulty: 400, Family: 93, Generation: 1, Type: 1, 5 0.25 1 3982 -2.07525870829232E+20 0 0 0 0 0 - - // Focusing stone - // <{Mag-Tools}>: Brilliance, Difficulty: 250, Family: 15, Generation: 1, Type: 1, 5 0.25 1 2348 -2.07525870829232E+20 0 0 0 0 0 - // <{Mag-Tools}>: Concentration, Difficulty: 100, Family: 13, Generation: 1, Type: 1, 0 0 1 2347 -2.07525870829232E+20 0 0 0 0 0 - // <{Mag-Tools}>: Malediction, Difficulty: 50, Family: 284, Generation: 1, Type: 1, 0 0 1 2346 -2.07525870829232E+20 0 0 0 0 0 - - // Weapon buffs - // <{Mag-Tools}>: Elysa's Sight, Difficulty: 300, Family: 152, Generation: 1, Type: 1, 25 0 1 2106 -2.07525870829232E+20 0 0 0 0 0 (Attack Skill) - // <{Mag-Tools}>: Infected Caress, Difficulty: 300, Family: 154, Generation: 1, Type: 1, 25 0 1 2096 -2.07525870829232E+20 0 0 0 0 0 (Damage) - // <{Mag-Tools}>: Infected Spirit Caress, Difficulty: 300, Family: 154, Generation: 1, Type: 1, 25 0 1 3259 -2.07525870829232E+20 0 0 0 0 0 (Damage) - // <{Mag-Tools}>: Cragstone's Will, Difficulty: 300, Family: 156, Generation: 1, Type: 1, 25 0 1 2101 -2.07525870829232E+20 0 0 0 0 0 (Defense) - // <{Mag-Tools}>: Atlan's Alacrity, Difficulty: 300, Family: 158, Generation: 1, Type: 1, 25 0 1 2116 -2.07525870829232E+20 0 0 0 0 0 (Speed) - // <{Mag-Tools}>: Mystic's Blessing, Difficulty: 300, Family: 195, Generation: 1, Type: 1, 25 0 1 2117 -2.07525870829232E+20 0 0 0 0 0 (Mana C) - // <{Mag-Tools}>: Vision of the Hunter, Difficulty: 500, Family: 325, Generation: 1, Type: 1, 25 0 1 2968 -2.07525870829232E+20 0 0 0 0 0 (Damage Mod) - - if ((spell.Family >= 152 && spell.Family <= 158) || spell.Family == 195 || spell.Family == 325) - { - // This is a weapon buff - - // Lvl 6 - if (spell.Difficulty == 250) - continue; - - // Lvl 7 - if (spell.Difficulty == 300) - goto ShowSpell; - - // Lvl 8+ - if (spell.Difficulty >= 400) - goto ShowSpell; - - continue; - } - - // This is not a weapon buff. - - // Filter all 1-5 spells - if (spell.Name.EndsWith(" I") || spell.Name.EndsWith(" II") || spell.Name.EndsWith(" III") || spell.Name.EndsWith(" IV") || spell.Name.EndsWith(" V")) - continue; - - // Filter 6's - if (spell.Name.EndsWith(" VI")) - continue; - - // Filter 7's - if (spell.Difficulty == 300) - continue; - - // Filter 8's - if (spell.Name.Contains("Incantation")) - continue; - - ShowSpell: - - sb.Append(", " + spell.Name); - } - } - - // Wield Lvl 180 - if (mwo.Values(IntValueKey.WieldDifficulty) > 0) - { - // I don't quite understand this. - if (mwo.Values(IntValueKey.WieldRequirements) == 7 && mwo.Values(IntValueKey.WieldSkillType) == 1) - sb.Append(", Wield Lvl " + mwo.Values(IntValueKey.WieldDifficulty)); - else - { - if (Dictionaries.SkillInfo.ContainsKey(mwo.Values(IntValueKey.WieldSkillType))) - sb.Append(", " + Dictionaries.SkillInfo[mwo.Values(IntValueKey.WieldSkillType)] + " " + mwo.Values(IntValueKey.WieldDifficulty)); - else - sb.Append(", Unknown skill: " + mwo.Values(IntValueKey.WieldSkillType) + " " + mwo.Values(IntValueKey.WieldDifficulty)); - } - } - - // Summoning Gem - if (mwo.Values((IntValueKey)369) > 0) - sb.Append(", Lvl " + mwo.Values((IntValueKey)369)); - - // Melee Defense 300 to Activate - // If the activation is lower than the wield requirement, don't show it. - if (mwo.Values(IntValueKey.ItemSkillLevelLimit) > 0 && (mwo.Values(IntValueKey.WieldSkillType) != mwo.Values(IntValueKey.AppraisalItemSkill) || mwo.Values(IntValueKey.WieldDifficulty) < mwo.Values(IntValueKey.ItemSkillLevelLimit))) - { - if (Dictionaries.SkillInfo.ContainsKey(mwo.Values(IntValueKey.AppraisalItemSkill))) - sb.Append(", " + Dictionaries.SkillInfo[mwo.Values(IntValueKey.AppraisalItemSkill)] + " " + mwo.Values(IntValueKey.ItemSkillLevelLimit) + " to Activate"); - else - sb.Append(", Unknown skill: " + mwo.Values(IntValueKey.AppraisalItemSkill) + " " + mwo.Values(IntValueKey.ItemSkillLevelLimit) + " to Activate"); - } - - // Summoning Gem - if (mwo.Values((IntValueKey)366) > 0 && mwo.Values((IntValueKey)367) > 0) - { - if (Dictionaries.SkillInfo.ContainsKey(mwo.Values((IntValueKey)366))) - sb.Append(", " + Dictionaries.SkillInfo[mwo.Values((IntValueKey)366)] + " " + mwo.Values((IntValueKey)367)); - else - sb.Append(", Unknown skill: " + mwo.Values((IntValueKey)366) + " " + mwo.Values((IntValueKey)367)); - } - - // Summoning Gem - if (mwo.Values((IntValueKey)368) > 0 && mwo.Values((IntValueKey)367) > 0) - { - if (Dictionaries.SkillInfo.ContainsKey(mwo.Values((IntValueKey)368))) - sb.Append(", Spec " + Dictionaries.SkillInfo[mwo.Values((IntValueKey)368)] + " " + mwo.Values((IntValueKey)367)); - else - sb.Append(", Unknown skill spec: " + mwo.Values((IntValueKey)368) + " " + mwo.Values((IntValueKey)367)); - } - - if (mwo.Values(IntValueKey.ItemDifficulty) > 0) - sb.Append(", Diff " + mwo.Values(IntValueKey.ItemDifficulty)); - - if (mwo.ObjectClass == (int)ObjectClass.Salvage) - { - if (mwo.Values(DoubleValueKey.SalvageWorkmanship_Decal) > 0) - sb.Append(", Work " + mwo.Values(DoubleValueKey.SalvageWorkmanship_Decal).ToString("N2")); - } - else - { - if (mwo.Values(IntValueKey.ItemWorkmanship) > 0 && mwo.Values(IntValueKey.NumTimesTinkered) != 10) // Don't show the work if its already 10 tinked. - sb.Append(", Craft " + mwo.Values(IntValueKey.ItemWorkmanship)); - } - - if (mwo.ObjectClass == (int)ObjectClass.Armor && mwo.Values(IntValueKey.ResistMagic, 0) != 0) - { - sb.Append(", [" + - mwo.Values(DoubleValueKey.SlashProt_Decal).ToString("N1") + "/" + - mwo.Values(DoubleValueKey.PierceProt_Decal).ToString("N1") + "/" + - mwo.Values(DoubleValueKey.BludgeonProt_Decal).ToString("N1") + "/" + - mwo.Values(DoubleValueKey.ColdProt_Decal).ToString("N1") + "/" + - mwo.Values(DoubleValueKey.FireProt_Decal).ToString("N1") + "/" + - mwo.Values(DoubleValueKey.AcidProt_Decal).ToString("N1") + "/" + - mwo.Values(DoubleValueKey.LightningProt_Decal).ToString("N1") + "]"); - } - - if (showValueAndBurden) - { - if (mwo.Values(IntValueKey.Value) > 0) - sb.Append(", Value " + String.Format("{0:n0}", mwo.Values(IntValueKey.Value))); - - if (mwo.Values(IntValueKey.EncumbranceVal) > 0) - sb.Append(", BU " + mwo.Values(IntValueKey.EncumbranceVal)); - } - - if (mwo.TotalRating > 0) - { - sb.Append(", ["); - bool first = true; - if (mwo.DamRating > 0) { sb.Append("D " + mwo.DamRating); first = false; } - if (mwo.DamResistRating > 0) { if (!first) sb.Append(", "); sb.Append("DR " + mwo.DamResistRating); first = false; } - if (mwo.CritRating > 0) { if (!first) sb.Append(", "); sb.Append("C " + mwo.CritRating); first = false; } - if (mwo.CritDamRating > 0) { if (!first) sb.Append(", "); sb.Append("CD " + mwo.CritDamRating); first = false; } - if (mwo.CritResistRating > 0) { if (!first) sb.Append(", "); sb.Append("CR " + mwo.CritResistRating); first = false; } - if (mwo.CritDamResistRating > 0) { if (!first) sb.Append(", "); sb.Append("CDR " + mwo.CritDamResistRating); first = false; } - if (mwo.HealBoostRating > 0) { if (!first) sb.Append(", "); sb.Append("HB " + mwo.HealBoostRating); first = false; } - if (mwo.VitalityRating > 0) { if (!first) sb.Append(", "); sb.Append("V " + mwo.VitalityRating); first = false; } - sb.Append("]"); - } - - if (mwo.ObjectClass == (int)ObjectClass.Misc && mwo.Name.Contains("Keyring")) - sb.Append(", Keys: " + mwo.Values(IntValueKey.NumKeys) + ", Uses: " + mwo.Values(IntValueKey.Structure)); - - return sb.ToString(); - } - } -} diff --git a/Shared/MyWorldObject.cs b/Shared/MyWorldObject.cs deleted file mode 100644 index 73234f5..0000000 --- a/Shared/MyWorldObject.cs +++ /dev/null @@ -1,388 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; - -using Mag.Shared.Constants; - -namespace Mag.Shared -{ - /// - /// This is a user defiend object to represent a Decal.Adapter.WorldObject. - /// All properties will return -1 if the property isn't supported. - /// - [Serializable] - public class MyWorldObject - { - public bool HasIdData; - public int Id; - public int LastIdTime; - public int ObjectClass; - public int Icon; - - public SerializableDictionary BoolValues = new SerializableDictionary(); - public SerializableDictionary DoubleValues = new SerializableDictionary(); - public SerializableDictionary IntValues = new SerializableDictionary(); - public SerializableDictionary StringValues = new SerializableDictionary(); - - public List ActiveSpells = new List(); - public List Spells = new List(); - - public void Init(bool hasIdData, int id, int lastIdTime, int objectClass, int icon, IDictionary boolValues, IDictionary doubleValues, IDictionary intValues, IDictionary stringValues, IList activeSpells, IList spells) - { - HasIdData = hasIdData; - Id = id; - LastIdTime = lastIdTime; - ObjectClass = objectClass; - Icon = icon; - - AddTo(boolValues, doubleValues, intValues, stringValues); - - ActiveSpells.Clear(); - foreach (var i in activeSpells) - ActiveSpells.Add(i); - - Spells.Clear(); - foreach (var i in spells) - Spells.Add(i); - } - - public void AddTo(IDictionary boolValues, IDictionary doubleValues, IDictionary intValues, IDictionary stringValues) - { - foreach (var kvp in boolValues) - { - if (boolValues.ContainsKey(kvp.Key)) - BoolValues[kvp.Key] = kvp.Value; - else - BoolValues.Add(kvp.Key, kvp.Value); - } - - foreach (var kvp in doubleValues) - { - if (doubleValues.ContainsKey(kvp.Key)) - DoubleValues[kvp.Key] = kvp.Value; - else - DoubleValues.Add(kvp.Key, kvp.Value); - } - - foreach (var kvp in intValues) - { - if (intValues.ContainsKey(kvp.Key)) - IntValues[kvp.Key] = kvp.Value; - else - IntValues.Add(kvp.Key, kvp.Value); - } - - foreach (var kvp in stringValues) - { - if (stringValues.ContainsKey(kvp.Key)) - StringValues[kvp.Key] = kvp.Value; - else - StringValues.Add(kvp.Key, kvp.Value); - } - } - - public bool Values(BoolValueKey key, bool defaultValue = false) - { - if (BoolValues.ContainsKey((int)key)) - return BoolValues[(int)key]; - - return defaultValue; - } - - public double Values(DoubleValueKey key, double defaultValue = 0) - { - if (DoubleValues.ContainsKey((int)key)) - return DoubleValues[(int)key]; - - return defaultValue; - } - - public int Values(IntValueKey key, int defaultValue = 0) - { - if (IntValues.ContainsKey((int)key)) - return IntValues[(int)key]; - - return defaultValue; - } - - public string Values(StringValueKey key, string defaultValue = null) - { - if (StringValues.ContainsKey((int)key)) - return StringValues[(int)key]; - - return defaultValue; - } - - - public string Material { get { if (IntValues.ContainsKey(131)) return Dictionaries.MaterialInfo.ContainsKey(IntValues[131]) ? Dictionaries.MaterialInfo[IntValues[131]] : IntValues[131].ToString(CultureInfo.InvariantCulture); return null; } } - - public string Name { get { return StringValues.ContainsKey(1) ? StringValues[1] : null; } } - - - public string EquipSkill { get { if (IntValues.ContainsKey(218103840)) return Dictionaries.SkillInfo.ContainsKey(IntValues[218103840]) ? Dictionaries.SkillInfo[IntValues[218103840]] : IntValues[218103840].ToString(CultureInfo.InvariantCulture); return null; } } - - public string Mastery { get { if (IntValues.ContainsKey(353)) return Dictionaries.MasteryInfo.ContainsKey(IntValues[353]) ? Dictionaries.MasteryInfo[IntValues[353]] : IntValues[353].ToString(CultureInfo.InvariantCulture); return null; } } - - public string ItemSet { get { if (IntValues.ContainsKey(265)) return Dictionaries.AttributeSetInfo.ContainsKey(IntValues[265]) ? Dictionaries.AttributeSetInfo[IntValues[265]] : IntValues[265].ToString(CultureInfo.InvariantCulture); return null; } } - - - public int ArmorLevel { get { return IntValues.ContainsKey(28) ? IntValues[28] : -1; } } - - public string Imbue - { - get - { - if (!IntValues.ContainsKey(179) || IntValues[179] == 0) return null; - - string retVal = String.Empty; - if ((IntValues[179] & 1) == 1) retVal += " CS"; - if ((IntValues[179] & 2) == 2) retVal += " CB"; - if ((IntValues[179] & 4) == 4) retVal += " AR"; - if ((IntValues[179] & 8) == 8) retVal += " SlashRend"; - if ((IntValues[179] & 16) == 16) retVal += " PierceRend"; - if ((IntValues[179] & 32) == 32) retVal += " BludgeRend"; - if ((IntValues[179] & 64) == 64) retVal += " AcidRend"; - if ((IntValues[179] & 128) == 128) retVal += " FrostRend"; - if ((IntValues[179] & 256) == 256) retVal += " LightRend"; - if ((IntValues[179] & 512) == 512) retVal += " FireRend"; - if ((IntValues[179] & 1024) == 1024) retVal += " MeleeImbue"; - if ((IntValues[179] & 4096) == 4096) retVal += " MagicImbue"; - if ((IntValues[179] & 8192) == 8192) retVal += " Hematited"; - if ((IntValues[179] & 536870912) == 536870912) retVal += " MagicAbsorb"; - retVal = retVal.Trim(); - return retVal; - } - } - - public int Tinks { get { return IntValues.ContainsKey(171) ? IntValues[171] : -1; } } - - - public int MaxDamage { get { return IntValues.ContainsKey(218103842) ? IntValues[218103842] : -1; } } - - public int ElementalDmgBonus { get { return IntValues.ContainsKey(204) ? IntValues[204] : -1; } } - - public Double Variance { get { return DoubleValues.ContainsKey(167772171) ? DoubleValues[167772171] : -1; } } - - public Double DamageBonus { get { return DoubleValues.ContainsKey(167772174) ? DoubleValues[167772174] : -1; } } - - public Double ElementalDamageVersusMonsters { get { return DoubleValues.ContainsKey(152) ? DoubleValues[152] : -1; } } - - public Double AttackBonus { get { return DoubleValues.ContainsKey(167772172) ? DoubleValues[167772172] : -1; } } - - public Double MeleeDefenseBonus { get { return DoubleValues.ContainsKey(29) ? DoubleValues[29] : -1; } } - - public Double MagicDBonus { get { return DoubleValues.ContainsKey(150) ? DoubleValues[150] : -1; } } - - public Double MissileDBonus { get { return DoubleValues.ContainsKey(149) ? DoubleValues[149] : -1; } } - - public Double ManaCBonus { get { return DoubleValues.ContainsKey(144) ? DoubleValues[144] : -1; } } - - - public int WieldLevel { get { if (IntValues.ContainsKey(160) && IntValues[160] > 0 && IntValues.ContainsKey(158) && IntValues[158] == 7 && IntValues.ContainsKey(159) && IntValues[159] == 1) return IntValues[160]; return -1; } } - - public int SkillLevel { get { if (IntValues.ContainsKey(160) && IntValues[160] > 0 && (!IntValues.ContainsKey(158) || IntValues[158] != 7) && IntValues.ContainsKey(159)) return IntValues[160]; return -1; } } - - - public int LoreRequirement { get { return IntValues.ContainsKey(109) ? IntValues[109] : -1; } } - - public Double SalvageWorkmanship { get { return DoubleValues.ContainsKey(167772169) ? DoubleValues[167772169] : -1; } } - - public int Workmanship { get { return IntValues.ContainsKey(105) ? IntValues[105] : -1; } } - - public int Value { get { return IntValues.ContainsKey(19) ? IntValues[19] : -1; } } - - public int Burden { get { return IntValues.ContainsKey(5) ? IntValues[5] : -1; } } - - - public int DamRating { get { return IntValues.ContainsKey(370) ? IntValues[370] : -1; } } - - public int DamResistRating { get { return IntValues.ContainsKey(371) ? IntValues[371] : -1; } } - - public int CritRating { get { return IntValues.ContainsKey(372) ? IntValues[372] : -1; } } - - public int CritResistRating { get { return IntValues.ContainsKey(373) ? IntValues[373] : -1; } } - - public int CritDamRating { get { return IntValues.ContainsKey(374) ? IntValues[374] : -1; } } - - public int CritDamResistRating { get { return IntValues.ContainsKey(375) ? IntValues[375] : -1; } } - - public int HealBoostRating { get { return IntValues.ContainsKey(376) ? IntValues[376] : -1; } } - - public int VitalityRating { get { return IntValues.ContainsKey(379) ? IntValues[379] : -1; } } - - /// - /// Returns the sum of all the ratings found on this item, or -1 if no ratings exist. - /// - public int TotalRating - { - get - { - if (DamRating == -1 && DamResistRating == -1 && CritRating == -1 && CritResistRating == -1 && CritDamRating == -1 && CritDamResistRating == -1 && HealBoostRating == -1 && VitalityRating == -1) - return -1; - - return Math.Max(DamRating, 0) + Math.Max(DamResistRating, 0) + Math.Max(CritRating, 0) + Math.Max(CritResistRating, 0) + Math.Max(CritDamRating, 0) + Math.Max(CritDamResistRating, 0) + Math.Max(HealBoostRating, 0) + Math.Max(VitalityRating, 0); - } - } - - - /// - /// This will take the current AmorLevel of the item, subtract any buffs, subtract tinks as 20 AL each (not including imbue), and add any impen cantrips. - /// - public int CalcedStartingArmorLevel - { - get - { - int armorFromTinks = 0; - int armorFromBuffs = 0; - - if (Tinks > 0 && ArmorLevel > 0) - armorFromTinks = (Imbue != null) ? (Tinks - 1) * 20 : Tinks * 20; // This assumes each tink adds an amor level of 20 - - if ((!IntValues.ContainsKey(131) || IntValues[131] == 0) && ArmorLevel > 0) // If this item has no material, its not a loot gen, assume its a quest item and subtract 200 al - armorFromTinks = 200; - - foreach (int spell in ActiveSpells) - { - foreach (var effect in Dictionaries.LongValueKeySpellEffects) - { - if (spell == effect.Key && effect.Value.Key == 28) - armorFromBuffs += effect.Value.Change; - } - } - - foreach (int spell in Spells) - { - foreach (var effect in Dictionaries.LongValueKeySpellEffects) - { - if (spell == effect.Key && effect.Value.Key == 28) - armorFromBuffs -= effect.Value.Bonus; - } - } - - return ArmorLevel - armorFromTinks - armorFromBuffs; - } - } - - /// - /// This will take into account Variance, MaxDamage and Tinks of a melee weapon and determine what its optimal 10 tinked DamageOverTime is. - /// - public double CalcedBuffedTinkedDoT - { - get - { - if (!DoubleValues.ContainsKey(167772171) || !IntValues.ContainsKey(218103842)) - return -1; - - double variance = DoubleValues.ContainsKey(167772171) ? DoubleValues[167772171] : 0; - int maxDamage = GetBuffedIntValueKey(218103842); - - int numberOfTinksLeft = Math.Max(10 - Math.Max(Tinks, 0), 0); - - if (!IntValues.ContainsKey(179) || IntValues[179] == 0) - numberOfTinksLeft--; // Factor in an imbue tink - - // If this is not a loot generated item, it can't be tinked - if (!IntValues.ContainsKey(131) || IntValues[131] == 0) - numberOfTinksLeft = 0; - - for (int i = 1; i <= numberOfTinksLeft; i++) - { - double ironTinkDoT = CalculateDamageOverTime(maxDamage + 24 + 1, variance); - double graniteTinkDoT = CalculateDamageOverTime(maxDamage + 24, variance * .8); - - if (ironTinkDoT >= graniteTinkDoT) - maxDamage++; - else - variance *= .8; - } - - return CalculateDamageOverTime(maxDamage + 24, variance); - } - } - - /// - /// GetBuffedIntValueKey(LongValueKey.MaxDamage) + (((GetBuffedDoubleValueKey(DoubleValueKey.DamageBonus) - 1) * 100) / 3) + GetBuffedIntValueKey(LongValueKey.ElementalDmgBonus); - /// - public double CalcedBuffedMissileDamage { get { if (!IntValues.ContainsKey(218103842) || !DoubleValues.ContainsKey(167772174) || !IntValues.ContainsKey(204)) return -1; return GetBuffedIntValueKey(218103842) + (((GetBuffedDoubleValueKey(167772174) - 1) * 100) / 3) + GetBuffedIntValueKey(204); } } - - public double BuffedElementalDamageVersusMonsters { get { return GetBuffedDoubleValueKey(152, -1); } } - - public double BuffedAttackBonus { get { return GetBuffedDoubleValueKey(167772172, -1); } } - - public double BuffedMeleeDefenseBonus { get { return GetBuffedDoubleValueKey(29, -1); } } - - public double BuffedManaCBonus { get { return GetBuffedDoubleValueKey(144, -1); } } - - public int GetBuffedIntValueKey(int key, int defaultValue = 0) - { - if (!IntValues.ContainsKey(key)) - return defaultValue; - - int value = IntValues[key]; - - foreach (int spell in ActiveSpells) - { - if (Dictionaries.LongValueKeySpellEffects.ContainsKey(spell) && Dictionaries.LongValueKeySpellEffects[spell].Key == key) - value -= Dictionaries.LongValueKeySpellEffects[spell].Change; - } - - foreach (int spell in Spells) - { - if (Dictionaries.LongValueKeySpellEffects.ContainsKey(spell) && Dictionaries.LongValueKeySpellEffects[spell].Key == key) - value += Dictionaries.LongValueKeySpellEffects[spell].Bonus; - } - - return value; - } - - public double GetBuffedDoubleValueKey(int key, double defaultValue = 0) - { - if (!DoubleValues.ContainsKey(key)) - return defaultValue; - - double value = DoubleValues[key]; - - foreach (int spell in ActiveSpells) - { - if (Dictionaries.DoubleValueKeySpellEffects.ContainsKey(spell) && Dictionaries.DoubleValueKeySpellEffects[spell].Key == key) - { - if (Math.Abs(Dictionaries.DoubleValueKeySpellEffects[spell].Change - 1) < Double.Epsilon) - value /= Dictionaries.DoubleValueKeySpellEffects[spell].Change; - else - value -= Dictionaries.DoubleValueKeySpellEffects[spell].Change; - } - } - - foreach (int spell in Spells) - { - if (Dictionaries.DoubleValueKeySpellEffects.ContainsKey(spell) && Dictionaries.DoubleValueKeySpellEffects[spell].Key == key && Math.Abs(Dictionaries.DoubleValueKeySpellEffects[spell].Bonus - 0) > Double.Epsilon) - { - if (Math.Abs(Dictionaries.DoubleValueKeySpellEffects[spell].Change - 1) < Double.Epsilon) - value *= Dictionaries.DoubleValueKeySpellEffects[spell].Bonus; - else - value += Dictionaries.DoubleValueKeySpellEffects[spell].Bonus; - } - } - - return value; - } - - /// - /// maxDamage * ((1 - critChance) * (2 - variance) / 2 + (critChance * critMultiplier)); - /// - /// - /// - /// - /// - /// - public static double CalculateDamageOverTime(int maxDamage, double variance, double critChance = .1, double critMultiplier = 2) - { - return maxDamage * ((1 - critChance) * (2 - variance) / 2 + (critChance * critMultiplier)); - } - - public override string ToString() - { - return Name; - } - } -} diff --git a/Shared/MyWorldObjectCreator.cs b/Shared/MyWorldObjectCreator.cs deleted file mode 100644 index c8462d1..0000000 --- a/Shared/MyWorldObjectCreator.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Collections.Generic; - -using Decal.Adapter.Wrappers; - -namespace Mag.Shared -{ - public static class MyWorldObjectCreator - { - public static MyWorldObject Create(WorldObject wo) - { - MyWorldObject mwo = new MyWorldObject(); - - Dictionary boolValues = new Dictionary(); - Dictionary doubleValues = new Dictionary(); - Dictionary intValues = new Dictionary(); - Dictionary stringValues = new Dictionary(); - List activeSpells = new List(); - List spells = new List(); - - foreach (var key in wo.BoolKeys) - boolValues.Add(key, wo.Values((BoolValueKey)key)); - - foreach (var key in wo.DoubleKeys) - doubleValues.Add(key, wo.Values((DoubleValueKey)key)); - - foreach (var key in wo.LongKeys) - intValues.Add(key, wo.Values((LongValueKey)key)); - - foreach (var key in wo.StringKeys) - stringValues.Add(key, wo.Values((StringValueKey)key)); - - for (int i = 0 ; i < wo.ActiveSpellCount ; i++) - activeSpells.Add(wo.ActiveSpell(i)); - - for (int i = 0; i < wo.SpellCount; i++) - spells.Add(wo.Spell(i)); - - mwo.Init(wo.HasIdData, wo.Id, wo.LastIdTime, (int)wo.ObjectClass, wo.Icon, boolValues, doubleValues, intValues, stringValues, activeSpells, spells); - - return mwo; - } - - public static MyWorldObject Combine(MyWorldObject older, WorldObject newer) - { - // Always repair missing icons from old JSON files (plugin upgrades) - if (older.Icon == 0 && newer.Icon != 0) - { - older.Icon = newer.Icon; - } - - if (!older.HasIdData || newer.HasIdData) - return Create(newer); - - MyWorldObject mwo = Create(newer); - - older.AddTo(mwo.BoolValues, mwo.DoubleValues, mwo.IntValues, mwo.StringValues); - - return older; - } - } -} diff --git a/Shared/ObjectClass.cs b/Shared/ObjectClass.cs deleted file mode 100644 index 316ecb6..0000000 --- a/Shared/ObjectClass.cs +++ /dev/null @@ -1,165 +0,0 @@ -using System; - -using Mag.Shared.Constants; - -namespace Mag.Shared -{ - public enum ObjectClass - { - Unknown = 0, - MeleeWeapon = 1, - Armor = 2, - Clothing = 3, - Jewelry = 4, - Monster = 5, - Food = 6, - Money = 7, - Misc = 8, - MissileWeapon = 9, - Container = 10, - Gem = 11, - SpellComponent = 12, - Key = 13, - Portal = 14, - TradeNote = 15, - ManaStone = 16, - Plant = 17, - BaseCooking = 18, - BaseAlchemy = 19, - BaseFletching = 20, - CraftedCooking = 21, - CraftedAlchemy = 22, - CraftedFletching = 23, - Player = 24, - Vendor = 25, - Door = 26, - Corpse = 27, - Lifestone = 28, - HealingKit = 29, - Lockpick = 30, - WandStaffOrb = 31, - Bundle = 32, - Book = 33, - Journal = 34, - Sign = 35, - Housing = 36, - Npc = 37, - Foci = 38, - Salvage = 39, - Ust = 40, - Services = 41, - Scroll = 42, - NumObjectClasses = 43, - } - - public static class ObjectClassTools - { - /// - /// Converts a decal specific IntValueKey to the actual IntValueKey. - /// If this is not an IntValueKey, 0 will be returned. - /// - public static ObjectClass FromWeenieType(ItemType itemType, WeenieType weenieType) - { - var result = ObjectClass.Unknown; - - if ((itemType & ItemType.MeleeWeapon) != 0) - result = ObjectClass.MeleeWeapon; - else if ((itemType & ItemType.Armor) != 0) - result = ObjectClass.Armor; - else if ((itemType & ItemType.Clothing) != 0) - result = ObjectClass.Clothing; - else if ((itemType & ItemType.Jewelry) != 0) - result = ObjectClass.Jewelry; - else if ((itemType & ItemType.Creature) != 0) - result = ObjectClass.Monster; - else if ((itemType & ItemType.Food) != 0) - result = ObjectClass.Food; - else if ((itemType & ItemType.Money) != 0) - result = ObjectClass.Money; - else if ((itemType & ItemType.Misc) != 0) - result = ObjectClass.Misc; - else if ((itemType & ItemType.MissileWeapon) != 0) - result = ObjectClass.MissileWeapon; - else if ((itemType & ItemType.Container) != 0) - result = ObjectClass.Container; - else if ((itemType & ItemType.Useless) != 0) - result = ObjectClass.Bundle; - else if ((itemType & ItemType.Gem) != 0) - result = ObjectClass.Gem; - else if ((itemType & ItemType.SpellComponents) != 0) - result = ObjectClass.SpellComponent; - else if ((itemType & ItemType.Key) != 0) - result = ObjectClass.Key; - else if ((itemType & ItemType.Caster) != 0) - result = ObjectClass.WandStaffOrb; - else if ((itemType & ItemType.Portal) != 0) - result = ObjectClass.Portal; - else if ((itemType & ItemType.PromissoryNote) != 0) - result = ObjectClass.TradeNote; - else if ((itemType & ItemType.ManaStone) != 0) - result = ObjectClass.ManaStone; - else if ((itemType & ItemType.Service) != 0) - result = ObjectClass.Services; - else if ((itemType & ItemType.MagicWieldable) != 0) - result = ObjectClass.Plant; - else if ((itemType & ItemType.CraftCookingBase) != 0) - result = ObjectClass.BaseCooking; - else if ((itemType & ItemType.CraftAlchemyBase) != 0) - result = ObjectClass.BaseAlchemy; - //else if ((itemType & ItemType.01000000) - // result = ObjectClass.BaseFletching; - else if ((itemType & ItemType.CraftFletchingBase) != 0) - result = ObjectClass.CraftedCooking; - else if ((itemType & ItemType.CraftAlchemyIntermediate) != 0) - result = ObjectClass.CraftedAlchemy; - else if ((itemType & ItemType.CraftFletchingIntermediate) != 0) - result = ObjectClass.CraftedFletching; - else if ((itemType & ItemType.TinkeringTool) != 0) - result = ObjectClass.Ust; - else if ((itemType & ItemType.TinkeringMaterial) != 0) - result = ObjectClass.Salvage; - - /* - if (Behavior & 0x00000008) - result = ObjectClass.Player; - else if (Behavior & 0x00000200) - result = ObjectClass.Vendor; - else if (Behavior & 0x00001000) - result = ObjectClass.Door; - else if (Behavior & 0x00002000) - result = ObjectClass.Corpse; - else if (Behavior & 0x00004000) - result = ObjectClass.Lifestone; - else if (Behavior & 0x00008000) - result = ObjectClass.Food; - else if (Behavior & 0x00010000) - result = ObjectClass.HealingKit; - else if (Behavior & 0x00020000) - result = ObjectClass.Lockpick; - else if (Behavior & 0x00040000) - result = ObjectClass.Portal; - else if (Behavior & 0x00800000) - result = ObjectClass.Foci; - else if (Behavior & 0x00000001) - result = ObjectClass.Container; - */ - - /*if (((itemType & ItemType.Writable) != 0) && (Behavior & 0x00000100) && result == ObjectClass.Unknown) - { - if (pCreate->m_Behavior & 0x00000002) - result = ObjectClass.Journal; - else if (pCreate->m_Behavior & 0x00000004) - result = ObjectClass.Sign; - else if (!(pCreate->m_Behavior & 0x0000000F)) - result = ObjectClass.Book; - }*/ - - /*if (((itemType & ItemType.Writable) != 0) && ((GameDataFlags1 & 0x00400000) != 0)) - result = ObjectClass.Scroll;*/ - - //throw new Exception($"Unable to convert WeenieType {input} to an ObjectClass."); - - return result; - } - } -} diff --git a/Shared/PostMessageTools.cs b/Shared/PostMessageTools.cs deleted file mode 100644 index 3777c10..0000000 --- a/Shared/PostMessageTools.cs +++ /dev/null @@ -1,293 +0,0 @@ -using System; -using System.Windows.Forms; - -using Decal.Adapter; - -namespace Mag.Shared -{ - public static class PostMessageTools - { - // http://msdn.microsoft.com/en-us/library/dd375731%28v=vs.85%29.aspx - - private const byte VK_RETURN = 0x0D; - private const byte VK_SHIFT = 0x10; - private const byte VK_CONTROL = 0x11; - private const byte VK_PAUSE = 0x13; - private const byte VK_SPACE = 0x20; - - private static byte ScanCode(char Char) - { - switch (char.ToLower(Char)) - { - case 'a': return 0x1E; - case 'b': return 0x30; - case 'c': return 0x2E; - case 'd': return 0x20; - case 'e': return 0x12; - case 'f': return 0x21; - case 'g': return 0x22; - case 'h': return 0x23; - case 'i': return 0x17; - case 'j': return 0x24; - case 'k': return 0x25; - case 'l': return 0x26; - case 'm': return 0x32; - case 'n': return 0x31; - case 'o': return 0x18; - case 'p': return 0x19; - case 'q': return 0x10; - case 'r': return 0x13; - case 's': return 0x1F; - case 't': return 0x14; - case 'u': return 0x16; - case 'v': return 0x2F; - case 'w': return 0x11; - case 'x': return 0x2D; - case 'y': return 0x15; - case 'z': return 0x2C; - case '/': return 0x35; - case ' ': return 0x39; - } - return 0; - } - - private static byte CharCode(char Char) - { - switch (char.ToLower(Char)) - { - case 'a': return 0x41; - case 'b': return 0x42; - case 'c': return 0x43; - case 'd': return 0x44; - case 'e': return 0x45; - case 'f': return 0x46; - case 'g': return 0x47; - case 'h': return 0x48; - case 'i': return 0x49; - case 'j': return 0x4A; - case 'k': return 0x4B; - case 'l': return 0x4C; - case 'm': return 0x4D; - case 'n': return 0x4E; - case 'o': return 0x4F; - case 'p': return 0x50; - case 'q': return 0x51; - case 'r': return 0x52; - case 's': return 0x53; - case 't': return 0x54; - case 'u': return 0x55; - case 'v': return 0x56; - case 'w': return 0x57; - case 'x': return 0x58; - case 'y': return 0x59; - case 'z': return 0x5A; - case '/': return 0xBF; - case ' ': return 0x20; - } - return 0x20; - } - - public static void SendEnter() - { - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)VK_RETURN, (UIntPtr)0x001C0001); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)VK_RETURN, (UIntPtr)0xC01C0001); - } - - public static void SendPause() - { - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)VK_PAUSE, (UIntPtr)0x00450001); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)VK_PAUSE, (UIntPtr)0xC0450001); - } - - static Timer _spaceReleaseTimer; - static DateTime _spaceSendTime; - static int _spaceHoldTimeMilliseconds; - static bool _spaceAddShift; - static bool _spaceAddW; - static bool _spaceAddZ; - static bool _spaceAddX; - static bool _spaceAddC; - - public static void SendSpace(int msToHoldDown = 0, bool addShift = false, bool addW = false, bool addZ = false, bool addX = false, bool addC = false) - { - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)VK_SPACE, (UIntPtr)0x00390001); - if (msToHoldDown == 0) - { - if (addShift) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)VK_SHIFT, (UIntPtr)0x002A0001); - if (addW) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)CharCode('w'), (UIntPtr)0x00110001); - if (addZ) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)CharCode('z'), (UIntPtr)0x002C0001); - if (addX) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)CharCode('x'), (UIntPtr)0x002D0001); - if (addC) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)CharCode('c'), (UIntPtr)0x002E0001); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)VK_SPACE, (UIntPtr)0xC0390001); - if (addW) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode('w'), (UIntPtr)0xC0110001); - if (addZ) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode('z'), (UIntPtr)0xC02C0001); - if (addX) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode('x'), (UIntPtr)0xC02D0001); - if (addC) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode('c'), (UIntPtr)0xC02E0001); - if (addShift) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)VK_SHIFT, (UIntPtr)0xC02A0001); - } - else - { - if (_spaceReleaseTimer == null) - { - _spaceReleaseTimer = new Timer(); - _spaceReleaseTimer.Tick += new EventHandler(SpaceReleaseTimer_Tick); - _spaceReleaseTimer.Interval = 1; - } - - _spaceSendTime = DateTime.UtcNow; - _spaceHoldTimeMilliseconds = msToHoldDown; - _spaceAddShift = addShift; - _spaceAddW = addW; - _spaceAddZ = addZ; - _spaceAddX = addX; - _spaceAddC = addC; - _spaceReleaseTimer.Start(); - } - } - - static void SpaceReleaseTimer_Tick(object sender, EventArgs e) - { - if (_spaceSendTime.AddMilliseconds(_spaceHoldTimeMilliseconds) <= DateTime.UtcNow) - { - _spaceReleaseTimer.Stop(); - if (_spaceAddShift) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)VK_SHIFT, (UIntPtr)0x002A0001); - if (_spaceAddW) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)CharCode('w'), (UIntPtr)0x00110001); - if (_spaceAddZ) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)CharCode('z'), (UIntPtr)0x002C0001); - if (_spaceAddX) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)CharCode('x'), (UIntPtr)0x002D0001); - if (_spaceAddC) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)CharCode('c'), (UIntPtr)0x002E0001); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)VK_SPACE, (UIntPtr)0xC0390001); - if (_spaceAddW) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode('w'), (UIntPtr)0xC0110001); - if (_spaceAddZ) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode('z'), (UIntPtr)0xC02C0001); - if (_spaceAddX) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode('x'), (UIntPtr)0xC02D0001); - if (_spaceAddC) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode('c'), (UIntPtr)0xC02E0001); - if (_spaceAddShift) User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)VK_SHIFT, (UIntPtr)0xC02A0001); - } - } - - static Timer _movementReleaseTimer; - static DateTime _movementSendTime; - static int _movementHoldTimeMilliseconds; - static char _movementKey; - - public static void SendMovement(char ch, int msToHoldDown = 0) - { - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)CharCode(ch), (UIntPtr)(0x00000001 + ScanCode(ch) * 0x10000)); - if (msToHoldDown == 0) - { - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode(ch), (UIntPtr)(0xC0000001 + ScanCode(ch) * 0x10000)); - } - else - { - if (_movementReleaseTimer == null) - { - _movementReleaseTimer = new Timer(); - _movementReleaseTimer.Tick += new EventHandler(MovementReleaseTimer_Tick); - _movementReleaseTimer.Interval = 1; - } - - _movementSendTime = DateTime.Now; - _movementHoldTimeMilliseconds = msToHoldDown; - _movementKey = ch; - _movementReleaseTimer.Start(); - } - } - - static void MovementReleaseTimer_Tick(object sender, EventArgs e) - { - if (_movementSendTime.AddMilliseconds(_movementHoldTimeMilliseconds) <= DateTime.Now) - { - _movementReleaseTimer.Stop(); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode(_movementKey), (UIntPtr)(0xC0000001 + ScanCode(_movementKey) * 0x10000)); - } - } - - public static void SendCntrl(char ch) - { - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)VK_CONTROL, (UIntPtr)0x001D0001); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)CharCode(ch), (UIntPtr)0x00100001); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)CharCode(ch), (UIntPtr)0xC0100001); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)VK_CONTROL, (UIntPtr)0xC01D0001); - } - - public static void SendAltF4() - { - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_DESTROY, new IntPtr(0), new UIntPtr(0)); - } - - /// - /// Opens/Closes fellowship view - /// - public static void SendF4() - { - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)0x00000073, (UIntPtr)0x003E0001); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)0x00000073, (UIntPtr)0xC03E0001); - } - - /// - /// Opens/Closes main pack view - /// - public static void SendF12() - { - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)0x0000007B, (UIntPtr)0x00580001); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)0x0000007B, (UIntPtr)0xC0580001); - } - - public static void SendMsg(string msg) - { - foreach (char ch in msg) - { - byte code = CharCode(ch); - uint lparam = (uint)((ScanCode(ch) << 0x10) | 1); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYDOWN, (IntPtr)code, (UIntPtr)(lparam)); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_KEYUP, (IntPtr)code, (UIntPtr)(0xC0000000 | lparam)); - } - } - - public static void ClickOK() - { - User32.RECT rect = new User32.RECT(); - - User32.GetWindowRect(CoreManager.Current.Decal.Hwnd, ref rect); - - // The reason why we click at both of these positions is some clients will be running windowed, and some windowless. This will hit both locations - SendMouseClick(rect.Width / 2, rect.Height / 2 + 18); - SendMouseClick(rect.Width / 2, rect.Height / 2 + 25); - SendMouseClick(rect.Width / 2, rect.Height / 2 + 31); - } - - public static void ClickYes() - { - User32.RECT rect = new User32.RECT(); - - User32.GetWindowRect(CoreManager.Current.Decal.Hwnd, ref rect); - - // 800x600 +32 works, +33 does not work on single/double/tripple line boxes - // 1600x1200 +31 works, +32 does not work on single/double/tripple line boxes - // The reason why we click at both of these positions is some clients will be running windowed, and some windowless. This will hit both locations - SendMouseClick(rect.Width / 2 - 80, rect.Height / 2 + 18); - SendMouseClick(rect.Width / 2 - 80, rect.Height / 2 + 25); - SendMouseClick(rect.Width / 2 - 80, rect.Height / 2 + 31); - } - - public static void ClickNo() - { - User32.RECT rect = new User32.RECT(); - - User32.GetWindowRect(CoreManager.Current.Decal.Hwnd, ref rect); - - // The reason why we click at both of these positions is some clients will be running windowed, and some windowless. This will hit both locations - SendMouseClick(rect.Width / 2 + 80, rect.Height / 2 + 18); - SendMouseClick(rect.Width / 2 + 80, rect.Height / 2 + 25); - SendMouseClick(rect.Width / 2 + 80, rect.Height / 2 + 31); - } - - public static void SendMouseClick(int x, int y) - { - int loc = (y * 0x10000) + x; - - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_MOUSEMOVE, (IntPtr)0x00000000, (UIntPtr)loc); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_LBUTTONDOWN, (IntPtr)0x00000001, (UIntPtr)loc); - User32.PostMessage(CoreManager.Current.Decal.Hwnd, User32.WM_LBUTTONUP, (IntPtr)0x00000000, (UIntPtr)loc); - } - } -} diff --git a/Shared/RateLimiter.cs b/Shared/RateLimiter.cs deleted file mode 100644 index 787bcac..0000000 --- a/Shared/RateLimiter.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Diagnostics; - -namespace Mag.Shared -{ - public class RateLimiter - { - public readonly int MaxNumberOfEvents; - private readonly double overPeriodInSeconds; - private readonly double targetEventSpacingInSeconds; - - private readonly Stopwatch stopwatch = Stopwatch.StartNew(); - - public RateLimiter(int maxNumberOfEvents, TimeSpan overPeriod) - { - if (maxNumberOfEvents <= 0) - throw new ArgumentOutOfRangeException(nameof(maxNumberOfEvents), $"{nameof(maxNumberOfEvents)} must be greater than 0"); - - if (overPeriod <= TimeSpan.Zero) - throw new ArgumentOutOfRangeException(nameof(overPeriod), $"{nameof(overPeriod)} must be greater than TimeSpan.Zero"); - - MaxNumberOfEvents = maxNumberOfEvents; - overPeriodInSeconds = overPeriod.TotalSeconds; - - targetEventSpacingInSeconds = overPeriodInSeconds / maxNumberOfEvents; - } - - - private int numberOfEventsRegistered; - - /// - /// Result > 0 : We're able to meet our target rate and must pause between events. - /// Result = 0 : We're running right no time. A new event should be registered without delay. - /// Result < 0 : We're running behind. A new event should be registered without delay. We're failing to meet our target rate. - /// - /// - public double GetSecondsToWaitBeforeNextEvent() - { - var elapsedSeconds = stopwatch.Elapsed.TotalSeconds; - - return ((targetEventSpacingInSeconds * numberOfEventsRegistered) - elapsedSeconds); - } - - public void RegisterEvent() - { - numberOfEventsRegistered++; - - var elapsedSeconds = stopwatch.Elapsed.TotalSeconds; - - if (numberOfEventsRegistered > MaxNumberOfEvents || elapsedSeconds > overPeriodInSeconds) - { - numberOfEventsRegistered = 1; - - stopwatch.Reset(); - stopwatch.Start(); - } - } - } -} diff --git a/Shared/SerializableDictionary.cs b/Shared/SerializableDictionary.cs deleted file mode 100644 index c1c1c1d..0000000 --- a/Shared/SerializableDictionary.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System.Collections.Generic; -using System.Xml.Serialization; - -namespace Mag.Shared -{ - [XmlRoot("dictionary")] - public class SerializableDictionary : Dictionary, IXmlSerializable - { - public System.Xml.Schema.XmlSchema GetSchema() - { - return null; - } - - public void ReadXml(System.Xml.XmlReader reader) - { - XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); - - XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); - - bool wasEmpty = reader.IsEmptyElement; - - reader.Read(); - - if (wasEmpty) - return; - - while (reader.NodeType != System.Xml.XmlNodeType.EndElement) - { - reader.ReadStartElement("item"); - - reader.ReadStartElement("key"); - - TKey key = (TKey)keySerializer.Deserialize(reader); - - reader.ReadEndElement(); - - reader.ReadStartElement("value"); - - TValue value = (TValue)valueSerializer.Deserialize(reader); - - reader.ReadEndElement(); - - this.Add(key, value); - - reader.ReadEndElement(); - - reader.MoveToContent(); - } - - reader.ReadEndElement(); - } - - public void WriteXml(System.Xml.XmlWriter writer) - { - XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); - - XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); - - foreach (TKey key in this.Keys) - { - writer.WriteStartElement("item"); - - writer.WriteStartElement("key"); - - keySerializer.Serialize(writer, key); - - writer.WriteEndElement(); - - writer.WriteStartElement("value"); - - TValue value = this[key]; - - valueSerializer.Serialize(writer, value); - - writer.WriteEndElement(); - - writer.WriteEndElement(); - } - } - } -} \ No newline at end of file diff --git a/Shared/Settings/Setting.cs b/Shared/Settings/Setting.cs deleted file mode 100644 index 643064d..0000000 --- a/Shared/Settings/Setting.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; - -namespace Mag.Shared.Settings -{ - class Setting - { - public readonly string Xpath; - - public readonly string Description; - - public readonly T DefaultValue; - - private T value; - public T Value - { - get - { - return value; - } - set - { - // If we're setting it to the value its already at, don't continue with the set. - if (Object.Equals(this.value, value)) - return; - - // The value differs, set it. - this.value = value; - - StoreValueInConfigFile(); - - if (Changed != null) - Changed(this); - } - } - - public event Action> Changed; - - public Setting(string xpath, string description = null, T defaultValue = default(T)) - { - Xpath = xpath; - - Description = description; - - DefaultValue = defaultValue; - - LoadValueFromConfig(defaultValue); - } - - void LoadValueFromConfig(T defaultValue) - { - value = SettingsFile.GetSetting(Xpath, defaultValue); - } - - void StoreValueInConfigFile() - { - SettingsFile.PutSetting(Xpath, value); - } - } -} diff --git a/Shared/Settings/SettingsFile.cs b/Shared/Settings/SettingsFile.cs deleted file mode 100644 index 3127e6e..0000000 --- a/Shared/Settings/SettingsFile.cs +++ /dev/null @@ -1,210 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.IO; -using System.Xml; - -namespace Mag.Shared.Settings -{ - static class SettingsFile - { - internal static readonly XmlDocument XmlDocument = new XmlDocument(); - - static string _documentPath; - - static string _rootNodeName = "Settings"; - - static SettingsFile() - { - ReloadXmlDocument(); - } - - public static void Init(string filePath, string rootNode = "Settings") - { - _documentPath = filePath; - - _rootNodeName = rootNode; - - ReloadXmlDocument(); - } - - public static void ReloadXmlDocument() - { - try - { - if (!String.IsNullOrEmpty(_documentPath) && File.Exists(_documentPath)) - XmlDocument.Load(_documentPath); - else - XmlDocument.LoadXml("<" + _rootNodeName + ">"); - } - catch (Exception ex) - { - Debug.LogException(ex); - - XmlDocument.LoadXml("<" + _rootNodeName + ">"); - } - } - - public static void SaveXmlDocument() - { - XmlDocument.Save(_documentPath); - } - - public static T GetSetting(string xPath, T defaultValue = default(T)) - { - XmlNode xmlNode = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath); - - if (xmlNode != null) - { - TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); - - if (converter.CanConvertFrom(typeof(string))) - return (T)converter.ConvertFromString(xmlNode.InnerText); - } - - return defaultValue; - } - - public static void PutSetting(string xPath, T value) - { - // Before we save a setting, we reload the document to make sure we don't overwrite settings saved from another session. - ReloadXmlDocument(); - - XmlNode xmlNode = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath); - - if (xmlNode == null) - xmlNode = createMissingNode(_rootNodeName + "/" + xPath); - - TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); - - if (converter.CanConvertTo(typeof(string))) - { - string result = converter.ConvertToString(value); - - if (result != null) - { - xmlNode.InnerText = result; - - XmlDocument.Save(_documentPath); - } - } - } - - static XmlNode createMissingNode(string xPath) - { - string[] xPathSections = xPath.Split('/'); - - string currentXPath = ""; - - XmlNode currentNode = XmlDocument.SelectSingleNode(_rootNodeName); - - foreach (string xPathSection in xPathSections) - { - currentXPath += xPathSection; - - XmlNode testNode = XmlDocument.SelectSingleNode(currentXPath); - - if (testNode == null) - { - if (currentNode != null) - currentNode.InnerXml += "<" + xPathSection + ">"; - } - - currentNode = XmlDocument.SelectSingleNode(currentXPath); - - currentXPath += "/"; - } - - return currentNode; - } - - public static IList GetChilderenInnerTexts(string xPath) - { - XmlNode xmlNode = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath); - - Collection collection = new Collection(); - - if (xmlNode != null) - { - foreach (XmlNode childNode in xmlNode.ChildNodes) - collection.Add(childNode.InnerText); - } - - return collection; - } - - public static void SetNodeChilderen(string xPath, string childNodeName, IList innerTexts) - { - // Before we save a setting, we reload the document to make sure we don't overwrite settings saved from another session. - ReloadXmlDocument(); - - XmlNode parentNode = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath); - - if (parentNode == null) - { - if (innerTexts.Count == 0) - return; - - parentNode = createMissingNode(_rootNodeName + "/" + xPath); - } - - parentNode.RemoveAll(); - - if (innerTexts.Count == 0) - { - XmlDocument.Save(_documentPath); - return; - } - - foreach (string innerText in innerTexts) - { - XmlNode childNode = parentNode.AppendChild(XmlDocument.CreateElement(childNodeName)); - - childNode.InnerText = innerText; - } - - XmlDocument.Save(_documentPath); - } - - public static XmlNode GetNode(string xPath, bool createIfNull = false) - { - var node = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath); - - if (node == null && createIfNull) - node = createMissingNode(_rootNodeName + "/" + xPath); - - return node; - } - - public static void SetNodeChilderen(string xPath, string childNodeName, Collection> childNodeAttributes) - { - // Before we save a setting, we reload the document to make sure we don't overwrite settings saved from another session. - ReloadXmlDocument(); - - XmlNode parentNode = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath); - - if (parentNode == null) - parentNode = createMissingNode(_rootNodeName + "/" + xPath); - - if (parentNode.HasChildNodes) - parentNode.RemoveAll(); - - foreach (Dictionary dictionary in childNodeAttributes) - { - XmlNode childNode = parentNode.AppendChild(XmlDocument.CreateElement(childNodeName)); - - foreach (KeyValuePair pair in dictionary) - { - XmlAttribute attribute = XmlDocument.CreateAttribute(pair.Key); - attribute.Value = pair.Value; - - if (childNode.Attributes != null) - childNode.Attributes.Append(attribute); - } - } - - XmlDocument.Save(_documentPath); - } - } -} diff --git a/Shared/SortableBindingList.cs b/Shared/SortableBindingList.cs deleted file mode 100644 index ad5919f..0000000 --- a/Shared/SortableBindingList.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; - -namespace Mag.Shared -{ - class SortableBindingList : BindingList where T : class - { - protected override bool SupportsSortingCore { get { return true; } } - - private bool isSorted; - private ListSortDirection sortDirection; - private PropertyDescriptor sortProperty; - - protected override bool IsSortedCore { get { return isSorted; } } - - protected override ListSortDirection SortDirectionCore { get { return sortDirection; } } - - protected override PropertyDescriptor SortPropertyCore { get { return sortProperty; } } - - protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) - { - sortProperty = prop; - sortDirection = direction; - - List items = (List)Items; - - items.Sort(delegate(T lhs, T rhs) - { - isSorted = true; - object lhsValue = lhs == null ? null : prop.GetValue(lhs); - object rhsValue = rhs == null ? null : prop.GetValue(rhs); - int result = Comparer.Default.Compare(lhsValue, rhsValue); - - if (direction == ListSortDirection.Descending) - result = -result; - - return result; - }); - } - - protected override void RemoveSortCore() - { - sortDirection = ListSortDirection.Ascending; - sortProperty = null; - } - - - /// - /// Sorts using the default IComparer of T - /// - public void Sort() - { - sort(null, null); - } - - public void Sort(IComparer comparer) - { - sort(comparer, null); - } - - public void Sort(Comparison comparison) - { - sort(null, comparison); - } - - private void sort(IComparer comparer, Comparison comparison) - { - sortProperty = null; - sortDirection = ListSortDirection.Ascending; - - //Extract items and sort separately - List sortList = new List(); - foreach (var item in this) - sortList.Add(item); - - if (comparison == null) - sortList.Sort(comparer); - else - sortList.Sort(comparison); - - //Disable notifications, rebuild, and re-enable notifications - bool oldRaise = RaiseListChangedEvents; - RaiseListChangedEvents = false; - - try - { - ClearItems(); - sortList.ForEach(item => Add(item)); - } - finally - { - RaiseListChangedEvents = oldRaise; - ResetBindings(); - } - - } - } -} diff --git a/Shared/Spells/Spell.cs b/Shared/Spells/Spell.cs deleted file mode 100644 index 42356de..0000000 --- a/Shared/Spells/Spell.cs +++ /dev/null @@ -1,188 +0,0 @@ - -namespace Mag.Shared.Spells -{ - /// - /// Use GetSpell() to intialize a Spell object - /// - public class Spell - { - public readonly int Id; - public readonly string Name; - public readonly int Difficulty; - public readonly int Duration; - public readonly int Family; - - public enum BuffLevels - { - None, - - I, - II, - III, - IV, - V, - VI, - VII, - VIII, - } - public readonly BuffLevels BuffLevel; - - public enum CantripLevels - { - None, - - Feeble, - Minor, - Lesser, - Moderate, - Inner, - Major, - Epic, - Legendary, - } - public readonly CantripLevels CantripLevel; - - public Spell(int id, string name, int difficulty, int duration, int family) - { - Id = id; - Name = name; - Difficulty = difficulty; - Duration = duration; - Family = family; - - if (name.EndsWith(" I")) - BuffLevel = BuffLevels.I; - else if (name.EndsWith(" II")) - BuffLevel = BuffLevels.II; - else if (name.EndsWith(" III")) - BuffLevel = BuffLevels.III; - else if (name.EndsWith(" IV")) - BuffLevel = BuffLevels.IV; - else if (name.EndsWith(" V")) - BuffLevel = BuffLevels.V; - else if (name.EndsWith(" VI")) - BuffLevel = BuffLevels.VI; - else if (name.EndsWith(" VII")) // This doesn't pick up every lvl 7 - BuffLevel = BuffLevels.VII; - else if (name.StartsWith("Incantation ") || name.StartsWith("Aura of Incantation ")) - BuffLevel = BuffLevels.VIII; - - if (name.StartsWith("Feeble ")) - CantripLevel = CantripLevels.Feeble; - else if (name.StartsWith("Minor ")) - CantripLevel = CantripLevels.Minor; - else if (name.StartsWith("Lesser ")) - CantripLevel = CantripLevels.Lesser; - else if (name.StartsWith("Moderate ")) - CantripLevel = CantripLevels.Moderate; - else if (name.StartsWith("Inner ") && name != "Inner Calm") - CantripLevel = CantripLevels.Inner; - else if (name.StartsWith("Major ")) - CantripLevel = CantripLevels.Major; - else if (name.StartsWith("Epic ")) - CantripLevel = CantripLevels.Epic; - else if (name.StartsWith("Legendary ")) - CantripLevel = CantripLevels.Legendary; - - // Try to determine if this is a lvl x - if (BuffLevel == BuffLevels.None && CantripLevel == CantripLevels.None) - { - // These spells don't have levels - if (name.StartsWith("Prodigal ") || // Rares - name.StartsWith("Cloaked in ") || name.StartsWith("Shroud of ")) // Cloaks - return; - - if (difficulty == 1 && duration == 1800) - BuffLevel = BuffLevels.I; - if (difficulty == 50 && duration == -1 && name.StartsWith("Evaporate ")) - BuffLevel = BuffLevels.II; - - if (difficulty == 50 && duration == 1800) - BuffLevel = BuffLevels.II; - if (difficulty == 100 && duration == -1 && name.StartsWith("Extinguish ")) - BuffLevel = BuffLevels.II; - - if (difficulty == 100 && duration == 1800) - BuffLevel = BuffLevels.III; - if (difficulty == 150 && duration == -1 && name.StartsWith("Cleanse ")) - BuffLevel = BuffLevels.III; - - if (difficulty == 150 && duration == 1800) - BuffLevel = BuffLevels.IV; - if (difficulty == 200 && duration == -1 && name.StartsWith("Devour ")) - BuffLevel = BuffLevels.IV; - - if (difficulty == 200 && duration == 1800) - BuffLevel = BuffLevels.V; - if (difficulty == 250 && duration == -1 && name.StartsWith("Purge ")) - BuffLevel = BuffLevels.V; - - if (difficulty == 200 && duration == -1 && !name.StartsWith("Devour ")) // Ring spells - BuffLevel = BuffLevels.VI; - if (difficulty == 250 && duration == 2700) - BuffLevel = BuffLevels.VI; - if (difficulty == 300 && duration == -1 && name.StartsWith("Nullify ")) - BuffLevel = BuffLevels.VI; - - if (difficulty == 300 && duration == -1 && !name.StartsWith("Nullify ")) - BuffLevel = BuffLevels.VII; - if (difficulty == 300 && duration == 240) - BuffLevel = BuffLevels.VII; - if (difficulty == 300 && duration == 3600) - BuffLevel = BuffLevels.VII; - if (difficulty == 325 && duration == -1) - BuffLevel = BuffLevels.VII; - if (difficulty == 325 && duration == 240) - BuffLevel = BuffLevels.VII; - if (difficulty == 350 && duration == -1) - BuffLevel = BuffLevels.VII; - - if (difficulty == 400 && duration == 5400) - BuffLevel = BuffLevels.VIII; - } - } - - - public bool IsOfSameFamilyAndGroup(Spell compareSpell) - { - if (Family != compareSpell.Family) - return false; - - if (BuffLevel != 0 && compareSpell.BuffLevel != 0) - return true; - - if (CantripLevel != 0 && compareSpell.CantripLevel != 0) - return true; - - // Are both spells are of an unkown group? - if (BuffLevel == 0 && compareSpell.BuffLevel == 0 && CantripLevel == 0 && compareSpell.CantripLevel == 0) - return true; - - return false; - } - - public bool IsSameOrSurpasses(Spell compareSpell) - { - return (this == compareSpell || Surpasses(compareSpell)); - } - - public bool Surpasses(Spell compareSpell) - { - if (Family == 0 || Family != compareSpell.Family) - return false; - - if (BuffLevel > 0 && compareSpell.BuffLevel > 0 && BuffLevel > compareSpell.BuffLevel) - return true; - - if (CantripLevel > 0 && compareSpell.CantripLevel > 0 && CantripLevel > compareSpell.CantripLevel) - return true; - - return false; - } - - public override string ToString() - { - return Name; - } - } -} diff --git a/Shared/Spells/SpellTools.cs b/Shared/Spells/SpellTools.cs deleted file mode 100644 index 0e0a242..0000000 --- a/Shared/Spells/SpellTools.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Globalization; -using System.IO; -using System.Reflection; - -namespace Mag.Shared.Spells -{ - public static class SpellTools - { - static readonly List SpellTableHeader = new List(); - static readonly Collection SpellTable = new Collection(); - - static readonly Dictionary SpellsById = new Dictionary(); - - static SpellTools() - { - var resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames(); - - if (resourceNames.Length == 0) - return; - - var rootNameSpace = resourceNames[0].Substring(0, resourceNames[0].IndexOf('.')); - - using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(rootNameSpace + ".Shared.Spells.Spells.csv")) - { - if (stream != null) - { - using (StreamReader reader = new StreamReader(stream)) - { - SpellTableHeader = new List(reader.ReadLine().Split(',')); - - while (!reader.EndOfStream) - SpellTable.Add(reader.ReadLine().Split(',')); - } - } - } - } - - /// - /// Will return null if no spell was found. - /// - public static Spell GetSpell(int id) - { - if (SpellsById.TryGetValue(id, out var spell)) - return spell; - - int idIndex = SpellTableHeader.IndexOf("Id"); - - foreach (string[] line in SpellTable) - { - if (line[idIndex] == id.ToString(CultureInfo.InvariantCulture)) - return GetSpell(line); - } - - //throw new ArgumentException("Spell of id: " + id + " not found in Spells.csv"); - return null; - } - - /// - /// Will return null if no spell was found. - /// - public static Spell GetSpell(string name) - { - foreach (var kvp in SpellsById) - { - if (String.Equals(kvp.Value.Name, name, StringComparison.OrdinalIgnoreCase)) - return kvp.Value; - } - - int nameIndex = SpellTableHeader.IndexOf("Name"); - - foreach (string[] line in SpellTable) - { - if (String.Equals(line[nameIndex], name, StringComparison.OrdinalIgnoreCase)) - return GetSpell(line); - } - - //throw new ArgumentException("Spell of name: " + name + " not found in Spells.csv"); - return null; - } - - private static Spell GetSpell(string[] splitLine) - { - int idIndex = SpellTableHeader.IndexOf("Id"); - int nameIndex = SpellTableHeader.IndexOf("Name"); - int difficultyIndex = SpellTableHeader.IndexOf("Difficulty"); - int durationIndex = SpellTableHeader.IndexOf("Duration"); - int familyIndex = SpellTableHeader.IndexOf("Family"); - - int id; - int.TryParse(splitLine[idIndex], out id); - - string name = splitLine[nameIndex]; - - int difficulty; - int.TryParse(splitLine[difficultyIndex], out difficulty); - - int duration; - int.TryParse(splitLine[durationIndex], out duration); - - int family; - int.TryParse(splitLine[familyIndex], out family); - - var spell = new Spell(id, name, difficulty, duration, family); - - if (!SpellsById.ContainsKey(spell.Id)) - SpellsById.Add(spell.Id, spell); - - return spell; - } - - public static bool IsAKnownSpell(int id) - { - if (SpellsById.ContainsKey(id)) - return true; - - int idIndex = SpellTableHeader.IndexOf("Id"); - - foreach (string[] line in SpellTable) - { - if (line[idIndex] == id.ToString(CultureInfo.InvariantCulture)) - return true; - } - - return false; - } - - public static bool IsAKnownSpell(string name) - { - foreach (var kvp in SpellsById) - { - if (String.Equals(kvp.Value.Name, name, StringComparison.OrdinalIgnoreCase)) - return true; - } - - int nameIndex = SpellTableHeader.IndexOf("Name"); - - foreach (string[] line in SpellTable) - { - if (line[nameIndex] == name) - return true; - } - - return false; - } - } -} diff --git a/Shared/Spells/Spells.csv b/Shared/Spells/Spells.csv deleted file mode 100644 index 5279bfa..0000000 --- a/Shared/Spells/Spells.csv +++ /dev/null @@ -1,6267 +0,0 @@ -Id,Name,Description,Difficulty,Duration,Family,Mana,School,Speed,TargetEffect,TargetMask,Unknown1,Unknown2,Unknown3 -1,Strength Other I,Increases the target's Strength by 10 points.,1,1800,1,10,Creature Enchantment,0,6,16,5,1,1 -2,Strength Self I,Increases the caster's Strength by 10 points.,1,1800,1,15,Creature Enchantment,0.01,6,16,0,0,1 -3,Weakness Other I,Decreases the target's Strength by 10 points.,1,60,2,10,Creature Enchantment,0.01,7,16,5,1,1 -4,Weakness Self I,Decrease the caster's Strength by 10 points.,15,60,2,15,Creature Enchantment,0.01,7,16,0,0,1 -5,Heal Other I,Restores 10-25 points of the target's Health.,1,-1,79,10,Life Magic,0,31,16,5,1,1 -6,Heal Self I,Restores 10-25 points of the caster's Health.,1,-1,67,15,Life Magic,0.01,31,16,0,0,1 -7,Harm Other I,Drains 4-6 points of the target's Health.,1,-1,80,10,Life Magic,0.01,32,16,10,0,1 -8,Harm Self I,Drains 4-6 points of the caster's Health.,15,-1,80,15,Life Magic,0.01,32,16,0,0,1 -9,Infuse Mana Other I,Drains one-quarter of the caster's Mana and gives 75% of that to the target.,1,-1,92,10,Life Magic,0.1,33,16,5,0.5,0 -15,Vulnerability Other I,Decrease the target's Melee Defense skill by 10 points.,1,60,38,10,Creature Enchantment,0.01,23,16,0,1,1 -16,Vulnerability Self I,Decrease the target's Melee Defense skill by 10 points.,1,60,38,15,Creature Enchantment,0.01,23,16,0,0,1 -17,Invulnerability Other I,Increases the target's Melee Defense skill by 10 points.,1,1800,37,10,Creature Enchantment,0.01,22,16,5,1,1 -18,Invulnerability Self I,Increases the caster's Melee Defense skill by 10 points.,1,1800,37,15,Creature Enchantment,0,22,16,0,0,1 -19,Fire Protection Other I,Reduces damage the target takes from fire by 9%.,1,1800,109,10,Life Magic,0.01,43,16,5,1,0 -20,Fire Protection Self I,Reduces damage the caster takes from Fire by 9%.,1,1800,109,15,Life Magic,0.01,43,16,0,0,0 -21,Fire Vulnerability Other I,Increases damage the target takes from Fire by 10%.,25,60,110,10,Life Magic,0.01,44,16,5,1,1 -22,Fire Vulnerability Self I,Increases damage the caster takes from Fire by 10%.,25,60,110,15,Life Magic,0.01,44,16,0,0,1 -23,Armor Other I,Increases the target's natural armor by 20 points.,1,1800,115,10,Life Magic,0.01,55,16,5,1,1 -24,Armor Self I,Increases the caster's natural armor by 20 points.,1,1800,115,15,Life Magic,0,55,16,0,0,1 -25,Imperil Other I,Decreases the target's natural armor by 20 points.,25,60,116,10,Life Magic,0.01,56,16,5,1,1 -26,Imperil Self I,Decreases the caster's natural armor by 20 points.,25,60,116,20,Life Magic,0.01,56,16,0,0,1 -27,Flame Bolt I,Shoots a bolt of flame at the target. The bolt does 16-31 points of fire damage to the first thing it hits.,1,-1,121,5,War Magic,0,0,16,30,0.7,1 -28,Frost Bolt I,Shoots a bolt of frost at the target. The bolt does 16-31 points of cold damage to the first thing it hits.,1,-1,119,5,War Magic,0.01,0,16,30,0.7,1 -35,Aura of Blood Drinker Self I,Increases a weapon's damage value by 2 points.,1,1800,154,10,Item Enchantment,0,57,16,25,0,1 -36,Blood Loather I,Decreases a weapon's damage value by 2 points.,25,60,155,10,Item Enchantment,0.05,58,257,25,0,1 -37,Blade Bane I,Increases a shield or piece of armor's resistance to slashing damage by 10%. Target yourself to cast this spell on all of your equipped armor.,1,1800,174,10,Item Enchantment,0.01,61,6,25,0,1 -38,Blade Lure I,Decreases a shield or piece of armor's resistance to slashing damage by 10%.,25,60,175,10,Item Enchantment,0.01,62,6,25,0,1 -47,Primary Portal Tie,Links the caster to a targeted portal.,150,-1,200,50,Item Enchantment,0.25,17,65536,30,0,1 -48,Primary Portal Recall,Transports the caster to the destination of the portal last successfully linked to with Primary Portal Tie.,100,-1,201,50,Item Enchantment,0.25,0,65536,0,0,1 -49,Aura of Swift Killer Self I,Improves a weapon's speed by 10 points.,1,1800,158,10,Item Enchantment,0,63,16,25,0,1 -50,Leaden Weapon I,Worsens a weapon's speed by 10 points.,25,60,159,10,Item Enchantment,0.01,64,257,25,0,1 -51,Impenetrability I,Improves a shield or piece of armor's armor value by 20 points. Target yourself to cast this spell on all of your equipped armor.,1,1800,160,10,Item Enchantment,0,142,6,25,0,1 -53,Rejuvenation Other I,Increases the rate at which the target regains Stamina by 10%.,1,1800,95,10,Life Magic,0,41,16,5,1,1 -54,Rejuvenation Self I,Increases the rate at which the caster regains Stamina by 10%.,1,1800,95,15,Life Magic,0.01,41,16,0,0,1 -57,Magic Bolt,Shoots a bolt of force at the target. The bolt does 8-16 points of piercing damage to the first thing it hits.,1,-1,122,10,War Magic,0,0,16,30,0.7,1 -58,Acid Stream I,Shoots a stream of acid at the target. The stream does 16-31 points of acid damage to the first thing it hits.,1,-1,117,5,War Magic,0.01,0,16,30,0.7,1 -59,Acid Stream II,Shoots a stream of acid at the target. The stream does 26-52 points of acid damage to the first thing it hits.,50,-1,117,10,War Magic,0.05,0,16,30,0.6,1 -60,Acid Stream III,Shoots a stream of acid at the target. The stream does 42-84 points of acid damage to the first thing it hits.,100,-1,117,15,War Magic,0.1,0,16,30,0.5,1 -61,Acid Stream IV,Shoots a stream of acid at the target. The stream does 52-105 points of acid damage to the first thing it hits.,150,-1,117,20,War Magic,0.15,0,16,30,0.4,1 -62,Acid Stream V,Shoots a stream of acid at the target. The stream does 68-136 points of acid damage to the first thing it hits.,200,-1,117,25,War Magic,0.2,0,16,30,0.3,1 -63,Acid Stream VI,Shoots a stream of acid at the target. The stream does 84-168 points of acid damage to the first thing it hits.,250,-1,117,30,War Magic,0.3,0,16,30,0.2,1 -64,Shock Wave I,Shoots a shock wave at the target. The wave does 16-31 points of bludgeoning damage to the first thing it hits.,1,-1,118,5,War Magic,0.01,0,16,30,0.7,1 -65,Shock Wave II,Shoots a shock wave at the target. The wave does 26-52 points of bludgeoning damage to the first thing it hits.,50,-1,118,10,War Magic,0.05,0,16,30,0.6,1 -66,Shock Wave III,Shoots a shock wave at the target. The wave does 42-84 points of bludgeoning damage to the first thing it hits.,100,-1,118,15,War Magic,0.1,0,16,30,0.5,1 -67,Shock Wave IV,Shoots a shock wave at the target. The wave does 52-105 points of bludgeoning damage to the first thing it hits.,150,-1,118,20,War Magic,0.15,0,16,30,0.4,1 -68,Shock Wave V,Shoots a shock wave at the target. The wave does 68-136 points of bludgeoning damage to the first thing it hits.,200,-1,118,25,War Magic,0.2,0,16,30,0.3,1 -69,Shock Wave VI,Shoots a shock wave at the target. The wave does 84-168 points of bludgeoning damage to the first thing it hits.,250,-1,118,30,War Magic,0.3,0,16,30,0.2,1 -70,Frost Bolt II,Shoots a bolt of frost at the target. The bolt does 26-52 points of cold damage to the first thing it hits.,50,-1,119,10,War Magic,0.05,0,16,30,0.6,1 -71,Frost Bolt III,Shoots a bolt of cold at the target. The bolt does 42-84 points of cold damage to the first thing it hits.,100,-1,119,15,War Magic,0.1,0,16,30,0.5,1 -72,Frost Bolt IV,Shoots a bolt of cold at the target. The bolt does 52-105 points of cold damage to the first thing it hits.,150,-1,119,20,War Magic,0.15,0,16,30,0.4,1 -73,Frost Bolt V,Shoots a bolt of cold at the target. The bolt does 68-136 points of cold damage to the first thing it hits.,200,-1,119,25,War Magic,0.2,0,16,30,0.3,1 -74,Frost Bolt VI,Shoots a bolt of cold at the target. The bolt does 84-168 points of cold damage to the first thing it hits.,250,-1,119,30,War Magic,0.3,0,16,30,0.2,1 -75,Lightning Bolt I,Shoots a bolt of lighting at the target. The bolt does 16-31 points of electrical damage to the first thing it hits.,1,-1,120,5,War Magic,0,0,16,30,0.7,1 -76,Lightning Bolt II,Shoots a bolt of lighting at the target. The bolt does 26-52 points of electrical damage to the first thing it hits.,50,-1,120,10,War Magic,0.05,0,16,30,0.6,1 -77,Lightning Bolt III,Shoots a bolt of lighting at the target. The bolt does 42-84 points of electrical damage to the first thing it hits.,100,-1,120,15,War Magic,0.1,0,16,30,0.5,1 -78,Lightning Bolt IV,Shoots a bolt of lighting at the target. The bolt does 52-105 points of electrical damage to the first thing it hits.,150,-1,120,20,War Magic,0.15,0,16,30,0.4,1 -79,Lightning Bolt V,Shoots a bolt of lighting at the target. The bolt does 68-136 points of electrical damage to the first thing it hits.,200,-1,120,25,War Magic,0.2,0,16,30,0.3,1 -80,Lightning Bolt VI,Shoots a bolt of lighting at the target. The bolt does 84-168 points of electrical damage to the first thing it hits.,250,-1,120,30,War Magic,0.3,0,16,30,0.2,1 -81,Flame Bolt II,Shoots a bolt of flame at the target. The bolt does 26-52 points of fire damage to the first thing it hits.,50,-1,121,10,War Magic,0.05,0,16,30,0.6,1 -82,Flame Bolt III,Shoots a bolt of flame at the target. The bolt does 42-84 points of fire damage to the first thing it hits.,100,-1,121,15,War Magic,0.1,0,16,30,0.5,1 -83,Flame Bolt IV,Shoots a bolt of flame at the target. The bolt does 52-105 points of fire damage to the first thing it hits.,150,-1,121,20,War Magic,0.15,0,16,30,0.4,1 -84,Flame Bolt V,Shoots a bolt of flame at the target. The bolt does 68-136 points of fire damage to the first thing it hits.,200,-1,121,25,War Magic,0.2,0,16,30,0.3,1 -85,Flame Bolt VI,Shoots a bolt of flame at the target. The bolt does 84-168 points of fire damage to the first thing it hits.,250,-1,121,30,War Magic,0.3,0,16,30,0.2,1 -86,Force Bolt I,Shoots a bolt of force at the target. The bolt does 16-31 points of piercing damage to the first thing it hits.,1,-1,122,5,War Magic,0,0,16,30,0.7,1 -87,Force Bolt II,Shoots a bolt of force at the target. The bolt does 26-52 points of piercing damage to the first thing it hits.,50,-1,122,10,War Magic,0.05,0,16,30,0.6,1 -88,Force Bolt III,Shoots a bolt of force at the target. The bolt does 42-84 points of piercing damage to the first thing it hits.,100,-1,122,15,War Magic,0.1,0,16,30,0.5,1 -89,Force Bolt IV,Shoots a bolt of force at the target. The bolt does 52-105 points of piercing damage to the first thing it hits.,150,-1,122,20,War Magic,0.15,0,16,30,0.4,1 -90,Force Bolt V,Shoots a bolt of force at the target. The bolt does 68-136 points of piercing damage to the first thing it hits.,200,-1,122,25,War Magic,0.2,0,16,30,0.3,1 -91,Force Bolt VI,Shoots a bolt of force at the target. The bolt does 84-168 points of piercing damage to the first thing it hits.,250,-1,122,30,War Magic,0.3,0,16,30,0.2,1 -92,Whirling Blade I,Shoots a magical blade at the target. The bolt does 16-31 points of slashing damage to the first thing it hits.,1,-1,123,5,War Magic,0.01,0,16,30,0.7,1 -93,Whirling Blade II,Shoots a magical blade at the target. The bolt does 26-52 points of slashing damage to the first thing it hits.,50,-1,123,10,War Magic,0.05,0,16,30,0.6,1 -94,Whirling Blade III,Shoots a magical blade at the target. The bolt does 42-84 points of slashing damage to the first thing it hits.,100,-1,123,15,War Magic,0.1,0,16,30,0.5,1 -95,Whirling Blade IV,Shoots a magical blade at the target. The bolt does 52-105 points of slashing damage to the first thing it hits.,150,-1,123,20,War Magic,0.15,0,16,30,0.4,1 -96,Whirling Blade V,Shoots a magical blade at the target. The bolt does 68-136 points of slashing damage to the first thing it hits.,200,-1,123,25,War Magic,0.2,0,16,30,0.3,1 -97,Whirling Blade VI,Shoots a magical blade at the target. The bolt does 84-168 points of slashing damage to the first thing it hits.,250,-1,123,30,War Magic,0.3,0,16,30,0.2,1 -99,Acid Blast III,Shoots three streams of acid outward from the caster. Each stream does 15-31 points of acid damage to the first thing it hits.,125,-1,131,15,War Magic,0.15,0,16,30,0.5,1 -100,Acid Blast IV,Shoots three streams of acid outward from the caster. Each stream does 20-40 points of acid damage to the first thing it hits.,175,-1,131,20,War Magic,0.2,0,16,30,0.4,1 -101,Acid Blast V,Shoots three streams of acid outward from the caster. Each stream does 26-52 points of acid damage to the first thing it hits.,225,-1,131,25,War Magic,0.3,0,16,30,0.3,1 -102,Acid Blast VI,Shoots three streams of acid outward from the caster. Each stream does 34-69 points of acid damage to the first thing it hits.,275,-1,131,30,War Magic,0.4,0,16,30,0.2,1 -103,Shock Blast III,Shoots three shock waves outward from the caster. Each wave does 15-31 points of damage to the first thing it hits.,125,-1,132,15,War Magic,0.15,0,16,30,0.5,1 -104,Shock Blast IV,Shoots three shock waves outward from the caster. Each wave does 20-40 points of damage to the first thing it hits.,175,-1,132,20,War Magic,0.2,0,16,30,0.4,1 -105,Shock Blast V,Shoots three shock waves outward from the caster. Each wave does 26-52 points of damage to the first thing it hits.,225,-1,132,25,War Magic,0.3,0,16,30,0.3,1 -106,Shock Blast VI,Shoots three shock waves outward from the caster. Each wave does 34-69 points of damage to the first thing it hits.,275,-1,132,30,War Magic,0.4,0,16,30,0.2,1 -107,Frost Blast III,Shoots three bolts of frost outward from the caster. Each bolt does 15-31 points of cold damage to the first thing it hits.,125,-1,133,15,War Magic,0.15,0,0,30,0.5,1 -108,Frost Blast IV,Shoots three bolts of frost outward from the caster. Each bolt does 20-40 points of cold damage to the first thing it hits.,175,-1,133,20,War Magic,0.2,0,0,30,0.4,1 -109,Frost Blast V,Shoots three bolts of frost outward from the caster. Each bolt does 26-52 points of cold damage to the first thing it hits.,225,-1,133,25,War Magic,0.3,0,0,30,0.3,1 -110,Frost Blast VI,Shoots three bolts of frost outward from the caster. Each bolt does 34-69 points of cold damage to the first thing it hits.,275,-1,133,30,War Magic,0.4,0,0,30,0.2,1 -111,Lightning Blast III,Shoots three bolts of lightning outward from the caster. Each bolt does 15-31 points of electric damage to the first thing it hits.,125,-1,134,15,War Magic,0.15,0,16,30,0.5,1 -112,Lightning Blast IV,Shoots three bolts of lightning outward from the caster. Each bolt does 20-40 points of electric damage to the first thing it hits.,175,-1,134,20,War Magic,0.2,0,16,30,0.4,1 -113,Lightning Blast V,Shoots three bolts of lightning outward from the caster. Each bolt does 26-52 points of electric damage to the first thing it hits.,225,-1,134,25,War Magic,0.3,0,16,30,0.3,1 -114,Lightning Blast VI,Shoots three bolts of lightning outward from the caster. Each bolt does 34-69 points of electric damage to the first thing it hits.,275,-1,134,30,War Magic,0.4,0,16,30,0.2,1 -115,Flame Blast III,Shoots three bolts of flame outward from the caster. Each bolt does 15-31 points of fire damage to the first thing it hits.,125,-1,135,15,War Magic,0.15,0,16,30,0.5,1 -116,Flame Blast IV,Shoots three bolts of flame outward from the caster. Each bolt does 20-40 points of fire damage to the first thing it hits.,175,-1,135,20,War Magic,0.2,0,16,30,0.4,1 -117,Flame Blast V,Shoots three bolts of flame outward from the caster. Each bolt does 26-52 points of fire damage to the first thing it hits.,225,-1,135,25,War Magic,0.3,0,16,30,0.3,1 -118,Flame Blast VI,Shoots three bolts of flame outward from the caster. Each bolt does 34-69 points of fire damage to the first thing it hits.,275,-1,135,30,War Magic,0.4,0,16,30,0.2,1 -119,Force Blast III,Shoots three force bolts outward from the caster. Each bolt does 15-31 points of piercing damage to the first thing it hits.,125,-1,136,15,War Magic,0.15,0,16,30,0.5,1 -120,Force Blast IV,Shoots three force bolts outward from the caster. Each bolt does 20-40 points of piercing damage to the first thing it hits.,175,-1,136,20,War Magic,0.3,0,16,30,0.4,1 -121,Force Blast V,Shoots three force bolts outward from the caster. Each bolt does 26-52 points of piercing damage to the first thing it hits.,225,-1,136,25,War Magic,0.3,0,16,30,0.3,1 -122,Force Blast VI,Shoots three force bolts outward from the caster. Each bolt does 34-69 points of piercing damage to the first thing it hits.,275,-1,136,30,War Magic,0.4,0,16,30,0.2,1 -123,Blade Blast III,Shoots three whirling blades outward from the caster. Each blade does 10-20 points of slashing damage to the first thing it hits.,125,-1,137,15,War Magic,0.15,0,16,30,0.5,1 -124,Blade Blast IV,Shoots three whirling blades outward from the caster. Each blade does 20-40 points of slashing damage to the first thing it hits.,175,-1,137,20,War Magic,0.2,0,16,30,0.4,1 -125,Blade Blast V,Shoots three whirling blades outward from the caster. Each blade does 26-52 points of slashing damage to the first thing it hits.,225,-1,137,25,War Magic,0.3,0,16,30,0.3,1 -126,Blade Blast VI,Shoots three whirling blades outward from the caster. Each blade does 34-69 points of slashing damage to the first thing it hits.,275,-1,137,30,War Magic,0.4,0,16,30,0.2,1 -127,Acid Volley III,Shoots three streams of acid toward the target. Each stream does 15-31 points of acid damage to the first thing it hits.,125,-1,207,15,War Magic,0.15,0,16,30,0.5,1 -128,Acid Volley IV,Shoots three streams of acid toward the target. Each stream does 20-40 points of acid damage to the first thing it hits.,175,-1,207,20,War Magic,0.2,0,16,30,0.4,1 -129,Acid Volley V,Shoots three streams of acid toward the target. Each stream does 26-52 points of acid damage to the first thing it hits.,225,-1,207,25,War Magic,0.3,0,16,30,0.3,1 -130,Acid Volley VI,Shoots three streams of acid toward the target. Each stream does 34-69 points of acid damage to the first thing it hits.,275,-1,207,30,War Magic,0.4,0,16,30,0.2,1 -131,Bludgeoning Volley III,Shoots three shock waves toward the target. Each wave does 15-31 points of bludgeoning damage to the first thing it hits.,125,-1,208,15,War Magic,0.15,0,16,30,0.5,1 -132,Bludgeoning Volley IV,Shoots three shock waves toward the target. Each wave does 20-40 points of bludgeoning damage to the first thing it hits.,175,-1,208,20,War Magic,0.2,0,16,30,0.4,1 -133,Bludgeoning Volley V,Shoots three shock waves toward the target. Each wave does 26-52 points of bludgeoning damage to the first thing it hits.,225,-1,208,25,War Magic,0.3,0,16,30,0.3,1 -134,Bludgeoning Volley VI,Shoots three shock waves toward the target. Each wave does 34-69 points of bludgeoning damage to the first thing it hits.,275,-1,208,30,War Magic,0.4,0,16,30,0.2,1 -135,Frost Volley III,Shoots three bolts of frost toward the target. Each bolt does 15-31 points of cold damage to the first thing it hits.,125,-1,209,15,War Magic,0.15,0,16,30,0.5,1 -136,Frost Volley IV,Shoots three bolts of frost toward the target. Each bolt does 20-40 points of cold damage to the first thing it hits.,175,-1,209,20,War Magic,0.2,0,16,30,0.4,1 -137,Frost Volley V,Shoots three bolts of frost toward the target. Each bolt does 26-52 points of cold damage to the first thing it hits.,225,-1,209,25,War Magic,0.3,0,16,30,0.3,1 -138,Frost Volley VI,Shoots three bolts of frost toward the target. Each bolt does 34-69 points of cold damage to the first thing it hits.,275,-1,209,30,War Magic,0.4,0,16,30,0.2,1 -139,Lightning Volley III,Shoots three bolts of lightning toward the target. Each bolt does 15-31 points of electric damage to the first thing it hits.,125,-1,210,15,War Magic,0.15,0,16,30,0.5,1 -140,Lightning Volley IV,Shoots three bolts of lightning toward the target. Each bolt does 20-40 points of electric damage to the first thing it hits.,175,-1,210,20,War Magic,0.2,0,16,30,0.4,1 -141,Lightning Volley V,Shoots three bolts of lightning toward the target. Each bolt does 26-52 points of electric damage to the first thing it hits.,225,-1,210,25,War Magic,0.3,0,16,30,0.3,1 -142,Lightning Volley VI,Shoots three bolts of lightning toward the target. Each bolt does 34-69 points of electric damage to the first thing it hits.,275,-1,210,30,War Magic,0.4,0,16,30,0.2,1 -143,Flame Volley III,Shoots three bolts of flame toward the target. Each bolt does 15-31 points of fire damage to the first thing it hits.,125,-1,211,15,War Magic,0.15,0,16,15,0.5,1 -144,Flame Volley IV,Shoots three bolts of flame toward the target. Each bolt does 20-40 points of fire damage to the first thing it hits.,175,-1,211,20,War Magic,0.2,0,16,15,0.4,1 -145,Flame Volley V,Shoots three bolts of flame toward the target. Each bolt does 26-52 points of fire damage to the first thing it hits.,225,-1,211,25,War Magic,0.3,0,16,15,0.3,1 -146,Flame Volley VI,Shoots three bolts of flame toward the target. Each bolt does 34-69 points of fire damage to the first thing it hits.,275,-1,211,30,War Magic,0.4,0,16,15,0.2,1 -147,Force Volley III,Shoots three bolts of force toward the target. Each bolt does 15-31 points of piercing damage to the first thing it hits.,125,-1,212,15,War Magic,0.15,0,16,30,0.5,1 -148,Force Volley IV,Shoots three bolts of force toward the target. Each bolt does 20-40 points of piercing damage to the first thing it hits.,175,-1,212,20,War Magic,0.2,0,16,30,0.4,1 -149,Force Volley V,Shoots three bolts of force toward the target. Each bolt does 26-52 points of piercing damage to the first thing it hits.,225,-1,212,25,War Magic,0.3,0,16,30,0.3,1 -150,Force Volley VI,Shoots three bolts of force toward the target. Each bolt does 34-69 points of piercing damage to the first thing it hits.,275,-1,212,30,War Magic,0.4,0,16,30,0.4,1 -151,Blade Volley III,Shoots three whirling blades toward the target. Each blade does 15-31 points of Slashing damage to the first thing it hits.,125,-1,213,15,War Magic,0.15,0,16,30,0.5,1 -152,Blade Volley IV,Shoots three whirling blades toward the target. Each blade does 20-40 points of Slashing damage to the first thing it hits.,175,-1,213,20,War Magic,0.2,0,16,30,0.4,1 -153,Blade Volley V,Shoots three whirling blades toward the target. Each blade does 26-52 points of Slashing damage to the first thing it hits.,225,-1,213,25,War Magic,0.3,0,16,30,0.3,1 -154,Blade Volley VI,Shoots three whirling blades toward the target. Each blade does 34-69 points of Slashing damage to the first thing it hits.,275,-1,213,30,War Magic,0.4,0,16,30,0.2,1 -157,Summon Primary Portal I,Summons a portal that goes to the destination of the caster's linked portal. set with Primary Portal Tie.,200,60,203,70,Item Enchantment,0.5,0,65536,0,0,1 -158,Summon Primary Portal II,Summons a portal that goes to the destination of the caster's linked portal. set with Primary Portal Tie.,225,180,203,90,Item Enchantment,0.5,0,65536,0,0,1 -159,Regeneration Other I,Increase target's natural healing rate by 10%.,1,1800,93,10,Life Magic,0.01,37,16,5,1,1 -160,Regeneration Other II,Increase target's natural healing rate by 25%.,50,1800,93,20,Life Magic,0.05,37,16,5,0.85,1 -161,Regeneration Other III,Increase target's natural healing rate by 40%.,100,1800,93,30,Life Magic,0.1,37,16,5,0.7,1 -162,Regeneration Other IV,Increase target's natural healing rate by 55%.,150,1800,93,40,Life Magic,0.15,37,16,5,0.55,1 -163,Regeneration Other V,Increase target's natural healing rate by 70%.,200,1800,93,50,Life Magic,0.2,37,16,5,0.4,1 -164,Regeneration Other VI,Increase target's natural healing rate by 85%.,250,2700,93,60,Life Magic,0.3,37,16,5,0.25,1 -165,Regeneration Self I,Increase caster's natural healing rate by 10%.,1,1800,93,20,Life Magic,0.01,37,16,5,0,1 -166,Regeneration Self II,Increase caster's natural healing rate by 25%.,50,1800,93,30,Life Magic,0.05,37,16,5,0.85,1 -167,Regeneration Self III,Increase caster's natural healing rate by 40%.,100,1800,93,40,Life Magic,0.1,37,16,5,1,1 -168,Regeneration Self IV,Increase caster's natural healing rate by 55%.,150,1800,93,50,Life Magic,0.15,37,16,5,1,1 -169,Regeneration Self V,Increase caster's natural healing rate by 70%.,200,1800,93,60,Life Magic,0.2,37,16,5,1,1 -170,Regeneration Self VI,Increase caster's natural healing rate by 85%.,250,2700,93,70,Life Magic,0.3,37,16,5,1,1 -171,Fester Other I,Decrease target's natural healing rate by 9%.,25,60,94,10,Life Magic,0.01,38,16,5,1,0 -172,Fester Other II,Decrease target's natural healing rate by 20%.,75,90,94,20,Life Magic,0.05,38,16,5,0.85,0 -173,Fester Other III,Decrease target's natural healing rate by 29%.,125,120,94,30,Life Magic,0.1,38,16,5,0.7,0 -174,Fester Other IV,Decrease target's natural healing rate by 35%.,175,150,94,40,Life Magic,0.15,38,16,5,0.55,0 -175,Fester Other V,Decrease target's natural healing rate by 41%.,225,180,94,50,Life Magic,0.2,38,16,5,0.4,0 -176,Fester Other VI,Decrease target's natural healing rate by 46%.,275,210,94,60,Life Magic,0.3,38,16,5,0.25,0 -178,Fester Self I,Decrease caster's natural healing rate by 9%.,25,60,94,20,Life Magic,0.01,38,16,5,0,0 -179,Fester Self II,Decrease caster's natural healing rate by 20%.,75,90,94,30,Life Magic,0.05,38,16,5,0.85,0 -180,Fester Self III,Decrease caster's natural healing rate by 29%.,125,120,94,40,Life Magic,0.1,38,16,5,1,0 -181,Fester Self IV,Decrease caster's natural healing rate by 35%.,175,150,94,50,Life Magic,0.15,38,16,5,1,0 -182,Fester Self V,Decrease caster's natural healing rate by 41%.,225,180,94,60,Life Magic,0.2,38,16,5,1,0 -183,Fester Self VI,Decrease caster's natural healing rate by 46%.,275,210,94,70,Life Magic,0.3,38,16,5,1,0 -184,Rejuvenation Other II,Increases the rate at which the target regains Stamina by 25%.,50,1800,95,20,Life Magic,0.05,41,16,5,0.85,1 -185,Rejuvenation Other III,Increases the rate at which the target regains Stamina by 40%.,100,1800,95,30,Life Magic,0.1,41,16,5,0.7,1 -186,Rejuvenation Other IV,Increases the rate at which the target regains Stamina by 55%.,150,1800,95,40,Life Magic,0.15,41,16,5,0.55,1 -187,Rejuvenation Other V,Increases the rate at which the target regains Stamina by 70%.,200,1800,95,50,Life Magic,0.2,41,16,5,0.4,1 -188,Rejuvenation Other VI,Increases the rate at which the target regains Stamina by 85%.,250,2700,95,60,Life Magic,0.3,41,16,5,0.25,1 -189,Rejuvenation Self II,Increases the rate at which the caster regains Stamina by 25%.,50,1800,95,30,Life Magic,0.05,41,16,0,0,1 -190,Rejuvenation Self III,Increases the rate at which the caster regains Stamina by 40%.,100,1800,95,40,Life Magic,0.1,41,16,0,0,1 -191,Rejuvenation Self IV,Increases the rate at which the caster regains Stamina by 55%.,150,1800,95,50,Life Magic,0.15,41,16,0,0,1 -192,Rejuvenation Self V,Increases the rate at which the caster regains Stamina by 70%.,200,1800,95,60,Life Magic,0.2,41,16,0,0,1 -193,Rejuvenation Self VI,Increases the rate at which the caster regains Stamina by 85%.,250,2700,95,70,Life Magic,0.3,41,16,0,0,1 -194,Exhaustion Other I,Decreases the rate at which the target regains Stamina by 9%.,25,60,96,10,Life Magic,0.01,42,16,5,1,0 -195,Exhaustion Other II,Decreases the rate at which the target regains Stamina by 20%.,75,90,96,20,Life Magic,0.05,42,16,5,0.85,0 -196,Exhaustion Other III,Decreases the rate at which the target regains Stamina by 29%.,125,120,96,30,Life Magic,0.1,42,16,5,0.7,0 -197,Exhaustion Other IV,Decreases the rate at which the target regains Stamina by 35%.,175,150,96,40,Life Magic,0.15,42,16,5,0.55,0 -198,Exhaustion Other V,Decreases the rate at which the target regains Stamina by 41%.,225,180,96,50,Life Magic,0.2,42,16,5,0.4,0 -199,Exhaustion Other VI,Decreases the rate at which the target regains Stamina by 46%.,275,210,96,60,Life Magic,0.3,42,16,5,0.25,0 -200,Exhaustion Self I,Decreases the rate at which the caster regains Stamina by 9%.,25,60,96,20,Life Magic,0.01,42,16,0,0,0 -201,Exhaustion Self II,Decreases the rate at which the caster regains Stamina by 20%.,75,90,96,30,Life Magic,0.05,42,16,0,0,0 -202,Exhaustion Self III,Decreases the rate at which the caster regains Stamina by 29%.,125,120,96,40,Life Magic,0.1,42,16,0,0,0 -203,Exhaustion Self IV,Decreases the rate at which the caster regains Stamina by 35%.,175,150,96,50,Life Magic,0.15,42,16,0,0,0 -204,Exhaustion Self V,Decreases the rate at which the caster regains Stamina by 41%.,225,180,96,60,Life Magic,0.2,42,16,0,0,0 -205,Exhaustion Self VI,Decreases the rate at which the caster regains Stamina by 46%.,275,210,96,70,Life Magic,0.3,42,16,0,0,0 -206,Mana Renewal Other I,Increases the target's natural mana rate by 10%.,1,1800,97,10,Life Magic,0.01,39,16,5,1,1 -207,Mana Renewal Other II,Increases the target's natural mana rate by 25%.,50,1800,97,20,Life Magic,0.05,39,16,5,0.85,1 -208,Mana Renewal Other III,Increases the target's natural mana rate by 40%.,100,1800,97,30,Life Magic,0.1,39,16,5,0.7,1 -209,Mana Renewal Other IV,Increases the target's natural mana rate by 55%.,150,1800,97,40,Life Magic,0.15,39,16,5,0.55,1 -210,Mana Renewal Other V,Increases the target's natural mana rate by 70%.,200,1800,97,50,Life Magic,0.2,39,16,5,0.4,1 -211,Mana Renewal Other VI,Increases the target's natural mana rate by 85%.,250,2700,97,60,Life Magic,0.3,39,16,5,0.25,1 -212,Mana Renewal Self I,Increases the caster's natural mana rate by 10%.,25,1800,97,20,Life Magic,0.01,39,16,0,0,1 -213,Mana Renewal Self II,Increases the caster's natural mana rate by 25%.,50,1800,97,30,Life Magic,0.05,39,16,0,0,1 -214,Mana Renewal Self III,Increases the caster's natural mana rate by 40%.,100,1800,97,40,Life Magic,0.1,39,16,0,0,1 -215,Mana Renewal Self IV,Increases the caster's natural mana rate by 55%.,150,1800,97,50,Life Magic,0.15,39,16,0,0,1 -216,Mana Renewal Self V,Increases the caster's natural mana rate by 70%.,200,1800,97,60,Life Magic,0.2,39,16,0,0,1 -217,Mana Renewal Self VI,Increases the caster's natural mana rate by 85%.,250,2700,97,70,Life Magic,0.3,39,16,0,0,1 -218,Mana Depletion Other I,Decreases target's natural mana rate by 9%.,25,60,98,10,Life Magic,0.01,40,16,5,1,0 -219,Mana Depletion Other II,Decreases target's natural mana rate by 20%.,75,90,98,20,Life Magic,0.05,40,16,5,0.85,0 -220,Mana Depletion Other III,Decreases target's natural mana rate by 29%.,125,120,98,30,Life Magic,0.1,40,16,5,0.7,0 -221,Mana Depletion Other IV,Decreases target's natural mana rate by 35%.,175,150,98,40,Life Magic,0.15,40,16,5,0.55,0 -222,Mana Depletion Other V,Decreases target's natural mana rate by 41%.,225,180,98,50,Life Magic,0.2,40,16,5,0.4,0 -223,Mana Depletion Other VI,Decreases target's natural mana rate by 46%.,275,210,98,60,Life Magic,0.3,40,16,5,0.25,0 -224,Mana Depletion Self I,Decreases caster's natural mana rate by 9%.,25,60,98,20,Life Magic,0.01,40,16,0,0,0 -225,Mana Depletion Self II,Decreases caster's natural mana rate by 20%.,75,90,98,30,Life Magic,0.05,40,16,0,0,0 -226,Mana Depletion Self III,Decreases caster's natural mana rate by 29%.,125,120,98,40,Life Magic,0.1,40,16,0,0,0 -227,Mana Depletion Self IV,Decreases caster's natural mana rate by 35%.,175,150,98,50,Life Magic,0.15,40,16,0,0,0 -228,Mana Depletion Self V,Decreases caster's natural mana rate by 41%.,225,180,98,60,Life Magic,0.2,40,16,0,0,0 -229,Mana Depletion Self VI,Decreases caster's natural mana rate by 46%.,275,210,98,70,Life Magic,0.3,40,16,0,0,0 -230,Vulnerability Other II,Decrease the target's Melee Defense skill by 15 points.,75,90,38,20,Creature Enchantment,0.05,23,16,5,0.85,1 -231,Vulnerability Other III,Decrease the target's Melee Defense skill by 20 points.,125,120,38,30,Creature Enchantment,0.1,23,16,5,0.7,1 -232,Vulnerability Other IV,Decrease the target's Melee Defense skill by 25 points.,175,150,38,40,Creature Enchantment,0.15,23,16,5,0.55,1 -233,Vulnerability Other V,Decrease the target's Melee Defense skill by 30 points.,225,180,38,50,Creature Enchantment,0.2,23,16,5,0.4,1 -234,Vulnerability Other VI,Decrease the target's Melee Defense skill by 35 points.,275,210,38,60,Creature Enchantment,0.3,23,16,5,0.25,1 -235,Vulnerability Self II,Decrease the target's Melee Defense skill by 15 points.,75,90,38,30,Creature Enchantment,0.05,23,16,0,0,1 -236,Vulnerability Self III,Decrease the target's Melee Defense skill by 20 points.,125,120,38,40,Creature Enchantment,0.1,23,16,0,0,1 -237,Vulnerability Self IV,Decrease the target's Melee Defense skill by 25 points.,175,150,38,50,Creature Enchantment,0.15,23,16,0,0,1 -238,Vulnerability Self V,Decrease the target's Melee Defense skill by 30 points.,225,180,38,60,Creature Enchantment,0.2,23,16,0,0,1 -239,Vulnerability Self VI,Decrease the target's Melee Defense skill by 35 points.,275,210,38,70,Creature Enchantment,0.3,23,16,0,0,1 -240,Invulnerability Other II,Increases the target's Melee Defense skill by 15 points.,50,1800,37,20,Creature Enchantment,0.05,22,16,5,0.85,1 -241,Invulnerability Other III,Increases the target's Melee Defense skill by 20 points.,100,1800,37,30,Creature Enchantment,0.1,22,16,5,0.7,1 -242,Invulnerability Other IV,Increases the target's Melee Defense skill by 25 points.,150,1800,37,40,Creature Enchantment,0.15,22,16,5,0.55,1 -243,Invulnerability Other V,Increases the target's Melee Defense skill by 30 points.,200,1800,37,50,Creature Enchantment,0.2,22,16,5,0.4,1 -244,Invulnerability Other VI,Increases the target's Melee Defense skill by 35 points.,250,2700,37,60,Creature Enchantment,0.3,22,16,5,0.25,1 -245,Invulnerability Self II,Increases the caster's Melee Defense skill by 15 points.,50,1800,37,30,Creature Enchantment,0.05,22,16,0,0,1 -246,Invulnerability Self III,Increases the caster's Melee Defense skill by 20 points.,100,1800,37,40,Creature Enchantment,0.1,22,16,0,0,1 -247,Invulnerability Self IV,Increases the caster's Melee Defense skill by 25 points.,150,1800,37,50,Creature Enchantment,0.15,22,16,0,0,1 -248,Invulnerability Self V,Increases the caster's Melee Defense skill by 30 points.,200,1800,37,60,Creature Enchantment,0.2,22,16,0,0,1 -249,Invulnerability Self VI,Increases the caster's Melee Defense skill by 35 points.,250,2700,37,70,Creature Enchantment,0.3,22,16,0,0,1 -250,Impregnability Other I,Increases the target's Missile Defense skill by 10 points.,1,1800,39,10,Creature Enchantment,0.01,22,16,5,1,1 -251,Impregnability Other II,Increases the target's Missile Defense skill by 15 points.,50,1800,39,20,Creature Enchantment,0.05,22,16,5,0.85,1 -252,Impregnability Other III,Increases the target's Missile Defense skill by 20 points.,100,1800,39,30,Creature Enchantment,0.1,22,16,5,0.7,1 -253,Impregnability Other IV,Increases the target's Missile Defense skill by 25 points.,150,1800,39,40,Creature Enchantment,0.15,22,16,5,0.55,1 -254,Impregnability Other V,Increases the target's Missile Defense skill by 30 points.,200,1800,39,50,Creature Enchantment,0.2,22,16,5,0.4,1 -255,Impregnability Other VI,Increases the target's Missile Defense skill by 35 points.,250,2700,39,60,Creature Enchantment,0.3,22,16,5,0.25,1 -256,Impregnability Self I,Increases the caster's Missile Defense skill by 10 points.,1,1800,39,15,Creature Enchantment,0.01,22,16,0,0,1 -257,Impregnability Self II,Increases the caster's Missile Defense skill by 15 points.,50,1800,39,30,Creature Enchantment,0.05,22,16,0,0,1 -258,Impregnability Self III,Increases the caster's Missile Defense skill by 20 points.,100,1800,39,40,Creature Enchantment,0.1,22,16,0,0,1 -259,Impregnability Self IV,Increases the caster's Missile Defense skill by 25 points.,150,1800,39,50,Creature Enchantment,0.15,22,16,0,0,1 -260,Impregnability Self V,Increases the caster's Missile Defense skill by 30 points.,200,1800,39,60,Creature Enchantment,0.2,22,16,0,0,1 -261,Impregnability Self VI,Increases the caster's Missile Defense skill by 35 points.,250,2700,39,70,Creature Enchantment,0.3,22,16,0,0,1 -262,Defenselessness Other I,Decreases the target's Missile Defense skill by 10 points.,1,60,40,10,Creature Enchantment,0.01,23,16,5,1,1 -263,Defenselessness Other II,Decreases the target's Missile Defense skill by 15 points.,75,90,40,20,Creature Enchantment,0.05,23,16,5,0.85,1 -264,Defenselessness Other III,Decreases the target's Missile Defense skill by 20 points.,125,120,40,30,Creature Enchantment,0.1,23,16,5,0.7,1 -265,Defenselessness Other IV,Decreases the target's Missile Defense skill by 25 points.,175,150,40,40,Creature Enchantment,0.15,23,16,5,0.55,1 -266,Defenselessness Other V,Decreases the target's Missile Defense skill by 30 points.,225,180,40,50,Creature Enchantment,0.2,23,16,5,0.4,1 -267,Defenselessness Other VI,Decreases the target's Missile Defense skill by 35 points.,275,210,40,60,Creature Enchantment,0.3,23,16,5,0.25,1 -268,Magic Resistance Other I,Increases the target's Magic Defense skill by 10 points.,1,1800,41,10,Creature Enchantment,0.01,22,16,5,1,1 -269,Magic Resistance Other II,Increases the target's Magic Defense skill by 15 points.,50,1800,41,20,Creature Enchantment,0.05,22,16,5,0.85,1 -270,Magic Resistance Other III,Increases the target's Magic Defense skill by 20 points.,100,1800,41,30,Creature Enchantment,0.1,22,16,5,0.7,1 -271,Magic Resistance Other IV,Increases the target's Magic Defense skill by 25 points.,150,1800,41,40,Creature Enchantment,0.15,22,16,5,0.55,1 -272,Magic Resistance Other V,Increases the target's Magic Defense skill by 30 points.,200,1800,41,50,Creature Enchantment,0.2,22,16,5,0.5,1 -273,Magic Resistance Other VI,Increases the target's Magic Defense skill by 35 points.,250,2700,41,60,Creature Enchantment,0.3,22,16,5,0.25,1 -274,Magic Resistance Self I,Increases the caster's Magic Defense skill by 10 points.,1,1800,41,15,Creature Enchantment,0.01,22,16,0,0,1 -275,Magic Resistance Self II,Increases the caster's Magic Defense skill by 15 points.,50,1800,41,30,Creature Enchantment,0.05,22,16,0,0,1 -276,Magic Resistance Self III,Increases the caster's Magic Defense skill by 20 points.,100,1800,41,40,Creature Enchantment,0.1,22,16,0,0,1 -277,Magic Resistance Self IV,Increases the caster's Magic Defense skill by 25 points.,150,1800,41,50,Creature Enchantment,0.15,22,16,0,0,1 -278,Magic Resistance Self V,Increases the caster's Magic Defense skill by 30 points.,200,1800,41,60,Creature Enchantment,0.2,22,16,0,0,1 -279,Magic Resistance Self VI,Increases the caster's Magic Defense skill by 35 points.,250,2700,41,70,Creature Enchantment,0.3,22,16,0,0,1 -280,Magic Yield Other I,Decreases the target's Magic Defense skill by 10 points.,1,60,42,10,Creature Enchantment,0.01,23,16,5,1,1 -281,Magic Yield Other II,Decreases the target's Magic Defense skill by 15 points.,75,90,42,20,Creature Enchantment,0.05,23,16,5,0.85,1 -282,Magic Yield Other III,Decreases the target's Magic Defense skill by 20 points.,125,120,42,30,Creature Enchantment,0.1,23,16,5,0.7,1 -283,Magic Yield Other IV,Decreases the target's Magic Defense skill by 25 points.,175,150,42,40,Creature Enchantment,0.15,23,16,5,0.55,1 -284,Magic Yield Other V,Decreases the target's Magic Defense skill by 30 points.,225,180,42,50,Creature Enchantment,0.2,23,16,5,0.4,1 -285,Magic Yield Other VI,Decreases the target's Magic Defense skill by 35 points.,275,210,42,60,Creature Enchantment,0.3,23,16,5,0.25,1 -286,Magic Yield Self I,Decreases the caster's Magic Defense skill by 10 points.,1,60,42,15,Creature Enchantment,0.01,23,16,0,0,1 -287,Magic Yield Self II,Decreases the caster's Magic Defense skill by 15 points.,75,90,42,30,Creature Enchantment,0.05,23,16,0,0,1 -288,Magic Yield Self III,Decreases the caster's Magic Defense skill by 20 points.,125,120,42,40,Creature Enchantment,0.1,23,16,0,0,1 -289,Magic Yield Self IV,Decreases the caster's Magic Defense skill by 25 points.,175,150,42,50,Creature Enchantment,0.15,23,16,0,0,1 -290,Magic Yield Self V,Decreases the caster's Magic Defense skill by 30 points.,225,180,42,60,Creature Enchantment,0.2,23,16,0,0,1 -291,Magic Yield Self VI,Decreases the caster's Magic Defense skill by 35 points.,275,210,42,70,Creature Enchantment,0.3,23,16,0,0,1 -292,Light Weapon Mastery Other I,Increases the target's Light Weapons skill by 10 points.,1,1800,17,10,Creature Enchantment,0.01,18,16,5,1,1 -293,Light Weapon Mastery Other II,Increases the target's Light Weapons skill by 15 points.,50,1800,17,20,Creature Enchantment,0.05,18,16,5,0.85,1 -294,Light Weapon Mastery Other III,Increases the target's Light Weapons skill by 20 points.,100,1800,17,30,Creature Enchantment,0.1,18,16,5,0.7,1 -295,Light Weapon Mastery Other IV,Increases the target's Light Weapons skill by 25 points.,150,1800,17,40,Creature Enchantment,0.15,18,16,5,0.55,1 -296,Light Weapon Mastery Other V,Increases the target's Light Weapons skill by 30 points.,200,1800,17,50,Creature Enchantment,0.2,18,16,5,0.4,1 -297,Light Weapon Mastery Other VI,Increases the target's Light Weapons skill by 35 points.,250,2700,17,60,Creature Enchantment,0.3,18,16,5,0.25,1 -298,Light Weapon Mastery Self I,Increases the caster's Light Weapons skill by 10 points.,1,1800,17,15,Creature Enchantment,0.01,18,16,0,0,1 -299,Light Weapon Mastery Self II,Increases the caster's Light Weapons skill by 15 points.,50,1800,17,30,Creature Enchantment,0.05,18,16,0,0,1 -300,Light Weapon Mastery Self III,Increases the caster's Light Weapons skill by 20 points.,100,1800,17,40,Creature Enchantment,0.1,18,16,0,0,1 -301,Light Weapon Mastery Self IV,Increases the caster's Light Weapons skill by 25 points.,150,1800,17,50,Creature Enchantment,0.15,18,16,0,0,1 -302,Light Weapon Mastery Self V,Increases the caster's Light Weapons skill by 30 points.,200,1800,17,60,Creature Enchantment,0.2,18,16,0,0,1 -303,Light Weapon Mastery Self VI,Increases the caster's Light Weapons skill by 35 points.,250,2700,17,70,Creature Enchantment,0.3,18,16,0,0,1 -304,Light Weapon Ineptitude Other I,Decreases the target's Light Weapons skill by 10 points.,1,60,18,10,Creature Enchantment,0.01,19,16,0,1,1 -305,Light Weapon Ineptitude Other II,Decreases the target's Light Weapons skill by 15 points.,75,90,18,20,Creature Enchantment,0.05,19,16,5,0.85,1 -306,Light Weapon Ineptitude Other III,Decreases the target's Light Weapons skill by 20 points.,125,120,18,30,Creature Enchantment,0.1,19,16,5,0.7,1 -307,Light Weapon Ineptitude Other IV,Decreases the target's Light Weapons skill by 25 points.,175,150,18,40,Creature Enchantment,0.15,19,16,5,0.55,1 -308,Light Weapon Ineptitude Other V,Decreases the target's Light Weapons skill by 30 points.,225,180,18,50,Creature Enchantment,0.2,19,16,5,0.4,1 -309,Light Weapon Ineptitude Other VI,Decreases the target's Light Weapons skill by 35 points.,275,210,18,60,Creature Enchantment,0.3,19,16,5,0.25,1 -310,Light Weapon Ineptitude Self I,Decreases the caster's Light Weapons skill by 10 points.,1,60,18,15,Creature Enchantment,0.01,19,16,0,0,1 -311,Light Weapon Ineptitude Self II,Decreases the caster's Light Weapons skill by 15 points.,75,90,18,30,Creature Enchantment,0.05,19,16,0,0,1 -312,Light Weapon Ineptitude Self III,Decreases the caster's Light Weapons skill by 20 points.,125,120,18,40,Creature Enchantment,0.1,19,16,0,0,1 -313,Light Weapon Ineptitude Self IV,Decreases the caster's Light Weapons skill by 25 points.,175,150,18,50,Creature Enchantment,0.15,19,16,0,0,1 -314,Light Weapon Ineptitude Self V,Decreases the caster's Light Weapons skill by 30 points.,225,180,18,60,Creature Enchantment,0.2,19,16,0,0,1 -315,Light Weapon Ineptitude Self VI,Decreases the caster's Light Weapons skill by 35 points.,275,210,18,70,Creature Enchantment,0.3,19,16,0,0,1 -316,Finesse Weapon Mastery Other I,Increases the target's Finesse Weapons skill by 10 points.,1,1800,23,10,Creature Enchantment,0.01,18,16,0,1,1 -317,Finesse Weapon Mastery Other II,Increases the target's Finesse Weapons skill by 15 points.,50,1800,23,20,Creature Enchantment,0.05,18,16,0,0.85,1 -318,Finesse Weapon Mastery Other III,Increases the target's Finesse Weapons skill by 20 points.,100,1800,23,30,Creature Enchantment,0.1,18,16,5,0.7,1 -319,Finesse Weapon Mastery Other IV,Increases the target's Finesse Weapons skill by 25 points.,150,1800,23,40,Creature Enchantment,0.15,18,16,5,0.55,1 -320,Finesse Weapon Mastery Other V,Increases the target's Finesse Weapons skill by 30 points.,200,1800,23,50,Creature Enchantment,0.2,18,16,5,0.4,1 -321,Finesse Weapon Mastery Other VI,Increases the target's Finesse Weapons skill by 35 points.,250,2700,23,60,Creature Enchantment,0.3,18,16,5,0.25,1 -322,Finesse Weapon Mastery Self I,Increases the caster's Finesse Weapons skill by 10 points.,1,1800,23,15,Creature Enchantment,0.01,18,16,0,0,1 -323,Finesse Weapon Mastery Self II,Increases the caster's Finesse Weapons skill by 15 points.,50,1800,23,30,Creature Enchantment,0.05,18,16,0,0,1 -324,Finesse Weapon Mastery Self III,Increases the caster's Finesse Weapons skill by 20 points.,100,1800,23,40,Creature Enchantment,0.1,18,16,0,0,1 -325,Finesse Weapon Mastery Self IV,Increases the caster's Finesse Weapons skill by 25 points.,150,1800,23,50,Creature Enchantment,0.15,18,16,0,0,1 -326,Finesse Weapon Mastery Self V,Increases the caster's Finesse Weapons skill by 30 points.,200,1800,23,60,Creature Enchantment,0.2,18,16,0,0,1 -327,Finesse Weapon Mastery Self VI,Increases the caster's Finesse Weapons skill by 35 points.,250,2700,23,70,Creature Enchantment,0.3,18,16,0,0,1 -328,Finesse Weapon Ineptitude Other I,Decreases the target's Finesse Weapons skill by 10 points.,1,60,24,10,Creature Enchantment,0.01,19,16,0,1,1 -329,Finesse Weapon Ineptitude Other II,Decreases the target's Finesse Weapons skill by 15 points.,75,90,24,20,Creature Enchantment,0.05,19,16,5,0.85,1 -330,Finesse Weapon Ineptitude Other III,Decreases the target's Finesse Weapons skill by 20 points.,125,120,24,30,Creature Enchantment,0.1,19,16,5,0.7,1 -331,Finesse Weapon Ineptitude Other IV,Decreases the target's Finesse Weapons skill by 25 points.,175,150,24,40,Creature Enchantment,0.15,19,16,5,0.55,1 -332,Finesse Weapon Ineptitude Other V,Decreases the target's Finesse Weapon skill by 30 points.,225,180,24,50,Creature Enchantment,0.2,19,16,5,0.4,1 -333,Finesse Weapon Ineptitude Other VI,Decreases the target's Finesse Weapons skill by 35 points.,275,210,24,60,Creature Enchantment,0.3,19,16,5,0.25,1 -334,Finesse Weapon Ineptitude Self I,Decreases the caster's Finesse Weapons skill by 10 points.,1,60,24,15,Creature Enchantment,0.01,19,16,0,0,1 -335,Finesse Weapon Ineptitude Self II,Decreases the caster's Finesse Weapons skill by 15 points.,75,90,24,30,Creature Enchantment,0.05,19,16,0,0,1 -336,Finesse Weapon Ineptitude Self III,Decreases the caster's Finesse Weapons skill by 20 points.,125,120,24,40,Creature Enchantment,0.1,19,16,0,0,1 -337,Finesse Weapon Ineptitude Self IV,Decreases the caster's Finesse Weapons skill by 25 points.,175,150,24,50,Creature Enchantment,0.15,19,16,0,0,1 -338,Finesse Weapon Ineptitude Self V,Decreases the caster's Finesse Weapons skill by 30 points.,225,180,24,60,Creature Enchantment,0.2,19,16,0,0,1 -339,Finesse Weapon Ineptitude Self VI,Decreases the caster's Finesse Weapons skill by 35 points.,275,210,24,70,Creature Enchantment,0.3,19,16,0,0,1 -340,Light Weapon Mastery Other I,Increases the target's Light Weapons skill by 10 points.,1,1800,17,10,Creature Enchantment,0.01,18,16,5,1,1 -341,Light Weapon Mastery Other II,Increases the target's Light Weapons skill by 15 points.,50,1800,17,20,Creature Enchantment,0.05,18,16,5,0.85,1 -342,Light Weapon Mastery Other III,Increases the target's Light Weapons skill by 20 points.,100,1800,17,30,Creature Enchantment,0.1,18,16,5,0.7,1 -343,Light Weapon Mastery Other IV,Increases the target's Light Weapons skill by 25 points.,150,1800,17,40,Creature Enchantment,0.15,18,16,5,0.55,1 -344,Light Weapon Mastery Other V,Increases the target's Light Weapons skill by 30 points.,200,1800,17,50,Creature Enchantment,0.2,18,16,5,0.4,1 -345,Light Weapon Mastery Other VI,Increases the target's Light Weapons skill by 35 points.,250,2700,17,60,Creature Enchantment,0.3,18,16,5,0.25,1 -346,Light Weapon Mastery Self I,Increases the caster's Light Weapons skill by 10 points.,1,1800,17,15,Creature Enchantment,0.01,18,16,0,0,1 -347,Light Weapon Mastery Self II,Increases the caster's Light Weapons skill by 15 points.,50,1800,17,30,Creature Enchantment,0.05,18,16,0,0,1 -348,Light Weapon Mastery Self III,Increases the caster's Light Weapons skill by 20 points.,100,1800,17,40,Creature Enchantment,0.1,18,16,0,0,1 -349,Light Weapon Mastery Self IV,Increases the caster's Light Weapons skill by 25 points.,150,1800,17,50,Creature Enchantment,0.15,18,16,0,0,1 -350,Light Weapon Mastery Self V,Increases the caster's Light Weapons skill by 30 points.,200,1800,17,60,Creature Enchantment,0.2,18,16,0,0,1 -351,Light Weapon Mastery Self VI,Increases the caster's Light Weapons skill by 35 points.,250,2700,17,70,Creature Enchantment,0.3,18,16,0,0,1 -352,Light Weapon Ineptitude Other I,Decreases the target's Light Weapons skill by 10 points.,1,60,18,10,Creature Enchantment,0.01,19,16,0,1,1 -353,Light Weapon Ineptitude Other II,Decreases the target's Light Weapons skill by 15 points.,75,90,18,20,Creature Enchantment,0.05,19,16,5,0.85,1 -354,Light Weapon Ineptitude Other III,Decreases the target's Light Weapons skill by 20 points.,125,120,18,30,Creature Enchantment,0.1,19,16,5,0.7,1 -355,Light Weapon Ineptitude Other IV,Decreases the target's Light Weapons skill by 25 points.,175,150,18,40,Creature Enchantment,0.15,19,16,5,0.55,1 -356,Light Weapon Ineptitude Other V,Decreases the target's Light Weapons skill by 30 points.,225,180,18,50,Creature Enchantment,0.2,19,16,5,0.4,1 -357,Light Weapon Ineptitude Other VI,Decreases the target's Light Weapons skill by 35 points.,275,210,18,60,Creature Enchantment,0.3,19,16,5,0.25,1 -358,Light Weapon Ineptitude Self I,Decreases the caster's Light Weapons skill by 10 points.,1,60,18,15,Creature Enchantment,0.01,19,16,0,0,1 -359,Light Weapon Ineptitude Self II,Decreases the caster's Light Weapons skill by 15 points.,75,90,18,30,Creature Enchantment,0.05,19,16,0,0,1 -360,Light Weapon Ineptitude Self III,Decreases the caster's Light Weapons skill by 20 points.,125,120,18,40,Creature Enchantment,0.1,19,16,0,0,1 -361,Light Weapon Ineptitude Self IV,Decreases the caster's Light Weapons skill by 25 points.,175,150,18,50,Creature Enchantment,0.15,19,16,0,0,1 -362,Light Weapon Ineptitude Self V,Decreases the caster's Light Weapons skill by 30 points.,225,180,18,60,Creature Enchantment,0.2,19,16,0,0,1 -363,Light Weapon Ineptitude Self VI,Decreases the caster's Light Weapons skill by 35 points.,275,210,18,70,Creature Enchantment,0.3,19,16,0,0,1 -364,Light Weapon Mastery Other I,Increases the target's Light Weapons skill by 10 points.,1,1800,17,10,Creature Enchantment,0.01,18,16,5,1,1 -365,Light Weapon Mastery Other II,Increases the target's Light Weapons skill by 15 points.,50,1800,17,20,Creature Enchantment,0.05,18,16,5,0.85,1 -366,Light Weapon Mastery Other III,Increases the target's Light Weapons skill by 20 points.,100,1800,17,30,Creature Enchantment,0.1,18,16,5,0.7,1 -367,Light Weapon Mastery Other IV,Increases the target's Light Weapons skill by 25 points.,150,1800,17,40,Creature Enchantment,0.15,18,16,5,0.55,1 -368,Light Weapon Mastery Other V,Increases the target's Light Weapons skill by 30 points.,200,1800,17,50,Creature Enchantment,0.2,18,16,5,0.4,1 -369,Light Weapon Mastery Other VI,Increases the target's Light Weapons skill by 35 points.,250,2700,17,60,Creature Enchantment,0.3,18,16,5,0.25,1 -370,Light Weapon Mastery Self I,Increases the caster's Light Weapons skill by 10 points.,1,1800,17,15,Creature Enchantment,0.01,18,16,0,0,1 -371,Light Weapon Mastery Self II,Increases the caster's Light Weapons skill by 15 points.,50,1800,17,30,Creature Enchantment,0.05,18,16,0,0,1 -372,Light Weapon Mastery Self III,Increases the caster's Light Weapons skill by 20 points.,100,1800,17,40,Creature Enchantment,0.1,18,16,0,0,1 -373,Light Weapon Mastery Self IV,Increases the caster's Light Weapons skill by 25 points.,150,1800,17,50,Creature Enchantment,0.15,18,16,0,0,1 -374,Light Weapon Mastery Self V,Increases the caster's Light Weapons skill by 30 points.,200,1800,17,60,Creature Enchantment,0.2,18,16,0,0,1 -375,Light Weapon Mastery Self VI,Increases the caster's Light Weapons skill by 35 points.,250,2700,17,70,Creature Enchantment,0.3,18,16,0,0,1 -376,Light Weapon Ineptitude Other I,Decreases the target's Light Weapons skill by 10 points.,1,60,18,10,Creature Enchantment,0.01,19,16,0,1,1 -377,Light Weapon Ineptitude Other II,Decreases the target's Light Weapons skill by 15 points.,75,90,18,20,Creature Enchantment,0.05,19,16,5,0.85,1 -378,Light Weapon Ineptitude Other III,Decreases the target's Light Weapons skill by 20 points.,125,120,18,30,Creature Enchantment,0.1,19,16,5,0.7,1 -379,Light Weapon Ineptitude Other IV,Decreases the target's Light Weapons skill by 25 points.,175,150,18,40,Creature Enchantment,0.15,19,16,5,0.55,1 -380,Light Weapon Ineptitude Other V,Decreases the target's Light Weapons skill by 30 points.,225,180,18,50,Creature Enchantment,0.2,19,16,5,0.4,1 -381,Light Weapon Ineptitude Other VI,Decreases the target's Light Weapons skill by 35 points.,275,210,18,60,Creature Enchantment,0.3,19,16,5,0.25,1 -382,Light Weapon Ineptitude Self I,Decreases the caster's Light Weapons skill by 10 points.,1,60,18,15,Creature Enchantment,0.01,19,16,0,0,1 -383,Light Weapon Ineptitude Self II,Decreases the caster's Light Weapons skill by 15 points.,75,90,18,30,Creature Enchantment,0.05,19,16,0,0,1 -384,Light Weapon Ineptitude Self III,Decreases the caster's Light Weapons skill by 20 points.,125,120,18,40,Creature Enchantment,0.1,19,16,0,0,1 -385,Light Weapon Ineptitude Self IV,Decreases the caster's Light Weapons skill by 25 points.,175,150,18,50,Creature Enchantment,0.15,19,16,0,0,1 -386,Light Weapon Ineptitude Self V,Decreases the caster's Light Weapons skill by 30 points.,225,180,18,60,Creature Enchantment,0.2,19,16,0,0,1 -387,Light Weapon Ineptitude Self VI,Decreases the caster's Light Weapons skill by 35 points.,275,210,18,70,Creature Enchantment,0.3,19,16,0,0,1 -388,Light Weapon Mastery Other I,Increases the target's Light Weapons skill by 10 points.,1,1800,17,10,Creature Enchantment,0.01,18,16,5,1,1 -389,Light Weapon Mastery Other II,Increases the target's Light Weapons skill by 15 points.,50,1800,17,20,Creature Enchantment,0.05,18,16,5,0.85,1 -390,Light Weapon Mastery Other III,Increases the target's Light Weapons skill by 20 points.,100,1800,17,30,Creature Enchantment,0.1,18,16,5,0.7,1 -391,Light Weapon Mastery Other IV,Increases the target's Light Weapons skill by 25 points.,150,1800,17,40,Creature Enchantment,0.15,18,16,5,0.55,1 -392,Light Weapon Mastery Other V,Increases the target's Light Weapons skill by 30 points.,200,1800,17,50,Creature Enchantment,0.2,18,16,5,0.4,1 -393,Light Weapon Mastery Other VI,Increases the target's Light Weapons skill by 35 points.,250,2700,17,60,Creature Enchantment,0.3,18,16,5,0.25,1 -394,Light Weapon Mastery Self I,Increases the caster's Light Weapons skill by 10 points.,1,1800,17,15,Creature Enchantment,0.01,18,16,0,0,1 -395,Light Weapon Mastery Self II,Increases the caster's Light Weapons skill by 15 points.,50,1800,17,30,Creature Enchantment,0.05,18,16,0,0,1 -396,Light Weapon Mastery Self III,Increases the caster's Light Weapons skill by 20 points.,100,1800,17,40,Creature Enchantment,0.1,18,16,0,0,1 -397,Light Weapon Mastery Self IV,Increases the caster's Light Weapons skill by 25 points.,150,1800,17,50,Creature Enchantment,0.15,18,16,0,0,1 -398,Light Weapon Mastery Self V,Increases the caster's Light Weapons skill by 30 points.,200,1800,17,60,Creature Enchantment,0.2,18,16,0,0,1 -399,Light Weapon Mastery Self VI,Increases the caster's Light Weapons skill by 35 points.,250,2700,17,70,Creature Enchantment,0.3,18,16,0,0,1 -400,Light Weapon Ineptitude Other I,Decreases the target's Light Weapons skill by 10 points.,1,60,18,10,Creature Enchantment,0.01,19,16,0,1,1 -401,Light Weapon Ineptitude Other II,Decreases the target's Light Weapons skill by 15 points.,75,90,18,20,Creature Enchantment,0.05,19,16,5,0.85,1 -402,Light Weapon Ineptitude Other III,Decreases the target's Light Weapons skill by 20 points.,125,120,18,30,Creature Enchantment,0.1,19,16,5,0.7,1 -403,Light Weapon Ineptitude Other IV,Decreases the target's Light Weapons skill by 25 points.,175,150,18,40,Creature Enchantment,0.15,19,16,5,0.55,1 -404,Light Weapon Ineptitude Other V,Decreases the target's Light Weapons skill by 30 points.,225,180,18,50,Creature Enchantment,0.2,19,16,5,0.4,1 -405,Light Weapon Ineptitude Other VI,Decreases the target's Light Weapons skill by 35 points.,275,210,18,60,Creature Enchantment,0.3,19,16,5,0.25,1 -406,Light Weapon Ineptitude Self I,Decreases the caster's Light Weapons skill by 10 points.,1,60,18,15,Creature Enchantment,0.01,19,16,0,0,1 -407,Light Weapon Ineptitude Self II,Decreases the caster's Light Weapons skill by 15 points.,75,90,18,30,Creature Enchantment,0.05,19,16,0,0,1 -408,Light Weapon Ineptitude Self III,Decreases the caster's Light Weapons skill by 20 points.,125,120,18,40,Creature Enchantment,0.1,19,16,0,0,1 -409,Light Weapon Ineptitude Self IV,Decreases the caster's Light Weapons skill by 25 points.,175,150,18,50,Creature Enchantment,0.15,19,16,0,0,1 -410,Light Weapon Ineptitude Self V,Decreases the caster's Light Weapons skill by 30 points.,225,180,18,60,Creature Enchantment,0.2,19,16,0,0,1 -411,Light Weapon Ineptitude Self VI,Decreases the caster's Light Weapons skill by 35 points.,275,210,18,70,Creature Enchantment,0.3,19,16,0,0,1 -412,Heavy Weapon Mastery Other I,Increases the target's Heavy Weapons skill by 10 points.,1,1800,31,10,Creature Enchantment,0.01,18,16,0,1,1 -413,Heavy Weapon Mastery Other II,Increases the target's Heavy Weapons skill by 15 points.,50,1800,31,20,Creature Enchantment,0.05,18,16,5,0.85,1 -414,Heavy Weapon Mastery Other III,Increases the target's Heavy Weapons skill by 20 points.,100,1800,31,30,Creature Enchantment,0.1,18,16,5,0.7,1 -415,Heavy Weapon Mastery Other IV,Increases the target's Heavy Weapons skill by 25 points.,150,1800,31,40,Creature Enchantment,0.15,18,16,5,0.55,1 -416,Heavy Weapon Mastery Other V,Increases the target's Heavy Weapons skill by 30 points.,200,1800,31,50,Creature Enchantment,0.2,18,16,5,0.4,1 -417,Heavy Weapon Mastery Other VI,Increases the target's Heavy Weapons skill by 35 points.,250,2700,31,60,Creature Enchantment,0.3,18,16,5,0.25,1 -418,Heavy Weapon Mastery Self I,Increases the caster's Heavy Weapons skill by 10 points.,1,1800,31,15,Creature Enchantment,0.01,18,16,0,0,1 -419,Heavy Weapon Mastery Self II,Increases the caster's Heavy Weapons skill by 15 points.,50,1800,31,30,Creature Enchantment,0.05,18,16,0,0,1 -420,Heavy Weapon Mastery Self III,Increases the caster's Heavy Weapons skill by 20 points.,100,1800,31,40,Creature Enchantment,0.1,18,16,0,0,1 -421,Heavy Weapon Mastery Self IV,Increases the caster's Heavy Weapons skill by 25 points.,150,1800,31,50,Creature Enchantment,0.15,18,16,0,0,1 -422,Heavy Weapon Mastery Self V,Increases the caster's Heavy Weapons skill by 30 points.,200,1800,31,60,Creature Enchantment,0.2,18,16,0,0,1 -423,Heavy Weapon Mastery Self VI,Increases the caster's Heavy Weapons skill by 35 points.,250,2700,31,70,Creature Enchantment,0.3,18,16,0,0,1 -424,Heavy Weapon Ineptitude Other I,Decreases the target's Heavy Weapons skill by 10 points.,1,60,32,10,Creature Enchantment,0.01,19,16,0,1,1 -425,Heavy Weapon Ineptitude Other II,Decreases the target's Heavy Weapons skill by 15 points.,75,90,32,20,Creature Enchantment,0.05,19,16,5,0.85,1 -426,Heavy Weapon Ineptitude Other III,Decreases the target's Heavy Weapons skill by 20 points.,125,120,32,30,Creature Enchantment,0.1,19,16,5,0.7,1 -427,Heavy Weapon Ineptitude Other IV,Decreases the target's Heavy Weapons skill by 25 points.,175,150,32,40,Creature Enchantment,0.15,19,16,5,0.55,1 -428,Heavy Weapon Ineptitude Other V,Decreases the target's Heavy Weapons skill by 30 points.,225,180,32,50,Creature Enchantment,0.2,19,16,5,0.4,1 -429,Heavy Weapon Ineptitude Other VI,Decreases the target's Heavy Weapons skill by 35 points.,275,210,32,60,Creature Enchantment,0.3,19,16,5,0.25,1 -430,Heavy Weapon Ineptitude Self I,Decreases the caster's Heavy Weapons skill by 10 points.,1,60,32,15,Creature Enchantment,0.01,19,16,0,0,1 -431,Heavy Weapon Ineptitude Self II,Decreases the caster's Heavy Weapons skill by 15 points.,75,90,32,30,Creature Enchantment,0.05,19,16,0,0,1 -432,Heavy Weapon Ineptitude Self III,Decreases the caster's Heavy Weapons skill by 20 points.,125,120,32,40,Creature Enchantment,0.1,19,16,0,0,1 -433,Heavy Weapon Ineptitude Self IV,Decreases the caster's Heavy Weapons skill by 25 points.,175,150,32,50,Creature Enchantment,0.15,19,16,0,0,1 -435,Heavy Weapon Ineptitude Self V,Decreases the caster's Heavy Weapons skill by 30 points.,225,180,32,60,Creature Enchantment,0.2,19,16,0,0,1 -436,Heavy Weapon Ineptitude Self VI,Decreases the caster's Heavy Weapons skill by 35 points.,275,210,32,70,Creature Enchantment,0.3,19,16,0,0,1 -437,Light Weapon Mastery Other I,Increases the target's Light Weapons skill by 10 points.,1,1800,17,10,Creature Enchantment,0.01,18,16,5,1,1 -438,Light Weapon Mastery Other II,Increases the target's Light Weapons skill by 15 points.,50,1800,17,20,Creature Enchantment,0.05,18,16,5,0.85,1 -439,Light Weapon Mastery Other III,Increases the target's Light Weapons skill by 20 points.,100,1800,17,30,Creature Enchantment,0.1,18,16,5,0.7,1 -440,Light Weapon Mastery Other IV,Increases the target's Light Weapons skill by 25 points.,150,1800,17,40,Creature Enchantment,0.15,18,16,5,0.55,1 -441,Light Weapon Mastery Other V,Increases the target's Light Weapons skill by 30 points.,200,1800,17,50,Creature Enchantment,0.2,18,16,5,0.4,1 -442,Light Weapon Mastery Other VI,Increases the target's Light Weapons skill by 35 points.,250,2700,17,60,Creature Enchantment,0.3,18,16,5,0.25,1 -443,Light Weapon Mastery Self I,Increases the caster's Light Weapons skill by 10 points.,1,1800,17,15,Creature Enchantment,0.01,18,16,0,0,1 -444,Light Weapon Mastery Self II,Increases the caster's Light Weapons skill by 15 points.,50,1800,17,30,Creature Enchantment,0.05,18,16,0,0,1 -445,Light Weapon Mastery Self III,Increases the caster's Light Weapons skill by 20 points.,100,1800,17,40,Creature Enchantment,0.1,18,16,0,0,1 -446,Light Weapon Mastery Self IV,Increases the caster's Light Weapons skill by 25 points.,150,1800,17,50,Creature Enchantment,0.15,18,16,0,0,1 -447,Light Weapon Mastery Self V,Increases the caster's Light Weapons skill by 30 points.,200,1800,17,60,Creature Enchantment,0.2,18,16,0,0,1 -448,Light Weapon Mastery Self VI,Increases the caster's Light Weapons skill by 35 points.,250,2700,17,70,Creature Enchantment,0.3,18,16,0,0,1 -449,Light Weapon Ineptitude Other I,Decreases the target's Light Weapons skill by 10 points.,1,60,18,10,Creature Enchantment,0.01,19,16,0,1,1 -450,Light Weapon Ineptitude Other II,Decreases the target's Light Weapons skill by 15 points.,75,90,18,20,Creature Enchantment,0.05,19,16,5,0.85,1 -451,Light Weapon Ineptitude Other III,Decreases the target's Light Weapons skill by 20 points.,125,120,18,30,Creature Enchantment,0.1,19,16,5,0.7,1 -452,Light Weapon Ineptitude Other IV,Decreases the target's Light Weapons skill by 25 points.,175,150,18,40,Creature Enchantment,0.15,19,16,5,0.55,1 -453,Light Weapon Ineptitude Other V,Decreases the target's Light Weapons skill by 30 points.,225,180,18,50,Creature Enchantment,0.2,19,16,5,0.4,1 -454,Light Weapon Ineptitude Other VI,Decreases the target's Light Weapons skill by 35 points.,275,210,18,60,Creature Enchantment,0.3,19,16,5,0.25,1 -455,Light Weapon Ineptitude Self I,Decreases the caster's Light Weapons skill by 10 points.,1,60,18,15,Creature Enchantment,0.01,19,16,0,0,1 -456,Light Weapon Ineptitude Self II,Decreases the caster's Light Weapons skill by 15 points.,75,90,18,30,Creature Enchantment,0.05,19,16,0,0,1 -457,Light Weapon Ineptitude Self III,Decreases the caster's Light Weapons skill by 20 points.,125,120,18,40,Creature Enchantment,0.1,19,16,0,0,1 -458,Light Weapon Ineptitude Self IV,Decreases the caster's Light Weapons skill by 25 points.,175,150,18,50,Creature Enchantment,0.15,19,16,0,0,1 -459,Light Weapon Ineptitude Self V,Decreases the caster's Light Weapons skill by 30 points.,225,180,18,60,Creature Enchantment,0.2,19,16,0,0,1 -460,Light Weapon Ineptitude Self VI,Decreases the caster's Light Weapons skill by 35 points.,275,210,18,70,Creature Enchantment,0.3,19,16,0,0,1 -461,Missile Weapon Mastery Other I,Increases the target's Missile Weapons skill by 10 points.,1,1800,19,10,Creature Enchantment,0.01,18,16,0,1,1 -462,Missile Weapon Mastery Other II,Increases the target's Missile Weapons skill by 15 points.,50,1800,19,20,Creature Enchantment,0.05,18,16,5,0.85,1 -463,Missile Weapon Mastery Other III,Increases the target's Missile Weapons skill by 20 points.,100,1800,19,30,Creature Enchantment,0.1,18,16,5,0.7,1 -464,Missile Weapon Mastery Other IV,Increases the target's Missile Weapons skill by 25 points.,150,1800,19,40,Creature Enchantment,0.15,18,16,5,0.55,1 -465,Missile Weapon Mastery Other V,Increases the target's Missile Weapons skill by 30 points.,200,1800,19,50,Creature Enchantment,0.2,18,16,0,1,1 -466,Missile Weapon Mastery Other VI,Increases the target's Missile Weapons skill by 35 points.,250,2700,19,60,Creature Enchantment,0.3,18,16,5,0.25,1 -467,Missile Weapon Mastery Self I,Increases the caster's Missile Weapons skill by 10 points.,1,1800,19,15,Creature Enchantment,0.01,18,16,0,0,1 -468,Missile Weapon Mastery Self II,Increases the caster's Missile Weapons skill by 15 points.,50,1800,19,30,Creature Enchantment,0.05,18,16,0,0,1 -469,Missile Weapon Mastery Self III,Increases the caster's Missile Weapons skill by 20 points.,100,1800,19,40,Creature Enchantment,0.1,18,16,0,0,1 -470,Missile Weapon Mastery Self IV,Increases the caster's Missile Weapons skill by 25 points.,150,1800,19,50,Creature Enchantment,0.15,18,16,0,0,1 -471,Missile Weapon Mastery Self V,Increases the caster's Missile Weapons skill by 30 points.,200,1800,19,60,Creature Enchantment,0.2,18,16,0,0,1 -472,Missile Weapon Mastery Self VI,Increases the caster's Missile Weapons skill by 35 points.,250,2700,19,70,Creature Enchantment,0.3,18,16,0,0,1 -473,Missile Weapon Ineptitude Other I,Decreases the target's Missile Weapons skill by 10 points.,1,60,20,10,Creature Enchantment,0.01,19,16,0,1,1 -474,Missile Weapon Ineptitude Other II,Decreases the target's Missile Weapons skill by 15 points.,75,90,20,20,Creature Enchantment,0.05,19,16,5,0.85,1 -475,Missile Weapon Ineptitude Other III,Decreases the target's Missile Weapons skill by 20 points.,125,120,20,30,Creature Enchantment,0.1,19,16,5,0.7,1 -476,Missile Weapon Ineptitude Other IV,Decreases the target's Missile Weapons skill by 25 points.,175,150,20,40,Creature Enchantment,0.15,19,16,5,0.55,1 -477,Missile Weapon Ineptitude Other V,Decreases the target's Missile Weapons skill by 30 points.,225,180,20,50,Creature Enchantment,0.2,19,16,5,0.4,1 -478,Missile Weapon Ineptitude Other VI,Decreases the target's Missile Weapons skill by 35 points.,275,210,20,60,Creature Enchantment,0.3,19,16,5,0.25,1 -479,Missile Weapon Ineptitude Self I,Decreases the caster's Missile Weapons skill by 10 points.,1,60,20,15,Creature Enchantment,0.01,19,16,0,0,1 -480,Missile Weapon Ineptitude Self II,Decreases the caster's Missile Weapons skill by 15 points.,75,90,20,30,Creature Enchantment,0.05,19,16,0,0,1 -481,Missile Weapon Ineptitude Self III,Decreases the caster's Missile Weapons skill by 20 points.,125,120,20,40,Creature Enchantment,0.1,19,16,0,0,1 -482,Missile Weapon Ineptitude Self IV,Decreases the caster's Missile Weapons skill by 25 points.,175,150,20,50,Creature Enchantment,0.15,19,16,0,0,1 -483,Missile Weapon Ineptitude Self V,Decreases the caster's Missile Weapons skill by 30 points.,225,180,20,60,Creature Enchantment,0.2,19,16,0,0,1 -484,Missile Weapon Ineptitude Self VI,Decreases the caster's Missile Weapons skill by 35 points.,275,210,20,70,Creature Enchantment,0.3,19,16,0,0,1 -485,Missile Weapon Mastery Other I,Increases the target's Missile Weapons skill by 10 points.,1,1800,19,10,Creature Enchantment,0.01,18,16,0,1,1 -486,Missile Weapon Mastery Other II,Increases the target's Missile Weapons skill by 15 points.,50,1800,19,20,Creature Enchantment,0.05,18,16,5,0.85,1 -487,Missile Weapon Mastery Other III,Increases the target's Missile Weapons skill by 20 points.,100,1800,19,30,Creature Enchantment,0.1,18,16,5,0.7,1 -488,Missile Weapon Mastery Other IV,Increases the target's Missile Weapons skill by 25 points.,150,1800,19,40,Creature Enchantment,0.15,18,16,5,0.55,1 -489,Missile Weapon Mastery Other V,Increases the target's Missile Weapons skill by 30 points.,200,1800,19,50,Creature Enchantment,0.2,18,16,0,1,1 -490,Missile Weapon Mastery Other VI,Increases the target's Missile Weapons skill by 35 points.,250,2700,19,60,Creature Enchantment,0.3,18,16,5,0.25,1 -491,Missile Weapon Mastery Self I,Increases the caster's Missile Weapons skill by 10 points.,1,1800,19,15,Creature Enchantment,0.01,18,16,0,0,1 -492,Missile Weapon Mastery Self II,Increases the caster's Missile Weapons skill by 15 points.,50,1800,19,30,Creature Enchantment,0.05,18,16,0,0,1 -493,Missile Weapon Mastery Self III,Increases the caster's Missile Weapons skill by 20 points.,100,1800,19,40,Creature Enchantment,0.1,18,16,0,0,1 -494,Missile Weapon Mastery Self IV,Increases the caster's Missile Weapons skill by 25 points.,150,1800,19,50,Creature Enchantment,0.15,18,16,0,0,1 -495,Missile Weapon Mastery Self V,Increases the caster's Missile Weapons skill by 30 points.,200,1800,19,60,Creature Enchantment,0.2,18,16,0,0,1 -496,Missile Weapon Mastery Self VI,Increases the caster's Missile Weapons skill by 35 points.,250,2700,19,70,Creature Enchantment,0.3,18,16,0,0,1 -497,Missile Weapon Ineptitude Other I,Decreases the target's Missile Weapons skill by 10 points.,1,60,20,10,Creature Enchantment,0.01,19,16,0,1,1 -498,Missile Weapon Ineptitude Other II,Decreases the target's Missile Weapons skill by 15 points.,75,90,20,20,Creature Enchantment,0.05,19,16,5,0.85,1 -499,Missile Weapon Ineptitude Other III,Decreases the target's Missile Weapons skill by 20 points.,125,120,20,30,Creature Enchantment,0.1,19,16,5,0.7,1 -500,Missile Weapon Ineptitude Other IV,Decreases the target's Missile Weapons skill by 25 points.,175,150,20,40,Creature Enchantment,0.15,19,16,5,0.55,1 -501,Missile Weapon Ineptitude Other V,Decreases the target's Missile Weapons skill by 30 points.,225,180,20,50,Creature Enchantment,0.2,19,16,5,0.4,1 -502,Missile Weapon Ineptitude Other VI,Decreases the target's Missile Weapons skill by 35 points.,275,210,20,60,Creature Enchantment,0.3,19,16,5,0.25,1 -503,Missile Weapon Ineptitude Self I,Decreases the caster's Missile Weapons skill by 10 points.,1,60,20,15,Creature Enchantment,0.01,19,16,0,0,1 -504,Missile Weapon Ineptitude Self II,Decreases the caster's Missile Weapons skill by 15 points.,75,90,20,30,Creature Enchantment,0.05,19,16,0,0,1 -505,Missile Weapon Ineptitude Self III,Decreases the caster's Missile Weapons skill by 20 points.,125,120,20,40,Creature Enchantment,0.1,19,16,0,0,1 -506,Missile Weapon Ineptitude Self IV,Decreases the caster's Missile Weapons skill by 25 points.,175,150,20,50,Creature Enchantment,0.15,19,16,0,0,1 -507,Missile Weapon Ineptitude Self V,Decreases the caster's Missile Weapons skill by 30 points.,225,180,20,60,Creature Enchantment,0.2,19,16,0,0,1 -508,Missile Weapon Ineptitude Self VI,Decreases the caster's Missile Weapons skill by 35 points.,275,210,20,70,Creature Enchantment,0.3,19,16,0,0,1 -509,Acid Protection Other I,Reduces damage the target takes from acid by 9%.,1,1800,101,10,Life Magic,0.01,49,16,5,1,0 -510,Acid Protection Other II,Reduces damage the target takes from acid by 20%.,50,1800,101,20,Life Magic,0.05,49,16,5,0.85,0 -511,Acid Protection Other III,Reduces damage the target takes from acid by 33%.,100,1800,101,30,Life Magic,0.1,49,16,5,0.7,0 -512,Acid Protection Other IV,Reduces damage the target takes from acid by 43%.,150,1800,101,40,Life Magic,0.15,49,16,5,0.55,0 -513,Acid Protection Other V,Reduces damage the target takes from acid by 50%.,200,1800,101,50,Life Magic,0.2,49,16,5,0.4,0 -514,Acid Protection Other VI,Reduces damage the target takes from acid by 60%.,250,2700,101,60,Life Magic,0.3,49,16,5,0.25,0 -515,Acid Protection Self I,Reduces damage the caster takes from acid by 9%,1,1800,101,15,Life Magic,0.01,49,16,0,0,0 -516,Acid Protection Self II,Reduces damage the caster takes from acid by 20%.,50,1800,101,30,Life Magic,0.05,49,16,0,0,0 -517,Acid Protection Self III,Reduces damage the caster takes from acid by 33%.,100,1800,101,40,Life Magic,0.1,49,16,0,0,0 -518,Acid Protection Self IV,Reduces damage the caster takes from acid by 43%.,150,1800,101,50,Life Magic,0.15,49,16,0,0,0 -519,Acid Protection Self V,Reduces damage the caster takes from acid by 50%.,200,1800,101,60,Life Magic,0.2,49,16,0,0,0 -520,Acid Protection Self VI,Reduces damage the caster takes from acid by 60%.,250,2700,101,70,Life Magic,0.3,49,16,0,0,0 -521,Acid Vulnerability Other I,Increases damage the target takes from acid by 10%,25,60,102,10,Life Magic,0.01,50,16,5,1,1 -522,Acid Vulnerability Other II,Increases damage the target takes from acid by 25%,75,90,102,20,Life Magic,0.05,50,16,5,0.85,1 -523,Acid Vulnerability Other III,Increases damage the target takes from acid by 50%.,125,120,102,30,Life Magic,0.1,50,16,5,0.7,1 -524,Acid Vulnerability Other IV,Increases damage the target takes from acid by 75%.,175,150,102,40,Life Magic,0.15,50,16,5,0.55,1 -525,Acid Vulnerability Other V,Increases damage the target takes from acid by 100%.,225,180,102,50,Life Magic,0.2,50,16,5,0.4,1 -526,Acid Vulnerability Other VI,Increases damage the target takes from acid by 150%.,275,210,102,60,Life Magic,0.3,50,16,5,0.25,1 -527,Acid Vulnerability Self I,Increases damage the caster takes from acid by 10%,25,60,102,15,Life Magic,0.01,50,16,0,0,1 -528,Acid Vulnerability Self II,Increases damage the caster takes from acid by 25%,75,90,102,30,Life Magic,0.05,50,16,0,0,1 -529,Acid Vulnerability Self III,Increases damage the caster takes from acid by 50%.,125,120,102,40,Life Magic,0.1,50,16,0,0,1 -530,Acid Vulnerability Self IV,Increases damage the caster takes from acid by 75%.,175,150,102,50,Life Magic,0.15,50,16,0,0,1 -531,Acid Vulnerability Self V,Increases damage the caster takes from acid by 100%.,225,180,102,60,Life Magic,0.2,50,16,0,0,1 -532,Acid Vulnerability Self VI,Increases damage the caster takes from acid by 150%.,275,210,102,70,Life Magic,0.3,50,16,0,0,1 -533,Missile Weapon Mastery Other I,Increases the target's Missile Weapons skill by 10 points.,1,1800,19,10,Creature Enchantment,0.01,18,16,0,1,1 -534,Missile Weapon Mastery Other II,Increases the target's Missile Weapons skill by 15 points.,50,1800,19,20,Creature Enchantment,0.05,18,16,5,0.85,1 -535,Missile Weapon Mastery Other III,Increases the target's Missile Weapons skill by 20 points.,100,1800,19,30,Creature Enchantment,0.1,18,16,5,0.7,1 -536,Missile Weapon Mastery Other IV,Increases the target's Missile Weapons skill by 25 points.,150,1800,19,40,Creature Enchantment,0.15,18,16,5,0.55,1 -537,Missile Weapon Mastery Other V,Increases the target's Missile Weapons skill by 30 points.,200,1800,19,50,Creature Enchantment,0.2,18,16,0,1,1 -538,Missile Weapon Mastery Other VI,Increases the target's Missile Weapons skill by 35 points.,250,2700,19,60,Creature Enchantment,0.3,18,16,5,0.25,1 -539,Missile Weapon Mastery Self I,Increases the caster's Missile Weapons skill by 10 points.,1,1800,19,15,Creature Enchantment,0.01,18,16,0,0,1 -540,Missile Weapon Mastery Self II,Increases the caster's Missile Weapons skill by 15 points.,50,1800,19,30,Creature Enchantment,0.05,18,16,0,0,1 -541,Missile Weapon Mastery Self III,Increases the caster's Missile Weapons skill by 20 points.,100,1800,19,40,Creature Enchantment,0.1,18,16,0,0,1 -542,Missile Weapon Mastery Self IV,Increases the caster's Missile Weapons skill by 25 points.,150,1800,19,50,Creature Enchantment,0.15,18,16,0,0,1 -543,Missile Weapon Mastery Self V,Increases the caster's Missile Weapons skill by 30 points.,200,1800,19,60,Creature Enchantment,0.2,18,16,0,0,1 -544,Missile Weapon Mastery Self VI,Increases the caster's Missile Weapons skill by 35 points.,250,2700,19,70,Creature Enchantment,0.3,18,16,0,0,1 -545,Missile Weapon Ineptitude Other I,Decreases the target's Missile Weapons skill by 10 points.,1,60,20,10,Creature Enchantment,0.01,19,16,0,1,1 -546,Missile Weapon Ineptitude Other II,Decreases the target's Missile Weapons skill by 15 points.,75,90,20,20,Creature Enchantment,0.05,19,16,5,0.85,1 -547,Missile Weapon Ineptitude Other III,Decreases the target's Missile Weapons skill by 20 points.,125,120,20,30,Creature Enchantment,0.1,19,16,5,0.7,1 -548,Missile Weapon Ineptitude Other IV,Decreases the target's Missile Weapons skill by 25 points.,175,150,20,40,Creature Enchantment,0.15,19,16,5,0.55,1 -549,Missile Weapon Ineptitude Other V,Decreases the target's Missile Weapons skill by 30 points.,225,180,20,50,Creature Enchantment,0.2,19,16,5,0.4,1 -550,Missile Weapon Ineptitude Other VI,Decreases the target's Missile Weapons skill by 35 points.,275,210,20,60,Creature Enchantment,0.3,19,16,5,0.25,1 -551,Missile Weapon Ineptitude Self I,Decreases the caster's Missile Weapons skill by 10 points.,1,60,20,15,Creature Enchantment,0.01,19,16,0,0,1 -552,Missile Weapon Ineptitude Self II,Decreases the caster's Missile Weapons skill by 15 points.,75,90,20,30,Creature Enchantment,0.05,19,16,0,0,1 -553,Missile Weapon Ineptitude Self III,Decreases the caster's Missile Weapons skill by 20 points.,125,120,20,40,Creature Enchantment,0.1,19,16,0,0,1 -554,Missile Weapon Ineptitude Self IV,Decreases the caster's Missile Weapons skill by 25 points.,175,150,20,50,Creature Enchantment,0.15,19,16,0,0,1 -555,Missile Weapon Ineptitude Self V,Decreases the caster's Missile Weapons skill by 30 points.,225,180,20,60,Creature Enchantment,0.2,19,16,0,0,1 -556,Missile Weapon Ineptitude Self VI,Decreases the caster's Missile Weapons skill by 35 points.,275,210,20,70,Creature Enchantment,0.3,19,16,0,0,1 -557,Creature Enchantment Mastery Self I,Increases the caster's Creature Enchantment skill by 10 points.,1,1800,43,15,Creature Enchantment,0.01,26,16,0,0,1 -558,Creature Enchantment Mastery Self II,Increases the caster's Creature Enchantment skill by 15 points.,50,1800,43,30,Creature Enchantment,0.05,26,16,0,0,1 -559,Creature Enchantment Mastery Self III,Increases the caster's Creature Enchantment skill by 20 points.,100,1800,43,40,Creature Enchantment,0.1,26,16,0,0,1 -560,Creature Enchantment Mastery Self IV,Increases the caster's Creature Enchantment skill by 25 points.,150,1800,43,50,Creature Enchantment,0.15,26,16,0,0,1 -561,Creature Enchantment Mastery Self V,Increases the caster's Creature Enchantment skill by 30 points.,200,1800,43,60,Creature Enchantment,0.2,26,16,0,0,1 -562,Creature Enchantment Mastery Self VI,Increases the caster's Creature Enchantment skill by 35 points.,250,2700,43,70,Creature Enchantment,0.3,26,16,0,0,1 -563,Creature Enchantment Mastery Other I,Increases the target's Creature Enchantment skill by 10 points.,1,1800,43,10,Creature Enchantment,0.01,26,16,0,1,1 -564,Creature Enchantment Mastery Other II,Increases the target's Creature Enchantment skill by 15 points.,50,1800,43,20,Creature Enchantment,0.05,26,16,5,0.85,1 -565,Creature Enchantment Mastery Other III,Increases the target's Creature Enchantment skill by 20 points.,100,1800,43,30,Creature Enchantment,0.1,26,16,5,0.7,1 -566,Creature Enchantment Mastery Other IV,Increases the target's Creature Enchantment skill by 25 points.,150,1800,43,40,Creature Enchantment,0.15,26,16,5,0.55,1 -567,Creature Enchantment Mastery Other V,Increases the target's Creature Enchantment skill by 30 points.,200,1800,43,50,Creature Enchantment,0.2,26,16,5,0.4,1 -568,Creature Enchantment Mastery Other VI,Increases the target's Creature Enchantment skill by 35 points.,250,2700,43,60,Creature Enchantment,0.3,26,16,5,0.25,1 -569,Creature Enchantment Ineptitude Other I,Decreases the target's Creature Enchantment skill by 10 points.,1,60,44,10,Creature Enchantment,0.01,27,16,0,1,1 -570,Creature Enchantment Ineptitude Other II,Decreases the target's Creature Enchantment skill by 15 points.,75,90,44,20,Creature Enchantment,0.05,27,16,5,0.85,1 -571,Creature Enchantment Ineptitude Other III,Decreases the target's Creature Enchantment skill by 20 points.,125,120,44,30,Creature Enchantment,0.1,27,16,5,0.7,1 -572,Creature Enchantment Ineptitude Other IV,Decreases the target's Creature Enchantment skill by 25 points.,175,150,44,40,Creature Enchantment,0.15,27,16,5,0.55,1 -573,Creature Enchantment Ineptitude Other V,Decreases the target's Creature Enchantment skill by 30 points.,225,180,44,50,Creature Enchantment,0.2,27,16,5,0.4,1 -574,Creature Enchantment Ineptitude Other VI,Decreases the target's Creature Enchantment skill by 35 points.,275,210,44,60,Creature Enchantment,0.3,27,16,5,0.25,1 -575,Creature Enchantment Ineptitude Self I,Decreases the caster's Creature Enchantment skill by 10 points.,1,60,44,15,Creature Enchantment,0.01,27,16,0,0,1 -576,Creature Enchantment Ineptitude Self II,Decreases the caster's Creature Enchantment skill by 15 points.,75,90,44,30,Creature Enchantment,0.05,27,16,0,0,1 -577,Creature Enchantment Ineptitude Self III,Decreases the caster's Creature Enchantment skill by 20 points.,125,120,44,40,Creature Enchantment,0.1,27,16,0,0,1 -578,Creature Enchantment Ineptitude Self IV,Decreases the caster's Creature Enchantment skill by 25 points.,175,150,44,50,Creature Enchantment,0.15,27,16,0,0,1 -579,Creature Enchantment Ineptitude Self V,Decreases the caster's Creature Enchantment skill by 30 points.,225,180,44,60,Creature Enchantment,0.2,27,16,0,0,1 -580,Creature Enchantment Ineptitude Self VI,Decreases the caster's Creature Enchantment skill by 35 points.,275,210,44,70,Creature Enchantment,0.3,27,16,0,0,1 -581,Item Enchantment Mastery Self I,Increases the caster's Item Enchantment skill by 10 points.,1,1800,45,15,Creature Enchantment,0.01,26,16,0,0,1 -582,Item Enchantment Mastery Self II,Increases the caster's Item Enchantment skill by 15 points.,50,1800,45,30,Creature Enchantment,0.05,26,16,0,0,1 -583,Item Enchantment Mastery Self III,Increases the caster's Item Enchantment skill by 20 points.,100,1800,45,40,Creature Enchantment,0.1,26,16,0,0,1 -584,Item Enchantment Mastery Self IV,Increases the caster's Item Enchantment skill by 25 points.,150,1800,45,50,Creature Enchantment,0.15,26,16,0,0,1 -585,Item Enchantment Mastery Self V,Increases the caster's Item Enchantment skill by 30 points.,200,1800,45,60,Creature Enchantment,0.2,26,16,0,0,1 -586,Item Enchantment Mastery Self VI,Increases the caster's Item Enchantment skill by 35 points.,250,2700,45,70,Creature Enchantment,0.3,26,16,0,0,1 -587,Item Enchantment Mastery Other I,Increases the target's Item Enchantment skill by 10 points.,1,1800,45,10,Creature Enchantment,0.01,26,16,0,1,1 -588,Item Enchantment Mastery Other II,Increases the target's Item Enchantment skill by 15 points.,50,1800,45,20,Creature Enchantment,0.05,26,16,5,0.85,1 -589,Item Enchantment Mastery Other III,Increases the target's Item Enchantment skill by 20 points.,100,1800,45,30,Creature Enchantment,0.1,26,16,5,0.7,1 -590,Item Enchantment Mastery Other IV,Increases the target's Item Enchantment skill by 25 points.,150,1800,45,40,Creature Enchantment,0.15,26,16,5,0.55,1 -591,Item Enchantment Mastery Other V,Increases the target's Item Enchantment skill by 30 points.,200,1800,45,50,Creature Enchantment,0.2,26,16,5,0.4,1 -592,Item Enchantment Mastery Other VI,Increases the target's Item Enchantment skill by 35 points.,250,2700,45,60,Creature Enchantment,0.3,26,16,5,0.25,1 -593,Item Enchantment Ineptitude Other I,Decreases the target's Item Enchantment skill by 10 points.,1,60,46,10,Creature Enchantment,0.01,27,16,0,1,1 -594,Item Enchantment Ineptitude Other II,Decreases the target's Item Enchantment skill by 15 points.,75,90,46,20,Creature Enchantment,0.05,27,16,5,0.85,1 -595,Item Enchantment Ineptitude Other III,Decreases the target's Item Enchantment skill by 20 points.,125,120,46,30,Creature Enchantment,0.1,27,16,5,0.7,1 -596,Item Enchantment Ineptitude Other IV,Decreases the target's Item Enchantment skill by 25 points.,175,150,46,40,Creature Enchantment,0.15,27,16,5,0.55,1 -597,Item Enchantment Ineptitude Other V,Decreases the target's Item Enchantment skill by 30 points.,225,180,46,50,Creature Enchantment,0.2,27,16,5,0.4,1 -598,Item Enchantment Ineptitude Other VI,Decreases the target's Item Enchantment skill by 35 points.,275,210,46,60,Creature Enchantment,0.3,27,16,5,0.25,1 -599,Item Enchantment Ineptitude Self I,Decreases the caster's Item Enchantment skill by 10 points.,1,60,46,15,Creature Enchantment,0.01,27,16,0,0,1 -600,Item Enchantment Ineptitude Self II,Decreases the caster's Item Enchantment skill by 15 points.,75,90,46,30,Creature Enchantment,0.05,27,16,0,0,1 -601,Item Enchantment Ineptitude Self III,Decreases the caster's Item Enchantment skill by 20 points.,125,120,46,40,Creature Enchantment,0.1,27,16,0,0,1 -602,Item Enchantment Ineptitude Self IV,Decreases the caster's Item Enchantment skill by 25 points.,175,150,46,50,Creature Enchantment,0.15,27,16,0,0,1 -603,Item Enchantment Ineptitude Self V,Decreases the caster's Item Enchantment skill by 30 points.,225,180,46,60,Creature Enchantment,0.2,27,16,0,0,1 -604,Item Enchantment Ineptitude Self VI,Decreases the caster's Item Enchantment skill by 35 points.,275,210,46,70,Creature Enchantment,0.3,27,16,0,0,1 -605,Life Magic Mastery Self I,Increases the caster's Life Magic skill by 10 points.,1,1800,47,15,Creature Enchantment,0.01,26,16,0,0,1 -606,Life Magic Mastery Self II,Increases the caster's Life Magic skill by 15 points.,50,1800,47,30,Creature Enchantment,0.05,26,16,0,0,1 -607,Life Magic Mastery Self III,Increases the caster's Life Magic skill by 20 points.,100,1800,47,40,Creature Enchantment,0.1,26,16,0,0,1 -608,Life Magic Mastery Self IV,Increases the caster's Life Magic skill by 25 points.,150,1800,47,50,Creature Enchantment,0.15,26,16,0,0,1 -609,Life Magic Mastery Self V,Increases the caster's Life Magic skill by 30 points.,200,1800,47,60,Creature Enchantment,0.2,26,16,0,0,1 -610,Life Magic Mastery Self VI,Increases the caster's Life Magic skill by 35 points.,250,2700,47,70,Creature Enchantment,0.3,26,16,0,0,1 -611,Life Magic Mastery Other I,Increases the target's Life Magic skill by 10 points.,1,1800,47,10,Creature Enchantment,0.01,26,16,0,1,1 -612,Life Magic Mastery Other II,Increases the target's Life Magic skill by 15 points.,50,1800,47,20,Creature Enchantment,0.05,26,16,5,0.85,1 -613,Life Magic Mastery Other III,Increases the target's Life Magic skill by 20 points.,100,1800,47,30,Creature Enchantment,0.1,26,16,5,0.7,1 -614,Life Magic Mastery Other IV,Increases the target's Life Magic skill by 25 points.,150,1800,47,40,Creature Enchantment,0.15,26,16,5,0.55,1 -615,Life Magic Mastery Other V,Increases the target's Life Magic skill by 30 points.,200,1800,47,50,Creature Enchantment,0.2,26,16,5,0.4,1 -616,Life Magic Mastery Other VI,Increases the target's Life Magic skill by 35 points.,250,2700,47,60,Creature Enchantment,0.3,26,16,5,0.25,1 -617,Life Magic Ineptitude Self I,Decreases the caster's Life Magic skill by 10 points.,1,60,48,15,Creature Enchantment,0.01,27,16,0,0,1 -618,Life Magic Ineptitude Self II,Decreases the caster's Life Magic skill by 15 points.,75,90,48,30,Creature Enchantment,0.05,27,16,0,0,1 -619,Life Magic Ineptitude Self III,Decreases the caster's Life Magic skill by 20 points.,125,120,48,40,Creature Enchantment,0.1,27,16,0,0,1 -620,Life Magic Ineptitude Self IV,Decreases the caster's Life Magic skill by 25 points.,175,150,48,50,Creature Enchantment,0.15,27,16,0,0,1 -621,Life Magic Ineptitude Self V,Decreases the caster's Life Magic skill by 30 points.,225,180,48,60,Creature Enchantment,0.2,27,16,0,0,1 -622,Life Magic Ineptitude Self VI,Decreases the caster's Life Magic skill by 35 points.,275,210,48,70,Creature Enchantment,0.3,27,16,0,0,1 -623,Life Magic Ineptitude Other I,Decreases the target's Life Magic skill by 10 points.,1,60,48,10,Creature Enchantment,0.01,27,16,0,1,1 -624,Life Magic Ineptitude Other II,Decreases the target's Life Magic skill by 15 points.,75,90,48,10,Creature Enchantment,0.05,27,16,5,0.85,1 -625,Life Magic Ineptitude Other III,Decreases the target's Life Magic skill by 20 points.,125,120,48,30,Creature Enchantment,0.1,27,16,5,0.7,1 -626,Life Magic Ineptitude Other IV,Decreases the target's Life Magic skill by 25 points.,175,150,48,40,Creature Enchantment,0.15,27,16,5,0.55,1 -627,Life Magic Ineptitude Other V,Decreases the target's Life Magic skill by 30 points.,225,180,48,50,Creature Enchantment,0.2,27,16,5,0.4,1 -628,Life Magic Ineptitude Other VI,Decreases the target's Life Magic skill by 35 points.,275,210,48,60,Creature Enchantment,0.3,27,16,5,0.25,1 -629,War Magic Mastery Self I,Increases the caster's War Magic skill by 10 points.,1,1800,49,15,Creature Enchantment,0.01,26,16,0,0,1 -630,War Magic Mastery Self II,Increases the caster's War Magic skill by 15 points.,50,1800,49,30,Creature Enchantment,0.05,26,16,0,0,1 -631,War Magic Mastery Self III,Increases the caster's War Magic skill by 20 points.,100,1800,49,40,Creature Enchantment,0.1,26,16,0,0,1 -632,War Magic Mastery Self IV,Increases the caster's War Magic skill by 25 points.,150,1800,49,50,Creature Enchantment,0.15,26,16,0,0,1 -633,War Magic Mastery Self V,Increases the caster's War Magic skill by 30 points.,200,1800,49,60,Creature Enchantment,0.2,26,16,0,0,1 -634,War Magic Mastery Self VI,Increases the caster's War Magic skill by 35 points.,250,2700,49,70,Creature Enchantment,0.3,26,16,0,0,1 -635,War Magic Mastery Other I,Increases the target's War Magic skill by 10 points.,1,1800,49,10,Creature Enchantment,0.01,26,16,0,1,1 -636,War Magic Mastery Other II,Increases the target's War Magic skill by 15 points.,50,1800,49,20,Creature Enchantment,0.05,26,16,5,0.85,1 -637,War Magic Mastery Other III,Increases the target's War Magic skill by 20 points.,100,1800,49,30,Creature Enchantment,0.1,26,16,5,0.7,1 -638,War Magic Mastery Other IV,Increases the target's War Magic skill by 25 points.,150,1800,49,40,Creature Enchantment,0.15,26,16,5,0.55,1 -639,War Magic Mastery Other V,Increases the target's War Magic skill by 30 points.,200,1800,49,50,Creature Enchantment,0.2,26,16,5,0.4,1 -640,War Magic Mastery Other VI,Increases the target's War Magic skill by 35 points.,250,2700,49,60,Creature Enchantment,0.3,26,16,5,0.25,1 -641,War Magic Ineptitude Self I,Decreases the caster's War Magic skill by 10 points.,1,60,50,15,Creature Enchantment,0.01,27,16,0,1,1 -642,War Magic Ineptitude Self II,Decreases the caster's War Magic skill by 15 points.,75,90,50,30,Creature Enchantment,0.05,27,16,0,1,1 -643,War Magic Ineptitude Self III,Decreases the caster's War Magic skill by 20 points.,125,120,50,40,Creature Enchantment,0.1,27,16,0,1,1 -644,War Magic Ineptitude Self IV,Decreases the caster's War Magic skill by 25 points.,175,150,50,50,Creature Enchantment,0.15,27,16,0,1,1 -645,War Magic Ineptitude Self V,Decreases the caster's War Magic skill by 30 points.,225,180,50,60,Creature Enchantment,0.2,27,16,0,1,1 -646,War Magic Ineptitude Self VI,Decreases the caster's War Magic skill by 35 points.,275,210,50,70,Creature Enchantment,0.3,27,16,0,1,1 -647,War Magic Ineptitude Other I,Decreases the target's War Magic skill by 10 points.,1,60,50,10,Creature Enchantment,0.01,27,16,0,1,1 -648,War Magic Ineptitude Other II,Decreases the target's War Magic skill by 15 points.,75,90,50,20,Creature Enchantment,0.05,27,16,5,0.85,1 -649,War Magic Ineptitude Other III,Decreases the target's War Magic skill by 20 points.,125,120,50,30,Creature Enchantment,0.1,27,16,5,0.7,1 -650,War Magic Ineptitude Other IV,Decreases the target's War Magic skill by 25 points.,175,150,50,40,Creature Enchantment,0.15,27,16,5,0.55,1 -651,War Magic Ineptitude Other V,Decreases the target's War Magic skill by 30 points.,225,180,50,50,Creature Enchantment,0.2,27,16,5,0.4,1 -652,War Magic Ineptitude Other VI,Decreases the target's War Magic skill by 35 points.,275,210,50,60,Creature Enchantment,0.3,27,16,5,0.25,1 -653,Mana Conversion Mastery Self I,Increases the caster's Mana Conversion skill by 10 points.,1,1800,51,15,Creature Enchantment,0.01,26,16,0,0,1 -654,Mana Conversion Mastery Self II,Increases the caster's Mana Conversion skill by 15 points.,50,1800,51,30,Creature Enchantment,0.05,26,16,0,0,1 -655,Mana Conversion Mastery Self III,Increases the caster's Mana Conversion skill by 20 points.,100,1800,51,40,Creature Enchantment,0.1,26,16,0,0,1 -656,Mana Conversion Mastery Self IV,Increases the caster's Mana Conversion skill by 25 points.,150,1800,51,50,Creature Enchantment,0.15,26,16,0,0,1 -657,Mana Conversion Mastery Self V,Increases the caster's Mana Conversion skill by 30 points.,200,1800,51,60,Creature Enchantment,0.2,26,16,0,0,1 -658,Mana Conversion Mastery Self VI,Increases the caster's Mana Conversion skill by 35 points.,250,2700,51,70,Creature Enchantment,0.3,26,16,0,0,1 -659,Mana Conversion Mastery Other I,Increases the target's Mana Conversion skill by 10 points.,1,1800,51,10,Creature Enchantment,0.01,26,16,0,1,1 -660,Mana Conversion Mastery Other II,Increases the target's Mana Conversion skill by 15 points.,50,1800,51,20,Creature Enchantment,0.05,26,16,5,0.85,1 -661,Mana Conversion Mastery Other III,Increases the target's Mana Conversion skill by 20 points.,100,1800,51,30,Creature Enchantment,0.1,26,16,5,0.7,1 -662,Mana Conversion Mastery Other IV,Increases the target's Mana Conversion skill by 25 points.,150,1800,51,40,Creature Enchantment,0.15,26,16,5,0.55,1 -663,Mana Conversion Mastery Other V,Increases the target's Mana Conversion skill by 30 points.,200,1800,51,50,Creature Enchantment,0.2,26,16,5,0.4,1 -664,Mana Conversion Mastery Other VI,Increases the target's Mana Conversion skill by 35 points.,250,2700,51,60,Creature Enchantment,0.3,26,16,5,0.25,1 -665,Mana Conversion Ineptitude Self I,Decreases the caster's Mana Conversion skill by 10 points.,1,60,52,15,Creature Enchantment,0.01,27,16,0,0,1 -666,Vitae,Death sucks,30,-1,204,3,Creature Enchantment,0.6,0,16,0,10,1 -667,Mana Conversion Ineptitude Self II,Decreases the caster's Mana Conversion skill by 15 points.,75,90,52,30,Creature Enchantment,0.05,27,16,0,0,1 -668,Mana Conversion Ineptitude Self III,Decreases the caster's Mana Conversion skill by 20 points.,125,120,52,40,Creature Enchantment,0.1,27,16,0,0,1 -669,Mana Conversion Ineptitude Self IV,Decreases the caster's Mana Conversion skill by 25 points.,175,150,52,50,Creature Enchantment,0.15,27,16,0,0,1 -670,Mana Conversion Ineptitude Self V,Decreases the caster's Mana Conversion skill by 30 points.,225,180,52,60,Creature Enchantment,0.2,27,16,0,0,1 -671,Mana Conversion Ineptitude Self VI,Decreases the caster's Mana Conversion skill by 35 points.,275,210,52,70,Creature Enchantment,0.3,27,16,0,0,1 -672,Mana Conversion Ineptitude Other I,Decreases the target's Mana Conversion skill by 10 points.,1,60,52,10,Creature Enchantment,0.01,27,16,0,1,1 -673,Mana Conversion Ineptitude Other II,Decreases the target's Mana Conversion skill by 15 points.,75,90,52,20,Creature Enchantment,0.05,27,16,5,0.85,1 -674,Mana Conversion Ineptitude Other III,Decreases the target's Mana Conversion skill by 20 points.,125,120,52,30,Creature Enchantment,0.1,27,16,5,0.7,1 -675,Mana Conversion Ineptitude Other IV,Decreases the target's Mana Conversion skill by 25 points.,175,150,52,40,Creature Enchantment,0.15,27,16,5,0.55,1 -676,Mana Conversion Ineptitude Other V,Decreases the target's Mana Conversion skill by 30 points.,225,180,52,50,Creature Enchantment,0.2,27,16,5,0.4,1 -677,Mana Conversion Ineptitude Other VI,Decreases the target's Mana Conversion skill by 35 points.,275,210,52,60,Creature Enchantment,0.3,27,16,5,0.25,1 -678,Arcane Enlightenment Self I,Increases the caster's Arcane Lore skill by 10 points.,1,1800,53,15,Creature Enchantment,0,26,16,0,0,1 -679,Arcane Enlightenment Self II,Increases the caster's Arcane Lore skill by 15 points.,50,1800,53,30,Creature Enchantment,0.05,26,16,0,0,1 -680,Arcane Enlightenment Self III,Increases the caster's Arcane Lore skill by 20 points.,100,1800,53,40,Creature Enchantment,0.1,26,16,0,0,1 -681,Arcane Enlightenment Self IV,Increases the caster's Arcane Lore skill by 25 points.,150,1800,53,50,Creature Enchantment,0.15,26,16,0,0,1 -682,Arcane Enlightenment Self V,Increases the caster's Arcane Lore skill by 30 points.,200,1800,53,60,Creature Enchantment,0.2,26,16,0,0,1 -683,Arcane Enlightenment Self VI,Increases the caster's Arcane Lore skill by 35 points.,250,2700,53,70,Creature Enchantment,0.3,26,16,0,0,1 -684,Arcane Enlightenment Other I,Increases the target's Arcane Lore skill by 10 points.,1,1800,53,10,Creature Enchantment,0.01,26,16,0,1,1 -685,Arcane Enlightenment Other II,Increases the target's Arcane Lore skill by 15 points.,50,1800,53,20,Creature Enchantment,0.05,26,16,5,0.85,1 -686,Arcane Enlightenment Other III,Increases the target's Arcane Lore skill by 20 points.,100,1800,53,30,Creature Enchantment,0.1,26,16,5,0.7,1 -687,Arcane Enlightenment Other IV,Increases the target's Arcane Lore skill by 25 points.,150,1800,53,40,Creature Enchantment,0.15,26,16,5,0.55,1 -688,Arcane Enlightenment Other V,Increases the target's Arcane Lore skill by 30 points.,225,1800,53,50,Creature Enchantment,0.2,26,16,5,0.4,1 -689,Arcane Enlightenment Other VI,Increases the target's Arcane Lore skill by 35 points.,250,2700,53,60,Creature Enchantment,0.3,26,16,5,0.25,1 -690,Arcane Benightedness Self I,Decreases the caster's Arcane Lore skill by 10 points.,1,60,54,15,Creature Enchantment,0.01,27,16,0,0,1 -691,Arcane Benightedness Self II,Decreases the caster's Arcane Lore skill by 15 points.,75,90,54,30,Creature Enchantment,0.05,27,16,0,0,1 -692,Arcane Benightedness Self III,Decreases the caster's Arcane Lore skill by 20 points.,125,120,54,40,Creature Enchantment,0.1,27,16,0,0,1 -693,Arcane Benightedness Self IV,Decreases the caster's Arcane Lore skill by 25 points.,175,150,54,50,Creature Enchantment,0.15,27,16,0,0,1 -694,Arcane Benightedness Self V,Decreases the caster's Arcane Lore skill by 30 points.,225,180,54,60,Creature Enchantment,0.2,27,16,0,0,1 -695,Arcane Benightedness Self VI,Decreases the caster's Arcane Lore skill by 35 points.,275,210,54,70,Creature Enchantment,0.3,27,16,0,0,1 -696,Arcane Benightedness Other I,Decreases the target's Arcane Lore skill by 10 points.,1,60,54,10,Creature Enchantment,0.01,27,16,0,1,1 -697,Arcane Benightedness Other II,Decreases the target's Arcane Lore skill by 15 points.,75,90,54,20,Creature Enchantment,0.05,27,16,5,0.85,1 -698,Arcane Benightedness Other III,Decreases the target's Arcane Lore skill by 20 points.,125,120,54,30,Creature Enchantment,0.1,27,16,5,0.7,1 -699,Arcane Benightedness Other IV,Decreases the target's Arcane Lore skill by 25 points.,175,150,54,40,Creature Enchantment,0.15,27,16,5,0.55,1 -700,Arcane Benightedness Other V,Decreases the target's Arcane Lore skill by 30 points.,225,180,54,50,Creature Enchantment,0.2,27,16,5,0.4,1 -701,Arcane Benightedness Other VI,Decreases the target's Arcane Lore skill by 35 points.,275,210,54,60,Creature Enchantment,0.3,27,16,5,0.25,1 -702,Armor Tinkering Expertise Self I,Increases the caster's Armor Tinkering skill by 10 points.,1,1800,55,15,Creature Enchantment,0.01,28,16,0,0,1 -703,Armor Tinkering Expertise Self II,Increases the caster's Armor Tinkering skill by 15 points.,50,1800,55,30,Creature Enchantment,0.05,28,16,0,0,1 -704,Armor Tinkering Expertise Self III,Increases the caster's Armor Tinkering skill by 20 points.,100,1800,55,40,Creature Enchantment,0.1,28,16,0,0,1 -705,Armor Tinkering Expertise Self IV,Increases the caster's Armor Tinkering skill by 25 points.,150,1800,55,50,Creature Enchantment,0.15,28,16,0,0,1 -706,Armor Tinkering Expertise Self V,Increases the caster's Armor Tinkering skill by 30 points.,200,1800,55,60,Creature Enchantment,0.2,28,16,0,0,1 -707,Armor Tinkering Expertise Self VI,Increases the caster's Armor Tinkering skill by 35 points.,250,2700,55,70,Creature Enchantment,0.3,28,16,0,0,1 -708,Armor Tinkering Expertise Other I,Increases the target's Armor Tinkering skill by 10 points.,1,1800,55,10,Creature Enchantment,0.01,28,16,0,1,1 -709,Armor Tinkering Expertise Other II,Increases the target's Armor Tinkering skill by 15 points.,50,1800,55,20,Creature Enchantment,0.05,28,16,5,0.85,1 -710,Armor Tinkering Expertise Other III,Increases the target's Armor Tinkering skill by 20 points.,100,1800,55,30,Creature Enchantment,0.1,28,16,5,0.7,1 -711,Armor Tinkering Expertise Other IV,Increases the target's Armor Tinkering skill by 25 points.,150,1800,55,40,Creature Enchantment,0.15,28,16,5,0.55,1 -712,Armor Tinkering Expertise Other V,Increases the target's Armor Tinkering skill by 30 points.,200,1800,55,50,Creature Enchantment,0.2,28,16,5,0.4,1 -713,Armor Tinkering Expertise Other VI,Increases the target's Armor Tinkering skill by 35 points.,250,2700,55,60,Creature Enchantment,0.3,28,16,5,0.25,1 -714,Armor Tinkering Ignorance Self I,Decreases the caster's Armor Tinkering skill by 10 points.,1,60,56,15,Creature Enchantment,0.01,29,16,0,0,1 -715,Armor Tinkering Ignorance Self II,Decreases the caster's Armor Tinkering skill by 15 points.,75,90,56,30,Creature Enchantment,0.05,29,16,0,0,1 -716,Armor Tinkering Ignorance Self III,Decreases the caster's Armor Tinkering skill by 20 points.,125,120,56,40,Creature Enchantment,0.1,29,16,0,0,1 -717,Armor Tinkering Ignorance Self IV,Decreases the caster's Armor Tinkering skill by 25 points.,175,150,56,50,Creature Enchantment,0.15,29,16,0,0,1 -718,Armor Tinkering Ignorance Self V,Decreases the caster's Armor Tinkering skill by 30 points.,225,180,56,60,Creature Enchantment,0.2,29,16,0,0,1 -719,Armor Tinkering Ignorance Self VI,Decreases the caster's Armor Tinkering skill by 35 points.,275,210,56,70,Creature Enchantment,0.3,29,16,0,0,1 -720,Armor Tinkering Ignorance Other I,Decreases the target's Armor Tinkering skill by 10 points.,1,60,56,10,Creature Enchantment,0.01,29,16,0,1,1 -721,Armor Tinkering Ignorance Other II,Decreases the target's Armor Tinkering skill by 15 points.,75,90,56,20,Creature Enchantment,0.05,29,16,5,0.85,1 -722,Armor Tinkering Ignorance Other III,Decreases the target's Armor Tinkering skill by 20 points.,125,120,56,30,Creature Enchantment,0.1,29,16,5,0.7,1 -723,Armor Tinkering Ignorance Other IV,Decreases the target's Armor Tinkering skill by 25 points.,175,150,56,40,Creature Enchantment,0.15,29,16,5,0.55,1 -724,Armor Tinkering Ignorance Other V,Decreases the target's Armor Tinkering skill by 30 points.,225,180,56,50,Creature Enchantment,0.2,29,16,5,0.4,1 -725,Armor Tinkering Ignorance Other VI,Decreases the target's Armor Tinkering skill by 35 points.,275,210,56,60,Creature Enchantment,0.3,29,16,5,0.25,1 -726,Item Tinkering Expertise Self I,Increases the caster's Item Tinkering skill by 10 points.,1,1800,57,15,Creature Enchantment,0.01,28,16,0,0,1 -727,Item Tinkering Expertise Self II,Increases the caster's Item Tinkering skill by 15 points.,50,1800,57,30,Creature Enchantment,0.05,28,16,0,0,1 -728,Item Tinkering Expertise Self III,Increases the caster's Item Tinkering skill by 20 points.,100,1800,57,40,Creature Enchantment,0.1,28,16,0,0,1 -729,Item Tinkering Expertise Self IV,Increases the caster's Item Tinkering skill by 25 points.,150,1800,57,50,Creature Enchantment,0.15,28,16,0,0,1 -730,Item Tinkering Expertise Self V,Increases the caster's Item Tinkering skill by 30 points.,200,1800,57,60,Creature Enchantment,0.2,28,16,0,0,1 -731,Item Tinkering Expertise Self VI,Increases the caster's Item Tinkering skill by 35 points.,250,2700,57,70,Creature Enchantment,0.3,28,16,0,0,1 -732,Item Tinkering Expertise Other I,Increases the target's Item Tinkering skill by 10 points.,1,1800,57,10,Creature Enchantment,0.01,28,16,0,1,1 -733,Item Tinkering Expertise Other II,Increases the target's Item Tinkering skill by 15 points.,50,1800,57,20,Creature Enchantment,0.05,28,16,5,0.85,1 -734,Item Tinkering Expertise Other III,Increases the target's Item Tinkering skill by 20 points.,100,1800,57,30,Creature Enchantment,0.1,28,16,5,0.7,1 -735,Item Tinkering Expertise Other IV,Increases the target's Item Tinkering skill by 25 points.,150,1800,57,40,Creature Enchantment,0.15,28,16,5,0.55,1 -736,Item Tinkering Expertise Other V,Increases the target's Item Tinkering skill by 30 points.,200,1800,57,50,Creature Enchantment,0.2,28,16,5,0.4,1 -737,Item Tinkering Expertise Other VI,Increases the target's Item Tinkering skill by 35 points.,250,2700,57,60,Creature Enchantment,0.3,28,16,5,0.25,1 -738,Item Tinkering Ignorance Self I,Decreases the caster's Item Tinkering skill by 10 points.,1,60,58,15,Creature Enchantment,0.01,29,16,0,0,1 -739,Item Tinkering Ignorance Self II,Decreases the caster's Item Tinkering skill by 15 points.,75,90,58,30,Creature Enchantment,0.05,29,16,0,0,1 -740,Item Tinkering Ignorance Self III,Decreases the caster's Item Tinkering skill by 20 points.,125,120,58,40,Creature Enchantment,0.1,29,16,0,0,1 -741,Item Tinkering Ignorance Self IV,Decreases the caster's Item Tinkering skill by 25 points.,175,150,58,50,Creature Enchantment,0.15,29,16,0,0,1 -742,Item Tinkering Ignorance Self V,Decreases the caster's Item Tinkering skill by 30 points.,225,180,58,60,Creature Enchantment,0.2,29,16,0,0,1 -743,Item Tinkering Ignorance Self VI,Decreases the caster's Item Tinkering skill by 35 points.,275,210,58,70,Creature Enchantment,0.3,29,16,0,0,1 -744,Item Tinkering Ignorance Other I,Decreases the target's Item Tinkering skill by 10 points.,1,60,58,10,Creature Enchantment,0.01,29,16,0,1,1 -745,Item Tinkering Ignorance Other II,Decreases the target's Item Tinkering skill by 15 points.,75,90,58,20,Creature Enchantment,0.05,29,16,5,0.85,1 -746,Item Tinkering Ignorance Other III,Decreases the target's Item Tinkering skill by 20 points.,125,120,58,30,Creature Enchantment,0.1,29,16,5,0.7,1 -747,Item Tinkering Ignorance Other IV,Decreases the target's Item Tinkering skill by 25 points.,175,150,58,40,Creature Enchantment,0.15,29,16,5,0.55,1 -748,Item Tinkering Ignorance Other V,Decreases the target's Item Tinkering skill by 30 points.,225,180,58,50,Creature Enchantment,0.2,29,16,5,0.4,1 -749,Item Tinkering Ignorance Other VI,Decreases the target's Item Tinkering skill by 35 points.,275,210,58,60,Creature Enchantment,0.3,29,16,5,0.25,1 -750,Magic Item Tinkering Expertise Self I,Increases the caster's Magic Item Tinkering skill by 10 points.,1,1800,59,15,Creature Enchantment,0.01,28,16,0,0,1 -751,Magic Item Tinkering Expertise Self II,Increases the caster's Magic Item Tinkering skill by 15 points.,50,1800,59,30,Creature Enchantment,0.05,28,16,0,0,1 -752,Magic Item Tinkering Expertise Self III,Increases the caster's Magic Item Tinkering skill by 20 points.,100,1800,59,40,Creature Enchantment,0.1,28,16,0,0,1 -753,Magic Item Tinkering Expertise Self IV,Increases the caster's Magic Item Tinkering skill by 25 points.,150,1800,59,50,Creature Enchantment,0.15,28,16,0,0,1 -754,Magic Item Tinkering Expertise Self V,Increases the caster's Magic Item Tinkering skill by 30 points.,200,1800,59,60,Creature Enchantment,0.2,28,16,0,0,1 -755,Magic Item Tinkering Expertise Self VI,Increases the caster's Magic Item Tinkering skill by 35 points.,250,2700,59,70,Creature Enchantment,0.3,28,16,0,0,1 -756,Magic Item Tinkering Expertise Other I,Increases the target's Magic Item Tinkering skill by 10 points.,1,1800,59,10,Creature Enchantment,0.01,28,16,0,1,1 -757,Magic Item Tinkering Expertise Other II,Increases the target's Magic Item Tinkering skill by 15 points.,50,1800,59,20,Creature Enchantment,0.05,28,16,5,0.85,1 -758,Magic Item Tinkering Expertise Other III,Increases the target's Magic Item Tinkering skill by 20 points.,75,1800,59,30,Creature Enchantment,0.1,28,16,5,0.7,1 -759,Magic Item Tinkering Expertise Other IV,Increases the target's Magic Item Tinkering skill by 25 points.,125,1800,59,40,Creature Enchantment,0.15,28,16,5,0.55,1 -760,Magic Item Tinkering Expertise Other V,Increases the target's Magic Item Tinkering skill by 30 points.,200,1800,59,50,Creature Enchantment,0.2,28,16,5,0.4,1 -761,Magic Item Tinkering Expertise Other VI,Increases the target's Magic Item Tinkering skill by 35 points.,250,2700,59,60,Creature Enchantment,0.3,28,16,5,0.25,1 -762,Magic Item Tinkering Ignorance Self I,Decreases the caster's Magic Item Tinkering skill by 10 points.,1,60,60,15,Creature Enchantment,0.01,29,16,0,0,1 -763,Magic Item Tinkering Ignorance Self II,Decreases the caster's Magic Item Tinkering skill by 15 points.,75,90,60,30,Creature Enchantment,0.05,29,16,0,0,1 -764,Magic Item Tinkering Ignorance Self III,Decreases the caster's Magic Item Tinkering skill by 20 points.,125,120,60,40,Creature Enchantment,0.1,29,16,0,0,1 -765,Magic Item Tinkering Ignorance Self IV,Decreases the caster's Magic Item Tinkering skill by 25 points.,175,150,60,50,Creature Enchantment,0.15,29,16,0,0,1 -766,Magic Item Tinkering Ignorance Self V,Decreases the caster's Magic Item Tinkering skill by 30 points.,225,180,60,60,Creature Enchantment,0.2,29,16,0,0,1 -767,Magic Item Tinkering Ignorance Self VI,Decreases the caster's Magic Item Tinkering skill by 35 points.,275,210,60,70,Creature Enchantment,0.3,29,16,0,0,1 -768,Magic Item Tinkering Ignorance Other I,Decreases the target's Magic Item Tinkering skill by 10 points.,1,60,60,10,Creature Enchantment,0.01,29,16,0,1,1 -769,Magic Item Tinkering Ignorance Other II,Decreases the target's Magic Item Tinkering skill by 15 points.,75,90,60,20,Creature Enchantment,0.05,29,16,5,0.85,1 -770,Magic Item Tinkering Ignorance Other III,Decreases the target's Magic Item Tinkering skill by 20 points.,125,120,60,30,Creature Enchantment,0.1,29,16,5,0.7,1 -771,Magic Item Tinkering Ignorance Other IV,Decreases the target's Magic Item Tinkering skill by 25 points.,175,150,60,40,Creature Enchantment,0.15,29,16,5,0.55,1 -772,Magic Item Tinkering Ignorance Other V,Decreases the target's Magic Item Tinkering skill by 30 points.,225,180,60,50,Creature Enchantment,0.2,29,16,5,0.4,1 -773,Magic Item Tinkering Ignorance Other VI,Decreases the target's Magic Item Tinkering skill by 35 points.,275,210,60,60,Creature Enchantment,0.3,29,16,5,0.25,1 -774,Weapon Tinkering Expertise Self I,Increases the caster's Weapon Tinkering skill by 10 points.,1,1800,61,15,Creature Enchantment,0.01,28,16,0,0,1 -775,Weapon Tinkering Expertise Self II,Increases the caster's Weapon Tinkering skill by 15 points.,50,1800,61,30,Creature Enchantment,0.05,28,16,0,0,1 -776,Weapon Tinkering Expertise Self III,Increases the caster's Weapon Tinkering skill by 20 points.,100,1800,61,40,Creature Enchantment,0.1,28,16,0,0,1 -777,Weapon Tinkering Expertise Self IV,Increases the caster's Weapon Tinkering skill by 25 points.,150,1800,61,50,Creature Enchantment,0.15,28,16,0,0,1 -778,Weapon Tinkering Expertise Self V,Increases the caster's Weapon Tinkering skill by 30 points.,200,1800,61,60,Creature Enchantment,0.2,28,16,0,0,1 -779,Weapon Tinkering Expertise Self VI,Increases the caster's Weapon Tinkering skill by 35 points.,250,2700,61,70,Creature Enchantment,0.3,28,16,0,0,1 -780,Weapon Tinkering Expertise Other I,Increases the target's Weapon Tinkering skill by 10 points.,1,1800,61,10,Creature Enchantment,0.01,28,16,0,1,1 -781,Weapon Tinkering Expertise Other II,Increases the target's Weapon Tinkering skill by 15 points.,50,1800,61,20,Creature Enchantment,0.05,28,16,5,0.85,1 -782,Weapon Tinkering Expertise Other III,Increases the target's Weapon Tinkering skill by 20 points.,100,1800,61,30,Creature Enchantment,0.1,28,16,5,0.7,1 -783,Weapon Tinkering Expertise Other IV,Increases the target's Weapon Tinkering skill by 25 points.,150,1800,61,40,Creature Enchantment,0.15,28,16,5,0.55,1 -784,Weapon Tinkering Expertise Other V,Increases the target's Weapon Tinkering skill by 30 points.,200,1800,61,50,Creature Enchantment,0.2,28,16,5,0.4,1 -785,Weapon Tinkering Expertise Other VI,Increases the target's Weapon Tinkering skill by 35 points.,250,2700,61,60,Creature Enchantment,0.3,28,16,5,0.25,1 -786,Weapon Tinkering Ignorance Self I,Decreases the caster's Weapon Tinkering skill by 10 points.,1,60,62,15,Creature Enchantment,0.01,29,16,0,0,1 -787,Weapon Tinkering Ignorance Self II,Decreases the caster's Weapon Tinkering skill by 15 points.,75,90,62,30,Creature Enchantment,0.05,29,16,0,0,1 -788,Weapon Tinkering Ignorance Self III,Decreases the caster's Weapon Tinkering skill by 20 points.,125,120,62,40,Creature Enchantment,0.1,29,16,0,0,1 -789,Weapon Tinkering Ignorance Self IV,Decreases the caster's Weapon Tinkering skill by 25 points.,175,150,62,50,Creature Enchantment,0.15,29,16,0,0,1 -790,Weapon Tinkering Ignorance Self V,Decreases the caster's Weapon Tinkering skill by 30 points.,225,180,62,60,Creature Enchantment,0.2,29,16,0,0,1 -791,Weapon Tinkering Ignorance Self VI,Decreases the caster's Weapon Tinkering skill by 35 points.,275,210,62,70,Creature Enchantment,0.3,29,16,0,0,1 -792,Weapon Tinkering Ignorance Other I,Decreases the target's Weapon Tinkering skill by 10 points.,1,60,62,10,Creature Enchantment,0.01,29,16,0,1,1 -793,Weapon Tinkering Ignorance Other II,Decreases the target's Weapon Tinkering skill by 15 points.,75,90,62,20,Creature Enchantment,0.05,29,16,5,0.85,1 -794,Weapon Tinkering Ignorance Other III,Decreases the target's Weapon Tinkering skill by 20 points.,125,120,62,30,Creature Enchantment,0.1,29,16,5,0.7,1 -795,Weapon Tinkering Ignorance Other IV,Decreases the target's Weapon Tinkering skill by 25 points.,175,150,62,40,Creature Enchantment,0.15,29,16,5,0.55,1 -796,Weapon Tinkering Ignorance Other V,Decreases the target's Weapon Tinkering skill by 30 points.,225,180,62,50,Creature Enchantment,0.2,29,16,5,0.4,1 -797,Weapon Tinkering Ignorance Other VI,Decreases the target's Weapon Tinkering skill by 35 points.,275,210,62,60,Creature Enchantment,0.3,29,16,5,0.25,1 -798,Monster Attunement Self I,Increases the caster's Assess Monster skill by 10 points.,1,1800,63,15,Creature Enchantment,0.01,28,16,0,0,1 -799,Monster Attunement Self II,Increases the caster's Assess Monster skill by 15 points.,50,1800,63,30,Creature Enchantment,0.05,28,16,0,0,1 -800,Monster Attunement Self III,Increases the caster's Assess Monster skill by 20 points.,100,1800,63,40,Creature Enchantment,0.1,28,16,0,0,1 -801,Monster Attunement Self IV,Increases the caster's Assess Monster skill by 25 points.,150,1800,63,50,Creature Enchantment,0.15,28,16,0,0,1 -802,Monster Attunement Self V,Increases the caster's Assess Monster skill by 30 points.,200,1800,63,60,Creature Enchantment,0.2,28,16,0,0,1 -803,Monster Attunement Self VI,Increases the caster's Assess Monster skill by 35 points.,250,2700,63,70,Creature Enchantment,0.3,28,16,0,0,1 -804,Monster Attunement Other I,Increases the target's Assess Monster skill by 10 points.,1,1800,63,10,Creature Enchantment,0.01,28,16,0,1,1 -805,Monster Attunement Other II,Increases the target's Assess Monster skill by 15 points.,50,1800,63,20,Creature Enchantment,0.05,28,16,5,0.85,1 -806,Monster Attunement Other III,Increases the target's Assess Monster skill by 20 points.,100,1800,63,30,Creature Enchantment,0.1,28,16,5,0.7,1 -807,Monster Attunement Other IV,Increases the target's Assess Monster skill by 25 points.,150,1800,63,40,Creature Enchantment,0.15,28,16,5,0.55,1 -808,Monster Attunement Other V,Increases the target's Assess Monster skill by 30 points.,200,1800,63,50,Creature Enchantment,0.2,28,16,5,0.4,1 -809,Monster Attunement Other VI,Increases the target's Assess Monster skill by 35 points.,250,2700,63,60,Creature Enchantment,0.3,28,16,5,0.25,1 -810,Fire Protection Other II,Reduces damage the target takes from fire by 20%.,50,1800,109,20,Life Magic,0.05,43,16,5,0.85,0 -811,Monster Unfamiliarity Self I,Decreases the caster's Assess Monster skill by 10 points.,1,60,64,15,Creature Enchantment,0.01,29,16,0,0,1 -812,Monster Unfamiliarity Self II,Decreases the caster's Assess Monster skill by 15 points.,75,90,64,30,Creature Enchantment,0.05,29,16,0,0,1 -813,Monster Unfamiliarity Self III,Decreases the caster's Assess Monster skill by 20 points.,125,120,64,40,Creature Enchantment,0.1,29,16,0,0,1 -814,Monster Unfamiliarity Self IV,Decreases the caster's Assess Monster skill by 25 points.,175,150,64,50,Creature Enchantment,0.15,29,16,0,0,1 -815,Monster Unfamiliarity Self V,Decreases the caster's Assess Monster skill by 30 points.,225,180,64,60,Creature Enchantment,0.2,29,16,0,0,1 -816,Monster Unfamiliarity Self VI,Decreases the caster's Assess Monster skill by 35 points.,275,210,64,70,Creature Enchantment,0.3,29,16,0,0,1 -817,Monster Unfamiliarity Other I,Decreases the target's Assess Monster skill by 10 points.,1,60,64,10,Creature Enchantment,0.01,29,16,0,1,1 -818,Monster Unfamiliarity Other II,Decreases the target's Assess Monster skill by 15 points.,75,90,64,20,Creature Enchantment,0.05,29,16,5,0.85,1 -819,Monster Unfamiliarity Other III,Decreases the target's Assess Monster skill by 20 points.,125,120,64,30,Creature Enchantment,0.1,29,16,5,0.7,1 -820,Monster Unfamiliarity Other IV,Decreases the target's Assess Monster skill by 25 points.,175,150,64,40,Creature Enchantment,0.15,29,16,5,0.55,1 -821,Monster Unfamiliarity Other V,Decreases the target's Assess Monster skill by 30 points.,225,180,64,50,Creature Enchantment,0.2,29,16,5,0.4,1 -822,Monster Unfamiliarity Other VI,Decreases the target's Assess Monster skill by 35 points.,275,210,64,60,Creature Enchantment,0.3,29,16,5,0.25,1 -824,Person Attunement Self I,Increases the caster's Assess Person skill by 10 points.,1,1800,205,15,Creature Enchantment,0.01,28,16,0,0,1 -825,Person Attunement Self II,Increases the caster's Assess Person skill by 15 points.,50,1800,205,30,Creature Enchantment,0.05,28,16,0,0,1 -826,Person Attunement Self III,Increases the caster's Assess Person skill by 20 points.,100,1800,205,40,Creature Enchantment,0.1,28,16,0,0,1 -827,Person Attunement Self IV,Increases the caster's Assess Person skill by 25 points.,150,1800,205,50,Creature Enchantment,0.15,28,16,0,0,1 -828,Person Attunement Self V,Increases the caster's Assess Person skill by 30 points.,200,1800,205,60,Creature Enchantment,0.2,28,16,0,0,1 -829,Person Attunement Self VI,Increases the caster's Assess Person skill by 35 points.,250,2700,205,70,Creature Enchantment,0.3,28,16,0,0,1 -830,Person Attunement Other I,Increases the target's Assess Person skill by 10 points.,1,1800,205,10,Creature Enchantment,0.01,28,16,0,1,1 -831,Person Attunement Other II,Increases the target's Assess Person skill by 15 points.,50,1800,205,20,Creature Enchantment,0.05,28,16,5,0.85,1 -832,Person Attunement Other III,Increases the target's Assess Person skill by 20 points.,100,1800,205,30,Creature Enchantment,0.1,28,16,5,0.7,1 -833,Person Attunement Other IV,Increases the target's Assess Person skill by 25 points.,150,1800,205,40,Creature Enchantment,0.15,28,16,5,0.55,1 -834,Person Attunement Other V,Increases the target's Assess Person skill by 30 points.,200,1800,205,50,Creature Enchantment,0.2,28,16,5,0.4,1 -835,Person Attunement Other VI,Increases the target's Assess Person skill by 35 points.,250,2700,205,60,Creature Enchantment,0.3,28,16,5,0.25,1 -836,Fire Protection Other III,Reduces damage the target takes from fire by 33%.,100,1800,109,30,Life Magic,0.1,43,16,5,0.7,0 -837,Person Unfamiliarity Self I,Decreases the caster's Assess Person skill by 10 points.,1,60,206,15,Creature Enchantment,0.01,29,16,0,0,1 -838,Person Unfamiliarity Self II,Decreases the caster's Assess Person skill by 15 points.,75,90,206,30,Creature Enchantment,0.05,29,16,0,0,1 -839,Person Unfamiliarity Self III,Decreases the caster's Assess Person skill by 20 points.,125,120,206,40,Creature Enchantment,0.1,29,16,0,0,1 -840,Person Unfamiliarity Self IV,Decreases the caster's Assess Person skill by 25 points.,175,150,206,50,Creature Enchantment,0.15,29,16,0,0,1 -841,Person Unfamiliarity Self V,Decreases the caster's Assess Person skill by 30 points.,225,180,206,60,Creature Enchantment,0.2,29,16,0,0,1 -842,Person Unfamiliarity Self VI,Decreases the caster's Assess Person skill by 35 points.,275,210,206,70,Creature Enchantment,0.3,29,16,0,0,1 -843,Person Unfamiliarity Other I,Decreases the target's Assess Person skill by 10 points.,1,60,206,10,Creature Enchantment,0.01,29,16,0,1,1 -844,Person Unfamiliarity Other II,Decreases the target's Assess Person skill by 15 points.,75,90,206,20,Creature Enchantment,0.05,29,16,5,0.85,1 -845,Person Unfamiliarity Other III,Decreases the target's Assess Person skill by 20 points.,125,120,206,30,Creature Enchantment,0.1,29,16,5,0.7,1 -846,Person Unfamiliarity Other IV,Decreases the target's Assess Person skill by 25 points.,175,150,206,40,Creature Enchantment,0.15,29,16,5,0.55,1 -847,Person Unfamiliarity Other V,Decreases the target's Assess Person skill by 30 points.,225,180,206,50,Creature Enchantment,0.2,29,16,5,0.4,1 -848,Person Unfamiliarity Other VI,Decreases the target's Assess Person skill by 35 points.,275,210,206,60,Creature Enchantment,0.3,29,16,5,0.25,1 -849,Fire Protection Other IV,Reduces damage the target takes from fire by 43%.,150,1800,109,40,Life Magic,0.15,43,16,5,0.55,0 -850,Deception Mastery Self I,Increases the caster's Deception skill by 10 points.,1,1800,65,15,Creature Enchantment,0.01,28,16,0,0,1 -851,Deception Mastery Self II,Increases the caster's Deception skill by 15 points.,50,1800,65,30,Creature Enchantment,0.05,28,16,0,0,1 -852,Deception Mastery Self III,Increases the caster's Deception skill by 20 points.,100,1800,65,40,Creature Enchantment,0.1,28,16,0,0,1 -853,Deception Mastery Self IV,Increases the caster's Deception skill by 25 points.,150,1800,65,50,Creature Enchantment,0.15,28,16,0,0,1 -854,Deception Mastery Self V,Increases the caster's Deception skill by 30 points.,200,1800,65,60,Creature Enchantment,0.2,28,16,0,0,1 -855,Deception Mastery Self VI,Increases the caster's Deception skill by 35 points.,250,2700,65,70,Creature Enchantment,0.3,28,16,0,0,1 -856,Deception Mastery Other I,Increases the target's Deception skill by 10 points.,1,1800,65,10,Creature Enchantment,0.01,28,16,0,1,1 -857,Deception Mastery Other II,Increases the target's Deception skill by 15 points.,50,1800,65,20,Creature Enchantment,0.05,28,16,5,0.85,1 -858,Deception Mastery Other III,Increases the target's Deception skill by 20 points.,100,1800,65,30,Creature Enchantment,0.1,28,16,5,0.7,1 -859,Deception Mastery Other IV,Increases the target's Deception skill by 25 points.,150,1800,65,40,Creature Enchantment,0.15,28,16,5,0.55,1 -860,Deception Mastery Other V,Increases the target's Deception skill by 30 points.,200,1800,65,50,Creature Enchantment,0.2,28,16,5,0.4,1 -861,Deception Mastery Other VI,Increases the target's Deception skill by 35 points.,250,2700,65,60,Creature Enchantment,0.3,28,16,5,0.25,1 -862,Deception Ineptitude Self I,Decreases the caster's Deception skill by 10 points.,1,60,66,15,Creature Enchantment,0.01,29,16,0,0,1 -863,Deception Ineptitude Self II,Decreases the caster's Deception skill by 15 points.,75,90,66,30,Creature Enchantment,0.05,29,16,0,0,1 -864,Deception Ineptitude Self III,Decreases the caster's Deception skill by 20 points.,125,120,66,40,Creature Enchantment,0.1,29,16,0,0,1 -865,Deception Ineptitude Self IV,Decreases the caster's Deception skill by 25 points.,175,150,66,50,Creature Enchantment,0.15,29,16,0,0,1 -866,Deception Ineptitude Self V,Decreases the caster's Deception skill by 30 points.,225,180,66,60,Creature Enchantment,0.2,29,16,0,0,1 -867,Deception Ineptitude Self VI,Decreases the caster's Deception skill by 35 points.,275,210,66,70,Creature Enchantment,0.3,29,16,0,0,1 -868,Deception Ineptitude Other I,Decreases the target's Deception skill by 10 points.,1,60,66,10,Creature Enchantment,0.01,29,16,0,1,1 -869,Deception Ineptitude Other II,Decreases the target's Deception skill by 15 points.,75,90,66,20,Creature Enchantment,0.05,29,16,5,0.85,1 -870,Deception Ineptitude Other III,Decreases the target's Deception skill by 20 points.,125,120,66,30,Creature Enchantment,0.1,29,16,5,0.7,1 -871,Deception Ineptitude Other IV,Decreases the target's Deception skill by 25 points.,175,150,66,40,Creature Enchantment,0.15,29,16,5,0.55,1 -872,Deception Ineptitude Other V,Decreases the target's Deception skill by 30 points.,225,180,66,50,Creature Enchantment,0.2,29,16,5,0.4,1 -873,Deception Ineptitude Other VI,Decreases the target's Deception skill by 35 points.,275,210,66,60,Creature Enchantment,0.3,29,16,5,0.25,1 -874,Healing Mastery Self I,Increases the caster's Healing skill by 10 points.,1,1800,67,15,Creature Enchantment,0.01,20,16,0,0,1 -875,Healing Mastery Self II,Increases the caster's Healing skill by 15 points.,50,1800,67,30,Creature Enchantment,0.05,20,16,0,0,1 -876,Healing Mastery Self III,Increases the caster's Healing skill by 20 points.,100,1800,67,40,Creature Enchantment,0.1,20,16,0,0,1 -877,Healing Mastery Self IV,Increases the caster's Healing skill by 25 points.,150,1800,67,50,Creature Enchantment,0.15,20,16,0,0,1 -878,Healing Mastery Self V,Increases the caster's Healing skill by 30 points.,200,1800,67,60,Creature Enchantment,0.2,20,16,0,0,1 -879,Healing Mastery Self VI,Increases the caster's Healing skill by 35 points.,250,2700,67,70,Creature Enchantment,0.3,20,16,0,0,1 -880,Healing Mastery Other I,Increases the target's Healing skill by 10 points.,1,1800,67,10,Creature Enchantment,0.01,20,16,0,1,1 -881,Healing Mastery Other II,Increases the target's Healing skill by 15 points.,50,1800,67,20,Creature Enchantment,0.05,20,16,5,0.85,1 -882,Healing Mastery Other III,Increases the target's Healing skill by 20 points.,100,1800,67,30,Creature Enchantment,0.1,20,16,5,0.7,1 -883,Healing Mastery Other IV,Increases the target's Healing skill by 25 points.,150,1800,67,40,Creature Enchantment,0.15,20,16,5,0.55,1 -884,Healing Mastery Other V,Increases the target's Healing skill by 30 points.,200,1800,67,50,Creature Enchantment,0.2,20,16,5,0.4,1 -885,Healing Mastery Other VI,Increases the target's Healing skill by 35 points.,250,2700,67,60,Creature Enchantment,0.3,20,16,5,0.25,1 -886,Healing Ineptitude Self I,Decreases the caster's Healing skill by 10 points.,1,60,68,15,Creature Enchantment,0.01,21,16,0,0,1 -887,Healing Ineptitude Self II,Decreases the caster's Healing skill by 15 points.,75,90,68,30,Creature Enchantment,0.05,21,16,0,0,1 -888,Healing Ineptitude Self III,Decreases the caster's Healing skill by 20 points.,125,120,68,40,Creature Enchantment,0.1,21,16,0,0,1 -889,Healing Ineptitude Self IV,Decreases the caster's Healing skill by 25 points.,175,150,68,50,Creature Enchantment,0.15,21,16,0,0,1 -890,Healing Ineptitude Self V,Decreases the caster's Healing skill by 30 points.,225,180,68,60,Creature Enchantment,0.2,21,16,0,0,1 -891,Healing Ineptitude Self VI,Decreases the caster's Healing skill by 35 points.,275,210,68,70,Creature Enchantment,0.3,21,16,0,0,1 -892,Healing Ineptitude Other I,Decreases the target's Healing skill by 10 points.,1,60,68,10,Creature Enchantment,0.01,29,16,0,1,1 -893,Healing Ineptitude Other II,Decreases the target's Healing skill by 15 points.,75,90,68,20,Creature Enchantment,0.05,21,16,5,0.85,1 -894,Healing Ineptitude Other III,Decreases the target's Healing skill by 20 points.,125,120,68,30,Creature Enchantment,0.1,21,16,5,0.7,1 -895,Healing Ineptitude Other IV,Decreases the target's Healing skill by 25 points.,175,150,68,40,Creature Enchantment,0.15,21,16,5,0.55,1 -896,Healing Ineptitude Other V,Decreases the target's Healing skill by 30 points.,225,180,68,50,Creature Enchantment,0.2,21,16,5,0.4,1 -897,Healing Ineptitude Other VI,Decreases the target's Healing skill by 35 points.,275,210,68,60,Creature Enchantment,0.3,21,16,5,0.25,1 -898,Leadership Mastery Self I,Increases the caster's Leadership skill by 10 points.,1,1800,71,15,Creature Enchantment,0.01,20,16,0,0,1 -899,Leadership Mastery Self II,Increases the caster's Leadership skill by 15 points.,25,1800,71,20,Creature Enchantment,0.05,20,16,0,0,1 -900,Leadership Mastery Self III,Increases the caster's Leadership skill by 20 points.,75,1800,71,30,Creature Enchantment,0.1,20,16,0,0,1 -901,Leadership Mastery Self IV,Increases the caster's Leadership skill by 25 points.,125,1800,71,40,Creature Enchantment,0.15,20,16,0,0,1 -902,Leadership Mastery Self V,Increases the caster's Leadership skill by 30 points.,200,1800,71,50,Creature Enchantment,0.2,20,16,0,0,1 -903,Leadership Mastery Self VI,Increases the caster's Leadership skill by 35 points.,250,2700,71,60,Creature Enchantment,0.3,20,16,0,0,1 -904,Leadership Mastery Other I,Increases the target's Leadership skill by 10 points.,1,1800,71,10,Creature Enchantment,0.01,20,16,0,1,1 -905,Leadership Mastery Other II,Increases the target's Leadership skill by 15 points.,50,1800,71,20,Creature Enchantment,0.05,20,16,5,0.85,1 -906,Leadership Mastery Other III,Increases the target's Leadership skill by 20 points.,100,1800,71,30,Creature Enchantment,0.1,20,16,5,0.7,1 -907,Leadership Mastery Other IV,Increases the target's Leadership skill by 25 points.,150,1800,71,40,Creature Enchantment,0.15,20,16,5,0.55,1 -908,Leadership Mastery Other V,Increases the target's Leadership skill by 30 points.,200,1800,71,50,Creature Enchantment,0.2,20,16,5,0.4,1 -909,Leadership Mastery Other VI,Increases the target's Leadership skill by 35 points.,250,2700,71,60,Creature Enchantment,0.3,20,16,5,0.25,1 -910,Leadership Ineptitude Self I,Decreases the caster's Leadership skill by 10 points.,1,60,72,15,Creature Enchantment,0.01,21,16,0,0,1 -911,Leadership Ineptitude Self II,Decreases the caster's Leadership skill by 15 points.,75,90,72,30,Creature Enchantment,0.05,21,16,0,0,1 -912,Leadership Ineptitude Self III,Decreases the caster's Leadership skill by 20 points.,125,120,72,40,Creature Enchantment,0.1,21,16,0,0,1 -913,Leadership Ineptitude Self IV,Decreases the caster's Leadership skill by 25 points.,175,150,72,50,Creature Enchantment,0.15,21,16,0,0,1 -914,Leadership Ineptitude Self V,Decreases the caster's Leadership skill by 30 points.,225,180,72,60,Creature Enchantment,0.2,21,16,0,0,1 -915,Leadership Ineptitude Self VI,Decreases the caster's Leadership skill by 35 points.,275,210,72,70,Creature Enchantment,0.3,21,16,0,0,1 -916,Leadership Ineptitude Other I,Decreases the target's Leadership skill by 10 points.,1,60,72,10,Creature Enchantment,0.01,21,16,0,1,1 -917,Leadership Ineptitude Other II,Decreases the target's Leadership skill by 15 points.,75,90,72,20,Creature Enchantment,0.05,21,16,5,0.85,1 -918,Leadership Ineptitude Other III,Decreases the target's Leadership skill by 20 points.,125,120,72,30,Creature Enchantment,0.1,21,16,5,0.7,1 -919,Leadership Ineptitude Other IV,Decreases the target's Leadership skill by 25 points.,175,150,72,40,Creature Enchantment,0.15,21,16,5,0.55,1 -920,Leadership Ineptitude Other V,Decreases the target's Leadership skill by 30 points.,225,180,72,50,Creature Enchantment,0.2,21,16,5,0.4,1 -921,Leadership Ineptitude Other VI,Decreases the target's Leadership skill by 35 points.,275,210,72,60,Creature Enchantment,0.3,21,16,5,0.25,1 -922,Lockpick Mastery Self I,Increases the caster's Lockpick skill by 10 points.,1,1800,73,15,Creature Enchantment,0.01,20,16,0,0,1 -923,Lockpick Mastery Self II,Increases the caster's Lockpick skill by 15 points.,50,1800,73,30,Creature Enchantment,0.05,20,16,0,0,1 -924,Lockpick Mastery Self III,Increases the caster's Lockpick skill by 20 points.,100,1800,73,40,Creature Enchantment,0.1,20,16,0,0,1 -925,Lockpick Mastery Self IV,Increases the caster's Lockpick skill by 25 points.,150,1800,73,50,Creature Enchantment,0.15,20,16,0,0,1 -926,Lockpick Mastery Self V,Increases the caster's Lockpick skill by 30 points.,200,1800,73,60,Creature Enchantment,0.2,20,16,0,0,1 -927,Lockpick Mastery Self VI,Increases the caster's Lockpick skill by 35 points.,250,2700,73,70,Creature Enchantment,0.3,20,16,0,0,1 -928,Lockpick Mastery Other I,Increases the target's Lockpick skill by 10 points.,1,1800,73,10,Creature Enchantment,0.01,20,16,0,1,1 -929,Lockpick Mastery Other II,Increases the target's Lockpick skill by 15 points.,50,1800,73,20,Creature Enchantment,0.05,20,16,5,0.85,1 -930,Lockpick Mastery Other III,Increases the target's Lockpick skill by 20 points.,100,1800,73,30,Creature Enchantment,0.1,20,16,5,0.7,1 -931,Lockpick Mastery Other IV,Increases the target's Lockpick skill by 25 points.,150,1800,73,40,Creature Enchantment,0.15,20,16,5,0.55,1 -932,Lockpick Mastery Other V,Increases the target's Lockpick skill by 30 points.,200,1800,73,50,Creature Enchantment,0.2,20,16,5,0.4,1 -933,Lockpick Mastery Other VI,Increases the target's Lockpick skill by 35 points.,250,2700,73,60,Creature Enchantment,0.3,20,16,5,0.25,1 -934,Lockpick Ineptitude Self I,Decreases the caster's Lockpick skill by 10 points.,1,60,74,15,Creature Enchantment,0.01,21,16,0,0,1 -935,Lockpick Ineptitude Self II,Decreases the caster's Lockpick skill by 15 points.,75,90,74,30,Creature Enchantment,0.05,21,16,0,0,1 -936,Lockpick Ineptitude Self III,Decreases the caster's Lockpick skill by 20 points.,125,120,74,40,Creature Enchantment,0.1,21,16,0,0,1 -937,Lockpick Ineptitude Self IV,Decreases the caster's Lockpick skill by 25 points.,175,150,74,50,Creature Enchantment,0.15,21,16,0,0,1 -938,Lockpick Ineptitude Self V,Decreases the caster's Lockpick skill by 30 points.,225,180,74,60,Creature Enchantment,0.2,21,16,0,0,1 -939,Lockpick Ineptitude Self VI,Decreases the caster's Lockpick skill by 35 points.,275,210,74,70,Creature Enchantment,0.3,21,16,0,0,1 -940,Lockpick Ineptitude Other I,Decreases the target's Lockpick skill by 10 points.,1,60,74,10,Creature Enchantment,0.01,21,16,0,1,1 -941,Lockpick Ineptitude Other II,Decreases the target's Lockpick skill by 15 points.,75,90,74,20,Creature Enchantment,0.05,21,16,5,0.85,1 -942,Lockpick Ineptitude Other III,Decreases the target's Lockpick skill by 20 points.,125,120,74,30,Creature Enchantment,0.1,21,16,5,0.7,1 -943,Lockpick Ineptitude Other IV,Decreases the target's Lockpick skill by 25 points.,175,150,74,40,Creature Enchantment,0.15,21,16,5,0.55,1 -944,Lockpick Ineptitude Other V,Decreases the target's Lockpick skill by 30 points.,225,180,74,50,Creature Enchantment,0.2,21,16,5,0.4,1 -945,Lockpick Ineptitude Other VI,Decreases the target's Lockpick skill by 35 points.,275,210,74,60,Creature Enchantment,0.3,21,16,5,0.25,1 -946,Fealty Self I,Increases the caster's Loyalty skill by 10 points.,1,1800,75,15,Creature Enchantment,0.01,20,16,0,0,1 -947,Fealty Self II,Increases the caster's Loyalty skill by 15 points.,50,1800,75,30,Creature Enchantment,0.05,20,16,0,0,1 -948,Fealty Self III,Increases the caster's Loyalty skill by 20 points.,100,1800,75,40,Creature Enchantment,0.1,20,16,0,0,1 -949,Fealty Self IV,Increases the caster's Loyalty skill by 25 points.,150,1800,75,50,Creature Enchantment,0.15,20,16,0,0,1 -950,Fealty Self V,Increases the caster's Loyalty skill by 30 points.,200,1800,75,60,Creature Enchantment,0.2,20,16,0,0,1 -951,Fealty Self VI,Increases the caster's Loyalty skill by 35 points.,250,2700,75,70,Creature Enchantment,0.3,20,16,0,0,1 -952,Fealty Other I,Increases the target's Loyalty skill by 10 points.,1,1800,75,10,Creature Enchantment,0.01,20,16,0,1,1 -953,Fealty Other II,Increases the target's Loyalty skill by 15 points.,50,1800,75,20,Creature Enchantment,0.05,20,16,5,0.85,1 -954,Fealty Other III,Increases the target's Loyalty skill by 20 points.,100,1800,75,30,Creature Enchantment,0.1,20,16,5,0.7,1 -955,Fealty Other IV,Increases the target's Loyalty skill by 25 points.,150,1800,75,40,Creature Enchantment,0.15,20,16,5,0.55,1 -956,Fealty Other V,Increases the target's Loyalty skill by 30 points.,200,1800,75,50,Creature Enchantment,0.2,20,16,5,0.4,1 -957,Fealty Other VI,Increases the target's Loyalty skill by 35 points.,250,2700,75,60,Creature Enchantment,0.3,20,16,5,0.25,1 -958,Faithlessness Self I,Decreases the caster's Loyalty skill by 10 points.,1,60,76,15,Creature Enchantment,0.01,21,16,0,0,1 -959,Faithlessness Self II,Decreases the caster's Loyalty skill by 15 points.,75,90,76,30,Creature Enchantment,0.05,21,16,0,0,1 -960,Faithlessness Self III,Decreases the caster's Loyalty skill by 20 points.,125,120,76,40,Creature Enchantment,0.1,21,16,0,0,1 -961,Faithlessness Self IV,Decreases the caster's Loyalty skill by 25 points.,175,150,76,50,Creature Enchantment,0.15,21,16,0,0,1 -962,Faithlessness Self V,Decreases the caster's Loyalty skill by 30 points.,225,180,76,60,Creature Enchantment,0.2,21,16,0,0,1 -963,Faithlessness Self VI,Decreases the caster's Loyalty skill by 35 points.,275,210,76,70,Creature Enchantment,0.3,21,16,0,0,1 -964,Faithlessness Other I,Decreases the target's Loyalty skill by 10 points.,1,60,76,10,Creature Enchantment,0.01,21,16,0,1,1 -965,Faithlessness Other II,Decreases the target's Loyalty skill by 15 points.,75,90,76,20,Creature Enchantment,0.05,21,16,5,0.85,1 -966,Faithlessness Other III,Decreases the target's Loyalty skill by 20 points.,125,120,76,30,Creature Enchantment,0.1,21,16,5,0.7,1 -967,Faithlessness Other IV,Decreases the target's Loyalty skill by 25 points.,175,150,76,40,Creature Enchantment,0.15,21,16,5,0.55,1 -968,Faithlessness Other V,Decreases the target's Loyalty skill by 30 points.,225,180,76,50,Creature Enchantment,0.2,21,16,5,0.4,1 -969,Faithlessness Other VI,Decreases the target's Loyalty skill by 35 points.,275,210,76,60,Creature Enchantment,0.3,21,16,5,0.25,1 -970,Jumping Mastery Self I,Increases the caster's Jump skill by 10 points.,1,1800,69,15,Creature Enchantment,0.01,24,16,0,0,1 -971,Jumping Mastery Self II,Increases the caster's Jump skill by 15 points.,50,1800,69,30,Creature Enchantment,0.05,24,16,0,0,1 -972,Jumping Mastery Self III,Increases the caster's Jump skill by 20 points.,100,1800,69,40,Creature Enchantment,0.1,24,16,0,0,1 -973,Jumping Mastery Self IV,Increases the caster's Jump skill by 25 points.,150,1800,69,50,Creature Enchantment,0.15,24,16,0,0,1 -974,Jumping Mastery Self V,Increases the caster's Jump skill by 30 points.,200,1800,69,60,Creature Enchantment,0.2,24,16,0,0,1 -975,Jumping Mastery Self VI,Increases the caster's Jump skill by 35 points.,250,2700,69,70,Creature Enchantment,0.3,24,16,0,0,1 -976,Jumping Mastery Other I,Increases the target's Jump skill by 10 points.,1,1800,69,10,Creature Enchantment,0.01,24,16,0,1,1 -977,Jumping Mastery Other II,Increases the target's Jump skill by 15 points.,50,1800,69,20,Creature Enchantment,0.05,24,16,5,0.85,1 -978,Jumping Mastery Other III,Increases the target's Jump skill by 20 points.,100,1800,69,30,Creature Enchantment,0.1,24,16,5,0.7,1 -979,Jumping Mastery Other IV,Increases the target's Jump skill by 25 points.,150,1800,69,40,Creature Enchantment,0.15,24,16,5,0.55,1 -980,Jumping Mastery Other V,Increases the target's Jump skill by 30 points.,200,1800,69,50,Creature Enchantment,0.2,24,16,5,0.4,1 -981,Jumping Mastery Other VI,Increases the target's Jump skill by 35 points.,250,2700,69,60,Creature Enchantment,0.3,24,16,5,0.25,1 -982,Sprint Self I,Increases the caster's Run skill by 10 points.,1,1800,77,15,Creature Enchantment,0.01,24,16,0,0,1 -983,Sprint Self II,Increases the caster's Run skill by 15 points.,50,1800,77,30,Creature Enchantment,0.05,24,16,0,0,1 -984,Sprint Self III,Increases the caster's Run skill by 20 points.,100,1800,77,40,Creature Enchantment,0.1,24,16,0,0,1 -985,Sprint Self IV,Increases the caster's Run skill by 25 points.,150,1800,77,50,Creature Enchantment,0.15,24,16,0,0,1 -986,Sprint Self V,Increases the caster's Run skill by 30 points.,200,1800,77,60,Creature Enchantment,0.2,24,16,0,0,1 -987,Sprint Self VI,Increases the caster's Run skill by 35 points.,250,2700,77,70,Creature Enchantment,0.3,24,16,0,0,1 -988,Sprint Other I,Increases the target's Run skill by 10 points.,1,1800,77,10,Creature Enchantment,0.01,24,16,0,1,1 -989,Sprint Other II,Increases the target's Run skill by 15 points.,50,1800,77,20,Creature Enchantment,0.05,24,16,5,0.85,1 -990,Sprint Other III,Increases the target's Run skill by 20 points.,100,1800,77,30,Creature Enchantment,0.1,24,16,5,0.7,1 -991,Sprint Other IV,Increases the target's Run skill by 25 points.,150,1800,77,40,Creature Enchantment,0.15,24,16,5,0.55,1 -992,Sprint Other V,Increases the target's Run skill by 30 points.,200,1800,77,50,Creature Enchantment,0.2,24,16,5,0.4,1 -993,Sprint Other VI,Increases the target's Run skill by 35 points.,250,2700,77,60,Creature Enchantment,0.3,24,16,5,0.25,1 -994,Leaden Feet Self I,Decreases the caster's Run skill by 10 points.,1,60,78,15,Creature Enchantment,0.01,25,16,0,0,1 -995,Leaden Feet Self II,Decreases the caster's Run skill by 15 points.,75,90,78,30,Creature Enchantment,0.05,25,16,0,0,1 -996,Leaden Feet Self III,Decreases the caster's Run skill by 20 points.,125,120,78,40,Creature Enchantment,0.1,25,16,0,0,1 -997,Leaden Feet Self IV,Decreases the caster's Run skill by 25 points.,175,150,78,50,Creature Enchantment,0.15,25,16,0,0,1 -998,Leaden Feet Self V,Decreases the caster's Run skill by 30 points.,225,180,78,60,Creature Enchantment,0.2,25,16,0,0,1 -999,Leaden Feet Self VI,Decreases the caster's Run skill by 35 points.,275,210,78,70,Creature Enchantment,0.3,25,16,0,0,1 -1000,Leaden Feet Other I,Decreases the target's Run skill by 10 points.,1,60,78,10,Creature Enchantment,0.01,25,16,0,1,1 -1001,Leaden Feet Other II,Decreases the target's Run skill by 15 points.,75,90,78,20,Creature Enchantment,0.05,25,16,5,0.85,1 -1002,Leaden Feet Other III,Decreases the target's Run skill by 20 points.,125,120,78,30,Creature Enchantment,0.1,25,16,5,0.7,1 -1003,Leaden Feet Other IV,Decreases the target's Run skill by 25 points.,175,150,78,40,Creature Enchantment,0.15,25,16,5,0.55,1 -1004,Leaden Feet Other V,Decreases the target's Run skill by 30 points.,225,180,78,50,Creature Enchantment,0.2,25,16,5,0.4,1 -1005,Leaden Feet Other VI,Decreases the target's Run skill by 35 points.,275,210,78,60,Creature Enchantment,0.3,25,16,5,0.25,1 -1006,Jumping Ineptitude Self I,Decreases the caster's Jump skill by 10 points.,1,60,70,15,Creature Enchantment,0.01,25,16,0,0,1 -1007,Jumping Ineptitude Self II,Decreases the caster's Jump skill by 15 points.,75,90,70,30,Creature Enchantment,0.05,25,16,0,0,1 -1008,Jumping Ineptitude Self III,Decreases the caster's Jump skill by 20 points.,125,120,70,40,Creature Enchantment,0.1,25,16,0,0,1 -1009,Jumping Ineptitude Self IV,Decreases the caster's Jump skill by 25 points.,175,150,70,50,Creature Enchantment,0.15,25,16,0,0,1 -1010,Jumping Ineptitude Self V,Decreases the caster's Jump skill by 30 points.,225,180,70,60,Creature Enchantment,0.2,25,16,0,0,1 -1011,Jumping Ineptitude Self VI,Decreases the caster's Jump skill by 35 points.,275,210,70,70,Creature Enchantment,0.3,25,16,0,0,1 -1012,Jumping Ineptitude Other I,Decreases the target's Jump skill by 10 points.,1,60,70,10,Creature Enchantment,0.01,25,16,0,1,1 -1013,Jumping Ineptitude Other II,Decreases the target's Jump skill by 15 points.,75,90,70,20,Creature Enchantment,0.05,25,16,5,0.85,1 -1014,Jumping Ineptitude Other III,Decreases the target's Jump skill by 20 points.,125,120,70,30,Creature Enchantment,0.1,25,16,5,0.7,1 -1015,Jumping Ineptitude Other IV,Decreases the target's Jump skill by 25 points.,175,150,70,40,Creature Enchantment,0.1,25,16,5,0.55,1 -1016,Jumping Ineptitude Other V,Decreases the target's Jump skill by 30 points.,225,180,70,50,Creature Enchantment,0.15,25,16,5,0.4,1 -1017,Jumping Ineptitude Other VI,Decreases the target's Jump skill by 35 points.,275,210,70,60,Creature Enchantment,0.3,25,16,5,0.25,1 -1018,Bludgeoning Protection Self I,Reduces damage the caster takes from Bludgeoning by 9%.,1,1800,103,15,Life Magic,0.01,55,16,0,0,0 -1019,Bludgeoning Protection Self II,Reduces damage the caster takes from Bludgeoning by 20%.,50,1800,103,30,Life Magic,0.05,55,16,0,0,0 -1020,Bludgeoning Protection Self III,Reduces damage the caster takes from Bludgeoning by 33%.,100,1800,103,40,Life Magic,0.1,55,16,0,0,0 -1021,Bludgeoning Protection Self IV,Reduces damage the caster takes from Bludgeoning by 43%.,150,1800,103,50,Life Magic,0.15,55,16,0,0,0 -1022,Bludgeoning Protection Self V,Reduces damage the caster takes from Bludgeoning by 50%.,200,1800,103,60,Life Magic,0.2,55,16,0,0,0 -1023,Bludgeoning Protection Self VI,Reduces damage the caster takes from Bludgeoning by 60%.,250,2700,103,70,Life Magic,0.3,55,16,0,0,0 -1024,Bludgeoning Protection Other I,Reduces damage the target takes from Bludgeoning by 9%.,1,1800,103,10,Life Magic,0.01,55,16,5,1,0 -1025,Bludgeoning Protection Other II,Reduces damage the target takes from Bludgeoning by 20%.,50,1800,103,30,Life Magic,0.05,55,16,5,0.85,0 -1026,Bludgeoning Protection Other III,Reduces damage the target takes from Bludgeoning by 33%.,100,1800,103,30,Life Magic,0.1,55,16,5,0.7,0 -1027,Bludgeoning Protection Other IV,Reduces damage the target takes from Bludgeoning by 43%.,150,1800,103,40,Life Magic,0.15,55,16,5,0.55,0 -1028,Bludgeoning Protection Other V,Reduces damage the target takes from Bludgeoning by 50%.,200,1800,103,50,Life Magic,0.2,55,16,5,0.4,0 -1029,Bludgeoning Protection Other VI,Reduces damage the target takes from Bludgeoning by 60%.,250,2700,103,60,Life Magic,0.3,55,16,5,0.25,0 -1030,Cold Protection Self I,Reduces damage the caster takes from Cold by 9%.,1,1800,105,15,Life Magic,0.01,51,16,0,0,0 -1031,Cold Protection Self II,Reduces damage the caster takes from Cold by 20%.,50,1800,105,30,Life Magic,0.05,51,16,0,0,0 -1032,Cold Protection Self III,Reduces damage the caster takes from Cold by 33%.,100,1800,105,40,Life Magic,0.1,51,16,0,0,0 -1033,Cold Protection Self IV,Reduces damage the caster takes from Cold by 43%.,150,1800,105,50,Life Magic,0.15,51,16,0,0,0 -1034,Cold Protection Self V,Reduces damage the caster takes from Cold by 50%.,200,1800,105,60,Life Magic,0.2,51,16,0,0,0 -1035,Cold Protection Self VI,Reduces damage the caster takes from Cold by 60%.,250,2700,105,70,Life Magic,0.3,51,16,0,0,0 -1036,Cold Protection Other I,Reduces damage the target takes from Cold by 9%.,1,1800,105,10,Life Magic,0.01,51,16,5,1,0 -1037,Cold Protection Other II,Reduces damage the target takes from Cold by 20%.,50,1800,105,20,Life Magic,0.05,51,16,5,0.85,0 -1038,Cold Protection Other III,Reduces damage the target takes from Cold by 33%.,100,1800,105,30,Life Magic,0.1,51,16,5,0.7,0 -1039,Cold Protection Other IV,Reduces damage the target takes from Cold by 43%.,150,1800,105,40,Life Magic,0.15,51,16,5,0.55,0 -1040,Cold Protection Other V,Reduces damage the target takes from Cold by 50%.,200,1800,105,50,Life Magic,0.2,51,16,5,0.4,0 -1041,Cold Protection Other VI,Reduces damage the target takes from Cold by 60%.,250,2700,105,60,Life Magic,0.3,51,16,5,0.25,0 -1042,Bludgeoning Vulnerability Self I,Increases damage the caster takes from Bludgeoning by 10%.,25,60,104,15,Life Magic,0.01,56,16,0,0,1 -1043,Bludgeoning Vulnerability Self II,Increases damage the caster takes from Bludgeoning by 25%.,75,90,104,30,Life Magic,0.05,56,16,0,0,1 -1044,Bludgeoning Vulnerability Self III,Increases damage the caster takes from Bludgeoning by 50%.,125,120,104,40,Life Magic,0.1,56,16,0,0,1 -1045,Bludgeoning Vulnerability Self IV,Increases damage the caster takes from Bludgeoning by 75%.,175,150,104,50,Life Magic,0.15,56,16,0,0,1 -1046,Bludgeoning Vulnerability Self V,Increases damage the caster takes from Bludgeoning by 100%.,225,180,104,60,Life Magic,0.2,56,16,0,0,1 -1047,Bludgeoning Vulnerability Self VI,Increases damage the caster takes from Bludgeoning by 150%.,275,210,104,70,Life Magic,0.3,56,16,0,0,1 -1048,Bludgeoning Vulnerability Other I,Increases damage the target takes from Bludgeoning by 10%.,25,60,104,10,Life Magic,0.01,56,16,5,1,1 -1049,Bludgeoning Vulnerability Other II,Increases damage the target takes from Bludgeoning by 25%.,75,90,104,20,Life Magic,0.05,56,16,5,0.85,1 -1050,Bludgeoning Vulnerability Other III,Increases damage the target takes from Bludgeoning by 50%.,125,120,104,30,Life Magic,0.1,56,16,5,0.7,1 -1051,Bludgeoning Vulnerability Other IV,Increases damage the target takes from Bludgeoning by 75%.,175,150,104,40,Life Magic,0.15,56,16,5,0.55,1 -1052,Bludgeoning Vulnerability Other V,Increases damage the target takes from Bludgeoning by 100%.,225,180,104,50,Life Magic,0.2,56,16,5,0.4,1 -1053,Bludgeoning Vulnerability Other VI,Increases damage the target takes from Bludgeoning by 150%.,275,210,104,60,Life Magic,0.3,56,16,5,0.25,1 -1054,Cold Vulnerability Self I,Increases damage the caster takes from Cold by 10%.,25,60,106,15,Life Magic,0.01,52,16,0,0,1 -1055,Cold Vulnerability Self II,Increases damage the caster takes from Cold by 25%.,75,90,106,30,Life Magic,0.05,52,16,0,0,1 -1056,Cold Vulnerability Self III,Increases damage the caster takes from Cold by 50%.,125,120,106,40,Life Magic,0.1,52,16,0,0,1 -1057,Cold Vulnerability Self IV,Increases damage the caster takes from Cold by 75%.,175,150,106,50,Life Magic,0.15,52,16,0,0,1 -1058,Cold Vulnerability Self V,Increases damage the caster takes from Cold by 100%.,225,180,106,60,Life Magic,0.2,52,16,0,0,1 -1059,Cold Vulnerability Self VI,Increases damage the caster takes from Cold by 150%.,275,210,106,70,Life Magic,0.3,52,16,0,0,1 -1060,Cold Vulnerability Other I,Increases damage the target takes from Cold by 10%.,25,60,106,10,Life Magic,0.01,52,16,5,1,1 -1061,Cold Vulnerability Other II,Increases damage the target takes from Cold by 25%.,75,90,106,20,Life Magic,0.05,52,16,5,0.85,1 -1062,Cold Vulnerability Other III,Increases damage the target takes from Cold by 50%.,125,120,106,30,Life Magic,0.1,52,16,5,0.7,1 -1063,Cold Vulnerability Other IV,Increases damage the target takes from Cold by 75%.,175,150,106,40,Life Magic,0.15,52,16,5,0.55,1 -1064,Cold Vulnerability Other V,Increases damage the target takes from Cold by 100%.,225,180,106,50,Life Magic,0.2,52,16,5,0.4,1 -1065,Cold Vulnerability Other VI,Increases damage the target takes from Cold by 150%.,275,210,106,60,Life Magic,0.3,52,16,5,0.25,1 -1066,Lightning Protection Self I,Reduces damage the caster takes from Lightning by 9%.,1,1800,107,15,Life Magic,0.01,53,16,0,0,0 -1067,Lightning Protection Self II,Reduces damage the caster takes from Lightning by 20%.,50,1800,107,30,Life Magic,0.05,53,16,0,0,0 -1068,Lightning Protection Self III,Reduces damage the caster takes from Lightning by 33%.,100,1800,107,40,Life Magic,0.1,53,16,0,0,0 -1069,Lightning Protection Self IV,Reduces damage the caster takes from Lightning by 43%.,150,1800,107,50,Life Magic,0.15,53,16,0,0,0 -1070,Lightning Protection Self V,Reduces damage the caster takes from Lightning by 50%.,200,1800,107,60,Life Magic,0.2,53,16,0,0,0 -1071,Lightning Protection Self VI,Reduces damage the caster takes from Lightning by 60%.,250,2700,107,70,Life Magic,0.3,53,16,0,0,0 -1072,Lightning Protection Other I,Reduces damage the target takes from Lightning by 9%.,1,1800,107,10,Life Magic,0.01,53,16,5,1,0 -1073,Lightning Protection Other II,Reduces damage the target takes from Lightning by 20%.,50,1800,107,20,Life Magic,0.05,53,16,5,0.85,0 -1074,Lightning Protection Other III,Reduces damage the target takes from Lightning by 33%.,100,1800,107,30,Life Magic,0.1,53,16,5,0.7,0 -1075,Lightning Protection Other IV,Reduces damage the target takes from Lightning by 43%.,150,1800,107,40,Life Magic,0.15,53,16,5,0.55,0 -1076,Lightning Protection Other V,Reduces damage the target takes from Lightning by 50%.,200,1800,107,50,Life Magic,0.2,53,16,5,0.4,0 -1077,Lightning Protection Other VI,Reduces damage the target takes from Lightning by 60%.,250,2700,107,60,Life Magic,0.3,53,16,5,0.25,0 -1078,Lightning Vulnerability Self I,Increases damage the caster takes from Lightning by 10%.,25,60,108,15,Life Magic,0.01,54,16,0,0,1 -1079,Lightning Vulnerability Self II,Increases damage the caster takes from Lightning by 25%.,75,90,108,30,Life Magic,0.05,54,16,0,0,1 -1080,Lightning Vulnerability Self III,Increases damage the caster takes from Lightning by 50%.,125,120,108,40,Life Magic,0.1,54,16,0,0,1 -1081,Lightning Vulnerability Self IV,Increases damage the caster takes from Lightning by 75%.,175,150,108,50,Life Magic,0.15,54,16,0,0,1 -1082,Lightning Vulnerability Self V,Increases damage the caster takes from Lightning by 100%.,225,180,108,60,Life Magic,0.2,54,16,0,0,1 -1083,Lightning Vulnerability Self VI,Increases damage the caster takes from Lightning by 150%.,275,210,108,70,Life Magic,0.3,54,16,0,0,1 -1084,Lightning Vulnerability Other I,Increases damage the target takes from Lightning by 10%.,25,60,108,10,Life Magic,0.01,54,16,5,1,1 -1085,Lightning Vulnerability Other II,Increases damage the target takes from Lightning by 25%.,75,90,108,20,Life Magic,0.05,54,16,5,0.85,1 -1086,Lightning Vulnerability Other III,Increases damage the target takes from Lightning by 50%.,125,120,108,30,Life Magic,0.1,54,16,5,0.7,1 -1087,Lightning Vulnerability Other IV,Increases damage the target takes from Lightning by 75%.,175,150,108,40,Life Magic,0.15,54,16,5,0.55,1 -1088,Lightning Vulnerability Other V,Increases damage the target takes from Lightning by 100%.,225,180,108,50,Life Magic,0.2,54,16,5,0.4,1 -1089,Lightning Vulnerability Other VI,Increases damage the target takes from Lightning by 150%.,275,210,108,60,Life Magic,0.3,54,16,5,0.25,1 -1090,Fire Protection Self II,Reduces damage the caster takes from Fire by 20%.,50,1800,109,30,Life Magic,0.05,43,16,0,0,0 -1091,Fire Protection Self III,Reduces damage the caster takes from Fire by 33%.,100,1800,109,40,Life Magic,0.1,43,16,0,0,0 -1092,Fire Protection Self IV,Reduces damage the caster takes from Fire by 43%.,150,1800,109,50,Life Magic,0.15,43,16,0,0,0 -1093,Fire Protection Self V,Reduces damage the caster takes from Fire by 50%.,200,1800,109,60,Life Magic,0.2,43,16,0,0,0 -1094,Fire Protection Self VI,Reduces damage the caster takes from Fire by 60%.,250,2700,109,70,Life Magic,0.3,43,16,0,0,0 -1095,Fire Protection Other V,Reduces damage the target takes from fire by 50%.,200,1800,109,50,Life Magic,0.2,43,16,5,0.4,0 -1096,Fire Protection Other VI,Reduces damage the target takes from fire by 60%.,250,2700,109,60,Life Magic,0.3,43,16,5,0.25,0 -1097,Flaming Missile,CREATURE MAGIC ONLY!,1,-1,122,10,War Magic,0,0,16,30,0.7,1 -1098,Fire Vulnerability Self II,Increases damage the caster takes from Fire by 25%.,75,90,110,30,Life Magic,0.05,44,16,0,0,1 -1099,Fire Vulnerability Self III,Increases damage the caster takes from Fire by 50%.,125,120,110,40,Life Magic,0.1,44,16,0,0,1 -1100,Fire Vulnerability Self IV,Increases damage the caster takes from Fire by 75%.,175,150,110,50,Life Magic,0.15,44,16,0,0,1 -1101,Fire Vulnerability Self V,Increases damage the caster takes from Fire by 100%.,225,180,110,60,Life Magic,0.2,44,16,0,0,1 -1102,Fire Vulnerability Self VI,Increases damage the caster takes from Fire by 150%.,275,210,110,70,Life Magic,0.3,44,16,0,0,1 -1104,Fire Vulnerability Other II,Increases damage the target takes from Fire by 25%.,75,90,110,20,Life Magic,0.05,44,16,5,0.85,1 -1105,Fire Vulnerability Other III,Increases damage the target takes from Fire by 50%.,125,120,110,30,Life Magic,0.1,44,16,5,0.7,1 -1106,Fire Vulnerability Other IV,Increases damage the target takes from Fire by 75%.,175,150,110,40,Life Magic,0.15,44,16,5,0.55,1 -1107,Fire Vulnerability Other V,Increases damage the target takes from Fire by 100%.,225,180,110,50,Life Magic,0.2,44,16,5,0.4,1 -1108,Fire Vulnerability Other VI,Increases damage the target takes from Fire by 150%.,275,210,110,60,Life Magic,0.3,44,16,5,0.25,1 -1109,Blade Protection Self I,Reduces damage the caster takes from Slashing by 9%.,1,1800,113,15,Life Magic,0.01,47,16,0,0,0 -1110,Blade Protection Self II,Reduces damage the caster takes from Slashing by 20%.,50,1800,113,30,Life Magic,0.05,47,16,0,0,0 -1111,Blade Protection Self III,Reduces damage the caster takes from Slashing by 33%.,100,1800,113,40,Life Magic,0.1,47,16,0,0,0 -1112,Blade Protection Self IV,Reduces damage the caster takes from Slashing by 43%.,150,1800,113,50,Life Magic,0.15,47,16,0,0,0 -1113,Blade Protection Self V,Reduces damage the caster takes from Slashing by 50%.,200,1800,113,60,Life Magic,0.2,47,16,0,0,0 -1114,Blade Protection Self VI,Reduces damage the caster takes from Slashing by 60%.,250,2700,113,70,Life Magic,0.3,47,16,0,0,0 -1115,Blade Protection Other I,Reduces damage the target takes from Slashing by 9%.,1,1800,113,10,Life Magic,0.01,47,16,5,1,0 -1116,Blade Protection Other II,Reduces damage the target takes from Slashing by 20%.,50,1800,113,20,Life Magic,0.05,47,16,5,0.85,0 -1117,Blade Protection Other III,Reduces damage the target takes from Slashing by 33%.,100,1800,113,30,Life Magic,0.1,47,16,5,0.7,0 -1118,Blade Protection Other IV,Reduces damage the target takes from Slashing by 43%.,150,1800,113,40,Life Magic,0.15,47,16,5,0.55,0 -1119,Blade Protection Other V,Reduces damage the target takes from Slashing by 50%.,200,1800,113,50,Life Magic,0.2,47,16,5,0.4,0 -1120,Blade Protection Other VI,Reduces damage the target takes from Slashing by 60%.,250,2700,113,60,Life Magic,0.3,47,16,5,0.25,0 -1121,Blade Vulnerability Self I,Increases damage the caster takes from Slashing by 10%.,25,60,114,15,Life Magic,0.01,48,16,0,0,1 -1122,Blade Vulnerability Self II,Increases damage the caster takes from Slashing by 25%.,75,90,114,30,Life Magic,0.05,48,16,0,0,1 -1123,Blade Vulnerability Self III,Increases damage the caster takes from Slashing by 50%.,125,120,114,40,Life Magic,0.1,48,16,0,0,1 -1124,Blade Vulnerability Self IV,Increases damage the caster takes from Slashing by 75%.,175,150,114,50,Life Magic,0.15,48,16,0,0,1 -1125,Blade Vulnerability Self V,Increases damage the caster takes from Slashing by 100%.,225,180,114,60,Life Magic,0.2,48,16,0,0,1 -1126,Blade Vulnerability Self VI,Increases damage the caster takes from Slashing by 150%.,275,210,114,70,Life Magic,0.3,48,16,0,0,1 -1127,Blade Vulnerability Other I,Increases damage the target takes from Slashing by 10%.,25,60,114,10,Life Magic,0.01,48,16,5,1,1 -1128,Blade Vulnerability Other II,Increases damage the target takes from Slashing by 25%.,75,90,114,20,Life Magic,0.05,48,16,5,0.85,1 -1129,Blade Vulnerability Other III,Increases damage the target takes from Slashing by 50%.,125,120,114,30,Life Magic,0.1,48,16,5,0.7,1 -1130,Blade Vulnerability Other IV,Increases damage the target takes from Slashing by 75%.,175,150,114,40,Life Magic,0.15,48,16,5,0.55,1 -1131,Blade Vulnerability Other V,Increases damage the target takes from Slashing by 100%.,225,180,114,50,Life Magic,0.2,48,16,5,0.4,1 -1132,Blade Vulnerability Other VI,Increases damage the target takes from Slashing by 150%.,275,210,114,60,Life Magic,0.3,48,16,5,0.25,1 -1133,Piercing Protection Self I,Reduces damage the caster takes from Piercing by 9%.,1,1800,111,15,Life Magic,0.01,45,16,5,0,0 -1134,Piercing Protection Self II,Reduces damage the caster takes from Piercing by 20%.,50,1800,111,30,Life Magic,0.05,45,16,5,0.85,0 -1135,Piercing Protection Self III,Reduces damage the caster takes from Piercing by 33%.,100,1800,111,40,Life Magic,0.1,45,16,5,0.7,0 -1136,Piercing Protection Self IV,Reduces damage the caster takes from Piercing by 43%.,150,1800,111,50,Life Magic,0.15,45,16,5,0.55,0 -1137,Piercing Protection Self V,Reduces damage the caster takes from Piercing by 50%.,200,1800,111,60,Life Magic,0.2,45,16,5,0.4,0 -1138,Piercing Protection Self VI,Reduces damage the caster takes from Piercing by 60%.,250,2700,111,70,Life Magic,0.3,45,16,5,0.25,0 -1139,Piercing Protection Other I,Reduces damage the target takes from Piercing by 9%.,1,1800,111,10,Life Magic,0.01,45,16,5,1,0 -1140,Piercing Protection Other II,Reduces damage the target takes from Piercing by 20%.,50,1800,111,20,Life Magic,0.05,45,16,5,0.85,0 -1141,Piercing Protection Other III,Reduces damage the target takes from Piercing by 33%.,100,1800,111,30,Life Magic,0.1,45,16,5,0.7,0 -1142,Piercing Protection Other IV,Reduces damage the target takes from Piercing by 43%.,150,1800,111,40,Life Magic,0.15,45,16,5,0.55,0 -1143,Piercing Protection Other V,Reduces damage the target takes from Piercing by 50%.,200,1800,111,50,Life Magic,0.2,45,16,5,0.4,0 -1144,Piercing Protection Other VI,Reduces damage the target takes from Piercing by 60%.,250,2700,111,60,Life Magic,0.3,45,16,5,0.25,0 -1145,Piercing Vulnerability Self I,Increases damage the caster takes from Piercing by 10%.,25,60,112,15,Life Magic,0.01,46,16,0,0,1 -1146,Piercing Vulnerability Self II,Increases damage the caster takes from Piercing by 25%.,75,90,112,30,Life Magic,0.05,46,16,0,0,1 -1147,Piercing Vulnerability Self III,Increases damage the caster takes from Piercing by 50%.,125,120,112,40,Life Magic,0.1,46,16,0,0,1 -1148,Piercing Vulnerability Self IV,Increases damage the caster takes from Piercing by 75%.,175,150,112,50,Life Magic,0.15,46,16,0,0,1 -1149,Piercing Vulnerability Self V,Increases damage the caster takes from Piercing by 100%.,225,180,112,60,Life Magic,0.2,46,16,0,0,1 -1150,Piercing Vulnerability Self VI,Increases damage the caster takes from Piercing by 150%.,275,210,112,70,Life Magic,0.3,46,16,0,0,1 -1151,Piercing Vulnerability Other I,Increases damage the target takes from Piercing by 10%.,25,60,112,10,Life Magic,0.01,46,16,5,1,1 -1152,Piercing Vulnerability Other II,Increases damage the target takes from Piercing by 25%.,75,90,112,20,Life Magic,0.05,46,16,5,0.85,1 -1153,Piercing Vulnerability Other III,Increases damage the target takes from Piercing by 50%.,125,120,112,30,Life Magic,0.1,46,16,5,0.7,1 -1154,Piercing Vulnerability Other IV,Increases damage the target takes from Piercing by 75%.,175,150,112,40,Life Magic,0.15,46,16,5,0.55,1 -1155,Piercing Vulnerability Other V,Increases damage the target takes from Piercing by 100%.,225,180,112,50,Life Magic,0.2,46,16,5,0.4,1 -1156,Piercing Vulnerability Other VI,Increases damage the target takes from Piercing by 150%.,275,210,112,60,Life Magic,0.3,46,16,5,0.25,1 -1157,Heal Self II,Restores 15-35 points of the caster's Health.,50,-1,67,30,Life Magic,0.05,31,16,0,0,1 -1158,Heal Self III,Restores 20-45 points of the caster's Health.,100,-1,67,40,Life Magic,0.1,31,16,0,0,1 -1159,Heal Self IV,Restores 30-60 points of the caster's Health.,150,-1,67,50,Life Magic,0.15,31,16,0,0,1 -1160,Heal Self V,Restores 45-90 points of the caster's Health.,200,-1,67,60,Life Magic,0.2,31,16,0,0,1 -1161,Heal Self VI,Restores 55-120 points of the caster's Health.,250,-1,67,70,Life Magic,0.3,31,16,0,0,1 -1162,Heal Other II,Restores 15-35 points of the target's Health.,50,-1,79,20,Life Magic,0.05,31,16,5,0.85,1 -1163,Heal Other III,Restores 20-45 points of the target's Health.,100,-1,79,30,Life Magic,0.1,31,16,5,0.7,1 -1164,Heal Other IV,Restores 30-60 points of the target's Health.,150,-1,79,40,Life Magic,0.15,31,16,5,0.55,1 -1165,Heal Other V,Restores 45-90 points of the target's Health.,200,-1,79,50,Life Magic,0.2,31,16,5,0.55,1 -1166,Heal Other VI,Restores 55-120 points of the target's Health.,250,-1,79,60,Life Magic,0.3,31,16,5,0.25,1 -1167,Harm Self II,Drains 7-12 points of the caster's Health.,75,-1,80,30,Life Magic,0.05,32,16,0,0,1 -1168,Harm Self III,Drains 10-18 points of the caster's Health.,125,-1,80,40,Life Magic,0.1,32,16,0,0,1 -1169,Harm Self IV,Drains 16-30 points of the caster's Health.,175,-1,80,50,Life Magic,0.1,32,16,0,0,1 -1170,Harm Self V,Drains 23-45 points of the caster's Health.,225,-1,80,60,Life Magic,0.2,32,16,0,0,1 -1171,Harm Self VI,Drains 31-60 points of the caster's Health.,275,-1,80,70,Life Magic,0.3,32,16,0,0,1 -1172,Harm Other II,Drains 7-12 points of the target's Health.,75,-1,80,20,Life Magic,0.05,32,16,15,0,1 -1173,Harm Other III,Drains 10-19 points of the target's Health.,125,-1,80,30,Life Magic,0.1,32,16,20,0,1 -1174,Harm Other IV,Drains 16-33 points of the target's Health.,175,-1,80,40,Life Magic,0.15,32,16,25,0,1 -1175,Harm Other V,Drains 24-47 points of the target's Health.,225,-1,80,50,Life Magic,0.2,32,16,30,0,1 -1176,Harm Other VI,Drains 33-63 points of the target's Health.,275,-1,80,60,Life Magic,0.3,32,16,33,0,1 -1177,Revitalize Self I,Restores 15-35 points of the caster's Stamina.,1,-1,81,15,Life Magic,0.01,35,16,0,0,1 -1178,Revitalize Self II,Restores 20-45 points of the caster's Stamina.,50,-1,81,30,Life Magic,0.05,35,16,0,0,1 -1179,Revitalize Self III,Restores 30-60 points of the caster's Stamina.,100,-1,81,40,Life Magic,0.1,35,16,0,0,1 -1180,Revitalize Self IV,Restores 40-80 points of the caster's Stamina.,150,-1,81,50,Life Magic,0.15,35,16,0,0,1 -1181,Revitalize Self V,Restores 60-120 points of the caster's Stamina.,200,-1,81,60,Life Magic,0.2,35,16,0,0,1 -1182,Revitalize Self VI,Restores 80-160 points of the caster's Stamina.,250,-1,81,70,Life Magic,0.3,35,16,0,0,1 -1183,Revitalize Other I,Restores 15-35 points of the target's Stamina.,1,-1,81,10,Life Magic,0.01,35,16,5,0.85,1 -1184,Revitalize Other II,Restores 20-45 points of the target's Stamina.,50,-1,81,20,Life Magic,0.05,35,16,5,0.85,1 -1185,Revitalize Other III,Restores 30-60 points of the target's Stamina.,100,-1,81,30,Life Magic,0.1,35,16,5,0.7,1 -1186,Revitalize Other IV,Restores 40-80 points of the target's Stamina.,150,-1,81,40,Life Magic,0.15,35,16,5,0.55,1 -1187,Revitalize Other V,Restores 60-120 points of the target's Stamina.,200,-1,81,50,Life Magic,0.2,35,16,5,0.4,1 -1188,Revitalize Other VI,Restores 80-160 points of the target's Stamina.,250,-1,81,60,Life Magic,0.05,35,16,5,0.25,1 -1189,Enfeeble Self I,Drains 7-12 points of the caster's Stamina.,15,-1,82,15,Life Magic,0.01,36,16,0,0,1 -1190,Enfeeble Self II,Drains 7-12 points of the caster's Stamina.,75,-1,82,20,Life Magic,0.05,36,16,0,0,1 -1191,Enfeeble Self III,Drains 16-30 points of the caster's Stamina.,125,-1,82,40,Life Magic,0.1,36,16,0,0,1 -1192,Enfeeble Self IV,Drains 23-45 points of the caster's Stamina.,175,-1,82,50,Life Magic,0.15,36,16,0,0,1 -1193,Enfeeble Self V,Drains 31-60 points of the caster's Stamina.,225,-1,82,60,Life Magic,0.2,36,16,0,0,1 -1194,Enfeeble Self VI,Drains 38-75 points of the caster's Stamina.,275,-1,82,70,Life Magic,0.3,36,16,0,0,1 -1195,Enfeeble Other I,Drains 7-12 points of the target's Stamina.,1,-1,82,10,Life Magic,0.01,36,16,10,0,1 -1196,Enfeeble Other II,Drains 10-19 points of the target's Stamina.,75,-1,82,20,Life Magic,0.05,36,16,15,0,1 -1197,Enfeeble Other III,Drains 16-31 points of the target's Stamina.,125,-1,82,30,Life Magic,0.05,36,16,20,0,1 -1198,Enfeeble Other IV,Drains 24-47 points of the target's Stamina.,175,-1,82,40,Life Magic,0.05,36,16,25,0,1 -1199,Enfeeble Other V,Drains 32-63 points of the target's Stamina.,225,-1,82,50,Life Magic,0.05,36,16,30,0,1 -1200,Enfeeble Other VI,Drains 39-79 points of the target's Stamina.,275,-1,82,60,Life Magic,0.05,36,16,33,0,1 -1201,Mana Boost Self I,Restores 6-10 points of the caster's Mana.,1,-1,83,15,Life Magic,0.01,33,16,0,0,1 -1202,Mana Boost Self II,Restores 11-20 points of the caster's Mana.,50,-1,83,30,Life Magic,0.05,33,16,0,0,1 -1203,Mana Boost Self III,Restores 16-30 points of the caster's Mana.,100,-1,83,40,Life Magic,0.1,33,16,0,0,1 -1204,Mana Boost Self IV,Restores 26-50 points of the caster's Mana.,150,-1,83,50,Life Magic,0.15,33,16,0,0,1 -1205,Mana Boost Self V,Restores 38-75 points of the caster's Mana.,200,-1,83,60,Life Magic,0.2,33,16,0,0,1 -1206,Mana Boost Self VI,Restores 51-100 points of the caster's Mana.,250,-1,83,70,Life Magic,0.3,33,16,0,0,1 -1207,Mana Boost Other I,Restores 6-10 points of the target's Mana.,1,-1,83,10,Life Magic,0.01,33,16,0,1,1 -1208,Mana Boost Other II,Restores 11-20 points of the target's Mana.,50,-1,83,20,Life Magic,0.05,33,16,5,0.85,1 -1209,Mana Boost Other III,Restores 16-30 points of the target's Mana.,100,-1,83,30,Life Magic,0.1,33,16,5,0.7,1 -1210,Mana Boost Other IV,Restores 26-50 points of the target's Mana.,150,-1,83,40,Life Magic,0.15,33,16,5,0.55,1 -1211,Mana Boost Other V,Restores 38-75 points of the target's Mana.,200,-1,83,50,Life Magic,0.2,33,16,5,0.4,1 -1212,Mana Boost Other VI,Restores 51-100 points of the target's Mana.,250,-1,83,60,Life Magic,0.3,33,16,5,0.25,1 -1213,Mana Drain Self I,Drains 4-6 points of the caster's Mana.,15,-1,84,15,Life Magic,0.01,34,16,0,0,1 -1214,Mana Drain Self II,Drains 7-12 points of the caster's Mana.,75,-1,84,30,Life Magic,0.05,34,16,0,0,1 -1215,Mana Drain Self III,Drains 10-18 points of the caster's Mana.,125,-1,84,40,Life Magic,0.1,34,16,0,0,1 -1216,Mana Drain Self IV,Drains 16-30 points of the caster's Mana.,175,-1,84,50,Life Magic,0.15,34,16,0,0,1 -1217,Mana Drain Self V,Drains 23-45 points of the caster's Mana.,225,-1,84,60,Life Magic,0.2,34,16,0,0,1 -1218,Mana Drain Self VI,Drains 31-60 points of the caster's Mana.,275,-1,84,70,Life Magic,0.3,34,16,0,0,1 -1219,Mana Drain Other I,Drains 4-6 points of the target's Mana.,1,-1,84,10,Life Magic,0.01,34,16,10,0,1 -1220,Mana Drain Other II,Drains 7-12 points of the target's Mana.,75,-1,84,20,Life Magic,0.05,34,16,15,0,1 -1221,Mana Drain Other III,Drains 10-19 points of the target's Mana.,125,-1,84,30,Life Magic,0.1,34,16,20,0,1 -1222,Mana Drain Other IV,Drains 16-31 points of the target's Mana.,175,-1,84,40,Life Magic,0.15,34,16,25,0,1 -1223,Mana Drain Other V,Drains 24-47 points of the target's Mana.,225,-1,84,50,Life Magic,0.2,34,16,30,0,1 -1224,Mana Drain Other VI,Drains 32-63 points of the target's Mana.,275,-1,84,60,Life Magic,0.3,34,16,33,0,1 -1225,Infuse Health Other I,Drains one-quarter of the caster's Health and gives 75% of that to the target.,1,-1,88,10,Life Magic,0.1,31,16,5,0.5,0 -1226,Infuse Health Other II,Drains one-quarter of the caster's Health and gives 90% of that to the target.,50,-1,88,20,Life Magic,0.15,31,16,5,0.4,0 -1227,Infuse Health Other III,Drains one-quarter of the caster's Health and gives 105% of that to the target.,75,-1,88,30,Life Magic,0.2,31,16,5,0.3,0 -1228,Infuse Health Other IV,Drains one-quarter of the caster's Health and gives 120% of that to the target.,150,-1,88,40,Life Magic,0.3,31,16,5,0.2,0 -1229,Infuse Health Other V,Drains one-quarter of the caster's Health and gives 135% of that to the target.,200,-1,88,50,Life Magic,0.5,31,16,5,0.1,0 -1230,Infuse Health Other VI,Drains one-quarter of the caster's Health and gives 150% of that to the target.,250,-1,88,60,Life Magic,0.75,31,16,5,0.1,0 -1237,Drain Health Other I,Drains 25% of the target's Health and gives 200% of it to the caster.,38,-1,87,10,Life Magic,0.1,32,16,10,0,0 -1238,Drain Health Other II,Drains 25% of the target's Health and gives 160% of it to the caster.,88,-1,87,20,Life Magic,0.15,32,16,15,0,0 -1239,Drain Health Other III,Drains 25% of the target's Health and gives 133% of it to the caster.,138,-1,87,30,Life Magic,0.2,32,16,20,0,0 -1240,Drain Health Other IV,Drains one-quarter of the target's Health and gives 100% of it to the caster.,188,-1,87,40,Life Magic,0.3,32,16,25,0,0 -1241,Drain Health Other V,Drains 30% of the target's Health and gives 100% of it to the caster.,238,-1,87,50,Life Magic,0.5,32,16,30,0,0 -1242,Drain Health Other VI,Drains 40% of the target's Health and gives 75% of it to the caster.,288,-1,87,60,Life Magic,0.75,32,16,33,0,0 -1243,Infuse Stamina Other I,Drains one-quarter of the caster's Stamina and gives 75% of that to the target.,1,-1,90,10,Life Magic,0.1,35,16,5,0.5,0 -1244,Infuse Stamina Other II,Drains one-quarter of the caster's Stamina and gives 90% of that to the target.,50,-1,90,20,Life Magic,0.15,35,16,5,0.4,0 -1245,Infuse Stamina Other III,Drains one-quarter of the caster's Stamina and gives 105% of that to the target.,100,-1,90,30,Life Magic,0.2,35,16,5,0.3,0 -1246,Infuse Stamina Other IV,Drains one-quarter of the caster's Stamina and gives 120% of that to the target.,150,-1,90,40,Life Magic,0.3,35,16,5,0.3,0 -1247,Infuse Stamina Other V,Drains one-quarter of the caster's Stamina and gives 135% of that to the target.,200,-1,90,50,Life Magic,0.5,35,16,5,0.1,0 -1248,Infuse Stamina Other VI,Drains one-quarter of the caster's Stamina and gives 150% of that to the target.,250,-1,90,60,Life Magic,0.75,35,16,5,0.1,0 -1249,Drain Stamina Other I,Drains 10% of the target's Stamina and gives it to the caster.,38,-1,89,10,Life Magic,0.1,36,16,10,0,0 -1250,Drain Stamina Other II,Drains 15% of the target's Stamina and gives it to the caster.,88,-1,89,20,Life Magic,0.15,36,16,15,0,0 -1251,Drain Stamina Other III,Drains 20% of the target's Stamina and gives it to the caster.,138,-1,89,30,Life Magic,0.2,36,16,20,0,0 -1252,Drain Stamina Other IV,Drains one-quarter of the target's Stamina and gives it to the caster.,188,-1,89,40,Life Magic,0.3,36,16,25,0,0 -1253,Drain Stamina Other V,Drains 30% of the target's Stamina and gives it to the caster.,238,-1,89,50,Life Magic,0.5,36,16,30,0,0 -1254,Drain Stamina Other VI,Drains 40% of the target's Stamina and gives it to the caster.,288,-1,89,60,Life Magic,0.75,36,16,33,0,0 -1255,Infuse Mana Other II,Drains one-quarter of the caster's Mana and gives 90% of that to the target.,50,-1,92,20,Life Magic,0.15,33,16,5,0.4,0 -1256,Infuse Mana Other III,Drains one-quarter of the caster's Mana and gives 105% of that to the target.,100,-1,92,30,Life Magic,0.2,33,16,5,0.3,0 -1257,Infuse Mana Other IV,Drains one-quarter of the caster's Mana and gives 120% of that to the target.,150,-1,92,40,Life Magic,0.3,33,16,5,0.2,0 -1258,Infuse Mana Other V,Drains one-quarter of the caster's Mana and gives 135% of that to the target.,200,-1,92,50,Life Magic,0.5,33,16,5,0.1,0 -1259,Infuse Mana Other VI,Drains one-quarter of the caster's Mana and gives 150% of that to the target.,250,-1,92,60,Life Magic,0.75,33,16,5,0.1,0 -1260,Drain Mana Other I,Drains 10% of the target's Mana and gives it to the caster.,38,-1,91,10,Life Magic,0.1,34,16,10,0,0 -1261,Drain Mana Other II,Drains 15% of the target's Mana and gives it to the caster.,88,-1,91,20,Life Magic,0.15,34,16,15,0,0 -1262,Drain Mana Other III,Drains 20% of the target's Mana and gives it to the caster.,138,-1,91,30,Life Magic,0.2,34,16,20,0,0 -1263,Drain Mana Other IV,Drains one-quarter of the target's Mana and gives it to the caster.,188,-1,91,40,Life Magic,0.3,34,16,25,0,0 -1264,Drain Mana Other V,Drains 30% of the target's Mana and gives it to the caster.,238,-1,91,50,Life Magic,0.5,34,16,30,0,0 -1265,Drain Mana Other VI,Drains 40% of the target's Mana and gives it to the caster.,288,-1,91,60,Life Magic,0.75,34,16,33,0,0 -1266,Health to Stamina Other I,Drains one-half of the target's Health and gives 75% of that to his/her Stamina.,1,-1,87,10,Life Magic,0.01,73,16,5,0,0 -1267,Health to Stamina Other II,Drains one-half of the target's Health and gives 90% of that to his/her Stamina.,50,-1,87,20,Life Magic,0.05,73,16,5,0,0 -1268,Health to Stamina Other III,Drains one-half of the target's Health and gives 105% of that to his/her Stamina.,100,-1,87,30,Life Magic,0.1,73,16,5,0,0 -1269,Health to Stamina Other IV,Drains one-half of the target's Health and gives 120% of that to his/her Stamina.,150,-1,87,40,Life Magic,0.15,73,16,5,0,0 -1270,Health to Stamina Other V,Drains one-half of the target's Health and gives 135% of that to his/her Stamina.,200,-1,87,50,Life Magic,0.2,73,16,5,0,0 -1271,Health to Stamina Other VI,Drains one-half of the target's Health and gives 150% of that to his/her Stamina.,250,-1,87,60,Life Magic,0.3,73,16,5,0,0 -1272,Health to Stamina Self I,Drains one-half of the caster's Health and gives 90% of that to his/her Stamina (maximum of 50).,1,-1,87,10,Life Magic,0.01,73,16,0,0,0 -1273,Health to Stamina Self II,Drains one-half of the caster's Health and gives 100% of that to his/her Stamina (maximum of 100).,50,-1,87,20,Life Magic,0.05,73,16,0,0,0 -1274,Health to Stamina Self III,Drains one-half of the caster's Health and gives 110% of that to his/her Stamina (maximum of 150).,100,-1,87,30,Life Magic,0.1,73,16,0,0,0 -1275,Health to Stamina Self IV,Drains one-half of the caster's Health and gives 120% of that to his/her Stamina (maximum of 200).,150,-1,87,40,Life Magic,0.15,73,16,0,0,0 -1276,Health to Stamina Self V,Drains one-half of the caster's Health and gives 135% of that to his/her Stamina.,200,-1,87,50,Life Magic,0.2,73,16,0,0,0 -1277,Health to Stamina Self VI,Drains one-half of the caster's Health and gives 150% of that to his/her Stamina.,250,-1,87,60,Life Magic,0.3,73,16,0,0,0 -1278,Health to Mana Self I,Drains one-half of the caster's Health and gives 90% of that to his/her Mana (maximum of 50).,1,-1,87,10,Life Magic,0.01,74,16,0,0,0 -1279,Health to Mana Self II,Drains one-half of the caster's Health and gives 100% of that to his/her Mana (maximum of 100).,50,-1,87,20,Life Magic,0.05,74,16,0,0,0 -1280,Health to Mana Self III,Drains one-half of the caster's Health and gives 110% of that to his/her Mana (maximum of 150).,100,-1,87,30,Life Magic,0.1,74,16,0,0,0 -1281,Health to Mana Other IV,Drains one-half of the target's Health and gives 120% of that to his/her Mana.,150,-1,87,40,Life Magic,0.15,74,16,5,0,0 -1282,Health to Mana Other V,Drains one-half of the target's Health and gives 135% of that to his/her Mana.,200,-1,87,50,Life Magic,0.2,74,16,5,0,0 -1283,Health to Mana Other VI,Drains one-half of the target's Health and gives 150% of that to his/her Mana.,250,-1,87,60,Life Magic,0.3,74,16,5,0,0 -1284,Mana to Health Other I,Drains one-half of the target's Mana and gives 75% of that to his/her Health.,1,-1,91,10,Life Magic,0.01,77,16,5,0,0 -1285,Mana to Health Other II,Drains one-half of the target's Mana and gives 90% of that to his/her Health.,50,-1,91,20,Life Magic,0.05,77,16,5,0,0 -1286,Mana to Health Other III,Drains one-half of the target's Mana and gives 105% of that to his/her Health.,100,-1,91,30,Life Magic,0.1,77,16,5,0,0 -1287,Mana to Health Other IV,Drains one-half of the target's Mana and gives 120% of that to his/her Health.,150,-1,91,40,Life Magic,0.15,77,16,5,0,0 -1288,Mana to Health Other V,Drains one-half of the target's Mana and gives 135% of that to his/her Health.,200,-1,91,50,Life Magic,0.2,77,16,5,0,0 -1289,Mana to Health Other VI,Drains one-half of the target's Mana and gives 150% of that to his/her Health.,250,-1,91,60,Life Magic,0.3,77,16,5,0,0 -1290,Mana to Health Self I,Drains one-half of the caster's Mana and gives 90% of that to his/her Health (maximum of 50).,1,-1,91,10,Life Magic,0.01,77,16,0,0,0 -1291,Mana to Health Self II,Drains one-half of the caster's Mana and gives 100% of that to his/her Health (maximum of 100).,50,-1,91,20,Life Magic,0.05,77,16,0,0,0 -1292,Mana to Health Self III,Drains one-half of the caster's Mana and gives 110% of that to his/her Health (maximum of 150).,100,-1,91,30,Life Magic,0.1,77,16,0,0,0 -1293,Mana to Health Self IV,Drains one-half of the caster's Mana and gives 120% of that to his/her Health (maximum of 200).,150,-1,91,40,Life Magic,0.15,77,16,0,0,0 -1294,Mana to Health Self V,Drains one-half of the caster's Mana and gives 135% of that to his/her Health.,200,-1,91,50,Life Magic,0.2,77,16,0,0,0 -1295,Mana to Health Self VI,Drains one-half of the caster's Mana and gives 150% of that to his/her Health.,250,-1,91,60,Life Magic,0.3,77,16,0,0,0 -1296,Mana to Stamina Self I,Drains one-half of the caster's Mana and gives 90% of that to his/her Stamina (maximum of 50).,1,-1,91,10,Life Magic,0.01,78,16,0,0,0 -1297,Mana to Stamina Self II,Drains one-half of the caster's Mana and gives 100% of that to his/her Stamina (maximum of 100).,50,-1,91,20,Life Magic,0.05,78,16,0,0,0 -1298,Mana to Stamina Self III,Drains one-half of the caster's Mana and gives 110% of that to his/her Stamina (maximum of 150).,100,-1,91,30,Life Magic,0.1,78,16,0,0,0 -1299,Mana to Stamina Self IV,Drains one-half of the caster's Mana and gives 120% of that to his/her Stamina (maximum of 200).,150,-1,91,40,Life Magic,0.15,78,16,0,0,0 -1300,Mana to Stamina Self V,Drains one-half of the caster's Mana and gives 135% of that to his/her Stamina.,200,-1,91,50,Life Magic,0.2,78,16,0,0,0 -1301,Mana to Stamina Self VI,Drains one-half of the caster's Mana and gives 150% of that to his/her Stamina.,250,-1,91,60,Life Magic,0.3,78,16,0,0,0 -1302,Mana to Stamina Other I,Drains one-half of the target's Mana and gives 75% of that to his/her stamina.,1,-1,91,10,Life Magic,0.01,78,16,5,0,0 -1303,Mana to Stamina Other II,Drains one-half of the target's Mana and gives 90% of that to his/her stamina.,50,-1,91,20,Life Magic,0.05,78,16,5,0,0 -1304,Mana to Stamina Other III,Drains one-half of the target's Mana and gives 105% of that to his/her stamina.,100,-1,91,30,Life Magic,0.1,78,16,5,0,0 -1305,Mana to Stamina Other IV,Drains one-half of the target's Mana and gives 120% of that to his/her stamina.,150,-1,91,40,Life Magic,0.15,78,16,5,0,0 -1306,Mana to Stamina Other V,Drains one-half of the target's Mana and gives 135% of that to his/her stamina.,200,-1,91,50,Life Magic,0.2,78,16,5,0,0 -1307,Mana to Stamina Other VI,Drains one-half of the target's Mana and gives 150% of that to his/her stamina.,250,-1,91,60,Life Magic,0.3,78,16,5,0,0 -1308,Armor Self II,Increases the caster's natural armor by 50 points.,50,1800,115,30,Life Magic,0.05,55,16,0,0,1 -1309,Armor Self III,Increases the caster's natural armor by 75 points.,100,1800,115,40,Life Magic,0.1,55,16,0,0,1 -1310,Armor Self IV,Increases the caster's natural armor by 100 points.,150,1800,115,50,Life Magic,0.15,55,16,0,0,1 -1311,Armor Self V,Increases the caster's natural armor by 150 points.,200,1800,115,60,Life Magic,0.2,55,16,0,0,1 -1312,Armor Self VI,Increases the caster's natural armor by 200 points.,250,2700,115,70,Life Magic,0.3,55,16,0,0,1 -1313,Armor Other II,Increases the target's natural armor by 50 points.,50,1800,115,20,Life Magic,0.05,55,16,5,0.85,1 -1314,Armor Other III,Increases the target's natural armor by 75 points.,100,1800,115,30,Life Magic,0.1,55,16,5,0.7,1 -1315,Armor Other IV,Increases the target's natural armor by 100 points.,150,1800,115,40,Life Magic,0.15,55,16,5,0.55,1 -1316,Armor Other V,Increases the target's natural armor by 150 points.,200,1800,115,50,Life Magic,0.2,55,16,5,0.4,1 -1317,Armor Other VI,Increases the target's natural armor by 200 points.,250,2700,115,60,Life Magic,0.3,55,16,5,0.25,1 -1318,Imperil Self II,Decreases the caster's natural armor by 50 points.,75,90,116,30,Life Magic,0.05,56,16,0,0,1 -1319,Imperil Self III,Decreases the caster's natural armor by 75 points.,125,120,116,40,Life Magic,0.1,56,16,0,0,1 -1320,Imperil Self IV,Decreases the caster's natural armor by 100 points.,175,150,116,50,Life Magic,0.15,56,16,0,0,1 -1321,Imperil Self V,Decreases the caster's natural armor by 150 points.,225,180,116,60,Life Magic,0.2,56,16,0,0,1 -1322,Imperil Self VI,Decreases the caster's natural armor by 200 points.,275,210,116,70,Life Magic,0.3,56,16,0,0,1 -1323,Imperil Other II,Decreases the target's natural armor by 50 points.,75,90,116,20,Life Magic,0.05,56,16,5,0.85,1 -1324,Imperil Other III,Decreases the target's natural armor by 75 points.,125,120,116,30,Life Magic,0.1,56,16,5,0.7,1 -1325,Imperil Other IV,Decreases the target's natural armor by 100 points.,175,150,116,40,Life Magic,0.15,56,16,5,0.55,1 -1326,Imperil Other V,Decreases the target's natural armor by 150 points.,225,180,116,50,Life Magic,0.2,56,16,5,0.4,1 -1327,Imperil Other VI,Decreases the target's natural armor by 200 points.,275,210,116,60,Life Magic,0.3,56,16,5,0.25,1 -1328,Strength Self II,Increases the caster's Strength by 15 points.,50,1800,1,30,Creature Enchantment,0.05,6,16,0,0,1 -1329,Strength Self III,Increases the caster's Strength by 20 points.,100,1800,1,40,Creature Enchantment,0.1,6,16,0,0,1 -1330,Strength Self IV,Increases the caster's Strength by 25 points.,150,1800,1,50,Creature Enchantment,0.15,6,16,0,0,1 -1331,Strength Self V,Increases the caster's Strength by 30 points.,200,1800,1,60,Creature Enchantment,0.2,6,16,0,0,1 -1332,Strength Self VI,Increases the caster's Strength by 35 points.,250,2700,1,70,Creature Enchantment,0.3,6,16,0,0,1 -1333,Strength Other II,Increases the target's Strength by 15 points.,50,1800,1,20,Creature Enchantment,0.05,6,16,5,0.85,1 -1334,Strength Other III,Increases the target's Strength by 20 points.,100,1800,1,30,Creature Enchantment,0.1,6,16,5,0.7,1 -1335,Strength Other IV,Increases the target's Strength by 25 points.,150,1800,1,40,Creature Enchantment,0.15,6,16,5,0.55,1 -1336,Strength Other V,Increases the target's Strength by 30 points.,200,1800,1,50,Creature Enchantment,0.2,6,16,5,0.4,1 -1337,Strength Other VI,Increases the target's Strength by 35 points.,250,2700,1,60,Creature Enchantment,0.3,6,16,5,0.25,1 -1339,Weakness Other II,Decreases the target's Strength by 15 points.,75,90,2,20,Creature Enchantment,0.05,7,16,5,0.85,1 -1340,Weakness Other III,Decreases the target's Strength by 20 points.,125,120,2,30,Creature Enchantment,0.1,7,16,5,0.7,1 -1341,Weakness Other IV,Decreases the target's Strength by 25 points.,175,150,2,40,Creature Enchantment,0.15,7,16,5,0.55,1 -1342,Weakness Other V,Decreases the target's Strength by 30 points.,225,180,2,50,Creature Enchantment,0.2,7,16,5,0.4,1 -1343,Weakness Other VI,Decreases the target's Strength by 35 points.,275,210,2,60,Creature Enchantment,0.3,7,16,5,0.25,1 -1344,Weakness Self II,Decrease the caster's Strength by 15 points.,75,90,2,30,Creature Enchantment,0.05,7,16,0,0,1 -1345,Weakness Self III,Decrease the caster's Strength by 20 points.,125,120,2,40,Creature Enchantment,0.1,7,16,0,0,1 -1346,Weakness Self IV,Decrease the caster's Strength by 25 points.,175,150,2,50,Creature Enchantment,0.15,7,16,0,0,1 -1347,Weakness Self V,Decrease the caster's Strength by 30 points.,250,180,2,60,Creature Enchantment,0.2,7,16,0,0,1 -1348,Weakness Self VI,Decrease the caster's Strength by 35 points.,275,210,2,70,Creature Enchantment,0.2,7,16,0,0,1 -1349,Endurance Self I,Increases the caster's Endurance by 10 points.,1,1800,3,15,Creature Enchantment,0.01,10,16,0,0,1 -1350,Endurance Self II,Increases the caster's Endurance by 15 points.,50,1800,3,30,Creature Enchantment,0.05,10,16,0,0,1 -1351,Endurance Self III,Increases the caster's Endurance by 20 points.,100,1800,3,40,Creature Enchantment,0.1,10,16,0,0,1 -1352,Endurance Self IV,Increases the caster's Endurance by 25 points.,150,1800,3,50,Creature Enchantment,0.15,10,16,0,0,1 -1353,Endurance Self V,Increases the caster's Endurance by 30 points.,200,1800,3,60,Creature Enchantment,0.2,10,16,0,0,1 -1354,Endurance Self VI,Increases the caster's Endurance by 35 points.,250,2700,3,70,Creature Enchantment,0.3,10,16,0,0,1 -1355,Endurance Other I,Increases the target's Endurance by 10 points.,1,1800,3,10,Creature Enchantment,0.01,10,16,0,1,1 -1356,Endurance Other II,Increases the target's Endurance by 15 points.,50,1800,3,20,Creature Enchantment,0.05,10,16,5,0.85,1 -1357,Endurance Other III,Increases the target's Endurance by 20 points.,100,1800,3,30,Creature Enchantment,0.1,10,16,5,0.7,1 -1358,Endurance Other IV,Increases the target's Endurance by 25 points.,150,1800,3,40,Creature Enchantment,0.15,10,16,5,0.55,1 -1359,Endurance Other V,Increases the target's Endurance by 30 points.,200,1800,3,50,Creature Enchantment,0.2,10,16,5,0.4,1 -1360,Endurance Other VI,Increases the target's Endurance by 35 points.,250,2700,3,60,Creature Enchantment,0.3,10,16,5,0.25,1 -1361,Frailty Self I,Decreases the caster's Endurance by 10 points.,15,60,4,15,Creature Enchantment,0.01,11,16,0,0,1 -1362,Frailty Self II,Decreases the caster's Endurance by 15 points.,75,90,4,30,Creature Enchantment,0.05,11,16,0,0,1 -1363,Frailty Self III,Decreases the caster's Endurance by 20 points.,125,120,4,40,Creature Enchantment,0.1,11,16,0,0,1 -1364,Frailty Self IV,Decreases the caster's Endurance by 25 points.,175,150,4,50,Creature Enchantment,0.15,11,16,0,0,1 -1365,Frailty Self V,Decreases the caster's Endurance by 30 points.,250,180,4,60,Creature Enchantment,0.2,11,16,0,0,1 -1366,Frailty Self VI,Decreases the caster's Endurance by 35 points.,275,210,4,70,Creature Enchantment,0.3,11,16,0,0,1 -1367,Frailty Other I,Decreases the target's Endurance by 10 points.,1,60,4,10,Creature Enchantment,0.01,11,16,0,1,1 -1368,Frailty Other II,Decreases the target's Endurance by 15 points.,75,90,4,20,Creature Enchantment,0.05,11,16,5,0.85,1 -1369,Frailty Other III,Decreases the target's Endurance by 20 points.,125,120,4,30,Creature Enchantment,0.1,11,16,5,0.7,1 -1370,Frailty Other IV,Decreases the target's Endurance by 25 points.,175,150,4,40,Creature Enchantment,0.15,11,16,5,0.55,1 -1371,Frailty Other V,Decreases the target's Endurance by 30 points.,225,180,4,50,Creature Enchantment,0.2,11,16,5,0.4,1 -1372,Frailty Other VI,Decreases the target's Endurance by 35 points.,275,210,4,60,Creature Enchantment,0.3,11,16,5,0.25,1 -1373,Coordination Self I,Increases the caster's Coordination by 10 points.,1,1800,7,15,Creature Enchantment,0.01,8,16,0,0,1 -1374,Coordination Self II,Increases the caster's Coordination by 15 points.,50,1800,7,30,Creature Enchantment,0.05,8,16,0,0,1 -1375,Coordination Self III,Increases the caster's Coordination by 20 points.,100,1800,7,40,Creature Enchantment,0.1,8,16,0,0,1 -1376,Coordination Self IV,Increases the caster's Coordination by 25 points.,150,1800,7,50,Creature Enchantment,0.15,8,16,0,0,1 -1377,Coordination Self V,Increases the caster's Coordination by 30 points.,200,1800,7,60,Creature Enchantment,0.2,8,16,0,0,1 -1378,Coordination Self VI,Increases the caster's Coordination by 35 points.,250,2700,7,70,Creature Enchantment,0.3,8,16,0,0,1 -1379,Coordination Other I,Increases the target's Coordination by 10 points.,1,1800,7,10,Creature Enchantment,0.01,8,16,0,1,1 -1380,Coordination Other II,Increases the target's Coordination by 15 points.,50,1800,7,20,Creature Enchantment,0.05,8,16,5,0.85,1 -1381,Coordination Other III,Increases the target's Coordination by 20 points.,100,1800,7,30,Creature Enchantment,0.1,8,16,5,0.7,1 -1382,Coordination Other IV,Increases the target's Coordination by 25 points.,150,1800,7,40,Creature Enchantment,0.15,8,16,5,0.55,1 -1383,Coordination Other V,Increases the target's Coordination by 30 points.,200,1800,7,50,Creature Enchantment,0.2,8,16,5,0.4,1 -1384,Coordination Other VI,Increases the target's Coordination by 35 points.,250,2700,7,60,Creature Enchantment,0.3,8,16,5,0.25,1 -1385,Clumsiness Self I,Decreases the caster's Coordination by 10 points.,15,60,8,15,Creature Enchantment,0.01,9,16,0,0,1 -1386,Clumsiness Self II,Decreases the caster's Coordination by 15 points.,75,90,8,30,Creature Enchantment,0.05,9,16,0,0,1 -1387,Clumsiness Self III,Decreases the caster's Coordination by 20 points.,125,120,8,40,Creature Enchantment,0.1,9,16,0,0,1 -1388,Clumsiness Self IV,Decreases the caster's Coordination by 25 points.,175,150,8,50,Creature Enchantment,0.15,9,16,0,0,1 -1389,Clumsiness Self V,Decreases the caster's Coordination by 30 points.,250,180,8,60,Creature Enchantment,0.2,9,16,0,0,1 -1390,Clumsiness Self VI,Decreases the caster's Coordination by 35 points.,275,210,8,70,Creature Enchantment,0.3,9,16,0,0,1 -1391,Clumsiness Other I,Decreases the target's Coordination by 10 points.,1,60,8,10,Creature Enchantment,0.01,9,16,0,1,1 -1392,Clumsiness Other II,Decreases the target's Coordination by 15 points.,75,90,8,20,Creature Enchantment,0.05,9,16,5,0.85,1 -1393,Clumsiness Other III,Decreases the target's Coordination by 20 points.,125,120,8,30,Creature Enchantment,0.1,9,16,5,0.7,1 -1394,Clumsiness Other IV,Decreases the target's Coordination by 25 points.,175,150,8,40,Creature Enchantment,0.15,9,16,5,0.55,1 -1395,Clumsiness Other V,Decreases the target's Coordination by 30 points.,225,180,8,50,Creature Enchantment,0.2,9,16,5,0.4,1 -1396,Clumsiness Other VI,Decreases the target's Coordination by 35 points.,275,210,8,60,Creature Enchantment,0.3,9,16,5,0.25,1 -1397,Quickness Self I,Increases the caster's Quickness by 10 points.,1,1800,5,15,Creature Enchantment,0,12,16,0,0,1 -1398,Quickness Self II,Increases the caster's Quickness by 15 points.,50,1800,5,30,Creature Enchantment,0.05,12,16,0,0,1 -1399,Quickness Self III,Increases the caster's Quickness by 20 points.,100,1800,5,40,Creature Enchantment,0.1,12,16,0,0,1 -1400,Quickness Self IV,Increases the caster's Quickness by 25 points.,150,1800,5,50,Creature Enchantment,0.15,12,16,0,0,1 -1401,Quickness Self V,Increases the caster's Quickness by 30 points.,200,1800,5,60,Creature Enchantment,0.2,12,16,0,0,1 -1402,Quickness Self VI,Increases the caster's Quickness by 35 points.,250,2700,5,70,Creature Enchantment,0.3,12,16,0,0,1 -1403,Quickness Other I,Increases the target's Quickness by 10 points.,1,1800,5,10,Creature Enchantment,0.01,12,16,0,1,1 -1404,Quickness Other II,Increases the target's Quickness by 15 points.,50,1800,5,20,Creature Enchantment,0.05,12,16,5,0.85,1 -1405,Quickness Other III,Increases the target's Quickness by 20 points.,100,1800,5,30,Creature Enchantment,0.1,12,16,5,0.7,1 -1406,Quickness Other IV,Increases the target's Quickness by 25 points.,150,1800,5,40,Creature Enchantment,0.15,12,16,5,0.55,1 -1407,Quickness Other V,Increases the target's Quickness by 30 points.,200,1800,5,50,Creature Enchantment,0.2,12,16,5,0.4,1 -1408,Quickness Other VI,Increases the target's Quickness by 35 points.,250,2700,5,60,Creature Enchantment,0.3,12,16,5,0.25,1 -1409,Slowness Self I,Decreases the caster's Quickness by 10 points.,15,60,6,15,Creature Enchantment,0.01,13,16,0,0,1 -1410,Slowness Self II,Decreases the caster's Quickness by 15 points.,75,90,6,30,Creature Enchantment,0.05,13,16,0,0,1 -1411,Slowness Self III,Decreases the caster's Quickness by 20 points.,125,120,6,40,Creature Enchantment,0.1,13,16,0,0,1 -1412,Slowness Self IV,Decreases the caster's Quickness by 25 points.,175,150,6,50,Creature Enchantment,0.15,13,16,0,0,1 -1413,Slowness Self V,Decreases the caster's Quickness by 30 points.,250,180,6,60,Creature Enchantment,0.2,13,16,0,0,1 -1414,Slowness Self VI,Decreases the caster's Quickness by 35 points.,275,210,6,70,Creature Enchantment,0.3,13,16,0,0,1 -1415,Slowness Other I,Decreases the target's Quickness by 10 points.,1,60,6,10,Creature Enchantment,0.01,13,16,0,1,1 -1416,Slowness Other II,Decreases the target's Quickness by 15 points.,75,90,6,20,Creature Enchantment,0.05,13,16,5,0.85,1 -1417,Slowness Other III,Decreases the target's Quickness by 20 points.,125,120,6,30,Creature Enchantment,0.1,13,16,5,0.7,1 -1418,Slowness Other IV,Decreases the target's Quickness by 25 points.,175,150,6,40,Creature Enchantment,0.15,13,16,5,0.55,1 -1419,Slowness Other V,Decreases the target's Quickness by 30 points.,225,180,6,50,Creature Enchantment,0.2,13,16,5,0.4,1 -1420,Slowness Other VI,Decreases the target's Quickness by 35 points.,275,210,6,60,Creature Enchantment,0.3,13,16,5,0.25,1 -1421,Focus Self I,Increases the caster's Focus by 10 points.,1,1800,9,15,Creature Enchantment,0.01,16,16,0,0,1 -1422,Focus Self II,Increases the caster's Focus by 15 points.,50,1800,9,30,Creature Enchantment,0.05,16,16,0,0,1 -1423,Focus Self III,Increases the caster's Focus by 20 points.,100,1800,9,40,Creature Enchantment,0.1,16,16,0,0,1 -1424,Focus Self IV,Increases the caster's Focus by 25 points.,150,1800,9,50,Creature Enchantment,0.15,16,16,0,0,1 -1425,Focus Self V,Increases the caster's Focus by 30 points.,200,1800,9,60,Creature Enchantment,0.2,16,16,0,0,1 -1426,Focus Self VI,Increases the caster's Focus by 35 points.,250,2700,9,70,Creature Enchantment,0.3,16,16,0,0,1 -1427,Focus Other I,Increases the target's Focus by 10 points.,1,1800,9,10,Creature Enchantment,0.01,16,16,0,1,1 -1428,Focus Other II,Increases the target's Focus by 15 points.,50,1800,9,20,Creature Enchantment,0.05,16,16,5,0.85,1 -1429,Focus Other III,Increases the target's Focus by 20 points.,100,1800,9,30,Creature Enchantment,0.1,16,16,5,0.7,1 -1430,Focus Other IV,Increases the target's Focus by 25 points.,150,1800,9,40,Creature Enchantment,0.15,16,16,5,0.55,1 -1431,Focus Other V,Increases the target's Focus by 30 points.,200,1800,9,50,Creature Enchantment,0.2,16,16,5,0.4,1 -1432,Focus Other VI,Increases the target's Focus by 35 points.,250,2700,9,60,Creature Enchantment,0.3,16,16,5,0.25,1 -1433,Bafflement Self I,Decreases the caster's Focus by 10 points.,15,60,10,15,Creature Enchantment,0.01,17,16,0,0,1 -1434,Bafflement Self II,Decreases the caster's Focus by 15 points.,75,90,10,30,Creature Enchantment,0.05,17,16,0,0,1 -1435,Bafflement Self III,Decreases the caster's Focus by 20 points.,125,120,10,40,Creature Enchantment,0.1,17,16,0,0,1 -1436,Bafflement Self IV,Decreases the caster's Focus by 25 points.,175,150,10,50,Creature Enchantment,0.15,17,16,0,0,1 -1437,Bafflement Self V,Decreases the caster's Focus by 30 points.,250,180,10,60,Creature Enchantment,0.2,17,16,0,0,1 -1438,Bafflement Self VI,Decreases the caster's Focus by 35 points.,275,210,10,70,Creature Enchantment,0.3,17,16,0,0,1 -1439,Bafflement Other I,Decreases the target's Focus by 10 points.,1,60,10,10,Creature Enchantment,0.01,17,16,0,1,1 -1440,Bafflement Other II,Decreases the target's Focus by 15 points.,75,90,10,20,Creature Enchantment,0.05,17,16,5,0.85,1 -1441,Bafflement Other III,Decreases the target's Focus by 20 points.,125,120,10,30,Creature Enchantment,0.1,17,16,5,0.7,1 -1442,Bafflement Other IV,Decreases the target's Focus by 25 points.,175,150,10,40,Creature Enchantment,0.15,17,16,5,0.55,1 -1443,Bafflement Other V,Decreases the target's Focus by 30 points.,225,180,10,50,Creature Enchantment,0.2,17,16,5,0.4,1 -1444,Bafflement Other VI,Decreases the target's Focus by 35 points.,275,210,10,60,Creature Enchantment,0.3,17,16,5,0.25,1 -1445,Willpower Self I,Increases the caster's Self by 10 points.,1,1800,11,15,Creature Enchantment,0.01,14,16,0,0,1 -1446,Willpower Self II,Increases the caster's Self by 15 points.,50,1800,11,30,Creature Enchantment,0.05,14,16,0,0,1 -1447,Willpower Self III,Increases the caster's Self by 20 points.,100,1800,11,40,Creature Enchantment,0.1,14,16,0,0,1 -1448,Willpower Self IV,Increases the caster's Self by 25 points.,150,1800,11,50,Creature Enchantment,0.15,14,16,0,0,1 -1449,Willpower Self V,Increases the caster's Self by 30 points.,200,1800,11,60,Creature Enchantment,0.2,14,16,0,0,1 -1450,Willpower Self VI,Increases the caster's Self by 35 points.,250,2700,11,70,Creature Enchantment,0.3,14,16,0,0,1 -1451,Willpower Other I,Increases the target's Self by 10 points.,1,1800,11,10,Creature Enchantment,0.01,14,16,0,1,1 -1452,Willpower Other II,Increases the target's Self by 15 points.,50,1800,11,20,Creature Enchantment,0.05,14,16,5,0.85,1 -1453,Willpower Other III,Increases the target's Self by 20 points.,100,1800,11,30,Creature Enchantment,0.1,14,16,5,0.7,1 -1454,Willpower Other IV,Increases the target's Self by 25 points.,150,1800,11,40,Creature Enchantment,0.15,14,16,5,0.55,1 -1455,Willpower Other V,Increases the target's Self by 30 points.,200,1800,11,50,Creature Enchantment,0.2,14,16,5,0.4,1 -1456,Willpower Other VI,Increases the target's Self by 35 points.,250,2700,11,60,Creature Enchantment,0.3,14,16,5,0.25,1 -1457,Feeblemind Self I,Decreases the caster's Self by 10 points.,15,60,12,15,Creature Enchantment,0.01,15,16,0,0,1 -1458,Feeblemind Self II,Decreases the caster's Self by 15 points.,75,90,12,30,Creature Enchantment,0.05,15,16,0,0,1 -1459,Feeblemind Self III,Decreases the caster's Self by 20 points.,125,120,12,40,Creature Enchantment,0.1,15,16,0,0,1 -1460,Feeblemind Self IV,Decreases the caster's Self by 25 points.,175,150,12,50,Creature Enchantment,0.15,15,16,0,0,1 -1461,Feeblemind Self V,Decreases the caster's Self by 30 points.,250,180,12,60,Creature Enchantment,0.2,15,16,0,0,1 -1462,Feeblemind Self VI,Decreases the caster's Self by 35 points.,275,210,12,70,Creature Enchantment,0.3,15,16,0,0,1 -1463,Feeblemind Other I,Decreases the target's Self by 10 points.,1,60,12,10,Creature Enchantment,0.01,15,16,0,1,1 -1464,Feeblemind Other II,Decreases the target's Self by 15 points.,75,90,12,20,Creature Enchantment,0.05,15,16,5,0.85,1 -1465,Feeblemind Other III,Decreases the target's Self by 20 points.,125,120,12,30,Creature Enchantment,0.1,15,16,5,0.7,1 -1466,Feeblemind Other IV,Decreases the target's Self by 25 points.,175,150,12,40,Creature Enchantment,0.15,15,16,5,0.55,1 -1467,Feeblemind Other V,Decreases the target's Self by 30 points.,225,180,12,50,Creature Enchantment,0.2,15,16,5,0.4,1 -1468,Feeblemind Other VI,Decreases the target's Self by 35 points.,275,210,12,60,Creature Enchantment,0.3,15,16,5,0.25,1 -1469,Hermetic Void I,Decreases a magic casting implement's mana conversion bonus by 10%.,25,60,194,10,Item Enchantment,0.01,68,32768,25,0,1 -1470,Hermetic Void II,Decreases a magic casting implement's mana conversion bonus by 20%.,75,90,194,20,Item Enchantment,0.05,68,32768,25,0,1 -1471,Hermetic Void III,Decreases a magic casting implement's mana conversion bonus by 30%.,125,120,194,30,Item Enchantment,0.1,68,32768,25,0,1 -1472,Hermetic Void IV,Decreases a magic casting implement's mana conversion bonus by 40%.,175,150,194,40,Item Enchantment,0.15,68,32768,25,0,1 -1473,Hermetic Void V,Decreases a magic casting implement's mana conversion bonus by 50%.,225,180,194,50,Item Enchantment,0.2,68,32768,25,0,1 -1474,Hermetic Void VI,Decreases a magic casting implement's mana conversion bonus by 60%.,275,210,194,60,Item Enchantment,0.3,68,32768,25,0,1 -1475,Aura of Hermetic Link Self I,Increases a magic casting implement's mana conversion bonus by 10%.,25,1800,195,10,Item Enchantment,0.01,67,16,25,0,1 -1476,Aura of Hermetic Link Self II,Increases a magic casting implement's mana conversion bonus by 20%.,50,1800,195,20,Item Enchantment,0.05,67,16,25,0,1 -1477,Aura of Hermetic Link Self III,Increases a magic casting implement's mana conversion bonus by 30%.,100,1800,195,30,Item Enchantment,0.1,67,16,25,0,1 -1478,Aura of Hermetic Link Self IV,Increases a magic casting implement's mana conversion bonus by 40%.,150,1800,195,40,Item Enchantment,0.15,67,16,25,0,1 -1479,Aura of Hermetic Link Self V,Increases a magic casting implement's mana conversion bonus by 50%.,200,1800,195,50,Item Enchantment,0.2,67,16,25,0,1 -1480,Aura of Hermetic Link Self VI,Increases a magic casting implement's mana conversion bonus by 60%.,250,2700,195,60,Item Enchantment,0.3,67,16,25,0,1 -1481,Flaming Missile Volley,CREATURE MAGIC ONLY!,1,-1,122,10,War Magic,0,0,16,30,0.7,1 -1482,Impenetrability II,Improves a shield or piece of armor's armor value by 50 points. Target yourself to cast this spell on all of your equipped armor.,50,1800,160,20,Item Enchantment,0.05,142,6,25,0,1 -1483,Impenetrability III,Improves a shield or piece of armor's armor value by 75 points. Target yourself to cast this spell on all of your equipped armor.,100,1800,160,30,Item Enchantment,0.1,142,6,25,0,1 -1484,Impenetrability IV,Improves a shield or piece of armor's armor value by 100 points. Target yourself to cast this spell on all of your equipped armor.,150,1800,160,40,Item Enchantment,0.15,142,6,25,0,1 -1485,Impenetrability V,Improves a shield or piece of armor's armor value by 150 points. Target yourself to cast this spell on all of your equipped armor.,200,1800,160,50,Item Enchantment,0.2,142,6,25,0,1 -1486,Impenetrability VI,Improves a shield or piece of armor's armor value by 200 points. Target yourself to cast this spell on all of your equipped armor.,250,2700,160,60,Item Enchantment,0.3,142,6,25,0,1 -1487,Brittlemail I,Worsens a shield or piece of armor's armor value by 20 points.,25,60,161,10,Item Enchantment,0.01,143,6,25,0,1 -1488,Brittlemail II,Worsens a shield or piece of armor's armor value by 50 points.,75,90,161,20,Item Enchantment,0.05,143,6,25,0,1 -1489,Brittlemail III,Worsens a shield or piece of armor's armor value by 75 points.,125,120,161,30,Item Enchantment,0.1,143,6,25,0,1 -1490,Brittlemail IV,Worsens a shield or piece of armor's armor value by 100 points.,175,150,161,40,Item Enchantment,0.15,143,6,25,0,1 -1491,Brittlemail V,Worsens a shield or piece of armor's armor value by 150 points.,225,180,161,50,Item Enchantment,0.2,143,6,25,0,1 -1492,Brittlemail VI,Worsens a shield or piece of armor's armor value by 200 points.,275,210,161,60,Item Enchantment,0.3,143,6,25,0,1 -1493,Acid Bane I,Increases a shield or piece of armor's resistance to acid damage by 10%. Target yourself to cast this spell on all of your equipped armor.,1,1800,162,10,Item Enchantment,0.01,63,6,25,0,1 -1494,Acid Bane II,Increases a shield or piece of armor's resistance to acid damage by 25%. Target yourself to cast this spell on all of your equipped armor.,50,1800,162,20,Item Enchantment,0.05,63,6,25,0,1 -1495,Acid Bane III,Increases a shield or piece of armor's resistance to acid damage by 50%. Target yourself to cast this spell on all of your equipped armor.,100,1800,162,30,Item Enchantment,0.1,63,6,25,0,1 -1496,Acid Bane IV,Increases a shield or piece of armor's resistance to acid damage by 75%. Target yourself to cast this spell on all of your equipped armor.,150,1800,162,40,Item Enchantment,0.15,63,6,25,0,1 -1497,Acid Bane V,Increases a shield or piece of armor's resistance to acid damage by 100%. Target yourself to cast this spell on all of your equipped armor.,200,1800,162,50,Item Enchantment,0.2,63,6,25,0,1 -1498,Acid Bane VI,Increases a shield or piece of armor's resistance to acid damage by 150%. Target yourself to cast this spell on all of your equipped armor.,250,2700,162,60,Item Enchantment,0.3,63,6,25,0,1 -1499,Acid Lure I,Decreases a shield or piece of armor's resistance to acid damage by 10%.,25,60,163,10,Item Enchantment,0.01,64,6,25,0,1 -1500,Acid Lure II,Decreases a shield or piece of armor's resistance to acid damage by 25%.,75,90,163,20,Item Enchantment,0.05,64,6,25,0,1 -1501,Acid Lure III,Decreases a shield or piece of armor's resistance to acid damage by 50%.,125,120,163,30,Item Enchantment,0.1,64,6,25,0,1 -1502,Acid Lure IV,Decreases a shield or piece of armor's resistance to acid damage by 75%.,175,150,163,40,Item Enchantment,0.15,64,6,25,0,1 -1503,Acid Lure V,Decreases a shield or piece of armor's resistance to acid damage by 100%.,225,180,163,50,Item Enchantment,0.2,64,6,25,0,1 -1504,Acid Lure VI,Decreases a shield or piece of armor's resistance to acid damage by 150%.,275,210,163,60,Item Enchantment,0.3,64,6,25,0,1 -1505,Bludgeon Lure I,Decreases a shield or piece of armor's resistance to bludgeoning damage by 10%.,25,60,165,10,Item Enchantment,0.01,68,6,25,0,1 -1506,Bludgeon Lure II,Decreases a shield or piece of armor's resistance to bludgeoning damage by 25%.,75,90,165,20,Item Enchantment,0.05,68,6,25,0,1 -1507,Bludgeon Lure III,Decreases a shield or piece of armor's resistance to bludgeoning damage by 50%.,125,120,165,30,Item Enchantment,0.1,68,6,25,0,1 -1508,Bludgeon Lure IV,Decreases a shield or piece of armor's resistance to bludgeoning damage by 75%.,175,150,165,40,Item Enchantment,0.15,68,6,25,0,1 -1509,Bludgeon Lure V,Decreases a shield or piece of armor's resistance to bludgeoning damage by 100%.,225,180,165,50,Item Enchantment,0.2,68,6,25,0,1 -1510,Bludgeon Lure VI,Decreases a shield or piece of armor's resistance to bludgeoning damage by 150%.,275,210,165,60,Item Enchantment,0.3,68,6,25,0,1 -1511,Bludgeon Bane I,Increases a shield or piece of armor's resistance to bludgeoning damage by 10%. Target yourself to cast this spell on all of your equipped armor.,1,1800,164,10,Item Enchantment,0.01,67,6,25,0,1 -1512,Bludgeon Bane II,Increases a shield or piece of armor's resistance to bludgeoning damage by 25%. Target yourself to cast this spell on all of your equipped armor.,50,1800,164,20,Item Enchantment,0.05,67,6,25,0,1 -1513,Bludgeon Bane III,Increases a shield or piece of armor's resistance to bludgeoning damage by 50%. Target yourself to cast this spell on all of your equipped armor.,100,1800,164,30,Item Enchantment,0.1,67,6,25,0,1 -1514,Bludgeon Bane IV,Increases a shield or piece of armor's resistance to bludgeoning damage by 75%. Target yourself to cast this spell on all of your equipped armor.,150,1800,164,40,Item Enchantment,0.15,67,6,25,0,1 -1515,Bludgeon Bane V,Increases a shield or piece of armor's resistance to bludgeoning damage by 100%. Target yourself to cast this spell on all of your equipped armor.,200,1800,164,50,Item Enchantment,0.2,67,6,25,0,1 -1516,Bludgeon Bane VI,Increases a shield or piece of armor's resistance to bludgeoning damage by 150%. Target yourself to cast this spell on all of your equipped armor.,250,2700,164,60,Item Enchantment,0.3,67,6,25,0,1 -1517,Frost Lure I,Decreases a shield or piece of armor's resistance to cold damage by 10%.,25,60,167,10,Item Enchantment,0.01,66,6,25,0,1 -1518,Frost Lure II,Decreases a shield or piece of armor's resistance to cold damage by 25%.,75,90,167,20,Item Enchantment,0.05,66,6,25,0,1 -1519,Frost Lure III,Decreases a shield or piece of armor's resistance to cold damage by 50%.,125,120,167,30,Item Enchantment,0.1,66,6,25,0,1 -1520,Frost Lure IV,Decreases a shield or piece of armor's resistance to cold damage by 75%.,175,150,167,40,Item Enchantment,0.15,66,6,25,0,1 -1521,Frost Lure V,Decreases a shield or piece of armor's resistance to cold damage by 100%.,225,180,167,50,Item Enchantment,0.2,66,6,25,0,1 -1522,Frost Lure VI,Decreases a shield or piece of armor's resistance to cold damage by 150%.,275,210,167,60,Item Enchantment,0.3,66,6,25,0,1 -1523,Frost Bane I,Increases a shield or piece of armor's resistance to cold damage by 10%. Target yourself to cast this spell on all of your equipped armor.,1,1800,166,10,Item Enchantment,0.01,65,6,25,0,1 -1524,Frost Bane II,Increases a shield or piece of armor's resistance to cold damage by 25%. Target yourself to cast this spell on all of your equipped armor.,50,1800,166,20,Item Enchantment,0.05,65,6,25,0,1 -1525,Frost Bane III,Increases a shield or piece of armor's resistance to cold damage by 50%. Target yourself to cast this spell on all of your equipped armor.,100,1800,166,30,Item Enchantment,0.1,65,6,25,0,1 -1526,Frost Bane IV,Increases a shield or piece of armor's resistance to cold damage by 75%. Target yourself to cast this spell on all of your equipped armor.,150,1800,166,40,Item Enchantment,0.15,65,6,25,0,1 -1527,Frost Bane V,Increases a shield or piece of armor's resistance to cold damage by 100%. Target yourself to cast this spell on all of your equipped armor.,200,1800,166,50,Item Enchantment,0.2,65,6,25,0,1 -1528,Frost Bane VI,Increases a shield or piece of armor's resistance to cold damage by 150%. Target yourself to cast this spell on all of your equipped armor.,250,2700,166,60,Item Enchantment,0.3,65,6,25,0,1 -1529,Lightning Lure I,Decreases a shield or piece of armor's resistance to electric damage by 10%.,25,60,169,10,Item Enchantment,0.01,68,6,25,0,1 -1530,Lightning Lure II,Decreases a shield or piece of armor's resistance to electric damage by 25%.,75,90,169,20,Item Enchantment,0.05,68,6,25,0,1 -1531,Lightning Lure III,Decreases a shield or piece of armor's resistance to electric damage by 50%.,125,120,169,30,Item Enchantment,0.1,68,6,25,0,1 -1532,Lightning Lure IV,Decreases a shield or piece of armor's resistance to electric damage by 75%.,175,150,169,40,Item Enchantment,0.15,68,6,25,0,1 -1533,Lightning Lure V,Decreases a shield or piece of armor's resistance to electric damage by 100%.,225,180,169,50,Item Enchantment,0.2,68,6,25,0,1 -1534,Lightning Lure VI,Decreases a shield or piece of armor's resistance to electric damage by 150%.,275,210,169,60,Item Enchantment,0.3,68,6,25,0,1 -1535,Lightning Bane I,Increases a shield or piece of armor's resistance to electric damage by 10%. Target yourself to cast this spell on all of your equipped armor.,1,1800,168,10,Item Enchantment,0.01,67,6,25,0,1 -1536,Lightning Bane II,Increases a shield or piece of armor's resistance to electric damage by 25%. Target yourself to cast this spell on all of your equipped armor.,50,1800,168,20,Item Enchantment,0.05,67,6,25,0,1 -1537,Lightning Bane III,Increases a shield or piece of armor's resistance to electric damage by 50%. Target yourself to cast this spell on all of your equipped armor.,100,1800,168,30,Item Enchantment,0.1,67,6,25,0,1 -1538,Lightning Bane IV,Increases a shield or piece of armor's resistance to electric damage by 75%. Target yourself to cast this spell on all of your equipped armor.,150,1800,168,40,Item Enchantment,0.15,67,6,25,0,1 -1539,Lightning Bane V,Increases a shield or piece of armor's resistance to electric damage by 100%. Target yourself to cast this spell on all of your equipped armor.,200,1800,168,50,Item Enchantment,0.2,67,6,25,0,1 -1540,Lightning Bane VI,Increases a shield or piece of armor's resistance to electric damage by 150%. Target yourself to cast this spell on all of your equipped armor.,250,2700,168,60,Item Enchantment,0.3,67,6,25,0,1 -1541,Flame Lure I,Decreases a shield or piece of armor's resistance to fire damage by 10%.,25,60,171,10,Item Enchantment,0.01,58,6,25,0,1 -1542,Flame Lure II,Decreases a shield or piece of armor's resistance to fire damage by 25%.,75,90,171,20,Item Enchantment,0.05,58,6,25,0,1 -1543,Flame Lure III,Decreases a shield or piece of armor's resistance to fire damage by 50%.,125,120,171,30,Item Enchantment,0.1,58,6,25,0,1 -1544,Flame Lure IV,Decreases a shield or piece of armor's resistance to fire damage by 75%.,175,150,171,40,Item Enchantment,0.15,58,6,25,0,1 -1545,Flame Lure V,Decreases a shield or piece of armor's resistance to fire damage by 100%.,225,180,171,50,Item Enchantment,0.2,58,6,25,0,1 -1546,Flame Lure VI,Decreases a shield or piece of armor's resistance to fire damage by 150%.,275,210,171,60,Item Enchantment,0.3,58,6,25,0,1 -1547,Flame Bane I,Increases a shield or piece of armor's resistance to fire damage by 10%. Target yourself to cast this spell on all of your equipped armor.,1,1800,170,10,Item Enchantment,0.01,57,6,25,0,1 -1548,Flame Bane II,Increases a shield or piece of armor's resistance to fire damage by 25%. Target yourself to cast this spell on all of your equipped armor.,50,1800,170,20,Item Enchantment,0.05,57,6,25,0,1 -1549,Flame Bane III,Increases a shield or piece of armor's resistance to fire damage by 50%. Target yourself to cast this spell on all of your equipped armor.,100,1800,170,30,Item Enchantment,0.1,57,6,25,0,1 -1550,Flame Bane IV,Increases a shield or piece of armor's resistance to fire damage by 75%. Target yourself to cast this spell on all of your equipped armor.,150,1800,170,40,Item Enchantment,0.15,57,6,25,0,1 -1551,Flame Bane V,Increases a shield or piece of armor's resistance to fire damage by 100%. Target yourself to cast this spell on all of your equipped armor.,200,1800,170,50,Item Enchantment,0.2,57,6,25,0,1 -1552,Flame Bane VI,Increases a shield or piece of armor's resistance to fire damage by 150%. Target yourself to cast this spell on all of your equipped armor.,250,2700,170,60,Item Enchantment,0.3,57,6,25,0,1 -1553,Blade Lure II,Decreases a shield or piece of armor's resistance to slashing damage by 25%.,75,90,175,20,Item Enchantment,0.05,62,6,25,0,1 -1554,Blade Lure III,Decreases a shield or piece of armor's resistance to slashing damage by 50%.,125,120,175,30,Item Enchantment,0.1,62,6,25,0,1 -1555,Blade Lure IV,Decreases a shield or piece of armor's resistance to slashing damage by 75%.,175,150,175,40,Item Enchantment,0.15,62,6,25,0,1 -1556,Blade Lure V,Decreases a shield or piece of armor's resistance to slashing damage by 100%.,225,180,175,50,Item Enchantment,0.2,62,6,25,0,1 -1557,Blade Lure VI,Decreases a shield or piece of armor's resistance to slashing damage by 150%.,275,210,175,60,Item Enchantment,0.3,62,6,25,0,1 -1558,Blade Bane II,Increases a shield or piece of armor's resistance to slashing damage by 25%. Target yourself to cast this spell on all of your equipped armor.,50,1800,174,20,Item Enchantment,0.05,61,6,25,0,1 -1559,Blade Bane III,Increases a shield or piece of armor's resistance to slashing damage by 50%. Target yourself to cast this spell on all of your equipped armor.,100,1800,174,30,Item Enchantment,0.1,61,6,25,0,1 -1560,Blade Bane IV,Increases a shield or piece of armor's resistance to slashing damage by 75%. Target yourself to cast this spell on all of your equipped armor.,150,1800,174,40,Item Enchantment,0.15,61,6,25,0,1 -1561,Blade Bane V,Increases a shield or piece of armor's resistance to slashing damage by 100%. Target yourself to cast this spell on all of your equipped armor.,200,1800,174,50,Item Enchantment,0.2,61,6,25,0,1 -1562,Blade Bane VI,Increases a shield or piece of armor's resistance to slashing damage by 150%. Target yourself to cast this spell on all of your equipped armor.,250,2700,174,60,Item Enchantment,0.3,61,6,25,0,1 -1563,Piercing Lure I,Decreases a shield or piece of armor's resistance to piercing damage by 10%.,25,60,173,10,Item Enchantment,0.01,60,6,25,0,1 -1564,Piercing Lure II,Decreases a shield or piece of armor's resistance to piercing damage by 25%.,75,90,173,20,Item Enchantment,0.05,60,6,25,0,1 -1565,Piercing Lure III,Decreases a shield or piece of armor's resistance to piercing damage by 50%.,125,120,173,30,Item Enchantment,0.1,60,6,25,0,1 -1566,Piercing Lure IV,Decreases a shield or piece of armor's resistance to piercing damage by 75%.,175,150,173,40,Item Enchantment,0.15,60,6,25,0,1 -1567,Piercing Lure V,Decreases a shield or piece of armor's resistance to piercing damage by 100%.,225,180,173,50,Item Enchantment,0.2,60,6,25,0,1 -1568,Piercing Lure VI,Decreases a shield or piece of armor's resistance to piercing damage by 150%.,275,210,173,60,Item Enchantment,0.3,60,6,25,0,1 -1569,Piercing Bane I,Increases a shield or piece of armor's resistance to piercing damage by 10%. Target yourself to cast this spell on all of your equipped armor.,1,1800,172,10,Item Enchantment,0.01,59,6,25,0,1 -1570,Piercing Bane II,Increases a shield or piece of armor's resistance to piercing damage by 25%. Target yourself to cast this spell on all of your equipped armor.,50,1800,172,20,Item Enchantment,0.05,59,6,25,0,1 -1571,Piercing Bane III,Increases a shield or piece of armor's resistance to piercing damage by 50%. Target yourself to cast this spell on all of your equipped armor.,100,1800,172,30,Item Enchantment,0.1,59,6,25,0,1 -1572,Piercing Bane IV,Increases a shield or piece of armor's resistance to piercing damage by 75%. Target yourself to cast this spell on all of your equipped armor.,150,1800,172,40,Item Enchantment,0.15,59,6,25,0,1 -1573,Piercing Bane V,Increases a shield or piece of armor's resistance to piercing damage by 100%. Target yourself to cast this spell on all of your equipped armor.,200,1800,172,50,Item Enchantment,0.2,59,6,25,0,1 -1574,Piercing Bane VI,Increases a shield or piece of armor's resistance to piercing damage by 150%. Target yourself to cast this spell on all of your equipped armor.,250,2700,172,60,Item Enchantment,0.3,59,6,25,0,1 -1575,Strengthen Lock I,Increases a lock's resistance to picking by 10 points.,1,780,192,10,Item Enchantment,0.01,59,640,25,0,1 -1576,Strengthen Lock II,Increases a lock's resistance to picking by 25 points.,50,780,192,20,Item Enchantment,0.05,59,640,25,0,1 -1577,Strengthen Lock III,Increases a lock's resistance to picking by 50 points.,100,780,192,30,Item Enchantment,0.1,59,640,25,0,1 -1578,Strengthen Lock IV,Increases a lock's resistance to picking by 75 points.,150,780,192,40,Item Enchantment,0.15,59,640,25,0,1 -1579,Strengthen Lock V,Increases a lock's resistance to picking by 100 points.,200,1020,192,50,Item Enchantment,0.2,59,640,25,0,1 -1580,Strengthen Lock VI,Increases a lock's resistance to picking by 150 points.,250,1020,192,60,Item Enchantment,0.3,59,640,25,0,1 -1581,Weaken Lock I,Decreases a lock's resistance to picking by 10 points.,1,60,193,10,Item Enchantment,0.01,60,640,25,0,1 -1582,Weaken Lock II,Decreases a lock's resistance to picking by 25 points.,50,90,193,20,Item Enchantment,0.05,60,640,25,0,1 -1583,Weaken Lock III,Decreases a lock's resistance to picking by 50 points.,100,120,193,30,Item Enchantment,0.1,60,640,25,0,1 -1584,Weaken Lock IV,Decreases a lock's resistance to picking by 75 points.,150,150,193,40,Item Enchantment,0.15,60,640,25,0,1 -1585,Weaken Lock V,Decreases a lock's resistance to picking by 100 points.,200,180,193,50,Item Enchantment,0.2,60,640,25,0,1 -1586,Weaken Lock VI,Decreases a lock's resistance to picking by 150 points.,250,210,193,60,Item Enchantment,0.3,60,640,25,0,1 -1587,Aura of Heart Seeker Self I,Increases a weapon's Attack Skill modifier by 2.5 percentage points.,1,1800,152,10,Item Enchantment,0.01,59,16,25,0,1 -1588,Aura of Heart Seeker Self II,Increases a weapon's Attack Skill modifier by 5.0 percentage points.,50,1800,152,20,Item Enchantment,0.05,59,16,25,0,1 -1589,Aura of Heart Seeker Self III,Increases a weapon's Attack Skill modifier by 7.5 percentage points.,100,1800,152,30,Item Enchantment,0.1,59,16,25,0,1 -1590,Aura of Heart Seeker Self IV,Increases a weapon's Attack Skill modifier by 10.0 percentage points.,150,1800,152,40,Item Enchantment,0.15,59,16,25,0,1 -1591,Aura of Heart Seeker Self V,Increases a weapon's Attack Skill modifier by 12.5 percentage points.,200,1800,152,50,Item Enchantment,0.2,59,16,25,0,1 -1592,Aura of Heart Seeker Self VI,Increases a weapon's Attack Skill modifier by 15.0 percentage points.,250,2700,152,60,Item Enchantment,0.3,59,16,25,0,1 -1593,Turn Blade I,Decreases a weapon's Attack Skill modifier by 2.5 percentage points.,25,60,153,10,Item Enchantment,0.01,60,257,25,0,1 -1594,Turn Blade II,Decreases a weapon's Attack Skill modifier by 5.0 percentage points.,75,90,153,20,Item Enchantment,0.05,60,257,25,0,1 -1595,Turn Blade III,Decreases a weapon's Attack Skill modifier by 7.5 percentage points.,125,120,153,30,Item Enchantment,0.1,60,257,25,0,1 -1596,Turn Blade IV,Decreases a weapon's Attack Skill modifier by 10.0 percentage points.,175,150,153,40,Item Enchantment,0.15,60,257,25,0,1 -1597,Turn Blade V,Decreases a weapon's Attack Skill modifier by 12.5 percentage points.,225,180,153,60,Item Enchantment,0.2,60,257,25,0,1 -1598,Turn Blade VI,Decreases a weapon's Attack Skill modifier by 15.0 percentage points.,275,210,153,70,Item Enchantment,0.3,60,257,25,0,1 -1599,Aura of Defender Self I,Increases the Melee Defense skill modifier of a weapon or magic caster by 3%.,1,1800,156,10,Item Enchantment,0.01,61,16,25,0,1 -1601,Aura of Defender Self II,Increases the Melee Defense skill modifier of a weapon or magic caster by 5%.,50,1800,156,20,Item Enchantment,0.05,61,16,25,0,1 -1602,Aura of Defender Self III,Increases the Melee Defense skill modifier of a weapon or magic caster by 7.5%.,100,1800,156,30,Item Enchantment,0.1,61,16,25,0,1 -1603,Aura of Defender Self IV,Increases the Melee Defense skill modifier of a weapon or magic caster by 10%.,150,1800,156,40,Item Enchantment,0.15,61,16,25,0,1 -1604,Aura of Defender Self V,Increases the Melee Defense skill modifier of a weapon or magic caster by 13%.,200,1800,156,50,Item Enchantment,0.2,61,16,25,0,1 -1605,Aura of Defender Self VI,Increases the Melee Defense skill modifier of a weapon or magic caster by 15%.,250,2700,156,60,Item Enchantment,0.3,61,16,25,0,1 -1606,Lure Blade I,Decreases the Melee Defense skill modifier of a weapon or magic caster by 3%.,25,60,157,10,Item Enchantment,0.01,62,33025,25,0,1 -1607,Lure Blade II,Decreases the Melee Defense skill modifier of a weapon or magic caster by 5%.,75,90,157,20,Item Enchantment,0.05,62,33025,25,0,1 -1608,Lure Blade III,Decreases the Melee Defense skill modifier of a weapon or magic caster by 7.5%.,125,120,157,30,Item Enchantment,0.1,62,33025,25,0,1 -1609,Lure Blade IV,Decreases the Melee Defense skill modifier of a weapon or magic caster by 10%.,175,150,157,40,Item Enchantment,0.15,62,33025,25,0,1 -1610,Lure Blade V,Decreases the Melee Defense skill modifier of a weapon or magic caster by 13%.,225,180,157,50,Item Enchantment,0.2,62,33025,25,0,1 -1611,Lure Blade VI,Decreases the Melee Defense skill modifier of a weapon or magic caster by 15%.,275,210,157,60,Item Enchantment,0.3,62,33025,25,0,1 -1612,Aura of Blood Drinker Self II,Increases a weapon's damage value by 4 points.,50,1800,154,20,Item Enchantment,0.05,57,16,25,0,1 -1613,Aura of Blood Drinker Self III,Increases a weapon's damage value by 8 points.,100,1800,154,30,Item Enchantment,0.1,57,16,25,0,1 -1614,Aura of Blood Drinker Self IV,Increases a weapon's damage value by 12 points.,150,1800,154,40,Item Enchantment,0.15,57,16,25,0,1 -1615,Aura of Blood Drinker Self V,Increases a weapon's damage value by 16 points.,200,1800,154,50,Item Enchantment,0.2,57,16,25,0,1 -1616,Aura of Blood Drinker Self VI,Increases a weapon's damage value by 20 points.,250,2700,154,60,Item Enchantment,0.3,57,16,25,0,1 -1617,Blood Loather II,Decreases a weapon's damage value by 4 points.,75,90,155,20,Item Enchantment,0.05,58,257,25,0,1 -1618,Blood Loather III,Decreases a weapon's damage value by 8 points.,125,120,155,30,Item Enchantment,0.1,58,257,25,0,1 -1619,Blood Loather IV,Decreases a weapon's damage value by 12 points.,175,150,155,40,Item Enchantment,0.15,58,257,25,0,1 -1620,Blood Loather V,Decreases a weapon's damage value by 16 points.,225,180,155,60,Item Enchantment,0.2,58,257,25,0,1 -1621,Blood Loather VI,Decreases a weapon's damage value by 20 points.,275,210,155,70,Item Enchantment,0.3,58,257,25,0,1 -1623,Aura of Swift Killer Self II,Improves a weapon's speed by 20 points.,50,1800,158,20,Item Enchantment,0.05,63,16,25,0,1 -1624,Aura of Swift Killer Self III,Improves a weapon's speed by 30 points.,100,1800,158,30,Item Enchantment,0.1,63,16,25,0,1 -1625,Aura of Swift Killer Self IV,Improves a weapon's speed by 40 points.,150,1800,158,40,Item Enchantment,0.15,63,16,25,0,1 -1626,Aura of Swift Killer Self V,Improves a weapon's speed by 50 points.,200,1800,158,50,Item Enchantment,0.2,63,16,25,0,1 -1627,Aura of Swift Killer Self VI,Improves a weapon's speed by 60 points.,250,2700,158,60,Item Enchantment,0.3,63,16,25,0,1 -1629,Leaden Weapon II,Worsens a weapon's speed by 20 points.,75,90,159,20,Item Enchantment,0.05,64,257,25,0,1 -1630,Leaden Weapon III,Worsens a weapon's speed by 30 points.,125,120,159,30,Item Enchantment,0.1,64,257,25,0,1 -1631,Leaden Weapon IV,Worsens a weapon's speed by 40 points.,175,150,159,40,Item Enchantment,0.15,64,257,25,0,1 -1632,Leaden Weapon V,Worsens a weapon's speed by 50 points.,225,180,159,60,Item Enchantment,0.2,64,257,25,0,1 -1633,Leaden Weapon VI,Worsens a weapon's speed by 60 points.,275,210,159,70,Item Enchantment,0.3,64,257,25,0,1 -1634,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -1635,Lifestone Recall,Transports the caster to the Lifestone to which they have previously linked.,100,-1,201,50,Item Enchantment,0.25,0,65536,0,0,1 -1636,Lifestone Sending,Transports the target to the last Lifestone he or she used.,125,-1,215,50,Item Enchantment,0.25,0,16,0,0,1 -1637,Summon Primary Portal III,Summons a portal that goes to the destination of the caster's linked portal. set with Primary Portal Tie.,250,300,203,110,Item Enchantment,1,0,65536,0,0,1 -1638,Defenselessness Self I,Decreases the caster's Missile Defense skill by 10 points.,1,60,40,15,Creature Enchantment,0.01,23,16,0,0,1 -1639,Defenselessness Self II,Decreases the caster's Missile Defense skill by 15 points.,75,90,40,30,Creature Enchantment,0.05,23,16,0,0,1 -1640,Defenselessness Self III,Decreases the caster's Missile Defense skill by 20 points.,125,120,40,40,Creature Enchantment,0.1,23,16,0,0,1 -1641,Defenselessness Self IV,Decreases the caster's Missile Defense skill by 25 points.,175,150,40,50,Creature Enchantment,0.15,23,16,0,0,1 -1642,Defenselessness Self V,Decreases the caster's Missile Defense skill by 30 points.,225,180,40,60,Creature Enchantment,0.2,23,16,0,0,1 -1643,Defenselessness Self VI,Decreases the caster's Missile Defense skill by 35 points.,275,210,40,70,Creature Enchantment,0.3,23,16,0,0,1 -1644,The Gift of Sarneho,Makes you superfast to catch all the bad people.,250,600,77,70,Creature Enchantment,0,24,16,0,0,0 -1658,Stamina to Health Other I,Drains one-half of the target's Stamina and gives 75% of that to his/her Health.,1,-1,89,10,Life Magic,0.01,75,16,5,0,0 -1659,Stamina to Health Other II,Drains one-half of the target's Stamina and gives 90% of that to his/her Health.,50,-1,89,20,Life Magic,0.05,75,16,5,0,0 -1660,Stamina to Health Other III,Drains one-half of the target's Stamina and gives 105% of that to his/her Health.,100,-1,89,30,Life Magic,0.1,75,16,5,0,0 -1661,Stamina to Health Other IV,Drains one-half of the target's Stamina and gives 120% of that to his/her Health.,150,-1,89,40,Life Magic,0.15,75,16,5,0,0 -1662,Stamina to Health Other V,Drains one-half of the target's Stamina and gives 135% of that to his/her Health.,200,-1,89,50,Life Magic,0.2,75,16,5,0,0 -1663,Stamina to Health Other VI,Drains one-half of the target's Stamina and gives 150% of that to his/her Health.,250,-1,89,60,Life Magic,0.3,75,16,5,0,0 -1664,Stamina to Health Self I,Drains one-half of the caster's Stamina and gives 90% of that to his/her Health (maximum of 50).,1,-1,89,10,Life Magic,0.01,75,16,0,0,0 -1665,Stamina to Health Self II,Drains one-half of the caster's Stamina and gives 100% of that to his/her Health (maximum of 100).,50,-1,89,20,Life Magic,0.05,75,16,0,0,0 -1666,Stamina to Health Self III,Drains one-half of the caster's Stamina and gives 110% of that to his/her Health (maximum of 150).,100,-1,89,30,Life Magic,0.1,75,16,0,0,0 -1667,Stamina to Health Self IV,Drains one-half of the caster's Stamina and gives 120% of that to his/her Health (maximum of 200).,150,-1,89,40,Life Magic,0.15,75,16,0,0,0 -1668,Stamina to Health Self V,Drains one-half of the caster's Stamina and gives 135% of that to his/her Health.,200,-1,89,50,Life Magic,0.2,75,16,0,0,0 -1669,Stamina to Health Self VI,Drains one-half of the caster's Stamina and gives 150% of that to his/her Health.,250,-1,89,60,Life Magic,0.3,75,16,0,0,0 -1670,Stamina to Mana Other I,Drains one-half of the target's Stamina and gives 75% of that to his/her Mana.,1,-1,89,10,Life Magic,0.01,76,16,5,0,0 -1671,Stamina to Mana Other II,Drains one-half of the target's Stamina and gives 90% of that to his/her Mana.,50,-1,89,20,Life Magic,0.05,76,16,5,0,0 -1672,Stamina to Mana Other III,Drains one-half of the target's Stamina and gives 105% of that to his/her Mana.,100,-1,89,30,Life Magic,0.1,76,16,5,0,0 -1673,Stamina to Mana Other IV,Drains one-half of the target's Stamina and gives 120% of that to his/her Mana.,150,-1,89,40,Life Magic,0.15,76,16,5,0,0 -1674,Stamina to Mana Other V,Drains one-half of the target's Stamina and gives 135% of that to his/her Mana.,200,-1,89,50,Life Magic,0.2,76,16,5,0,0 -1675,Stamina to Mana Other VI,Drains one-half of the target's Stamina and gives 150% of that to his/her Mana.,250,-1,89,60,Life Magic,0.3,76,16,5,0,0 -1676,Stamina to Mana Self I,Drains one-half of the caster's Stamina and gives 90% of that to his/her Mana (maximum of 50).,1,-1,89,10,Life Magic,0.01,76,16,0,0,0 -1677,Stamina to Mana Self II,Drains one-half of the caster's Stamina and gives 100% of that to his/her Mana (maximum of 100).,50,-1,89,20,Life Magic,0.05,76,16,0,0,0 -1678,Stamina to Mana Self III,Drains one-half of the caster's Stamina and gives 110% of that to his/her Mana (maximum of 150).,100,-1,89,30,Life Magic,0.1,76,16,0,0,0 -1679,Stamina to Mana Self IV,Drains one-half of the caster's Stamina and gives 120% of that to his/her Mana (maximum of 200).,150,-1,89,40,Life Magic,0.15,76,16,0,0,0 -1680,Stamina to Mana Self V,Drains one-half of the caster's Stamina and gives 135% of that to his/her Mana.,200,-1,89,50,Life Magic,0.2,76,16,0,0,0 -1681,Stamina to Mana Self VI,Drains one-half of the caster's Stamina and gives 150% of that to his/her Mana.,250,-1,89,60,Life Magic,0.3,76,16,0,0,0 -1702,Health to Mana Self IV,Drains one-half of the caster's Health and gives 120% of that to his/her Mana (maximum of 200).,150,-1,87,40,Life Magic,0.15,74,16,0,0,0 -1703,Health to Mana Self V,Drains one-half of the caster's Health and gives 135% of that to his/her Mana.,200,-1,87,50,Life Magic,0.2,74,16,0,0,0 -1704,Health to Mana Self VI,Drains one-half of the caster's Health and gives 150% of that to his/her Mana.,250,-1,87,60,Life Magic,0.3,74,16,0,0,0 -1705,Health to Mana Other I,Drains one-half of the target's Health and gives 75% of that to his/her Mana.,1,-1,87,10,Life Magic,0.01,74,16,5,0,0 -1706,Health to Mana Other II,Drains one-half of the target's Health and gives 90% of that to his/her Mana.,50,-1,87,20,Life Magic,0.05,74,16,5,0,0 -1707,Health to Mana Other III,Drains one-half of the target's Health and gives 105% of that to his/her Mana.,100,-1,87,30,Life Magic,0.1,74,16,5,0,0 -1708,Wedding Bliss,This is a gem that spectacularly symbolizes all the joys and challenges of marriage. It is a one-use item. so use it wisely to mark your commitment to share your life with another. Best used outdoors. in the open.,1,-1,67,15,Life Magic,0.01,141,16,0,0,1 -1709,Cooking Mastery Other I,Increases the target's Cooking skill by 10 points.,1,1800,216,10,Creature Enchantment,0.01,20,16,0,1,1 -1710,Cooking Mastery Other II,Increases the target's Cooking skill by 15 points.,50,1800,216,20,Creature Enchantment,0.05,20,16,5,0.85,1 -1711,Cooking Mastery Other III,Increases the target's Cooking skill by 20 points.,100,1800,216,30,Creature Enchantment,0.1,20,16,5,0.7,1 -1712,Cooking Mastery Other IV,Increases the target's Cooking skill by 25 points.,150,1800,216,40,Creature Enchantment,0.15,20,16,5,0.55,1 -1713,Cooking Mastery Other V,Increases the target's Cooking skill by 30 points.,200,1800,216,50,Creature Enchantment,0.2,20,16,5,0.4,1 -1714,Cooking Mastery Other VI,Increases the target's Cooking skill by 35 points.,250,2700,216,60,Creature Enchantment,0.3,20,16,5,0.25,1 -1715,Cooking Mastery Self I,Increases the caster's Cooking skill by 10 points.,1,1800,216,15,Creature Enchantment,0.01,20,16,0,0,1 -1716,Cooking Mastery Self II,Increases the caster's Cooking skill by 15 points.,50,1800,216,30,Creature Enchantment,0.05,20,16,0,0,1 -1717,Cooking Mastery Self III,Increases the caster's Cooking skill by 20 points.,100,1800,216,40,Creature Enchantment,0.1,20,16,0,0,1 -1718,Cooking Mastery Self IV,Increases the caster's Cooking skill by 25 points.,150,1800,216,50,Creature Enchantment,0.15,20,16,0,0,1 -1719,Cooking Mastery Self V,Increases the caster's Cooking skill by 30 points.,200,1800,216,60,Creature Enchantment,0.2,20,16,0,0,1 -1720,Cooking Mastery Self VI,Increases the caster's Cooking skill by 35 points.,250,2700,216,70,Creature Enchantment,0.3,20,16,0,0,1 -1721,Cooking Ineptitude Other I,Decreases the target's Cooking skill by 10 points.,1,60,217,10,Creature Enchantment,0.01,21,16,0,1,1 -1722,Cooking Ineptitude Other II,Decreases the target's Cooking skill by 15 points.,75,90,217,20,Creature Enchantment,0.05,21,16,5,0.85,1 -1723,Cooking Ineptitude Other III,Decreases the target's Cooking skill by 20 points.,125,120,217,30,Creature Enchantment,0.1,21,16,5,0.7,1 -1724,Cooking Ineptitude Other IV,Decreases the target's Cooking skill by 25 points.,175,150,217,40,Creature Enchantment,0.15,21,16,5,0.55,1 -1725,Cooking Ineptitude Other V,Decreases the target's Cooking skill by 30 points.,225,180,217,50,Creature Enchantment,0.2,21,16,5,0.4,1 -1726,Cooking Ineptitude Other VI,Decreases the target's Cooking skill by 35 points.,275,210,217,60,Creature Enchantment,0.3,21,16,5,0.25,1 -1727,Cooking Ineptitude Self I,Decreases the caster's Cooking skill by 10 points.,1,60,217,15,Creature Enchantment,0.01,21,16,0,0,1 -1728,Cooking Ineptitude Self II,Decreases the caster's Cooking skill by 15 points.,75,90,217,30,Creature Enchantment,0.05,21,16,0,0,1 -1729,Cooking Ineptitude Self III,Decreases the caster's Cooking skill by 20 points.,125,120,217,40,Creature Enchantment,0.1,21,16,0,0,1 -1730,Cooking Ineptitude Self IV,Decreases the caster's Cooking skill by 25 points.,175,150,217,50,Creature Enchantment,0.15,21,16,0,0,1 -1731,Cooking Ineptitude Self V,Decreases the caster's Cooking skill by 30 points.,225,180,217,60,Creature Enchantment,0.2,21,16,0,0,1 -1732,Cooking Ineptitude Self VI,Decreases the caster's Cooking skill by 35 points.,275,210,217,70,Creature Enchantment,0.3,21,16,0,0,1 -1733,Fletching Mastery Other I,Increases the target's Fletching skill by 10 points.,1,1800,218,10,Creature Enchantment,0.01,20,16,0,1,1 -1734,Fletching Mastery Other II,Increases the target's Fletching skill by 15 points.,50,1800,218,20,Creature Enchantment,0.05,20,16,5,0.85,1 -1735,Fletching Mastery Other III,Increases the target's Fletching skill by 20 points.,100,1800,218,30,Creature Enchantment,0.1,20,16,5,0.7,1 -1736,Fletching Mastery Other IV,Increases the target's Fletching skill by 25 points.,150,1800,218,40,Creature Enchantment,0.15,20,16,5,0.55,1 -1737,Fletching Mastery Other V,Increases the target's Fletching skill by 30 points.,200,1800,218,50,Creature Enchantment,0.2,20,16,5,0.4,1 -1738,Fletching Mastery Other VI,Increases the target's Fletching skill by 35 points.,250,2700,218,60,Creature Enchantment,0.3,20,16,5,0.25,1 -1739,Fletching Mastery Self I,Increases the caster's Fletching skill by 10 points.,1,1800,218,15,Creature Enchantment,0.01,20,16,0,0,1 -1740,Fletching Mastery Self II,Increases the caster's Fletching skill by 15 points.,50,1800,218,30,Creature Enchantment,0.05,20,16,0,0,1 -1741,Fletching Mastery Self III,Increases the caster's Fletching skill by 20 points.,100,1800,218,40,Creature Enchantment,0.1,20,16,0,0,1 -1742,Fletching Mastery Self IV,Increases the caster's Fletching skill by 25 points.,150,1800,218,50,Creature Enchantment,0.15,20,16,0,0,1 -1743,Fletching Mastery Self V,Increases the caster's Fletching skill by 30 points.,200,1800,218,60,Creature Enchantment,0.2,20,16,0,0,1 -1744,Fletching Mastery Self VI,Increases the caster's Fletching skill by 35 points.,250,2700,218,70,Creature Enchantment,0.3,20,16,0,0,1 -1745,Fletching Ineptitude Other I,Decreases the target's Fletching skill by 10 points.,1,60,219,10,Creature Enchantment,0.01,21,16,0,1,1 -1746,Fletching Ineptitude Other II,Decreases the target's Fletching skill by 15 points.,75,90,219,20,Creature Enchantment,0.05,21,16,5,0.85,1 -1747,Fletching Ineptitude Other III,Decreases the target's Fletching skill by 20 points.,125,120,219,30,Creature Enchantment,0.1,21,16,5,0.7,1 -1748,Fletching Ineptitude Other IV,Decreases the target's Fletching skill by 25 points.,175,150,219,40,Creature Enchantment,0.15,21,16,5,0.55,1 -1749,Fletching Ineptitude Other V,Decreases the target's Fletching skill by 30 points.,225,180,219,50,Creature Enchantment,0.2,21,16,5,0.4,1 -1750,Fletching Ineptitude Other VI,Decreases the target's Fletching skill by 35 points.,275,210,219,60,Creature Enchantment,0.3,21,16,5,0.25,1 -1751,Fletching Ineptitude Self I,Decreases the caster's Fletching skill by 10 points.,1,60,219,15,Creature Enchantment,0.01,21,16,0,0,1 -1752,Fletching Ineptitude Self II,Decreases the caster's Fletching skill by 15 points.,75,90,219,30,Creature Enchantment,0.05,21,16,0,0,1 -1753,Fletching Ineptitude Self III,Decreases the caster's Fletching skill by 20 points.,125,120,219,40,Creature Enchantment,0.1,21,16,0,0,1 -1754,Fletching Ineptitude Self IV,Decreases the caster's Fletching skill by 25 points.,175,150,219,50,Creature Enchantment,0.15,21,16,0,0,1 -1755,Fletching Ineptitude Self V,Decreases the caster's Fletching skill by 30 points.,225,180,219,60,Creature Enchantment,0.2,21,16,0,0,1 -1756,Fletching Ineptitude Self VI,Decreases the caster's Fletching skill by 35 points.,275,210,219,70,Creature Enchantment,0.3,21,16,0,0,1 -1757,Alchemy Mastery Other I,Increases the target's Alchemy skill by 10 points.,1,1800,221,10,Creature Enchantment,0.01,26,16,0,1,1 -1758,Alchemy Mastery Other II,Increases the target's Alchemy skill by 15 points.,50,1800,221,20,Creature Enchantment,0.05,26,16,5,0.85,1 -1759,Alchemy Mastery Other III,Increases the target's Alchemy skill by 20 points.,100,1800,221,30,Creature Enchantment,0.1,26,16,5,0.7,1 -1760,Alchemy Mastery Other IV,Increases the target's Alchemy skill by 25 points.,150,1800,221,40,Creature Enchantment,0.15,26,16,5,0.55,1 -1761,Alchemy Mastery Other V,Increases the target's Alchemy skill by 30 points.,200,1800,221,50,Creature Enchantment,0.2,26,16,5,0.4,1 -1762,Alchemy Mastery Other VI,Increases the target's Alchemy skill by 35 points.,250,2700,221,60,Creature Enchantment,0.3,26,16,5,0.25,1 -1763,Alchemy Mastery Self I,Increases the caster's Alchemy skill by 10 points.,1,1800,221,15,Creature Enchantment,0.01,26,16,0,0,1 -1764,Alchemy Mastery Self II,Increases the caster's Alchemy skill by 15 points.,50,1800,221,30,Creature Enchantment,0.05,26,16,0,0,1 -1765,Alchemy Mastery Self III,Increases the caster's Alchemy skill by 20 points.,100,1800,221,40,Creature Enchantment,0.1,26,16,0,0,1 -1766,Alchemy Mastery Self IV,Increases the caster's Alchemy skill by 25 points.,150,1800,221,50,Creature Enchantment,0.15,26,16,0,0,1 -1767,Alchemy Mastery Self V,Increases the caster's Alchemy skill by 30 points.,200,1800,221,60,Creature Enchantment,0.2,26,16,0,0,1 -1768,Alchemy Mastery Self VI,Increases the caster's Alchemy skill by 35 points.,250,2700,221,70,Creature Enchantment,0.3,26,16,0,0,1 -1769,Alchemy Ineptitude Other I,Decreases the target's Alchemy skill by 10 points.,1,60,220,10,Creature Enchantment,0.01,27,16,0,1,1 -1770,Alchemy Ineptitude Other II,Decreases the target's Alchemy skill by 15 points.,75,90,220,20,Creature Enchantment,0.05,27,16,5,0.85,1 -1771,Alchemy Ineptitude Other III,Decreases the target's Alchemy skill by 20 points.,125,120,220,30,Creature Enchantment,0.1,27,16,5,0.7,1 -1772,Alchemy Ineptitude Other IV,Decreases the target's Alchemy skill by 25 points.,175,150,220,40,Creature Enchantment,0.15,27,16,5,0.55,1 -1773,Alchemy Ineptitude Other V,Decreases the target's Alchemy skill by 30 points.,225,180,220,50,Creature Enchantment,0.2,27,16,5,0.4,1 -1774,Alchemy Ineptitude Other VI,Decreases the target's Alchemy skill by 35 points.,275,210,220,60,Creature Enchantment,0.3,27,16,5,0.25,1 -1775,Alchemy Ineptitude Self I,Decreases the caster's Alchemy skill by 10 points.,1,60,220,15,Creature Enchantment,0.01,27,16,0,0,1 -1776,Alchemy Ineptitude Self II,Decreases the caster's Alchemy skill by 15 points.,75,90,220,30,Creature Enchantment,0.05,27,16,0,0,1 -1777,Alchemy Ineptitude Self III,Decreases the caster's Alchemy skill by 20 points.,125,120,220,40,Creature Enchantment,0.1,27,16,0,0,1 -1778,Alchemy Ineptitude Self IV,Decreases the caster's Alchemy skill by 25 points.,175,150,220,50,Creature Enchantment,0.15,27,16,0,0,1 -1779,Alchemy Ineptitude Self V,Decreases the caster's Alchemy skill by 30 points.,225,180,220,60,Creature Enchantment,0.2,27,16,0,0,1 -1780,Alchemy Ineptitude Self VI,Decreases the caster's Alchemy skill by 35 points.,275,210,220,70,Creature Enchantment,0.3,27,16,0,0,1 -1781,Exploding Magma,Exploding magma from unstable golems!,275,-1,135,30,War Magic,0.4,0,0,15,0.2,1 -1782,Gertarh's Curse,Decreases your Loyalty skill by 30 points.,225,780,76,50,Creature Enchantment,0.2,21,16,5,0.4,1 -1783,Searing Disc,Shoots eight waves of acid outward from the caster. Each wave does 42-84 points of acid damage to the first thing it hits.,200,-1,222,80,War Magic,0.2,0,0,4.5,0,1 -1784,Horizon's Blades,Shoots eight blades outward from the caster. Each blade does 42-84 points of slashing damage to the first thing it hits.,200,-1,228,80,War Magic,0.2,0,0,4.5,0,1 -1785,Cassius' Ring of Fire,Shoots eight waves of flame outward from the caster. Each wave does 42-84 points of fire damage to the first thing it hits.,200,-1,226,80,War Magic,0.2,0,0,4.5,0,1 -1786,Nuhmudira's Spines,Shoots eight waves of force outward from the caster. Each wave does 42-84 points of piercing damage to the first thing it hits.,200,-1,227,80,War Magic,0.2,0,0,4.5,0,1 -1787,Halo of Frost,Shoots eight waves of frost outward from the caster. Each wave does 42-84 points of cold damage to the first thing it hits.,200,-1,224,80,War Magic,0.2,0,0,4.5,0,1 -1788,Eye of the Storm,Shoots eight waves of lightning outward from the caster. Each wave does 42-84 points of electric damage to the first thing it hits.,200,-1,225,80,War Magic,0.2,0,0,4.5,0,1 -1789,Tectonic Rifts,Shoots eight shock waves outward from the caster. Each wave does 42-84 points of bludgeoning damage to the first thing it hits.,200,-1,223,80,War Magic,0.2,0,0,4.5,0,1 -1790,Acid Streak I,Sends a stream of acid streaking towards the target. The stream does 16-31 points of acid damage to the first thing it hits.,1,-1,243,10,War Magic,0.01,0,16,30,0.7,1 -1791,Acid Streak II,Sends a stream of acid streaking towards the target. The stream does 18-35 points of acid damage to the first thing it hits.,50,-1,243,20,War Magic,0.05,0,16,30,0.6,1 -1792,Acid Streak III,Sends a stream of acid streaking towards the target. The stream does 21-42 points of acid damage to the first thing it hits.,100,-1,243,30,War Magic,0.1,0,16,30,0.5,1 -1793,Acid Streak IV,Sends a stream of acid streaking towards the target. The stream does 25-50 points of acid damage to the first thing it hits.,150,-1,243,40,War Magic,0.15,0,16,30,0.4,1 -1794,Acid Streak V,Sends a stream of acid streaking towards the target. The stream does 29-59 points of acid damage to the first thing it hits.,200,-1,243,50,War Magic,0.2,0,16,30,0.3,1 -1795,Acid Streak VI,Sends a stream of acid streaking towards the target. The stream does 36-71 points of acid damage to the first thing it hits.,250,-1,243,60,War Magic,0.3,0,16,30,0.2,1 -1796,Flame Streak I,Sends a bolt of flame streaking towards the target. The bolt does 16-31 points of fire damage to the first thing it hits.,1,-1,247,10,War Magic,0,0,16,30,0.7,1 -1797,Flame Streak II,Sends a bolt of flame streaking towards the target. The bolt does 18-35 points of fire damage to the first thing it hits.,50,-1,247,20,War Magic,0.05,0,16,30,0.6,1 -1798,Flame Streak III,Sends a bolt of flame streaking towards the target. The bolt does 21-42 points of fire damage to the first thing it hits.,100,-1,247,30,War Magic,0.1,0,16,30,0.5,1 -1799,Flame Streak IV,Sends a bolt of flame streaking towards the target. The bolt does 25-50 points of fire damage to the first thing it hits.,150,-1,247,40,War Magic,0.15,0,16,30,0.4,1 -1800,Flame Streak V,Sends a bolt of flame streaking towards the target. The bolt does 29-59 points of fire damage to the first thing it hits.,200,-1,247,50,War Magic,0.2,0,16,30,0.3,1 -1801,Flame Streak VI,Sends a bolt of flame streaking towards the target. The bolt does 36-71 points of fire damage to the first thing it hits.,250,-1,247,60,War Magic,0.3,0,16,30,0.2,1 -1802,Force Streak I,Sends a bolt of force streaking towards the target. The bolt does 16-31 points of piercing damage to the first thing it hits.,1,-1,248,10,War Magic,0,0,16,30,0.7,1 -1803,Force Streak II,Sends a bolt of force streaking towards the target. The bolt does 18-35 points of piercing damage to the first thing it hits.,50,-1,248,20,War Magic,0.05,0,16,30,0.6,1 -1804,Force Streak III,Sends a bolt of force streaking towards the target. The bolt does 21-42 points of piercing damage to the first thing it hits.,100,-1,248,30,War Magic,0.1,0,16,30,0.5,1 -1805,Force Streak IV,Sends a bolt of force streaking towards the target. The bolt does 25-50 points of piercing damage to the first thing it hits.,150,-1,248,40,War Magic,0.15,0,16,30,0.4,1 -1806,Force Streak V,Sends a bolt of force streaking towards the target. The bolt does 29-59 points of piercing damage to the first thing it hits.,200,-1,248,50,War Magic,0.2,0,16,30,0.3,1 -1807,Force Streak VI,Sends a bolt of force streaking towards the target. The bolt does 36-71 points of piercing damage to the first thing it hits.,250,-1,248,60,War Magic,0.3,0,16,30,0.2,1 -1808,Frost Streak I,Sends a bolt of frost streaking towards the target. The bolt does 16-31 points of cold damage to the first thing it hits.,1,-1,245,10,War Magic,0.01,0,16,30,0.7,1 -1809,Frost Streak II,Sends a bolt of frost streaking towards the target. The bolt does 18-35 points of cold damage to the first thing it hits.,50,-1,245,20,War Magic,0.05,0,16,30,0.6,1 -1810,Frost Streak III,Sends a bolt of cold streaking towards the target. The bolt does 21-42 points of cold damage to the first thing it hits.,100,-1,245,30,War Magic,0.1,0,16,30,0.5,1 -1811,Frost Streak IV,Sends a bolt of cold streaking towards the target. The bolt does 25-50 points of cold damage to the first thing it hits.,150,-1,245,40,War Magic,0.15,0,16,30,0.4,1 -1812,Frost Streak V,Sends a bolt of cold streaking towards the target. The bolt does 29-59 points of cold damage to the first thing it hits.,200,-1,245,50,War Magic,0.2,0,16,30,0.3,1 -1813,Frost Streak VI,Sends a bolt of cold streaking towards the target. The bolt does 36-71 points of cold damage to the first thing it hits.,250,-1,245,60,War Magic,0.3,0,16,30,0.2,1 -1814,Lightning Streak I,Sends a bolt of lighting streaking towards the target. The bolt does 16-31 points of electrical damage to the first thing it hits.,1,-1,246,10,War Magic,0,0,16,30,0.7,1 -1815,Lightning Streak II,Sends a bolt of lighting streaking towards the target. The bolt does 18-35 points of electrical damage to the first thing it hits.,50,-1,246,20,War Magic,0.05,0,16,30,0.6,1 -1816,Lightning Streak III,Sends a bolt of lighting streaking towards the target. The bolt does 21-42 points of electrical damage to the first thing it hits.,100,-1,246,30,War Magic,0.1,0,16,30,0.5,1 -1817,Lightning Streak IV,Sends a bolt of lighting streaking towards the target. The bolt does 25-50 points of electrical damage to the first thing it hits.,150,-1,246,40,War Magic,0.15,0,16,30,0.4,1 -1818,Lightning Streak V,Sends a bolt of lighting streaking towards the target. The bolt does 29-59 points of electrical damage to the first thing it hits.,200,-1,246,50,War Magic,0.2,0,16,30,0.3,1 -1819,Lightning Streak VI,Sends a bolt of lighting streaking towards the target. The bolt does 36-71 points of electrical damage to the first thing it hits.,250,-1,246,60,War Magic,0.3,0,16,30,0.2,1 -1820,Shock Wave Streak I,Sends a shock wave streaking towards the target. The wave does 16-31 points of bludgeoning damage to the first thing it hits.,1,-1,244,10,War Magic,0.01,0,16,30,0.7,1 -1821,Shock Wave Streak II,Sends a shock wave streaking towards the target. The wave does 18-35 points of bludgeoning damage to the first thing it hits.,50,-1,244,20,War Magic,0.05,0,16,30,0.6,1 -1822,Shock Wave Streak III,Sends a shock wave streaking towards the target. The wave does 21-42 points of bludgeoning damage to the first thing it hits.,100,-1,244,30,War Magic,0.1,0,16,30,0.5,1 -1823,Shock Wave Streak IV,Sends a shock wave streaking towards the target. The wave does 25-50 points of bludgeoning damage to the first thing it hits.,150,-1,244,40,War Magic,0.15,0,16,30,0.4,1 -1824,Shock Wave Streak V,Sends a shock wave streaking towards the target. The wave does 29-59 points of bludgeoning damage to the first thing it hits.,200,-1,244,50,War Magic,0.2,0,16,30,0.3,1 -1825,Shock Wave Streak VI,Sends a shock wave streaking towards the target. The wave does 36-71 points of bludgeoning damage to the first thing it hits.,250,-1,244,60,War Magic,0.3,0,16,30,0.2,1 -1826,Whirling Blade Streak I,Sends a magical blade streaking towards the target. The bolt does 16-31 points of slashing damage to the first thing it hits.,1,-1,249,10,War Magic,0.01,0,16,30,0.7,1 -1827,Whirling Blade Streak II,Sends a magical blade streaking towards the target. The bolt does 18-35 points of slashing damage to the first thing it hits.,50,-1,249,20,War Magic,0.05,0,16,30,0.6,1 -1828,Whirling Blade Streak III,Sends a magical blade streaking towards the target. The bolt does 21-42 points of slashing damage to the first thing it hits.,100,-1,249,30,War Magic,0.1,0,16,30,0.5,1 -1829,Whirling Blade Streak IV,Sends a magical blade streaking towards the target. The bolt does 25-50 points of slashing damage to the first thing it hits.,150,-1,249,40,War Magic,0.15,0,16,30,0.4,1 -1830,Whirling Blade Streak V,Sends a magical blade streaking towards the target. The bolt does 29-59 points of slashing damage to the first thing it hits.,200,-1,249,50,War Magic,0.2,0,16,30,0.3,1 -1831,Whirling Blade Streak VI,Sends a magical blade streaking towards the target. The bolt does 36-71 points of slashing damage to the first thing it hits.,250,-1,249,60,War Magic,0.3,0,16,30,0.2,1 -1832,Torrential Acid,Rains nine streams of acid down at the area around the target. Each stream does 60-120 points of acid damage to the first thing it hits.,320,-1,236,120,War Magic,0.25,0,16,30,0.5,1 -1833,Squall of Swords,Rains nine whirling blades down at the area around the target. Each blade does 60-120 points of slashing damage to the first thing it hits.,320,-1,242,120,War Magic,0.25,0,16,30,0.5,1 -1834,Firestorm,Rains nine balls of flame down at the area around the target. Each ball does 60-120 points of fire damage to the first thing it hits.,320,-1,240,120,War Magic,0.25,0,16,30,0.5,1 -1835,Splinterfall,Rains nine bolts of force down at the area around the target. Each bolt does 60-120 points of piercing damage to the first thing it hits.,320,-1,241,120,War Magic,0.25,0,16,30,0.5,1 -1836,Avalanche,Rains up to twelve balls of frost down at the area around the target. Each ball does 60-120 points of cold damage to the first thing it hits. This spell is not very accurate. and cannot be used indoors.,320,-1,238,120,War Magic,0.25,0,16,30,0.5,1 -1837,Lightning Barrage,Rains nine bolts of lightning down at the area around the target. Each bolt does 60-120 points of electric damage to the first thing it hits.,320,-1,239,120,War Magic,0.25,0,16,30,0.5,1 -1838,Stone Fists,Rains nine boulders down at the area around the target. Each boulder does 60-120 points of bludgeoning damage to the first thing it hits.,320,-1,237,120,War Magic,0.25,0,16,30,0.5,1 -1839,Blistering Creeper,Sends a wall of five balls of acid. two high. slowly towards the target. Each ball does 35-70 points of acid damage to the first thing it hits. The wall is created 2 meters in front of the caster. ,200,-1,229,80,War Magic,0.2,0,0,30,0.2,1 -1840,Bed of Blades,Sends a wall of five whirling blades. two high. slowly towards the target. Each blade does 35-70 points of slashing damage to the first thing it hits. The wall is created 2 meters in front of the caster. ,200,-1,235,80,War Magic,0.2,0,0,30,0.2,1 -1841,Slithering Flames,Sends a wall of five balls of fire. two high. slowly towards the target. Each ball does 35-70 points of fire damage to the first thing it hits. The wall is created 2 meters in front of the caster. ,200,-1,233,80,War Magic,0.2,0,0,30,0.2,1 -1842,Spike Strafe,Sends a wall of five bolts of force. two high. slowly towards the target. Each bolt does 35-70 points of piercing damage to the first thing it hits. The wall is created 2 meters in front of the caster. ,200,-1,234,80,War Magic,0.2,0,0,30,0.2,1 -1843,Foon-Ki's Glacial Floe,Sends a wall of five balls of frost. two high. slowly towards the target. Each ball does 35-70 points of cold damage to the first thing it hits. The wall is created 2 meters in front of the caster. ,200,-1,231,80,War Magic,0.2,0,0,30,0.2,1 -1844,Os' Wall,Sends a wall of five bolts of lightning. two high. slowly towards the target. Each ball does 35-70 points of electric damage to the first thing it hits. The wall is created 2 meters in front of the caster. ,200,-1,232,80,War Magic,0.2,0,0,30,0.2,1 -1845,Hammering Crawler,Sends a wall of five shockwaves. two high. slowly towards the target. Each wave does 35-70 points of bludgeoning damage to the first thing it hits. The wall is created 2 meters in front of the caster. ,200,-1,230,80,War Magic,0.2,0,0,30,0.2,1 -1846,Curse of Black Fire,Decreases the target's Magic Defense skill by 10 points.,50,1020,42,60,Creature Enchantment,0.3,23,16,5,0.25,1 -1847,Evaporate All Magic Other,Dispels all enchantments of level 1 from the target.,50,-1,250,50,Life Magic,0.05,148,16,0,1,1 -1848,Evaporate All Magic Other,Dispels 1-3 positive enchantments of level 1 from the target.,50,-1,250,50,Life Magic,0.05,148,16,0,1,1 -1849,Evaporate All Magic Other,Dispels all negative enchantments of level 1 from the target.,50,-1,250,40,Life Magic,0.05,148,16,0,1,1 -1850,Evaporate All Magic Self,Dispels all enchantments of level 1 from the caster.,50,-1,250,50,Life Magic,0.05,148,16,0,0,1 -1851,Evaporate All Magic Self,Dispels 1-3 positive enchantments of level 1 from the caster.,50,-1,250,50,Life Magic,0.05,148,16,0,0,1 -1852,Evaporate All Magic Self,Dispels all negative enchantments of level 1 from the caster.,50,-1,250,40,Life Magic,0.05,148,16,0,0,1 -1853,Extinguish All Magic Other,Dispels all enchantments of level 2 or lower from the target.,100,-1,250,100,Life Magic,0.1,148,16,5,0.85,1 -1854,Extinguish All Magic Other,Dispels 1-3 positive enchantments of level 2 or lower from the target.,100,-1,250,100,Life Magic,0.1,148,16,5,0.85,1 -1855,Extinguish All Magic Other,Dispels all negative enchantments of level 2 or lower from the target.,100,-1,250,80,Life Magic,0.1,148,16,5,0.85,1 -1856,Extinguish All Magic Self,Dispels all enchantments of level 2 or lower from the caster.,200,-1,250,100,Life Magic,0.1,148,16,0,0,1 -1857,Extinguish All Magic Self,Dispels 1-3 positive enchantments of level 2 or lower from the caster.,100,-1,250,100,Life Magic,0.1,148,16,0,0,1 -1858,Extinguish All Magic Self,Dispels all negative enchantments of level 2 or lower from the caster.,100,-1,250,80,Life Magic,0.1,148,16,0,0,1 -1859,Cleanse All Magic Other,Dispels all enchantments of level 3 or lower from the target.,150,-1,250,150,Life Magic,0.15,148,16,5,0.7,1 -1860,Cleanse All Magic Other,Dispels 2-4 positive enchantments of level 3 or lower from the target.,150,-1,250,150,Life Magic,0.15,148,16,5,0.7,1 -1861,Cleanse All Magic Other,Dispels all negative enchantments of level 3 or lower from the target.,150,-1,250,120,Life Magic,0.15,148,16,5,0.7,1 -1862,Cleanse All Magic Self,Dispels all enchantments of level 3 or lower from the caster.,150,-1,250,150,Life Magic,0.15,148,16,0,0,1 -1863,Cleanse All Magic Self,Dispels 2-4 positive enchantments of level 3 or lower from the caster.,150,-1,250,150,Life Magic,0.15,148,16,0,0,1 -1864,Cleanse All Magic Self,Dispels all negative enchantments of level 3 or lower from the caster.,150,-1,250,120,Life Magic,0.15,148,16,0,0,1 -1865,Devour All Magic Other,Dispels all enchantments of level 4 or lower from the target.,200,-1,250,200,Life Magic,0.2,148,16,5,0.55,1 -1866,Devour All Magic Other,Dispels 2-4 positive enchantments of level 4 or lower from the target.,200,-1,250,200,Life Magic,0.2,148,16,5,0.55,1 -1867,Devour All Magic Other,Dispels all negative enchantments of level 4 or lower from the target.,200,-1,250,160,Life Magic,0.2,148,16,5,0.55,1 -1868,Devour All Magic Self,Dispels all enchantments of level 4 or lower from the caster.,200,-1,250,200,Life Magic,0.2,148,16,0,0,1 -1869,Devour All Magic Self,Dispels 2-4 positive enchantments of level 4 or lower from the caster.,200,-1,250,200,Life Magic,0.2,148,16,0,0,1 -1870,Devour All Magic Self,Dispels all negative enchantments of level 4 or lower from the caster.,200,-1,250,160,Life Magic,0.2,148,16,0,0,1 -1871,Purge All Magic Other,Dispels all enchantments of level 5 or lower from the target.,250,-1,250,250,Life Magic,0.25,148,16,5,0.4,1 -1872,Purge All Magic Other,Dispels 2-6 positive enchantments of level 5 or lower from the target.,250,-1,250,250,Life Magic,0.25,148,16,5,0.4,1 -1873,Purge All Magic Other,Dispels all negative enchantments of level 5 or lower from the target.,250,-1,250,200,Life Magic,0.25,148,16,5,0.4,1 -1874,Purge All Magic Self,Dispels all enchantments of level 5 or lower from the caster.,250,-1,250,250,Life Magic,0.25,148,16,0,0,1 -1875,Purge All Magic Self,Dispels 2-6 positive enchantments of level 5 or lower from the caster.,250,-1,250,250,Life Magic,0.25,148,16,0,0,1 -1876,Purge All Magic Self,Dispels all negative enchantments of level 5 or lower from the caster.,250,-1,250,200,Life Magic,0.25,148,16,0,0,1 -1877,Nullify All Magic Other,Dispels all enchantments of level 6 or lower from the target.,300,-1,250,300,Life Magic,0.35,148,16,5,0.25,1 -1878,Nullify All Magic Other,Dispels 2-6 positive enchantments of level 6 or lower from the target.,300,-1,250,300,Life Magic,0.35,148,16,5,0.25,1 -1879,Nullify All Magic Other,Dispels all negative enchantments of level 6 or lower from the target.,300,-1,250,240,Life Magic,0.35,148,16,5,0.25,1 -1880,Nullify All Magic Self,Dispels all enchantments of level 6 or lower from the caster.,300,-1,250,300,Life Magic,0.35,148,16,0,0,1 -1881,Nullify All Magic Self,Dispels 2-6 positive enchantments of level 6 or lower from the caster.,300,-1,250,300,Life Magic,0.35,148,16,0,0,1 -1882,Nullify All Magic Self,Dispels all negative enchantments of level 6 or lower from the caster.,300,-1,250,240,Life Magic,0.35,148,16,0,0,1 -1883,Evaporate Creature Magic Other,Dispels 1-3 Creature Magic enchantments of level 1 from the target.,50,-1,250,50,Creature Enchantment,0.05,147,16,0,1,1 -1884,Evaporate Creature Magic Other,Dispels 1-3 positive Creature Magic enchantments of level 1 from the target.,50,-1,250,50,Creature Enchantment,0.05,147,16,0,1,1 -1885,Evaporate Creature Magic Other,Dispels 3-6 negative Creature Magic enchantments of level 1 from the target.,50,-1,250,40,Creature Enchantment,0.05,147,16,0,1,1 -1886,Evaporate Creature Magic Self,Dispels 1-3 Creature Magic enchantments of level 1 from the caster.,50,-1,250,50,Creature Enchantment,0.05,147,16,0,0,1 -1887,Evaporate Creature Magic Self,Dispels 1-3 positive Creature Magic enchantments of level 1 from the caster.,50,-1,250,50,Creature Enchantment,0.05,147,16,0,0,1 -1888,Evaporate Creature Magic Self,Dispels 3-6 negative Creature Magic enchantments of level 1 from the caster.,50,-1,250,40,Creature Enchantment,0.05,147,16,0,0,1 -1889,Extinguish Creature Magic Other,Dispels 1-3 Creature Magic enchantments of level 2 or lower from the target.,100,-1,250,100,Creature Enchantment,0.1,147,16,5,0.85,1 -1890,Extinguish Creature Magic Other,Dispels 1-3 positive Creature Magic enchantments of level 2 or lower from the target.,100,-1,250,100,Creature Enchantment,0.1,147,16,5,0.85,1 -1891,Extinguish Creature Magic Other,Dispels 3-6 negative Creature Magic enchantments of level 2 or lower from the target.,100,-1,250,80,Creature Enchantment,0.1,147,16,5,0.85,1 -1892,Extinguish Creature Magic Self,Dispels 1-3 Creature Magic enchantments of level 2 or lower from the caster.,100,-1,250,100,Creature Enchantment,0.1,147,16,0,0,1 -1893,Extinguish Creature Magic Self,Dispels 1-3 positive Creature Magic enchantments of level 2 or lower from the caster.,100,-1,250,100,Creature Enchantment,0.1,147,16,0,0,1 -1894,Extinguish Creature Magic Self,Dispels 3-6 negative Creature Magic enchantments of level 2 or lower from the caster.,100,-1,250,80,Creature Enchantment,0.1,147,16,0,0,1 -1895,Cleanse Creature Magic Other,Dispels 2-4 Creature Magic enchantments of level 3 or lower from the target.,150,-1,250,150,Creature Enchantment,0.15,147,16,5,0.7,1 -1896,Cleanse Creature Magic Other,Dispels 2-4 positive Creature Magic enchantments of level 3 or lower from the target.,150,-1,250,150,Creature Enchantment,0.15,147,16,5,0.7,1 -1897,Cleanse Creature Magic Other,Dispels 3-6 negative Creature Magic enchantments of level 3 or lower from the target.,150,-1,250,120,Creature Enchantment,0.15,147,16,5,0.7,1 -1898,Cleanse Creature Magic Self,Dispels 2-4 Creature Magic enchantments of level 3 or lower from the caster.,150,-1,250,150,Creature Enchantment,0.15,147,16,0,0,1 -1899,Cleanse Creature Magic Self,Dispels 2-4 positive Creature Magic enchantments of level 3 or lower from the caster.,150,-1,250,150,Creature Enchantment,0.15,147,16,0,0,1 -1900,Cleanse Creature Magic Self,Dispels 3-6 negative Creature Magic enchantments of level 3 or lower from the caster.,150,-1,250,120,Creature Enchantment,0.15,147,16,0,0,1 -1901,Devour Creature Magic Other,Dispels 2-4 Creature Magic enchantments of level 4 or lower from the target.,200,-1,250,200,Creature Enchantment,0.2,147,16,5,0.55,1 -1902,Devour Creature Magic Other,Dispels 2-4 positive Creature Magic enchantments of level 4 or lower from the target.,200,-1,250,200,Creature Enchantment,0.2,147,16,5,0.55,1 -1903,Devour Creature Magic Other,Dispels 3-6 negative Creature Magic enchantments of level 4 or lower from the target.,200,-1,250,160,Creature Enchantment,0.2,147,16,5,0.55,1 -1904,Devour Creature Magic Self,Dispels 2-4 Creature Magic enchantments of level 4 or lower from the caster.,200,-1,250,200,Creature Enchantment,0.2,147,16,0,0,1 -1905,Devour Creature Magic Self,Dispels 2-4 positive Creature Magic enchantments of level 4 or lower from the caster.,200,-1,250,200,Creature Enchantment,0.2,147,16,0,0,1 -1906,Devour Creature Magic Self,Dispels 3-6 negative Creature Magic enchantments of level 4 or lower from the caster.,200,-1,250,160,Creature Enchantment,0.2,147,16,0,0,1 -1907,Purge Creature Magic Other,Dispels 2-6 Creature Magic enchantments of level 5 or lower from the target.,250,-1,250,250,Creature Enchantment,0.25,147,16,5,0.4,1 -1908,Purge Creature Magic Other,Dispels 2-6 positive Creature Magic enchantments of level 5 or lower from the target.,250,-1,250,250,Creature Enchantment,0.25,147,16,5,0.4,1 -1909,Purge Creature Magic Other,Dispels 3-6 negative Creature Magic enchantments of level 5 or lower from the target.,250,-1,250,200,Creature Enchantment,0.25,147,16,5,0.4,1 -1910,Purge Creature Magic Self,Dispels 2-6 Creature Magic enchantments of level 5 or lower from the caster.,250,-1,250,250,Creature Enchantment,0.25,147,16,0,0,1 -1911,Purge Creature Magic Self,Dispels 2-6 positive Creature Magic enchantments of level 5 or lower from the caster.,250,-1,250,250,Creature Enchantment,0.25,147,16,0,0,1 -1912,Purge Creature Magic Self,Dispels 3-6 negative Creature Magic enchantments of level 5 or lower from the caster.,250,-1,250,200,Creature Enchantment,0.25,147,16,0,0,1 -1913,Nullify Creature Magic Other,Dispels 2-6 Creature Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Creature Enchantment,0.35,147,16,5,0.25,1 -1914,Nullify Creature Magic Other,Dispels 2-6 positive Creature Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Creature Enchantment,0.35,147,16,5,0.25,1 -1915,Nullify Creature Magic Other,Dispels 3-6 negative Creature Magic enchantments of level 6 or lower from the target.,300,-1,250,240,Creature Enchantment,0.35,147,16,5,0.25,1 -1916,Nullify Creature Magic Self,Dispels 2-6 Creature Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Creature Enchantment,0.35,147,16,0,0,1 -1917,Nullify Creature Magic Self,Dispels 2-6 positive Creature Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Creature Enchantment,0.35,147,16,0,0,1 -1918,Nullify Creature Magic Self,Dispels 3-6 negative Creature Magic enchantments of level 6 or lower from the caster.,300,-1,250,240,Creature Enchantment,0.35,147,16,0,0,1 -1919,Evaporate Item Magic,Dispels 1-3 Item Magic enchantments of level 1 from the target.,50,-1,250,50,Item Enchantment,0.05,68,16,0,1,1 -1920,Evaporate Item Magic,Dispels 1-3 positive Item Magic enchantments of level 1 from the target.,50,-1,250,50,Item Enchantment,0.05,68,16,0,1,1 -1921,Evaporate Item Magic,Dispels 3-6 negative Item Magic enchantments of level 1 from the target.,50,-1,250,40,Item Enchantment,0.05,68,16,0,1,1 -1922,Evaporate Item Magic,Dispels 1-3 Item Magic enchantments of level 1 from the caster.,50,-1,250,50,Item Enchantment,0.05,68,16,0,0,1 -1923,Evaporate Item Magic,Dispels 1-3 positive Item Magic enchantments of level 1 from the caster.,50,-1,250,50,Item Enchantment,0.05,68,16,0,0,1 -1924,Evaporate Item Magic,Dispels 1-3 negative Item Magic enchantments of level 1 from the caster.,50,-1,250,50,Item Enchantment,0.05,68,16,0,0,1 -1925,Extinguish Item Magic,Dispels 1-3 Item Magic enchantments of level 2 or lower from the target.,100,-1,250,100,Item Enchantment,0.1,68,16,5,0.85,1 -1926,Extinguish Item Magic,Dispels 1-3 positive Item Magic enchantments of level 2 or lower from the target.,100,-1,250,100,Item Enchantment,0.1,68,16,5,0.85,1 -1927,Extinguish Item Magic,Dispels 3-6 negative Item Magic enchantments of level 2 or lower from the target.,100,-1,250,80,Item Enchantment,0.1,68,16,5,0.85,1 -1928,Extinguish Item Magic,Dispels 1-3 Item Magic enchantments of level 2 or lower from the caster.,100,-1,250,100,Item Enchantment,0.1,68,16,0,0,1 -1929,Extinguish Item Magic,Dispels 1-3 positive Item Magic enchantments of level 2 or lower from the caster.,100,-1,250,100,Item Enchantment,0.1,68,16,0,0,1 -1930,Extinguish Item Magic,Dispels 1-3 negative Item Magic enchantments of level 2 or lower from the caster.,100,-1,250,100,Item Enchantment,0.1,68,16,0,0,1 -1931,Cleanse Item Magic,Dispels 2-4 Item Magic enchantments of level 3 or lower from the target.,150,-1,250,150,Item Enchantment,0.15,68,16,5,0.7,1 -1932,Cleanse Item Magic,Dispels 2-4 positive Item Magic enchantments of level 3 or lower from the target.,150,-1,250,150,Item Enchantment,0.15,68,16,5,0.7,1 -1933,Cleanse Item Magic,Dispels 3-6 negative Item Magic enchantments of level 3 or lower from the target.,150,-1,250,120,Item Enchantment,0.15,68,16,5,0.7,1 -1934,Cleanse Item Magic,Dispels 2-4 Item Magic enchantments of level 3 or lower from the caster.,150,-1,250,150,Item Enchantment,0.15,68,16,0,0,1 -1935,Cleanse Item Magic,Dispels 2-4 positive Item Magic enchantments of level 3 or lower from the caster.,150,-1,250,150,Item Enchantment,0.15,68,16,0,0,1 -1936,Cleanse Item Magic,Dispels 2-4 negative Item Magic enchantments of level 3 or lower from the caster.,150,-1,250,150,Item Enchantment,0.15,68,16,0,0,1 -1937,Devour Item Magic,Dispels 2-4 Item Magic enchantments of level 4 or lower from the target.,200,-1,250,200,Item Enchantment,0.2,68,16,5,0.55,1 -1938,Devour Item Magic,Dispels 2-4 positive Item Magic enchantments of level 4 or lower from the target.,200,-1,250,200,Item Enchantment,0.2,68,16,5,0.55,1 -1939,Devour Item Magic,Dispels 3-6 negative Item Magic enchantments of level 4 or lower from the target.,200,-1,250,160,Item Enchantment,0.2,68,16,5,0.55,1 -1940,Devour Item Magic,Dispels 2-4 Item Magic enchantments of level 4 or lower from the caster.,200,-1,250,200,Item Enchantment,0.2,68,16,0,0,1 -1941,Devour Item Magic,Dispels 2-4 positive Item Magic enchantments of level 4 or lower from the caster.,200,-1,250,200,Item Enchantment,0.2,68,16,0,0,1 -1942,Devour Item Magic,Dispels 2-4 negative Item Magic enchantments of level 4 or lower from the caster.,200,-1,250,200,Item Enchantment,0.2,68,16,0,0,1 -1943,Purge Item Magic,Dispels 2-6 Item Magic enchantments of level 5 or lower from the target.,250,-1,250,250,Item Enchantment,0.25,68,16,5,0.4,1 -1944,Purge Item Magic,Dispels 2-6 positive Item Magic enchantments of level 5 or lower from the target.,250,-1,250,250,Item Enchantment,0.25,68,16,5,0.4,1 -1945,Purge Item Magic,Dispels 3-6 negative Item Magic enchantments of level 5 or lower from the target.,250,-1,250,200,Item Enchantment,0.25,68,16,5,0.4,1 -1946,Purge Item Magic,Dispels 2-6 Item Magic enchantments of level 5 or lower from the caster.,250,-1,250,250,Item Enchantment,0.25,68,16,0,0,1 -1947,Purge Item Magic,Dispels 2-6 positive Item Magic enchantments of level 5 or lower from the caster.,250,-1,250,250,Item Enchantment,0.25,68,16,0,0,1 -1948,Purge Item Magic,Dispels 2-6 negative Item Magic enchantments of level 5 or lower from the caster.,250,-1,250,250,Item Enchantment,0.25,68,16,0,0,1 -1949,Nullify Item Magic,Dispels 2-6 Item Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Item Enchantment,0.35,68,16,5,0.25,1 -1950,Nullify Item Magic,Dispels 2-6 positive Item Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Item Enchantment,0.35,68,16,5,0.25,1 -1951,Nullify Item Magic,Dispels 3-6 negative Item Magic enchantments of level 6 or lower from the target.,300,-1,250,240,Item Enchantment,0.35,68,16,5,0.25,1 -1952,Nullify Item Magic,Dispels 2-6 Item Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Item Enchantment,0.35,68,16,0,0,1 -1953,Nullify Item Magic,Dispels 2-6 positive Item Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Item Enchantment,0.35,68,16,0,0,1 -1954,Nullify Item Magic,Dispels 2-6 negative Item Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Item Enchantment,0.35,68,16,0,0,1 -1955,Evaporate Life Magic Other,Dispels 1-3 Life Magic enchantments of level 1 from the target.,50,-1,250,50,Life Magic,0.05,146,16,0,1,1 -1956,Evaporate Life Magic Other,Dispels 1-3 positive Life Magic enchantments of level 1 from the target.,50,-1,250,50,Life Magic,0.05,146,16,0,1,1 -1957,Evaporate Life Magic Other,Dispels 3-6 negative Life Magic enchantments of level 1 from the target.,50,-1,250,40,Life Magic,0.05,146,16,0,1,1 -1958,Evaporate Life Magic Self,Dispels 1-3 Life Magic enchantments of level 1 from the caster.,50,-1,250,50,Life Magic,0.05,146,16,0,0,1 -1959,Evaporate Life Magic Self,Dispels 1-3 positive Life Magic enchantments of level 1 from the caster.,50,-1,250,50,Life Magic,0.05,146,16,0,0,1 -1960,Evaporate Life Magic Self,Dispels 3-6 negative Life Magic enchantments of level 1 from the caster.,50,-1,250,40,Life Magic,0.05,146,16,0,0,1 -1961,Extinguish Life Magic Other,Dispels 1-3 Life Magic enchantments of level 2 or lower from the target.,100,-1,250,100,Life Magic,0.1,146,16,5,0.85,1 -1962,Extinguish Life Magic Other,Dispels 1-3 positive Life Magic enchantments of level 2 or lower from the target.,100,-1,250,100,Life Magic,0.1,146,16,5,0.85,1 -1963,Extinguish Life Magic Other,Dispels 3-6 negative Life Magic enchantments of level 2 or lower from the target.,100,-1,250,80,Life Magic,0.1,146,16,5,0.85,1 -1964,Extinguish Life Magic Self,Dispels 1-3 Life Magic enchantments of level 2 or lower from the caster.,100,-1,250,100,Life Magic,0.1,146,16,0,0,1 -1965,Extinguish Life Magic Self,Dispels 1-3 positive Life Magic enchantments of level 2 or lower from the caster.,100,-1,250,100,Life Magic,0.1,146,16,0,0,1 -1966,Extinguish Life Magic Self,Dispels 3-6 negative Life Magic enchantments of level 2 or lower from the caster.,100,-1,250,80,Life Magic,0.1,146,16,0,0,1 -1967,Cleanse Life Magic Other,Dispels 2-4 Life Magic enchantments of level 3 or lower from the target.,150,-1,250,150,Life Magic,0.15,146,16,5,0.7,1 -1968,Cleanse Life Magic Other,Dispels 2-4 positive Life Magic enchantments of level 3 or lower from the target.,150,-1,250,150,Life Magic,0.15,146,16,5,0.7,1 -1969,Cleanse Life Magic Other,Dispels 3-6 negative Life Magic enchantments of level 3 or lower from the target.,150,-1,250,120,Life Magic,0.15,146,16,5,0.7,1 -1970,Cleanse Life Magic Self,Dispels 2-4 Life Magic enchantments of level 3 or lower from the caster.,150,-1,250,150,Life Magic,0.15,146,16,0,0,1 -1971,Cleanse Life Magic Self,Dispels 2-4 positive Life Magic enchantments of level 3 or lower from the caster.,150,-1,250,150,Life Magic,0.15,146,16,0,0,1 -1972,Cleanse Life Magic Self,Dispels 3-6 negative Life Magic enchantments of level 3 or lower from the caster.,150,-1,250,120,Life Magic,0.15,146,16,0,0,1 -1973,Devour Life Magic Other,Dispels 2-4 Life Magic enchantments of level 4 or lower from the target.,200,-1,250,200,Life Magic,0.2,146,16,5,0.55,1 -1974,Devour Life Magic Other,Dispels 2-4 positive Life Magic enchantments of level 4 or lower from the target.,200,-1,250,200,Life Magic,0.2,146,16,5,0.55,1 -1975,Devour Life Magic Other,Dispels 3-6 negative Life Magic enchantments of level 4 or lower from the target.,200,-1,250,160,Life Magic,0.2,146,16,5,0.55,1 -1976,Devour Life Magic Self,Dispels 2-4 Life Magic enchantments of level 4 or lower from the caster.,200,-1,250,200,Life Magic,0.2,146,16,0,0,1 -1977,Devour Life Magic Self,Dispels 2-4 positive Life Magic enchantments of level 4 or lower from the caster.,200,-1,250,200,Life Magic,0.2,146,16,0,0,1 -1978,Devour Life Magic Self,Dispels 3-6 negative Life Magic enchantments of level 4 or lower from the caster.,200,-1,250,160,Life Magic,0.2,146,16,0,0,1 -1979,Purge Life Magic Other,Dispels 2-6 Life Magic enchantments of level 5 or lower from the target.,250,-1,250,250,Life Magic,0.25,146,16,5,0.4,1 -1980,Purge Life Magic Other,Dispels 2-6 positive Life Magic enchantments of level 5 or lower from the target.,250,-1,250,250,Life Magic,0.25,146,16,5,0.4,1 -1981,Purge Life Magic Other,Dispels 3-6 negative Life Magic enchantments of level 5 or lower from the target.,250,-1,250,200,Life Magic,0.25,146,16,5,0.4,1 -1982,Purge Life Magic Self,Dispels 2-6 Life Magic enchantments of level 5 or lower from the caster.,250,-1,250,250,Life Magic,0.25,146,16,0,0,1 -1983,Purge Life Magic Self,Dispels 2-6 positive Life Magic enchantments of level 5 or lower from the caster.,250,-1,250,250,Life Magic,0.25,146,16,0,0,1 -1984,Purge Life Magic Self,Dispels 3-6 negative Life Magic enchantments of level 5 or lower from the caster.,250,-1,250,200,Life Magic,0.25,146,16,0,0,1 -1985,Nullify Life Magic Other,Dispels 2-6 Life Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Life Magic,0.35,146,16,5,0.25,1 -1986,Nullify Life Magic Other,Dispels 2-6 positive Life Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Life Magic,0.35,146,16,5,0.25,1 -1987,Nullify Life Magic Other,Dispels 3-6 negative Life Magic enchantments of level 6 or lower from the target.,300,-1,250,240,Life Magic,0.35,146,16,5,0.25,1 -1988,Nullify Life Magic Self,Dispels 2-6 Life Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Life Magic,0.35,146,16,0,0,1 -1989,Nullify Life Magic Self,Dispels 2-6 positive Life Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Life Magic,0.35,146,16,0,0,1 -1990,Nullify Life Magic Self,Dispels 3-6 negative Life Magic enchantments of level 6 or lower from the caster.,300,-1,250,240,Life Magic,0.35,146,16,0,0,1 -1991,Mana Blight,Drains 5000 points of the target's Mana.,275,-1,84,60,Life Magic,0.3,34,16,10,0.05,1 -1992,Camping Mastery,Increases the target's chance of finding phat loot.,1,300,221,10,Creature Enchantment,0.01,144,16,0,1,1 -1993,Camping Ineptitude,Decreases the target's chance of finding phat loot.,1,300,220,1,Creature Enchantment,0.01,145,16,0,1,1 -1994,Aura of Wound Twister,Increases a weapon's damage value by 25 points.,250,1020,154,60,Item Enchantment,0.3,57,16,25,0,1 -1995,Aura of Alacrity,Improves a weapon's speed by 20 points.,50,360,158,20,Item Enchantment,0.05,63,16,25,0,1 -1996,Aura of Soul Hunter,Increases a weapon's Attack Skill modifier by 10.0 percentage points.,150,600,152,40,Item Enchantment,0.15,59,16,25,0,1 -1997,Life Giver,Increases maximum health by 15 points.,15,510,279,70,Life Magic,0.3,31,16,0,0,1 -1998,Stamina Giver,Increases maximum stamina by 15 points.,15,510,281,70,Life Magic,0.3,35,16,0,0,1 -1999,Mana Giver,Increases maximum mana by 15 points.,15,510,283,70,Life Magic,0.3,33,16,0,0,1 -2000,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2001,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2002,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2003,Warrior's Lesser Vitality,Increases maximum health by 5 points.,240,510,273,70,Life Magic,0.3,31,16,0,0,1 -2004,Warrior's Vitality,Increases maximum health by 10 points.,245,510,273,70,Life Magic,0.3,31,16,0,0,1 -2005,Warrior's Greater Vitality,Increases maximum health by 15 points.,250,510,273,70,Life Magic,0.3,31,16,0,0,1 -2006,Warrior's Ultimate Vitality,Increases maximum health by 20 points.,260,510,273,70,Life Magic,0.3,31,16,0,0,1 -2007,Warrior's Lesser Vigor,Increases maximum stamina by 10 points.,240,510,275,70,Life Magic,0.3,35,16,0,0,1 -2008,Warrior's Vigor,Increases maximum stamina by 20 points.,245,510,275,70,Life Magic,0.3,35,16,0,0,1 -2009,Warrior's Greater Vigor,Increases maximum stamina by 30 points.,250,510,275,70,Life Magic,0.3,35,16,0,0,1 -2010,Warrior's Ultimate Vigor,Increases maximum stamina by 40 points.,260,510,275,70,Life Magic,0.3,35,16,0,0,1 -2011,Wizard's Lesser Intellect,Increases maximum mana by 10 points.,240,510,277,70,Life Magic,0.3,33,16,0,0,1 -2012,Wizard's Intellect,Increases maximum mana by 15 points.,245,510,277,70,Life Magic,0.3,33,16,0,0,1 -2013,Wizard's Greater Intellect,Increases maximum mana by 20 points.,250,510,277,70,Life Magic,0.3,33,16,0,0,1 -2014,Wizard's Ultimate Intellect,Increases maximum mana by 30 points.,260,510,277,70,Life Magic,0.3,33,16,0,0,1 -2015,Aerfalle's Ward,Improves a shield or piece of armor's armor value by 220 points.,295,1020,160,60,Item Enchantment,0.3,142,6,25,0,1 -2016,Impulse,Increases maximum mana by 100 points.,100,10800,283,70,Life Magic,0.3,33,16,0,0,1 -2017,Bunny Smite,Drains 1000-6000 points of the target's Health.,1,-1,80,10,Life Magic,0.01,149,16,90,0.1,1 -2018,Tormenter of Flesh,Drains 1000-6000 points of the target's Health.,1,-1,80,10,Life Magic,0.01,150,16,90,0.1,1 -2019,The sundering of the crystal,Shoots eight shock waves outward from the caster. Each wave does 200-300 points of bludgeoning damage to the first thing it hits.,200,-1,223,80,War Magic,0.2,0,0,4.5,0,1 -2020,Recall Asmolum 1,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2021,Thaumaturgic Shroud,Drains one-half of the target's Mana and gives 200% of that to the caster.,350,-1,91,70,Life Magic,0.75,34,16,5,0.05,0 -2022,Soul Shroud,Drains one-half of the target's Health and gives 200% of that to the caster.,350,-1,87,70,Life Magic,0.75,32,16,5,0.05,0 -2023,Recall the Sanctuary,Transports the caster to the Ithaenc Cathedral.,200,-1,214,70,Item Enchantment,0.5,16,16,30,0,1 -2024,Recall Asmolum 2,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2025,RecallAsmolum 3,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2026,Nerve Burn,Drains one-half of the target's Stamina and gives 200% of that to the caster.,350,-1,89,70,Life Magic,0.75,36,16,5,0.05,0 -2027,Martyr,Drains all of the caster's Health and gives 1000% of that to the target.,250,-1,88,60,Life Magic,0.75,31,16,5,0.1,0 -2028,The Path to Kelderam's Ward,Summons a PK-limited portal to the Catacombs beneath the Ithaenc Cathedral.,200,60,203,70,Item Enchantment,0.5,0,65536,0,0,1 -2029,Stamina Blight,Drains 5000 points of the target's Stamina.,275,-1,82,60,Life Magic,0.3,36,16,10,0.05,1 -2030,Flaming Blaze,CREATURE MAGIC ONLY!,250,-1,122,10,War Magic,0.3,0,16,30,0.2,1 -2031,Steel Thorns,CREATURE MAGIC ONLY!,250,-1,122,10,War Magic,0.3,0,16,30,0.2,1 -2032,Electric Blaze,CREATURE MAGIC ONLY!,250,-1,122,10,War Magic,0.3,0,16,30,0.2,1 -2033,Acidic Spray,CREATURE MAGIC ONLY!,250,-1,122,10,War Magic,0.3,0,16,30,0.2,1 -2034,Exploding Fury,Exploding fury for baelzharon,275,-1,135,30,War Magic,0.4,0,0,15,0.2,1 -2035,Electric Discharge,CREATURE MAGIC ONLY!,250,-1,120,30,War Magic,0.3,0,16,30,0.2,1 -2036,Fuming Acid,CREATURE MAGIC ONLY!,250,-1,117,30,War Magic,0.3,0,16,30,0.2,1 -2037,Flaming Irruption,CREATURE MAGIC ONLY!,250,-1,121,30,War Magic,0.3,0,16,30,0.2,1 -2038,Exploding Ice,Exploding fury for baelzharon,275,-1,135,30,War Magic,0.4,0,0,15,0.2,1 -2039,Sparking Fury,CREATURE MAGIC ONLY!,275,-1,134,30,War Magic,0.4,0,16,30,0.2,1 -2040,The Path to Kelderam's Ward,Will create a portal to the Sepulcher of the Hopeslayer.,200,60,203,70,Item Enchantment,0.5,0,65536,0,0,1 -2041,Aerlinthe Recall,Transports the caster to Aerlinthe Island.,150,-1,214,150,Item Enchantment,0.25,0,16,0,0,1 -2042,Demon's Tongues,Sends a wall of lag towards the opponents. burning them to a tasty crisp.,200,-1,233,1,War Magic,0.2,0,0,30,0.2,1 -2043,Weight of Eternity,Afflicts the target with the weight of thousands of years.,500,60,2,1,Creature Enchantment,0.3,7,16,5,0.25,1 -2044,Item Befoulment,The target becomes totally ineffectual with Item magic. ,275,400,46,60,Creature Enchantment,0.3,27,16,5,0.25,1 -2045,Demon Fists,Rains LOTS of boulders down. smooshing any that oppose.,320,-1,237,120,War Magic,0.25,0,16,30,0.5,1 -2046,Portal to Teth,Transports the target to the Fort Tethana. ,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2047,Demonskin,The target's skin becomes hardened against physical damage.,900,1020,115,60,Life Magic,0.3,55,16,5,0.25,1 -2048,Boon of the Demon,Gives the target a huge boost to their magic defense.,250,1020,41,60,Creature Enchantment,0.3,22,16,5,0.25,1 -2049,Bile of the Hopeslayer,Coats a weapon in the bile of Bael'zharon. greatly increasing its damage.,250,1020,154,60,Item Enchantment,0.3,57,257,25,0,1 -2050,Young Love,This is a gem that spectacularly symbolizes all the joys and challenges of marriage. It is a one-use item. so use it wisely to mark your commitment to share your life with another. Best used outdoors. in the open.,1,-1,67,15,Life Magic,0.01,141,16,0,0,1 -2051,Young Love,This is a gem that spectacularly symbolizes all the joys and challenges of marriage. It is a one-use item. so use it wisely to mark your commitment to share your life with another. Best used outdoors. in the open.,1,-1,67,15,Life Magic,0.01,141,16,0,0,1 -2052,Executor's Boon,Increases the target's natural armor by 225 points.,300,3600,115,70,Life Magic,0.15,55,16,5,0.25,1 -2053,Executor's Blessing,Increases the caster's natural armor by 225 points.,300,3600,115,70,Life Magic,0.15,55,16,0,0,1 -2054,Synaptic Misfire,Decreases the target's Focus by 40 points.,325,240,10,70,Creature Enchantment,0.15,17,16,5,0.25,1 -2055,Bafflement Self VII,Decreases the caster's Focus by 40 points.,325,240,10,70,Creature Enchantment,0.15,17,16,0,0,1 -2056,Ataxia,Decreases the target's Coordination by 40 points.,325,240,8,70,Creature Enchantment,0.15,9,16,5,0.25,1 -2057,Clumsiness Self VII,Decreases the caster's Coordination by 40 points.,325,240,8,70,Creature Enchantment,0.15,9,16,0,0,1 -2058,Boon of Refinement,Increases the target's Coordination by 40 points.,300,3600,7,70,Creature Enchantment,0.15,8,16,5,0.25,1 -2059,Honed Control,Increases the caster's Coordination by 40 points.,300,3600,7,70,Creature Enchantment,0.15,8,16,0,0,1 -2060,Temeritous Touch,Increases the target's Endurance by 40 points.,300,3600,3,70,Creature Enchantment,0.15,10,16,5,0.25,1 -2061,Perseverance,Increases the caster's Endurance by 40 points.,300,3600,3,70,Creature Enchantment,0.15,10,16,0,0,1 -2062,Anemia,Drains 52-105 points of the target's Stamina.,325,-1,82,70,Life Magic,0.05,36,16,35,0,1 -2063,Enfeeble Self VII,Drains 50-100 points of the caster's Stamina.,325,-1,82,70,Life Magic,0.15,36,16,0,0,1 -2064,Self Loathing,Decreases the target's Self by 40 points.,325,240,12,70,Creature Enchantment,0.15,15,16,5,0.25,1 -2065,Feeblemind Self VII,Decreases the caster's Self by 40 points.,325,240,12,70,Creature Enchantment,0.15,15,16,0,0,1 -2066,Calming Gaze,Increases the target's Focus by 40 points.,300,3600,9,70,Creature Enchantment,0.15,16,16,5,0.25,1 -2067,Inner Calm,Increases the caster's Focus by 40 points.,300,3600,9,70,Creature Enchantment,0.15,16,16,0,0,1 -2068,Brittle Bones,Decreases the target's Endurance by 40 points.,325,240,4,70,Creature Enchantment,0.15,11,16,5,0.25,1 -2069,Frailty Self VII,Decreases the caster's Endurance by 40 points.,325,240,4,70,Creature Enchantment,0.15,11,16,0,0,1 -2070,Heart Rend,Drains 42-79 points of the target's Health.,325,-1,80,70,Life Magic,0.15,32,16,35,0,1 -2071,Harm Self VII,Drains 40-75 points of the caster's Health.,325,-1,80,70,Life Magic,0.15,32,16,0,0,1 -2072,Adja's Gift,Restores 80-150 points of the target's Health.,300,-1,79,70,Life Magic,0.15,31,16,5,0.25,1 -2073,Adja's Intervention,Restores 80-150 points of the caster's Health.,300,-1,67,70,Life Magic,0.15,31,16,0,0,1 -2074,Gossamer Flesh,Decreases the target's natural armor by 225 points.,325,240,116,70,Life Magic,0.15,56,16,5,0.25,1 -2075,Imperil Self VII,Decreases the caster's natural armor by 225 points.,325,240,116,70,Life Magic,0.15,56,16,0,0,1 -2076,Mana Boost Other VII,Restores 51-100 points of the target's Mana.,300,-1,83,70,Life Magic,0.15,33,16,5,0.25,1 -2077,Mana Boost Self VII,Restores 51-100 points of the caster's Mana.,300,-1,83,70,Life Magic,0.15,33,16,0,0,1 -2078,Void's Call,Drains 42-79 points of the target's Mana.,325,-1,84,70,Life Magic,0.15,34,16,35,0,1 -2079,Mana Drain Self VII,Drains 40-75 points of the caster's Mana.,325,-1,84,70,Life Magic,0.15,34,16,0,0,1 -2080,Ogfoot,Increases the target's Quickness by 40 points.,300,3600,5,70,Creature Enchantment,0.15,12,16,5,0.25,1 -2081,Hastening,Increases the caster's Quickness by 40 points.,300,3600,5,70,Creature Enchantment,0.15,12,16,0,0,1 -2082,Replenish,Restores 100-200 points of the target's Stamina.,300,-1,81,70,Life Magic,0.05,35,16,5,0.25,1 -2083,Robustification,Restores 100-200 points of the caster's Stamina.,300,-1,81,70,Life Magic,0.15,35,16,0,0,1 -2084,Belly of Lead,Decreases the target's Quickness by 40 points.,325,240,6,70,Creature Enchantment,0.15,13,16,5,0.25,1 -2085,Slowness Self VII,Decreases the caster's Quickness by 40 points.,325,240,6,70,Creature Enchantment,0.15,13,16,0,0,1 -2086,Might of the 5 Mules,Increases the target's Strength by 40 points.,300,3600,1,70,Creature Enchantment,0.15,6,16,5,0.25,1 -2087,Might of the Lugians,Increases the caster's Strength by 40 points.,300,3600,1,70,Creature Enchantment,0.15,6,16,0,0,1 -2088,Senescence,Decreases the target's Strength by 40 points.,325,240,2,70,Creature Enchantment,0.15,7,16,5,0.25,1 -2089,Weakness Self VII,Decrease the caster's Strength by 40 points.,325,240,2,70,Creature Enchantment,0.2,7,16,0,0,1 -2090,Bolstered Will,Increases the target's Self by 40 points.,300,3600,11,70,Creature Enchantment,0.15,14,16,5,0.25,1 -2091,Mind Blossom,Increases the caster's Self by 40 points.,300,3600,11,70,Creature Enchantment,0.15,14,16,0,0,1 -2092,Olthoi's Bane,Increases a shield or piece of armor's resistance to acid damage by 170%. Target yourself to cast this spell on all of your equipped armor.,300,3600,162,70,Item Enchantment,0.15,63,6,25,0,1 -2093,Olthoi Bait,Decreases a shield or piece of armor's resistance to acid damage by 170%.,325,240,163,70,Item Enchantment,0.15,64,6,25,0,1 -2094,Swordsman's Bane,Increases a shield or piece of armor's resistance to slashing damage by 170%. Target yourself to cast this spell on all of your equipped armor.,300,3600,174,70,Item Enchantment,0.15,61,6,25,0,1 -2095,Swordsman Bait,Decreases a shield or piece of armor's resistance to slashing damage by 170%.,325,240,175,70,Item Enchantment,0.15,62,6,25,0,1 -2096,Aura of Infected Caress,Increases a weapon's damage value by 22 points.,300,3600,154,70,Item Enchantment,0.15,57,16,25,0,1 -2097,Pacification,Decreases a weapon's damage value by 22 points.,325,240,155,70,Item Enchantment,0.15,58,257,25,0,1 -2098,Tusker's Bane,Increases a shield or piece of armor's resistance to bludgeoning damage by 170%. Target yourself to cast this spell on all of your equipped armor.,300,3600,164,70,Item Enchantment,0.15,67,6,25,0,1 -2099,Tusker Bait,Decreases a shield or piece of armor's resistance to bludgeoning damage by 170%.,325,240,165,70,Item Enchantment,0.15,68,6,25,0,1 -2100,Tattercoat,Worsens a shield or piece of armor's armor value by 220 points.,325,240,161,70,Item Enchantment,0.15,143,6,25,0,1 -2101,Aura of Cragstone's Will,Increases the Melee Defense skill modifier of a weapon or magic caster by 17%.,300,3600,156,70,Item Enchantment,0.15,61,16,25,0,1 -2102,Inferno's Bane,Increases a shield or piece of armor's resistance to fire damage by 170%. Target yourself to cast this spell on all of your equipped armor.,300,3600,170,70,Item Enchantment,0.15,57,6,25,0,1 -2103,Inferno Bait,Decreases a shield or piece of armor's resistance to fire damage by 170%.,325,240,171,70,Item Enchantment,0.15,58,6,25,0,1 -2104,Gelidite's Bane,Increases a shield or piece of armor's resistance to cold damage by 170%. Target yourself to cast this spell on all of your equipped armor.,300,3600,166,70,Item Enchantment,0.15,65,6,25,0,1 -2105,Gelidite Bait,Decreases a shield or piece of armor's resistance to cold damage by 170%.,325,240,167,70,Item Enchantment,0.15,66,6,25,0,1 -2106,Aura of Elysa's Sight,Increases a weapon's Attack Skill modifier by 17.0 percentage points.,300,3600,152,70,Item Enchantment,0.15,59,16,25,0,1 -2107,Cabalistic Ostracism,Decreases a magic casting implement's mana conversion bonus by 70%.,325,240,194,70,Item Enchantment,0.15,68,32768,25,0,1 -2108,Brogard's Defiance,Improves a shield or piece of armor's armor value by 220 points. Target yourself to cast this spell on all of your equipped armor.,300,3600,160,70,Item Enchantment,0.15,142,6,25,0,1 -2109,Lugian's Speed,Worsens a weapon's speed by 70 points.,325,240,159,70,Item Enchantment,0.15,64,257,25,0,1 -2110,Astyrrian's Bane,Increases a shield or piece of armor's resistance to electric damage by 170%. Target yourself to cast this spell on all of your equipped armor.,300,3600,168,70,Item Enchantment,0.15,67,6,25,0,1 -2111,Astyrrian Bait,Decreases a shield or piece of armor's resistance to electric damage by 170%.,325,240,169,70,Item Enchantment,0.15,68,6,25,0,1 -2112,Wi's Folly,Decreases the Melee Defense skill modifier of a weapon or magic caster by 17%.,325,240,157,70,Item Enchantment,0.15,62,33025,25,0,1 -2113,Archer's Bane,Increases a shield or piece of armor's resistance to piercing damage by 170%. Target yourself to cast this spell on all of your equipped armor.,300,3600,172,70,Item Enchantment,0.15,59,6,25,0,1 -2114,Archer Bait,Decreases a shield or piece of armor's resistance to piercing damage by 170%.,325,240,173,70,Item Enchantment,0.15,60,6,25,0,1 -2115,Fortified Lock,Increases a lock's resistance to picking by 200 points.,300,240,192,70,Item Enchantment,0.15,59,640,25,0,1 -2116,Aura of Atlan's Alacrity,Improves a weapon's speed by 70 points.,300,3600,158,70,Item Enchantment,0.15,63,16,25,0,1 -2117,Aura of Mystic's Blessing,Increases a magic casting implement's mana conversion bonus by 70%.,300,3600,195,70,Item Enchantment,0.15,67,16,25,0,1 -2118,Clouded Motives,Decreases a weapon's Attack Skill modifier by 17.0 percentage points.,325,240,153,70,Item Enchantment,0.15,60,257,25,0,1 -2119,Vagabond's Gift,Decreases a lock's resistance to picking by 200 points.,300,240,193,70,Item Enchantment,0.15,60,640,25,0,1 -2120,Dissolving Vortex,Shoots five streams of acid outward from the caster. Each stream does 42-84 points of acid damage to the first thing it hits.,325,-1,131,35,War Magic,0.15,0,16,30,0.2,1 -2121,Corrosive Flash,Sends a stream of acid streaking towards the target. The stream does 42-84 points of acid damage to the first thing it hits.,300,-1,243,70,War Magic,0.15,0,16,30,0.2,1 -2122,Disintegration,Shoots a stream of acid at the target. The stream does 115-189 points of acid damage to the first thing it hits.,300,-1,117,35,War Magic,0.15,0,16,30,0.2,1 -2123,Celdiseth's Searing,Shoots five streams of acid toward the target. Each stream does 42-84 points of acid damage to the first thing it hits.,325,-1,207,35,War Magic,0.15,0,16,30,0.2,1 -2124,Sau Kolin's Sword,Shoots five whirling blades outward from the caster. Each blade does 42-84 points of slashing damage to the first thing it hits.,325,-1,137,35,War Magic,0.15,0,16,30,0.2,1 -2125,Flensing Wings,Shoots five whirling blades toward the target. Each blade does 42-84 points of Slashing damage to the first thing it hits.,325,-1,213,35,War Magic,0.15,0,16,30,0.2,1 -2126,Thousand Fists,Shoots five shock waves toward the target. Each wave does 42-84 points of bludgeoning damage to the first thing it hits.,325,-1,208,35,War Magic,0.15,0,16,30,0.2,1 -2127,Silencia's Scorn,Shoots five bolts of flame outward from the caster. Each bolt does 42-84 points of fire damage to the first thing it hits.,325,-1,135,35,War Magic,0.15,0,16,30,0.2,1 -2128,Ilservian's Flame,Shoots a bolt of flame at the target. The bolt does 115-189 points of fire damage to the first thing it hits.,300,-1,121,35,War Magic,0.15,0,16,30,0.2,1 -2129,Sizzling Fury,Sends a bolt of flame streaking towards the target. The bolt does 42-84 points of fire damage to the first thing it hits.,300,-1,247,70,War Magic,0.15,0,16,30,0.2,1 -2130,Infernae,Shoots five bolts of flame toward the target. Each bolt does 42-84 points of fire damage to the first thing it hits.,325,-1,211,35,War Magic,0.15,0,16,15,0.2,1 -2131,Stinging Needles,Shoots five force bolts outward from the caster. Each bolt does 42-84 points of piercing damage to the first thing it hits.,325,-1,136,35,War Magic,0.15,0,16,30,0.2,1 -2132,The Spike,Shoots a bolt of force at the target. The bolt does 115-189 points of piercing damage to the first thing it hits.,300,-1,122,35,War Magic,0.15,0,16,30,0.2,1 -2133,Outlander's Insolence,Sends a bolt of force streaking towards the target. The bolt does 42-84 points of piercing damage to the first thing it hits.,300,-1,248,70,War Magic,0.15,0,16,30,0.2,1 -2134,Fusillade,Shoots five bolts of force toward the target. Each bolt does 42-84 points of piercing damage to the first thing it hits.,325,-1,212,35,War Magic,0.15,0,16,30,0.4,1 -2135,Winter's Embrace,Shoots five bolts of frost outward from the caster. Each bolt does 42-84 points of cold damage to the first thing it hits.,325,-1,133,35,War Magic,0.15,0,0,30,0.2,1 -2136,Icy Torment,Shoots a bolt of cold at the target. The bolt does 115-189 points of cold damage to the first thing it hits.,300,-1,119,35,War Magic,0.15,0,16,30,0.2,1 -2137,Sudden Frost,Sends a bolt of cold streaking towards the target. The bolt does 42-84 points of cold damage to the first thing it hits.,300,-1,245,70,War Magic,0.15,0,16,30,0.2,1 -2138,Blizzard,Shoots five bolts of frost toward the target. Each bolt does 42-84 points of cold damage to the first thing it hits.,325,-1,209,35,War Magic,0.15,0,16,30,0.2,1 -2139,Luminous Wrath,Shoots five bolts of lightning outward from the caster. Each bolt does 42-84 points of electric damage to the first thing it hits.,325,-1,134,35,War Magic,0.15,0,16,30,0.2,1 -2140,Alset's Coil,Shoots a bolt of lighting at the target. The bolt does 115-189 points of electrical damage to the first thing it hits.,300,-1,120,35,War Magic,0.15,0,16,30,0.2,1 -2141,Lhen's Flare,Sends a bolt of lighting streaking towards the target. The bolt does 42-84 points of electrical damage to the first thing it hits.,300,-1,246,70,War Magic,0.15,0,16,30,0.2,1 -2142,Tempest,Shoots five bolts of lightning toward the target. Each bolt does 42-84 points of electric damage to the first thing it hits.,325,-1,210,35,War Magic,0.15,0,16,30,0.2,1 -2143,Pummeling Storm,Shoots five shock waves outward from the caster. Each wave does 42-84 points of damage to the first thing it hits.,325,-1,132,35,War Magic,0.15,0,16,30,0.2,1 -2144,Crushing Shame,Shoots a shock wave at the target. The wave does 115-189 points of bludgeoning damage to the first thing it hits.,300,-1,118,35,War Magic,0.15,0,16,30,0.2,1 -2145,Cameron's Curse,Sends a shock wave streaking towards the target. The wave does 42-84 points of bludgeoning damage to the first thing it hits.,300,-1,244,70,War Magic,0.15,0,16,30,0.2,1 -2146,Evisceration,Shoots a magical blade at the target. The bolt does 115-189 points of slashing damage to the first thing it hits.,300,-1,123,35,War Magic,0.15,0,16,30,0.2,1 -2147,Rending Wind,Sends a magical blade streaking towards the target. The bolt does 42-84 points of slashing damage to the first thing it hits.,300,-1,249,70,War Magic,0.15,0,16,30,0.2,1 -2148,Caustic Boon,Reduces damage the target takes from acid by 65%.,300,3600,101,70,Life Magic,0.15,49,16,5,0.25,0 -2149,Caustic Blessing,Reduces damage the caster takes from acid by 65%.,300,3600,101,70,Life Magic,0.15,49,16,0,0,0 -2150,Boon of the Blade Turner,Reduces damage the target takes from Slashing by 65%.,300,3600,113,70,Life Magic,0.15,47,16,5,0.25,0 -2151,Blessing of the Blade Turner,Reduces damage the caster takes from Slashing by 65%.,300,3600,113,70,Life Magic,0.15,47,16,0,0,0 -2152,Boon of the Mace Turner,Reduces damage the target takes from Bludgeoning by 65%.,300,3600,103,70,Life Magic,0.15,55,16,5,0.25,0 -2153,Blessing of the Mace Turner,Reduces damage the caster takes from Bludgeoning by 65%.,300,3600,103,70,Life Magic,0.15,55,16,0,0,0 -2154,Icy Boon,Reduces damage the target takes from Cold by 65%.,300,3600,105,70,Life Magic,0.15,51,16,5,0.25,0 -2155,Icy Blessing,Reduces damage the caster takes from Cold by 65%.,300,3600,105,70,Life Magic,0.15,51,16,0,0,0 -2156,Fiery Boon,Reduces damage the target takes from fire by 65%.,300,3600,109,70,Life Magic,0.15,43,16,5,0.25,0 -2157,Fiery Blessing,Reduces damage the caster takes from Fire by 65%.,300,3600,109,70,Life Magic,0.15,43,16,0,0,0 -2158,Storm's Boon,Reduces damage the target takes from Lightning by 65%.,300,3600,107,70,Life Magic,0.15,53,16,5,0.25,0 -2159,Storm's Blessing,Reduces damage the caster takes from Lightning by 65%.,300,3600,107,70,Life Magic,0.15,53,16,0,0,0 -2160,Boon of the Arrow Turner,Reduces damage the target takes from Piercing by 65%.,300,3600,111,70,Life Magic,0.15,45,16,5,0.25,0 -2161,Blessing of the Arrow Turner,Reduces damage the caster takes from Piercing by 65%.,300,3600,111,70,Life Magic,0.15,45,16,5,0.25,0 -2162,Olthoi's Gift,Increases damage the target takes from acid by 185%.,325,240,102,70,Life Magic,0.15,50,16,5,0.25,1 -2163,Acid Vulnerability Self VII,Increases damage the caster takes from acid by 185%.,325,240,102,70,Life Magic,0.15,50,16,0,0,1 -2164,Swordsman's Gift,Increases damage the target takes from Slashing by 185%.,325,240,114,70,Life Magic,0.15,48,16,5,0.25,1 -2165,Blade Vulnerability Self VII,Increases damage the caster takes from Slashing by 185%.,325,240,114,70,Life Magic,0.15,48,16,0,0,1 -2166,Tusker's Gift,Increases damage the target takes from Bludgeoning by 185%.,325,240,104,70,Life Magic,0.15,56,16,5,0.25,1 -2167,Bludgeoning Vulnerability Self VII,Increases damage the caster takes from Bludgeoning by 185%.,325,240,104,70,Life Magic,0.15,56,16,0,0,1 -2168,Gelidite's Gift,Increases damage the target takes from Cold by 185%.,325,240,106,70,Life Magic,0.15,52,16,5,0.25,1 -2169,Cold Vulnerability Self VII,Increases damage the caster takes from Cold by 185%.,325,240,106,70,Life Magic,0.15,52,16,0,0,1 -2170,Inferno's Gift,Increases damage the target takes from Fire by 185%.,325,240,110,70,Life Magic,0.15,44,16,5,0.25,1 -2171,Fire Vulnerability Self VII,Increases damage the caster takes from Fire by 185%.,325,240,110,70,Life Magic,0.15,44,16,0,0,1 -2172,Astyrrian's Gift,Increases damage the target takes from Lightning by 185%.,325,240,108,70,Life Magic,0.15,54,16,5,0.25,1 -2173,Lightning Vulnerability Self VII,Increases damage the caster takes from Lightning by 185%.,325,240,108,70,Life Magic,0.15,54,16,0,0,1 -2174,Archer's Gift,Increases damage the target takes from Piercing by 185%.,325,240,112,70,Life Magic,0.15,46,16,5,0.25,1 -2175,Piercing Vulnerability Self VII,Increases damage the caster takes from Piercing by 185%.,325,240,112,70,Life Magic,0.15,46,16,0,0,1 -2176,Enervation,Decreases the rate at which the target regains Stamina by 60%.,325,240,96,70,Life Magic,0.15,42,16,5,0.25,0 -2177,Exhaustion Self VII,Decreases the rate at which the caster regains Stamina by 60%.,325,240,96,70,Life Magic,0.15,42,16,0,0,0 -2178,Decrepitude's Grasp,Decrease target's natural healing rate by 60%.,325,240,94,70,Life Magic,0.15,38,16,5,0.25,0 -2179,Fester Self VII,Decrease caster's natural healing rate by 60%.,325,240,94,70,Life Magic,0.15,38,16,5,1,0 -2180,Energy Flux,Decreases target's natural mana rate by 60%.,325,240,98,70,Life Magic,0.15,40,16,5,0.25,0 -2181,Mana Depletion Self VII,Decreases caster's natural mana rate by 60%.,325,240,98,70,Life Magic,0.15,40,16,0,0,0 -2182,Battlemage's Boon,Increases the target's natural mana rate by 115%.,300,3600,97,70,Life Magic,0.15,39,16,5,0.25,1 -2183,Battlemage's Blessing,Increases the caster's natural mana rate by 115%.,300,3600,97,70,Life Magic,0.15,39,16,0,0,1 -2184,Hydra's Head,Increase target's natural healing rate by 115%.,300,3600,93,70,Life Magic,0.15,37,16,5,0.25,1 -2185,Robustify,Increase caster's natural healing rate by 115%.,300,3600,93,70,Life Magic,0.15,37,16,5,1,1 -2186,Tenaciousness,Increases the rate at which the target regains Stamina by 115%.,300,3600,95,70,Life Magic,0.15,41,16,5,0.25,1 -2187,Unflinching Persistence,Increases the rate at which the caster regains Stamina by 115%.,300,3600,95,70,Life Magic,0.15,41,16,0,0,1 -2188,Bottle Breaker,Decreases the target's Alchemy skill by 40 points.,325,240,220,70,Creature Enchantment,0.15,27,16,5,0.25,1 -2189,Alchemy Ineptitude Self VII,Decreases the caster's Alchemy skill by 40 points.,325,240,220,70,Creature Enchantment,0.15,27,16,0,0,1 -2190,Silencia's Boon,Increases the target's Alchemy skill by 40 points.,300,3600,221,70,Creature Enchantment,0.15,26,16,5,0.25,1 -2191,Silencia's Blessing,Increases the caster's Alchemy skill by 40 points.,300,3600,221,70,Creature Enchantment,0.15,26,16,0,0,1 -2192,Hands of Chorizite,Decreases the target's Arcane Lore skill by 40 points.,325,240,54,70,Creature Enchantment,0.15,27,16,5,0.25,1 -2193,Arcane Benightedness Self VII,Decreases the caster's Arcane Lore skill by 40 points.,325,240,54,70,Creature Enchantment,0.15,27,16,0,0,1 -2194,Aliester's Boon,Increases the target's Arcane Lore skill by 40 points.,300,3600,53,70,Creature Enchantment,0.15,26,16,5,0.25,1 -2195,Aliester's Blessing,Increases the caster's Arcane Lore skill by 40 points.,300,3600,53,70,Creature Enchantment,0.15,26,16,0,0,1 -2196,Jibril's Boon,Increases the target's Armor Tinkering skill by 40 points.,300,3600,55,70,Creature Enchantment,0.15,28,16,5,0.25,1 -2197,Jibril's Blessing,Increases the caster's Armor Tinkering skill by 40 points.,300,3600,55,70,Creature Enchantment,0.15,28,16,0,0,1 -2198,Jibril's Vitae,Decreases the target's Armor Tinkering skill by 40 points.,325,240,56,70,Creature Enchantment,0.15,29,16,5,0.25,1 -2199,Armor Tinkering Ignorance Self VII,Decreases the caster's Armor Tinkering skill by 40 points.,325,240,56,70,Creature Enchantment,0.15,29,16,0,0,1 -2200,Light Weapon Ineptitude Other VII,Decreases the target's Light Weapons skill by 40 points.,325,240,18,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2201,Light Weapon Ineptitude Self VII,Decreases the caster's Light Weapons skill by 40 points.,325,240,18,70,Creature Enchantment,0.15,19,16,0,0,1 -2202,Light Weapon Mastery Other VII,Increases the target's Light Weapons skill by 40 points.,300,3600,17,70,Creature Enchantment,0.15,18,16,5,0.25,1 -2203,Light Weapon Mastery Self VII,Increases the caster's Light Weapons skill by 40 points.,300,3600,17,70,Creature Enchantment,0.15,18,16,0,0,1 -2204,Missile Weapon Ineptitude Other VII,Decreases the target's Missile Weapons skill by 40 points.,325,240,20,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2205,Missile Weapon Ineptitude Self VII,Decreases the caster's Missile Weapons skill by 40 points.,325,240,20,70,Creature Enchantment,0.15,19,16,0,0,1 -2206,Missile Weapon Mastery Other VII,Increases the target's Missile Weapons skill by 40 points.,300,3600,19,70,Creature Enchantment,0.15,18,16,5,0.25,1 -2207,Missile Weapon Mastery Self VII,Increases the caster's Missile Weapons skill by 40 points.,300,3600,19,70,Creature Enchantment,0.15,18,16,0,0,1 -2208,Challenger's Legacy,Decreases the target's Cooking skill by 40 points.,325,240,217,70,Creature Enchantment,0.15,21,16,5,0.25,1 -2209,Cooking Ineptitude Self VII,Decreases the caster's Cooking skill by 40 points.,325,240,217,70,Creature Enchantment,0.15,21,16,0,0,1 -2210,Morimoto's Boon,Increases the target's Cooking skill by 40 points.,300,3600,216,70,Creature Enchantment,0.15,20,16,5,0.25,1 -2211,Morimoto's Blessing,Increases the caster's Cooking skill by 40 points.,300,3600,216,70,Creature Enchantment,0.15,20,16,0,0,1 -2212,Wrath of Adja,Decreases the target's Creature Enchantment skill by 40 points.,325,240,44,70,Creature Enchantment,0.15,27,16,5,0.25,1 -2213,Creature Enchantment Ineptitude Self VII,Decreases the caster's Creature Enchantment skill by 40 points.,325,240,44,70,Creature Enchantment,0.15,27,16,0,0,1 -2214,Adja's Boon,Increases the target's Creature Enchantment skill by 40 points.,300,3600,43,70,Creature Enchantment,0.15,26,16,5,0.25,1 -2215,Adja's Blessing,Increases the caster's Creature Enchantment skill by 40 points.,300,3600,43,70,Creature Enchantment,0.15,26,16,0,0,1 -2216,Missile Weapon Ineptitude Other VII,Decreases the target's Missile Weapons skill by 40 points.,325,240,20,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2217,Missile Weapon Ineptitude Self VII,Decreases the caster's Missile Weapons skill by 40 points.,325,240,20,70,Creature Enchantment,0.15,19,16,0,0,1 -2218,Missile Weapon Mastery Other VII,Increases the target's Missile Weapons skill by 40 points.,300,3600,19,70,Creature Enchantment,0.15,18,16,5,0.25,1 -2219,Missile Weapon Mastery Self VII,Increases the caster's Missile Weapons skill by 40 points.,300,3600,19,70,Creature Enchantment,0.15,18,16,0,0,1 -2220,Finesse Weapon Ineptitude Other VII,Decreases the target's Finesse Weapons skill by 40 points.,325,240,24,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2221,Finesse Weapon Ineptitude Self VII,Decreases the caster's Finesse Weapons skill by 40 points.,325,240,24,70,Creature Enchantment,0.15,19,16,0,0,1 -2222,Finesse Weapon Mastery Other VII,Increases the target's Finesse Weapons skill by 40 points.,300,3600,23,70,Creature Enchantment,0.15,18,16,5,0.25,1 -2223,Finesse Weapon Mastery Self VII,Increases the caster's Finesse Weapons skill by 40 points.,300,3600,23,70,Creature Enchantment,0.15,18,16,0,0,1 -2224,Hearts on Sleeves,Decreases the target's Deception skill by 40 points.,325,240,66,70,Creature Enchantment,0.15,29,16,5,0.25,1 -2225,Deception Ineptitude Self VII,Decreases the caster's Deception skill by 40 points.,325,240,66,70,Creature Enchantment,0.15,29,16,0,0,1 -2226,Ketnan's Boon,Increases the target's Deception skill by 40 points.,300,3600,65,70,Creature Enchantment,0.15,28,16,5,0.25,1 -2227,Ketnan's Blessing,Increases the caster's Deception skill by 40 points.,300,3600,65,70,Creature Enchantment,0.15,28,16,0,0,1 -2228,Broadside of a Barn,Decreases the target's Missile Defense skill by 40 points.,325,240,40,70,Creature Enchantment,0.15,23,16,5,0.25,1 -2229,Defenselessness Self VII,Decreases the caster's Missile Defense skill by 40 points.,325,240,40,70,Creature Enchantment,0.15,23,16,0,0,1 -2230,Sashi Mu's Kiss,Decreases the target's Loyalty skill by 40 points.,325,240,76,70,Creature Enchantment,0.15,21,16,5,0.25,1 -2231,Faithlessness Self VII,Decreases the caster's Loyalty skill by 40 points.,325,240,76,70,Creature Enchantment,0.15,21,16,0,0,1 -2232,Odif's Boon,Increases the target's Loyalty skill by 40 points.,300,3600,75,70,Creature Enchantment,0.15,20,16,5,0.25,1 -2233,Odif's Blessing,Increases the caster's Loyalty skill by 40 points.,300,3600,75,70,Creature Enchantment,0.15,20,16,0,0,1 -2234,Twisted Digits,Decreases the target's Fletching skill by 40 points.,325,240,219,70,Creature Enchantment,0.15,21,16,5,0.25,1 -2235,Fletching Ineptitude Self VII,Decreases the caster's Fletching skill by 40 points.,325,240,219,70,Creature Enchantment,0.15,21,16,0,0,1 -2236,Lilitha's Boon,Increases the target's Fletching skill by 40 points.,300,3600,218,70,Creature Enchantment,0.15,20,16,5,0.25,1 -2237,Lilitha's Blessing,Increases the caster's Fletching skill by 40 points.,300,3600,218,70,Creature Enchantment,0.15,20,16,0,0,1 -2238,Unsteady Hands,Decreases the target's Healing skill by 40 points.,325,240,68,70,Creature Enchantment,0.15,21,16,5,0.25,1 -2239,Healing Ineptitude Self VII,Decreases the caster's Healing skill by 40 points.,325,240,68,70,Creature Enchantment,0.15,21,16,0,0,1 -2240,Avalenne's Boon,Increases the target's Healing skill by 40 points.,300,3600,67,70,Creature Enchantment,0.15,20,16,5,0.25,1 -2241,Avalenne's Blessing,Increases the caster's Healing skill by 40 points.,300,3600,67,70,Creature Enchantment,0.15,20,16,0,0,1 -2242,Web of Deflection,Increases the target's Missile Defense skill by 40 points.,300,3600,39,70,Creature Enchantment,0.15,22,16,5,0.25,1 -2243,Aura of Deflection,Increases the caster's Missile Defense skill by 40 points.,300,3600,39,70,Creature Enchantment,0.15,22,16,0,0,1 -2244,Web of Defense,Increases the target's Melee Defense skill by 40 points.,300,3600,37,70,Creature Enchantment,0.15,22,16,5,0.25,1 -2245,Aura of Defense,Increases the caster's Melee Defense skill by 40 points.,300,3600,37,70,Creature Enchantment,0.15,22,16,0,0,1 -2246,Wrath of Celcynd,Decreases the target's Item Enchantment skill by 40 points.,325,240,46,70,Creature Enchantment,0.15,27,16,5,0.25,1 -2247,Item Enchantment Ineptitude Self VII,Decreases the caster's Item Enchantment skill by 40 points.,325,240,46,70,Creature Enchantment,0.15,27,16,0,0,1 -2248,Celcynd's Boon,Increases the target's Item Enchantment skill by 40 points.,300,3600,45,70,Creature Enchantment,0.15,26,16,5,0.25,1 -2249,Celcynd's Blessing,Increases the caster's Item Enchantment skill by 40 points.,300,3600,45,70,Creature Enchantment,0.15,26,16,0,0,1 -2250,Yoshi's Boon,Increases the target's Item Tinkering skill by 40 points.,300,3600,57,70,Creature Enchantment,0.15,28,16,5,0.25,1 -2251,Yoshi's Blessing,Increases the caster's Item Tinkering skill by 40 points.,300,3600,57,70,Creature Enchantment,0.15,28,16,0,0,1 -2252,Unfortunate Appraisal,Decreases the target's Item Tinkering skill by 40 points.,325,240,58,70,Creature Enchantment,0.15,29,16,5,0.25,1 -2253,Item Tinkering Ignorance Self VII,Decreases the caster's Item Tinkering skill by 40 points.,325,240,58,70,Creature Enchantment,0.15,29,16,0,0,1 -2254,Feat of Radaz,Decreases the target's Jump skill by 40 points.,325,240,70,70,Creature Enchantment,0.15,25,16,5,0.25,1 -2255,Jumping Ineptitude Self VII,Decreases the caster's Jump skill by 40 points.,325,240,70,70,Creature Enchantment,0.15,25,16,0,0,1 -2256,Jahannan's Boon,Increases the target's Jump skill by 40 points.,300,3600,69,70,Creature Enchantment,0.15,24,16,5,0.25,1 -2257,Jahannan's Blessing,Increases the caster's Jump skill by 40 points.,300,3600,69,70,Creature Enchantment,0.15,24,16,0,0,1 -2258,Gears Unwound,Decreases the target's Run skill by 40 points.,325,240,78,70,Creature Enchantment,0.15,25,16,5,0.25,1 -2259,Leaden Feet Self VII,Decreases the caster's Run skill by 40 points.,325,240,78,70,Creature Enchantment,0.15,25,16,0,0,1 -2260,Kwipetian Vision,Decreases the target's Leadership skill by 40 points.,325,240,72,70,Creature Enchantment,0.15,21,16,5,0.25,1 -2261,Leadership Ineptitude Self VII,Decreases the caster's Leadership skill by 40 points.,325,240,72,70,Creature Enchantment,0.15,21,16,0,0,1 -2262,Ar-Pei's Boon,Increases the target's Leadership skill by 40 points.,300,3600,71,70,Creature Enchantment,0.15,20,16,5,0.25,1 -2263,Ar-Pei's Blessing,Increases the caster's Leadership skill by 40 points.,300,3600,71,70,Creature Enchantment,0.15,20,16,0,0,1 -2264,Wrath of Harlune,Decreases the target's Life Magic skill by 40 points.,325,240,48,70,Creature Enchantment,0.15,27,16,5,0.25,1 -2265,Life Magic Ineptitude Self VII,Decreases the caster's Life Magic skill by 40 points.,325,240,48,70,Creature Enchantment,0.15,27,16,0,0,1 -2266,Harlune's Boon,Increases the target's Life Magic skill by 40 points.,300,3600,47,70,Creature Enchantment,0.15,26,16,5,0.25,1 -2267,Harlune's Blessing,Increases the caster's Life Magic skill by 40 points.,300,3600,47,70,Creature Enchantment,0.15,26,16,0,0,1 -2268,Fat Fingers,Decreases the target's Lockpick skill by 40 points.,325,240,74,70,Creature Enchantment,0.15,21,16,5,0.25,1 -2269,Lockpick Ineptitude Self VII,Decreases the caster's Lockpick skill by 40 points.,325,240,74,70,Creature Enchantment,0.15,21,16,0,0,1 -2270,Oswald's Boon,Increases the target's Lockpick skill by 40 points.,300,3600,73,70,Creature Enchantment,0.15,20,16,5,0.25,1 -2271,Oswald's Blessing,Increases the caster's Lockpick skill by 40 points.,300,3600,73,70,Creature Enchantment,0.15,20,16,0,0,1 -2272,Light Weapon Ineptitude Other VII,Decreases the target's Light Weapons skill by 40 points.,325,240,18,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2273,Light Weapon Ineptitude Self VII,Decreases the caster's Light Weapons skill by 40 points.,325,240,18,70,Creature Enchantment,0.15,19,16,0,0,1 -2274,Light Weapon Mastery Other VII,Increases the target's Light Weapons skill by 40 points.,300,3600,17,70,Creature Enchantment,0.15,18,16,5,0.25,1 -2275,Light Weapon Mastery Self VII,Increases the caster's Light Weapons skill by 40 points.,300,3600,17,70,Creature Enchantment,0.15,18,16,0,0,1 -2276,Celdiseth's Boon,Increases the target's Magic Item Tinkering skill by 40 points.,300,3600,59,70,Creature Enchantment,0.15,28,16,5,0.25,1 -2277,Celdiseth's Blessing,Increases the caster's Magic Item Tinkering skill by 40 points.,300,3600,59,70,Creature Enchantment,0.15,28,16,0,0,1 -2278,Eyes Clouded,Decreases the target's Magic Item Tinkering skill by 40 points.,325,240,60,70,Creature Enchantment,0.15,29,16,5,0.25,1 -2279,Magic Item Tinkering Ignorance Self VII,Decreases the caster's Magic Item Tinkering skill by 40 points.,325,240,60,70,Creature Enchantment,0.15,29,16,0,0,1 -2280,Web of Resistance,Increases the target's Magic Defense skill by 40 points.,300,3600,41,70,Creature Enchantment,0.15,22,16,5,0.25,1 -2281,Aura of Resistance,Increases the caster's Magic Defense skill by 40 points.,300,3600,41,70,Creature Enchantment,0.15,22,16,0,0,1 -2282,Futility,Decreases the target's Magic Defense skill by 40 points.,325,240,42,70,Creature Enchantment,0.15,23,16,5,0.25,1 -2283,Magic Yield Self VII,Decreases the caster's Magic Defense skill by 40 points.,325,240,42,70,Creature Enchantment,0.15,23,16,0,0,1 -2284,Inefficient Investment,Decreases the target's Mana Conversion skill by 40 points.,325,240,52,70,Creature Enchantment,0.15,27,16,5,0.25,1 -2285,Mana Conversion Ineptitude Self VII,Decreases the caster's Mana Conversion skill by 40 points.,325,240,52,70,Creature Enchantment,0.15,27,16,0,0,1 -2286,Nuhmudira's Boon,Increases the target's Mana Conversion skill by 40 points.,300,3600,51,70,Creature Enchantment,0.15,26,16,5,0.25,1 -2287,Nuhmudira's Blessing,Increases the caster's Mana Conversion skill by 40 points.,300,3600,51,70,Creature Enchantment,0.15,26,16,0,0,1 -2288,Topheron's Boon,Increases the target's Assess Monster skill by 40 points.,300,3600,63,70,Creature Enchantment,0.15,28,16,5,0.25,1 -2289,Topheron's Blessing,Increases the caster's Assess Monster skill by 40 points.,300,3600,63,70,Creature Enchantment,0.15,28,16,0,0,1 -2290,Ignorance's Bliss,Decreases the target's Assess Monster skill by 40 points.,325,240,64,70,Creature Enchantment,0.15,29,16,5,0.25,1 -2291,Monster Unfamiliarity Self VII,Decreases the caster's Assess Monster skill by 40 points.,325,240,64,70,Creature Enchantment,0.15,29,16,0,0,1 -2292,Kaluhc's Boon,Increases the target's Assess Person skill by 40 points.,300,3600,205,70,Creature Enchantment,0.15,28,16,5,0.25,1 -2293,Kaluhc's Blessing,Increases the caster's Assess Person skill by 40 points.,300,3600,205,70,Creature Enchantment,0.15,28,16,0,0,1 -2294,Introversion,Decreases the target's Assess Person skill by 40 points.,325,240,206,70,Creature Enchantment,0.15,29,16,5,0.25,1 -2295,Person Unfamiliarity Self VII,Decreases the caster's Assess Person skill by 40 points.,325,240,206,70,Creature Enchantment,0.15,29,16,0,0,1 -2296,Light Weapon Ineptitude Other VII,Decreases the target's Light Weapons skill by 40 points.,325,240,18,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2297,Light Weapon Ineptitude Self VII,Decreases the caster's Light Weapons skill by 40 points.,325,240,18,70,Creature Enchantment,0.15,19,16,0,0,1 -2298,Light Weapon Mastery Other VII,Increases the target's Light Weapons skill by 40 points.,300,3600,17,70,Creature Enchantment,0.15,18,16,5,0.25,1 -2299,Light Weapon Mastery Self VII,Increases the caster's Light Weapons skill by 40 points.,300,3600,17,70,Creature Enchantment,0.15,18,16,0,0,1 -2300,Saladur's Boon,Increases the target's Run skill by 40 points.,300,3600,77,70,Creature Enchantment,0.15,24,16,5,0.25,1 -2301,Saladur's Blessing,Increases the caster's Run skill by 40 points.,300,3600,77,70,Creature Enchantment,0.15,24,16,0,0,1 -2302,Light Weapon Ineptitude Other VII,Decreases the target's Light Weapons skill by 40 points.,325,240,18,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2303,Light Weapon Ineptitude Self VII,Decreases the caster's Light Weapons skill by 40 points.,325,240,18,70,Creature Enchantment,0.15,19,16,0,0,1 -2304,Light Weapon Mastery Other VII,Increases the target's Light Weapons skill by 40 points.,300,3600,17,70,Creature Enchantment,0.15,18,16,5,0.25,1 -2305,Light Weapon Mastery Self VII,Increases the caster's Light Weapons skill by 40 points.,300,3600,17,70,Creature Enchantment,0.15,18,16,0,0,1 -2306,Heavy Weapon Ineptitude Other VII,Decreases the target's Heavy Weapons skill by 40 points.,325,240,32,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2307,Heavy Weapon Ineptitude Self VII,Decreases the caster's Heavy Weapons skill by 40 points.,325,240,32,70,Creature Enchantment,0.15,19,16,0,0,1 -2308,Heavy Weapon Mastery Other VII,Increases the target's Heavy Weapons skill by 40 points.,300,3600,31,70,Creature Enchantment,0.15,18,16,5,0.25,1 -2309,Heavy Weapon Mastery Self VII,Increases the caster's Heavy Weapons skill by 40 points.,300,3600,31,70,Creature Enchantment,0.15,18,16,0,0,1 -2310,Missile Weapon Ineptitude Other VII,Decreases the target's Missile Weapons skill by 40 points.,325,240,20,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2311,Missile Weapon Ineptitude Self VII,Decreases the caster's Missile Weapons skill by 40 points.,325,240,20,70,Creature Enchantment,0.15,19,16,0,0,1 -2312,Missile Weapon Mastery Other VII,Increases the target's Missile Weapons skill by 40 points.,300,3600,19,70,Creature Enchantment,0.15,18,16,5,0.25,1 -2313,Missile Weapon Mastery Self VII,Increases the caster's Missile Weapons skill by 40 points.,300,3600,19,70,Creature Enchantment,0.15,18,16,0,0,1 -2314,Light Weapon Ineptitude Other VII,Decreases the target's Light Weapons skill by 40 points.,325,240,18,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2315,Light Weapon Mastery Other VII,Increases the target's Light Weapons skill by 40 points.,300,3600,17,70,Creature Enchantment,0.15,18,16,5,0.25,1 -2316,Light Weapon Mastery Self VII,Increases the caster's Light Weapons skill by 40 points.,300,3600,17,70,Creature Enchantment,0.15,18,16,0,0,1 -2317,Light Weapon Ineptitude Other VII,Decreases the target's Light Weapons skill by 40 points.,325,240,18,70,Creature Enchantment,0.15,19,16,5,0.25,1 -2318,Gravity Well,Decrease the target's Melee Defense skill by 40 points.,325,240,38,70,Creature Enchantment,0.15,23,16,5,0.25,1 -2319,Vulnerability Self VII,Decrease the target's Melee Defense skill by 40 points.,325,240,38,70,Creature Enchantment,0.15,23,16,0,0,1 -2320,Wrath of the Hieromancer,Decreases the target's War Magic skill by 40 points.,325,240,50,70,Creature Enchantment,0.15,27,16,5,0.25,1 -2321,War Magic Ineptitude Self VII,Decreases the caster's War Magic skill by 40 points.,325,240,50,70,Creature Enchantment,0.15,27,16,0,1,1 -2322,Hieromancer's Boon,Increases the target's War Magic skill by 40 points.,300,3600,49,70,Creature Enchantment,0.15,26,16,5,0.25,1 -2323,Hieromancer's Blessing,Increases the caster's War Magic skill by 40 points.,300,3600,49,70,Creature Enchantment,0.15,26,16,0,0,1 -2324,Koga's Boon,Increases the target's Weapon Tinkering skill by 40 points.,300,3600,61,70,Creature Enchantment,0.15,28,16,5,0.25,1 -2325,Koga's Blessing,Increases the caster's Weapon Tinkering skill by 40 points.,300,3600,61,70,Creature Enchantment,0.15,28,16,0,0,1 -2326,Eye of the Grunt,Decreases the target's Weapon Tinkering skill by 40 points.,325,240,62,70,Creature Enchantment,0.15,29,16,5,0.25,1 -2327,Weapon Tinkering Ignorance Self VII,Decreases the caster's Weapon Tinkering skill by 40 points.,325,240,62,70,Creature Enchantment,0.15,29,16,0,0,1 -2328,Vitality Siphon,Drains 50% of the target's Health and gives 50% of it to the caster.,325,-1,87,60,Life Magic,0.75,32,16,35,0,0 -2329,Essence Void,Drains 50% of the target's Mana and gives it to the caster.,325,-1,91,60,Life Magic,0.75,34,16,35,0,0 -2330,Vigor Siphon,Drains 50% of the target's Stamina and gives it to the caster.,325,-1,89,60,Life Magic,0.75,36,16,35,0,0 -2331,Health to Mana Other VII,Drains one-half of the target's Health and gives 175% of that to his/her Mana.,300,-1,87,70,Life Magic,0.15,74,16,5,0,0 -2332,Cannibalize,Drains one-half of the caster's Health and gives 175% of that to his/her Mana.,300,-1,87,70,Life Magic,0.15,74,16,0,0,0 -2333,Health to Stamina Other VII,Drains one-half of the target's Health and gives 175% of that to his/her Stamina.,300,-1,87,70,Life Magic,0.15,73,16,5,0,0 -2334,Self Sacrifice,Drains one-half of the caster's Health and gives 175% of that to his/her Stamina.,300,-1,87,70,Life Magic,0.15,73,16,0,0,0 -2335,Gift of Vitality,Drains one-quarter of the caster's Health and gives 175% of that to the target.,300,-1,88,70,Life Magic,0.75,31,16,5,0.1,0 -2336,Gift of Essence,Drains one-quarter of the caster's Mana and gives 175% of that to the target.,300,-1,92,70,Life Magic,0.75,33,16,5,0.1,0 -2337,Gift of Vigor,Drains one-quarter of the caster's Stamina and gives 175% of that to the target.,300,-1,90,70,Life Magic,0.75,35,16,5,0.1,0 -2338,Mana to Health Other VII,Drains one-half of the target's Mana and gives 175% of that to his/her Health.,300,-1,91,70,Life Magic,0.15,77,16,5,0,0 -2339,Energize Vitality,Drains one-half of the caster's Mana and gives 175% of that to his/her Health.,300,-1,91,70,Life Magic,0.15,77,16,0,0,0 -2340,Mana to Stamina Other VII,Drains one-half of the target's Mana and gives 175% of that to his/her stamina.,300,-1,91,70,Life Magic,0.15,78,16,5,0,0 -2341,Energize Vigor,Drains one-half of the caster's Mana and gives 175% of that to his/her Stamina.,300,-1,91,70,Life Magic,0.15,78,16,0,0,0 -2342,Stamina to Health Other VII,Drains one-half of the target's Stamina and gives 175% of that to his/her Health.,300,-1,89,70,Life Magic,0.15,75,16,5,0,0 -2343,Rushed Recovery,Drains one-half of the caster's Stamina and gives 175% of that to his/her Health.,300,-1,89,70,Life Magic,0.15,75,16,0,0,0 -2344,Stamina to Mana Other VII,Drains one-half of the target's Stamina and gives 175% of that to his/her Mana.,300,-1,89,70,Life Magic,0.15,76,16,5,0,0 -2345,Meditative Trance,Drains one-half of the caster's Stamina and gives 175% of that to his/her Mana.,300,-1,89,70,Life Magic,0.15,76,16,0,0,0 -2346,Malediction,Decreases maximum mana by 50 points.,50,510,284,70,Life Magic,0.3,34,16,0,0,1 -2347,Concentration,Increases the caster's Focus by 25 points.,100,1000,13,40,Creature Enchantment,0.1,16,16,0,0,1 -2348,Brilliance,Increases the target's Focus by 50 points for a short period of time.,250,30,15,60,Creature Enchantment,0.3,16,16,5,0.25,1 -2349,Hieromancer's Ward,Improves a shield or piece of armor's armor value by 170 points. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,200,780,190,50,Item Enchantment,0.2,142,6,25,0,1 -2350,Greater Decay Durance,Increases a shield or piece of armor's resistance to acid damage by 100%. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,200,780,188,50,Item Enchantment,0.2,63,6,25,0,1 -2351,Greater Consumption Durance,Increases a shield or piece of armor's resistance to fire damage by 100%. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,200,780,186,50,Item Enchantment,0.2,57,6,25,0,1 -2352,Greater Stasis Durance,Increases a shield or piece of armor's resistance to cold damage by 100%. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,200,780,184,50,Item Enchantment,0.2,65,6,25,0,1 -2353,Greater Stimulation Durance,Increases a shield or piece of armor's resistance to electric damage by 100%. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,200,780,182,50,Item Enchantment,0.2,67,6,25,0,1 -2354,Lesser Piercing Durance,Increases a shield or piece of armor's resistance to piercing damage by 25%. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,50,360,180,20,Item Enchantment,0.05,59,6,25,0,1 -2355,Lesser Slashing Durance,Increases a shield or piece of armor's resistance to slashing damage by 25%. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,50,360,178,20,Item Enchantment,0.05,61,6,25,0,1 -2356,Lesser Bludgeoning Durance,Increases a shield or piece of armor's resistance to bludgeoning damage by 25%. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,50,360,176,20,Item Enchantment,0.05,67,6,25,0,1 -2357,Fauna Perlustration,Increases the target's Assess Monster skill by 60 points.,250,1020,63,60,Creature Enchantment,0.3,28,16,5,0.25,1 -2358,Lyceum Recall,Transports the caster to the Ishilai Lyceum.,150,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -2359,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2360,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2361,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2362,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2363,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2364,Egress,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2365,something you're gonna fear for a long time,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2366,Bovine Intervention,When Cow gods intervene.....,350,-1,237,300,Creature Enchantment,0.001,0,16,80,0.5,1 -2367,Groovy Portal Sending,Sends you on a magical. groove-filled trip....,2000,-1,214,50000,Item Enchantment,0.5,0,65536,0,0,1 -2368,a powerful force,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2369,Expulsion,Transports the target out of Lady Aerfalle's presence.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2370,Gift of Rotting Flesh,Increases damage the target takes from Acid by 300%.,325,120,102,70,Life Magic,0.15,50,16,5,0.25,1 -2371,Curse of Mortal Flesh,Increases damage the target takes from Fire by 300%.,325,120,110,50,Life Magic,0.15,44,16,5,0.25,1 -2372,Price of Immortality,Prevents all natural healing by the target.,275,300,94,60,Life Magic,0.3,38,16,5,0.25,1 -2373,Enervation of the Heart,Decreases maximum health by 50 points.,250,60,68,30,Life Magic,0.3,31,16,0,0,1 -2374,Enervation of the Limb,Decreases maximum stamina by 50 points.,250,60,82,30,Life Magic,0.3,35,16,0,0,1 -2375,Enervation of the Mind,Decreases maximum mana by 50 points.,50,60,284,30,Life Magic,0.3,33,16,0,0,1 -2376,Glimpse of Annihilation,Increases the target's War Magic skill by 5 points. Additional enchancements to the skill can be layered over this.,5,300,255,10,Creature Enchantment,0.01,26,16,0,1,1 -2377,Vision of Annihilation,Increases the target's War Magic skill by 10 points. Additional enchancements to the skill can be layered over this.,10,300,255,10,Creature Enchantment,0.01,26,16,0,1,1 -2378,Beast Murmur,Increases the target's Creature Enchantment skill by 10 points. Additional enchancements to the skill can be layered over this.,10,300,251,10,Creature Enchantment,0.01,26,16,0,1,1 -2379,Beast Whisper,Increases the target's Creature Enchantment skill by 5 points. Additional enchancements to the skill can be layered over this.,5,300,251,10,Creature Enchantment,0.01,26,16,0,1,1 -2380,Grip of Instrumentality,Increases the target's Item Enchantment skill by 10 points. Additional enchancements to the skill can be layered over this.,1,300,253,10,Creature Enchantment,0.01,26,16,0,1,1 -2381,Touch of Instrumentality,Increases the target's Item Enchantment skill by 5 points. Additional enchancements to the skill can be layered over this.,1,300,253,10,Creature Enchantment,0.01,26,16,0,1,1 -2382,Unnatural Persistence,Increase caster's natural healing rate by 100%.,285,3600,93,70,Life Magic,0.2,37,16,5,1,1 -2383,Dark Flame,Shoots a dark flame at the target. The flame does 68-136 points of righteous fire damage to the first thing it hits.,200,-1,121,25,War Magic,0.2,0,16,30,0.3,1 -2384,Arcane Restoration,Increases the caster's natural mana rate by 100%.,285,3600,97,60,Life Magic,0.2,39,16,0,0,1 -2385,Vigilance,Increases the rate at which the target regains Stamina by 100%.,275,1020,95,60,Life Magic,0.3,41,16,5,0.25,1 -2386,Indomitability,Increase target's natural healing rate by 200%.,550,1020,93,60,Life Magic,0.3,37,16,5,0.25,1 -2387,Determination,Increases the target's Focus by 10 points. can be layered with other Focus spells.,10,150,269,10,Creature Enchantment,0.01,16,16,0,1,1 -2388,Caution,Increases the target's Coordination by 10 points. can be layered with other Coordination spells.,10,150,267,10,Creature Enchantment,0.01,8,16,0,1,1 -2389,Vigor,Increases the target's Endurance by 10 points. can be layered with other Endurance spells.,10,150,263,10,Creature Enchantment,0.01,10,16,0,1,1 -2390,Haste,Increases the target's Quickness by 10 points. can be layered with other Quickness spells.,10,150,265,10,Creature Enchantment,0.01,12,16,0,1,1 -2391,Prowess,Increases the target's Strength by 10 points. can be layered with other Strength spells.,10,150,261,10,Creature Enchantment,0,6,16,5,1,1 -2392,Serenity,Increases the target's Self by 10 points. can be layered with other Self spells.,10,150,271,10,Creature Enchantment,0.01,14,16,0,1,1 -2393,Force Armor,Increases the caster's natural armor by 75 points.,100,1800,115,40,Life Magic,0.1,55,16,0,0,1 -2394,Acid Shield,Reduces damage the caster takes from acid by 33%.,100,1800,101,40,Life Magic,0.1,49,16,0,0,1 -2395,Electric Shield,Reduces damage the caster takes from Lightning by 33%.,100,1800,107,40,Life Magic,0.1,53,16,0,0,1 -2396,Flame Shield,Reduces damage the caster takes from fire by 33%.,100,1800,109,40,Life Magic,0.1,43,16,0,0,1 -2397,Ice Shield,Reduces damage the caster takes from Cold by 33%.,100,1800,105,40,Life Magic,0.1,51,16,0,0,1 -2398,Bludgeon Shield,Reduces damage the caster takes from Bludgeoning by 33%.,100,1800,103,40,Life Magic,0.1,55,16,0,0,1 -2399,Piercing Shield,Reduces damage the caster takes from Piercing by 33%.,100,1800,111,40,Life Magic,0.1,45,16,0,0,1 -2400,Slashing Shield,Reduces damage the caster takes from Slashing by 33%.,100,1800,113,40,Life Magic,0.1,47,16,0,0,1 -2401,Into the Garden,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2402,Essence Lull,Reduces the rate at which mana is consumed.,100,240,83,30,Item Enchantment,0.1,66,3013615,25,0,1 -2403,Balanced Breakfast,Increases the target's Strength by 35 points.,277,10800,1,60,Creature Enchantment,0.3,6,16,5,0.25,0 -2404,Collector Acid Protection,Reduces damage the caster takes from acid by 90%.,300,1800,101,70,Life Magic,0.15,49,16,0,0,0 -2405,Collector Blade Protection,Reduces damage the caster takes from slashing by 90%.,300,1800,113,70,Life Magic,0.15,47,16,0,0,0 -2406,Collector Bludgeoning Protection,Reduces damage the caster takes from bludgeoning by 90%.,300,1800,103,70,Life Magic,0.15,55,16,0,0,0 -2407,Collector Cold Protection,Reduces damage the caster takes from cold by 90%.,300,1800,105,70,Life Magic,0.15,51,16,0,0,0 -2408,Collector Fire Protection,Reduces damage the caster takes from fire by 90%.,300,1800,109,70,Life Magic,0.15,43,16,0,0,0 -2409,Collector Lightning Protection,Reduces damage the caster takes from lightning by 90%.,300,1800,107,70,Life Magic,0.15,53,16,0,0,0 -2410,Collector Piercing Protection,Reduces damage the caster takes from piercing by 90%.,300,1800,111,70,Life Magic,0.15,45,16,0,0,0 -2411,Discipline,Increases a weapon's damage value by 30 points.,450,1020,154,60,Item Enchantment,0.3,57,16,25,0,0 -2412,Enduring Coordination,Increases the target's Coordination by 35 points for three hours.,310,10800,7,70,Creature Enchantment,0.15,8,16,5,0.25,0 -2413,Enduring Focus,Increases the target's Focus by 35 points for three hours.,310,10800,9,70,Creature Enchantment,0.15,16,16,5,0.25,0 -2414,Enduring Stoicism,Increases the caster's Endurance by 35 points for three hours.,310,10800,3,70,Creature Enchantment,0.15,10,16,0,0,0 -2415,Eye of the Hunter,Enhances the penetration of arrow shots. adding 25% to the bow's damage modifier.,25,1020,325,50,Item Enchantment,0.2,57,257,25,0,0 -2416,High Tension String,Enhances the penetration of arrow shots. adding 20% to the bow's damage modifier.,20,1020,325,50,Item Enchantment,0.2,57,257,25,0,0 -2417,Obedience,Increases the target's Leadership skill by 10 points. This can be combined with other Leadership-enhancing spells.,10,780,293,10,Creature Enchantment,0.01,20,16,0,1,0 -2418,Occult Potence,Doubles the target's natural mana renewal rate for three hours.,310,10800,97,70,Life Magic,0.15,39,16,5,0.25,0 -2419,Panic Attack,Causes the target to quake and shiver uncontrollably.,200,30,8,300,Creature Enchantment,0.15,9,16,5,0.25,0 -2420,Panoply of the Queenslayer,Increases the target's natural armor by 200 points for three hours.,250,10800,115,70,Life Magic,0.15,55,16,5,0.25,0 -2421,Paralyzing Fear,Causes the target to freeze in horror.,410,30,6,300,Creature Enchantment,0.15,13,16,5,0.25,0 -2422,Send to Dryreach,Transports the target to the town of Dryreach.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,0 -2423,Precise,This weapon is highly accurate in the hands of a skilled bowman. enchancing skill by 10 points. Additional spells can be layered over this.,10,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2424,Rabbit's Eye,Increases the target's Focus by 50 points.,500,1020,9,70,Creature Enchantment,0.15,16,16,5,0.25,0 -2425,Stone Wall,Increases the caster's Endurance by 50 points.,310,1020,3,70,Creature Enchantment,0.15,10,16,0,0,0 -2426,Strong Pull,The tension of the bowstring gives this weapon enhanced range when wielded by a skilled bowman.,200,1020,327,50,Item Enchantment,0.2,57,257,25,0,0 -2427,Sugar Rush,Increases the target's Coordination by 50 points.,500,1020,7,70,Creature Enchantment,0.15,8,16,5,0.25,0 -2428,Timaru's Shelter,Increases the target's Magic Defense skill by 10 points. Additional protection can be layered over this.,10,1800,299,70,Creature Enchantment,0.15,22,16,5,0.25,1 -2429,Timaru's Shelter,Increases the target's natural armor by 30 points. Additional protection can be layered over this.,280,1800,295,70,Life Magic,0.15,55,16,5,0.25,0 -2430,Timaru's Shelter,Increases the target's Quickness by 10 points. Additional protection can be layered over this.,280,1800,297,70,Creature Enchantment,0.15,12,16,5,0.25,1 -2431,Vivification,Doubles the target's natural healing rate for three hours.,290,10800,93,70,Life Magic,0.15,37,16,5,0.25,0 -2432,Acid Ward,Reduces damage the target takes from acid by 20%. Additional magical protection can be layered over this.,50,10800,285,20,Life Magic,0.05,49,16,5,0.85,0 -2433,Flame Ward,Reduces damage the target takes from fire by 20%. Additional magical protection can be layered over this.,20,10800,287,20,Life Magic,0.05,43,16,5,0.85,0 -2434,Frost Ward,Reduces damage the target takes from cold by 20%. Additional magical protection can be layered over this.,20,10800,289,20,Life Magic,0.05,51,16,5,0.85,0 -2435,Lightning Ward,Reduces damage the target takes from lightning by 20%. Additional magical protection can be layered over this.,50,10800,291,20,Life Magic,0.05,53,16,5,0.85,0 -2436,Laying on of Hands,Increases the target's Healing skill by 25 points.,100,780,67,30,Creature Enchantment,0.1,155,16,5,0.7,1 -2437,Greater Rockslide,Increases a weapon's Attack Skill modifier by 5%. Additional spells can be layered over this.,30,780,389,60,Item Enchantment,0.3,63,257,25,0,1 -2438,Lesser Rockslide,Increases a weapon's Attack Skill modifier by 1%. Additional spells can be layered over this.,10,780,389,60,Item Enchantment,0.3,63,257,25,0,1 -2439,Rockslide,Increases a weapon's Attack Skill modifier by 3%. Additional spells can be layered over this.,10,780,389,60,Item Enchantment,0.3,63,257,25,0,1 -2440,Greater Stone Cliffs,Increases the target's Melee Defense skill by 15 points.,15,780,321,10,Creature Enchantment,0.01,28,16,0,1,1 -2441,Lesser Stone Cliffs,Increases the target's Melee Defense skill by 8 points.,8,780,321,10,Creature Enchantment,0.01,28,16,0,1,1 -2442,Stone Cliffs,Increases the target's Melee Defense skill by 12 points.,12,780,321,10,Creature Enchantment,0.01,28,16,0,1,1 -2443,Greater Strength of Earth,Increases the target's Strength by 15 points.,12,780,261,40,Creature Enchantment,0.15,6,16,5,0.55,1 -2444,Lesser Strength of Earth,Increases the target's Strength by 8 points.,4,780,261,40,Creature Enchantment,0.15,6,16,5,0.55,1 -2445,Strength of Earth,Increases the target's Strength by 12 points.,8,780,261,40,Creature Enchantment,0.15,6,16,5,0.55,1 -2446,Greater Growth,Increase the target's natural healing rate by 75%.,30,780,309,30,Life Magic,0.05,37,16,5,0.85,1 -2447,Lesser Growth,Increase caster's natural healing rate by 25%.,10,780,309,30,Life Magic,0.05,37,16,5,0.85,1 -2448,Growth,Increase the target's natural healing rate by 50%.,20,780,309,30,Life Magic,0.05,37,16,5,0.85,1 -2449,Greater Hunter's Acumen,Increases the target's Coordination by 15 points.,12,780,267,10,Creature Enchantment,0.01,8,16,0,1,1 -2450,Lesser Hunter's Acumen,Increases the target's Coordination by 8 points.,4,780,267,10,Creature Enchantment,0.01,8,16,0,1,1 -2451,Hunter's Acumen,Increases the target's Coordination by 12 points.,8,780,267,10,Creature Enchantment,0.01,8,16,0,1,1 -2452,Greater Thorns,Increases a weapon's damage value by 4 points.,51,780,323,40,Item Enchantment,0.15,57,257,25,0,1 -2453,Lesser Thorns,Increases a weapon's damage value by 2 points.,2,780,323,40,Item Enchantment,0.15,57,257,25,0,1 -2454,Thorns,Increases a weapon's damage value by 3 points.,4,780,323,40,Item Enchantment,0.15,57,257,25,0,1 -2455,Greater Cascade,Increases the target's Light Weapons skill by 15 points.,15,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2456,Lesser Cascade,Increases the target's Light Weapons skill by 8 points.,8,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2457,Cascade,Increases the target's Light Weapons skill by 12 points.,12,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2458,Greater Cascade,Increases the target's Finesse Weapons skill by 15 points.,15,780,313,10,Creature Enchantment,0.01,18,16,0,0,1 -2459,Lesser Cascade,Increases the target's Finesse Weapons skill by 8 points.,8,780,313,10,Creature Enchantment,0.01,18,16,0,1,1 -2460,Cascade,Increases the target's Finesse Weapons skill by 12 points.,12,780,313,10,Creature Enchantment,0.01,18,16,0,1,1 -2461,Greater Cascade,Increases the target's Light Weapons skill by 15 points.,15,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2462,Lesser Cascade,Increases the target's Light Weapons skill by 8 points.,8,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2463,Cascade,Increases the target's Light Weapons skill by 12 points.,12,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2464,Greater Cascade,Increases the target's Light Weapons skill by 15 points.,15,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2465,Lesser Cascade,Increases the target's Light Weapons skill by 8 points.,8,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2466,Cascade,Increases the target's Light Weapons skill by 12 points.,12,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2467,Greater Cascade,Increases the target's Light Weapons skill by 15 points.,15,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2468,Lesser Cascade,Increases the target's Light Weapons skill by 8 points.,8,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2469,Cascade,Increases the target's Light Weapons skill by 12 points.,12,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -2470,Greater Still Water,Increases the target's Endurance by 15 points.,12,780,263,30,Creature Enchantment,0.1,10,16,5,0.7,1 -2471,Lesser Still Water,Increases the target's Endurance by 8 points.,4,780,263,30,Creature Enchantment,0.1,10,16,5,0.7,1 -2472,Still Water,Increases the target's Endurance by 12 points.,8,780,263,30,Creature Enchantment,0.1,10,16,5,0.7,1 -2473,Greater Torrent,Increases the target's Quickness by 15 points.,12,1800,265,70,Creature Enchantment,0.15,12,16,5,0.25,1 -2474,Lesser Torrent,Increases the target's Quickness by 8 points.,4,1800,265,70,Creature Enchantment,0.15,12,16,5,0.25,1 -2475,Torrent,Increases the target's Quickness by 12 points.,8,1800,265,70,Creature Enchantment,0.15,12,16,5,0.25,1 -2476,Safe Harbor,Transports the target to the town of Timaru.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,0 -2477,Free Trip to the Aluvian Casino,Transports the target to Monty's Den of Iniquity.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2478,Cragstone Reinforcements camp recall,Transports the target to the Cragstone Reinforcements Camp portal. ,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2479,Advance Camp Recall,Transports the target to the Cragstone advance camp.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2480,Free Trip to the Gharun'dim Casino,Transports the target to Arshid's Den of Iniquity.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2481,Zaikhal Reinforcement Camp Recall,Transports the target to the Zaikhal Reinforcement Camp.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2482,Zaikhal Advance Camp Recall,Transports the target to the Zaikhal Advance Camp.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2483,Free Trip to the Sho Casino,Transports the target to Gan-Zo's Den of Iniquity.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2484,Hebian-to Reinforcements Camp Portal,Transports the target to the Hebian-to Reinforcements Camp.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2485,Hebian-to Advance Camp Recall,Transports the target to the Hebian-to Advance Camp.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2486,Blood Thirst,Increases a weapon's damage value by 2 points.,2,780,323,10,Item Enchantment,0,57,257,25,0,1 -2487,Spirit Strike,Increases a weapon's damage value by 2 points.,2,780,323,10,Item Enchantment,0,57,257,25,0,1 -2488,Weapon Familiarity,The crafter of this weapon is intimately familiar with its handling and suffers no defense penalty while wielding it. Additional magical enhancements can be layered over this.,8,780,329,30,Item Enchantment,0.1,61,33025,25,0,1 -2489,Free Ride to the Shoushi Southeast Outpost Portal,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2490,Free Ride to the Holtburg South Outpost,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2491,Free Ride to the Holtburg West Outpost,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2492,Free Ride to the Shoushi West Outpost,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2493,Free Ride to the Yaraq East Outpost,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2494,Free Ride to the Yaraq North Outpost,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2495,Send Reinforcements,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2496,Send Reinforcements,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2497,Send Reinforcements,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2498,Send Reinforcements,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2499,Send Reinforcements,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2500,Send Reinforcements,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2501,Major Alchemical Prowess,Increases the target's Alchemy skill by 15 points. Additional spells can be layered over this.,2,780,333,10,Creature Enchantment,0.01,26,16,0,1,1 -2502,Major Arcane Prowess,Increases the target's Arcane Lore skill by 15 points. Additional spells can be layered over this.,15,780,335,10,Creature Enchantment,0.01,26,16,0,1,1 -2503,Major Armor Tinkering Expertise,Increases the target's Armor Tinkering skill by 15 points. Additional spells can be layered over this.,2,780,337,10,Creature Enchantment,0.01,28,16,0,1,1 -2504,Major Light Weapon Aptitude,Increases the target's Light Weapons skill by 15 points. Additional spells can be layered over this.,15,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2505,Major Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 15 points. Additional spells can be layered over this.,15,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2506,Major Cooking Prowess,Increases the target's Cooking skill by 15 points. Additional spells can be layered over this.,2,780,339,10,Creature Enchantment,0.01,20,16,0,1,1 -2507,Major Creature Enchantment Aptitude,Increases the target's Creature Enchantment skill by 15 points. Additional spells can be layered over this.,15,780,251,10,Creature Enchantment,0.01,26,16,0,1,1 -2508,Major Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 15 points. Additional spells can be layered over this.,15,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2509,Major Finesse Weapon Aptitude,Increases the target's Finesse Weapons skill by 15 points. Additional spells can be layered over this.,15,780,313,10,Creature Enchantment,0.01,18,16,0,1,1 -2510,Major Deception Prowess,Increases the target's Deception skill by 15 points. Additional spells can be layered over this.,2,780,343,10,Creature Enchantment,0.01,28,16,0,1,1 -2511,Major Fealty,Increases the target's Loyalty skill by 15 points. Additional spells can be layered over this.,15,780,345,10,Creature Enchantment,0.01,20,16,0,1,1 -2512,Major Fletching Prowess,Increases the target's Fletching skill by 15 points. Additional spells can be layered over this.,2,780,347,10,Creature Enchantment,0.01,20,16,0,1,1 -2513,Major Healing Prowess,Increases the target's Healing skill by 15 points. Additional spells can be layered over this.,2,780,349,10,Creature Enchantment,0.01,20,16,0,1,1 -2514,Major Impregnability,Increases the target's Missile Defense skill by 15 points. Additional spells can be layered over this.,15,780,654,10,Creature Enchantment,0.01,22,16,0,1,1 -2515,Major Invulnerability,Increases the target's Melee Defense skill by 15 points. Additional spells can be layered over this.,15,780,351,10,Creature Enchantment,0.01,22,16,0,1,1 -2516,Major Item Enchantment Aptitude,Increases the target's Item Enchantment skill by 15 points. Additional spells can be layered over this.,15,780,253,10,Creature Enchantment,0.01,26,16,0,1,1 -2517,Major Item Tinkering Expertise,Increases the target's Item Tinkering skill by 15 points. Additional spells can be layered over this.,2,780,353,10,Creature Enchantment,0.01,28,16,0,1,1 -2518,Major Jumping Prowess,Increases the target's Jump skill by 15 points. Additional spells can be layered over this.,2,780,355,10,Creature Enchantment,0.01,24,16,0,1,1 -2519,Major Leadership,Increases the target's Leadership skill by 15 points. Additional spells can be layered over this.,2,780,293,10,Creature Enchantment,0.01,20,16,0,1,1 -2520,Major Life Magic Aptitude,Increases the target's Life Magic skill by 15 points. Additional spells can be layered over this.,15,780,357,10,Creature Enchantment,0.01,26,16,0,1,1 -2521,Major Lockpick Prowess,Increases the target's Lockpick skill by 15 points. Additional spells can be layered over this.,2,780,359,10,Creature Enchantment,0.01,20,16,0,1,1 -2522,Major Light Weapon Aptitude,Increases the target's Light Weapons skill by 15 points. Additional spells can be layered over this.,15,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2523,Major Magic Item Tinkering Expertise,Increases the target's Magic Item Tinkering skill by 15 points. Additional spells can be layered over this.,2,780,361,10,Creature Enchantment,0.01,28,16,0,1,1 -2524,Major Magic Resistance,Increases the target's Magic Defense skill by 15 points. Additional spells can be layered over this.,15,780,299,10,Creature Enchantment,0.01,22,16,0,1,1 -2525,Major Mana Conversion Prowess,Increases the target's Mana Conversion skill by 15 points. Additional spells can be layered over this.,15,780,363,10,Creature Enchantment,0.01,26,16,0,1,1 -2526,Major Monster Attunement,Increases the target's Assess Creature skill by 15 points. Additional spells can be layered over this.,2,780,365,10,Creature Enchantment,0.01,28,16,0,1,1 -2527,Major Person Attunement,Increases the target's Assess Person skill by 15 points. Additional spells can be layered over this.,2,780,367,10,Creature Enchantment,0.01,28,16,0,1,1 -2528,Major Light Weapon Aptitude,Increases the target's Light Weapons skill by 15 points. Additional spells can be layered over this.,15,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2529,Major Sprint,Increases the target's Run skill by 15 points. Additional spells can be layered over this.,2,780,369,10,Creature Enchantment,0.01,24,16,0,1,1 -2530,Major Light Weapon Aptitude,Increases the target's Light Weapons skill by 15 points. Additional spells can be layered over this.,15,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2531,Major Heavy Weapon Aptitude,Increases the target's Heavy Weapons skill by 15 points. Additional spells can be layered over this.,15,780,371,10,Creature Enchantment,0.01,18,16,0,1,1 -2532,Major Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 15 points. Additional spells can be layered over this.,15,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2533,Major Light Weapon Aptitude,Increases the target's Light Weapons skill by 15 points. Additional spells can be layered over this.,15,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2534,Major War Magic Aptitude,Increases the target's War Magic skill by 15 points. Additional spells can be layered over this.,15,780,255,10,Creature Enchantment,0.01,26,16,0,1,1 -2535,Major Weapon Tinkering Expertise,Increases the target's Weapon Tinkering skill by 15 points. Additional spells can be layered over this.,15,780,377,10,Creature Enchantment,0.01,28,16,0,1,1 -2536,Minor Alchemical Prowess,Increases the target's Alchemy skill by 5 points. Additional spells can be layered over this.,1,780,333,10,Creature Enchantment,0.01,26,16,0,1,1 -2537,Minor Arcane Prowess,Increases the target's Arcane Lore skill by 5 points. Additional spells can be layered over this.,5,780,335,10,Creature Enchantment,0.01,26,16,0,1,1 -2538,Minor Armor Tinkering Expertise,Increases the target's Armor Tinkering skill by 5 points. Additional spells can be layered over this.,1,780,337,10,Creature Enchantment,0.01,28,16,0,1,1 -2539,Minor Light Weapon Aptitude,Increases the target's Light Weapons skill by 5 points. Additional spells can be layered over this.,5,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2540,Minor Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 5 points. Additional spells can be layered over this.,5,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2541,Minor Cooking Prowess,Increases the target's Cooking skill by 5 points. Additional spells can be layered over this.,1,780,339,10,Creature Enchantment,0.01,20,16,0,1,1 -2542,Minor Creature Enchantment Aptitude,Increases the target's Creature Enchantment skill by 5 points. Additional spells can be layered over this.,5,780,251,10,Creature Enchantment,0.01,26,16,0,1,1 -2543,Minor Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 5 points. Additional spells can be layered over this.,5,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2544,Minor Finesse Weapon Aptitude,Increases the target's Finesse Weapons skill by 5 points. Additional spells can be layered over this.,5,780,313,10,Creature Enchantment,0.01,18,16,0,1,1 -2545,Minor Deception Prowess,Increases the target's Deception skill by 5 points. Additional spells can be layered over this.,1,780,343,10,Creature Enchantment,0.01,28,16,0,1,1 -2546,Minor Fealty,Increases the target's Loyalty skill by 5 points. Additional spells can be layered over this.,1,780,345,10,Creature Enchantment,0.01,20,16,0,1,1 -2547,Minor Fletching Prowess,Increases the target's Fletching skill by 5 points. Additional spells can be layered over this.,1,780,347,10,Creature Enchantment,0.01,20,16,0,1,1 -2548,Minor Healing Prowess,Increases the target's Healing skill by 5 points. Additional spells can be layered over this.,1,780,349,10,Creature Enchantment,0.01,20,16,0,1,1 -2549,Minor Impregnability,Increases the target's Missile Defense skill by 5 points. Additional spells can be layered over this.,5,780,654,10,Creature Enchantment,0.01,22,16,0,1,1 -2550,Minor Invulnerability,Increases the target's Melee Defense skill by 5 points. Additional spells can be layered over this.,5,780,351,10,Creature Enchantment,0.01,22,16,0,1,1 -2551,Minor Item Enchantment Aptitude,Increases the target's Item Enchantment skill by 5 points. Additional spells can be layered over this.,5,780,253,10,Creature Enchantment,0.01,26,16,0,1,1 -2552,Minor Item Tinkering Expertise,Increases the target's Item Tinkering skill by 5 points. Additional spells can be layered over this.,1,780,353,10,Creature Enchantment,0.01,28,16,0,1,1 -2553,Minor Jumping Prowess,Increases the target's Jump skill by 5 points. Additional spells can be layered over this.,1,780,355,10,Creature Enchantment,0.01,24,16,0,1,1 -2554,Minor Leadership,Increases the target's Leadership skill by 5 points. Additional spells can be layered over this.,1,780,293,10,Creature Enchantment,0.01,20,16,0,1,1 -2555,Minor Life Magic Aptitude,Increases the target's Life Magic skill by 5 points. Additional spells can be layered over this.,5,780,357,10,Creature Enchantment,0.01,26,16,0,1,1 -2556,Minor Lockpick Prowess,Increases the target's Lockpick skill by 5 points. Additional spells can be layered over this.,1,780,359,10,Creature Enchantment,0.01,20,16,0,1,1 -2557,Minor Light Weapon Aptitude,Increases the target's Light Weapons skill by 5 points. Additional spells can be layered over this.,5,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2558,Minor Magic Item Tinkering Expertise,Increases the target's Magic Item Tinkering skill by 5 points. Additional spells can be layered over this.,1,780,361,10,Creature Enchantment,0.01,28,16,0,1,1 -2559,Minor Magic Resistance,Increases the target's Magic Defense skill by 5 points. Additional spells can be layered over this.,5,780,299,10,Creature Enchantment,0.01,22,16,0,1,1 -2560,Minor Mana Conversion Prowess,Increases the target's Mana Conversion skill by 5 points. Additional spells can be layered over this.,5,780,363,10,Creature Enchantment,0.01,26,16,0,1,1 -2561,Minor Monster Attunement,Increases the target's Assess Creature skill by 5 points. Additional spells can be layered over this.,1,780,365,10,Creature Enchantment,0.01,28,16,0,1,1 -2562,Minor Person Attunement,Increases the target's Assess Person skill by 5 points. Additional spells can be layered over this.,1,780,367,10,Creature Enchantment,0.01,28,16,0,1,1 -2563,Minor Light Weapon Aptitude,Increases the target's Light Weapons skill by 5 points. Additional spells can be layered over this.,5,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2564,Minor Sprint,Increases the target's Run skill by 5 points. Additional spells can be layered over this.,1,780,369,10,Creature Enchantment,0.01,24,16,0,1,1 -2565,Minor Light Weapon Aptitude,Increases the target's Light Weapons skill by 5 points. Additional spells can be layered over this.,5,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2566,Minor Heavy Weapon Aptitude,Increases the target's Heavy Weapons skill by 5 points. Additional spells can be layered over this.,5,780,371,10,Creature Enchantment,0.01,18,16,0,1,1 -2567,Minor Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 5 points. Additional spells can be layered over this.,5,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2568,Minor Light Weapon Aptitude,Increases the target's Light Weapons skill by 5 points. Additional spells can be layered over this.,5,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2569,Minor War Magic Aptitude,Increases the target's War Magic skill by 5 points. Additional spells can be layered over this.,5,780,255,10,Creature Enchantment,0.01,26,16,0,1,1 -2570,Minor Weapon Tinkering Expertise,Increases the target's Weapon Tinkering skill by 5 points. Additional spells can be layered over this.,5,780,377,10,Creature Enchantment,0.01,28,16,0,1,1 -2571,Major Armor,Increases the target's natural armor by 40 points. Additional spells can be layered over this.,40,780,379,10,Life Magic,0.01,55,16,0,1,1 -2572,Major Coordination,Increases the target's Coordination by 15 points. Additional spells can be layered over this.,15,780,267,10,Creature Enchantment,0.01,8,16,0,1,1 -2573,Major Endurance,Increases the target's Endurance by 15 points. Additional spells can be layered over this.,15,780,263,10,Creature Enchantment,0.01,10,16,0,1,1 -2574,Major Focus,Increases the target's Focus by 15 points. Additional spells can be layered over this.,15,780,269,10,Creature Enchantment,0.01,16,16,0,1,1 -2575,Major Quickness,Increases the target's Quickness by 15 points. Additional spells can be layered over this.,15,780,265,10,Creature Enchantment,0.01,12,16,0,1,1 -2576,Major Strength,Increases the target's Strength by 15 points. Additional spells can be layered over this.,15,780,261,10,Creature Enchantment,0.01,6,16,0,1,1 -2577,Major Willpower,Increases the target's Self by 15 points. Additional spells can be layered over this.,15,780,271,10,Creature Enchantment,0.01,14,16,0,1,1 -2578,Minor Armor,Increases the target's natural armor by 20 points. Additional spells can be layered over this.,20,780,379,10,Life Magic,0.01,55,16,0,1,1 -2579,Minor Coordination,Increases the target's Coordination by 5 points. Additional spells can be layered over this.,5,780,267,10,Creature Enchantment,0.01,8,16,0,1,1 -2580,Minor Endurance,Increases the target's Endurance by 5 points. Additional spells can be layered over this.,5,780,263,10,Creature Enchantment,0.01,10,16,0,1,1 -2581,Minor Focus,Increases the target's Focus by 5 points. Additional spells can be layered over this.,5,780,269,10,Creature Enchantment,0.01,16,16,0,1,1 -2582,Minor Quickness,Increases the target's Quickness by 5 points. Additional spells can be layered over this.,5,780,265,10,Creature Enchantment,0.01,12,16,0,1,1 -2583,Minor Strength,Increases the target's Strength by 5 points. Additional spells can be layered over this.,5,780,261,10,Creature Enchantment,0.01,6,16,0,1,1 -2584,Minor Willpower,Increases the target's Self by 5 points. Additional spells can be layered over this.,5,780,271,10,Creature Enchantment,0.01,14,16,0,1,1 -2585,Major Acid Bane,Increases a shield or piece of armor's resistance to Acid damage by 15%. Additional spells can be layered over this.,2,780,381,10,Item Enchantment,0.01,63,6,25,0,1 -2586,Major Blood Thirst,Increases a weapon's damage value by 4 points. Additional spells can be layered over this.,4,780,323,10,Item Enchantment,0,57,257,25,0,1 -2587,Major Bludgeoning Bane,Increases a shield or piece of armor's resistance to Bludgeoning damage by 15%. Additional spells can be layered over this.,2,780,383,10,Item Enchantment,0.01,67,6,25,0,1 -2588,Major Defender,Increases the Melee Defense skill modifier of a weapon or magic caster by 5%. Additional spells can be layered over this.,5,780,329,10,Item Enchantment,0.01,61,33025,25,0,1 -2589,Major Flame Bane,Increases a shield or piece of armor's resistance to Fire damage by 15%. Additional spells can be layered over this.,2,780,385,10,Item Enchantment,0.01,57,6,25,0,1 -2590,Major Frost Bane,Increases a shield or piece of armor's resistance to Cold damage by 15%. Additional spells can be layered over this.,2,780,387,10,Item Enchantment,0.01,65,6,25,0,1 -2591,Major Heart Thirst,Increases a weapon's Attack Skill modifier by 5%. Additional spells can be layered over this.,5,780,389,10,Item Enchantment,0.01,59,257,25,0,1 -2592,Major Impenetrability,Improves a shield or piece of armor's Armor value by 40 points. Additional spells can be layered over this.,2,780,391,10,Item Enchantment,0,142,6,25,0,1 -2593,Major Piercing Bane,Increases a shield or piece of armor's resistance to Piercing damage by 15%. Additional spells can be layered over this.,2,780,393,10,Item Enchantment,0.01,59,6,25,0,1 -2594,Major Slashing Bane,Increases a shield or piece of armor's resistance to Slashing damage by 15%. Additional spells can be layered over this.,2,780,395,10,Item Enchantment,0.01,61,6,25,0,1 -2595,Major Storm Bane,Increases a shield or piece of armor's resistance to Electric damage by 15%. Additional spells can be layered over this.,2,780,397,10,Item Enchantment,0.01,67,6,25,0,1 -2596,Major Swift Hunter,Improves a weapon's speed by 20 points. Additional spells can be layered over this.,20,780,399,10,Item Enchantment,0,63,257,25,0,1 -2597,Minor Acid Bane,Increases a shield or piece of armor's resistance to Acid damage by 10%. Additional spells can be layered over this.,1,780,381,10,Item Enchantment,0.01,63,6,25,0,1 -2598,Minor Blood Thirst,Increases a weapon's damage value by 2 points. Additional spells can be layered over this.,2,780,323,10,Item Enchantment,0,57,257,25,0,1 -2599,Minor Bludgeoning Bane,Increases a shield or piece of armor's resistance to Bludgeoning damage by 10%. Additional spells can be layered over this.,1,780,383,10,Item Enchantment,0.01,67,6,25,0,1 -2600,Minor Defender,Increases the Melee Defense skill modifier of a weapon or magic caster by 3%. Additional spells can be layered over this.,3,780,329,10,Item Enchantment,0.01,61,33025,25,0,1 -2601,Minor Flame Bane,Increases a shield or piece of armor's resistance to Fire damage by 10%. Additional spells can be layered over this.,1,780,385,10,Item Enchantment,0.01,57,6,25,0,1 -2602,Minor Frost Bane,Increases a shield or piece of armor's resistance to Cold damage by 10%. Additional spells can be layered over this.,1,780,387,10,Item Enchantment,0.01,65,6,25,0,1 -2603,Minor Heart Thirst,Increases a weapon's Attack Skill modifier by 3%. Additional spells can be layered over this.,3,780,389,10,Item Enchantment,0.01,59,257,25,0,1 -2604,Minor Impenetrability,Improves a shield or piece of armor's Armor value by 20 points. Additional spells can be layered over this.,1,780,391,10,Item Enchantment,0,142,6,25,0,1 -2605,Minor Piercing Bane,Increases a shield or piece of armor's resistance to Piercing damage by 10%. Additional spells can be layered over this.,1,780,393,10,Item Enchantment,0.01,59,6,25,0,1 -2606,Minor Slashing Bane,Increases a shield or piece of armor's resistance to Slashing damage by 10%. Additional spells can be layered over this.,1,780,395,10,Item Enchantment,0.01,61,6,25,0,1 -2607,Minor Storm Bane,Increases a shield or piece of armor's resistance to Electric damage by 10%. Additional spells can be layered over this.,1,780,397,10,Item Enchantment,0.01,67,6,25,0,1 -2608,Minor Swift Hunter,Improves a weapon's speed by 10 points. Additional spells can be layered over this.,10,780,399,10,Item Enchantment,0,63,257,25,0,1 -2609,Major Acid Ward,Reduces damage the target takes from Acid by 15%. Additional spells can be layered over this.,2,780,285,10,Life Magic,0.01,49,16,0,1,1 -2610,Major Bludgeoning Ward,Reduces damage the target takes from Bludgeoning by 15%. Additional spells can be layered over this.,15,780,401,10,Life Magic,0.01,55,16,0,1,1 -2611,Major Flame Ward,Reduces damage the target takes from Fire by 15%. Additional spells can be layered over this.,15,780,287,10,Life Magic,0.01,43,16,0,1,1 -2612,Major Frost Ward,Reduces damage the target takes from Cold by 15%. Additional spells can be layered over this.,15,780,289,10,Life Magic,0.01,51,16,0,1,1 -2613,Major Piercing Ward,Reduces damage the target takes from Piercing by 15%. Additional spells can be layered over this.,15,780,405,10,Life Magic,0.01,45,16,0,1,1 -2614,Major Slashing Ward,Reduces damage the target takes from Slashing by 15%. Additional spells can be layered over this.,2,780,403,10,Life Magic,0.01,47,16,0,1,1 -2615,Major Storm Ward,Reduces damage the target takes from Lightning by 15%. Additional spells can be layered over this.,2,780,291,10,Life Magic,0.01,53,16,0,1,1 -2616,Minor Acid Ward,Reduces damage the target takes from Acid by 10%. Additional spells can be layered over this.,1,780,285,10,Life Magic,0.01,49,16,0,1,1 -2617,Minor Bludgeoning Ward,Reduces damage the target takes from Bludgeoning by 10%. Additional spells can be layered over this.,10,780,401,10,Life Magic,0.01,55,16,0,1,1 -2618,Minor Flame Ward,Reduces damage the target takes from Fire by 10%. Additional spells can be layered over this.,10,780,287,10,Life Magic,0.01,43,16,0,1,1 -2619,Minor Frost Ward,Reduces damage the target takes from Cold by 10%. Additional spells can be layered over this.,10,780,289,10,Life Magic,0.01,51,16,0,1,1 -2620,Minor Piercing Ward,Reduces damage the target takes from Piercing by 10%. Additional spells can be layered over this.,10,780,405,10,Life Magic,0.01,45,16,0,1,1 -2621,Minor Slashing Ward,Reduces damage the target takes from Slashing by 10%. Additional spells can be layered over this.,1,780,403,10,Life Magic,0.01,47,16,0,1,1 -2622,Minor Storm Ward,Reduces damage the target takes from Lightning by 10%. Additional spells can be layered over this.,1,780,291,10,Life Magic,0.01,53,16,0,1,1 -2623,Major Health Gain,Increases the rate at which the target regains Health by 30%. Additional spells can be layered over this.,30,780,257,10,Life Magic,0.01,37,16,5,1,1 -2624,Major Mana Gain,Increases the rate at which the target regains Mana by 30%. Additional spells can be layered over this.,30,780,259,10,Life Magic,0.01,39,16,5,1,1 -2625,Major Stamina Gain,Increases the rate at which the target regains Stamina by 30%. Additional spells can be layered over this.,30,780,407,10,Life Magic,0,41,16,5,1,1 -2626,Minor Health Gain,Increases the rate at which the target regains Health by 15%. Additional spells can be layered over this.,15,780,257,10,Life Magic,0.01,37,16,5,1,1 -2627,Minor Mana Gain,Increases the rate at which the target regains Mana by 15%. Additional spells can be layered over this.,15,780,259,10,Life Magic,0.01,39,16,5,1,1 -2628,Minor Stamina Gain,Increases the rate at which the target regains Stamina by 15%. Additional spells can be layered over this.,15,780,407,10,Life Magic,0,41,16,5,1,1 -2629,Huntress' Boon,Increases the bow's base damage value by 5 points. Additional spells can be layered over this.,5,780,323,10,Item Enchantment,0,57,257,25,0,1 -2630,Prey's Reflex,Allows the wielder to anticipate the movements of the target. adding 6% to the weapon's attack odds. Additional spells can be layered over this.,6,780,389,10,Item Enchantment,0.01,59,257,25,0,1 -2631,Secret Descent,Portals Target to Halls of Hollows Dungeon,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2632,Secret Ascent,Portals Target to the exit of Halls of Hollows Dungeon,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2633,Breaking and Entering,Portals Traget to the Regicide Dungeon,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2634,Cautious Egress,Portals target to the Regicide Dungeon Exit,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2635,Witshire Passage,Summons a portal to the Witshire Dungeon,2000,-1,214,50000,Item Enchantment,0.5,0,65536,0,0,1 -2636,Karenua's Curse,Decreases the target's Lockpick skill by 40 points.,500,900,74,70,Creature Enchantment,0.15,21,16,5,0.25,1 -2637,Invoking Aun Tanua,Summons the Spirit of the Tumerok Warrior Aun Tanua to do 160-200 points of fire damage to the first thing it hits.,300,-1,121,100,War Magic,0.15,0,16,30,0.2,1 -2638,Heart of Oak,Increases the target's Self by 20 points. Additional spells can be layered over this.,3,780,13,10,Creature Enchantment,0.01,14,16,0,1,1 -2639,Repulsion,Decreases maximum mana by 20 points.,20,60,284,30,Life Magic,0.3,34,16,0,0,1 -2640,Devourer,Decreases maximum mana by 20 points.,20,60,284,30,Life Magic,0.3,34,16,0,0,1 -2641,Force to Arms,Decreases maximum mana by 100 points.,100,60,284,30,Life Magic,0.3,34,16,0,0,1 -2642,Consumption,Decreases maximum mana by 20 points.,20,60,284,30,Life Magic,0.3,34,16,0,0,1 -2643,Stasis,Decreases maximum mana by 20 points.,20,60,284,30,Life Magic,0.3,34,16,0,0,1 -2644,Lifestone Tie,Links the caster to a targeted Lifestone.,100,-1,200,50,Item Enchantment,0.25,15,268435456,10,0,1 -2645,Portal Recall,Transports the caster to the destination of the last recallable portal the caster traveled through.,100,-1,201,50,Item Enchantment,0.25,0,65536,0,0,1 -2646,Secondary Portal Tie,Links the caster to a targeted portal.,150,-1,200,50,Item Enchantment,0.25,17,65536,30,0,1 -2647,Secondary Portal Recall,Transports the caster to the destination of the portal last successfully linked to with Secondary Portal Tie.,100,-1,201,50,Item Enchantment,0.25,0,65536,0,0,1 -2648,Summon Secondary Portal I,Summons a portal that goes to the destination of the caster's linked portal. set with Secondary Portal Tie.,200,60,203,70,Item Enchantment,0.5,0,65536,0,0,1 -2649,Summon Secondary Portal II,Summons a portal that goes to the destination of the caster's linked portal. set with Secondary Portal Tie.,225,180,203,90,Item Enchantment,0.5,0,65536,0,0,1 -2650,Summon Secondary Portal III,Summons a portal that goes to the destination of the caster's linked portal. set with Secondary Portal Tie.,250,300,203,110,Item Enchantment,1,0,65536,0,0,1 -2651,Portal Sending Self Sacrifice,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2652,Portal Sending Merciless,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2653,Feeble Willpower,Increases the target's Self by 3 points. Additional spells can be layered over this.,3,780,271,10,Creature Enchantment,0.01,14,16,0,1,1 -2654,Feeble Endurance,Increases the target's Endurance by 3 points. Additional spells can be layered over this.,3,780,263,10,Creature Enchantment,0.01,10,16,0,1,1 -2655,Feeble Focus,Increases the target's Focus by 3 points. Additional spells can be layered over this.,3,780,269,10,Creature Enchantment,0.01,16,16,0,1,1 -2656,Feeble Quickness,Increases the target's Quickness by 15 points. Additional spells can be layered over this.,3,780,265,10,Creature Enchantment,0.01,12,16,0,1,1 -2657,Feeble Strength,Increases the target's Strength by 3 points. Additional spells can be layered over this.,3,780,261,10,Creature Enchantment,0.01,6,16,0,1,1 -2658,Feeble Coordination,Increases the target's Coordination by 3 points. Additional spells can be layered over this.,3,780,267,10,Creature Enchantment,0.01,8,16,0,1,1 -2659,Moderate Coordination,Increases the target's Coordination by 10 points. Additional spells can be layered over this.,10,3600,267,10,Creature Enchantment,0.01,8,16,0,1,1 -2660,Moderate Endurance,Increases the target's Endurance by 10 points. Additional spells can be layered over this.,10,780,263,10,Creature Enchantment,0.01,10,16,0,1,1 -2661,Moderate Focus,Increases the target's Focus by 10 points. Additional spells can be layered over this.,10,780,269,10,Creature Enchantment,0.01,16,16,0,1,1 -2662,Moderate Quickness,Increases the target's Quickness by 10 points. Additional spells can be layered over this.,10,780,265,10,Creature Enchantment,0.01,12,16,0,1,1 -2663,Moderate Strength,Increases the target's Strength by 10 points. Additional spells can be layered over this.,10,780,261,10,Creature Enchantment,0.01,6,16,0,1,1 -2664,Moderate Willpower,Increases the target's Self by 10 points. Additional spells can be layered over this.,10,780,271,10,Creature Enchantment,0.01,14,16,0,1,1 -2665,Essence Sluice,Increases maximum health by 25 points.,25,510,279,70,Life Magic,0.3,31,16,0,0,1 -2666,Essence Glutton,Increases maximum health by 30 points.,30,510,279,70,Life Magic,0.3,31,16,0,0,1 -2667,Essence Spike,Increases maximum health by 20 points.,20,510,279,70,Life Magic,0.3,31,16,0,0,1 -2668,Nuhmudiras Benefaction,Increases the target's Magic Defense skill by 5 points. Additional spells can be layered over this.,5,780,299,10,Creature Enchantment,0.01,22,16,0,1,1 -2669,Nuhmudiras Bestowment,Increases the target's Magic Defense skill by 15 points. Additional spells can be layered over this.,15,780,299,10,Creature Enchantment,0.01,22,16,0,1,1 -2670,Nuhmudiras Endowment,Increases the target's Magic Defense skill by 10 points. Additional spells can be layered over this.,10,780,299,10,Creature Enchantment,0.01,22,16,0,1,1 -2671,Portal to the Callous Heart,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2672,Ring of True Pain,Shoots eight shock waves outward from the caster. Each wave does 200-300 points of bludgeoning damage to the first thing it hits.,200,-1,223,80,War Magic,0.2,0,0,4.5,0,1 -2673,Ring of Unspeakable Agony,Shoots eight shock waves outward from the caster. Each wave does 200-300 points of bludgeoning damage to the first thing it hits.,200,-1,223,80,War Magic,0.2,0,0,4.5,0,1 -2674,Vicious Rebuke,Kills the target.,320,-1,237,120,War Magic,0,0,16,30,0.2,1 -2675,Feeble Light Weapon Aptitude,Increases the target's Light Weapons skill by 3 points. Additional spells can be layered over this.,3,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2676,Feeble Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 3 points. Additional spells can be layered over this.,3,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2677,Feeble Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 3 points. Additional spells can be layered over this.,3,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2678,Feeble Finesse Weapon Aptitude,Increases the target's Finesse Weapons skill by 3 points. Additional spells can be layered over this.,3,780,313,10,Creature Enchantment,0.01,18,16,0,1,1 -2679,Feeble Light Weapon Aptitude,Increases the target's Light Weapons skill by 3 points. Additional spells can be layered over this.,3,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2680,Feeble Mana Conversion Prowess,Increases the target's Mana Conversion skill by 3 points. Additional spells can be layered over this.,3,780,363,10,Creature Enchantment,0.01,26,16,0,1,1 -2681,Feeble Light Weapon Aptitude,Increases the target's Light Weapons skill by 3 points. Additional spells can be layered over this.,3,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2682,Feeble Light Weapon Aptitude,Increases the target's Light Weapons skill by 3 points. Additional spells can be layered over this.,3,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2683,Feeble Heavy Weapon Aptitude,Increases the target's Heavy Weapons skill by 3 points. Additional spells can be layered over this.,3,780,371,10,Creature Enchantment,0.01,18,16,0,1,1 -2684,Feeble Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 3 points. Additional spells can be layered over this.,3,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2685,Feeble Light Weapon Aptitude,Increases the target's Light Weapons skill by 3 points. Additional spells can be layered over this.,3,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2686,Moderate Light Weapon Aptitude,Increases the target's Light Weapons skill by 10 points. Additional spells can be layered over this.,10,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2687,Moderate Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 10 points. Additional spells can be layered over this.,10,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2688,Moderate Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 10 points. Additional spells can be layered over this.,10,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2689,Moderate Finesse Weapon Aptitude,Increases the target's Finesse Weapons skill by 10 points. Additional spells can be layered over this.,10,780,313,10,Creature Enchantment,0.01,18,16,0,1,1 -2690,Moderate Light Weapon Aptitude,Increases the target's Light Weapons skill by 10 points. Additional spells can be layered over this.,10,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2691,Moderate Mana Conversion Prowess,Increases the target's Mana Conversion skill by 10 points. Additional spells can be layered over this.,10,780,363,10,Creature Enchantment,0.01,26,16,0,1,1 -2692,Moderate Light Weapon Aptitude,Increases the target's Light Weapons skill by 10 points. Additional spells can be layered over this.,10,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2693,Moderate Light Weapon Aptitude,Increases the target's Light Weapons skill by 10 points. Additional spells can be layered over this.,10,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2694,Moderate Heavy Weapon Aptitude,Increases the target's Heavy Weapons skill by 10 points. Additional spells can be layered over this.,10,780,371,10,Creature Enchantment,0.01,18,16,0,1,1 -2695,Moderate Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 10 points. Additional spells can be layered over this.,10,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -2696,Moderate Light Weapon Aptitude,Increases the target's Light Weapons skill by 10 points. Additional spells can be layered over this.,10,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -2697,Aerfalle's Touch,Decreases all of the target's attributes by 45 points for 120 seconds.,325,120,421,300,Creature Enchantment,0.35,38,16,5,0.25,1 -2698,Aerfalle's Embrace,Decreases the attributes of all fellowship members by 45 points for 120 seconds.,325,120,421,70,Creature Enchantment,0.15,38,16,5,0.25,1 -2699,Auroric Whip,Sends a bolt of lightning streaking towards the target. The stream does 150-200 points of lightning damage to the first thing it hits.,300,-1,246,70,War Magic,0.15,0,16,30,0.2,1 -2700,Corrosive Cloud,Sends a cloud of acid streaking towards the target. The stream does 150-200 points of acid damage to the first thing it hits.,300,-1,243,70,War Magic,0.15,0,16,30,0.2,1 -2701,Elemental Fury,Burns the target for 150-200 damage.,320,-1,237,120,War Magic,0,0,16,30,0.2,1 -2702,Elemental Fury,Burns the target for 150-200 damage.,320,-1,237,120,War Magic,0,0,16,30,0.2,1 -2703,Elemental Fury,Disitegrates the target for 150-200 damage.,320,-1,237,120,War Magic,0,0,16,30,0.2,1 -2704,Elemental Fury,Jolts the target for 150-200 damage.,320,-1,237,120,War Magic,0,0,16,30,0.2,1 -2705,Aerfalle's Enforcement,Lowers all fellowship members skills by 45 points for 120 seconds.,325,120,424,70,Creature Enchantment,0.15,52,16,5,0.25,1 -2706,Aerfalle's Gaze,Lowers targets skills by 45 points for 120 seconds.,325,120,424,70,Creature Enchantment,0.15,52,16,5,0.25,0 -2707,Elemental Pit,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2708,Stasis Field,Decreases all of the target's attributes by 50 points.,50,120,421,300,Life Magic,0.35,148,16,5,0.25,1 -2709,Summon Primary Portal I,Summons a portal that goes to the destination of the caster's linked portal. set with Primary Portal Tie.,200,60,203,70,Item Enchantment,0.5,0,65536,0,0,1 -2710,Volcanic Blast,Sends a stream of magma streaking towards the target. The stream does 150-200 points of acid damage to the first thing it hits.,300,-1,247,70,War Magic,0.15,0,16,30,0.2,1 -2711,Acid Arc I,Shoots a stream of acid at the target. The stream does 16-30 points of acid damage to the first thing it hits.,1,-1,117,5,War Magic,0.01,0,16,30,0.7,1 -2712,Acid Arc II,Shoots a stream of acid at the target. The stream does 26-52 points of acid damage to the first thing it hits.,50,-1,117,10,War Magic,0.05,0,16,30,0.6,1 -2713,Acid Arc III,Shoots a stream of acid at the target. The stream does 42-84 points of acid damage to the first thing it hits.,100,-1,117,15,War Magic,0.1,0,16,30,0.5,1 -2714,Acid Arc IV,Shoots a stream of acid at the target. The stream does 52-105 points of acid damage to the first thing it hits.,150,-1,117,20,War Magic,0.15,0,16,30,0.4,1 -2715,Acid Arc V,Shoots a stream of acid at the target. The stream does 68-136 points of acid damage to the first thing it hits.,200,-1,117,25,War Magic,0.2,0,16,30,0.3,1 -2716,Acid Arc VI,Shoots a stream of acid at the target. The stream does 84-168 points of acid damage to the first thing it hits.,250,-1,117,30,War Magic,0.3,0,16,30,0.2,1 -2717,Acid Arc VII,Shoots a stream of acid at the target. The stream does 115-189 points of acid damage to the first thing it hits.,300,-1,117,35,War Magic,0.15,0,16,30,0.2,1 -2718,Force Arc I,Shoots a bolt of force at the target. The bolt does 16-30 points of piercing damage to the first thing it hits.,1,-1,122,5,War Magic,0,0,16,30,0.7,1 -2719,Force Arc II,Shoots a bolt of force at the target. The bolt does 26-52 points of piercing damage to the first thing it hits.,50,-1,122,10,War Magic,0.05,0,16,30,0.6,1 -2720,Force Arc III,Shoots a bolt of force at the target. The bolt does 42-84 points of piercing damage to the first thing it hits.,100,-1,122,15,War Magic,0.1,0,16,30,0.5,1 -2721,Force Arc IV,Shoots a bolt of force at the target. The bolt does 52-105 points of piercing damage to the first thing it hits.,150,-1,122,20,War Magic,0.15,0,16,30,0.4,1 -2722,Force Arc V,Shoots a bolt of force at the target. The bolt does 68-136 points of piercing damage to the first thing it hits.,200,-1,122,25,War Magic,0.2,0,16,30,0.3,1 -2723,Force Arc VI,Shoots a bolt of force at the target. The bolt does 84-168 points of piercing damage to the first thing it hits.,250,-1,122,30,War Magic,0.3,0,16,30,0.2,1 -2724,Force Arc VII,Shoots a bolt of force at the target. The bolt does 115-189 points of piercing damage to the first thing it hits.,300,-1,122,35,War Magic,0.15,0,16,30,0.2,1 -2725,Frost Arc I,Shoots a bolt of frost at the target. The bolt does 16-30 points of cold damage to the first thing it hits.,1,-1,119,5,War Magic,0.01,0,16,30,0.7,1 -2726,Frost Arc II,Shoots a bolt of frost at the target. The bolt does 26-52 points of cold damage to the first thing it hits.,50,-1,119,10,War Magic,0.05,0,16,30,0.6,1 -2727,Frost Arc III,Shoots a bolt of cold at the target. The bolt does 42-84 points of cold damage to the first thing it hits.,100,-1,119,15,War Magic,0.1,0,16,30,0.5,1 -2728,Frost Arc IV,Shoots a bolt of cold at the target. The bolt does 52-105 points of cold damage to the first thing it hits.,150,-1,119,20,War Magic,0.15,0,16,30,0.4,1 -2729,Frost Arc V,Shoots a bolt of cold at the target. The bolt does 68-136 points of cold damage to the first thing it hits.,200,-1,119,25,War Magic,0.2,0,16,30,0.3,1 -2730,Frost Arc VI,Shoots a bolt of cold at the target. The bolt does 84-168 points of cold damage to the first thing it hits.,250,-1,119,30,War Magic,0.3,0,16,30,0.2,1 -2731,Frost Arc VII,Shoots a bolt of cold at the target. The bolt does 115-189 points of cold damage to the first thing it hits.,300,-1,119,35,War Magic,0.15,0,16,30,0.2,1 -2732,Lightning Arc I,Shoots a bolt of lighting at the target. The bolt does 16-30 points of electrical damage to the first thing it hits.,1,-1,120,5,War Magic,0,0,16,30,0.7,1 -2733,Lightning Arc II,Shoots a bolt of lighting at the target. The bolt does 26-52 points of electrical damage to the first thing it hits.,50,-1,120,10,War Magic,0.05,0,16,30,0.6,1 -2734,Lightning Arc III,Shoots a bolt of lighting at the target. The bolt does 42-84 points of electrical damage to the first thing it hits.,100,-1,120,15,War Magic,0.1,0,16,30,0.5,1 -2735,Lightning Arc IV,Shoots a bolt of lighting at the target. The bolt does 52-105 points of electrical damage to the first thing it hits.,150,-1,120,20,War Magic,0.15,0,16,30,0.4,1 -2736,Lightning Arc V,Shoots a bolt of lighting at the target. The bolt does 68-136 points of electrical damage to the first thing it hits.,200,-1,120,25,War Magic,0.2,0,16,30,0.3,1 -2737,Lightning Arc VI,Shoots a bolt of lighting at the target. The bolt does 84-168 points of electrical damage to the first thing it hits.,250,-1,120,30,War Magic,0.3,0,16,30,0.2,1 -2738,Lightning Arc VII,Shoots a bolt of lighting at the target. The bolt does 115-189 points of electrical damage to the first thing it hits.,300,-1,120,35,War Magic,0.15,0,16,30,0.2,1 -2739,Flame Arc I,Shoots a bolt of flame at the target. The bolt does 16-30 points of fire damage to the first thing it hits.,1,-1,121,5,War Magic,0,0,16,30,0.7,1 -2740,Flame Arc II,Shoots a bolt of flame at the target. The bolt does 26-52 points of fire damage to the first thing it hits.,50,-1,121,10,War Magic,0.05,0,16,30,0.6,1 -2741,Flame Arc III,Shoots a bolt of flame at the target. The bolt does 42-84 points of fire damage to the first thing it hits.,100,-1,121,15,War Magic,0.1,0,16,30,0.5,1 -2742,Flame Arc IV,Shoots a bolt of flame at the target. The bolt does 52-105 points of fire damage to the first thing it hits.,150,-1,121,20,War Magic,0.15,0,16,30,0.4,1 -2743,Flame Arc V,Shoots a bolt of flame at the target. The bolt does 68-136 points of fire damage to the first thing it hits.,200,-1,121,25,War Magic,0.2,0,16,30,0.3,1 -2744,Flame Arc VI,Shoots a bolt of flame at the target. The bolt does 84-168 points of fire damage to the first thing it hits.,250,-1,121,30,War Magic,0.3,0,16,30,0.2,1 -2745,Flame Arc VII,Shoots a bolt of flame at the target. The bolt does 115-189 points of fire damage to the first thing it hits.,300,-1,121,35,War Magic,0.15,0,16,30,0.2,1 -2746,Shock Arc I,Shoots a shock wave at the target. The wave does 16-30 points of bludgeoning damage to the first thing it hits.,1,-1,118,5,War Magic,0.01,0,16,30,0.7,1 -2747,Shock Arc II,Shoots a shock wave at the target. The wave does 26-52 points of bludgeoning damage to the first thing it hits.,50,-1,118,10,War Magic,0.05,0,16,30,0.6,1 -2748,Shock Arc III,Shoots a shock wave at the target. The wave does 42-84 points of bludgeoning damage to the first thing it hits.,100,-1,118,15,War Magic,0.1,0,16,30,0.5,1 -2749,Shock Arc IV,Shoots a shock wave at the target. The wave does 52-105 points of bludgeoning damage to the first thing it hits.,150,-1,118,20,War Magic,0.15,0,16,30,0.4,1 -2750,Shock Arc V,Shoots a shock wave at the target. The wave does 68-136 points of bludgeoning damage to the first thing it hits.,200,-1,118,25,War Magic,0.2,0,16,30,0.3,1 -2751,Shock Arc VI,Shoots a shock wave at the target. The wave does 84-168 points of bludgeoning damage to the first thing it hits.,250,-1,118,30,War Magic,0.3,0,16,30,0.2,1 -2752,Shock Arc VII,Shoots a shock wave at the target. The wave does 115-189 points of bludgeoning damage to the first thing it hits.,300,-1,118,35,War Magic,0.15,0,16,30,0.2,1 -2753,Blade Arc I,Shoots a magical blade at the target. The bolt does 16-30 points of slashing damage to the first thing it hits.,1,-1,123,5,War Magic,0.01,0,16,30,0.7,1 -2754,Blade Arc II,Shoots a magical blade at the target. The bolt does 26-52 points of slashing damage to the first thing it hits.,50,-1,123,10,War Magic,0.05,0,16,30,0.6,1 -2755,Blade Arc III,Shoots a magical blade at the target. The bolt does 42-84 points of slashing damage to the first thing it hits.,100,-1,123,15,War Magic,0.1,0,16,30,0.5,1 -2756,Blade Arc IV,Shoots a magical blade at the target. The bolt does 52-105 points of slashing damage to the first thing it hits.,150,-1,123,20,War Magic,0.15,0,16,30,0.4,1 -2757,Blade Arc V,Shoots a magical blade at the target. The bolt does 68-136 points of slashing damage to the first thing it hits.,200,-1,123,25,War Magic,0.2,0,16,30,0.3,1 -2758,Blade Arc VI,Shoots a magical blade at the target. The bolt does 84-168 points of slashing damage to the first thing it hits.,250,-1,123,30,War Magic,0.3,0,16,30,0.2,1 -2759,Blade Arc VII,Shoots a magical blade at the target. The bolt does 115-189 points of slashing damage to the first thing it hits.,300,-1,123,35,War Magic,0.15,0,16,30,0.2,1 -2760,Martyr's Hecatomb I,Drains one-quarter of the caster's health into a bolt of energy. When struck by the bolt. the target's health is reduced by 75% of the amount drained.,1,-1,80,10,Life Magic,0,0,16,30,0.7,1 -2761,Martyr's Hecatomb II,Drains one-quarter of the caster's health into a bolt of energy. When struck by the bolt. the target's health is reduced by 90% of the amount drained.,50,-1,80,20,Life Magic,0.05,0,16,30,0.6,1 -2762,Martyr's Hecatomb III,Drains one-quarter of the caster's health into a bolt of energy. When struck by the bolt. the target's health is reduced by 105% of the amount drained.,100,-1,80,30,Life Magic,0.1,0,16,30,0.5,1 -2763,Martyr's Hecatomb IV,Drains one-quarter of the caster's health into a bolt of energy. When struck by the bolt. the target's health is reduced by 125% of the amount drained.,150,-1,80,40,Life Magic,0.15,0,16,30,0.4,1 -2764,Martyr's Hecatomb V,Drains one-quarter of the caster's health into a bolt of energy. When struck by the bolt. the target's health is reduced by 150% of the amount drained.,200,-1,80,50,Life Magic,0.2,0,16,30,0.3,1 -2765,Martyr's Hecatomb VI,Drains one-quarter of the caster's health into a bolt of energy. When struck by the bolt. the target's health is reduced by 175% of the amount drained.,250,-1,80,60,Life Magic,0.3,0,16,30,0.2,1 -2766,Martyr's Hecatomb VII,Drains one-quarter of the caster's health into a bolt of energy. When struck by the bolt. the target's health is reduced by 200% of the amount drained.,300,-1,80,70,Life Magic,0.15,0,16,30,0.2,1 -2767,Martyr's Tenacity I,Drains one-quarter of the caster's stamina into a bolt of energy. When struck by the bolt. the target's stamina is reduced by 75% of the amount drained.,1,-1,82,10,Life Magic,0,0,16,30,0.7,1 -2768,Martyr's Tenacity II,Drains one-quarter of the caster's stamina into a bolt of energy. When struck by the bolt. the target's stamina is reduced by 90% of the amount drained.,50,-1,82,20,Life Magic,0.05,0,16,30,0.6,1 -2769,Martyr's Tenacity III,Drains one-quarter of the caster's stamina into a bolt of energy. When struck by the bolt. the target's stamina is reduced by 105% of the amount drained.,100,-1,82,30,Life Magic,0.1,0,16,30,0.5,1 -2770,Martyr's Tenacity IV,Drains one-quarter of the caster's stamina into a bolt of energy. When struck by the bolt. the target's stamina is reduced by 125% of the amount drained.,150,-1,82,40,Life Magic,0.15,0,16,30,0.4,1 -2771,Martyr's Tenacity V,Drains one-quarter of the caster's stamina into a bolt of energy. When struck by the bolt. the target's stamina is reduced by 150% of the amount drained.,200,-1,82,50,Life Magic,0.2,0,16,30,0.3,1 -2772,Martyr's Tenacity VI,Drains one-quarter of the caster's stamina into a bolt of energy. When struck by the bolt. the target's stamina is reduced by 175% of the amount drained.,250,-1,82,60,Life Magic,0.3,0,16,30,0.2,1 -2773,Martyr's Tenacity VII,Drains one-quarter of the caster's stamina into a bolt of energy. When struck by the bolt. the target's stamina is reduced by 200% of the amount drained.,300,-1,82,70,Life Magic,0.15,0,16,30,0.2,1 -2774,Martyr's Blight I,Drains one-quarter of the caster's mana into a bolt of energy. When struck by the bolt. the target's mana is reduced by 75% of the amount drained.,1,-1,84,10,Life Magic,0,0,16,30,0.7,1 -2775,Martyr's Blight II,Drains one-quarter of the caster's mana into a bolt of energy. When struck by the bolt. the target's mana is reduced by 90% of the amount drained.,50,-1,84,20,Life Magic,0.05,0,16,30,0.6,1 -2776,Martyr's Blight III,Drains one-quarter of the caster's mana into a bolt of energy. When struck by the bolt. the target's mana is reduced by 105% of the amount drained.,100,-1,84,30,Life Magic,0.1,0,16,30,0.5,1 -2777,Martyr's Blight IV,Drains one-quarter of the caster's mana into a bolt of energy. When struck by the bolt. the target's mana is reduced by 125% of the amount drained.,150,-1,84,40,Life Magic,0.15,0,16,30,0.4,1 -2778,Martyr's Blight V,Drains one-quarter of the caster's mana into a bolt of energy. When struck by the bolt. the target's mana is reduced by 150% of the amount drained.,200,-1,84,50,Life Magic,0.2,0,16,30,0.3,1 -2779,Martyr's Blight VI,Drains one-quarter of the caster's mana into a bolt of energy. When struck by the bolt. the target's mana is reduced by 175% of the amount drained.,250,-1,84,60,Life Magic,0.3,0,16,30,0.2,1 -2780,Martyr's Blight VII,Drains one-quarter of the caster's mana into a bolt of energy. When struck by the bolt. the target's mana is reduced by 200% of the amount drained.,300,-1,84,70,Life Magic,0.15,0,16,30,0.2,1 -2781,Lesser Elemental Fury,Disitegrates the target for 200 points of acid damage.,300,-1,237,200,War Magic,0,0,16,30,0.2,1 -2782,Lesser Elemental Fury,Burns the target for 200 points of fire damage.,300,-1,237,200,War Magic,0,0,16,30,0.2,1 -2783,Lesser Elemental Fury,Burns the target for 200 points of cold damage.,300,-1,237,200,War Magic,0,0,16,30,0.2,1 -2784,Lesser Elemental Fury,Jolts the target for 200 points of electric damage.,300,-1,237,200,War Magic,0,0,16,30,0.2,1 -2785,Lesser Stasis Field,Decreases all of the target's attributes by 20 points.,20,120,421,300,Life Magic,0.35,148,16,5,0.25,1 -2786,Madness,Wearing the mask makes you feel strange.,325,240,10,70,Creature Enchantment,0.15,0,16,5,0.25,1 -2787,Supremacy,Increases the Allegiance Rank by 1.,300,60,529,70,Creature Enchantment,0.15,20,16,5,0.25,1 -2788,Essence Blight,Drains 5000 points of the targets Mana.,275,-1,84,60,Life Magic,0.3,34,16,10,0.05,1 -2789,Elemental Destruction,Drains 8000 points of the target's Health.,1,-1,80,10,Life Magic,0.01,150,16,90,0.1,1 -2790,Weight of the World,Afflicts the target with the weight of the world.,275,60,2,1,Creature Enchantment,0.3,7,16,5,0.25,1 -2791,Rolling Death,A giant ball of acid.,320,-1,117,120,War Magic,0,0,0,100,0,1 -2792,Rolling Death,A giant ball of fire.,320,-1,121,120,War Magic,0,0,0,100,0,1 -2793,Rolling Death,A giant ball of ice.,320,-1,119,120,War Magic,0,0,0,100,0,1 -2794,Rolling Death,A giant ball of lightning.,320,-1,120,120,War Magic,0,0,0,100,0,1 -2795,Citadel Library,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2796,Citadel Surface,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2797,Proving Grounds Rolling Death,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2798,Proving Grounds High,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2799,Proving Grounds Low,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2800,Proving Grounds Mid,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2801,Proving Grounds Extreme,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2802,Proving Grounds High,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2803,Proving Grounds Low,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2804,Proving Grounds Mid,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2805,Impudence,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2806,Impudence,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2807,Impudence,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2808,Impudence,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2809,Moderate Arcane Prowess,Increases the target's Arcane Lore skill by 10 points. Additional spells can be layered over this.,10,780,335,10,Creature Enchantment,0.01,26,16,0,1,1 -2810,Moderate Life Magic Aptitude,Increases the target's Life Magic skill by 10 points. Additional spells can be layered over this.,10,780,357,10,Creature Enchantment,0.01,26,16,0,1,1 -2811,Moderate Magic Resistance,Increases the target's Magic Defense skill by 10 points. Additional spells can be layered over this.,10,780,299,10,Creature Enchantment,0.01,22,16,0,1,1 -2812,Moderate War Magic Aptitude,Increases the target's War Magic skill by 10 points. Additional spells can be layered over this.,10,780,255,10,Creature Enchantment,0.01,26,16,0,1,1 -2813,Mount Lethe Recall,Transports the caster to the base of Mount Lethe.,150,-1,214,150,Item Enchantment,0.25,0,16,0,0,1 -2814,Priest's Curse,Casts the Undead Priest's Curse on the target. The bolt does 61-120 points of piercing damage to the first thing it hits.,250,-1,122,30,War Magic,0.3,0,16,30,0.2,1 -2815,Boom Black Firework OUT,Shoots out a Black Firework.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2816,Big Boom Black Firework OUT,Shoots out a Black Firework.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2817,Shockwave Black Firework OUT,Shoots out a Black Firework.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2818,Spiral Black Firework OUT,Shoots out a Black Firework.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2819,Sparkle Black Firework OUT,Shoots out a Black Firework.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2820,Blossom Black Firework OUT,Shoots out a Black Firework.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2821,Ring Black Firework OUT,Shoots out a Black Firework.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2822,Boom Blue Firework OUT,Shoots out a Blue Firework.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2823,Big Boom Blue Firework OUT,Shoots out a Blue Firework.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2824,Shockwave Blue Firework OUT,Shoots out a Blue Firework.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2825,Spiral Blue Firework OUT,Shoots out a Blue Firework.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2826,Sparkle Blue Firework OUT,Shoots out a Blue Firework.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2827,Blossom Blue Firework OUT,Shoots out a Blue Firework.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2828,Ring Blue Firework OUT,Shoots out a Blue Firework.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2829,Boom Green Firework OUT,Shoots out a Green Firework.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2830,Big Boom Green Firework OUT,Shoots out a Green Firework.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2831,Shockwave Green Firework OUT,Shoots out a Green Firework.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2832,Spiral Green Firework OUT,Shoots out a Green Firework.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2833,Sparkle Green Firework OUT,Shoots out a Green Firework.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2834,Blossom Green Firework OUT,Shoots out a Green Firework.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2835,Ring Green Firework OUT,Shoots out a Green Firework.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2836,Boom Orange Firework OUT,Shoots out a Orange Firework.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2837,Big Boom Orange Firework OUT,Shoots out a Orange Firework.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2838,Shockwave Orange Firework OUT,Shoots out a Orange Firework.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2839,Spiral Orange Firework OUT,Shoots out a Orange Firework.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2840,Sparkle Orange Firework OUT,Shoots out a Orange Firework.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2841,Blossom Orange Firework OUT,Shoots out a Orange Firework.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2842,Ring Orange Firework OUT,Shoots out a Orange Firework.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2843,Boom Purple Firework OUT,Shoots out a Purple Firework.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2844,Big Boom Purple Firework OUT,Shoots out a Purple Firework.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2845,Shockwave Purple Firework OUT,Shoots out a Purple Firework.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2846,Spiral Purple Firework OUT,Shoots out a Purple Firework.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2847,Sparkle Purple Firework OUT,Shoots out a Purple Firework.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2848,Blossom Purple Firework OUT,Shoots out a Purple Firework.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2849,Ring Purple Firework OUT,Shoots out a Purple Firework.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2850,Boom Red Firework OUT,Shoots out a Red Firework.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2851,Big Boom Red Firework OUT,Shoots out a Red Firework.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2852,Shockwave Red Firework OUT,Shoots out a Red Firework.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2853,Spiral Red Firework OUT,Shoots out a Red Firework.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2854,Sparkle Red Firework OUT,Shoots out a Red Firework.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2855,Blossom Red Firework OUT,Shoots out a Red Firework.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2856,Ring Red Firework OUT,Shoots out a Red Firework.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2857,Boom White Firework OUT,Shoots out a White Firework.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2858,Big Boom White Firework OUT,Shoots out a White Firework.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2859,Shockwave White Firework OUT,Shoots out a White Firework.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2860,Spiral White Firework OUT,Shoots out a White Firework.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2861,Sparkle White Firework OUT,Shoots out a White Firework.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2862,Blossom White Firework OUT,Shoots out a White Firework.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2863,Ring White Firework OUT,Shoots out a White Firework.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2864,Boom Yellow Firework OUT,Shoots out a Yellow Firework.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2865,Big Boom Yellow Firework OUT,Shoots out a Yellow Firework.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2866,Shockwave Yellow Firework OUT,Shoots out a Yellow Firework.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2867,Spiral Yellow Firework OUT,Shoots out a Yellow Firework.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2868,Sparkle Yellow Firework OUT,Shoots out a Yellow Firework.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2869,Blossom Yellow Firework OUT,Shoots out a Yellow Firework.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2870,Ring Yellow Firework OUT,Shoots out a Yellow Firework.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2871,Boom Black Firework UP,Shoots a Black Firework straight up.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2872,Big Boom Black Firework UP,Shoots a Black Firework straight up.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2873,Shockwave Black Firework UP,Shoots a Black Firework straight up.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2874,Spiral Black Firework UP,Shoots a Black Firework straight up.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2875,Sparkle Black Firework UP,Shoots a Black Firework straight up.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2876,Blossom Black Firework UP,Shoots a Black Firework straight up.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2877,Ring Black Firework UP,Shoots a Black Firework straight up.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2878,Boom Blue Firework UP,Shoots a Blue Firework straight up.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2879,Big Boom Blue Firework UP,Shoots a Blue Firework straight up.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2880,Shockwave Blue Firework UP,Shoots a Blue Firework straight up.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2881,Spiral Blue Firework UP,Shoots a Blue Firework straight up.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2882,Sparkle Blue Firework UP,Shoots a Blue Firework straight up.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2883,Blossom Blue Firework UP,Shoots a Blue Firework straight up.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2884,Ring Blue Firework UP,Shoots a Blue Firework straight up.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2885,Boom Green Firework UP,Shoots a Green Firework straight up.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2886,Big Boom Green Firework UP,Shoots a Green Firework straight up.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2887,Shockwave Green Firework UP,Shoots a Green Firework straight up.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2888,Spiral Green Firework UP,Shoots a Green Firework straight up.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2889,Sparkle Green Firework UP,Shoots a Green Firework straight up.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2890,Blossom Green Firework UP,Shoots a Green Firework straight up.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2891,Ring Green Firework UP,Shoots a Green Firework straight up.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2892,Boom Orange Firework UP,Shoots a Orange Firework straight up.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2893,Big Boom Orange Firework UP,Shoots a Orange Firework straight up.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2894,Shockwave Orange Firework UP,Shoots a Orange Firework straight up.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2895,Spiral Orange Firework UP,Shoots a Orange Firework straight up.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2896,Sparkle Orange Firework UP,Shoots a Orange Firework straight up.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2897,Blossom Orange Firework UP,Shoots a Orange Firework straight up.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2898,Ring Orange Firework UP,Shoots a Orange Firework straight up.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2899,Boom Purple Firework UP,Shoots a Purple Firework straight up.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2900,Big Boom Purple Firework UP,Shoots a Purple Firework straight up.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2901,Shockwave Purple Firework UP,Shoots a Purple Firework straight up.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2902,Spiral Purple Firework UP,Shoots a Purple Firework straight up.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2903,Sparkle Purple Firework UP,Shoots a Purple Firework straight up.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2904,Blossom Purple Firework UP,Shoots a Purple Firework straight up.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2905,Ring Purple Firework UP,Shoots a Purple Firework straight up.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2906,Boom Red Firework UP,Shoots a Red Firework straight up.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2907,Big Boom Red Firework UP,Shoots a Red Firework straight up.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2908,Shockwave Red Firework UP,Shoots a Red Firework straight up.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2909,Spiral Red Firework UP,Shoots a Red Firework straight up.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2910,Sparkle Red Firework UP,Shoots a Red Firework straight up.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2911,Blossom Red Firework UP,Shoots a Red Firework straight up.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2912,Ring Red Firework UP,Shoots a Red Firework straight up.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2913,Boom White Firework UP,Shoots a White Firework straight up.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2914,Big Boom White Firework UP,Shoots a White Firework straight up.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2915,Shockwave White Firework UP,Shoots a White Firework straight up.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2916,Spiral White Firework UP,Shoots a White Firework straight up.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2917,Sparkle White Firework UP,Shoots a White Firework straight up.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2918,Blossom White Firework UP,Shoots a White Firework straight up.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2919,Ring White Firework UP,Shoots a White Firework straight up.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2920,Boom Yellow Firework UP,Shoots a Yellow Firework straight up.,1,-1,409,10,War Magic,0,0,0,100,0,1 -2921,Big Boom Yellow Firework UP,Shoots a Yellow Firework straight up.,50,-1,409,20,War Magic,0.05,0,0,100,0,1 -2922,Shockwave Yellow Firework UP,Shoots a Yellow Firework straight up.,100,-1,409,30,War Magic,0.1,0,0,100,0,1 -2923,Spiral Yellow Firework UP,Shoots a Yellow Firework straight up.,150,-1,409,40,War Magic,0.15,0,0,100,0,1 -2924,Sparkle Yellow Firework UP,Shoots a Yellow Firework straight up.,200,-1,409,50,War Magic,0.2,0,0,100,0,1 -2925,Blossom Yellow Firework UP,Shoots a Yellow Firework straight up.,250,-1,409,60,War Magic,0.3,0,0,100,0,1 -2926,Ring Yellow Firework UP,Shoots a Yellow Firework straight up.,300,-1,409,70,War Magic,0.15,0,0,100,0,1 -2927,Old School Fireworks,Original Anniversary Celebration Effect.,1,-1,409,15,War Magic,0.01,141,16,0,0,1 -2928,Tusker Hide,Increases the target's natural armor by 200 points.,250,5400,115,100,Life Magic,0.15,55,16,5,0.25,1 -2929,Tusker Might,Increases the caster's strength by 35.,276,5400,1,100,Creature Enchantment,0.15,6,16,0,0,1 -2930,Tusker Skin,Boosts a piece of armor by 200 points.,253,5400,160,70,Item Enchantment,0.15,142,6,25,0,1 -2931,Recall Aphus Lassel,Teleports caster to Aphus Lassel.,225,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -2932,Tusker Leap,Boosts casters jump skill by 100 for a short time.,401,10,69,100,Creature Enchantment,0.15,24,16,0,0,1 -2933,Tusker Sprint,Boosts casters run skill by 100 for a short time.,401,60,77,100,Creature Enchantment,0.15,24,16,0,0,1 -2934,Tusker Fists,A hail of tusker fists pummels a clear path ahead of the caster.,325,-1,230,120,War Magic,0.25,0,0,30,0.2,1 -2935,Trial of the Tusker Hero,Transports target to Mowen Udaun.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2936,Entrance to Tusker Island,Transports target to Tusker Island.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2937,Moderate Impregnability,Increases the target's Missile Defense skill by 10 points. Additional spells can be layered over this.,10,780,297,10,Creature Enchantment,0.01,22,16,0,1,1 -2938,Moderate Invulnerability,Increases the target's Melee Defense skill by 10 points. Additional spells can be layered over this.,10,780,351,10,Creature Enchantment,0.01,22,16,0,1,1 -2939,Entering the Temple,Transports the target to the Temple of Enlightenment.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2940,Entering the Temple,Transports the target to the Temple of Forgetfulness.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2941,Ulgrim's Recall,A really really good spell.,150,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -2942,Free Ride to the Abandoned Mine,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2943,Recall to the Singularity Caul,Teleports caster to the Singularity Caul.,225,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -2944,Storage Warehouse,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2945,Storage Warehouse,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2946,Moderate Creature Magic Aptitude,Increases the target's Creature Magic skill by 10 points. Additional spells can be layered over this.,10,780,251,10,Creature Enchantment,0.01,26,16,0,1,1 -2947,Nullify All Magic Other,Dispels all negative enchantments of level 6 or lower from the target. This spell is not affected by mana conversion.,300,-1,250,240,Life Magic,0.35,148,16,5,0.25,1 -2948,Hieromancer's Great Ward,Improves a shield or piece of armor's armor value by 220 points. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal.,200,780,190,50,Item Enchantment,0.2,142,6,25,0,1 -2949,Lightbringer's Way,Enhances the mettle and conviction of a weapon so that the metal bites deeper. The damage of the weapon is increased by 21 points.,250,2700,154,60,Item Enchantment,0.3,57,16,25,0,1 -2950,Maiden's Kiss,Enhances the health of the recipient by 30 points.,30,510,279,70,Life Magic,0.3,31,16,0,0,1 -2951,Gates of Knorr,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2952,Courtyard of Knorr,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2953,Interior Gates of Knorr,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2954,Barracks Conveyance,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2955,Forge Conveyance,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2956,Research Chambers Conveyance,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2957,Seat of Knorr,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2958,Blessing of the Priestess,Increases the target's Life Magic skill by 5 points. Additional enchancements to the skill can be layered over this.,5,300,357,10,Creature Enchantment,0.01,26,16,0,1,1 -2959,Mark of the Priestess,Increases the target's Life Magic skill by 10 points. Additional enchancements to the skill can be layered over this.,10,300,357,10,Creature Enchantment,0.01,26,16,0,1,1 -2960,Greater Bludgeoning Durance,Increases a shield or piece of armor's resistance to bludgeoning damage by 100%. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,50,360,176,20,Item Enchantment,0.05,67,6,25,0,1 -2961,Greater Piercing Durance,Increases a shield or piece of armor's resistance to piercing damage by 100%. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,50,360,180,20,Item Enchantment,0.05,59,6,25,0,1 -2962,Greater Slashing Durance,Increases a shield or piece of armor's resistance to slashing damage by 100%. This spell resonates in harmony with the natural frequency of Thaumaturgic Plate crystal. allowing additional magical defenses to be layered over it.,50,360,178,20,Item Enchantment,0.05,61,6,25,0,1 -2963,Aura of Hunter's Cunning,My prey shall know the bite of my steel long before it becomes aware of my presence. Increases the base offense bonus of a weapon by 18%.,500,780,152,10,Item Enchantment,0.01,59,16,25,0,1 -2964,Aura of Hunter's Mark,I shall be known by motion and cunning. all shall fear my mark. Increases the Melee Defense skill modifier of a weapon or magic caster by 18%.,500,780,156,10,Item Enchantment,0.01,61,16,25,0,1 -2965,Aura of Murderous Intent,I shall know my mindset and my prey will learn to fear. Increases the mana conversion bonus of a casting implement by 80%.,500,3600,195,70,Item Enchantment,0.15,67,16,25,0,1 -2966,Aura of Murderous Thirst,I shall drink the blood of my victims and it shall nourish my fevered desire. Increases the base damage of a weapon by 26.,500,780,154,10,Item Enchantment,0,57,16,25,0,1 -2967,Aura of The Speedy Hunter,My movements shall become as the wind. silent and swift. Decrease the base speed of a weapon by 30.,500,780,158,10,Item Enchantment,0,63,16,25,0,1 -2968,Vision of the Hunter,I will see with a sight beyond sight. Increases the base damage bonus of a weapon by 18%.,500,780,325,10,Item Enchantment,0.01,59,257,25,0,1 -2969,Mother's Blessing,This spell increases the overall health of a character by 25 points. This is not stackable with other effects.,25,510,279,70,Life Magic,0.3,31,16,0,0,1 -2970,Hunter's Lash,...and the blood shall pour down my throat and sate the thirst. Deals 70-180 points of slashing damage to a player/creatures before resistance is applied.,300,-1,137,60,Life Magic,0.15,0,16,30,0.2,1 -2971,Bullseye,Transports the player to the logic test of Oswald's Lair.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2972,Oswald's Room,Transports target to Oswald's Room,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2973,Access to the Secret Lair,Transports the player to Oswald's Lair.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2974,Vagabond Passed,Transports target to test of fleet feet.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2975,Moderate Item Enchantment Aptitude,Increases the target's Item Enchantment skill by 10 points. Additional spells can be layered over this.,10,780,253,10,Creature Enchantment,0.01,26,16,0,1,1 -2976,Acid Spray,Sprayed acid from an olthoi egg.,225,-1,131,30,War Magic,0.4,0,0,15,0.2,1 -2977,Portal spell to a hidden place,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2978,Nullify All Magic Other,Dispels all enchantments of level 7 or lower from the target.,375,-1,250,300,Life Magic,0.35,148,16,5,0.25,1 -2979,Destiny's Wind,Increases maximum mana by 100 points.,100,5400,283,70,Life Magic,0.3,33,16,0,0,1 -2980,Endless Vigor,Increases maximum stamina by 100 points.,350,5400,81,100,Life Magic,0.3,35,16,0,0,1 -2981,Fellowship Heal I,Restores 8-15 points of each fellow member.,1,-1,67,10,Life Magic,0,31,16,5,1,1 -2982,Fellowship Alchemy Mastery I,Increases each fellow's Alchemy skill by 10 points.,1,1800,221,10,Creature Enchantment,0.01,26,16,0,1,1 -2983,Fellowship Evaporate Life Magic Self,Dispels 1-3 negative Life Magic enchantments of level 1 from each person in the fellowship.,50,-1,250,50,Life Magic,0.05,146,16,0,0,1 -2984,Lyceum of Kivik Lir,Transports the fellowship to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,150,0,1 -2985,Ardence,Increases maximum health by 15 points.,15,510,279,70,Life Magic,0.3,31,16,0,0,1 -2986,Vim,Increases maximum stamina by 15 points.,15,5400,81,100,Life Magic,0.3,35,16,0,0,1 -2987,Volition,Increases maximum mana by 15 points.,15,5400,283,70,Life Magic,0.3,33,16,0,0,1 -2988,Beaten into Submission,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2989,Portal to the Bandit Hideout.,Transports the target to the specified destination.,250,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2990,Knocked Out,Transports the target to the specified destination.,250,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -2991,Winter's Kiss,Reduces damage the target takes from Cold by 13%. Additional spells can be layered over this.,13,7200,289,10,Life Magic,0.01,51,16,0,1,1 -2992,Depletion,Reduces the total mana of target by half.,50,30,412,10,Creature Enchantment,0.01,17,16,0,1,1 -2993,Grace of the Unicorn,Increases the target's Coordination by 2 points. Additional spells. including cantrips. can be layered over this.,2,10800,413,10,Creature Enchantment,0.01,14,16,0,1,1 -2994,Plague,Target's total health is reduces by 50%.,50,30,410,10,Creature Enchantment,0.01,9,16,0,1,1 -2995,Power of the Dragon,Increases the target's Strength by 2 points. Additional spells. including Cantrips. can be layered over this.,2,10800,414,10,Creature Enchantment,0.01,14,16,0,1,1 -2996,Scourge,Target's total stamina is reduced by 50%.,50,30,411,10,Creature Enchantment,0.01,7,16,0,1,1 -2997,Splendor of the Firebird,Increases the target's Focus by 2 points. Additional spells. including cantrips. can be layered over this.,2,10800,415,10,Creature Enchantment,0.01,14,16,0,1,1 -2998,Wrath of the Puppeteer,Shoots three bolts of flame toward the target. Each bolt does 40-60 points of fire damage to the first thing it hits.,125,-1,211,15,War Magic,0.15,0,16,15,0.5,1 -2999,Endurance of the Abyss,Increases the target's Endurance by 2 points. Additional spells. including Cantrips. can be layered over this.,2,780,416,10,Creature Enchantment,0.01,8,16,0,1,1 -3000,Ire of the Dark Prince,Decreases the target's natural armor by 500 points.,500,10,116,60,Life Magic,0.3,56,16,5,0.25,1 -3001,Puppet String,Reduces all target's attributes by 25 for one minute.,25,60,421,10,Creature Enchantment,0.01,9,16,0,1,1 -3002,Will of the Quiddity,Increases the target's Self by 2 points. Additional spells can be layered over this.,2,780,417,10,Creature Enchantment,0.01,6,16,0,1,1 -3003,Dark Wave,Lowers the total health of all fellowship member by half for ten seconds.,50,10,410,10,Creature Enchantment,0.01,9,16,0,1,1 -3004,Puppet Strings,Lowers the attributes of a fellowship by 25 points for one minute.,25,60,421,10,Creature Enchantment,0.01,9,16,0,1,1 -3005,Dispersion,Enhances the target's base Magic Defense by 1%. this can be layered with other spells.,1,780,420,10,Creature Enchantment,0.01,8,16,0,1,1 -3006,Foresight,Enhances the target's base Missile Defense by 1%. other spells can be layered on top of this spell.,1,780,419,10,Creature Enchantment,0.01,8,16,0,1,1 -3007,Uncanny Dodge,Enhances the target's base Melee Defense by 1%,1,780,418,10,Creature Enchantment,0.01,8,16,0,1,1 -3008,Finesse,Increases the target's Coordination by 8 points. Additional spells can be layered over this.,8,780,267,40,Creature Enchantment,0.15,8,16,5,0.55,1 -3009,Thew,Increases the target's Strength by 8 points. Additional spells can be layered over this.,8,780,261,10,Creature Enchantment,0.01,6,16,0,1,1 -3010,Zeal,Increases the target's Endurance by 8 points. Additional spells can be layered over this.,8,780,263,10,Creature Enchantment,0.01,10,16,0,1,1 -3011,Endless Sight,Increases the target's Missile Weapons Skill by 8 points. Additional spells can be layered over this.,8,780,331,40,Creature Enchantment,0.15,18,16,5,0.55,1 -3012,Far Sight,Increases the target's Missile Weapons Skill by 8 points. Additional spells can be layered over this.,8,780,331,40,Creature Enchantment,0.15,18,16,5,0.55,1 -3013,Fruit of the Oasis,Increases the rate at which the target regains Health by 20%. Additional spells can be layered over this.,20,780,257,10,Life Magic,0.01,37,16,5,1,1 -3014,Water of the Oasis,Increases the rate at which the target regains Mana by 20%. Additional spells can be layered over this.,20,780,259,10,Life Magic,0.01,39,16,5,1,1 -3015,Shade of the Oasis,Increases the rate at which the target regains Stamina by 20%. Additional spells can be layered over this.,20,780,407,10,Life Magic,0,41,16,5,1,1 -3016,Raptor's Sight,Increases the target's Missile Weapons Skill by 8 points. Additional spells can be layered over this.,8,780,331,40,Creature Enchantment,0.15,18,16,5,0.55,1 -3017,Greater Battle Dungeon Sending from Candeth Keep,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3018,Greater Battle Dungeon Sending from Fort Tethana,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3019,Greater Battle Dungeon Sending from Nanto,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3020,Greater Battle Dungeon Sending from Plateau,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3021,Greater Battle Dungeon Sending from Qalabar,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3022,Greater Battle Dungeon Sending from Tou-Tou,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3023,Greater Battle Dungeon Sending from Xarabydun,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3024,Greater Battle Dungeon Sending from Yaraq,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3025,Shriek,A howling wail. Does 40-80 points of bludgeoning damage to the first thing it hits.,280,-1,118,30,War Magic,0.15,0,16,5,0.2,1 -3026,Lesser Battle Dungeon Sending from Candeth Keep,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3027,Lesser Battle Dungeon Sending from Fort Tethana,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3028,Lesser Battle Dungeon Sending from Nanto,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3029,Lesser Battle Dungeon Sending from Plateau,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3030,Lesser Battle Dungeon Sending from Qalabar,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3031,Lesser Battle Dungeon Sending from Tou-Tou,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3032,Lesser Battle Dungeon Sending from Xarabydun,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3033,Lesser Battle Dungeon Sending from Yaraq,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3034,Benediction of Immortality,Increases the target's Health by 7 points. Additional spells. including Cantrips. can be layered over this.,500,780,422,10,Creature Enchantment,0.01,6,16,0,1,1 -3035,Closing of the Great Divide,Increases the target's Item Enchantment by 3 points. Additional spells. including Cantrips. can be layered over this.,500,780,423,10,Creature Enchantment,0.01,8,16,0,1,1 -3036,Cold Grip of the Grave,Drains 300 points of the target's Stamina.,500,-1,82,60,Life Magic,0.75,36,16,35,0,0 -3037,Death's Call,Drains 40 points of the target's Health.,500,-1,80,70,Life Magic,0.15,32,16,35,0,1 -3038,Death's Embrace,Drains 50 points of the target's Health.,500,-1,80,70,Life Magic,0.15,32,16,35,0,1 -3039,Death's Feast,Drains 150 points of the target's Health.,500,-1,80,60,Life Magic,0.75,32,16,35,0,0 -3040,Places Death's Kiss upon you.,Drains 30 points of the target's Health.,500,-1,80,70,Life Magic,0.15,32,16,35,0,1 -3041,Essence Dissolution,Drains 175 points of the target's Health.,500,-1,80,0,Life Magic,0.75,32,16,35,0,0 -3042,Grip of Death,Lowers all skills by 99%.,500,60,424,10,Creature Enchantment,0.01,9,16,0,1,1 -3043,Kiss of the Grave,Lowers total stamina of each fellowship member by 50%.,500,120,411,10,Creature Enchantment,0.01,9,16,0,1,1 -3044,Lesser Benediction of Immortality,Increases the target's Health by 3 points. Additional spells. including Cantrips. can be layered over this.,500,780,422,10,Creature Enchantment,0.01,6,16,0,1,1 -3045,Lesser Closing of the Great Divide,Increases the target's Item Enchantment by 1 point. Additional spells. including Cantrips. can be layered over this.,500,780,423,10,Creature Enchantment,0.01,8,16,0,1,1 -3046,Lesser Mists of Bur,Increases the target's natural armor by 195 points.,240,3600,115,50,Life Magic,0.2,55,16,5,0.4,1 -3047,Matron's Barb,Drains 250 point of the target's Mana.,500,-1,84,0,Life Magic,0.75,34,16,35,0,0 -3048,Minor Benediction of Immortality,Increases the target's Health by 5 points. Additional spells. including Cantrips. can be layered over this.,500,780,422,10,Creature Enchantment,0.01,6,16,0,1,1 -3049,Minor Closing of the Great Divide,Increases the target's Item Enchantment by 2 points. Additional spells. including Cantrips. can be layered over this.,500,780,423,10,Creature Enchantment,0.01,8,16,0,1,1 -3050,Minor Mists of Bur,Increases the target's natural armor by 205 points.,255,1800,115,50,Life Magic,0.2,55,16,5,0.4,1 -3051,Mire Foot,Target's run skill is reduces by 95%.,500,120,78,10,Creature Enchantment,0.01,9,16,0,1,1 -3052,Mists of Bur,Increases the target's natural armor by 230 points.,305,1800,115,50,Life Magic,0.2,55,16,5,0.4,1 -3053,Paralyzing Touch,Lowers all attributes by 99%.,500,60,421,10,Creature Enchantment,0.01,9,16,0,1,1 -3054,Soul Dissolution,Drains 750-1000 points of the target's Health.,500,-1,80,70,Life Magic,0.15,32,16,35,0,1 -3055,Asphyxiation,Lowers the attributes of a target by 30 points for two minutes.,300,120,421,10,Creature Enchantment,0.01,9,16,5,0.25,1 -3056,Death's Vice,Lowers total health of each fellowship member by 50%.,500,120,421,10,Creature Enchantment,0.01,9,16,0,1,1 -3057,Enervation,Lowers the total stamina of a target by 20% for 2 minutes.,300,120,411,10,Creature Enchantment,0.01,11,16,5,0.25,1 -3058,Asphyiaxtion,Lowers the attributes of a target by 40 points for two minutes.,300,120,421,10,Creature Enchantment,0.01,9,16,5,0.25,1 -3059,Enervation,Lowers the total stamina of a target by 30% for 2 minutes.,300,120,411,10,Creature Enchantment,0.01,11,16,5,0.25,1 -3060,Poison Blood,Lowers the total health of a target by 30% for 45 seconds.,300,45,410,10,Creature Enchantment,0.01,7,16,5,0.25,1 -3061,Taint Mana,Lowers the total mana of a target by 30% for 2 minutes.,300,120,412,10,Creature Enchantment,0.01,15,16,5,0.25,1 -3062,Asphyxiation,Lowers the attributes of a target by 20 points for two minutes.,300,120,421,10,Creature Enchantment,0.01,9,16,5,0.25,1 -3063,Enervation,Lowers the total stamina of a target by 10% for 2 minutes.,300,120,411,10,Creature Enchantment,0.01,11,16,5,0.25,1 -3064,Poison Blood,Lowers the total health of a target by 10% for 45 seconds.,300,45,410,10,Creature Enchantment,0.01,7,16,5,0.25,1 -3065,Taint Mana,Lowers the total mana of a target by 10% for 2 minutes.,300,120,412,10,Creature Enchantment,0.01,15,16,5,0.25,1 -3066,Lesser Ward of Rebirth,Increase natural healing rate of all fellowship members by 100%.,255,3600,93,70,Life Magic,0.15,37,16,5,0.25,1 -3067,Matron's Curse,Lowers total mana of each fellowship member by 50%.,500,120,412,10,Creature Enchantment,0.01,9,16,0,1,1 -3068,Minor Ward of Rebirth,Increase natural healing rate of all fellowship members by 125%..,310,3600,93,70,Life Magic,0.15,37,16,5,0.25,1 -3069,Poison Blood,Lowers the total health of a target by 20% for 45 seconds.,300,45,410,10,Creature Enchantment,0.01,7,16,5,0.25,1 -3070,Taint Mana,Lowers the total mana of a target by 20% for 2 minutes.,300,120,412,10,Creature Enchantment,0.01,15,16,5,0.25,1 -3071,Ward of Rebirth,Increase natural healing rate of all fellowship members by 150%.,500,3600,93,70,Life Magic,0.15,37,16,5,0.25,1 -3072,Hall of the Temple Guardians,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,150,0,1 -3073,Matron's Outer Chamber,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,150,0,1 -3074,Bruised Flesh,Lowers bludgeoning resistance of a target by 100%.,300,120,104,10,Life Magic,0,56,16,5,1,1 -3075,Flesh of Cloth,Lowers slashing resistance of a target by 100%.,300,120,114,10,Life Magic,0,48,16,5,1,1 -3076,Exposed Flesh,Lowers acid resistance of a target by 100%.,300,120,102,10,Life Magic,0,50,16,5,1,1 -3077,Flesh of Flint,Lowers flame resistance of a target by 100%.,300,120,110,10,Life Magic,0,44,16,5,1,1 -3078,Weaken Flesh,Lowers piercing resistance of a target by 100%.,300,120,112,10,Life Magic,0,46,16,5,1,1 -3079,Thin Skin,Lowers the natural armor of a target by 145.,300,120,116,10,Life Magic,0,56,16,5,1,1 -3080,Bruised Flesh,Lowers bludgeoning resistance of a target by 190%.,300,120,104,10,Life Magic,0,56,16,5,1,1 -3081,Flesh of Cloth,Lowers slashing resistance of a target by 190%.,300,120,114,10,Life Magic,0,48,16,5,1,1 -3082,Exposed Flesh,Lowers acid resistance of a target by 190%.,300,120,102,10,Life Magic,0,50,16,5,1,1 -3083,Flesh of Flint,Lowers flame resistance of a target by 190%.,300,120,110,10,Life Magic,0,44,16,5,1,1 -3084,Weaken Flesh,Lowers piercing resistance of a target by 190%.,300,120,112,10,Life Magic,0,46,16,5,1,1 -3085,Bruised Flesh,Lowers bludgeoning resistance of a target by 160%.,300,120,104,10,Life Magic,0,56,16,5,1,1 -3086,Flesh of Cloth,Lowers slashing resistance of a target by 160%.,300,120,114,10,Life Magic,0,48,16,5,1,1 -3087,Exposed Flesh,Lowers acid resistance of a target by 160%.,300,120,102,10,Life Magic,0,50,16,5,1,1 -3088,Flesh of Flint,Lowers flame resistance of a target by 160%.,300,120,110,10,Life Magic,0,44,16,5,1,1 -3089,Weaken Flesh,Lowers piercing resistance of a target by 160%.,300,120,112,10,Life Magic,0,46,16,5,1,1 -3090,Thin Skin,Lowers the natural armor of a target by 210.,300,120,116,10,Life Magic,0,56,16,5,1,1 -3091,Thin Skin,Lowers the natural armor of a target by 230.,332,120,116,10,Life Magic,0,56,16,5,1,1 -3092,Lesser Skin of the Fiazhat,Improves a shield or piece of armor's armor value by 180 points.,180,3600,160,70,Item Enchantment,0.15,142,6,25,0,1 -3093,Minor Skin of the Fiazhat,Improves a shield or piece of armor's armor value by 205 points.,255,3600,160,70,Item Enchantment,0.15,142,6,25,0,1 -3094,Skin of the Fiazhat,Improves a shield or piece of armor's armor value by 225 points.,305,3600,160,70,Item Enchantment,0.15,142,6,25,0,1 -3095,Crypt of Jexki Ki,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3096,Crypt of Ibrexi Jekti,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3097,Hall of the Guardians,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3098,Hall of the Greater Guardians,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3099,Hall of the Lesser Guardians,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3100,Antechamber of Ixir Zi's Temple,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3101,Crypt of Ixir Zi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3102,Kivik Lir's Temple,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3103,Crypt of Kixkti Xri,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3104,Hall of the Arbiter,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3105,Hall of the Arbiter,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3106,Hall of the Arbiter,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3107,Flay Soul,Shoots a magical blade at the target. The bolt does 100-210 points of slashing damage to the first thing it hits.,500,-1,123,35,War Magic,0.15,0,16,30,0.2,1 -3108,Flay Soul,Shoots a magical blade at the target. The bolt does 100-220 points of slashing damage to the first thing it hits.,500,-1,123,35,War Magic,0.15,0,16,30,0.2,1 -3109,Liquefy Flesh,Shoots a stream of acid at the target. The stream does 100-220 points of acid damage to the first thing it hits.,500,-1,117,35,War Magic,0.15,0,16,30,0.2,1 -3110,Sear Flesh,Shoots a bolt of flame at the target. The bolt does 100-220 points of fire damage to the first thing it hits.,500,-1,121,35,War Magic,0.15,0,16,30,0.2,1 -3111,Soul Hammer,Shoots a shock wave at the target. The wave does 100-220 points of bludgeoning damage to the first thing it hits.,500,-1,118,35,War Magic,0.15,0,16,30,0.2,1 -3112,Soul Spike,Shoots a bolt of force at the target. The bolt does 100-220 points of piercing damage to the first thing it hits.,500,-1,122,35,War Magic,0.15,0,16,30,0.2,1 -3113,Flay Soul,Shoots a magical blade at the target. The bolt does 100-200 points of slashing damage to the first thing it hits.,500,-1,123,35,War Magic,0.15,0,16,30,0.2,1 -3114,Liquefy Flesh,Shoots a stream of acid at the target. The stream does 100-200 points of acid damage to the first thing it hits.,500,-1,117,35,War Magic,0.15,0,16,30,0.2,1 -3115,Sear Flesh,Shoots a bolt of flame at the target. The bolt does 100-200 points of fire damage to the first thing it hits.,500,-1,121,35,War Magic,0.15,0,16,30,0.2,1 -3116,Soul Hammer,Shoots a shock wave at the target. The wave does 100-200 points of bludgeoning damage to the first thing it hits.,500,-1,118,35,War Magic,0.15,0,16,30,0.2,1 -3117,Soul Spike,Shoots a bolt of force at the target. The bolt does 100-200 points of piercing damage to the first thing it hits.,500,-1,122,35,War Magic,0.15,0,16,30,0.2,1 -3118,Liquefy Flesh,Shoots a stream of acid at the target. The stream does 100-210 points of acid damage to the first thing it hits.,500,-1,117,35,War Magic,0.15,0,16,30,0.2,1 -3119,Sear Flesh,Shoots a bolt of flame at the target. The bolt does 100-210 points of fire damage to the first thing it hits.,500,-1,121,35,War Magic,0.15,0,16,30,0.2,1 -3120,Soul Hammer,Shoots a shock wave at the target. The wave does 100-210 points of bludgeoning damage to the first thing it hits.,500,-1,118,35,War Magic,0.15,0,16,30,0.2,1 -3121,Soul Spike,Shoots a bolt of force at the target. The bolt does 100-210 points of piercing damage to the first thing it hits.,500,-1,122,35,War Magic,0.15,0,16,30,0.2,1 -3122,Sacrificial Edge,Shoots a single blade that deals 100-150 points of piercing damage at the target.,500,-1,122,0,War Magic,0,0,0,100,0,1 -3123,Sacrificial Edges,Shoots three blades that deal 100-150 points of piercing damage at the target.,500,-1,212,0,War Magic,0.15,0,0,30,0.4,1 -3124,Blight Mana,Lowers recipient's mana by 20% for 5 minutes.,300,300,412,10,Creature Enchantment,0.01,15,16,5,0.25,1 -3125,EnervateBeing,Lowers recipent's Stamina by 20% for 5 minutes.,300,300,411,10,Creature Enchantment,0.01,11,16,5,0.25,1 -3126,Poison Health,Lowers recipient's health by 20% for 5 minutes.,300,300,410,10,Creature Enchantment,0.01,7,16,5,0.25,1 -3127,Fell Wind,Lowers the total stamina of all fellowship members by 20% for 5 minutes.,500,300,411,10,Creature Enchantment,0.01,11,16,150,0,1 -3128,Infected Blood,Lowers the total health of all fellowship members by 20% for 5 minutes.,500,300,410,10,Creature Enchantment,0.01,7,16,150,0,1 -3129,Infirmed Mana,Lowers the total mana of all fellowship members by 20% for 5 minutes.,500,300,412,10,Creature Enchantment,0.01,15,16,150,0,1 -3130,Halls of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,150,0,1 -3131,Halls of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,150,0,1 -3132,Halls of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,150,0,1 -3133,Halls of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,150,0,1 -3134,Halls of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3135,Halls of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3136,Halls of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3137,Halls of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3138,Antechamber of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3139,Liazk Itzi's Crypt,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3140,Lair of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3141,Lair of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3142,Lair of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3143,Lair of Liazk Itzi,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3144,Liazk Itzi Guardians,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3145,Liazk Itzi Guardians,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3146,Liazk Itzi Guardians,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3147,Liazk Itzi Guardians,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3148,Liazk Itzi's Offering Room,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3149,Liazk Itzi's Offering Room,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3150,Liazk Itzi's Offering Room,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3151,Liazk Itzi's Offering Room,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3152,Inferior Scythe Aegis,Reduces damage the target takes from Slashing by 52%.,245,3600,113,40,Life Magic,0.15,47,16,5,0.55,0 -3153,Lesser Scythe Aegis,Reduces damage the target takes from Slashing by 45%.,195,3600,113,50,Life Magic,0.2,47,16,5,0.4,0 -3154,Scythe Aegis,Reduces damage the target takes from Slashing by 62%.,295,3600,113,60,Life Magic,0.3,47,16,5,0.25,0 -3155,Lesser Alacrity of the Conclave,Enhances the Coordination of all Fellowship members by 25 points for 30 minutes.,175,1800,7,40,Creature Enchantment,0.01,8,16,5,0.55,1 -3156,Alacrity of the Conclave,Enhances the Coordination of all Fellowship members by 30 points for 30 minutes.,225,1800,7,50,Creature Enchantment,0.01,8,16,5,0.4,1 -3157,Greater Alacrity of the Conclave,Enhances the Coordination of all Fellowship members by 35 points for 45 minutes.,275,2700,7,60,Creature Enchantment,0.01,8,16,5,0.25,1 -3158,Superior Alacrity of the Conclave,Enhances the Coordination of all Fellowship members by 40 points for 60 minutes.,325,3600,7,70,Creature Enchantment,0.01,8,16,5,0.25,1 -3159,Lesser Vivify the Conclave,Enhances the Endurance of all Fellowship members by 25 points for 30 minutes.,175,1800,3,40,Creature Enchantment,0.01,10,16,5,0.55,1 -3160,Vivify the Conclave,Enhances the Endurance of all Fellowship members by 30 points for 30 minutes.,225,1800,3,50,Creature Enchantment,0.01,10,16,5,0.4,1 -3161,Greater Vivify the Conclave,Enhances the Endurance of all Fellowship members by 35 points for 45 minutes.,275,2700,3,60,Creature Enchantment,0.01,10,16,5,0.25,1 -3162,Superior Vivify the Conclave,Enhances the Endurance of all Fellowship members by 40 points for 60 minutes.,325,3600,3,70,Creature Enchantment,0.01,10,16,5,0.25,1 -3163,Lesser Acumen of the Conclave,Enhances the Focus of all Fellowship members by 25 points for 30 minutes.,175,1800,9,40,Creature Enchantment,0.01,16,16,5,0.55,1 -3164,Acumen of the Conclave,Enhances the Focus of all Fellowship members by 30 points for 30 minutes.,225,1800,9,50,Creature Enchantment,0.01,16,16,5,0.4,1 -3165,Greater Acumen of the Conclave,Enhances the Focus of all Fellowship members by 35 points for 45 minutes.,275,2700,9,60,Creature Enchantment,0.01,16,16,5,0.25,1 -3166,Superior Acumen of the Conclave,Enhances the Focus of all Fellowship members by 40 points for 60 minutes.,325,3600,9,70,Creature Enchantment,0.01,16,16,5,0.25,1 -3167,Lesser Speed the Conclave,Enhances the Quickness of all Fellowship members by 25 points for 30 minutes.,175,1800,5,40,Creature Enchantment,0.01,12,16,5,0.55,1 -3168,Speed the Conclave,Enhances the Quickness of all Fellowship members by 30 points for 30 minutes.,225,1800,5,50,Creature Enchantment,0.01,12,16,5,0.4,1 -3169,Greater Speed the Conclave,Enhances the Quickness of all Fellowship members by 35 points for 45 minutes.,275,2700,5,60,Creature Enchantment,0.01,12,16,5,0.25,1 -3170,Superior Speed the Conclave,Enhances the Quickness of all Fellowship members by 40 points for 60 minutes.,325,3600,5,70,Creature Enchantment,0.01,12,16,5,0.25,1 -3171,Lesser Volition of the Conclave,Enhances the Self of all Fellowship members by 25 points for 30 minutes.,175,1800,11,40,Creature Enchantment,0.01,14,16,5,0.55,1 -3172,Volition of the Conclave,Enhances the Self of all Fellowship members by 30 points for 30 minutes.,225,1800,11,50,Creature Enchantment,0.01,14,16,5,0.4,1 -3173,Greater Volition of the Conclave,Enhances the Self of all Fellowship members by 35 points for 45 minutes.,275,2700,11,60,Creature Enchantment,0.01,14,16,5,0.25,1 -3174,Superior Volition of the Conclave,Enhances the Self of all Fellowship members by 40 points for 60 minutes.,325,3600,11,70,Creature Enchantment,0.01,14,16,5,0.25,1 -3175,Lesser Empowering the Conclave,Enhances the Strength of all Fellowship members by 25 points for 30 minutes.,175,1800,1,40,Creature Enchantment,0.01,6,16,5,0.55,1 -3176,Empowering the Conclave,Enhances the Strength of all Fellowship members by 30 points for 30 minutes.,225,1800,1,50,Creature Enchantment,0.01,6,16,5,0.4,1 -3177,Greater Empowering the Conclave,Enhances the Strength of all Fellowship members by 35 points for 45 minutes.,275,2700,1,60,Creature Enchantment,0.01,6,16,5,0.25,1 -3178,Superior Empowering the Conclave,Enhances the Strength of all Fellowship members by 40 points for 60 minutes.,325,3600,1,70,Creature Enchantment,0.01,6,16,5,0.25,1 -3179,Eradicate All Magic Other,Dispels all negative enchantments of level 7 or lower from the target.,350,-1,250,280,Life Magic,0.35,148,16,5,0.25,1 -3180,Eradicate All Magic Self,Dispels all negative enchantments of level 7 or lower from the caster.,350,-1,250,280,Life Magic,0.35,148,16,0,0,1 -3181,Nullify All Magic Other,Dispels 2-6 positive enchantments of level 6 or lower from the target.,300,-1,250,300,Life Magic,0.35,148,16,5,0.25,1 -3182,Nullify All Magic Self,Dispels 2-6 positive enchantments of level 6 or lower from the caster.,300,-1,250,300,Life Magic,0.35,148,16,0,0,1 -3183,Nullify All Magic Self,Dispels all enchantments of level 6 or lower from the caster.,300,-1,250,300,Life Magic,0.35,148,16,0,0,1 -3184,Eradicate Creature Magic Other,Dispels 3-6 negative Creature Magic enchantments of level 7 or lower from the target.,350,-1,250,280,Creature Enchantment,0.35,147,16,5,0.25,1 -3185,Eradicate Creature Magic Self,Dispels 3-6 negative Creature Magic enchantments of level 7 or lower from the caster.,350,-1,250,280,Creature Enchantment,0.35,147,16,0,0,1 -3186,Nullify Creature Magic Other,Dispels 2-6 positive Creature Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Creature Enchantment,0.35,147,16,5,0.25,1 -3187,Nullify Creature Magic Self,Dispels 2-6 positive Creature Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Creature Enchantment,0.35,147,16,0,0,1 -3188,Nullify Creature Magic Other,Dispels 2-6 Creature Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Creature Enchantment,0.35,147,16,5,0.25,1 -3189,Nullify Creature Magic Self,Dispels 2-6 Creature Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Creature Enchantment,0.35,147,16,0,0,1 -3190,Eradicate Item Magic,Dispels 3-6 negative Item Magic enchantments of level 7 or lower from the target.,350,-1,250,280,Item Enchantment,0.35,68,16,5,0.25,1 -3191,Nullify Item Magic,Dispels 2-6 positive Item Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Item Enchantment,0.35,68,16,5,0.25,1 -3192,Nullify Item Magic,Dispels 2-6 Item Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Item Enchantment,0.35,68,16,5,0.25,1 -3193,Eradicate Life Magic Other,Dispels 3-6 negative Life Magic enchantments of level 7 or lower from the target.,350,-1,250,280,Life Magic,0.35,146,16,5,0.25,1 -3194,Eradicate Life Magic Self,Dispels 3-6 negative Life Magic enchantments of level 7 or lower from the caster.,350,-1,250,280,Life Magic,0.35,146,16,0,0,1 -3195,Nullify Life Magic Other,Dispels 2-6 positive Life Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Life Magic,0.35,146,16,5,0.25,1 -3196,Nullify Life Magic Self,Dispels 2-6 positive Life Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Life Magic,0.35,146,16,0,0,1 -3197,Nullify Life Magic Other,Dispels 2-6 Life Magic enchantments of level 6 or lower from the target.,300,-1,250,300,Life Magic,0.35,146,16,5,0.25,1 -3198,Nullify Life Magic Self,Dispels 2-6 Life Magic enchantments of level 6 or lower from the caster.,300,-1,250,300,Life Magic,0.35,146,16,0,0,1 -3199,Minor Hermetic Link,Increases a magic casting implement's mana conversion bonus by 10%.,10,1800,425,10,Item Enchantment,0.01,67,33025,25,0,1 -3200,Major Hermetic Link,Increases a magic casting implement's mana conversion bonus by 20%.,20,1800,425,10,Item Enchantment,0.01,67,33025,25,0,1 -3201,Feeble Hermetic Link,Increases a magic casting implement's mana conversion bonus by 5%.,5,1800,425,10,Item Enchantment,0.01,67,33025,25,0,1 -3202,Moderate Hermetic Link,Increases a magic casting implement's mana conversion bonus by 15%.,15,1800,425,10,Item Enchantment,0.01,67,33025,25,0,1 -3203,Eradicate All Magic Other,Dispels all negative enchantments of level 7 or lower from the target. This spell is not affected by mana conversion.,350,-1,250,280,Life Magic,0.35,148,16,5,0.25,1 -3204,Blazing Heart,Increases maximum health by 50 points for 4 hours.,50,14400,279,70,Life Magic,0.3,31,16,0,0,1 -3205,Good Eating,Increases the target's Melee Defense skill by 10 points for 4 hours. Additional spells can be layered over this (excluding other cantrips).,10,14400,351,10,Creature Enchantment,0.01,22,16,0,1,1 -3206,Enliven,Increases maximum mana by 100 points for 4 hours.,100,14400,283,70,Life Magic,0.3,33,16,0,0,1 -3207,Ore Fire,Increases the target's Magic Defense skill by 10 points for 4 hours. Additional spells can be layered over this (excluding other cantrips).,10,14400,299,10,Creature Enchantment,0.01,22,16,0,1,1 -3208,Innervate,Increases maximum stamina by 200 points for 4 hours.,200,14400,281,70,Life Magic,0.3,35,16,0,0,1 -3209,Refreshment,Increases the target's Missile Defense skill by 10 points for 4 hours. Additional spells can be layered over this (excluding other cantrips).,10,14400,297,10,Creature Enchantment,0.01,22,16,0,1,1 -3210,Agitate,The Shadow Child enrages the target. reducing the target's Strength by 15%.,350,45,2,70,Creature Enchantment,0.15,7,16,5,0.25,1 -3211,Annoyance,The Shadow Child exasperates the target. reducing the target's Endurance by 15% .,350,45,4,70,Creature Enchantment,0.15,11,16,5,0.25,1 -3212,Guilt Trip,The sad tale of the Shadow Child decreases the target's Coordination by 15%.,350,45,8,70,Creature Enchantment,0.15,9,16,5,0.25,1 -3213,Heart Ache,The sad tale of the Shadow Child decreases the target's Self by 15%.,350,45,12,70,Creature Enchantment,0.15,17,16,5,0.25,1 -3214,Sorrow,The sad tale of the Shadow Child decreases the target's Focus by 15%.,350,45,10,70,Creature Enchantment,0.15,17,16,5,0.25,1 -3215,Underfoot,The Shadow Child gets in the target's way. reducing the target's Quickness by 15%.,350,45,6,70,Creature Enchantment,0.15,9,16,5,0.25,1 -3216,Transport to the Forbidden Catacombs,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3217,Cascade,Increases the target's Missile Weapons skill by 12 points.,12,780,331,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3218,Greater Cascade,Increases the target's Missile Weapons skill by 15 points.,15,780,331,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3219,Lesser Cascade,Increases the target's Missile Weapons skill by 8 points.,8,780,331,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3220,Cascade,Increases the target's Missile Weapons skill by 12 points.,12,780,331,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3221,Greater Cascade,Increases the target's Missile Weapons skill by 15 points.,15,780,331,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3222,Lesser Cascade,Increases the target's Missile Weapons skill by 8 points.,8,780,331,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3223,Cascade,Increases the target's Mana Conversion skill by 12 points.,12,780,363,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3224,Greater Cascade,Increases the target's Mana Conversion skill by 15 points.,15,780,363,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3225,Lesser Cascade,Increases the target's Mana Conversion skill by 8 points.,8,780,363,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3226,Cascade,Increases the target's Heavy Weapons skill by 12 points.,12,780,371,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3227,Greater Cascade,Increases the target's Heavy Weapons skill by 15 points.,15,780,371,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3228,Lesser Cascade,Increases the target's Heavy Weapons skill by 8 points.,8,780,371,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3229,Cascade,Increases the target's Light Weapons skill by 12 points.,12,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -3230,Greater Cascade,Increases the target's Light Weapons skill by 15 points.,15,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -3231,Lesser Cascade,Increases the target's Light Weapons skill by 8 points.,8,780,311,10,Creature Enchantment,0.01,18,16,5,1,1 -3232,Cascade,Increases the target's Missile Weapons skill by 12 points.,12,780,331,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3233,Greater Cascade,Increases the target's Missile Weapons skill by 15 points.,15,780,331,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3234,Lesser Cascade,Increases the target's Missile Weapons skill by 8 points.,8,780,331,30,Creature Enchantment,0.1,18,16,5,0.7,1 -3235,Dark Power,A dark power suffuses your being. increasing your Self by 2.,2,10800,417,10,Creature Enchantment,0.01,14,16,0,1,1 -3236,Restorative Draught,Restores 60-80 points of the target's Health.,200,-1,79,1000,Life Magic,0.3,31,16,5,0.25,1 -3237,Fanaticism,A fervent need for destruction increases your War Magic skill by 2.,2,10800,426,10,Creature Enchantment,0.01,26,16,0,1,1 -3238,Portal to Nanner Island,Transports the target to Nanner Island.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3239,Insight of the Khe,This spell enhances the caster's understanding of the mystical world. Self is raised by 32.,245,60,11,60,Creature Enchantment,0.3,14,16,5,0.25,1 -3240,Wisdom of the Khe,This spell enhances the caster's knowledge and ability to manipulate the mystical world. Focus is increased by 32.,245,60,9,60,Creature Enchantment,0.3,16,16,5,0.25,1 -3241,Flame Burst,A burst of superheated air blasts outward from the caster.,325,-1,226,80,War Magic,0.2,0,0,4.5,0,1 -3242,Weave of Chorizite,Veins of chorizite serve to raise your magic defense. Magic Defense is raised by 2 points when this item is wielded. This is in addition to any spells and cantrips.,265,60,428,10,Creature Enchantment,0.01,22,16,0,1,1 -3243,Consecration,The innate magic of the Homunculus enhances your Item Enchantment skill by 2.,2,10800,431,10,Creature Enchantment,0.01,26,16,0,1,1 -3244,Divine Manipulation,The power to show creatures the way surges through you. Increases your Creature Enchantment skill by 2.,2,10800,430,10,Creature Enchantment,0.01,26,16,0,1,1 -3245,Sacrosanct Touch,You feel urged to bless the worthy and punish the unworthy. Increases your Life Magic skill by 2.,2,10800,429,10,Creature Enchantment,0.01,26,16,0,1,1 -3246,Adja's Benefaction,Adja bestows her blessing upon you. increasing your Health Regeneration Rate by 50%. This effect can be layered with normal spell effects.,50,60,257,60,Life Magic,0.2,37,16,0,0,1 -3247,Adja's Favor,Adja bestows her favor upon you. increasing your Stamina Regeneration Rate by 50%. This effect can be layered with normal spell effects.,50,60,407,60,Life Magic,0.2,41,16,0,0,1 -3248,Adja's Grace,Adja bestows her grace upon you. increasing your Mana Regeneration Rate by 50%. This effect can be layered with normal spell effects.,50,60,259,60,Life Magic,0.2,39,16,0,0,1 -3249,Ghostly Chorus,A vision of a ghostly chorus sings to you. lifting your spirits and empowering you. Your rate of Mana Renewal increases by 200% for one hour.,1000,3600,97,60,Life Magic,0.2,39,16,0,0,1 -3250,Major Spirit Thirst,Increases the elemental damage bonus of an elemental magic caster by 3%. Additional spells can be layered over this.,3,780,323,10,Item Enchantment,0,57,32768,25,0,1 -3251,Minor Spirit Thirst,Increases the elemental damage bonus of an elemental magic caster by 1%. Additional spells can be layered over this.,1,780,323,10,Item Enchantment,0,57,32768,25,0,1 -3252,Spirit Thirst,Increases a caster's damage mod by 0.02 points. Additional spells can be layered over this.,2,780,323,10,Item Enchantment,0,57,32768,25,0,1 -3253,Aura of Spirit Drinker Self I,Increases the elemental damage bonus of an elemental magic caster by 1%.,1,1800,695,10,Item Enchantment,0,57,16,25,0,1 -3254,Aura of Spirit Drinker Self II,Increases the elemental damage bonus of an elemental magic caster by 2%.,50,1800,695,20,Item Enchantment,0.05,57,16,25,0,1 -3255,Aura of Spirit Drinker Self III,Increases the elemental damage bonus of an elemental magic caster by 3%.,100,1800,695,30,Item Enchantment,0.1,57,16,25,0,1 -3256,Aura of Spirit Drinker Self IV,Increases the elemental damage bonus of an elemental magic caster by 4%.,150,1800,695,40,Item Enchantment,0.15,57,16,25,0,1 -3257,Aura of Spirit Drinker Self V,Increases the elemental damage bonus of an elemental magic caster by 5%.,200,1800,695,50,Item Enchantment,0.2,57,16,25,0,1 -3258,Aura of Spirit Drinker Self VI,Increases the elemental damage bonus of an elemental magic caster by 6%.,250,2700,695,60,Item Enchantment,0.3,57,16,25,0,1 -3259,Aura of Infected Spirit Caress,Increases the elemental damage bonus of an elemental magic caster by 7%.,300,3600,695,70,Item Enchantment,0.15,57,16,25,0,1 -3260,Spirit Loather I,Decreases the elemental damage bonus of an elemental magic caster by 1%.,25,60,155,10,Item Enchantment,0.05,58,32768,25,0,1 -3261,Spirit Loather II,Decreases the elemental damage bonus of an elemental magic caster by 2%.,75,90,155,20,Item Enchantment,0.05,58,32768,25,0,1 -3262,Spirit Loather III,Decreases the elemental damage bonus of an elemental magic caster by 3%.,125,120,155,30,Item Enchantment,0.1,58,32768,25,0,1 -3263,Spirit Loather IV,Decreases the elemental damage bonus of an elemental magic caster by 4%.,175,150,155,40,Item Enchantment,0.15,58,32768,25,0,1 -3264,Spirit Loather V,Decreases the elemental damage bonus of an elemental magic caster by 5%.,225,180,155,60,Item Enchantment,0.2,58,32768,25,0,1 -3265,Spirit Loather VI,Decreases the elemental damage bonus of an elemental magic caster by 6%.,275,210,155,70,Item Enchantment,0.3,58,32768,25,0,1 -3266,Spirit Pacification,Decreases the elemental damage bonus of an elemental magic caster by 7%.,325,240,155,70,Item Enchantment,0.15,58,32768,25,0,1 -3267,Bit Between Teeth,This spell decreases the target's Self by 75%.,285,300,12,10,Creature Enchantment,0.15,15,16,5,0.25,1 -3268,Biting Bonds,Lowers recipient's health by 40% for five minutes.,285,300,410,10,Creature Enchantment,0.01,7,16,5,0.25,1 -3269,Under The Lash,Decreases the target's armor by 250 points for five minutes.,285,300,116,70,Life Magic,0.15,56,16,5,0.25,1 -3270,Hezhit's Safety,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3271,Hezhit's Safety,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3272,Hezhit's Safety,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3273,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3274,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3275,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3276,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3277,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3278,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3279,Entrance to Hizk Ri's Temple,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3280,Return to the Corridor,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3281,Hizk Ri's Test,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3282,Hizk Ri's Test,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3283,Hizk Ri's Test,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3284,Consort Hezhit,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3285,Attendant Jrvik,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3286,Well of Tears,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3287,Well of Tears,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3288,Well of Tears,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3289,Patriarch Zixki,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3290,Jrvik's Safety,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3291,Jrvik's Safety,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3292,Jrvik's Safety,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3293,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3294,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3295,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3296,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3297,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3298,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3299,Zixk's Safety,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3300,Zixk's Safety,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3301,Zixk's Safety,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3302,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3303,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3304,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3305,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3306,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3307,Prison,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3308,Flange Aegis,Reduces damage the target takes from Bludgeoning by 62%.,295,3600,103,60,Life Magic,0.3,47,16,5,0.25,0 -3309,Inferior Flange Aegis,Reduces damage the target takes from Bludgeoning by 52%.,245,3600,103,40,Life Magic,0.15,47,16,5,0.55,0 -3310,Inferior Lance Aegis,Reduces damage the target takes from Piercing by 52%.,245,3600,111,40,Life Magic,0.15,47,16,5,0.55,0 -3311,Lance Aegis,Reduces damage the target takes from Piercing by 62%.,295,3600,111,60,Life Magic,0.3,47,16,5,0.25,0 -3312,Lesser Flange Aegis,Reduces damage the target takes from Bludgeoning by 45%.,195,3600,103,50,Life Magic,0.2,47,16,5,0.4,0 -3313,Lesser Lance Aegis,Reduces damage the target takes from Piercing by 45%.,195,3600,111,50,Life Magic,0.2,47,16,5,0.4,0 -3314,Chained to the Wall,Decreases the target's Jump skill by 50% for five minutes.,285,300,70,70,Creature Enchantment,0.15,25,16,5,0.25,1 -3315,The Sewer,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3316,The Sewer,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3317,The Sewer,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3318,Hizk Ri's Crypt,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3319,Portal to Izji Qo's Temple,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3320,Lesser Corrosive Ward,Reduces damage all fellowship members take from acid by 43%.,150,1800,101,40,Life Magic,0.15,49,16,5,0.55,0 -3321,Corrosive Ward,Reduces damage all fellowship members take from acid by 50%.,200,1800,101,50,Life Magic,0.2,49,16,5,0.4,0 -3322,Greater Corrosive Ward,Reduces damage all fellowship members take from acid by 60%.,250,2700,101,60,Life Magic,0.3,49,16,5,0.25,0 -3323,Superior Corrosive Ward,Reduces damage all fellowship members take from acid by 65%.,300,3600,101,70,Life Magic,0.15,49,16,5,0.25,0 -3324,Lesser Scythe Ward,Reduces damage all fellowship members take from Slashing by 43%.,150,1800,113,40,Life Magic,0.15,47,16,5,0.55,0 -3325,Scythe Ward,Reduces damage all fellowship members take from Slashing by 50%.,200,1800,113,50,Life Magic,0.2,47,16,5,0.4,0 -3326,Greater Scythe Ward,Reduces damage all fellowship members take from Slashing by 60%.,250,2700,113,60,Life Magic,0.3,47,16,5,0.25,0 -3327,Superior Scythe Ward,Reduces damage all fellowship members take from Slashing by 65%.,300,3600,113,70,Life Magic,0.15,47,16,5,0.25,0 -3328,Lesser Flange Ward,Reduces damage all fellowship members take from Bludgeoning by 43%.,150,1800,103,40,Life Magic,0.15,55,16,5,0.55,0 -3329,Flange Ward,Reduces damage all fellowship members take from Bludgeoning by 50%.,200,1800,103,50,Life Magic,0.2,55,16,5,0.4,0 -3330,Greater Flange Ward,Reduces damage all fellowship members take from Bludgeoning by 60%.,250,2700,103,60,Life Magic,0.3,55,16,5,0.25,0 -3331,Superior Flange Ward,Reduces damage all fellowship members from Bludgeoning by 65%.,300,3600,103,70,Life Magic,0.15,55,16,5,0.25,0 -3332,Lesser Frore Ward,Reduces damage all fellowship members take from Cold by 43%.,150,1800,105,40,Life Magic,0.15,51,16,5,0.55,0 -3333,Frore Ward,Reduces damage all fellowship members take from Cold by 50%.,200,1800,105,50,Life Magic,0.2,51,16,5,0.4,0 -3334,Greater Frore Ward,Reduces damage all fellowship members take from Cold by 60%.,250,2700,105,60,Life Magic,0.3,51,16,5,0.25,0 -3335,Superior Frore Ward,Reduces damage all fellowship members take from Cold by 65%.,300,3600,105,70,Life Magic,0.15,51,16,5,0.25,0 -3336,Lesser Inferno Ward,Reduces damage all fellowship members take from fire by 43%.,150,1800,109,40,Life Magic,0.2,43,16,5,0.4,0 -3337,Inferno Ward,Reduces damage all fellowship members take from fire by 50%.,200,1800,109,50,Life Magic,0.2,43,16,5,0.4,0 -3338,Greater Inferno Ward,Reduces damage all fellowship members take from fire by 60%.,250,2700,109,60,Life Magic,0.3,43,16,5,0.25,0 -3339,Superior Inferno Ward,Reduces damage all fellowship members take from fire by 65%.,300,3600,109,70,Life Magic,0.15,43,16,5,0.25,0 -3340,Lesser Voltaic Ward,Reduces damage all fellowship members take from Lightning by 43%.,150,1800,107,40,Life Magic,0.15,53,16,5,0.55,0 -3341,Voltaic Ward,Reduces damage all fellowship members take from Lightning by 50%.,200,1800,107,50,Life Magic,0.2,53,16,5,0.4,0 -3342,Greater Voltaic Ward,Reduces damage all fellowship members take from Lightning by 60%.,250,2700,107,60,Life Magic,0.3,53,16,5,0.25,0 -3343,Superior Voltaic Ward,Reduces damage all fellowship members take from Lightning by 65%.,300,3600,107,70,Life Magic,0.15,53,16,5,0.25,0 -3344,Lesser Lance Ward,Reduces damage all fellowship members take from Piercing by 43%.,150,1800,111,40,Life Magic,0.15,45,16,5,0.55,0 -3345,Lance Ward,Reduces damage all fellowship members take from Piercing by 50%.,200,1800,111,50,Life Magic,0.2,45,16,5,0.4,0 -3346,Greater Lance Ward,Reduces damage all fellowship members take from Piercing by 60%.,250,2700,111,60,Life Magic,0.3,45,16,5,0.25,0 -3347,Superior Lance Ward,Reduces damage all fellowship members take from Piercing by 65%.,300,3600,111,70,Life Magic,0.15,45,16,5,0.25,0 -3348,Lesser Warden of the Clutch,Enhances the Missile Defense of all Fellowship members by 25 points for 30 minutes.,175,1800,39,40,Creature Enchantment,0.01,10,16,5,0.55,1 -3349,Inferior Warden of the Clutch,Enhances the Missile Defense of all Fellowship members by 30 points for 30 minutes.,225,1800,39,50,Creature Enchantment,0.01,10,16,5,0.4,1 -3350,Warden of the Clutch,Enhances the Missile Defense of all Fellowship members by 35 points for 45 minutes.,275,2700,39,60,Creature Enchantment,0.01,10,16,5,0.25,1 -3351,Potent Warden of the Clutch,Enhances the Missile Defense of all Fellowship members by 40 points for 60 minutes.,325,3600,39,70,Creature Enchantment,0.01,10,16,5,0.25,1 -3352,Lesser Guardian of the Clutch,Enhances the Melee Defense of all Fellowship members by 25 points for 30 minutes.,175,1800,37,40,Creature Enchantment,0.01,8,16,5,0.55,1 -3353,Inferior Guardian of the Clutch,Enhances the Melee Defense of all Fellowship members by 30 points for 30 minutes.,225,1800,37,50,Creature Enchantment,0.01,8,16,5,0.4,1 -3354,Guardian of the Clutch,Enhances the Melee Defense of all Fellowship members by 35 points for 45 minutes.,275,2700,37,60,Creature Enchantment,0.01,8,16,5,0.25,1 -3355,Potent Guardian of the Clutch,Enhances the Melee Defense of all Fellowship members by 40 points for 60 minutes.,325,3600,37,70,Creature Enchantment,0.01,8,16,5,0.25,1 -3356,Lesser Sanctifier of the Clutch,Enhances the Magic Defense of all Fellowship members by 25 points for 30 minutes.,175,1800,41,40,Creature Enchantment,0.01,16,16,5,0.55,1 -3357,Inferior Sanctifier of the Clutch,Enhances the Magic Defense of all Fellowship members by 30 points for 30 minutes.,225,1800,41,50,Creature Enchantment,0.01,16,16,5,0.4,1 -3358,Sanctifier of the Clutch,Enhances the Magic Defense of all Fellowship members by 35 points for 45 minutes.,275,2700,41,60,Creature Enchantment,0.01,16,16,5,0.25,1 -3359,Potent Sanctifier of the Clutch,Enhances the Magic Defense of all Fellowship members by 40 points for 60 minutes.,325,3600,41,70,Creature Enchantment,0.01,16,16,5,0.25,1 -3360,Entrance to the Burun Shrine,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3361,The Art of Destruction,Increases the target's War Magic skill by 11%.,351,780,49,10,Creature Enchantment,0.01,26,16,0,1,1 -3362,Blessing of the Horn,Increases the target's Magic Defense skill by 8 points.,8,780,299,10,Creature Enchantment,0.01,22,16,0,1,1 -3363,Blessing of the Scale,Increases the target's Melee Defense skill by 8 points.,8,780,351,10,Creature Enchantment,0.01,22,16,0,1,1 -3364,Blessing of the Wing,Increases the target's Missile Defense skill by 8 points.,8,780,297,10,Creature Enchantment,0.01,22,16,0,1,1 -3365,Gift of Enhancement,Increases the target's Creature Enchantement by 11%.,351,780,43,10,Creature Enchantment,0.01,26,16,0,1,1 -3366,The Heart's Touch,Increases the target's Life Magic skill by 11%.,351,780,47,10,Creature Enchantment,0.01,26,16,0,1,1 -3367,Leaping Legs,Increases the target's Jump skill by 11%.,351,780,69,10,Creature Enchantment,0.01,24,16,0,1,1 -3368,Mage's Understanding,Increases the target's Mana Conversion skill by 11%.,351,780,51,10,Creature Enchantment,0.01,26,16,0,1,1 -3369,On the Run,Increases the target's Run skill by 11%.,351,780,77,10,Creature Enchantment,0.01,24,16,0,1,1 -3370,Power of Enchantment,Increases the target's Item Enchantment skill by 11%.,351,780,45,10,Creature Enchantment,0.01,26,16,0,1,1 -3371,Greater Life Giver,Increases maximum health by 25 points.,25,510,279,70,Life Magic,0.3,31,16,0,0,1 -3372,Debilitating Spore,Drains 5000 points of the target's stamina.,275,-1,82,60,Life Magic,0.3,36,16,10,0.05,1 -3373,Diseased Air,Drains 5000 points of the target's Mana.,275,-1,84,60,Life Magic,0.3,34,16,10,0.05,1 -3374,Kivik Lir's Scorn,Drains the target of 99% of their current health.,600,-1,80,10,Life Magic,0.015,32,16,35,0,1 -3375,Fungal Bloom,Lowers the total health of the target by 50%.,500,15,410,10,Creature Enchantment,0.01,7,16,0,1,1 -3376,Lesser Vision Beyond the Grave,Enhances your understanding of the flux between worlds.,1,3600,433,10,Creature Enchantment,0.01,14,16,0,1,1 -3377,Minor Vision Beyond the Grave,Enhances your understanding of the flux between worlds.,2,3600,433,10,Creature Enchantment,0.01,14,16,0,1,1 -3378,Vision Beyond the Grave,Enhances your understanding of the flux between worlds.,3,3600,433,10,Creature Enchantment,0.01,14,16,0,1,1 -3379,Vitae,Death sucks,30,-1,204,3,Creature Enchantment,0.6,0,16,0,10,1 -3380,Vitae,Death sucks,30,-1,204,3,Creature Enchantment,0.6,0,16,0,10,1 -3381,Debilitating Spore,Drains 5000 points of stamina from each member of a fellowship.,375,-1,82,60,Life Magic,0.3,36,16,10,0.05,1 -3382,Diseased Air,Drains 5000 points of mana from each member of a fellowship.,375,-1,84,60,Life Magic,0.3,34,16,10,0.05,1 -3383,Fungal Bloom,Lowers total health of each fellowship member by 50%.,500,15,410,10,Creature Enchantment,0.01,7,16,0,1,1 -3384,Lesser Conjurant Chant,Enhances the Creature Enchantment skill of all Fellowship members by 25 points for 30 minutes.,175,1800,43,40,Creature Enchantment,0.01,26,16,5,0.25,1 -3385,Conjurant Chant,Enhances the Creature Enchantment skill of all Fellowship members by 30 points for 30 minutes.,225,1800,43,50,Creature Enchantment,0.01,26,16,5,0.25,1 -3386,Greater Conjurant Chant,Enhances the Creature Enchantment skill of all Fellowship members by 35 points for 45 minutes.,275,2700,43,60,Creature Enchantment,0.01,26,16,5,0.25,1 -3387,Superior Conjurant Chant,Enhances the Creature Enchantment skill of all Fellowship members by 40 points for 60 minutes.,325,3600,43,70,Creature Enchantment,0.01,26,16,5,0.25,1 -3388,Lesser Artificant Chant,Enhances the Item Enchantment skill of all Fellowship members by 25 points for 30 minutes.,175,1800,45,40,Creature Enchantment,0.01,26,16,5,0.25,1 -3389,Artificant Chant,Enhances the Item Enchantment skill of all Fellowship members by 30 points for 30 minutes.,225,1800,45,50,Creature Enchantment,0.01,26,16,5,0.25,1 -3390,Greater Artificant Chant,Enhances the Item Enchantment skill of all Fellowship members by 35 points for 45 minutes.,275,2700,45,60,Creature Enchantment,0.01,26,16,5,0.25,1 -3391,Superior Artificant Chant,Enhances the Item Enchantment skill of all Fellowship members by 40 points for 60 minutes.,325,3600,45,70,Creature Enchantment,0.01,26,16,5,0.25,1 -3392,Lesser Vitaeic Chant,Enhances the Life Magic skill of all Fellowship members by 25 points for 30 minutes.,175,1800,47,40,Creature Enchantment,0.01,26,16,5,0.25,1 -3393,Vitaeic Chant,Enhances the Life Magic skill of all Fellowship members by 30 points for 30 minutes.,225,1800,47,50,Creature Enchantment,0.01,26,16,5,0.25,1 -3394,Greater Vitaeic Chant,Enhances the Life Magic skill of all Fellowship members by 35 points for 45 minutes.,275,2700,47,60,Creature Enchantment,0.01,26,16,5,0.25,1 -3395,Superior Vitaeic Chant,Enhances the Life Magic skill of all Fellowship members by 40 points for 60 minutes.,325,3600,47,70,Creature Enchantment,0.01,26,16,5,0.25,1 -3396,Lesser Conveyic Chant,Enhances the Mana Conversion skill of all Fellowship members by 25 points for 30 minutes.,175,1800,51,40,Creature Enchantment,0.01,26,16,5,0.25,1 -3397,Conveyic Chant,Enhances the Mana Conversion skill of all Fellowship members by 30 points for 30 minutes.,225,1800,51,50,Creature Enchantment,0.01,26,16,5,0.25,1 -3398,Greater Conveyic Chant,Enhances the Mana Conversion skill of all Fellowship members by 35 points for 45 minutes.,275,2700,51,60,Creature Enchantment,0.01,26,16,5,0.25,1 -3399,Superior Conveyic Chant,Enhances the Mana Conversion skill of all Fellowship members by 40 points for 60 minutes.,325,3600,51,70,Creature Enchantment,0.01,26,16,5,0.25,1 -3400,Lesser Hieromantic Chant,Enhances the War Magic skill of all Fellowship members by 25 points for 30 minutes.,175,1800,49,40,Creature Enchantment,0.01,26,16,5,0.25,1 -3401,Hieromantic Chant,Enhances the War Magic skill of all Fellowship members by 30 points for 30 minutes.,225,1800,49,50,Creature Enchantment,0.01,26,16,5,0.25,1 -3402,Greater Hieromantic Chant,Enhances the War Magic skill of all Fellowship members by 35 points for 45 minutes.,275,2700,49,60,Creature Enchantment,0.01,26,16,5,0.25,1 -3403,Superior Hieromantic Chant,Enhances the War Magic skill of all Fellowship members by 40 points for 60 minutes.,325,3600,49,70,Creature Enchantment,0.01,26,16,5,0.25,1 -3404,Evil Thirst,The barbs of the Manacale of Biting Pain dig into your wrist. reducing your health.,10,510,280,70,Life Magic,0.3,32,16,0,0,1 -3405,Gift of the Fiazhat,The gift of the Fiazhat enhances your magical capacity.,15,3600,432,10,Creature Enchantment,0.01,33,16,0,1,1 -3406,Kivik Lir's Boon,Kivik Lir has granted a boon upon you. student. You have 15 minutes to complete the remaining two trials. Do not fail.,500,900,196,10,Creature Enchantment,0.25,14,16,150,0,1 -3407,Lesser Evil Thirst,The barbs of the Manacale of Biting Pain dig into your wrist. reducing your health.,5,510,280,70,Life Magic,0.3,32,16,0,0,1 -3408,Lesser Gift of the Fiazhat,The gift of the Fiazhat enhances your magical capacity.,5,3600,432,10,Creature Enchantment,0.01,33,16,0,1,1 -3409,Minor Evil Thirst,The barbs of the Manacale of Biting Pain dig into your wrist. reducing your health.,8,510,280,70,Life Magic,0.3,32,16,0,0,1 -3410,Minor Gift of the Fiazhat,The gift of the Fiazhat enhances your magical capacity.,10,3600,432,10,Creature Enchantment,0.01,33,16,0,1,1 -3411,Portal spell to a Hidden Chamber,Transports the player to Elysa's treasure chamber.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3412,Halls of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3413,Lesser Arena of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3414,Arena of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3415,Greater Arena of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3416,Gallery of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3417,Gallery of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3418,Gallery of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3419,Crypt of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3420,Lesser Haven of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3421,Haven of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3422,Greater Haven of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3423,Trials of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3424,Triumph Against the Trials,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,150,0,1 -3425,Lyceum of Kivik Lir,Transports the target to the specified destination.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3426,Greater Withering,Shoots a ring of acidic clouds out from the caster. Each cloud does 100-220 points of acid damage to the first thing it hits.,550,-1,222,10,War Magic,0.01,0,16,0,1,1 -3427,Lesser Withering,Shoots a ring of acidic clouds out from the caster. Each cloud does 100-200 points of acid damage to the first thing it hits.,350,-1,222,10,War Magic,0.01,0,16,0,1,1 -3428,Withering,Shoots a ring of acidic clouds out from the caster. Each cloud does 100-210 points of acid damage to the first thing it hits.,450,-1,222,10,War Magic,0.01,0,16,0,1,1 -3429,Kivik Lir's Venom,The Spirit of Kivik Lir curses you for despoiling her tomb. Your natural armor is reduced by 200 points for 1 hour.,9999,3600,116,10,Life Magic,0.01,56,16,35,0,1 -3430,Inferior Scourge Aegis,Reduces damage the target takes from Acid by 52%.,245,3600,101,40,Life Magic,0.15,49,16,5,0.55,0 -3431,Lesser Scourge Aegis,Reduces damage the target takes from Acid by 45%.,195,3600,101,40,Life Magic,0.15,49,16,5,0.55,0 -3432,Scourge Aegis,Reduces damage the target takes from Acid by 62%.,295,3600,101,40,Life Magic,0.15,49,16,5,0.55,0 -3433,Decay,The Spirit of Kivik Lir curses you for despoiling her tomb. You can no longer recover health naturally for 1 hour.,9999,3600,94,70,Life Magic,0.15,38,16,5,1,0 -3434,Eyes Beyond the Mist,Enhances your understanding of the flux between worlds.,3,3600,434,10,Creature Enchantment,0.01,26,16,0,1,1 -3435,Greater Mucor Blight,An explosion of fungal spores swirls in the air. reducing all your skills by 50%.,500,15,424,10,Creature Enchantment,0.01,27,16,0,1,1 -3436,Lesser Eyes Beyond the Mist,Enhances your understanding of the flux between worlds.,1,3600,434,10,Creature Enchantment,0.01,26,16,0,1,1 -3437,Lesser Mucor Blight,An explosion of fungal spores swirls in the air. reducing all your skills by 10%.,500,15,424,10,Creature Enchantment,0.01,27,16,0,1,1 -3438,Minor Eyes Beyond the Mist,Enhances your understanding of the flux between worlds.,2,3600,434,10,Creature Enchantment,0.01,26,16,0,1,1 -3439,Mucor Blight,An explosion of fungal spores swirls in the air. reducing all your skills by 20%.,500,15,424,10,Creature Enchantment,0.01,27,16,0,1,1 -3440,Health of the Lugian,Increase target's natural healing rate by 125%.,311,7200,93,10,Life Magic,0.15,37,16,5,0.25,1 -3441,Insight of the Lugian,Increases the target's natural mana rate by 125%.,351,7200,97,10,Life Magic,0.15,39,16,5,0.25,1 -3442,Stamina of the Lugian,Increases the rate at which the target regains Stamina by 125%.,351,7200,95,10,Life Magic,0.15,41,16,5,0.25,1 -3443,Blight of the Swamp,The vile nature of the swamp swells within your body. you are afflicted with all manner of ill feelings and suffer greatly. All secondary attributes are reduced by 40% for the duration of the spell.,327,60,410,10,Creature Enchantment,0.01,9,16,0,1,1 -3444,Justice of The Sleeping One,This spell attempts to rip all positive creature magic from a single target.,400,-1,250,300,Creature Enchantment,0.35,147,16,5,0.25,1 -3445,The Sleeping One's Purge,This spell attempts to rip all positive creature magic from a single target.,400,-1,250,300,Life Magic,0.35,146,16,5,0.25,1 -3446,Wrath of the Swamp,The vile nature of the swamp swells within you and each of your companions. you are all afflicted with ill feelings and suffer greatly. All secondary attributes are reduced by 40% for the duration of the spell.,327,60,410,10,Creature Enchantment,0.01,9,16,0,1,1 -3447,Asphyxiating Spore Cloud,A small cloud of spores surrounds you and your fellowship choking the vigor from your bodies. Causes stamina loss over time.,326,60,96,70,Life Magic,0.15,42,16,0,0,0 -3448,Mass Blood Affliction,Pain wracks your body and the bodies of your fellowship members as painful spores burrow into your flesh and enter your blood stream. Causes health damage over time.,326,60,94,70,Life Magic,0.15,38,16,5,1,0 -3449,Mass Blood Disease,Pain wracks your body and the bodies of your fellowship members as painful spores burrow into your flesh and enter your blood stream. Causes a large amount of damage over time.,325,40,94,70,Life Magic,0.15,38,16,5,1,0 -3450,Cloud of Mold Spores,A small cloud of spores pours into your lungs choking the vigor from your body. Stamina degenerates over time.,325,40,96,70,Life Magic,0.15,42,16,0,0,0 -3451,Concussive Belch,The creature let's out a violent belch that is laden with magical force. It damages a single target for 120-220 of bludgeon Damage.,350,-1,118,5,War Magic,0.15,0,16,30,0.2,1 -3452,Concussive Wail,The creature let's out a violent wail that is laden with magical force. It sends a ring of damage around it dealing 80 ? 200 damage bludgeoning damage.,350,-1,223,10,War Magic,0.2,0,0,4.5,0,1 -3453,Feelun Blight,The creature summons the power of the mighty feelun tree and coalesces it into a blast of fire against a single target. It damages a single target for 120 -220 of fire damage.,350,-1,226,10,War Magic,0.2,0,0,4.5,0,1 -3454,Wrath of the Feelun,The creature summons the power of the mighty feelun tree and coalesces it into a blast of fire against a single target. It damages a single target for 120 - 220 of fire damage.,350,-1,121,5,War Magic,0.15,0,16,30,0.2,1 -3455,Koruu Cloud,A cloud of spores launches out of the creature inflicting powerful damage to all around. The spells deals 80 ? 200 damage of cold damage with each bolt.,350,-1,224,10,War Magic,0.2,0,0,4.5,0,1 -3456,Koruu's Wrath,A cloud of spores launches out of the creature inflicting powerful damage to all around. 120 - 220 of cold damage.,350,-1,119,5,War Magic,0.15,0,16,30,0.2,1 -3457,Mana Bolt,The creature launch a blast of pure mana at a single target dealing 50 ? 100 damage.,350,-1,118,5,War Magic,0.15,0,16,30,0.2,1 -3458,Mana Purge,The creature launch a blast of pure mana in a ring around itself dealing 50 ? 100 damage with each bolt.,350,-1,223,80,War Magic,0.2,0,0,4.5,0,1 -3459,Mucor Cloud,A cloud of spores launches out of the creature inflicting powerful damage to all around. This speall deals 80 ? 200 damage acid damage with each bolt.,350,-1,131,10,War Magic,0.4,0,0,15,0.2,1 -3460,Dissolving Vortex,A cloud of spores launches out of the creature inflicting powerful damage to a target. Deals 120 - 220 acid damage to a single target.,350,-1,131,5,War Magic,0.15,0,16,30,0.2,1 -3461,Batter Flesh,Target's flesh is left open and vulnerable to bludgeoning attacks. Increases damage the target takes from Bludgeoning by 200%.,350,60,104,10,Life Magic,0.15,56,16,5,0.25,1 -3462,Canker Flesh,Target's flesh is left open and vulnerable to acid attacks. Increases damage the target takes from acid by 200%.,350,60,102,10,Life Magic,0.15,50,16,5,0.25,1 -3463,Char Flesh,Target's flesh is left open and vulnerable to fire attacks. Increases damage the target takes from fire by 200%.,350,60,110,10,Life Magic,0.15,44,16,5,0.25,1 -3464,Numb Flesh,Target's flesh is left open and vulnerable to cold attacks. Increases damage the target takes from Cold by 200%.,350,60,106,10,Life Magic,0.15,52,16,5,0.25,1 -3465,Blood Affliction,Pain wracks your body as painful spores burrow into your flesh and enter your blood stream. ,326,600,94,10,Life Magic,0.15,38,16,5,1,0 -3466,Blood Disease,Pain wracks your body as painful spores burrow into your flesh and enter your blood stream. ,325,40,94,10,Life Magic,0.15,38,16,5,1,0 -3467,Choking Spores,A small cloud of spores pours into your lungs choking the vigor from your body. ,326,600,96,10,Life Magic,0.15,42,16,0,0,0 -3468,Mold Spores,A small cloud of spores pours into your lungs choking the vigor from your body. ,326,40,96,10,Life Magic,0.15,42,16,0,0,0 -3469,Parasitic Affliction,A host of parasites burrow into your flesh and begin to devour you from within your own blood. The healthier you are. the more potent these parasites become.,326,300,94,10,Life Magic,0.15,38,16,5,1,0 -3470,Lesser Endless Well,Enhances the understanding of the ebb and flow of mana. All fellowship members received a 55% increase to their nautral mana recovery rate.,150,1800,97,40,Life Magic,0.15,39,16,5,0.55,0 -3471,The Endless Well,Enhances the understanding of the ebb and flow of mana. All fellowship members received a 70% increase to their nautral mana recovery rate.,200,1800,97,50,Life Magic,0.2,39,16,5,0.4,0 -3472,Greater Endless Well,Enhances the understanding of the ebb and flow of mana. All fellowship members received a 85% increase to their nautral mana recovery rate.,250,2700,97,60,Life Magic,0.3,39,16,5,0.25,0 -3473,Superior Endless Well,Enhances the understanding of the ebb and flow of mana. All fellowship members received a 115% increase to their nautral mana recovery rate.,300,3600,97,70,Life Magic,0.15,39,16,5,0.25,0 -3474,Lesser Soothing Wind,Enhances the blood flow and aids in knitting wounds closed. All fellowship member receive a 55% increase to their natural health recovery rate.,150,1800,93,40,Life Magic,0.15,37,16,5,0.55,0 -3475,The Soothing Wind,Enhances the blood flow and aids in knitting wounds closed. All fellowship member receive a 70% increase to their natural health recovery rate.,200,1800,93,50,Life Magic,0.2,37,16,5,0.4,0 -3476,Greater Soothing Wind,Enhances the blood flow and aids in knitting wounds closed. All fellowship member receive a 85% increase to their natural health recovery rate.,250,2700,93,60,Life Magic,0.3,37,16,5,0.25,0 -3477,Superior Soothing Wind,Enhances the blood flow and aids in knitting wounds closed. All fellowship member receive a 115% increase to their natural health recovery rate.,300,3600,93,70,Life Magic,0.15,37,16,5,0.25,0 -3478,Lesser Golden Wind,Enhances the intake of air and utilization of energy. All fellowship member receive a 55% increase to their natural stamina recovery rate.,150,1800,95,40,Life Magic,0.15,41,16,5,0.55,0 -3479,The Golden Wind,Enhances the intake of air and utilization of energy. All fellowship member receive a 70% increase to their natural stamina recovery rate.,200,1800,95,50,Life Magic,0.2,41,16,5,0.4,0 -3480,Greater Golden Wind,Enhances the intake of air and utilization of energy. All fellowship member receive a 85% increase to their natural stamina recovery rate.,250,2700,95,60,Life Magic,0.3,41,16,5,0.25,0 -3481,Superior Golden Wind,Enhances the intake of air and utilization of energy. All fellowship member receive a 115% increase to their natural stamina recovery rate.,300,3600,95,70,Life Magic,0.15,41,16,5,0.25,0 -3482,Izji Qo's Antechamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3483,Izji Qo's Defenders,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3484,Izji Qo's Defenders,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3485,Izji Qo's Defenders,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3486,Into the Receiving Chamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3487,Into the Receiving Chamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3488,Into the Receiving Chamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3489,Into the Receiving Chamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3490,Into the Receiving Chamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3491,Into the Receiving Chamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3492,Into the Receiving Chamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3493,Into the Receiving Chamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3494,Izji Qo's Crypt,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3495,Izji Qo's Test,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3496,Inzji Qo's Test,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3497,Izji Qo's Test,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3498,Disintegrated,Transports the target to the last Lifestone he or she used.,125,-1,215,50,Item Enchantment,0.25,0,16,0,0,1 -3499,Arcanum Salvaging Self I,Increases the caster's Salvaging skill by 10 points.,1,1800,435,15,Creature Enchantment,0.01,26,16,0,0,1 -3500,Arcanum Salvaging Self II,Increases the caster's Salvaging skill by 15 points.,50,1800,435,30,Creature Enchantment,0.05,26,16,0,0,1 -3501,Arcanum Salvaging Self III,Increases the caster's Salvaging skill by 20 points.,100,1800,435,40,Creature Enchantment,0.1,26,16,0,0,1 -3502,Arcanum Salvaging Self IV,Increases the caster's Salvaging skill by 25 points.,150,1800,435,50,Creature Enchantment,0.15,26,16,0,0,1 -3503,Arcanum Salvaging Self V,Increases the caster's Salvaging skill by 30 points.,200,1800,435,60,Creature Enchantment,0.2,26,16,0,0,1 -3504,Arcanum Salvaging Self VI,Increases the caster's Salvaging skill by 35 points.,250,2700,435,70,Creature Enchantment,0.3,26,16,0,0,1 -3505,Arcanum Salvaging VII,Increases the caster's Salvaging skill by 40 points.,300,3600,435,70,Creature Enchantment,0.15,26,16,0,0,1 -3506,Arcanum Enlightenment I,Increases the target's Salvaging skill by 10 points.,1,1800,435,10,Creature Enchantment,0.01,26,16,0,1,1 -3507,Arcanum Enlightenment II,Increases the target's Salvaging skill by 15 points.,50,1800,435,20,Creature Enchantment,0.05,26,16,5,0.85,1 -3508,Arcanum Enlightenment III,Increases the target's Salvaging skill by 20 points.,100,1800,435,30,Creature Enchantment,0.1,26,16,5,0.7,1 -3509,Arcanum Enlightenment IV,Increases the target's Salvaging skill by 25 points.,150,1800,435,40,Creature Enchantment,0.15,26,16,5,0.55,1 -3510,Arcanum Enlightenment V,Increases the target's Salvaging skill by 30 points.,200,1800,435,50,Creature Enchantment,0.2,26,16,5,0.4,1 -3511,Arcanum Enlightenment VI,Increases the target's Salvaging skill by 35 points.,250,2700,435,60,Creature Enchantment,0.3,26,16,5,0.25,1 -3512,Arcanum Enlightenment VII,Increases the target's Salvaging skill by 40 points.,300,3600,435,70,Creature Enchantment,0.15,26,16,5,0.25,1 -3513,Nuhmudira's Wisdom I,Increases the caster's Salvaging skill by 10 points.,1,1800,435,15,Creature Enchantment,0.01,26,16,0,0,1 -3514,Nuhmudira's Wisdom II,Increases the caster's Salvaging skill by 15 points.,50,1800,435,30,Creature Enchantment,0.05,26,16,0,0,1 -3515,Nuhmudira's Wisdom III,Increases the caster's Salvaging skill by 20 points.,100,1800,435,40,Creature Enchantment,0.1,26,16,0,0,1 -3516,Nuhmudira's Wisdom IV,Increases the caster's Salvaging skill by 25 points.,150,1800,435,50,Creature Enchantment,0.15,26,16,0,0,1 -3517,Nuhmudira's Wisdom V,Increases the caster's Salvaging skill by 30 points.,200,1800,435,60,Creature Enchantment,0.2,26,16,0,0,1 -3518,Nuhmudira's Wisdom VI,Increases the caster's Salvaging skill by 35 points.,250,2700,435,70,Creature Enchantment,0.3,26,16,0,0,1 -3519,Nuhmudira's Wisdom VII,Increases the caster's Salvaging skill by 40 points.,300,3600,435,70,Creature Enchantment,0.15,26,16,0,0,1 -3520,Nuhmudira's Enlightenment I,Increases the target's Salvaging skill by 10 points.,1,1800,435,10,Creature Enchantment,0.01,26,16,0,1,1 -3521,Nuhmudira's Enlightenment II,Increases the target's Salvaging skill by 15 points.,50,1800,435,20,Creature Enchantment,0.05,26,16,5,0.85,1 -3522,Nuhmudira's Enlightenment III,Increases the target's Salvaging skill by 20 points.,100,1800,435,30,Creature Enchantment,0.1,26,16,5,0.7,1 -3523,Nuhmudira's Enlightenment IV,Increases the target's Salvaging skill by 25 points.,150,1800,435,40,Creature Enchantment,0.15,26,16,5,0.55,1 -3524,Nuhmudira's Enlightenment V,Increases the target's Salvaging skill by 30 points.,200,1800,435,50,Creature Enchantment,0.2,26,16,5,0.4,1 -3525,Nuhmudira Enlightenment VI,Increases the target's Salvaging skill by 35 points.,250,2700,435,60,Creature Enchantment,0.3,26,16,5,0.25,1 -3526,Nuhmudira's Enlightenment,Increases the target's Salvaging skill by 40 points.,300,3600,435,70,Creature Enchantment,0.15,26,16,5,0.25,1 -3527,Intoxication I,Decreases the target's Coordination by 20 points.,130,300,8,50,Creature Enchantment,0.2,9,16,5,0.4,1 -3528,Intoxication II,Decreases the target's Coordination by 30 points.,230,300,8,50,Creature Enchantment,0.2,9,16,5,0.4,1 -3529,Intoxication III,Decreases the target's Coordination by 40 points.,330,300,8,50,Creature Enchantment,0.2,9,16,5,0.4,1 -3530,Ketnan's Eye,Increases the target's Focus by 50 points.,420,1800,9,50,Creature Enchantment,0.2,16,16,5,0.4,1 -3531,Bobo's Quickening,Increases the caster's Quickness by 50 points.,420,1800,5,70,Creature Enchantment,0.15,12,16,0,0,1 -3532,Bobo's Focused Blessing,Increases the target's Focus by 25 points.,140,300,9,50,Creature Enchantment,0.2,16,16,5,0.4,1 -3533,Brighteyes' Favor,Increases the caster's Coordination by 50 points.,420,1800,7,60,Creature Enchantment,0.2,8,16,0,0,1 -3534,Free Ride to the K'nath Lair,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3535,Free Ride to Sanamar,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3536,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3537,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3538,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3539,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3540,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3541,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3542,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3543,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3544,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3545,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3546,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3547,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3548,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3549,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3550,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3551,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3552,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3553,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3554,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3555,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3556,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3557,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3558,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3559,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3560,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3561,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3562,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3563,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3564,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3565,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3566,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3567,Fiun Flee,Increases the target's Run skill by 15 points. Additional spells can be layered over this.,15,780,515,10,Creature Enchantment,0.01,26,16,0,1,1 -3568,Fiun Efficiency,Increases the target's Mana Conversion skill by 10 points. Additional spells can be layered over this.,10,780,516,10,Creature Enchantment,0.01,26,16,0,1,1 -3569,Mana Boost,Raises mana by 10% for 30 minutes.,300,1800,412,10,Creature Enchantment,0.01,14,16,5,0.25,1 -3570,Stamina Boost,Raises Stamina by 10% for 30 minutes.,300,1800,411,10,Creature Enchantment,0.01,6,16,0,1,1 -3571,Health Boost,Raises health by 10% for 30 minutes.,300,1800,410,10,Creature Enchantment,0.01,6,16,5,0.25,1 -3572,Inner Brilliance,Raises target's Focus by 12 points. Additional spells can be layered over this.,12,600,269,10,Creature Enchantment,0.01,16,16,0,1,1 -3573,Inner Might,Raises target's Strength by 12 points. Additional spells can be layered over this.,12,600,261,10,Creature Enchantment,0.01,6,16,0,1,1 -3574,Inner Will,Raises target's Self by 12 points. Additional spells can be layered over this.,12,600,271,10,Creature Enchantment,0.01,14,16,0,1,1 -3575,Perfect Balance,Raises target's Coordination by 12 points. Additional spells can be layered over this.,12,600,267,10,Creature Enchantment,0.01,8,16,0,1,1 -3576,Perfect Health,Raises target's Endurance by 12 points. Additional spells can be layered over this.,12,600,263,10,Creature Enchantment,0.01,10,16,0,1,1 -3577,Perfect Speed,Raises target's Quickness by 12 points. Additional spells can be layered over this.,12,600,265,10,Creature Enchantment,0.01,12,16,0,1,1 -3578,Depths of Liazk Itzi's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3579,Underpassage of Liazk Itzi's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3580,Center of Liazk Itzi's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3581,Secrets of Liazk Itzi's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3582,Eaten!,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3583,Regurgitated,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3584,Qin Xikit's Receiving Chamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3585,Eaten!,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3586,Qin Xikit's Antechamber,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3587,Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3588,Secrets of Qin Xikit's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3589,Qin Xikit's Tomb,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3590,Regurgitated!,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3591,Access to Xi Ru's Font,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3592,Qin Xikit's Island,Summons a portal to Qin Xikit's Island.,351,900,203,110,Item Enchantment,1,0,65536,0,0,1 -3593,Eaten!,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3594,Underpassage of Hizk Ri's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3595,Underpassage of Hizk Ri's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3596,Center of Hizk Ri's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3597,Secrets of Hizk Ri's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3598,Regurgitated,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3599,Eaten!,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3600,Depths of Ixir Zi's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3601,Underpassage of Ixir Zi's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3602,Center of Ixir Zi's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3603,Secrets of Ixir Zi's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3604,Regurgitated,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3605,Portal to Cragstone,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3606,Eaten!,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3607,Depth's of Izji Qo's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3608,Underpassage of Izji Qo's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3609,Center of Izji Qo's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3610,Secrets of Izji Qo's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3611,Regurgitated,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3612,Eaten!,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3613,Regurgitated,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3614,Underpassage of Kivik Lir's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3615,Center of Kivik Lir's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3616,Secrets of Kivik Lir's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3617,Depths of Kivik Lir's Temple,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3618,Portal to Western Aphus Lassel,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3619,Portal to the Black Death Catacombs,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3620,Portal to Black Spawn Den,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3621,Portal to Black Spawn Den,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3622,Portal to Black Spawn Den,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3623,Portal to Center of the Obsidian Plains,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3624,Portal to Hills Citadel,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3625,Portal to the Kara Wetlands,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3626,Portal to the Marescent Plateau Base,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3627,Portal to Neydisa Castle,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3628,Portal to the Northern Landbridge,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3629,Portal to the Olthoi Horde Nest,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3630,Portal to the Olthoi North,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3631,Portal to the Renegade Fortress,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3632,Portal to Ridge Citadel,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3633,Portal to the Southern Landbridge,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3634,Portal To Valley of Death,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3635,Portal to Wilderness Citadel,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3636,Kern's Boon,Increases the target's Light Weapons skill by 2 points. Additional spells can be layered over this.,2,600,438,10,Creature Enchantment,0.01,18,16,0,1,1 -3637,Ranger's Boon,Increases the target's Missile Weapons skill by 2 points. Additional spells can be layered over this.,2,780,439,10,Creature Enchantment,0.01,18,16,0,1,1 -3638,Ranger's Boon,Increases the target's Missile Weapons skill by 2 points. Additional spells can be layered over this.,2,780,439,10,Creature Enchantment,0.01,18,16,0,1,1 -3639,Ranger's Boon,Increases the target's Missile Weapons skill by 2 points. Additional spells can be layered over this.,2,780,439,10,Creature Enchantment,0.01,18,16,0,1,1 -3640,Enchanter's Boon,Increases the target's Creature Enchantment skill by 2 points. Additional spells can be layered over this.,2,780,430,10,Creature Enchantment,0.01,26,16,0,1,1 -3641,Hieromancer's Boon,Increases the target's War Magic skill by 2 points. Additional spells can be layered over this.,2,780,426,10,Creature Enchantment,0.01,26,16,0,1,1 -3642,Fencer's Boon,Increases the target's Finesse Weapons skill by 2 points. Additional spells can be layered over this.,2,780,442,10,Creature Enchantment,0.01,18,16,0,1,1 -3643,Life Giver's Boon,Increases the target's Life Magic skill by 2 points. Additional spells can be layered over this.,2,780,429,10,Creature Enchantment,0.01,26,16,0,1,1 -3644,Kern's Boon,Increases the target's Light Weapons skill by 2 points. Additional spells can be layered over this.,2,600,438,10,Creature Enchantment,0.01,18,16,0,1,1 -3645,Kern's Boon,Increases the target's Light Weapons skill by 2 points. Additional spells can be layered over this.,2,600,438,10,Creature Enchantment,0.01,18,16,0,1,1 -3646,Kern's Boon,Increases the target's Light Weapons skill by 2 points. Additional spells can be layered over this.,2,600,438,10,Creature Enchantment,0.01,18,16,0,1,1 -3647,Kern's Boon,Increases the target's Light Weapons skill by 2 points. Additional spells can be layered over this.,2,600,438,10,Creature Enchantment,0.01,18,16,0,1,1 -3648,Soldier's Boon,Increases the target's Heavy Weapons skill by 2 points. Additional spells can be layered over this.,2,780,447,10,Creature Enchantment,0.01,18,16,0,1,1 -3649,Aerfalle's Embrace,Decreases the attributes of all fellowship members by 45 points for 120 seconds.,325,120,421,70,Creature Enchantment,0.15,38,16,5,0.25,1 -3650,Aerfalle's Enforcement,Lowers all fellowship members skills by 45 points for 120 seconds.,325,120,424,70,Creature Enchantment,0.15,52,16,5,0.25,1 -3651,Aerfalle's Gaze,Lowers target's skills by 45 points for 120 seconds.,325,120,424,70,Creature Enchantment,0.15,52,16,5,0.25,0 -3652,Aerfalle's Touch,Decreases all of the target's attributes by 45 points for 120 seconds.,325,120,421,300,Creature Enchantment,0.35,38,16,5,0.25,1 -3653,Acid Blast III,Shoots three streams of acid toward the target. Each stream does 11-21 points of acid damage to the first thing it hits.,125,-1,131,15,War Magic,0.01,0,16,30,0.7,1 -3654,Acid Volley I,Shoots three streams of acid toward the target. Each stream does 4-10 points of acid damage to the first thing it hits.,125,-1,207,5,War Magic,0.15,0,16,30,0.5,1 -3655,Acid Volley II,Shoots three streams of acid toward the target. Each stream does 8-16 points of acid damage to the first thing it hits.,175,-1,207,20,War Magic,0.2,0,16,30,0.4,1 -3656,Blade Blast III,Shoots three whirling blades outward from the caster. Each blade does 11-21 points of slashing damage to the first thing it hits.,125,-1,137,15,War Magic,0.15,0,16,30,0.5,1 -3657,Blade Blast IV,Shoots three whirling blades outward from the caster. Each blade does 11-21 points of slashing damage to the first thing it hits.,175,-1,137,20,War Magic,0.2,0,16,30,0.4,1 -3658,Blade Volley I,Shoots three whirling blades toward the target. Each blade does 4-10 points of Slashing damage to the first thing it hits.,125,-1,213,5,War Magic,0.15,0,16,30,0.5,1 -3659,Blade Volley II,Shoots three whirling blades toward the target. Each blade does 8-16 points of Slashing damage to the first thing it hits.,175,-1,213,10,War Magic,0.2,0,16,30,0.4,1 -3660,Bludgeoning Volley I,Shoots three shock waves toward the target. Each wave does 4-10 points of bludgeoning damage to the first thing it hits.,125,-1,208,15,War Magic,0.15,0,16,30,0.5,1 -3661,Bludgeoning Volley II,Shoots three shock waves toward the target. Each wave does 8-16 points of bludgeoning damage to the first thing it hits.,175,-1,208,20,War Magic,0.2,0,16,30,0.4,1 -3662,Flame Blast I,Shoots three streams of acid toward the target. Each stream does 11-21 points of acid damage to the first thing it hits.,75,-1,135,40,War Magic,0.2,0,16,15,0.33,1 -3663,Flame Volley III,Shoots three bolts of flame toward the target. Each bolt does 4-10 points of fire damage to the first thing it hits.,125,-1,211,15,War Magic,0.15,0,16,15,0.5,1 -3664,Flame Volley IV,Shoots three bolts of flame toward the target. Each bolt does 8-16 points of fire damage to the first thing it hits.,175,-1,211,20,War Magic,0.2,0,16,15,0.4,1 -3665,Force Blast III,Shoots three force bolts outward from the caster. Each bolt does 11-21 points of piercing damage to the first thing it hits.,125,-1,136,15,War Magic,0.15,0,16,30,0.5,1 -3666,Force Blast IV,Shoots three force bolts outward from the caster. Each bolt does 11-21 points of piercing damage to the first thing it hits.,175,-1,136,20,War Magic,0.3,0,16,30,0.4,1 -3667,Force Volley III,Shoots three bolts of force toward the target. Each bolt does 4-10 points of piercing damage to the first thing it hits.,125,-1,212,15,War Magic,0.15,0,16,30,0.5,1 -3668,Force Volley IV,Shoots three bolts of force toward the target. Each bolt does 8-16 points of piercing damage to the first thing it hits.,175,-1,212,20,War Magic,0.2,0,16,30,0.4,1 -3669,Frost Blast III,Shoots three bolts of frost outward from the caster. Each bolt does 11-21 points of cold damage to the first thing it hits.,125,-1,133,15,War Magic,0.15,0,0,30,0.5,1 -3670,Frost Blast IV,Shoots three bolts of frost outward from the caster. Each bolt does 11-21 points of cold damage to the first thing it hits.,175,-1,133,20,War Magic,0.2,0,0,30,0.4,1 -3671,Frost Volley III,Shoots three bolts of frost toward the target. Each bolt does 4-10 points of cold damage to the first thing it hits.,125,-1,209,15,War Magic,0.15,0,16,30,0.5,1 -3672,Frost Volley IV,Shoots three bolts of frost toward the target. Each bolt does 8-16 points of cold damage to the first thing it hits.,175,-1,209,20,War Magic,0.2,0,16,30,0.4,1 -3673,Lightning Blast III,Shoots three bolts of lightning outward from the caster. Each bolt does 11-21 points of electric damage to the first thing it hits.,125,-1,134,15,War Magic,0.15,0,16,30,0.5,1 -3674,Lightning Blast IV,Shoots three bolts of lightning outward from the caster. Each bolt does 11-21 points of electric damage to the first thing it hits.,175,-1,134,20,War Magic,0.2,0,16,30,0.4,1 -3675,Lightning Volley III,Shoots three bolts of lightning toward the target. Each bolt does 4-10 points of electric damage to the first thing it hits.,125,-1,210,15,War Magic,0.15,0,16,30,0.5,1 -3676,Lightning Volley IV,Shoots three bolts of lightning toward the target. Each bolt does 8-16 points of electric damage to the first thing it hits.,175,-1,210,20,War Magic,0.2,0,16,30,0.4,1 -3677,Shock Blast III,Shoots three shock waves outward from the caster. Each wave does 11-21 points of damage to the first thing it hits.,125,-1,132,15,War Magic,0.15,0,16,30,0.5,1 -3678,Shock Blast IV,Shoots three shock waves outward from the caster. Each wave does 11-21 points of damage to the first thing it hits.,175,-1,132,20,War Magic,0.2,0,16,30,0.4,1 -3679,Prodigal Acid Bane,Increases a shield or piece of armor's resistance to acid damage by 500%. Target yourself to cast this spell on all of your equipped armor.,600,900,449,70,Item Enchantment,0.15,63,6,25,0,1 -3680,Prodigal Acid Protection,Reduces damage the caster takes from acid by 99.9%.,600,900,448,70,Life Magic,0.15,49,16,0,0,0 -3681,Prodigal Alchemy Mastery,Increases the caster's Alchemy skill by 250 points.,600,900,450,70,Creature Enchantment,0.15,26,16,0,0,1 -3682,Prodigal Arcane Enlightenment,Increases the caster's Arcane Lore skill by 250 points.,600,900,456,70,Creature Enchantment,0.15,26,16,0,0,1 -3683,Prodigal Armor Expertise,Increases the caster's Armor Tinkering skill by 250 points.,600,900,452,70,Creature Enchantment,0.15,28,16,0,0,1 -3684,Prodigal Armor,Increases the caster's natural armor by 1000 points.,600,900,457,70,Life Magic,0.15,55,16,0,0,1 -3685,Prodigal Light Weapon Mastery,Increases the caster's Light Weapons skill by 250 points.,600,900,462,70,Creature Enchantment,0.15,18,16,0,0,1 -3686,Prodigal Blade Bane,Increases a shield or piece of armor's resistance to slashing damage by 500%. Target yourself to cast this spell on all of your equipped armor.,600,900,503,70,Item Enchantment,0.15,61,6,25,0,1 -3687,Prodigal Blade Protection,Reduces damage the caster takes from Slashing by 99.9%.,600,900,502,70,Life Magic,0.15,47,16,0,0,0 -3688,Prodigal Blood Drinker,Increases a weapon's damage value by 50 points.,600,900,473,70,Item Enchantment,0.15,57,257,25,0,1 -3689,Prodigal Bludgeon Bane,Increases a shield or piece of armor's resistance to bludgeoning damage by 500%. Target yourself to cast this spell on all of your equipped armor.,600,900,464,70,Item Enchantment,0.15,67,6,25,0,1 -3690,Prodigal Bludgeon Protection,Reduces damage the caster takes from Bludgeoning by 99.9%.,600,900,463,70,Life Magic,0.15,55,16,0,0,0 -3691,Prodigal Missile Weapon Mastery,Increases the caster's Missile Weapons skill by 250 points.,600,900,465,70,Creature Enchantment,0.15,18,16,0,0,1 -3692,Prodigal Cold Protection,Reduces damage the caster takes from Cold by 99.9%.,600,900,466,70,Life Magic,0.15,51,16,0,0,0 -3693,Prodigal Cooking Mastery,Increases the caster's Cooking skill by 250 points.,600,900,468,70,Creature Enchantment,0.15,20,16,0,0,1 -3694,Prodigal Coordination,Increases the caster's Coordination by 250 points.,600,900,469,70,Creature Enchantment,0.15,8,16,0,0,1 -3695,Prodigal Creature Enchantment Mastery,Increases the caster's Creature Enchantment skill by 250 points.,600,900,470,70,Creature Enchantment,0.15,26,16,0,0,1 -3696,Prodigal Missile Weapon Mastery,Increases the caster's Missile Weapons skill by 250 points.,600,900,465,70,Creature Enchantment,0.15,18,16,0,0,1 -3697,Prodigal Finesse Weapon Mastery,Increases the caster's Finesse Weapons skill by 250 points.,600,900,472,70,Creature Enchantment,0.15,18,16,0,0,1 -3698,Prodigal Deception Mastery,Increases the caster's Deception skill by 250 points.,600,900,474,70,Creature Enchantment,0.15,28,16,0,0,1 -3699,Prodigal Defender,Increases the Melee Defense skill modifier of a weapon or magic caster by 25%.,600,900,475,70,Item Enchantment,0.15,61,33025,25,0,1 -3700,Prodigal Endurance,Increases the caster's Endurance by 250 points.,600,900,478,70,Creature Enchantment,0.15,10,16,0,0,1 -3701,Prodigal Fealty,Increases the caster's Loyalty skill by 250 points.,600,900,490,70,Creature Enchantment,0.15,20,16,0,0,1 -3702,Prodigal Fire Protection,Reduces damage the caster takes from Fire by 99.9%.,600,900,479,70,Life Magic,0.15,43,16,0,0,0 -3703,Prodigal Flame Bane,Increases a shield or piece of armor's resistance to fire damage by 500%. Target yourself to cast this spell on all of your equipped armor.,600,900,480,70,Item Enchantment,0.15,57,6,25,0,1 -3704,Prodigal Fletching Mastery,Increases the caster's Fletching skill by 250 points.,600,900,481,70,Creature Enchantment,0.15,20,16,0,0,1 -3705,Prodigal Focus,Increases the caster's Focus by 250 points.,600,900,482,70,Creature Enchantment,0.15,16,16,0,0,1 -3706,Prodigal Frost Bane,Increases a shield or piece of armor's resistance to cold damage by 500%. Target yourself to cast this spell on all of your equipped armor.,600,900,467,70,Item Enchantment,0.15,65,6,25,0,1 -3707,Prodigal Healing Mastery,Increases the caster's Healing skill by 250 points.,600,900,483,70,Creature Enchantment,0.15,20,16,0,0,1 -3708,Prodigal Heart Seeker,Increases a weapon's Attack Skill modifier by 25%.,600,900,461,70,Item Enchantment,0.15,59,257,25,0,1 -3709,Prodigal Hermetic Link,Increases a magic casting implement's mana conversion bonus by 100%.,600,900,451,70,Item Enchantment,0.15,67,32768,25,0,1 -3710,Prodigal Impenetrability,Improves a shield or piece of armor's armor value by 1000 points. Target yourself to cast this spell on all of your equipped armor.,600,900,458,70,Item Enchantment,0.15,142,6,25,0,1 -3711,Prodigal Impregnability,Increases the caster's Missile Defense skill by 250 points.,600,900,496,70,Creature Enchantment,0.15,22,16,0,0,1 -3712,Prodigal Invulnerability,Increases the caster's Melee Defense skill by 250 points.,600,900,495,70,Creature Enchantment,0.15,22,16,0,0,1 -3713,Prodigal Item Enchantment Mastery,Increases the caster's Item Enchantment skill by 250 points.,600,900,485,70,Creature Enchantment,0.15,26,16,0,0,1 -3714,Prodigal Item Expertise,Increases the caster's Item Tinkering skill by 250 points.,600,900,453,70,Creature Enchantment,0.15,28,16,0,0,1 -3715,Prodigal Jumping Mastery,Increases the caster's Jump skill by 250 points.,600,900,486,70,Creature Enchantment,0.15,24,16,0,0,1 -3716,Prodigal Leadership Mastery,Increases the caster's Leadership skill by 250 points.,600,900,487,70,Creature Enchantment,0.15,20,16,0,0,1 -3717,Prodigal Life Magic Mastery,Increases the caster's Life Magic skill by 250 points.,600,900,488,70,Creature Enchantment,0.15,26,16,0,0,1 -3718,Prodigal Lightning Bane,Increases a shield or piece of armor's resistance to electric damage by 500%. Target yourself to cast this spell on all of your equipped armor.,600,900,477,70,Item Enchantment,0.15,67,6,25,0,1 -3719,Prodigal Lightning Protection,Reduces damage the caster takes from Lightning by 99.9%.,600,900,476,70,Life Magic,0.15,53,16,0,0,0 -3720,Prodigal Lockpick Mastery,Increases the caster's Lockpick skill by 250 points.,600,900,489,70,Creature Enchantment,0.15,20,16,0,0,1 -3721,Prodigal Light Weapon Mastery,Increases the caster's Light Weapons skill by 250 points.,600,900,462,70,Creature Enchantment,0.15,18,16,0,0,1 -3722,Prodigal Magic Item Expertise,Increases the caster's Magic Item Tinkering skill by 250 points.,600,900,454,70,Creature Enchantment,0.15,28,16,0,0,1 -3723,Prodigal Magic Resistance,Increases the caster's Magic Defense skill by 250 points.,600,900,492,70,Creature Enchantment,0.15,22,16,0,0,1 -3724,Prodigal Mana Conversion Mastery,Increases the caster's Mana Conversion skill by 250 points.,600,900,494,70,Creature Enchantment,0.15,26,16,0,0,1 -3725,Prodigal Mana Renewal,Increases the caster's natural mana rate by 1000%.,600,900,493,70,Life Magic,0.15,39,16,0,0,1 -3726,Prodigal Monster Attunement,Increases the caster's Assess Monster skill by 250 points.,600,900,459,70,Creature Enchantment,0.15,28,16,0,0,1 -3727,Prodigal Person Attunement,Increases the caster's Assess Person skill by 250 points.,600,900,460,70,Creature Enchantment,0.15,28,16,0,0,1 -3728,Prodigal Piercing Bane,Increases a shield or piece of armor's resistance to piercing damage by 500%. Target yourself to cast this spell on all of your equipped armor.,600,900,498,70,Item Enchantment,0.15,59,6,25,0,1 -3729,Prodigal Piercing Protection,Reduces damage the caster takes from Piercing by 99.9%.,600,900,497,70,Life Magic,0.15,45,16,5,0.25,0 -3730,Prodigal Quickness,Increases the caster's Quickness by 250 points.,600,900,499,70,Creature Enchantment,0.15,12,16,0,0,1 -3731,Prodigal Regeneration,Increase caster's natural healing rate by 1000%.,600,900,484,70,Life Magic,0.15,37,16,5,1,1 -3732,Prodigal Rejuvenation,Increases the rate at which the caster regains Stamina by 1000%.,600,900,506,70,Life Magic,0.15,41,16,0,0,1 -3733,Prodigal Willpower,Increases the caster's Self by 250 points.,600,900,501,70,Creature Enchantment,0.15,14,16,0,0,1 -3734,Prodigal Light Weapon Mastery,Increases the caster's Light Weapons skill by 250 points.,600,900,462,70,Creature Enchantment,0.15,18,16,0,0,1 -3735,Prodigal Spirit Drinker,Increases a caster's damage mod by 15%.,600,900,473,70,Item Enchantment,0.15,57,32768,25,0,1 -3736,Prodigal Sprint,Increases the caster's Run skill by 250 points.,600,900,500,70,Creature Enchantment,0.15,24,16,0,0,1 -3737,Prodigal Light Weapon Mastery,Increases the caster's Light Weapons skill by 250 points.,600,900,462,70,Creature Enchantment,0.15,18,16,0,0,1 -3738,Prodigal Strength,Increases the caster's Strength by 250 points.,600,900,507,70,Creature Enchantment,0.15,6,16,0,0,1 -3739,Prodigal Swift Killer,Improves a weapon's speed by 1000 points.,600,900,512,70,Item Enchantment,0.15,63,257,25,0,1 -3740,Prodigal Heavy Weapon Mastery,Increases the caster's Heavy Weapons skill by 250 points.,600,900,508,70,Creature Enchantment,0.15,18,16,0,0,1 -3741,Prodigal Missile Weapon Mastery,Increases the caster's Missile Weapons skill by 250 points.,600,900,465,70,Creature Enchantment,0.15,18,16,0,0,1 -3742,Prodigal Light Weapon Mastery,Increases the caster's Light Weapons skill by 250 points.,600,900,462,70,Creature Enchantment,0.15,18,16,0,0,1 -3743,Prodigal War Magic Mastery,Increases the caster's War Magic skill by 250 points.,600,900,511,70,Creature Enchantment,0.15,26,16,0,0,1 -3744,Prodigal Weapon Expertise,Increases the caster's Weapon Tinkering skill by 250 points.,600,900,455,70,Creature Enchantment,0.15,28,16,0,0,1 -3745,Inferior Inferno Aegis,Reduces damage the target takes from Fire by 52%.,245,3600,109,40,Life Magic,0.15,43,16,5,0.55,0 -3746,Inferno Aegis,Reduces damage the target takes from Fire by 62%.,295,3600,109,40,Life Magic,0.15,43,16,5,0.55,0 -3747,Lesser Inferno Aegis,Reduces damage the target takes from Fire by 45%.,195,3600,109,40,Life Magic,0.15,43,16,5,0.55,0 -3748,Master Salvager's Greater Boon,Increases the caster's Salvaging skill by 45 points.,325,360,435,70,Creature Enchantment,0.15,26,16,0,0,1 -3749,Master Alchemist's Boon,Increases the caster's Alchemy skill by 45 points.,325,180,221,50,Creature Enchantment,0.15,26,16,0,0,1 -3750,Master Alchemist's Greater Boon,Increases the caster's Alchemy skill by 45 points.,325,360,221,50,Creature Enchantment,0.15,26,16,0,0,1 -3751,Master Chef's Boon,Increases the target's Cooking skill by 45 points.,325,180,216,70,Creature Enchantment,0.15,20,16,5,0.25,1 -3752,Master Chef's Greater Boon,Increases the target's Cooking skill by 45 points.,325,360,216,70,Creature Enchantment,0.15,20,16,5,0.25,1 -3753,Fletching Master's Boon,Increases the target's Fletching skill by 45 points.,325,180,218,50,Creature Enchantment,0.2,20,16,5,0.4,1 -3754,Fletching Master's Greater Boon,Increases the target's Fletching skill by 45 points.,325,360,218,50,Creature Enchantment,0.2,20,16,5,0.4,1 -3755,Master Lockpicker's Boon,Increases the target's Lockpick skill by 45 points.,325,180,73,70,Creature Enchantment,0.15,20,16,5,0.25,1 -3756,Master Lockpicker's Greater Boon,Increases the target's Lockpick skill by 45 points.,325,360,73,70,Creature Enchantment,0.15,20,16,5,0.25,1 -3757,Master Salvager's Boon,Increases the caster's Salvaging skill by 45 points.,325,180,435,70,Creature Enchantment,0.15,26,16,0,0,1 -3758,Inky Armor,Your skin is coated with a fine layer of Niffis ink. Your natural armor is increased by 5 points. Additional spells can be layered over this.,1,3600,513,10,Life Magic,0.01,55,16,0,1,1 -3759,Mana Giver,Increases maximum mana by 15 points.,15,510,283,70,Life Magic,0.3,33,16,0,0,1 -3760,Culinary Ecstasy,All secondary attributes are increased by 10% for the duration of the spell.,300,1800,410,10,Creature Enchantment,0.01,8,16,5,0.25,1 -3761,Fiun Resistance,Increases the target's Magic Defense skill by 5 points. Additional spells can be layered over this.,5,780,514,10,Creature Enchantment,0.01,22,16,0,1,1 -3762,Defiled Temple Portal Sending,Transports the target to the Defiled Temple,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3763,Balloon Ride,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3764,Summons a portal to the Banderling Shrine,Summons a portal that goes to the destination of the caster's linked portal. set with Primary Portal Tie.,200,60,203,70,Item Enchantment,0.5,0,65536,0,0,1 -3765,Entry to the Mausoleum of Bitterness,Transports the target to an entrance of the Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3766,Entry to the Mausoleum of Bitterness,Transports the target to an entrance of the Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3767,Entry to the Mausoleum of Bitterness,Transports the target to an entrance of the Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3768,Bitter Punishment,Transports the target to far above Ayn Tayan.,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3769,Entry to the Mausoleum of Anger,Transports the target to an entrance of the Mausoleum of Anger,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3770,Entry to the Mausoleum of Anger,Transports the target to an entrance of the Mausoleum of Anger,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3771,Entry to the Mausoleum of Anger,Transports the target to an entrance of the Mausoleum of Anger,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3772,Entry to the Mausoleum of Anger,Transports the target to an entrance of the Mausoleum of Anger,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3773,Entry to the Mausoleum of Anger,Transports the target to an entrance of the Mausoleum of Anger,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3774,Entry to the Mausoleum of Anger,Transports the target to an entrance of the Mausoleum of Anger,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3775,Angry Punishment,Transports the target to high above the northern mountains,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3776,Entry to the Mausoleum of Cruelty,Transports the target to an entrance of the Mausoleum of Cruelty,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3777,Entry to the Mausoleum of Cruelty,Transports the target to an entrance of the Mausoleum of Cruelty,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3778,Entry to the Mausoleum of Cruelty,Transports the target to an entrance of the Mausoleum of Cruelty,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3779,Entry to the Mausoleum of Cruelty,Transports the target to an entrance of the Mausoleum of Cruelty,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3780,Entry to the Mausoleum of Cruelty,Transports the target to an entrance of the Mausoleum of Cruelty,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3781,Entry to the Mausoleum of Cruelty,Transports the target to an entrance of the Mausoleum of Cruelty,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3782,Cruel Punishment,Transports the target to high above a Shadow Spire crater,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3783,Entry to the Accursed Mausoleum of Bitterness,Transports the target to an entrance of the Accursed Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3784,Entry to the Accursed Mausoleum of Bitterness,Transports the target to an entrance of the Accursed Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3785,Entry to the Accursed Mausoleum of Bitterness,Transports the target to an entrance of the Accursed Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3786,Entry to the Accursed Mausoleum of Bitterness,Transports the target to an entrance of the Accursed Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3787,Entry to the Accursed Mausoleum of Bitterness,Transports the target to an entrance of the Accursed Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3788,Entry to the Accursed Mausoleum of Bitterness,Transports the target to an entrance of the Accursed Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3789,Slaughter Punishment,Transports the target to high above a Spire crater in the Obsidian Plains,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3790,Entry to the Unholy Mausoleum of Bitterness,Transports the target to an entrance of the Unholy Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3791,Entry to the Unholy Mausoleum of Bitterness,Transports the target to an entrance of the Unholy Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3792,Entry to the Unholy Mausoleum of Bitterness,Transports the target to an entrance of the Unholy Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3793,Entry to the Unholy Mausoleum of Bitterness,Transports the target to an entrance of the Unholy Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3794,Entry to the Unholy Mausoleum of Bitterness,Transports the target to an entrance of the Unholy Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3795,Entry to the Unholy Mausoleum of Bitterness,Transports the target to an entrance of the Unholy Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3796,Entry to the Mausoleum of Bitterness,Transports the target to an entrance of the Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3797,Entry to the Mausoleum of Bitterness,Transports the target to an entrance of the Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3798,Entry to the Mausoleum of Bitterness,Transports the target to an entrance of the Mausoleum of Bitterness,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3799,Black Marrow Bliss,The warm flavor of the Black Marrow Tea soothes your soul.,275,-1,84,60,Life Magic,0.3,34,16,10,0.05,1 -3800,Burning Spirit,Increases all attributes by 2 for 10 minutes. This effect layers on top of normal spells as well as cantrips.,2,600,517,10,Creature Enchantment,0.01,8,16,0,1,1 -3801,Shadow Touch,Increases the target's Melee Defense skill by 3 points.,3,780,518,10,Creature Enchantment,0.01,22,16,0,1,1 -3802,Shadow Reek,Increases the target's War Magic skill by 3 points. Additional spells can be layered over this.,3,780,426,10,Creature Enchantment,0.01,26,16,0,1,1 -3803,Shadow Shot,Increases the target's Missile Weapons skill by 3 points. Additional spells can be layered over this.,3,780,439,10,Creature Enchantment,0.01,18,16,0,1,1 -3804,Shadow Shot,Increases the target's Missile Weapons skill by 3 points. Additional spells can be layered over this.,3,780,439,10,Creature Enchantment,0.01,18,16,0,1,1 -3805,Acid Ring,Shoots nine waves of acid outward from the caster. Each wave does 30-60 points of acid damage to the first thing it hits.,200,-1,222,80,War Magic,0.2,0,0,4.5,0,1 -3806,Flame Ring,Shoots nine waves of flame outward from the caster. Each wave does 30-60 points of fire damage to the first thing it hits.,200,-1,226,80,War Magic,0.2,0,0,4.5,0,1 -3807,Force Ring,Shoots nine waves of force outward from the caster. Each wave does 30-60 points of piercing damage to the first thing it hits.,200,-1,227,80,War Magic,0.2,0,0,4.5,0,1 -3808,Lightning Ring,Shoots nine waves of lightning outward from the caster. Each wave does 30-60 points of electric damage to the first thing it hits.,200,-1,225,80,War Magic,0.2,0,0,4.5,0,1 -3809,Minor Salvaging Aptitude,Increases the target's Salvaging skill by 5 points.,5,3600,437,10,Creature Enchantment,0.01,26,16,0,1,1 -3810,Asheron?s Benediction,Raises health by 10% for 24 hours. Additional spells can be layered over this.,100,86400,520,1,Creature Enchantment,0.01,6,16,5,0.25,1 -3811,Blackmoor?s Favor,Increases Natural Armor by 50 points for 24 hours. Additional spells can be layered over this.,100,86400,519,1,Life Magic,0.01,55,16,5,1,1 -3812,Tursh's Lair,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3813,Free Ride to Shoushi,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3814,Free Ride to Yaraq,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3815,Free Ride to Holtburg,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3816,Marksman's Ken,The keen sight of the Hunters of the Raven Hand strengths your aim. increasing your Missile Weapons skill by 10 points. Additional spells can be layered over this.,10,2400,331,10,Creature Enchantment,0.01,18,16,0,1,1 -3817,Hunter's Ward,Shadowy tendrils weave about you. forming a magical encasement increasing your natural armor by 30 points. Additional spells can be layered over this.,30,2400,379,10,Life Magic,0.01,55,16,0,1,1 -3818,Curse of Raven Fury,Drains half of the caster?s health and projects a ring of vicious energy outwards. When struck. the target?s health is reduced by 200% of the amount drained from the caster.,300,-1,80,150,Life Magic,0.15,0,0,4.5,0,1 -3819,Conscript's Might,The might of the Conscripts of the Raven Hand flows through you. bolstering your strength by 10 points. Additional spells can be layered over this.,10,2400,261,10,Creature Enchantment,0.01,6,16,0,1,1 -3820,Conscript's Ward,Shadowy tendrils weave about you. forming a magical encasement increasing your natural armor by 30 points. Additional spells can be layered over this.,30,2400,379,10,Life Magic,0.01,55,16,0,1,1 -3821,Augur's Will,The will of the Augurs of the Raven Hand flows through you. increasing your Self by 10 points. Additional spells can be layered over this.,10,2400,271,10,Creature Enchantment,0.01,14,16,0,1,1 -3822,Augur's Glare,You are filled with the intense dedication of the Augurs of the Raven Hand. increasing your Focus by 10 points. Additional spells can be layered over this.,10,2400,269,10,Creature Enchantment,0.01,14,16,0,1,1 -3823,Augur's Ward,Shadowy tendrils weave about you. forming a magical encasement increasing your natural armor by 30 points. Additional spells can be layered over this.,30,2400,379,10,Life Magic,0.01,55,16,0,1,1 -3824,Marksman's Ken,The keen sight of the Hunters of the Raven Hand strengths your aim. increasing your Missile Weapons skill by 10 points. Additional spells can be layered over this.,10,2400,331,10,Creature Enchantment,0.01,18,16,0,1,1 -3825,Marksman's Ken,The keen sight of the Hunters of the Raven Hand strengths your aim. increasing your Missile Weapons skill by 10 points. Additional spells can be layered over this.,10,2400,331,10,Creature Enchantment,0.01,18,16,0,1,1 -3826,a powerful force,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3827,Lunnum's Embrace,Improves a shield or piece of armor's armor value by 500 points.,500,3600,160,70,Item Enchantment,0.15,142,6,25,0,1 -3828,Rage of Grael,Infuses a weapon with the rage of the ancient barbarian gladiator. Grael. Increases a weapon's damage value by 3 points. Additional spells can be layered over this.,3,10800,323,10,Item Enchantment,0,57,257,25,0,1 -3829,Blessing of the Sundew,Increases the rate at which the target regains Mana by 25%. Additional spells can be layered over this.,25,10800,259,10,Life Magic,0,39,16,5,1,1 -3830,Blessing of the Fly Trap,Increases the rate at which the target regains Health by 25%. Additional spells can be layered over this.,25,10800,257,10,Life Magic,0,37,16,5,1,1 -3831,Blessing of the Pitcher Plant,Increases the rate at which the target regains Stamina by 25%. Additional spells can be layered over this.,25,10800,407,10,Life Magic,0,41,16,5,1,1 -3832,Master's Voice,The sibilant voice of Adhorix helps improve your concentration. Your Focus is raised by 10. This effect stacks with other Focus-raising spells.,10,1800,269,10,Creature Enchantment,0.01,16,16,0,1,1 -3833,Minor Salvaging Aptitude,Increases the target's Salvaging skill by 5 points. Additional spells can be layered over this.,5,780,437,10,Creature Enchantment,0.01,26,16,0,1,1 -3834,Major Salvaging Aptitude,Increases the target's Salvaging skill by 15 points. Additional spells can be layered over this.,10,780,437,10,Creature Enchantment,0.01,26,16,0,1,1 -3835,Leviathan's Curse,Drains 150-400 points of the target's Health.,400,-1,80,70,Life Magic,0.15,32,16,35,0,1 -3836,Breath of the Deep,Shoots a bolt of cold at the target. The bolt does 200-350 points of cold damage to the first thing it hits.,400,-1,119,35,War Magic,0.15,0,16,30,0.2,1 -3837,Water Island Access,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3838,Abandoned Mines Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3839,Brilliant Access,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3840,Dazzling Access,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3841,Devastated Access,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3842,Northeast Coast Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3843,Fire Island Access,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3844,Gatekeeper Access,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3845,Radiant Access,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3846,Ruined Access,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3847,Cataracts of Xik Minru,Sends target to the Cataracts of Xik Minru,500,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3848,Combat Medication,The energies imbued upon the ring weave a healing aura around you. increasing your natural healing rate by 130%.,320,60,93,70,Life Magic,0.15,37,16,5,0.25,0 -3849,Night Runner,The energies imbued upon this ring surge through you. increasing your run skill by 40. Additional effects can be layered on top of this.,350,60,369,70,Creature Enchantment,0.01,24,16,5,0.25,1 -3850,Selflessness,Your selflessness aids your fellows. but at a cost. Your health is reduced by 10.,400,60,280,70,Life Magic,0.3,32,16,0,0,1 -3851,Corrupted Essence,Dark forces channel through your essence. improving your focus. Your Focus is raised by 15. Additional spells can be layered over this.,15,600,269,10,Creature Enchantment,0.01,16,16,0,1,1 -3852,Ravenous Armor,You feel your life force being sapped slowly by your armor. Your Maximum Health is reduced by 10.,10,600,280,70,Life Magic,0.3,32,16,0,0,1 -3853,Ardent Defense,You are gifted with an improved defense against melee attacks. Your Melee Defense is raised by 12. Additional spells can be layered over this.,12,600,351,10,Creature Enchantment,0.01,22,16,0,1,1 -3854,True Loyalty,Your loyalty knows no bounds while you wear this armor. Your Loyalty is raised by 12. Additional spells can be layered over this.,12,600,345,10,Creature Enchantment,0.01,20,16,0,1,1 -3855,Flight of Bats,Increases the target's Healing skill by 40 points.,100,780,67,30,Creature Enchantment,0.1,20,16,5,0.7,1 -3856,Ulgrim's Recall,A really really good spell.,150,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -3857,Pumpkin Rain,Rains eight of pumpkins down. smooshing any that oppose.,320,-1,237,120,War Magic,0.25,0,16,30,0.5,1 -3858,Pumpkin Ring,Shoots eight waves of flame outward from the caster. Each wave does 40-80 points of fire damage to the first thing it hits.,200,-1,226,80,War Magic,0.2,0,0,4.5,0,1 -3859,Pumpkin Wall,Sends a wall of five balls of fire. two high. slowly towards the target. Each ball does 30-60 points of fire damage to the first thing it hits. The wall is created 2 meters in front of the caster. ,200,-1,233,80,War Magic,0.2,0,0,30,0.2,1 -3860,Sweet Speed,Increases the target's Run by 100 points.,500,60,369,50,Creature Enchantment,0.15,24,16,5,0.25,0 -3861,Taste for Blood,The feral instincts of the Mukkir give you a keener eye towards improving your weapons. Increases the target's Weapon Tinkering skill by 8 points. Additional spells can be layered over this.,8,600,377,50,Creature Enchantment,0.01,28,16,0,1,1 -3862,Duke Raoul's Pride,Increases the caster's Self by 50 points.,420,1800,11,70,Creature Enchantment,0.15,14,16,0,0,1 -3863,Hunter's Hardiness,Increases the caster's Endurance by 50 points.,420,1800,3,70,Creature Enchantment,0.15,10,16,0,0,1 -3864,Zongo's Fist,Increases the caster's Strength by 50 points.,420,1800,1,70,Creature Enchantment,0.15,6,16,0,0,1 -3865,Glenden Wood Recall,Sends the caster to Glenden Wood.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -3866,Glacial Speed,Decreases the target's Run skill by 200 points.,400,30,78,50,Creature Enchantment,0.15,142,16,5,0.25,1 -3867,Embrace of the Chill Shadow,Reduces damage the target takes from Cold by 12%. Additional spells can be layered over this.,12,10800,289,10,Life Magic,0.01,51,16,0,1,1 -3868,Dardante's Keep Portal Sending,This spell sends the user to Dardante's Keep.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3869,Invocation of the Black Book,The dark energies of the Black Book of Salt and Ash have made your weapon strike more accurately. The Invocation has raised your weapon's Attack Modifier by 10%. Additional spells can be layered over this.,250,1800,521,10,Item Enchantment,0,59,257,25,0,1 -3870,Syphon Creature Essence,This spell attempts to rip all positive Creature Magic from a single target.,400,-1,250,300,Creature Enchantment,0.35,147,16,10,0.25,1 -3871,Syphon Item Essence,Dispels all positive Item Enchantments of level 7 or lower from the players wielded weapon or caster.,400,-1,250,300,Creature Enchantment,0.35,58,33025,10,0.25,1 -3872,Syphon Life Essence,This spell attempts to rip all positive Life Magic from a single target.,400,-1,250,300,Creature Enchantment,0.35,147,16,10,0.25,1 -3873,Essence's Command,Dispels 1-3 positive Life Magic enchantments of level 7 or lower from each person in the fellowship.,400,-1,250,300,Life Magic,0.05,146,16,10,0,1 -3874,Death's Aura,Drains 40-75 points of health from each member of the fellowship.,400,-1,68,10,Life Magic,0,32,16,10,1,1 -3875,Acidic Curse,Increases damage all fellowship members take from acid by 185%.,400,240,102,70,Life Magic,0.15,50,16,10,0.25,0 -3876,Curse of the Blades,Increases damage all fellowship members take from Slashing by 185%.,400,240,114,70,Life Magic,0.15,46,16,10,0.25,0 -3877,Corrosive Strike,Shoots a stream of acid at the target. The stream does 150-300 points of acid damage to the target.,400,-1,117,35,War Magic,0.15,0,16,30,0.2,1 -3878,Incendiary Strike,Shoots a bolt of flame at the target. The bolt does 150-300 points of fire damage to the target.,400,-1,121,35,War Magic,0.15,0,16,30,0.2,1 -3879,Glacial Strike,Shoots a bolt of frost at the target. The bolt does 150-300 points of cold damage to the target.,400,-1,119,35,War Magic,0.15,0,16,30,0.2,1 -3880,Galvanic Strike,Shoots a bolt of lighting at the target. The bolt does 150-300 points of electrical damage to the target.,400,-1,120,35,War Magic,0.15,0,16,30,0.2,1 -3881,Corrosive Ring,Shoots eight waves of acid outward from the caster. Each wave does 100-200 points of acid damage to the first thing it hits.,400,-1,222,80,War Magic,0.2,0,0,8,0,1 -3882,Incendiary Ring,Shoots eight waves of flame outward from the caster. Each wave does 100-200 points of fire damage to the first thing it hits.,400,-1,226,80,War Magic,0.2,0,0,8,0,1 -3883,Pyroclastic Explosion,Shoots sixteen waves of flame outward from the caster. Each wave does 75-150 points of fire damage to the first thing it hits.,400,-1,226,80,War Magic,0.2,0,0,8,0,1 -3884,Glacial Ring,Shoots eight waves of frost outward from the caster. Each wave does 100-200 points of cold damage to the first thing it hits.,400,-1,224,80,War Magic,0.2,0,0,8,0,1 -3885,Galvanic Ring,Shoots eight waves of lightning outward from the caster. Each wave does 100-200 points of electric damage to the first thing it hits.,400,-1,225,80,War Magic,0.2,0,0,8,0,1 -3886,Magic Disarmament,Decreases the target's Magic Defense skill by 200 points.,400,60,42,70,Creature Enchantment,0.15,23,16,10,0.25,1 -3887,Entering the Hatch,Entering the Hatch,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3888,Passage to the Rare Chambers,Passage to the Rare Chambers,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3889,Inner Burial Chamber Portal Sending,Portals the user to the Inner Burial Chamber in the Ruschk Burial Mound dungeon.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3890,Will of the People,The words of Arwyth Margyle have boosted your Self by 10 points. This spell stacks with normal spells. but will be overridden by Major Willpower.,10,1800,271,10,Creature Enchantment,0.01,14,16,0,1,1 -3891,Honor of the Bull,Your deidcation to the Viamontian cause has bolstered your loyalty by 10 points. This spell stacks with normal spells. but will be overridden by Major Loyalty.,10,1800,345,10,Creature Enchantment,0.01,20,16,0,1,1 -3892,Summon Flame Seekers,Summons three Homing Flame Bolts.,300,-1,226,80,War Magic,0.2,0,0,4.5,0,1 -3893,Summon Burning Haze,Creates a cloud of burning gases.,300,-1,226,35,War Magic,0.15,0,0,0,0,1 -3894,Dark Persistence,A dark power suffuses your being. increasing your Endurance by 3.,3,10800,416,10,Creature Enchantment,0.01,10,16,0,1,1 -3895,Dark Reflexes,A dark power suffuses your being. increasing your Quickness by 3.,3,10800,522,10,Creature Enchantment,0.01,12,16,0,1,1 -3896,Dark Equilibrium,A dark power suffuses your being. increasing your Coordination by 3.,3,10800,413,10,Creature Enchantment,0.01,8,16,0,1,1 -3897,Dark Purpose,A dark power suffuses your being. increasing your Self by 3.,3,10800,417,10,Creature Enchantment,0.01,14,16,0,1,1 -3898,Pooky's Recall 1,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3899,Pooky's Recall 2,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3900,Pooky's Recall 3,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3901,Egg Bomb,Shoots an explosive egg at the target. The egg does 100-200 points of fire damage to the first thing it hits.,300,-1,121,35,War Magic,0.15,0,16,30,0.2,1 -3902,Ring around the Rabbit,Shoots eight rabbits outward from the caster. Each rabbit does 40-80 points of slashing damage to the first thing it hits.,200,-1,228,80,War Magic,0.2,0,0,4.5,0,1 -3903,Whirlwind,Eight whirlwinds move outward from the caster. Each whirlwind does 60-120 points of bludgeoning damage to the first thing it hits.,200,-1,223,80,War Magic,0.2,0,0,4.5,0,1 -3904,Essence's Fury,Corrodes the target for 200 points of acid damage.,300,-1,237,200,War Magic,0,0,16,30,0.2,1 -3905,Essence's Fury,Burns the target for 200 points of fire damage.,300,-1,237,200,War Magic,0,0,16,30,0.2,1 -3906,Essence's Fury,Freezes the target for 200 points of cold damage.,300,-1,237,200,War Magic,0,0,16,30,0.2,1 -3907,Essence's Fury,Shocks the target for 200 points of electric damage.,300,-1,237,200,War Magic,0,0,16,30,0.2,1 -3908,Mana Blast,Fires three bolts of energy. When struck by a bolt. the target's mana is reduced by 500.,300,-1,84,70,Life Magic,0.15,0,16,30,0.2,1 -3909,Mana Syphon,Decreases target's natural mana rate by 100%.,400,120,98,70,Life Magic,0.15,40,16,5,0.25,0 -3910,Brain Freeze,The Essence strikes out with an icicle impaling your head. reducing all your skills by 50%.,500,15,424,10,Creature Enchantment,0.01,27,16,0,1,1 -3911,Spiral of Souls,A spiral of energy sucks the life force out of all those around the caster for 40-75 points of damage.,400,-1,80,150,Life Magic,0.15,0,0,4.5,0,1 -3912,Lower Black Spear Temple Portal Sending,Transports the player to the lower levels of the Black Spear Temple.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3913,Aegis of the Golden Flame,Increases the caster's natural armor by 235 points.,310,3600,115,70,Life Magic,0.15,55,16,0,0,1 -3914,Dark Vortex,A spinning vortex of shadow.,400,-1,223,80,War Magic,0.2,0,0,4.5,0,1 -3915,Black Madness,A madness enters your mind. The gaping horror of the abyss fills you with dread. reducing all your skills by 30%.,350,60,424,10,Creature Enchantment,0.01,160,16,0,1,1 -3916,Flayed Flesh,Decreases the target's natural armor by 500 points.,500,10,116,70,Life Magic,0.15,56,16,5,0.25,1 -3917,Numbing Chill,Increases damage all fellowship members take from cold by 185%.,400,240,106,70,Life Magic,0.15,52,16,10,0.25,0 -3918,Flammable,Increases damage all fellowship members take from fire by 185%.,400,240,110,70,Life Magic,0.15,44,16,10,0.25,0 -3919,Lightning Rod,Increases damage all fellowship members take from lightning by 185%.,400,240,108,70,Life Magic,0.15,54,16,10,0.25,0 -3920,Tunnels to the Harbinger,Tunnels to the Harbinger,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3921,Harbinger's Lair,Harbinger's Lair,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3922,Tunnels to the Harbinger,Tunnels to the Harbinger,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3923,Tunnels to the Harbinger,Tunnels to the Harbinger,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3924,Tunnels to the Harbinger,Tunnels to the Harbinger,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3925,Harbinger's Lair,Harbinger's Lair,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3926,Harbinger's Fiery Touch,Shoots a bolt of elemental energy at the target. The bolt does 130-220 points of fire damage to the first thing it hits.,300,-1,121,50,War Magic,0.15,0,16,30,0.2,1 -3927,Charge Flesh,Target's flesh is left open and vulnerable to electric attacks. Increases damage the target takes from lightning by 200%.,350,60,108,10,Life Magic,0.15,54,16,5,0.25,1 -3928,Disarmament,Decreases the target's Melee Defense skill by 200 points.,400,60,38,70,Creature Enchantment,0.15,23,16,5,0.25,1 -3929,Rossu Morta Chapterhouse Recall,This spell teleports the caster to the Chapterhouse of the Rossu Morta.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -3930,Whispering Blade Chapterhouse Recall,This spell teleports the caster to the Chapterhouse of the Whispering Blade.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -3931,Dark Vortex,A spinning vortex of shadow.,400,-1,223,80,War Magic,0.2,0,0,10,0,1 -3932,Grael's Rage,Drains 200-400 points of the target's Health.,400,-1,80,10,Life Magic,0.01,150,16,90,0.1,1 -3933,Black Spear Strike,Impales the target for 250-300 points of piercing damage.,400,-1,241,200,War Magic,0,0,16,30,0.2,1 -3934,Heavy Acid Ring,Shoots 12 waves of acid outward from the caster. Each wave does 250-400 points of acid damage to the first thing it hits.,400,-1,222,80,War Magic,0.2,0,0,15,0,1 -3935,Heavy Blade Ring,Shoots 12 waves of blades outward from the caster. Each wave does 250-400 points of slashing damage to the first thing it hits.,400,-1,228,80,War Magic,0.2,0,0,15,0,1 -3936,Fire Bomb,Shoots 12 waves of flame outward from the caster. Each wave does 250-400 points of fire damage to the first thing it hits.,400,-1,226,80,War Magic,0.2,0,0,15,0,1 -3937,Heavy Force Ring,Shoots 12 waves of force outward from the caster. Each wave does 250-400 points of piercing damage to the first thing it hits.,400,-1,227,80,War Magic,0.2,0,0,15,0,1 -3938,Heavy Frost Ring,Shoots 12 waves of frost outward from the caster. Each wave does 250-400 points of cold damage to the first thing it hits.,400,-1,224,80,War Magic,0.2,0,0,15,0,1 -3939,Thaumic Bleed,Shoots 12 waves of lightning around the caster. Each wave does 250-300 points of electric damage to the first thing it hits.,400,-1,225,80,War Magic,0.2,0,0,10,0,1 -3940,Exsanguinating Wave,A wave of life draining energy.,400,-1,80,150,Life Magic,0.15,32,0,4.5,0,1 -3941,Heavy Lightning Ring,Shoots 12 waves of lightning outward from the caster. Each wave does 250-400 points of electric damage to the first thing it hits.,400,-1,225,80,War Magic,0.2,0,0,15,0,1 -3942,Heavy Shock Ring,Shoots 12 waves of shock outward from the caster. Each wave does 250-400 points of bludgeoning damage to the first thing it hits.,400,-1,223,80,War Magic,0.2,0,0,15,0,1 -3943,Burning Earth,A burning section of ground that deals 100-400 points of damage to whatever touches it.,400,-1,233,80,War Magic,0.2,0,0,3,0.2,1 -3944,Rain of Spears,Black Spears streak from the sky dealing 300 points of damage to whatever they hit.,400,-1,241,120,War Magic,0,0,16,30,0.5,1 -3945,Raging Storm,Rains LOTS of red lightning down.,400,-1,239,120,War Magic,0.25,0,16,30,0.5,1 -3946,Acid Wave,Shoots eight waves of acid forward from the caster. Each wave does 80-150 points of acid damage to the first thing it hits.,400,-1,222,80,War Magic,0.01,0,16,15,0,1 -3947,Blade Wave,Shoots eight slashing waves forward from the caster. Each wave does 80-150 points of slashing damage to the first thing it hits.,400,-1,228,80,War Magic,0.01,0,16,15,0,1 -3948,Flame Wave,Shoots eight waves of flame forward from the caster. Each wave does 80-150 points of fire damage to the first thing it hits.,400,-1,226,80,War Magic,0.01,0,16,15,0,1 -3949,Force Wave,Shoots eight waves of force forward from the caster. Each wave does 80-150 points of piercing damage to the first thing it hits.,400,-1,227,80,War Magic,0.01,0,16,15,0,1 -3950,Frost Wave,Shoots eight waves of frost forward from the caster. Each wave does 80-150 points of cold damage to the first thing it hits.,400,-1,224,80,War Magic,0.01,0,16,15,0,1 -3951,Lightning Wave,Shoots eight waves of lightning forward from the caster. Each wave does 80-100 points of electric damage to the first thing it hits.,400,-1,225,80,War Magic,0.01,0,16,15,0,1 -3952,Shock Waves,Shoots eight shock waves forward from the caster. Each wave does 80-150 points of bludgeoning damage to the first thing it hits.,400,-1,223,80,War Magic,0.01,0,16,15,0,1 -3953,Carraida?s Benediction,Raises health by 10% for 24 hours. Additional spells can be layered over this.,100,86400,520,1,Creature Enchantment,0.01,6,16,5,0.25,1 -3954,Access to the White Tower,Teleports the target into the White Tower.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3955,Epic Bludgeon Ward,Reduces damage the target takes from bludgeoning by 20%. Additional magical protection can be layered over this.,20,10800,401,20,Life Magic,0.05,55,16,5,0.85,0 -3956,Epic Piercing Ward,Reduces damage the target takes from piercing by 20%. Additional magical protection can be layered over this.,20,10800,405,20,Life Magic,0.05,45,16,5,0.85,0 -3957,Epic Slashing Ward,Reduces damage the target takes from slashing by 20%. Additional magical protection can be layered over this.,50,10800,403,20,Life Magic,0.05,47,16,5,0.85,0 -3958,White Tower Egress,Teleports the target out of the White Tower.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3959,Redirect Motives,In an attempt to redirect the motives of the wielder back to the law they are sworn to uphold this spell drains 50-100 points of the target's Health.,325,-1,80,70,Life Magic,0.15,32,16,35,0,1 -3960,Authority,Increases a weapon's damage value by 60 points.,500,1020,154,60,Item Enchantment,0.3,57,257,25,0,0 -3961,Defense of the Just,Increases the Melee Defense skill modifier of a weapon or magic caster by 60%.,500,3600,156,70,Item Enchantment,0.15,61,33025,25,0,1 -3962,Bound to the Law,Target is bound to law and justice. The confines of the law do not always allow free action. Reduces Melee Defense by 60 points.,400,240,38,70,Creature Enchantment,0.15,23,16,5,0.25,1 -3963,Epic Coordination,Increases the target's Coordination by 25 points. Additional spells can be layered over this.,25,780,267,10,Creature Enchantment,0.01,8,16,0,1,1 -3964,Epic Focus,Increases the target's Focus by 25 points. Additional spells can be layered over this.,25,780,269,10,Creature Enchantment,0.01,16,16,0,1,1 -3965,Epic Strength,Increases the target's Strength by 25 points. Additional spells can be layered over this.,25,780,261,10,Creature Enchantment,0.01,6,16,0,1,1 -3966,Ringleader's Chambers,Target is portaled into a the Bandit Ringleader?s chambers,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3967,Bandit Trap,Target is portaled into a Sawato Bandit Trap!,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3968,Bandit Hideout,Target is portaled into the Sawato Bandit Hideout,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -3969,Acid Bomb,Shoots 12 waves of acid outward from the caster. Each wave does 100-400 points of acid damage to the first thing it hits.,400,-1,222,80,War Magic,0.2,0,0,5,0,1 -3970,Blade Bomb,Shoots 12 waves of blades outward from the caster. Each wave does 100-400 points of slashing damage to the first thing it hits.,400,-1,228,80,War Magic,0.2,0,0,5,0,1 -3971,Fire Bomb,Shoots 12 waves of flame outward from the caster. Each wave does 100-400 points of fire damage to the first thing it hits.,400,-1,226,80,War Magic,0.2,0,0,5,0,1 -3972,Force Bomb,Shoots 12 waves of force outward from the caster. Each wave does 100-400 points of piercing damage to the first thing it hits.,400,-1,227,80,War Magic,0.2,0,0,5,0,1 -3973,Frost Bomb,Shoots 12 waves of frost outward from the caster. Each wave does 100-400 points of cold damage to the first thing it hits.,400,-1,224,80,War Magic,0.2,0,0,5,0,1 -3974,Lightning Bomb,Shoots 12 waves of lightning outward from the caster. Each wave does 200-1000 points of electric damage to the first thing it hits.,400,-1,225,80,War Magic,0.2,0,0,5,0,1 -3975,Shock Bomb,Shoots 12 waves of shock outward from the caster. Each wave does 200-1000 points of bludgeoning damage to the first thing it hits.,400,-1,223,80,War Magic,0.2,0,0,5,0,1 -3976,Incantation of Armor Other,Increases the target's natural armor by 250 points.,400,5400,115,80,Life Magic,0.15,55,16,5,0.25,1 -3977,Coordination Other Incantation,Increases the target's Coordination by 45 points.,400,10800,7,100,Creature Enchantment,0.15,8,16,5,0.25,1 -3978,Focus Other Incantation,Increases the target's Focus by 45 points.,400,10800,9,100,Creature Enchantment,0.15,16,16,5,0.25,1 -3979,Strength Other Incantation,Increases the target's Strength by 45 points.,400,10800,1,80,Creature Enchantment,0.15,6,16,5,0.25,1 -3980,Impenetrability Incantation,Improves a shield or piece of armor's armor value by 240 points. Target yourself to cast this spell on all of your equipped armor.,325,10800,160,100,Item Enchantment,0.3,142,6,25,0,1 -3981,Mana Renewal Other Incantation,Increases the target's natural mana rate by 145%.,400,10800,97,100,Life Magic,0.15,39,16,5,0.25,1 -3982,Regeneration Other Incantation,Increase target's natural healing rate by 145%.,400,10800,93,100,Life Magic,0.15,37,16,5,0.25,1 -3983,Rejuvenation Other Incantation,Increases the rate at which the target regains Stamina by 145%.,400,10800,95,100,Life Magic,0.15,41,16,5,0.25,1 -3984,Mukkir's Ferocity,Increases a weapon's Attack Skill modifier by 4%. Additional spells can be layered over this.,4,10800,389,10,Item Enchantment,0.01,59,257,25,0,1 -3985,Mukkir Sense,Increases the Melee Defense skill modifier of a weapon or magic caster by 4%. Additional spells can be layered over this.,4,10800,329,10,Item Enchantment,0.01,61,33025,25,0,1 -3986,Rock Fall,A large falling block of black ice.,400,-1,118,35,War Magic,0.15,0,0,10,0,1 -3987,Black Spear Strike,Impales the target for 150-200 points of piercing damage.,400,-1,241,200,War Magic,0,0,16,30,0.2,1 -3988,Black Spear Strike,Impales the target for 200-250 points of piercing damage.,400,-1,241,200,War Magic,0,0,16,30,0.2,1 -3989,Dark Lightning,Shoots a bolt of lighting at the target. The bolt does 150-250 points of electrical damage to the first thing it hits.,400,-1,120,35,War Magic,0.15,0,16,30,0.2,1 -3990,Heavy Frost Ring,Shoots 12 waves of frost outward from the caster. Each wave does 100-150 points of cold damage to the first thing it hits.,400,-1,224,80,War Magic,0.2,0,0,15,0,1 -3991,Thaumic Bleed,Shoots 8 waves of lightning around the caster. Each wave does 250-300 points of electric damage to the first thing it hits.,400,-1,225,80,War Magic,0.2,0,0,10,0,1 -3992,Heavy Acid Ring,Shoots 12 waves of acid outward from the caster. Each wave does 150-300 points of acid damage to the first thing it hits.,400,-1,222,80,War Magic,0.2,0,0,15,0,1 -3993,Heavy Blade Ring,Shoots 12 waves of blades outward from the caster. Each wave does 150-300 points of slashing damage to the first thing it hits.,400,-1,228,80,War Magic,0.2,0,0,15,0,1 -3994,Fire Bomb,Shoots 12 waves of flame outward from the caster. Each wave does 150-300 points of fire damage to the first thing it hits.,400,-1,226,80,War Magic,0.2,0,0,15,0,1 -3995,Heavy Force Ring,Shoots 12 waves of force outward from the caster. Each wave does 150-300 points of piercing damage to the first thing it hits.,400,-1,227,80,War Magic,0.2,0,0,15,0,1 -3996,Heavy Frost Ring,Shoots 12 waves of frost outward from the caster. Each wave does 150-300 points of cold damage to the first thing it hits.,400,-1,224,80,War Magic,0.2,0,0,15,0,1 -3997,Heavy Lightning Ring,Shoots 12 waves of lightning outward from the caster. Each wave does 150-300 points of electric damage to the first thing it hits.,400,-1,225,80,War Magic,0.2,0,0,15,0,1 -3998,Dark Vortex,A spinning vortex of shadow.,400,-1,223,80,War Magic,0.2,0,0,10,0,1 -3999,Exsanguinating Wave,A wave of life draining energy.,400,-1,80,150,Life Magic,0.15,32,0,4.5,0,1 -4000,Heavy Shock Ring,Shoots 12 waves of shock outward from the caster. Each wave does 150-300 points of bludgeoning damage to the first thing it hits.,400,-1,223,80,War Magic,0.2,0,0,15,0,1 -4001,Burning Earth,A burning section of ground that deals 200-500 points of damage to whatever touches it.,400,-1,233,80,War Magic,0.2,0,0,3,0.2,1 -4002,Burning Earth,A burning section of ground that deals 100-200 points of damage to whatever touches it.,400,-1,233,80,War Magic,0.2,0,0,10,0.2,1 -4003,Wall of Spears,Black Spears streak towards the target. Each spear does 150-250 points of piercing damage to the first thing it hits.,400,-1,234,120,War Magic,0,0,0,30,0.5,1 -4004,Wall of Spears,Black Spears streak towards the target. Each spear does 100-150 points of piercing damage to the first thing it hits.,400,-1,234,120,War Magic,0,0,0,30,0.5,1 -4005,Acid Wave,Shoots eight waves of acid forward from the caster. Each wave does 20-100 points of acid damage to the first thing it hits.,400,-1,222,80,War Magic,0.01,0,16,15,0,1 -4006,Blade Wave,Shoots eight slashing waves forward from the caster. Each wave does 20-100 points of slashing damage to the first thing it hits.,400,-1,228,80,War Magic,0.01,0,16,15,0,1 -4007,Flame Wave,Shoots eight waves of flame forward from the caster. Each wave does 20-100 points of fire damage to the first thing it hits.,400,-1,226,80,War Magic,0.01,0,16,15,0,1 -4008,Force Wave,Shoots eight waves of force forward from the caster. Each wave does 20-100 points of piercing damage to the first thing it hits.,400,-1,227,80,War Magic,0.01,0,16,15,0,1 -4009,Frost Wave,Shoots eight waves of frost forward from the caster. Each wave does 20-100 points of cold damage to the first thing it hits.,400,-1,224,80,War Magic,0.01,0,16,15,0,1 -4010,Lightning Wave,Shoots eight waves of lightning forward from the caster. Each wave does 20-100 points of electric damage to the first thing it hits.,400,-1,225,80,War Magic,0.01,0,16,15,0,1 -4011,Shock Waves,Shoots eight shock waves forward from the caster. Each wave does 20-100 points of bludgeoning damage to the first thing it hits.,400,-1,223,80,War Magic,0.01,0,16,15,0,1 -4012,White Totem Temple Sending,The White Totem Gateway sends you to the White Totem Temple.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4013,Black Totem Temple Sending,The Black Totem Gateway sends you to the Black Totem Temple.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4014,Abyssal Totem Temple Sending,The Abyssal Totem Gateway sends you to the Abyssal Totem Temple.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4015,Ruschk Skin,Increases the target's natural armor by 10 points. Additional spells can be layered over this.,10,10800,513,10,Life Magic,0.01,55,16,0,1,1 -4016,Shadow's Heart,Increases the target's Healing skill by 25 points. Additional spells can be layered over this.,25,10800,349,10,Creature Enchantment,0.01,20,16,0,1,1 -4017,Phial's Accuracy,Increases the target's Missile Weapons skill by 800 points.,500,3600,19,100,Creature Enchantment,0.15,18,16,5,0.85,1 -4018,Permafrost,A frozen shell that offers a surprising amount of protection.,475,3600,160,70,Item Enchantment,0.15,142,6,25,0,1 -4019,Epic Quickness,Increases the target's Quickness by 25 points. Additional spells can be layered over this.,25,780,265,10,Creature Enchantment,0.01,12,16,0,1,1 -4020,Epic Deception Prowess,Increases the target's Deception skill by 25 points. Additional spells can be layered over this.,25,780,343,10,Creature Enchantment,0.01,28,16,0,1,1 -4021,Flurry of Stars,Shoots five whirling blades quickly outward from the caster. Each blade does 115-189 points of slashing damage to the first thing it hits.,300,-1,137,70,War Magic,0.15,0,16,30,0.2,1 -4022,Zombies Persistence,Increase caster's natural healing rate by 200% for 60 seconds.,545,60,93,50,Life Magic,0.2,37,16,5,1,1 -4023,Disco Inferno Portal Sending,This spell sends the player to the Night Club dungeon.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4024,Asheron?s Lesser Benediction,Raises health by 10% for 24 hours. Additional spells can be layered over this.,100,86400,520,1,Creature Enchantment,0.01,6,16,5,0.25,1 -4025,Cast Iron Stomach,Increases maximum stamina by 50 points.,50,10800,281,10,Life Magic,0.01,35,16,0,1,1 -4026,Hematic Verdure,Increases maximum health by 25 points.,25,510,279,70,Life Magic,0.3,31,16,0,0,1 -4027,Messenger's Stride,Increases the target's Run skill by 30 points. Additional spells can be layered over this.,30,780,369,10,Creature Enchantment,0.01,24,16,0,1,1 -4028,Snowball,A fluffy snowball.,1,-1,119,10,War Magic,0.05,0,16,30,0.7,1 -4029,Return to the Hall of Champions,Transports the target to the Colosseum's Hall of Champions.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4030,Colosseum Arena,Transports the target to the starting Arena of the Colosseum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4031,Advanced Colosseum Arena,Transports the target to the 6th Arena of the Colosseum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4032,Colosseum Arena,Transports the target to the starting Arena of the Colosseum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4033,Advanced Colosseum Arena,Transports the target to the 6th Arena of the Colosseum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4034,Colosseum Arena,Transports the target to the starting Arena of the Colosseum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4035,Advanced Colosseum Arena,Transports the target to the 6th Arena of the Colosseum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4036,Colosseum Arena,Transports the target to the starting Arena of the Colosseum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4037,Advanced Colosseum Arena,Transports the target to the 6th Arena of the Colosseum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4038,Colosseum Arena,Transports the target to the starting Arena of the Colosseum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4039,Advanced Colosseum Arena,Transports the target to the 6th Arena of the Colosseum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4040,Master's Innervation,Increase caster's natural healing rate by 1000% for 20 seconds.,1000,20,93,70,Life Magic,0.15,37,16,5,1,1 -4041,The Path to Bur,Transports the target to the world of Bur.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4042,The Winding Path to Bur,Transports the target to the world of Bur.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4043,Kukuur Hide,Increases the caster's natural armor by 300 points.,350,120,115,100,Life Magic,0.15,55,16,0,0,1 -4044,Acid Ball,A ball of acid.,320,-1,117,120,War Magic,0,0,16,30,0,1 -4045,Flame Ball,A ball of fire.,320,-1,121,120,War Magic,0,0,16,30,0,1 -4046,Lightning Ball,A ball of lightning.,320,-1,120,120,War Magic,0,0,16,30,0,1 -4047,Artisan Alchemist's Inspiration,Increases the target's Alchemy skill by 30 points. Additional spells can be layered over this.,30,30,523,10,Creature Enchantment,0.01,26,16,0,1,1 -4048,Artisan Cook's Inspiration,Increases the target's Cooking skill by 30 points. Additional spells can be layered over this.,30,30,524,10,Creature Enchantment,0.01,20,16,0,1,1 -4049,Artisan Fletcher's Inspiration,Increases the target's Fletching skill by 30 points. Additional spells can be layered over this.,30,30,525,10,Creature Enchantment,0.01,20,16,0,1,1 -4050,Artisan Lockpicker's Inspiration,Increases the target's Lockpick skill by 30 points. Additional spells can be layered over this.,30,30,526,10,Creature Enchantment,0.01,20,16,0,1,1 -4051,Master Alchemist's Inspiration,Increases the target's Alchemy skill by 20 points. Additional spells can be layered over this.,20,30,523,10,Creature Enchantment,0.01,26,16,0,1,1 -4052,Master Cook's Inspiration,Increases the target's Cooking skill by 20 points. Additional spells can be layered over this.,20,30,524,10,Creature Enchantment,0.01,20,16,0,1,1 -4053,Master Fletcher's Inspiration,Increases the target's Fletching skill by 20 points. Additional spells can be layered over this.,20,30,525,10,Creature Enchantment,0.01,20,16,0,1,1 -4054,Master Lockpicker's Inspiration,Increases the target's Lockpick skill by 20 points. Additional spells can be layered over this.,20,30,526,10,Creature Enchantment,0.01,20,16,0,1,1 -4055,Journeyman Alchemist's Inspiration,Increases the target's Alchemy skill by 10 points. Additional spells can be layered over this.,10,30,523,10,Creature Enchantment,0.01,26,16,0,1,1 -4056,Journeyman Cook's Inspiration,Increases the target's Cooking skill by 10 points. Additional spells can be layered over this.,10,30,524,10,Creature Enchantment,0.01,20,16,0,1,1 -4057,Journeyman Fletcher's Inspiration,Increases the target's Fletching skill by 10 points. Additional spells can be layered over this.,10,30,525,10,Creature Enchantment,0.01,20,16,0,1,1 -4058,Journeyman Lockpicker's Inspiration,Increases the target's Lockpick skill by 10 points. Additional spells can be layered over this.,10,30,526,10,Creature Enchantment,0.01,20,16,0,1,1 -4059,Endurance Other Incantation,Increases the target's Endurance by 45 points.,400,3600,3,70,Creature Enchantment,0.15,10,16,5,0.25,1 -4060,Quickness Other Incantation,Increases the target's Quickness by 45 points.,400,3600,5,70,Creature Enchantment,0.15,12,16,5,0.25,1 -4061,Willpower Other Incantation,Increases the target's Self by 45 points.,400,3600,11,70,Creature Enchantment,0.15,14,16,5,0.25,1 -4062,Empyrean Aegis,Improves a shield or piece of armor's armor value by 500 points.,500,3600,160,70,Item Enchantment,0.15,142,6,25,0,1 -4063,Exit the Upper Catacomb,Transports the target to the caverns of the Burun.,125,-1,214,50,Item Enchantment,0.25,0,16,30,0,1 -4064,Access the Upper Catacomb,Transports the target to the upper chamber of the Falatacot.,125,-1,214,50,Item Enchantment,0.25,0,16,30,0,1 -4065,Lower Catacomb Portal Sending,Transports the target to the lower catacomb of the Falatacot,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4066,Access to the Ley Line Cavern,This spell transports the target to the Ley Line Cavern.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4067,Mucor Bolt,Casting this spell creates a bolt of pure mana which sails toward its target. doing 0-100 points directly to health.,400,-1,80,100,Life Magic,0.3,32,16,33,0,1 -4068,Mucor Mana Well,Consuming this fungus causes your ability to regenerate mana to rapidly increase. Your regeneration rate is increased by 100% (stacking with both normal spells and cantrips) for 3 hours.,400,10800,527,10,Life Magic,0.01,39,16,5,1,1 -4069,Mucor Jolt,The mucor imbued into this weapon sap a small amount of strength from the target of your blow. dealing 0-70 points of damage directly to health.,400,-1,80,60,Life Magic,0.3,32,16,33,0,1 -4070,Empyrean Mana Absorbtion,Increases maximum mana by 100 points.,100,7200,283,70,Life Magic,0.3,33,16,0,0,1 -4071,Empyrean Stamina Absorbtion,Increases maximum Stamina by 100 points.,100,7200,281,70,Life Magic,0.3,35,16,0,0,1 -4072,Aurlanaa's Resolve,Increases your Stamina Regeneration Rate by 20%. This effect can be layered with other cantrips.,20,3600,528,60,Life Magic,0.2,41,16,0,0,1 -4073,Empyrean Regeneration,Increases your Health Regeneration Rate by 50%. This effect can be layered with normal spell effects.,50,3600,257,60,Life Magic,0.2,37,16,0,0,1 -4074,Empyrean Rejuvenation,Increases your Stamina Regeneration Rate by 50%. This effect can be layered with normal spell effects.,50,3600,407,60,Life Magic,0.2,41,16,0,0,1 -4075,Empyrean Mana Renewal,Increases your Mana Regeneration Rate by 50%. This effect can be layered with normal spell effects.,50,3600,259,60,Life Magic,0.2,39,16,0,0,1 -4076,Empyrean Enlightenment,Increases the target's Arcane Lore skill by 60 points.,500,3600,53,70,Creature Enchantment,0.15,26,16,5,0.25,1 -4077,Mana Conversion Mastery Incantation,Increases the target's Mana Conversion skill by 45 points.,400,7200,51,80,Creature Enchantment,0.15,26,16,5,0.25,1 -4078,Egg,An egg.,1,-1,118,10,War Magic,0.05,0,16,30,0.1,1 -4079,Work it Off,Teleports the target to the dishwashing room,400,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -4080,Paid in Full,Teleports the target to the kitchen,400,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -4081,Eye of the Tempest,Shoots twelve waves of lightning outward from the caster. Each wave does 60-120 points of electric damage to the first thing it hits.,400,-1,225,120,War Magic,0.2,0,0,15,0,1 -4082,Big Fire,A large ball of fire.,300,-1,121,5,War Magic,0,0,16,30,0.7,1 -4083,Kresovus' Warren Portal Sending,The mysterious chest in Lord Kresovus' chambers has teleported you...,150,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4084,Bur Recall,Sends the caster to Bur.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -4085,Entering Harraag's Hideout,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4086,Icy Shield,Increases the target's natural armor by 100 points. Additional spells can be layered over this.,100,3600,379,10,Life Magic,0.01,55,16,0,1,1 -4087,Armor Breach,Decreases the target's natural armor by 225 points for 10 seconds.,325,10,116,70,Life Magic,0.15,56,16,5,0.25,1 -4088,Withering Poison,Decreases the victim's natural healing rate by 75%.,500,240,94,70,Life Magic,0.15,38,16,5,0.25,0 -4089,Assassin's Gift,Raises the Assassin's Deception Skill by 100.,500,3600,65,70,Creature Enchantment,0.15,28,16,0,0,1 -4090,Scarab's Shell,Increases the target's natural armor by 260 points.,401,7200,115,70,Life Magic,0.15,55,16,5,0.25,1 -4091,Spear,Impales the target for 150-250 points of piercing damage.,300,-1,241,200,War Magic,0,0,16,40,0.2,1 -4092,Flame Grenade,Burns the target for 80-240 points of fire damage.,300,-1,241,200,War Magic,0,0,16,40,0.2,1 -4093,Don't Bite Me,Reduces damage the target takes from Bludgeoning by 12%. Additional spells can be layered over this.,12,780,401,10,Life Magic,0.01,55,16,0,1,1 -4094,Don't Burn Me,Reduces damage the target takes from Fire by 12%. Additional spells can be layered over this.,12,780,287,10,Life Magic,0.01,43,16,0,1,1 -4095,Don't Stab Me,Reduces damage the target takes from Piercing by 12%. Additional spells can be layered over this.,12,780,405,10,Life Magic,0.01,45,16,0,1,1 -4096,Flame Chain,Shoots five bolts of flame in a row at the target. Each bolt does 26-44 points of fire damage to the first thing it hits. This spell is more effective for long range attacks.,320,-1,121,60,War Magic,0.01,0,16,30,0.2,1 -4097,Violet Rain,Rains LOTS of lightning down.,400,-1,239,120,War Magic,0.25,0,16,30,0.5,1 -4098,Treasure Room,Sends a player to BoneCrunch's Treasure Room.,320,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4099,Strength of Diemos,Increases the target's Strength by 45 points.,410,10800,1,70,Creature Enchantment,0.15,6,16,5,0.25,1 -4100,Breath of Renewal,Restores 500-750 points of the caster's Health.,300,-1,67,70,Life Magic,0.15,31,16,0,0,1 -4101,Champion's Skullduggery,Decrease the target's Melee Defense skill by 125 points.,325,20,38,70,Creature Enchantment,0.15,23,16,0,0,1 -4102,Champion's Clever Ruse,Decrease the target's Magic Defense skill by 125 points.,325,20,42,70,Creature Enchantment,0.15,23,16,0,0,1 -4103,Black Water Portal Sending,Portals the user to the lair of the Watcher of the Black Water.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4104,Champion Arena,Transports the target to Gladiator Diemos' Arena.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4105,Champion Arena,Transports the target to The Master's Arena.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4106,Travel to the Paradox-touched Olthoi Queen's Lair,Instantly transports the target to the Paradox-touched Olthoi Queen's Lair.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4107,Marrow Blight,Lowers all of the target's attributes by 10% for 10 seconds.,500,10,421,10,Creature Enchantment,0.01,9,16,0,1,1 -4108,Apathy,You feel as though a great weight has settled on you. You can't seem to gather enough strength to do much of anything.,400,30,2,1,Creature Enchantment,0.3,7,16,5,0.25,1 -4109,Greater Marrow Blight,You feel a sharp ache deep in your bones. Lowers all of the targets attributes by 50%.,400,30,421,10,Creature Enchantment,0.01,9,16,0,1,1 -4110,Poison,Drains 40-80 points of the target's Health.,350,-1,80,70,Life Magic,0.15,32,16,35,0,1 -4111,Lesser Tusker Hide,Increases your natural armor by 200 points.,250,60,115,100,Life Magic,0.15,55,16,5,0.25,1 -4112,Spirit Nullification,Your caster's usual glow of elemental power is extinguished.,400,60,155,70,Item Enchantment,0.15,58,32768,25,0,1 -4113,FoulRing,A wave of foulness.,400,-1,80,150,Life Magic,0.15,32,0,10,0,1 -4114,Hypnotic Suggestion,A sudden urge to cluck like a chicken makes it difficult to defend yourself. Decreases your Melee Defense by 200 points.,400,30,38,70,Creature Enchantment,0.15,23,16,5,0.25,1 -4115,Mesmerizing Gaze,Mudmouth stares deep into your eyes and you find your mind wandering. even with the sounds of battle that surround you. Your skills are lowered by 20%.,400,60,424,10,Creature Enchantment,0.01,160,16,0,1,1 -4116,Trance,Just look at that shiny thing over there! It's sooo beautiful. Decreases your Magic Defense by 200 points.,400,30,42,70,Creature Enchantment,0.15,23,16,10,0.25,1 -4117,Dark Shield,Reduces damage the caster takes from acid damage by 50%.,100,60,101,40,Life Magic,0.1,49,16,0,0,1 -4118,Dark Shield,Reduces damage the caster takes from lightning damage by 50%.,100,60,107,40,Life Magic,0.1,53,16,0,0,1 -4119,Dark Shield,Reduces damage the caster takes from fire damage by 50%.,100,60,109,40,Life Magic,0.1,43,16,0,0,1 -4120,Dark Shield,Reduces damage the caster takes from Cold damage by 50%.,100,60,105,40,Life Magic,0.1,51,16,0,0,1 -4121,Dark Shield,Reduces damage the caster takes from bludgeon damage by 50%.,100,60,103,40,Life Magic,0.1,55,16,0,0,1 -4122,Dark Shield,Reduces damage the caster takes from Piercing damage by 50%.,100,60,111,40,Life Magic,0.1,45,16,0,0,1 -4123,Dark Shield,Reduces damage the caster takes from Slashing damage by 50%.,100,60,113,40,Life Magic,0.1,47,16,0,0,1 -4124,Dark Nanners,Shoots a wall of ten Dark Nanners at the target. Each Dark Nanner does 50-150 points of slashing damage to the first thing it hits.,400,-1,235,120,War Magic,0.25,0,0,30,0.2,1 -4125,Dark Nanners,Shoots a wall of ten Dark Nanners at the target. Each Dark Nanner does 50-150 points of piercing damage to the first thing it hits.,400,-1,234,120,War Magic,0.25,0,0,30,0.2,1 -4126,Rain of Nanners,Dark Nanners streak from the sky dealing 100-300 points of piercing damage to the first thing they hit.,400,-1,241,120,War Magic,0,0,16,30,0.2,1 -4127,Portal Punch,A powerful punch which sends the target to Oolutanga's Refuge.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4128,Call of the Mhoire Forge,Calls the spirit to the location of the forge of House Mhoire.,150,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -4129,Travel to the Prodigal Shadow Child's Lair,Instantly transports the target to the Prodigal Shadow Child's Lair.,400,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4130,Travel to the Prodigal Shadow Child's Sanctum,Instantly transports the target to the Prodigal Shadow Child's Sanctum.,400,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4131,Spectral Light Weapon Mastery,Increases the caster's Light Weapons skill by 150 points for 9 minutes.,250,540,462,70,Creature Enchantment,0.15,18,16,0,0,1 -4132,Spectral Blood Drinker,Increases a weapon's damage value by 30 points for 3 minutes.,250,180,473,70,Item Enchantment,0.15,57,257,25,0,1 -4133,Spectral Missile Weapon Mastery,Increases the caster's Missile Weapons skill by 150 points for 9 minutes,250,540,465,70,Creature Enchantment,0.15,18,16,0,0,1 -4134,Spectral Missile Weapon Mastery,Increases the caster's Missile_Weapons skill by 150 points for 9 minutes,250,540,465,70,Creature Enchantment,0.15,18,16,0,0,1 -4135,Spectral Finesse Weapon Mastery,Increases the caster's Finesse Weapons skill by 150 points for 9 minutes.,250,540,472,70,Creature Enchantment,0.15,18,16,0,0,1 -4136,Spectral Light Weapon Mastery,Increases the caster's Light Weapons skill by 150 points for 9 minutes.,250,540,462,70,Creature Enchantment,0.15,18,16,0,0,1 -4137,Spectral Light Weapon Mastery,Increases the caster's Light Weapons skill by 150 points for 9 minutes.,250,540,462,70,Creature Enchantment,0.15,18,16,0,0,1 -4138,Spectral Light Weapon Mastery,Increases the caster's Light Weapons skill by 150 points for 9 minutes.,250,540,462,70,Creature Enchantment,0.15,18,16,0,0,1 -4139,Spectral Heavy Weapon Mastery,Increases the caster's Heavy Weapons skill by 150 points for 9 minutes.,250,540,508,70,Creature Enchantment,0.15,18,16,0,0,1 -4140,Spectral Missile Weapon Mastery,Increases the caster's Missile_Weapons skill by 150 points for 9 minutes,250,540,465,70,Creature Enchantment,0.15,18,16,0,0,1 -4141,Spectral Light Weapon Mastery,Increases the caster's Light Weapons skill by 150 points for 9 minutes.,250,540,462,70,Creature Enchantment,0.15,18,16,0,0,1 -4142,Spectral War Magic Mastery,Increases the caster's War Magic skill by 150 points for 9 minutes.,250,540,511,70,Creature Enchantment,0.15,26,16,0,0,1 -4143,Witnessing History,Teleports the PC to Branch 4. Stage 4 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4144,Witnessing History,Teleports the PC to Branch 5. Stage 4 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4145,Crossing the Threshold of Darkness,Teleports the PC to Branch 1. Stage 6 of Vision Quest,125,-1,214,5,Item Enchantment,0.25,16,16,300,0,1 -4146,Crossing the Threshold of Darkness,Teleports the PC to Branch 2. Stage 6 of Vision Quest,125,-1,214,5,Item Enchantment,0.25,16,16,300,0,1 -4147,Crossing the Threshold of Darkness,Teleports the PC to Branch 3. Stage 6 of Vision Quest,125,-1,214,5,Item Enchantment,0.25,16,16,300,0,1 -4148,Crossing the Threshold of Darkness,Teleports the PC to Branch 4. Stage 6 of Vision Quest,125,-1,214,5,Item Enchantment,0.25,16,16,300,0,1 -4149,Crossing the Threshold of Darkness,Teleports the PC to Branch 5. Stage 6 of Vision Quest,125,-1,214,5,Item Enchantment,0.25,16,16,300,0,1 -4150,Expulsion from Claude's Mind,Teleports the PC to Aun Kelauri's tent.,125,-1,214,5,Item Enchantment,0.25,16,16,300,0,1 -4151,Sending to the Other World,Teleports the PC to Branch 1. Stage 1 of Vision Quest,125,-1,214,50,Item Enchantment,0.25,16,16,300,0,1 -4152,Sending to the Other World,Teleports the PC to Branch 2. Stage 1 of Vision Quest,125,-1,214,50,Item Enchantment,0.25,16,16,300,0,1 -4153,Sending to the Other World,Teleports the PC to Branch 3. Stage 1 of Vision Quest,125,-1,214,50,Item Enchantment,0.25,16,16,300,0,1 -4154,Sending to the Other World,Teleports the PC to Branch 4. Stage 1 of Vision Quest,125,-1,214,50,Item Enchantment,0.25,16,16,300,0,1 -4155,Sending to the Other World,Teleports the PC to Branch 5. Stage 1 of Vision Quest,125,-1,214,50,Item Enchantment,0.25,16,16,300,0,1 -4156,Delving into Claude's Mind,Teleports the PC to Branch 1. Stage 2 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4157,Delving into Claude's Mind,Teleports the PC to Branch 2. Stage 2 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4158,Delving into Claude's Mind,Teleports the PC to Branch 3. Stage 2 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4159,Delving into Claude's Mind,Teleports the PC to Branch 4. Stage 2 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4160,Delving into Claude's Mind,Teleports the PC to Branch 5. Stage 2 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4161,Exploring the Past,Teleports the PC to Branch 1. Stage 3 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4162,Exploring the Past,Teleports the PC to Branch 2. Stage 3 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4163,Exploring the Past,Teleports the PC to Branch 3. Stage 3 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4164,Exploring the Past,Teleports the PC to Branch 4. Stage 3 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4165,Exploring the Past,Teleports the PC to Branch 5. Stage 3 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4166,Witnessing History,Teleports the PC to Branch 1. Stage 4 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4167,Witnessing History,Teleports the PC to Branch 2. Stage 4 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4168,Witnessing History,Teleports the PC to Branch 3. Stage 4 of Vision Quest,900,-1,214,150,Item Enchantment,0.25,16,16,300,0,1 -4169,Harbinger Blood Infusion,The Harbinger's blood suffuses your being. increasing your natural armor by 300 points.,410,900,115,100,Life Magic,0.15,55,16,5,0.25,1 -4170,Harbinger's Coordination,Increases Coordination 1 point above spells and most cantrips.,1,7200,413,10,Creature Enchantment,0.01,8,16,0,1,1 -4171,Harbinger's Endurance,Increases Endurance 1 point above spells and most cantrips.,1,7200,416,10,Creature Enchantment,0.01,10,16,0,1,1 -4172,Harbinger's Focus,Increases Focus 1 point above spells and most cantrips.,1,7200,415,10,Creature Enchantment,0.01,14,16,0,1,1 -4173,Harbinger's Quickness,Increases Quickness 1 point above spells and most cantrips.,1,7200,522,10,Creature Enchantment,0.01,12,16,0,1,1 -4174,Harbinger's Strength,Increases Strength 1 point above spells and most cantrips.,1,7200,414,10,Creature Enchantment,0.01,14,16,0,1,1 -4175,Harbinger's Willpower,Increases Willpower 1 point above spells and most cantrips.,1,7200,417,10,Creature Enchantment,0.01,14,16,0,1,1 -4176,Prodigal Harbinger's Lair,Sends the target directly to the Prodigal Harbinger's Lair.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4177,Prodigal Harbinger's Antechamber,Sends the target to the Prodigal Harbinger's Acid Prep Room.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4178,Prodigal Harbinger's Antechamber,Sends the target to the Prodigal Harbinger's Cold Prep Room.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4179,Prodigal Harbinger's Antechamber,Sends the target to the Prodigal Harbinger's Fire Prep Room.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4180,Prodigal Harbinger's Antechamber,Sends the target to the Prodigal Harbinger's Lightning Prep Room.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4181,Essence Bolt,A dangerous looking ball of acid.,300,-1,117,120,War Magic,0,0,0,100,0,1 -4182,Ball Lightning,A sparking ball of lightning that deals 400 points of electric damage to the first thing it hits.,400,-1,120,120,War Magic,0,0,0,100,0,1 -4183,Corrosive Veil,A wave of acid that deals 400 points of acid damage to the first thing it hits.,400,-1,117,120,War Magic,0,0,0,100,0,1 -4184,Essence Bolt,A dangerous looking ball of flame.,300,-1,121,120,War Magic,0,0,0,100,0,1 -4185,Essence Bolt,A dangerous looking ball of Frost.,300,-1,119,120,War Magic,0,0,0,100,0,1 -4186,Hoar Frost,A strangely spreading frost that deals 400 points of cold damage to the first thing it hits.,400,-1,119,120,War Magic,0,0,0,100,0,1 -4187,Essence Bolt,A dangerous looking ball of lightning.,300,-1,120,120,War Magic,0,0,0,100,0,1 -4188,Shadowed Flame,A dark flame that deals 400 points of fire damage to the first thing it hits.,400,-1,121,120,War Magic,0,0,0,100,0,1 -4189,Harbinger Acid Protection,Reduces damage the target takes from acid by 80%.,350,120,101,70,Life Magic,0.15,49,16,5,0.25,0 -4190,Harbinger Cold Protection,Reduces damage the target takes from Cold by 80%.,350,120,105,70,Life Magic,0.15,51,16,5,0.25,0 -4191,Harbinger Flame Protection,Reduces damage the target takes from fire by 80%.,350,120,109,70,Life Magic,0.15,43,16,5,0.25,0 -4192,Harbinger Lightning Protection,Reduces damage the target takes from Lightning by 80%.,350,120,107,70,Life Magic,0.15,53,16,5,0.25,0 -4193,Harbinger Magic Defense,Increases the caster's Magic Defense skill by 400 points.,400,60,41,70,Creature Enchantment,0.15,22,16,0,0,1 -4194,Magical Void,Decreases the target's Magic Defense skill by 350 points.,350,30,42,70,Creature Enchantment,0.15,23,16,5,0.25,1 -4195,Harbinger Melee Defense,Increases the caster's Melee Defense skill by 400 points.,400,60,37,70,Creature Enchantment,0.15,22,16,0,0,1 -4196,Harbinger Missile Defense,Increases the caster's Missile Defense skill by 400 points.,400,60,39,70,Creature Enchantment,0.15,22,16,0,0,1 -4197,Naked to the Elements,Decrease the target's Melee Defense skill by 350 points.,350,30,38,70,Creature Enchantment,0.15,23,16,5,0.25,1 -4198,Paradox-touched Olthoi Infested Area Recall,Transports the caster to the area infested by the Paradox-touched Olthoi.,225,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -4199,Frozen Armor,A layer of thin but sturdy frost covers you. increasing your natural armor by 260.,401,7200,115,70,Life Magic,0.15,55,16,5,0.25,1 -4200,Into the Darkness,Teleports the target into a dark zombie filled dungeon.,200,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4201,Numbing Chill,A numbing chill that acclimates you to cold.,340,180,106,70,Life Magic,0.15,52,16,5,0.25,1 -4202,Trevor's Zombie Strike,Damages the first thing it hits.,200,-1,233,80,War Magic,0.2,0,0,30,0.2,1 -4203,Dark Crypt Entrance,Sends the target into the Dark Crypt.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4204,Dark Crypt Entrance,Sends the target into the Dark Crypt.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4205,Dark Crypt Entrance,Sends the target into the Dark Crypt.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4206,Chewy Center,Dispels all negative enchantments of level 7 or lower from the caster.,350,-1,250,280,Life Magic,0.35,148,16,0,0,1 -4207,Arena of the Pumpkin King,Transports the target to the Arena of the Pumpkin King.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4208,Spectral Flame,Shoots a bolt of spectral energy dealing 110-180 points of cold damage to the first thing it hits.,300,-1,119,35,War Magic,0.15,0,16,30,0.2,1 -4209,Gummy Shield,Boosts the targets magic defense skill by 100 for a short time.,500,30,41,70,Creature Enchantment,0.15,22,16,5,0.25,1 -4210,The Jitters,Boosts the targets missile defense by 100 for a short time.,500,30,39,70,Creature Enchantment,0.15,22,16,5,0.25,1 -4211,Licorice Leap,Boosts casters jump skill by 100 for a short time.,500,30,69,100,Creature Enchantment,0.15,24,16,0,0,1 -4212,Sticky Melee,Boosts the targets melee defense skill by 100 for a short time.,500,30,37,70,Creature Enchantment,0.15,22,16,5,0.25,1 -4213,Colosseum Recall,Sends the caster to the Colosseum.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -4214,Return to the Keep,This spell returns the caster to Candeth Keep.,150,-1,214,50,Item Enchantment,0.25,16,16,0,0,1 -4215,Shadow Armor,The darkness envelops this armor. offering magical protection from harm.,900,3600,160,70,Item Enchantment,0.15,142,6,25,0,1 -4216,Frost Wave,Shoots eight waves of frost forward from the caster. Each wave does 30-60 points of cold damage to the first thing it hits.,300,-1,224,80,War Magic,0.01,0,16,15,0,1 -4217,Gourd Guard,Improves the Pumpkin Shield's armor value by 300 points.,410,3600,160,70,Item Enchantment,0.15,142,6,25,0,1 -4218,Knockback,Knocks the target back from the portal.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4219,Trial of the Arm,Sends the target directly to the Prodigal Harbinger's Lair.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4220,Trial of the Heart,Sends the target directly to the Prodigal Harbinger's Lair.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4221,Spectral Life Magic Mastery,Increases the caster's Life Magic skill by 150 points for 9 minutes.,250,540,488,70,Creature Enchantment,0.15,26,16,0,0,1 -4222,Chambers Beneath,Sends the target directly to the chambers beneath Linvak Tukal.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4223,Trials Graduation Chamber,Portals the target to the Trials Graduation Chamber.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4224,Trial of the Mind,Portals the target to Linvak Tukal's Trial of the Mind.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4225,Trials of the Arm. Mind and Heart,Sends the target to the Trials of the Arm. Mind and Heart.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4226,Epic Endurance,Increases the target's Endurance by 25 points. Additional spells can be layered over this.,25,780,263,10,Creature Enchantment,0.01,10,16,0,1,1 -4227,Epic Willpower,Increases the target's Self by 25 points. Additional spells can be layered over this.,25,780,271,10,Creature Enchantment,0.01,14,16,0,1,1 -4228,Awakening,You awake as if from a dream.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4229,Journey Into the Past,This spell transports the target into the Apparition Black Death Catacomb.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4230,Bael'Zharon Dream Sending,Teleports the player into the dream realm of the Ithaenc Quiddity Seed.,300,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4231,Leadership Mastery Other Incantation,Increases the target's Leadership skill by 45 points.,325,7200,71,80,Creature Enchantment,0.15,20,16,5,0.25,1 -4232,Epic Leadership,Increases the target's Leadership skill by 25 points. Additional spells can be layered over this.,25,780,293,10,Creature Enchantment,0.01,20,16,0,1,1 -4233,Aerbax Recall Center Platform,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4234,Aerbax Recall East Platform,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4235,Aerbax Recall North Platform,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4236,Aerbax Recall South Platform,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4237,Aerbax Recall West Platform,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4238,Aerbax Expulsion,Portals the target off Aerbax's Platforms.,125,-1,214,50,Item Enchantment,0.25,16,16,50,0,1 -4239,Ring of Death,A large explosion dealing massive ammounts of damage to everyone it hits.,400,-1,80,150,Life Magic,0.15,32,0,2,0,1 -4240,Aerbax's Magic Shield,Increases the caster's Magic Defense by 900 points.,800,180,41,70,Creature Enchantment,0.15,26,16,0,0,1 -4241,Aerbax Magic Shield Down,Nullifies Aerbax's Magic Shield.,800,180,41,70,Creature Enchantment,0.15,0,16,0,0,1 -4242,Aerbax's Melee Shield,Increases the caster's Melee Defense by 900 points.,800,180,37,70,Creature Enchantment,0.15,18,16,0,0,1 -4243,Aerbax Melee Shield Down,Nullifies Aerbax's Melee Shield.,800,180,37,70,Creature Enchantment,0.15,0,16,0,0,1 -4244,Aerbax's Missile Shield,Increases the caster's Missile Defense by 900 points.,800,180,39,70,Creature Enchantment,0.15,22,16,0,0,1 -4245,Aerbax Missile Shield Down,Nullifies Aerbax's Missile Shield.,800,180,39,70,Creature Enchantment,0.15,0,16,0,0,1 -4246,MeteorStrike,Rains LOTS of red lightning down.,400,-1,239,1,War Magic,0.01,0,0,100,0.2,1 -4247,Tanada Battle Burrows Portal Sending,This spell transports the target to the Tanada Battle Burrows.,300,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4248,Shroud Cabal North Outpost Sending,This spell sends the player to the Shroud Cabal Northern Outpost,300,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4249,Shroud Cabal South Outpost Sending,This spell sends the player to the Shroud Cabal Southern Outpost,300,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4250,Aerbax's Platform,Portals the target to the Aerbax's Platform.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4251,Jester's Boot,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4252,Entrance to the Jester's Cell,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4253,Entrance to the Jester's Cell,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4254,Jester's Prison Hallway,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4255,Jester's Prison Entryway,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4256,Jester Recall 1,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4257,Jester Recall 2,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4258,Jester Recall 3,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4259,Jester Recall 4,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4260,Jester Recall 5,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4261,Jester Recall 6,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4262,Jester Recall 7,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4263,Jester Recall 8,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4264,Arcane Death,Shoots a pyramid at the target. The pyramid does 250-500 points of piercing damage to the first thing it hits.,300,-1,122,35,War Magic,0,0,0,100,0.2,1 -4265,Arcane Pyramid,Shoots a pyramid at the target. The pyramid does 130-185 points of piercing damage to the first thing it hits.,300,-1,122,35,War Magic,0,0,16,30,0.2,1 -4266,Blood Bolt,Shoots a bolt of blood at your target that does 100-200 points of health damage.,300,-1,80,70,Life Magic,0.15,0,16,30,0.2,1 -4267,Cow,Shoots a Cow at your target. Cow does 100-200 points of Bludgeoning damage.,300,-1,118,35,War Magic,0.15,0,16,30,0.2,1 -4268,Fireworks,Shoots fireworks at your target. The fireworks do 100-200 points of Fire damage.,300,-1,121,35,War Magic,0.15,0,16,30,0.2,1 -4269,Present,Shoots a Present at your target. Present does 100-200 points of slashing damage.,300,-1,118,35,War Magic,0.15,0,16,30,0.2,1 -4270,Table,Shoots a Table at your target. Table does 100-200 points of piercing damage.,300,-1,118,35,War Magic,0.15,0,16,30,0.2,1 -4271,Acid Whip,Sends a line of eight balls of acid towards the target. Each ball does 60-120 points of acid damage to the first thing it hits. The wall is created 2 meters in front of the caster.,200,-1,229,80,War Magic,0.2,0,0,30,0.2,1 -4272,Razor Whip,Sends a line of eight whirling blades towards the target. Each ball does 60-120 points of slashing damage to the first thing it hits. The wall is created 2 meters in front of the caster.,200,-1,235,80,War Magic,0.2,0,0,30,0.2,1 -4273,Spray of Coins,Sends a wall of thirty coins towards the target. Each coin does 1-30 points of bludgeoning damage to the first thing it hits. The wall is created 2 meters in front of the caster.,200,-1,230,80,War Magic,0.2,0,0,30,0.2,1 -4274,Flame Whip,Sends a line of eight balls of fire towards the target. Each ball does 60-120 points of fire damage to the first thing it hits. The wall is created 2 meters in front of the caster.,200,-1,233,80,War Magic,0.2,0,0,30,0.2,1 -4275,Electric Whip,Sends a line of eight bolts of lightning towards the target. Each ball does 60-120 points of electric damage to the first thing it hits. The wall is created 2 meters in front of the caster.,200,-1,232,80,War Magic,0.2,0,0,30,0.2,1 -4276,Jester's Malevolent Eye,Shoots a beam of light at your target. It does 50-150 points of undefined damage.,300,-1,223,80,War Magic,0.01,0,16,30,0.2,1 -4277,Jester's Prison Access,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4278,Rytheran's Library Portal Sending,This spell sends the player to Rytheran's Library.,300,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4280,Deck of Hands Favor,Increases the target's Coordination by 15 points. This spell stacks with normal spells and cantrip spells.,15,600,413,10,Creature Enchantment,0.01,8,16,0,1,1 -4281,Deck of Eyes Favor,Increases the target's Focus by 15 points. This spell stacks with normal spells and cantrip spells.,15,600,415,10,Creature Enchantment,0.01,14,16,0,1,1 -4282,Arcane Death,Shoots a pyramid at the target. The pyramid does 250-500 points of piercing damage to the first thing it hits.,300,-1,122,35,War Magic,0,0,0,100,0.2,1 -4283,Arcane Death,Shoots a pyramid at the target. The pyramid does 250-500 points of piercing damage to the first thing it hits.,300,-1,122,35,War Magic,0,0,0,100,0.2,1 -4284,Harm Self,Drains 100000 points of the caster's Health.,325,-1,80,70,Life Magic,0.15,32,16,0,0,1 -4285,Harm Self,Drains 900000 points of the caster's Health.,325,-1,80,70,Life Magic,0.15,32,16,0,0,1 -4286,Harm Self,Drains 300000 points of the caster's Health.,325,-1,80,70,Life Magic,0.15,32,16,0,0,1 -4287,Harm Self,Drains 700000 points of the caster's Health.,325,-1,80,70,Life Magic,0.15,32,16,0,0,1 -4288,Harm Self,Drains 500000 points of the caster's Health.,325,-1,80,70,Life Magic,0.15,32,16,0,0,1 -4289,Access the Messenger's Sanctuary,Transports the target to the hidden cavern where Falatacot messengers tend to hide.,1000,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -4290,Incantation of Armor Other,Increases the target's natural armor by 250 points.,400,5400,115,80,Life Magic,0.15,55,16,5,0.25,1 -4291,Incantation of Armor Self,Increases the caster's natural armor by 250 points.,400,5400,115,80,Life Magic,0.15,55,16,0,0,1 -4292,Incantation of Bafflement Other,Decreases the target's Focus by 45 points.,400,300,10,80,Creature Enchantment,0.15,17,16,5,0.25,1 -4293,Incantation of Bafflement Self,Decreases the caster's Focus by 45 points.,400,300,10,80,Creature Enchantment,0.15,17,16,0,0,1 -4294,Incantation of Clumsiness Other,Decreases the target's Coordination by 45 points.,400,300,8,80,Creature Enchantment,0.15,9,16,5,0.25,1 -4295,Incantation of Clumsiness Self,Decreases the caster's Coordination by 45 points.,400,300,8,80,Creature Enchantment,0.15,9,16,0,0,1 -4296,Incantation of Coordination Other,Increases the target's Coordination by 45 points.,400,5400,7,80,Creature Enchantment,0.15,8,16,5,0.25,1 -4297,Incantation of Coordination Self,Increases the caster's Coordination by 45 points.,400,5400,7,80,Creature Enchantment,0.15,8,16,0,0,1 -4298,Incantation of Endurance Other,Increases the target's Endurance by 45 points.,400,5400,3,80,Creature Enchantment,0.15,10,16,5,0.25,1 -4299,Incantation of Endurance Self,Increases the caster's Endurance by 45 points.,400,5400,3,80,Creature Enchantment,0.15,10,16,0,0,1 -4300,Incantation of Enfeeble Other,Drains 66-131 points of the target's Stamina.,400,-1,82,80,Life Magic,0.05,36,16,35,0,1 -4301,Incantation of Enfeeble Self,Drains 50-100 points of the caster's Stamina.,400,-1,82,80,Life Magic,0.15,36,16,0,0,1 -4302,Incantation of Feeblemind Other,Decreases the target's Self by 45 points.,400,300,12,80,Creature Enchantment,0.15,15,16,5,0.25,1 -4303,Incantation of Feeblemind Self,Decreases the caster's Self by 45 points.,400,300,12,80,Creature Enchantment,0.15,15,16,0,0,1 -4304,Incantation of Focus Other,Increases the target's Focus by 45 points.,400,5400,9,80,Creature Enchantment,0.15,16,16,5,0.25,1 -4305,Incantation of Focus Self,Increases the caster's Focus by 45 points.,400,5400,9,80,Creature Enchantment,0.15,16,16,0,0,1 -4306,Incantation of Frailty Other,Decreases the target's Endurance by 45 points.,400,300,4,80,Creature Enchantment,0.15,11,16,5,0.25,1 -4307,Incantation of Frailty Self,Decreases the caster's Endurance by 45 points.,400,300,4,80,Creature Enchantment,0.15,11,16,0,0,1 -4308,Incantation of Harm Other,Drains 50-95 points of the target's Health.,400,-1,80,80,Life Magic,0.15,32,16,35,0,1 -4309,Incantation of Harm Self,Drains 48-90 points of the caster's Health.,400,-1,80,80,Life Magic,0.15,32,16,0,0,1 -4310,Incantation of Heal Other,Restores 90-180 points of the target's Health.,400,-1,79,80,Life Magic,0.15,31,16,5,0.25,1 -4311,Incantation of Heal Self,Restores 90-180 points of the caster's Health.,400,-1,67,80,Life Magic,0.15,31,16,0,0,1 -4312,Incantation of Imperil Other,Decreases the target's natural armor by 225 points.,400,300,116,80,Life Magic,0.15,56,16,5,0.25,1 -4313,Incantation of Imperil Self,Decreases the caster's natural armor by 225 points.,400,300,116,80,Life Magic,0.15,56,16,0,0,1 -4314,Incantation of Mana Boost Other,Restores 51-100 points of the target's Mana.,400,-1,83,80,Life Magic,0.15,33,16,5,0.25,1 -4315,Incantation of Mana Boost Self,Restores 51-100 points of the caster's Mana.,400,-1,83,80,Life Magic,0.15,33,16,0,0,1 -4316,Incantation of Mana Drain Other,Drains 52-95 points of the target's Mana.,400,-1,84,80,Life Magic,0.15,34,16,35,0,1 -4317,Incantation of Mana Drain Self,Drains 48-90 points of the caster's Mana.,400,-1,84,80,Life Magic,0.15,34,16,0,0,1 -4318,Incantation of Quickness Other,Increases the target's Quickness by 45 points.,400,5400,5,80,Creature Enchantment,0.15,12,16,5,0.25,1 -4319,Incantation of Quickness Self,Increases the caster's Quickness by 45 points.,400,5400,5,80,Creature Enchantment,0.15,12,16,0,0,1 -4320,Incantation of Revitalize Other,Restores 125-250 points of the target's Stamina.,400,-1,81,80,Life Magic,0.05,35,16,5,0.25,1 -4321,Incantation of Revitalize Self,Restores 125-250 points of the caster's Stamina.,400,-1,81,80,Life Magic,0.15,35,16,0,0,1 -4322,Incantation of Slowness Other,Decreases the target's Quickness by 45 points.,400,300,6,80,Creature Enchantment,0.15,13,16,5,0.25,1 -4323,Incantation of Slowness Self,Decreases the caster's Quickness by 45 points.,400,300,6,80,Creature Enchantment,0.15,13,16,0,0,1 -4324,Incantation of Strength Other,Increases the target's Strength by 45 points.,400,5400,1,80,Creature Enchantment,0.15,6,16,5,0.25,1 -4325,Incantation of Strength Self,Increases the caster's Strength by 45 points.,400,5400,1,80,Creature Enchantment,0.15,6,16,0,0,1 -4326,Incantation of Weakness Other,Decreases the target's Strength by 45 points.,400,300,2,80,Creature Enchantment,0.15,7,16,5,0.25,1 -4327,Incantation of Weakness Self,Decrease the caster's Strength by 45 points.,400,300,2,80,Creature Enchantment,0.2,7,16,0,0,1 -4328,Incantation of Willpower Other,Increases the target's Self by 45 points.,400,5400,11,80,Creature Enchantment,0.15,14,16,5,0.25,1 -4329,Incantation of Willpower Self,Increases the caster's Self by 45 points.,400,5400,11,80,Creature Enchantment,0.15,14,16,0,0,1 -4330,Incantation of Nullify All Magic Other,Dispels all negative enchantments of level 8 or lower from the target.,400,-1,250,320,Life Magic,0.35,148,16,5,0.25,1 -4331,Incantation of Nullify All Magic Self,Dispels all negative enchantments of level 8 or lower from the caster.,400,-1,250,320,Life Magic,0.35,148,16,0,0,1 -4332,Incantation of Nullify All Magic Other,Dispels 2-6 positive enchantments of level 8 or lower from the target.,400,-1,250,340,Life Magic,0.35,148,16,5,0.25,1 -4333,Incantation of Nullify All Magic Self,Dispels all positive enchantments of level 8 or lower from the caster.,400,-1,250,340,Life Magic,0.35,148,16,0,0,1 -4334,Incantation of Nullify All Magic Other,Dispels all enchantments of level 8 or lower from the target.,400,-1,250,340,Life Magic,0.35,148,16,5,0.25,1 -4335,Incantation of Nullify All Magic Self,Dispels all enchantments of level 8 or lower from the caster.,400,-1,250,340,Life Magic,0.35,148,16,0,0,1 -4336,Incantation of Nullify Creature Magic Other,Dispels 3-6 negative Creature Magic enchantments of level 8 or lower from the target.,400,-1,250,320,Creature Enchantment,0.35,147,16,5,0.25,1 -4337,Incantation of Nullify Creature Magic Self,Dispels 3-6 negative Creature Magic enchantments of level 8 or lower from the caster.,400,-1,250,320,Creature Enchantment,0.35,147,16,0,0,1 -4338,Incantation of Nullify Creature Magic Other,Dispels 2-6 positive Creature Magic enchantments of level 6 or lower from the target.,400,-1,250,340,Creature Enchantment,0.35,147,16,5,0.25,1 -4339,Incantation of Nullify Creature Magic Self,Dispels 2-6 positive Creature Magic enchantments of level 6 or lower from the caster.,400,-1,250,340,Creature Enchantment,0.35,147,16,0,0,1 -4340,Incantation of Nullify Creature Magic Other,Dispels 2-6 Creature Magic enchantments of level 6 or lower from the target.,400,-1,250,340,Creature Enchantment,0.35,147,16,5,0.25,1 -4341,Incantation of Nullify Creature Magic Self,Dispels 2-6 Creature Magic enchantments of level 6 or lower from the caster.,400,-1,250,340,Creature Enchantment,0.35,147,16,0,0,1 -4342,Incantation of Nullify Item Magic,Dispels 3-6 negative Item Magic enchantments of level 8 or lower from the target.,400,-1,250,320,Item Enchantment,0.35,68,16,5,0.25,1 -4343,Incantation of Nullify Item Magic,Dispels 2-6 positive Item Magic enchantments of level 6 or lower from the target.,400,-1,250,340,Item Enchantment,0.35,68,16,5,0.25,1 -4344,Incantation of Nullify Item Magic,Dispels 2-6 Item Magic enchantments of level 6 or lower from the target.,400,-1,250,340,Item Enchantment,0.35,68,16,5,0.25,1 -4345,Incantation of Nullify Life Magic Other,Dispels 3-6 negative Life Magic enchantments of level 8 or lower from the target.,400,-1,250,320,Life Magic,0.35,146,16,5,0.25,1 -4346,Incantation of Nullify Life Magic Self,Dispels 3-6 negative Life Magic enchantments of level 8 or lower from the caster.,400,-1,250,320,Life Magic,0.35,146,16,0,0,1 -4347,Incantation of Nullify Life Magic Other,Dispels 2-6 positive Life Magic enchantments of level 8 or lower from the target.,400,-1,250,340,Life Magic,0.35,146,16,5,0.25,1 -4348,Incantation of Nullify Life Magic Self,Dispels 2-6 positive Life Magic enchantments of level 8 or lower from the caster.,400,-1,250,340,Life Magic,0.35,146,16,0,0,1 -4349,Incantation of Nullify Life Magic Other,Dispels 2-6 Life Magic enchantments of level 8 or lower from the target.,400,-1,250,340,Life Magic,0.35,146,16,5,0.25,1 -4350,Incantation of Nullify Life Magic Self,Dispels 2-6 Life Magic enchantments of level 8 or lower from the caster.,400,-1,250,340,Life Magic,0.35,146,16,0,0,1 -4351,Incantation of Greater Alacrity of the Conclave,Enhances the Coordination of all Fellowship members by 45 points for 60 minutes.,400,5400,7,80,Creature Enchantment,0.01,8,16,5,0.25,1 -4352,Incantation of Greater Vivify the Conclave,Enhances the Endurance of all Fellowship members by 45 points for 60 minutes.,400,5400,3,80,Creature Enchantment,0.01,10,16,5,0.25,1 -4353,Incantation of Greater Acumen of the Conclave,Enhances the Focus of all Fellowship members by 45 points for 60 minutes.,400,5400,9,80,Creature Enchantment,0.01,16,16,5,0.25,1 -4354,Incantation of Greater Speed the Conclave,Enhances the Quickness of all Fellowship members by 45 points for 60 minutes.,400,5400,5,80,Creature Enchantment,0.01,12,16,5,0.25,1 -4355,Incantation of Greater Volition of the Conclave,Enhances the Self of all Fellowship members by 45 points for 60 minutes.,400,5400,11,80,Creature Enchantment,0.01,14,16,5,0.25,1 -4356,Incantation of Greater Empowering the Conclave,Enhances the Strength of all Fellowship members by 45 points for 60 minutes.,400,5400,1,80,Creature Enchantment,0.01,6,16,5,0.25,1 -4357,Incantation of Greater Corrosive Ward,Reduces damage all fellowship members take from acid by 70%,400,5400,101,80,Life Magic,0.15,49,16,5,0.25,0 -4358,Incantation of Greater Scythe Ward,Reduces damage all fellowship members take from Slashing by 70%,400,5400,113,80,Life Magic,0.15,47,16,5,0.25,0 -4359,Incantation of Greater Flange Ward,Reduces damage all fellowship members from Bludgeoning by 70%,400,5400,103,80,Life Magic,0.15,55,16,5,0.25,0 -4360,Incantation of Greater Frore Ward,Reduces damage all fellowship members take from Cold by 70%,400,5400,105,80,Life Magic,0.15,51,16,5,0.25,0 -4361,Incantation of Greater Inferno Ward,Reduces damage all fellowship members take from fire by 70%,400,5400,109,80,Life Magic,0.15,43,16,5,0.25,0 -4362,Incantation of Greater Voltaic Ward,Reduces damage all fellowship members take from Lightning by 70%,400,5400,107,80,Life Magic,0.15,53,16,5,0.25,0 -4363,Incantation of Greater Lance Ward,Reduces damage all fellowship members take from Piercing by 70%,400,5400,111,80,Life Magic,0.15,45,16,5,0.25,0 -4364,Incantation of Greater Endless Well,Enhances the understanding of the ebb and flow of mana. All fellowship members received a 115% increase to their nautral mana recovery rate.,400,5400,97,80,Life Magic,0.15,39,16,5,0.25,0 -4365,Incantation of Greater Soothing Wind,Enhances the blood flow and aids in knitting wounds closed. All fellowship member receive a 115% increase to their natural health recovery rate.,400,5400,93,80,Life Magic,0.15,37,16,5,0.25,0 -4366,Incantation of Greater Golden Wind,Enhances the intake of air and utilization of energy. All fellowship member receive a 115% increase to their natural stamina recovery rate.,400,5400,95,80,Life Magic,0.15,41,16,5,0.25,0 -4367,Incantation of Greater Conjurant Chant,Enhances the Creature Enchantment skill of all Fellowship members by 45 points for 60 minutes.,400,5400,43,80,Creature Enchantment,0.01,26,16,5,0.25,1 -4368,Incantation of Warden of the Clutch,Enhances the Missile Defense of all Fellowship members by 45 points for 60 minutes.,400,5400,39,80,Creature Enchantment,0.01,10,16,5,0.25,1 -4369,Incantation of Guardian of the Clutch,Enhances the Melee Defense of all Fellowship members by 45 points for 60 minutes.,400,5400,37,80,Creature Enchantment,0.01,8,16,5,0.25,1 -4370,Incantation of Greater Artificant Chant,Enhances the Item Enchantment skill of all Fellowship members by 45 points for 60 minutes.,400,5400,45,80,Creature Enchantment,0.01,26,16,5,0.25,1 -4371,Incantation of Greater Vitaeic Chant,Enhances the Life Magic skill of all Fellowship members by 45 points for 60 minutes.,400,5400,47,80,Creature Enchantment,0.01,26,16,5,0.25,1 -4372,Incantation of Sanctifier of the Clutch,Enhances the Magic Defense of all Fellowship members by 45 points for 60 minutes.,400,5400,41,80,Creature Enchantment,0.01,16,16,5,0.25,1 -4373,Incantation of Greater Conveyic Chant,Enhances the Mana Conversion skill of all Fellowship members by 45 points for 60 minutes.,400,5400,51,80,Creature Enchantment,0.01,26,16,5,0.25,1 -4374,Incantation of Greater Hieromantic Chant,Enhances the War Magic skill of all Fellowship members by 45 points for 60 minutes.,400,5400,49,80,Creature Enchantment,0.01,26,16,5,0.25,1 -4375,Incantation of Blossom Black Firework OUT,Shoots out a Black Firework.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4376,Incantation of Blossom Blue Firework OUT,Shoots out a Blue Firework.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4377,Incantation of Blossom Green Firework OUT,Shoots out a Green Firework.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4378,Incantation of Blossom Orange Firework OUT,Shoots out a Orange Firework.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4379,Incantation of Blossom Purple Firework OUT,Shoots out a Purple Firework.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4380,Incantation of Blossom Red Firework OUT,Shoots out a Red Firework.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4381,Incantation of Blossom White Firework OUT,Shoots out a White Firework.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4382,Incantation of Blossom Yellow Firework OUT,Shoots out a Yellow Firework.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4383,Incantation of Blossom Black Firework UP,Shoots a Black Firework straight up.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4384,Incantation of Blossom Blue Firework UP,Shoots a Blue Firework straight up.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4385,Incantation of Blossom Green Firework UP,Shoots a Green Firework straight up.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4386,Incantation of Blossom Orange Firework UP,Shoots a Orange Firework straight up.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4387,Incantation of Blossom Purple Firework UP,Shoots a Purple Firework straight up.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4388,Incantation of Blossom Red Firework UP,Shoots a Red Firework straight up.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4389,Incantation of Blossom White Firework UP,Shoots a White Firework straight up.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4390,Incantation of Blossom Yellow Firework UP,Shoots a Yellow Firework straight up.,400,-1,409,80,War Magic,0.15,0,0,100,0,1 -4391,Incantation of Acid Bane,Increases a shield or piece of armor's resistance to acid damage by 200%. Target yourself to cast this spell on all of your equipped armor.,400,5400,162,80,Item Enchantment,0.15,63,6,25,0,1 -4392,Incantation of Acid Lure,Decreases a shield or piece of armor's resistance to acid damage by 200%.,400,300,163,80,Item Enchantment,0.15,64,6,25,0,1 -4393,Incantation of Blade Bane,Increases a shield or piece of armor's resistance to slashing damage by 200%. Target yourself to cast this spell on all of your equipped armor.,400,5400,174,80,Item Enchantment,0.15,61,6,25,0,1 -4394,Incantation of Blade Lure,Decreases a shield or piece of armor's resistance to slashing damage by 200%.,400,300,175,80,Item Enchantment,0.15,62,6,25,0,1 -4395,Aura of Incantation of Blood Drinker Self,Increases a weapon's damage value by 24 points.,400,5400,154,80,Item Enchantment,0.15,57,16,25,0,1 -4396,Incantation of Blood Loather,Decreases a weapon's damage value by 24 points.,400,300,155,80,Item Enchantment,0.15,58,257,25,0,1 -4397,Incantation of Bludgeon Bane,Increases a shield or piece of armor's resistance to bludgeoning damage by 200%. Target yourself to cast this spell on all of your equipped armor.,400,5400,164,80,Item Enchantment,0.15,67,6,25,0,1 -4398,Incantation of Bludgeon Lure,Decreases a shield or piece of armor's resistance to bludgeoning damage by 200%.,400,300,165,80,Item Enchantment,0.15,68,6,25,0,1 -4399,Incantation of Brittlemail,Worsens a shield or piece of armor's armor value by 300 points.,400,300,161,80,Item Enchantment,0.15,143,6,25,0,1 -4400,Aura of Incantation of Defender Self,Increases the Melee Defense skill modifier of a weapon or magic caster by 20%.,350,5400,156,80,Item Enchantment,0.15,61,16,25,0,1 -4401,Incantation of Flame Bane,Increases a shield or piece of armor's resistance to fire damage by 200%. Target yourself to cast this spell on all of your equipped armor.,400,5400,170,80,Item Enchantment,0.15,57,6,25,0,1 -4402,Incantation of Flame Lure,Decreases a shield or piece of armor's resistance to fire damage by 200%.,400,300,171,80,Item Enchantment,0.15,58,6,25,0,1 -4403,Incantation of Frost Bane,Increases a shield or piece of armor's resistance to cold damage by 200%. Target yourself to cast this spell on all of your equipped armor.,400,5400,166,80,Item Enchantment,0.15,65,6,25,0,1 -4404,Incantation of Frost Lure,Decreases a shield or piece of armor's resistance to cold damage by 200%.,400,300,167,80,Item Enchantment,0.15,66,6,25,0,1 -4405,Aura of Incantation of Heart Seeker Self,Increases a weapon's Attack Skill modifier by 20.0 percentage points.,400,5400,152,80,Item Enchantment,0.15,59,16,25,0,1 -4406,Incantation of Hermetic Void,Decreases a magic casting implement's mana conversion bonus by 80%.,400,300,194,80,Item Enchantment,0.15,68,32768,25,0,1 -4407,Incantation of Impenetrability,Improves a shield or piece of armor's armor value by 240 points. Target yourself to cast this spell on all of your equipped armor.,400,5400,160,80,Item Enchantment,0.15,142,6,25,0,1 -4408,Incantation of Leaden Weapon,Worsens a weapon's speed by 80 points.,400,300,159,80,Item Enchantment,0.15,64,257,25,0,1 -4409,Incantation of Lightning Bane,Increases a shield or piece of armor's resistance to electric damage by 200%. Target yourself to cast this spell on all of your equipped armor.,400,5400,168,80,Item Enchantment,0.15,67,6,25,0,1 -4410,Incantation of Lightning Lure,Decreases a shield or piece of armor's resistance to electric damage by 200%.,400,300,169,80,Item Enchantment,0.15,68,6,25,0,1 -4411,Incantation of Lure Blade,Decreases the Melee Defense skill modifier of a weapon or magic caster by 20%.,400,300,157,80,Item Enchantment,0.15,62,33025,25,0,1 -4412,Incantation of Piercing Bane,Increases a shield or piece of armor's resistance to piercing damage by 200%. Target yourself to cast this spell on all of your equipped armor.,400,5400,172,80,Item Enchantment,0.15,59,6,25,0,1 -4413,Incantation of Piercing Lure,Decreases a shield or piece of armor's resistance to piercing damage by 200%.,400,300,173,80,Item Enchantment,0.15,60,6,25,0,1 -4414,Aura of Incantation of Spirit Drinker Self,Increases the elemental damage bonus of an elemental magic caster by 8%.,400,5400,695,80,Item Enchantment,0.15,57,16,25,0,1 -4415,Incantation of Spirit Loather,Decreases the elemental damage bonus of an elemental magic caster by 8%.,400,300,155,80,Item Enchantment,0.15,58,32768,25,0,1 -4416,Incantation of Strengthen Lock,Increases a lock's resistance to picking by 250 points.,400,300,192,80,Item Enchantment,0.15,59,640,25,0,1 -4417,Aura of Incantation of Swift Killer Self,Improves a weapon's speed by 80 points.,400,5400,158,80,Item Enchantment,0.15,63,16,25,0,1 -4418,Aura of Incantation of Hermetic Link Self,Increases a magic casting implement's mana conversion bonus by 80%.,400,5400,195,80,Item Enchantment,0.15,67,16,25,0,1 -4419,Incantation of Turn Blade,Decreases a weapon's Attack Skill modifier by 20.0 percentage points.,400,300,153,80,Item Enchantment,0.15,60,257,25,0,1 -4420,Incantation of Weaken Lock,Decreases a lock's resistance to picking by 250 points.,400,300,193,80,Item Enchantment,0.15,60,640,25,0,1 -4421,Incantation of Acid Arc,Shoots a stream of acid at the target. The stream does 142-204 points of acid damage to the first thing it hits.,400,-1,117,40,War Magic,0.15,0,16,30,0.2,1 -4422,Incantation of Blade Arc,Shoots a magical blade at the target. The bolt does 142-204 points of slashing damage to the first thing it hits.,400,-1,123,40,War Magic,0.15,0,16,30,0.2,1 -4423,Incantation of Flame Arc,Shoots a bolt of flame at the target. The bolt does 142-204 points of fire damage to the first thing it hits.,400,-1,121,40,War Magic,0.15,0,16,30,0.2,1 -4424,Incantation of Force Arc,Shoots a bolt of force at the target. The bolt does 142-204 points of piercing damage to the first thing it hits.,400,-1,122,40,War Magic,0.15,0,16,30,0.2,1 -4425,Incantation of Frost Arc,Shoots a bolt of cold at the target. The bolt does 142-204 points of cold damage to the first thing it hits.,400,-1,119,40,War Magic,0.15,0,16,30,0.2,1 -4426,Incantation of Lightning Arc,Shoots a bolt of lighting at the target. The bolt does 142-204 points of electrical damage to the first thing it hits.,400,-1,120,40,War Magic,0.15,0,16,30,0.2,1 -4427,Incantation of Shock Arc,Shoots a shock wave at the target. The wave does 142-204 points of bludgeoning damage to the first thing it hits.,400,-1,118,40,War Magic,0.15,0,16,30,0.2,1 -4428,Incantation of Martyr's Hecatomb,Drains one-quarter of the caster's health into a bolt of energy. When struck by the bolt. the target's health is reduced by 200% of the amount drained.,400,-1,80,80,Life Magic,0.15,0,16,30,0.2,1 -4429,Incantation of Martyr's Blight,Drains one-quarter of the caster's mana into a bolt of energy. When struck by the bolt. the target's mana is reduced by 200% of the amount drained.,400,-1,84,80,Life Magic,0.15,0,16,30,0.2,1 -4430,Incantation of Martyr's Tenacity,Drains one-quarter of the caster's stamina into a bolt of energy. When struck by the bolt. the target's stamina is reduced by 200% of the amount drained.,400,-1,82,80,Life Magic,0.15,0,16,30,0.2,1 -4431,Incantation of Acid Blast,Shoots five streams of acid outward from the caster. Each stream does 47-94 points of acid damage to the first thing it hits.,400,-1,131,40,War Magic,0.15,0,16,30,0.2,1 -4432,Incantation of Acid Streak,Sends a stream of acid streaking towards the target. The stream does 47-94 points of acid damage to the first thing it hits.,400,-1,243,80,War Magic,0.15,0,16,30,0.2,1 -4433,Incantation of Acid Stream,Shoots a stream of acid at the target. The stream does 142-204 points of acid damage to the first thing it hits.,400,-1,117,40,War Magic,0.15,0,16,30,0.2,1 -4434,Incantation of Acid Volley,Shoots five streams of acid toward the target. Each stream does 47-94 points of acid damage to the first thing it hits.,400,-1,207,40,War Magic,0.15,0,16,30,0.2,1 -4435,Incantation of Blade Blast,Shoots five whirling blades outward from the caster. Each blade does 47-94 points of slashing damage to the first thing it hits.,400,-1,137,40,War Magic,0.15,0,16,30,0.2,1 -4436,Incantation of Blade Volley,Shoots five whirling blades toward the target. Each blade does 47-94 points of Slashing damage to the first thing it hits.,400,-1,213,40,War Magic,0.15,0,16,30,0.2,1 -4437,Incantation of Bludgeoning Volley,Shoots five shock waves toward the target. Each wave does 47-94 points of bludgeoning damage to the first thing it hits.,400,-1,208,40,War Magic,0.15,0,16,30,0.2,1 -4438,Incantation of Flame Blast,Shoots five bolts of flame outward from the caster. Each bolt does 47-94 points of fire damage to the first thing it hits.,400,-1,135,40,War Magic,0.15,0,16,30,0.2,1 -4439,Incantation of Flame Bolt,Shoots a bolt of flame at the target. The bolt does 142-204 points of fire damage to the first thing it hits.,400,-1,121,40,War Magic,0.15,0,16,30,0.2,1 -4440,Incantation of Flame Streak,Sends a bolt of flame streaking towards the target. The bolt does 47-94 points of fire damage to the first thing it hits.,400,-1,247,80,War Magic,0.15,0,16,30,0.2,1 -4441,Incantation of Flame Volley,Shoots five bolts of flame toward the target. Each bolt does 47-94 points of fire damage to the first thing it hits.,400,-1,211,40,War Magic,0.15,0,16,15,0.2,1 -4442,Incantation of Force Blast,Shoots five force bolts outward from the caster. Each bolt does 47-94 points of piercing damage to the first thing it hits.,400,-1,136,40,War Magic,0.15,0,16,30,0.2,1 -4443,Incantation of Force Bolt,Shoots a bolt of force at the target. The bolt does 142-204 points of piercing damage to the first thing it hits.,400,-1,122,40,War Magic,0.15,0,16,30,0.2,1 -4444,Incantation of Force Streak,Sends a bolt of force streaking towards the target. The bolt does 47-94 points of piercing damage to the first thing it hits.,400,-1,248,80,War Magic,0.15,0,16,30,0.2,1 -4445,Incantation of Force Volley,Shoots five bolts of force toward the target. Each bolt does 47-94 points of piercing damage to the first thing it hits.,400,-1,212,40,War Magic,0.15,0,16,30,0.4,1 -4446,Incantation of Frost Blast,Shoots five bolts of frost outward from the caster. Each bolt does 47-94 points of cold damage to the first thing it hits.,400,-1,133,40,War Magic,0.15,0,0,30,0.2,1 -4447,Incantation of Frost Bolt,Shoots a bolt of cold at the target. The bolt does 142-204 points of cold damage to the first thing it hits.,400,-1,119,40,War Magic,0.15,0,16,30,0.2,1 -4448,Incantation of Frost Streak,Sends a bolt of cold streaking towards the target. The bolt does 47-94 points of cold damage to the first thing it hits.,400,-1,245,80,War Magic,0.15,0,16,30,0.2,1 -4449,Incantation of Frost Volley,Shoots five bolts of frost toward the target. Each bolt does 47-94 points of cold damage to the first thing it hits.,400,-1,209,40,War Magic,0.15,0,16,30,0.2,1 -4450,Incantation of Lightning Blast,Shoots five bolts of lightning outward from the caster. Each bolt does 47-94 points of electric damage to the first thing it hits.,400,-1,134,40,War Magic,0.15,0,16,30,0.2,1 -4451,Incantation of Lightning Bolt,Shoots a bolt of lighting at the target. The bolt does 142-204 points of electrical damage to the first thing it hits.,400,-1,120,40,War Magic,0.15,0,16,30,0.2,1 -4452,Incantation of Lightning Streak,Sends a bolt of lighting streaking towards the target. The bolt does 47-94 points of electrical damage to the first thing it hits.,400,-1,246,80,War Magic,0.15,0,16,30,0.2,1 -4453,Incantation of Lightning Volley,Shoots five bolts of lightning toward the target. Each bolt does 47-94 points of electric damage to the first thing it hits.,400,-1,210,40,War Magic,0.15,0,16,30,0.2,1 -4454,Incantation of Shock Blast,Shoots five shock waves outward from the caster. Each wave does 47-94 points of damage to the first thing it hits.,400,-1,132,40,War Magic,0.15,0,16,30,0.2,1 -4455,Incantation of Shock Wave,Shoots a shock wave at the target. The wave does 142-204 points of bludgeoning damage to the first thing it hits.,400,-1,118,40,War Magic,0.15,0,16,30,0.2,1 -4456,Incantation of Shock Wave Streak,Sends a shock wave streaking towards the target. The wave does 47-94 points of bludgeoning damage to the first thing it hits.,400,-1,244,80,War Magic,0.15,0,16,30,0.2,1 -4457,Incantation of Whirling Blade,Shoots a magical blade at the target. The bolt does 142-204 points of slashing damage to the first thing it hits.,400,-1,123,40,War Magic,0.15,0,16,30,0.2,1 -4458,Incantation of Whirling Blade Streak,Sends a magical blade streaking towards the target. The bolt does 47-94 points of slashing damage to the first thing it hits.,400,-1,249,80,War Magic,0.15,0,16,30,0.2,1 -4459,Incantation of Acid Protection Other,Reduces damage the target takes from acid by 68%,400,5400,101,80,Life Magic,0.15,49,16,5,0.25,0 -4460,Incantation of Acid Protection Self,Reduces damage the caster takes from acid by 68%,400,5400,101,80,Life Magic,0.15,49,16,0,0,0 -4461,Incantation of Blade Protection Other,Reduces damage the target takes from Slashing by 68%,400,5400,113,80,Life Magic,0.15,47,16,5,0.25,0 -4462,Incantation of Blade Protection Self,Reduces damage the caster takes from Slashing by 68%,400,5400,113,80,Life Magic,0.15,47,16,0,0,0 -4463,Incantation of Bludgeoning Protection Other,Reduces damage the target takes from Bludgeoning by 68%,400,5400,103,80,Life Magic,0.15,55,16,5,0.25,0 -4464,Incantation of Bludgeoning Protection Self,Reduces damage the caster takes from Bludgeoning by 68%,400,5400,103,80,Life Magic,0.15,55,16,0,0,0 -4465,Incantation of Cold Protection Other,Reduces damage the target takes from Cold by 68%,400,5400,105,80,Life Magic,0.15,51,16,5,0.25,0 -4466,Incantation of Cold Protection Self,Reduces damage the caster takes from Cold by 68%,400,5400,105,80,Life Magic,0.15,51,16,0,0,0 -4467,Incantation of Fire Protection Other,Reduces damage the target takes from fire by 68%,400,5400,109,80,Life Magic,0.15,43,16,5,0.25,0 -4468,Incantation of Fire Protection Self,Reduces damage the caster takes from Fire by 68%,400,5400,109,80,Life Magic,0.15,43,16,0,0,0 -4469,Incantation of Lightning Protection Other,Reduces damage the target takes from Lightning by 68%,400,5400,107,80,Life Magic,0.15,53,16,5,0.25,0 -4470,Incantation of Lightning Protection Self,Reduces damage the caster takes from Lightning by 68%,400,5400,107,80,Life Magic,0.15,53,16,0,0,0 -4471,Incantation of Piercing Protection Other,Reduces damage the target takes from Piercing by 68%,400,5400,111,80,Life Magic,0.15,45,16,5,0.25,0 -4472,Incantation of Piercing Protection Self,Reduces damage the caster takes from Piercing by 68%,400,5400,111,80,Life Magic,0.15,45,16,5,0.25,0 -4473,Incantation of Acid Vulnerability Other,Increases damage the target takes from acid by 210%.,400,300,102,80,Life Magic,0.15,50,16,5,0.25,1 -4474,Incantation of Acid Vulnerability Self,Increases damage the caster takes from acid by 210%.,400,300,102,80,Life Magic,0.15,50,16,0,0,1 -4475,Incantation of Blade Vulnerability Other,Increases damage the target takes from Slashing by 210%.,400,300,114,80,Life Magic,0.15,48,16,5,0.25,1 -4476,Incantation of Blade Vulnerability Self,Increases damage the caster takes from Slashing by 210%.,400,300,114,80,Life Magic,0.15,48,16,0,0,1 -4477,Incantation of Bludgeoning Vulnerability Other,Increases damage the target takes from Bludgeoning by 210%.,400,300,104,80,Life Magic,0.15,56,16,5,0.25,1 -4478,Incantation of Bludgeoning Vulnerability Self,Increases damage the caster takes from Bludgeoning by 210%.,400,300,104,80,Life Magic,0.15,56,16,0,0,1 -4479,Incantation of Cold Vulnerability Other,Increases damage the target takes from Cold by 210%.,400,300,106,80,Life Magic,0.15,52,16,5,0.25,1 -4480,Incantation of Cold Vulnerability Self,Increases damage the caster takes from Cold by 210%.,400,300,106,80,Life Magic,0.15,52,16,0,0,1 -4481,Incantation of Fire Vulnerability Other,Increases damage the target takes from Fire by 210%.,400,300,110,80,Life Magic,0.15,44,16,5,0.25,1 -4482,Incantation of Fire Vulnerability Self,Increases damage the caster takes from Fire by 210%.,400,300,110,80,Life Magic,0.15,44,16,0,0,1 -4483,Incantation of Lightning Vulnerability Other,Increases damage the target takes from Lightning by 210%.,400,300,108,80,Life Magic,0.15,54,16,5,0.25,1 -4484,Incantation of Lightning Vulnerability Self,Increases damage the caster takes from Lightning by 210%.,400,300,108,80,Life Magic,0.15,54,16,0,0,1 -4485,Incantation of Piercing Vulnerability Other,Increases damage the target takes from Piercing by 210%.,400,300,112,80,Life Magic,0.15,46,16,5,0.25,1 -4486,Incantation of Piercing Vulnerability Self,Increases damage the caster takes from Piercing by 210%.,400,300,112,80,Life Magic,0.15,46,16,0,0,1 -4487,Incantation of Exhaustion Other,Decreases the rate at which the target regains Stamina by 75%.,400,300,96,80,Life Magic,0.15,42,16,5,0.25,0 -4488,Incantation of Exhaustion Self,Decreases the rate at which the caster regains Stamina by 75%.,400,300,96,80,Life Magic,0.15,42,16,0,0,0 -4489,Incantation of Fester Other,Decrease target's natural healing rate by 75%.,400,300,94,80,Life Magic,0.15,38,16,5,0.25,0 -4490,Incantation of Fester Self,Decrease caster's natural healing rate by 75%.,400,300,94,80,Life Magic,0.15,38,16,5,1,0 -4491,Incantation of Mana Depletion Other,Decreases target's natural mana rate by 75%.,400,300,98,80,Life Magic,0.15,40,16,5,0.25,0 -4492,Incantation of Mana Depletion Self,Decreases caster's natural mana rate by 75%.,400,300,98,80,Life Magic,0.15,40,16,0,0,0 -4493,Incantation of Mana Renewal Other,Increases the target's natural mana rate by 145%.,400,5400,97,80,Life Magic,0.15,39,16,5,0.25,1 -4494,Incantation of Mana Renewal Self,Increases the caster's natural mana rate by 145%.,400,5400,97,80,Life Magic,0.15,39,16,0,0,1 -4495,Incantation of Regeneration Other,Increase target's natural healing rate by 145%.,400,5400,93,80,Life Magic,0.15,37,16,5,0.25,1 -4496,Incantation of Regeneration Self,Increase caster's natural healing rate by 145%.,400,5400,93,80,Life Magic,0.15,37,16,5,1,1 -4497,Incantation of Rejuvenation Other,Increases the rate at which the target regains Stamina by 145%.,400,5400,95,80,Life Magic,0.15,41,16,5,0.25,1 -4498,Incantation of Rejuvenation Self,Increases the rate at which the caster regains Stamina by 145%.,400,5400,95,80,Life Magic,0.15,41,16,0,0,1 -4499,Incantation of Arcanum Salvaging Self,Increases the caster's Salvaging skill by 45 points.,400,5400,435,80,Creature Enchantment,0.15,26,16,0,0,1 -4500,Incantation of Arcanum Enlightenment,Increases the target's Salvaging skill by 45 points.,400,5400,435,80,Creature Enchantment,0.15,26,16,5,0.25,1 -4501,Incantation of Nuhmudira's Wisdom,Increases the caster's Salvaging skill by 45 points.,400,5400,435,80,Creature Enchantment,0.15,26,16,0,0,1 -4502,Incantation of Nuhmudira Enlightenment,Increases the target's Salvaging skill by 45 points.,400,5400,435,80,Creature Enchantment,0.15,26,16,5,0.25,1 -4503,Incantation of Alchemy Ineptitude Other,Decreases the target's Alchemy skill by 45 points.,400,300,220,80,Creature Enchantment,0.15,27,16,5,0.25,1 -4504,Incantation of Alchemy Ineptitude Self,Decreases the caster's Alchemy skill by 45 points.,400,300,220,80,Creature Enchantment,0.15,27,16,0,0,1 -4505,Incantation of Alchemy Mastery Other,Increases the target's Alchemy skill by 45 points.,400,5400,221,80,Creature Enchantment,0.15,26,16,5,0.25,1 -4506,Incantation of Alchemy Mastery Self,Increases the caster's Alchemy skill by 45 points.,400,5400,221,80,Creature Enchantment,0.15,26,16,0,0,1 -4507,Incantation of Arcane Benightedness Other,Decreases the target's Arcane Lore skill by 45 points.,400,300,54,80,Creature Enchantment,0.15,27,16,5,0.25,1 -4508,Incantation of Arcane Benightedness Self,Decreases the caster's Arcane Lore skill by 45 points.,400,300,54,80,Creature Enchantment,0.15,27,16,0,0,1 -4509,Incantation of Arcane Enlightenment Other,Increases the target's Arcane Lore skill by 45 points.,400,5400,53,80,Creature Enchantment,0.15,26,16,5,0.25,1 -4510,Incantation of Arcane Enlightenment Self,Increases the caster's Arcane Lore skill by 45 points.,400,5400,53,80,Creature Enchantment,0.15,26,16,0,0,1 -4511,Incantation of Armor Tinkering Expertise Other,Increases the target's Armor Tinkering skill by 45 points.,400,5400,55,80,Creature Enchantment,0.15,28,16,5,0.25,1 -4512,Incantation of Armor Tinkering Expertise Self,Increases the caster's Armor Tinkering skill by 45 points.,400,5400,55,80,Creature Enchantment,0.15,28,16,0,0,1 -4513,Incantation of Armor Tinkering Ignorance Other,Decreases the target's Armor Tinkering skill by 45 points.,400,300,56,80,Creature Enchantment,0.15,29,16,5,0.25,1 -4514,Incantation of Armor Tinkering Ignorance Self,Decreases the caster's Armor Tinkering skill by 45 points.,400,300,56,80,Creature Enchantment,0.15,29,16,0,0,1 -4515,Incantation of Light Weapon Ineptitude Other,Decreases the target's Light Weapons skill by 45 points.,400,300,18,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4516,Incantation of Light Weapon Ineptitude Self,Decreases the caster's Light Weapons skill by 45 points.,400,300,18,80,Creature Enchantment,0.15,19,16,0,0,1 -4517,Incantation of Light Weapon Mastery Other,Increases the target's Light Weapons skill by 45 points.,400,5400,17,80,Creature Enchantment,0.15,18,16,5,0.25,1 -4518,Incantation of Light Weapon Mastery Self,Increases the caster's Light Weapons skill by 45 points.,400,5400,17,80,Creature Enchantment,0.15,18,16,0,0,1 -4519,Incantation of Missile Weapon Ineptitude Other,Decreases the target's Missile Weapons skill by 45 points.,400,300,20,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4520,Incantation of Missile Weapon Ineptitude Self,Decreases the caster's Missile Weapons skill by 45 points.,400,300,20,80,Creature Enchantment,0.15,19,16,0,0,1 -4521,Incantation of Missile Weapon Mastery Other,Increases the target's Missile Weapons skill by 45 points.,400,5400,19,80,Creature Enchantment,0.15,18,16,5,0.25,1 -4522,Incantation of Missile Weapon Mastery Self,Increases the caster's Missile Weapons skill by 45 points.,400,5400,19,80,Creature Enchantment,0.15,18,16,0,0,1 -4523,Incantation of Cooking Ineptitude Other,Decreases the target's Cooking skill by 45 points.,400,300,217,80,Creature Enchantment,0.15,21,16,5,0.25,1 -4524,Incantation of Cooking Ineptitude Self,Decreases the caster's Cooking skill by 45 points.,400,300,217,80,Creature Enchantment,0.15,21,16,0,0,1 -4525,Incantation of Cooking Mastery Other,Increases the target's Cooking skill by 45 points.,400,5400,216,80,Creature Enchantment,0.15,20,16,5,0.25,1 -4526,Incantation of Cooking Mastery Self,Increases the caster's Cooking skill by 45 points.,400,5400,216,80,Creature Enchantment,0.15,20,16,0,0,1 -4527,Incantation of Creature Enchantment Ineptitude Other,Decreases the target's Creature Enchantment skill by 45 points.,400,300,44,80,Creature Enchantment,0.15,27,16,5,0.25,1 -4528,Incantation of Creature Enchantment Ineptitude Self,Decreases the caster's Creature Enchantment skill by 45 points.,400,300,44,80,Creature Enchantment,0.15,27,16,0,0,1 -4529,Incantation of Creature Enchantment Mastery Other,Increases the target's Creature Enchantment skill by 45 points.,400,5400,43,80,Creature Enchantment,0.15,26,16,5,0.25,1 -4530,Incantation of Creature Enchantment Mastery Self,Increases the caster's Creature Enchantment skill by 45 points.,400,5400,43,80,Creature Enchantment,0.15,26,16,0,0,1 -4531,Incantation of Missile Weapon Ineptitude Other,Decreases the target's Missile Weapons skill by 45 points.,400,300,20,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4532,Incantation of Missile Weapon Ineptitude Self,Decreases the caster's Missile Weapons skill by 45 points.,400,300,20,80,Creature Enchantment,0.15,19,16,0,0,1 -4533,Incantation of Missile Weapon Mastery Other,Increases the target's Missile Weapons skill by 45 points.,400,5400,19,80,Creature Enchantment,0.15,18,16,5,0.25,1 -4534,Incantation of Missile Weapon Mastery Self,Increases the caster's Missile Weapons skill by 45 points.,400,5400,19,80,Creature Enchantment,0.15,18,16,0,0,1 -4535,Incantation of Finesse Weapon Ineptitude Other,Decreases the target's Finesse Weapons skill by 45 points.,400,300,24,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4536,Incantation of Finesse Weapon Ineptitude Self,Decreases the caster's Finesse Weapons skill by 45 points.,400,300,24,80,Creature Enchantment,0.15,19,16,0,0,1 -4537,Incantation of Finesse Weapon Mastery Other,Increases the target's Finesse Weapons skill by 45 points.,400,5400,23,80,Creature Enchantment,0.15,18,16,5,0.25,1 -4538,Incantation of Finesse Weapon Mastery Self,Increases the caster's Finesse Weapons skill by 45 points.,400,5400,23,80,Creature Enchantment,0.15,18,16,0,0,1 -4539,Incantation of Deception Ineptitude Other,Decreases the target's Deception skill by 45 points.,400,300,66,80,Creature Enchantment,0.15,29,16,5,0.25,1 -4540,Incantation of Deception Ineptitude Self,Decreases the caster's Deception skill by 45 points.,400,300,66,80,Creature Enchantment,0.15,29,16,0,0,1 -4541,Incantation of Deception Mastery Other,Increases the target's Deception skill by 45 points.,400,5400,65,80,Creature Enchantment,0.15,28,16,5,0.25,1 -4542,Incantation of Deception Mastery Self,Increases the caster's Deception skill by 45 points.,400,5400,65,80,Creature Enchantment,0.15,28,16,0,0,1 -4543,Incantation of Defenselessness Other,Decreases the target's Missile Defense skill by 45 points.,400,300,40,80,Creature Enchantment,0.15,23,16,5,0.25,1 -4544,Incantation of Defenselessness Self,Decreases the caster's Missile Defense skill by 45 points.,400,300,40,80,Creature Enchantment,0.15,23,16,0,0,1 -4545,Incantation of Faithlessness Other,Decreases the target's Loyalty skill by 45 points.,400,300,76,80,Creature Enchantment,0.15,21,16,5,0.25,1 -4546,Incantation of Faithlessness Self,Decreases the caster's Loyalty skill by 45 points.,400,300,76,80,Creature Enchantment,0.15,21,16,0,0,1 -4547,Incantation of Fealty Other,Increases the target's Loyalty skill by 45 points.,400,5400,75,80,Creature Enchantment,0.15,20,16,5,0.25,1 -4548,Incantation of Fealty Self,Increases the caster's Loyalty skill by 45 points.,400,5400,75,80,Creature Enchantment,0.15,20,16,0,0,1 -4549,Incantation of Fletching Ineptitude Other,Decreases the target's Fletching skill by 45 points.,400,300,219,80,Creature Enchantment,0.15,21,16,5,0.25,1 -4550,Incantation of Fletching Ineptitude Self,Decreases the caster's Fletching skill by 45 points.,400,300,219,80,Creature Enchantment,0.15,21,16,0,0,1 -4551,Incantation of Fletching Mastery Other,Increases the target's Fletching skill by 45 points.,400,5400,218,80,Creature Enchantment,0.15,20,16,5,0.25,1 -4552,Incantation of Fletching Mastery Self,Increases the caster's Fletching skill by 45 points.,400,5400,218,80,Creature Enchantment,0.15,20,16,0,0,1 -4553,Incantation of Healing Ineptitude Other,Decreases the target's Healing skill by 45 points.,400,300,68,80,Creature Enchantment,0.15,21,16,5,0.25,1 -4554,Incantation of Healing Ineptitude Self,Decreases the caster's Healing skill by 45 points.,400,300,68,80,Creature Enchantment,0.15,21,16,0,0,1 -4555,Incantation of Healing Mastery Other,Increases the target's Healing skill by 45 points.,400,5400,67,80,Creature Enchantment,0.15,20,16,5,0.25,1 -4556,Incantation of Healing Mastery Self,Increases the caster's Healing skill by 45 points.,400,5400,67,80,Creature Enchantment,0.15,20,16,0,0,1 -4557,Incantation of Impregnability Other,Increases the target's Missile Defense skill by 45 points.,400,5400,39,80,Creature Enchantment,0.15,22,16,5,0.25,1 -4558,Incantation of Impregnability Self,Increases the caster's Missile Defense skill by 45 points.,400,5400,39,80,Creature Enchantment,0.15,22,16,0,0,1 -4559,Incantation of Invulnerability Other,Increases the target's Melee Defense skill by 45 points.,400,5400,37,80,Creature Enchantment,0.15,22,16,5,0.25,1 -4560,Incantation of Invulnerability Self,Increases the caster's Melee Defense skill by 45 points.,400,5400,37,80,Creature Enchantment,0.15,22,16,0,0,1 -4561,Incantation of Item Enchantment Ineptitude Other,Decreases the target's Item Enchantment skill by 45 points.,400,300,46,80,Creature Enchantment,0.15,27,16,5,0.25,1 -4562,Incantation of Item Enchantment Ineptitude Self,Decreases the caster's Item Enchantment skill by 45 points.,400,300,46,80,Creature Enchantment,0.15,27,16,0,0,1 -4563,Incantation of Item Enchantment Mastery Other,Increases the target's Item Enchantment skill by 45 points.,400,5400,45,80,Creature Enchantment,0.15,26,16,5,0.25,1 -4564,Incantation of Item Enchantment Mastery Self,Increases the caster's Item Enchantment skill by 45 points.,400,5400,45,80,Creature Enchantment,0.15,26,16,0,0,1 -4565,Incantation of Item Tinkering Expertise Other,Increases the target's Item Tinkering skill by 45 points.,400,5400,57,80,Creature Enchantment,0.15,28,16,5,0.25,1 -4566,Incantation of Item Tinkering Expertise Self,Increases the caster's Item Tinkering skill by 45 points.,400,5400,57,80,Creature Enchantment,0.15,28,16,0,0,1 -4567,Incantation of Item Tinkering Ignorance Other,Decreases the target's Item Tinkering skill by 45 points.,400,300,58,80,Creature Enchantment,0.15,29,16,5,0.25,1 -4568,Incantation of Item Tinkering Ignorance Self,Decreases the caster's Item Tinkering skill by 45 points.,400,300,58,80,Creature Enchantment,0.15,29,16,0,0,1 -4569,Incantation of Jumping Ineptitude Other,Decreases the target's Jump skill by 45 points.,400,300,70,80,Creature Enchantment,0.15,25,16,5,0.25,1 -4570,Incantation of Jumping Ineptitude Self,Decreases the caster's Jump skill by 45 points.,400,300,70,80,Creature Enchantment,0.15,25,16,0,0,1 -4571,Incantation of Jumping Mastery Other,Increases the target's Jump skill by 45 points.,400,5400,69,80,Creature Enchantment,0.15,24,16,5,0.25,1 -4572,Incantation of Jumping Mastery Self,Increases the caster's Jump skill by 45 points.,400,5400,69,80,Creature Enchantment,0.15,24,16,0,0,1 -4573,Incantation of Leaden Feet Other,Decreases the target's Run skill by 45 points.,400,300,78,80,Creature Enchantment,0.15,25,16,5,0.25,1 -4574,Incantation of Leaden Feet Self,Decreases the caster's Run skill by 45 points.,400,300,78,80,Creature Enchantment,0.15,25,16,0,0,1 -4575,Incantation of Leadership Ineptitude Other,Decreases the target's Leadership skill by 45 points.,400,300,72,80,Creature Enchantment,0.15,21,16,5,0.25,1 -4576,Incantation of Leadership Ineptitude Self,Decreases the caster's Leadership skill by 45 points.,400,300,72,80,Creature Enchantment,0.15,21,16,0,0,1 -4577,Incantation of Leadership Mastery Other,Increases the target's Leadership skill by 45 points.,400,5400,71,80,Creature Enchantment,0.15,20,16,5,0.25,1 -4578,Incantation of Leadership Mastery Self,Increases the caster's Leadership skill by 45 points.,400,5400,71,80,Creature Enchantment,0.15,20,16,0,0,1 -4579,Incantation of Life Magic Ineptitude Other,Decreases the target's Life Magic skill by 45 points.,400,300,48,80,Creature Enchantment,0.15,27,16,5,0.25,1 -4580,Incantation of Life Magic Ineptitude Self,Decreases the caster's Life Magic skill by 45 points.,400,300,48,80,Creature Enchantment,0.15,27,16,0,0,1 -4581,Incantation of Life Magic Mastery Other,Increases the target's Life Magic skill by 45 points.,400,5400,47,80,Creature Enchantment,0.15,26,16,5,0.25,1 -4582,Incantation of Life Magic Mastery Self,Increases the caster's Life Magic skill by 45 points.,400,5400,47,80,Creature Enchantment,0.15,26,16,0,0,1 -4583,Incantation of Lockpick Ineptitude Other,Decreases the target's Lockpick skill by 45 points.,400,300,74,80,Creature Enchantment,0.15,21,16,5,0.25,1 -4584,Incantation of Lockpick Ineptitude Self,Decreases the caster's Lockpick skill by 45 points.,400,300,74,80,Creature Enchantment,0.15,21,16,0,0,1 -4585,Incantation of Lockpick Mastery Other,Increases the target's Lockpick skill by 45 points.,400,5400,73,80,Creature Enchantment,0.15,20,16,5,0.25,1 -4586,Incantation of Lockpick Mastery Self,Increases the caster's Lockpick skill by 45 points.,400,5400,73,80,Creature Enchantment,0.15,20,16,0,0,1 -4587,Incantation of Light Weapon Ineptitude Other,Decreases the target's Light Weapons skill by 45 points.,400,300,18,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4588,Incantation of Light Weapon Ineptitude Self,Decreases the caster's Light Weapons skill by 45 points.,400,300,18,80,Creature Enchantment,0.15,19,16,0,0,1 -4589,Incantation of Light Weapon Mastery Other,Increases the target's Light Weapons skill by 45 points.,400,5400,17,80,Creature Enchantment,0.15,18,16,5,0.25,1 -4590,Incantation of Light Weapon Mastery Self,Increases the caster's Light Weapons skill by 45 points.,400,5400,17,80,Creature Enchantment,0.15,18,16,0,0,1 -4591,Incantation of Magic Item Tinkering Expertise Other,Increases the target's Magic Item Tinkering skill by 45 points.,400,5400,59,80,Creature Enchantment,0.15,28,16,5,0.25,1 -4592,Incantation of Magic Item Tinkering Expertise Self,Increases the caster's Magic Item Tinkering skill by 45 points.,400,5400,59,80,Creature Enchantment,0.15,28,16,0,0,1 -4593,Incantation of Magic Item Tinkering Ignorance Other,Decreases the target's Magic Item Tinkering skill by 45 points.,400,300,60,80,Creature Enchantment,0.15,29,16,5,0.25,1 -4594,Incantation of Magic Item Tinkering Ignorance Self,Decreases the caster's Magic Item Tinkering skill by 45 points.,400,300,60,80,Creature Enchantment,0.15,29,16,0,0,1 -4595,Incantation of Magic Resistance Other,Increases the target's Magic Defense skill by 45 points.,400,5400,41,80,Creature Enchantment,0.15,22,16,5,0.25,1 -4596,Incantation of Magic Resistance Self,Increases the caster's Magic Defense skill by 45 points.,400,5400,41,80,Creature Enchantment,0.15,22,16,0,0,1 -4597,Incantation of Magic Yield Other,Decreases the target's Magic Defense skill by 45 points.,400,300,42,80,Creature Enchantment,0.15,23,16,5,0.25,1 -4598,Incantation of Magic Yield Self,Decreases the caster's Magic Defense skill by 45 points.,400,300,42,80,Creature Enchantment,0.15,23,16,0,0,1 -4599,Incantation of Mana Conversion Ineptitude Other,Decreases the target's Mana Conversion skill by 45 points.,400,300,52,80,Creature Enchantment,0.15,27,16,5,0.25,1 -4600,Incantation of Mana Conversion Ineptitude Self,Decreases the caster's Mana Conversion skill by 45 points.,400,300,52,80,Creature Enchantment,0.15,27,16,0,0,1 -4601,Incantation of Mana Conversion Mastery Other,Increases the target's Mana Conversion skill by 45 points.,400,5400,51,80,Creature Enchantment,0.15,26,16,5,0.25,1 -4602,Incantation of Mana Conversion Mastery Self,Increases the caster's Mana Conversion skill by 45 points.,400,5400,51,80,Creature Enchantment,0.15,26,16,0,0,1 -4603,Incantation of Monster Attunement Other,Increases the target's Assess Monster skill by 45 points.,400,5400,63,80,Creature Enchantment,0.15,28,16,5,0.25,1 -4604,Incantation of Monster Attunement Self,Increases the caster's Assess Monster skill by 45 points.,400,5400,63,80,Creature Enchantment,0.15,28,16,0,0,1 -4605,Incantation of Monster Unfamiliarity Other,Decreases the target's Assess Monster skill by 45 points.,400,300,64,80,Creature Enchantment,0.15,29,16,5,0.25,1 -4606,Incantation of Monster Unfamiliarity Self,Decreases the caster's Assess Monster skill by 45 points.,400,300,64,80,Creature Enchantment,0.15,29,16,0,0,1 -4607,Incantation of Person Attunement Other,Increases the target's Assess Person skill by 45 points.,400,5400,205,80,Creature Enchantment,0.15,28,16,5,0.25,1 -4608,Incantation of Person Attunement Self,Increases the caster's Assess Person skill by 45 points.,400,5400,205,80,Creature Enchantment,0.15,28,16,0,0,1 -4609,Incantation of Person Unfamiliarity Other,Decreases the target's Assess Person skill by 45 points.,400,300,206,80,Creature Enchantment,0.15,29,16,5,0.25,1 -4610,Incantation of Person Unfamiliarity Self,Decreases the caster's Assess Person skill by 45 points.,400,300,206,80,Creature Enchantment,0.15,29,16,0,0,1 -4611,Incantation of Light Weapon Ineptitude Other,Decreases the target's Light Weapons skill by 45 points.,400,300,18,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4612,Incantation of Light Weapon Ineptitude Self,Decreases the caster's Light Weapons skill by 45 points.,400,300,18,80,Creature Enchantment,0.15,19,16,0,0,1 -4613,Incantation of Light Weapon Mastery Other,Increases the target's Light Weapons skill by 45 points.,400,5400,17,80,Creature Enchantment,0.15,18,16,5,0.25,1 -4614,Incantation of Light Weapon Mastery Self,Increases the caster's Light Weapons skill by 45 points.,400,5400,17,80,Creature Enchantment,0.15,18,16,0,0,1 -4615,Incantation of Sprint Other,Increases the target's Run skill by 45 points.,400,5400,77,80,Creature Enchantment,0.15,24,16,5,0.25,1 -4616,Incantation of Sprint Self,Increases the caster's Run skill by 45 points.,400,5400,77,80,Creature Enchantment,0.15,24,16,0,0,1 -4617,Incantation of Light Weapon Ineptitude Other,Decreases the target's Light Weapons skill by 45 points.,400,300,18,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4618,Incantation of Light Weapon Ineptitude Self,Decreases the caster's Light Weapons skill by 45 points.,400,300,18,80,Creature Enchantment,0.15,19,16,0,0,1 -4619,Incantation of Light Weapon Mastery Other,Increases the target's Light Weapons skill by 45 points.,400,5400,17,80,Creature Enchantment,0.15,18,16,5,0.25,1 -4620,Incantation of Light Weapon Mastery Self,Increases the caster's Light Weapons skill by 45 points.,400,5400,17,80,Creature Enchantment,0.15,18,16,0,0,1 -4621,Incantation of Heavy Weapon Ineptitude Other,Decreases the target's Heavy Weapons skill by 45 points.,400,300,32,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4622,Incantation of Heavy Weapon Ineptitude Self,Decreases the caster's Heavy Weapons skill by 45 points.,400,300,32,80,Creature Enchantment,0.15,19,16,0,0,1 -4623,Incantation of Heavy Weapon Mastery Other,Increases the target's Heavy Weapons skill by 45 points.,400,5400,31,80,Creature Enchantment,0.15,18,16,5,0.25,1 -4624,Incantation of Heavy Weapon Mastery Self,Increases the caster's Heavy Weapons skill by 45 points.,400,5400,31,80,Creature Enchantment,0.15,18,16,0,0,1 -4625,Incantation of Missile Weapon Ineptitude Other,Decreases the target's Missile Weapons skill by 45 points.,400,300,20,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4626,Incantation of Missile Weapon Ineptitude Self,Decreases the caster's Missile Weapons skill by 45 points.,400,300,20,80,Creature Enchantment,0.15,19,16,0,0,1 -4627,Incantation of Missile Weapon Mastery Other,Increases the target's Missile Weapons skill by 45 points.,400,5400,19,80,Creature Enchantment,0.15,18,16,5,0.25,1 -4628,Incantation of Missile Weapon Mastery Self,Increases the caster's Missile Weapons skill by 45 points.,400,5400,19,80,Creature Enchantment,0.15,18,16,0,0,1 -4629,Incantation of Light Weapon Ineptitude Other,Decreases the target's Light Weapons skill by 45 points.,400,300,18,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4630,Incantation of Light Weapon Mastery Other,Increases the target's Light Weapons skill by 45 points.,400,5400,17,80,Creature Enchantment,0.15,18,16,5,0.25,1 -4631,Incantation of Light Weapon Mastery Self,Increases the caster's Light Weapons skill by 45 points.,400,5400,17,80,Creature Enchantment,0.15,18,16,0,0,1 -4632,Incantation of Light Weapon Ineptitude Other,Decreases the target's Light Weapons skill by 45 points.,400,300,18,80,Creature Enchantment,0.15,19,16,5,0.25,1 -4633,Incantation of Vulnerability Other,Decrease the target's Melee Defense skill by 45 points.,400,300,38,80,Creature Enchantment,0.15,23,16,5,0.25,1 -4634,Incantation of Vulnerability Self,Decrease the target's Melee Defense skill by 45 points.,400,300,38,80,Creature Enchantment,0.15,23,16,0,0,1 -4635,Incantation of War Magic Ineptitude Other,Decreases the target's War Magic skill by 45 points.,400,300,50,80,Creature Enchantment,0.15,27,16,5,0.25,1 -4636,Incantation of War Magic Ineptitude Self,Decreases the caster's War Magic skill by 45 points.,400,300,50,80,Creature Enchantment,0.15,27,16,0,1,1 -4637,Incantation of War Magic Mastery Other,Increases the target's War Magic skill by 45 points.,400,5400,49,80,Creature Enchantment,0.15,26,16,5,0.25,1 -4638,Incantation of War Magic Mastery Self,Increases the caster's War Magic skill by 45 points.,400,5400,49,80,Creature Enchantment,0.15,26,16,0,0,1 -4639,Incantation of Weapon Tinkering Expertise Other,Increases the target's Weapon Tinkering skill by 45 points.,400,5400,61,80,Creature Enchantment,0.15,28,16,5,0.25,1 -4640,Incantation of Weapon Tinkering Expertise Self,Increases the caster's Weapon Tinkering skill by 45 points.,400,5400,61,80,Creature Enchantment,0.15,28,16,0,0,1 -4641,Incantation of Weapon Tinkering Ignorance Other,Decreases the target's Weapon Tinkering skill by 45 points.,400,300,62,80,Creature Enchantment,0.15,29,16,5,0.25,1 -4642,Incantation of Weapon Tinkering Ignorance Self,Decreases the caster's Weapon Tinkering skill by 45 points.,400,300,62,80,Creature Enchantment,0.15,29,16,0,0,1 -4643,Incantation of Drain Health Other,Drains 60% of the target's Health and gives 35% of it to the caster.,400,-1,87,68,Life Magic,0.85,32,16,35,0,0 -4644,Incantation of Drain Mana Other,Drains 60% of the target's Mana and gives it to the caster.,400,-1,91,68,Life Magic,0.85,34,16,35,0,0 -4645,Incantation of Drain Stamina Other,Drains 60% of the target's Stamina and gives it to the caster.,400,-1,89,68,Life Magic,0.85,36,16,35,0,0 -4646,Incantation of Health to Mana Other,Drains one-half of the target's Health and gives 200% of that to his/her Mana.,400,-1,87,80,Life Magic,0.15,74,16,5,0,0 -4647,Incantation of Health to Mana Self,Drains one-half of the caster's Health and gives 200% of that to his/her Mana.,400,-1,87,80,Life Magic,0.15,74,16,0,0,0 -4648,Incantation of Health to Stamina Other,Drains one-half of the target's Health and gives 200% of that to his/her Stamina.,400,-1,87,80,Life Magic,0.15,73,16,5,0,0 -4649,Incantation of Health to Stamina Self,Drains one-half of the caster's Health and gives 200% of that to his/her Stamina.,400,-1,87,80,Life Magic,0.15,73,16,0,0,0 -4650,Incantation of Infuse Health Other,Drains one-quarter of the caster's Health and gives 200% of that to the target.,400,-1,88,80,Life Magic,0.75,31,16,5,0.1,0 -4651,Incantation of Infuse Mana Other,Drains one-quarter of the caster's Mana and gives 200% of that to the target.,400,-1,92,80,Life Magic,0.75,33,16,5,0.1,0 -4652,Incantation of Infuse Stamina Other,Drains one-quarter of the caster's Stamina and gives 200% of that to the target.,400,-1,90,80,Life Magic,0.75,35,16,5,0.1,0 -4653,Incantation of Mana to Health Other,Drains one-half of the target's Mana and gives 200% of that to his/her Health.,400,-1,91,80,Life Magic,0.15,77,16,5,0,0 -4654,Incantation of Mana to Health Self,Drains one-half of the caster's Mana and gives 200% of that to his/her Health.,400,-1,91,80,Life Magic,0.15,77,16,0,0,0 -4655,Incantation of Mana to Stamina Other,Drains one-half of the target's Mana and gives 200% of that to his/her stamina.,400,-1,91,80,Life Magic,0.15,78,16,5,0,0 -4656,Incantation of Mana to Stamina Self,Drains one-half of the caster's Mana and gives 200% of that to his/her Stamina.,400,-1,91,80,Life Magic,0.15,78,16,0,0,0 -4657,Incantation of Stamina to Health Other,Drains one-half of the target's Stamina and gives 200% of that to his/her Health.,400,-1,89,80,Life Magic,0.15,75,16,5,0,0 -4658,Incantation of Stamina to Health Self,Drains one-half of the caster's Stamina and gives 200% of that to his/her Health.,400,-1,89,80,Life Magic,0.15,75,16,0,0,0 -4659,Incantation of Stamina to Mana Other,Drains one-half of the target's Stamina and gives 200% of that to his/her Mana.,400,-1,89,80,Life Magic,0.15,76,16,5,0,0 -4660,Epic Acid Bane,Increases a shield or piece of armor's resistance to Acid damage by 20%. Additional spells can be layered over this.,3,780,381,10,Item Enchantment,0.01,63,6,25,0,1 -4661,Epic Blood Thirst,Increases a weapon's damage value by 7 points. Additional spells can be layered over this.,5,780,323,10,Item Enchantment,0,57,257,35,0,1 -4662,Epic Bludgeoning Bane,Increases a shield or piece of armor's resistance to Bludgeoning damage by 20%. Additional spells can be layered over this.,3,780,383,10,Item Enchantment,0.01,67,6,25,0,1 -4663,Epic Defender,Increases the Melee Defense skill modifier of a weapon or magic caster by 7%. Additional spells can be layered over this.,6,780,329,10,Item Enchantment,0.01,61,33025,35,0,1 -4664,Epic Flame Bane,Increases a shield or piece of armor's resistance to Fire damage by 20%. Additional spells can be layered over this.,3,780,385,10,Item Enchantment,0.01,57,6,25,0,1 -4665,Epic Frost Bane,Increases a shield or piece of armor's resistance to Cold damage by 20%. Additional spells can be layered over this.,3,780,387,10,Item Enchantment,0.01,65,6,25,0,1 -4666,Epic Heart Thirst,Increases a weapon's Attack Skill modifier by 7%. Additional spells can be layered over this.,6,780,389,10,Item Enchantment,0.01,59,257,35,0,1 -4667,Epic Impenetrability,Improves a shield or piece of armor's Armor value by 60 points. Additional spells can be layered over this.,3,780,391,10,Item Enchantment,0,142,6,25,0,1 -4668,Epic Piercing Bane,Increases a shield or piece of armor's resistance to Piercing damage by 20%. Additional spells can be layered over this.,3,780,393,10,Item Enchantment,0.01,59,6,25,0,1 -4669,Epic Slashing Bane,Increases a shield or piece of armor's resistance to Slashing damage by 20%. Additional spells can be layered over this.,3,780,395,10,Item Enchantment,0.01,61,6,25,0,1 -4670,Epic Spirit Thirst,Increases the elemental damage bonus of an elemental magic caster by 5%. Additional spells can be layered over this.,4,780,323,10,Item Enchantment,0,57,32768,35,0,1 -4671,Epic Storm Bane,Increases a shield or piece of armor's resistance to Electric damage by 20%. Additional spells can be layered over this.,3,780,397,10,Item Enchantment,0.01,67,6,25,0,1 -4672,Epic Swift Hunter,Improves a weapon's speed by 30 points. Additional spells can be layered over this.,25,780,399,10,Item Enchantment,0,63,257,25,0,1 -4673,Epic Acid Ward,Reduces damage the target takes from Acid by 20%. Additional spells can be layered over this.,20,780,285,10,Life Magic,0.01,49,16,0,1,1 -4674,Epic Bludgeoning Ward,Reduces damage the target takes from Bludgeoning by 20%. Additional spells can be layered over this.,20,780,401,10,Life Magic,0.01,55,16,0,1,1 -4675,Epic Flame Ward,Reduces damage the target takes from Fire by 20%. Additional spells can be layered over this.,20,780,287,10,Life Magic,0.01,43,16,0,1,1 -4676,Epic Frost Ward,Reduces damage the target takes from Cold by 20%. Additional spells can be layered over this.,20,780,289,10,Life Magic,0.01,51,16,0,1,1 -4677,Epic Piercing Ward,Reduces damage the target takes from Piercing by 20%. Additional spells can be layered over this.,20,780,405,10,Life Magic,0.01,45,16,0,1,1 -4678,Epic Slashing Ward,Reduces damage the target takes from Slashing by 20%. Additional spells can be layered over this.,20,780,403,10,Life Magic,0.01,47,16,0,1,1 -4679,Epic Storm Ward,Reduces damage the target takes from Lightning by 20%. Additional spells can be layered over this.,20,780,291,10,Life Magic,0.01,53,16,0,1,1 -4680,Epic Health Gain,Increases the rate at which the target regains Health by 45%. Additional spells can be layered over this.,45,780,257,10,Life Magic,0.01,37,16,5,1,1 -4681,Epic Mana Gain,Increases the rate at which the target regains Mana by 45%. Additional spells can be layered over this.,45,780,259,10,Life Magic,0.01,39,16,5,1,1 -4682,Epic Stamina Gain,Increases the rate at which the target regains Stamina by 45%. Additional spells can be layered over this.,45,780,407,10,Life Magic,0,41,16,5,1,1 -4683,Epic Alchemical Prowess,Increases the target's Alchemy skill by 25 points. Additional spells can be layered over this.,25,780,333,10,Creature Enchantment,0.01,26,16,0,1,1 -4684,Epic Arcane Prowess,Increases the target's Arcane Lore skill by 25 points. Additional spells can be layered over this.,25,780,335,10,Creature Enchantment,0.01,26,16,0,1,1 -4685,Epic Armor Tinkering Expertise,Increases the target's Armor Tinkering skill by 25 points. Additional spells can be layered over this.,25,780,337,10,Creature Enchantment,0.01,28,16,0,1,1 -4686,Epic Light Weapon Aptitude,Increases the target's Light Weapons skill by 25 points. Additional spells can be layered over this.,25,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -4687,Epic Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 25 points. Additional spells can be layered over this.,25,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -4688,Epic Cooking Prowess,Increases the target's Cooking skill by 25 points. Additional spells can be layered over this.,25,780,339,10,Creature Enchantment,0.01,20,16,0,1,1 -4689,Epic Creature Enchantment Aptitude,Increases the target's Creature Enchantment skill by 25 points. Additional spells can be layered over this.,25,780,251,10,Creature Enchantment,0.01,26,16,0,1,1 -4690,Epic Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 25 points. Additional spells can be layered over this.,25,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -4691,Epic Finesse Weapon Aptitude,Increases the target's Finesse Weapons skill by 25 points. Additional spells can be layered over this.,25,780,313,10,Creature Enchantment,0.01,18,16,0,1,1 -4692,Epic Fealty,Increases the target's Loyalty skill by 25 points. Additional spells can be layered over this.,25,780,345,10,Creature Enchantment,0.01,20,16,0,1,1 -4693,Epic Fletching Prowess,Increases the target's Fletching skill by 25 points. Additional spells can be layered over this.,25,780,347,10,Creature Enchantment,0.01,20,16,0,1,1 -4694,Epic Healing Prowess,Increases the target's Healing skill by 25 points. Additional spells can be layered over this.,25,780,349,10,Creature Enchantment,0.01,20,16,0,1,1 -4695,Epic Impregnability,Increases the target's Missile Defense skill by 25 points. Additional spells can be layered over this.,25,780,654,10,Creature Enchantment,0.01,22,16,0,1,1 -4696,Epic Invulnerability,Increases the target's Melee Defense skill by 25 points. Additional spells can be layered over this.,25,780,351,10,Creature Enchantment,0.01,22,16,0,1,1 -4697,Epic Item Enchantment Aptitude,Increases the target's Item Enchantment skill by 25 points. Additional spells can be layered over this.,25,780,253,10,Creature Enchantment,0.01,26,16,0,1,1 -4698,Epic Item Tinkering Expertise,Increases the target's Item Tinkering skill by 25 points. Additional spells can be layered over this.,25,780,353,10,Creature Enchantment,0.01,28,16,0,1,1 -4699,Epic Jumping Prowess,Increases the target's Jump skill by 25 points. Additional spells can be layered over this.,25,780,355,10,Creature Enchantment,0.01,24,16,0,1,1 -4700,Epic Life Magic Aptitude,Increases the target's Life Magic skill by 25 points. Additional spells can be layered over this.,25,780,357,10,Creature Enchantment,0.01,26,16,0,1,1 -4701,Epic Lockpick Prowess,Increases the target's Lockpick skill by 25 points. Additional spells can be layered over this.,25,780,359,10,Creature Enchantment,0.01,20,16,0,1,1 -4702,Epic Light Weapon Aptitude,Increases the target's Light Weapons skill by 25 points. Additional spells can be layered over this.,25,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -4703,Epic Magic Item Tinkering Expertise,Increases the target's Magic Item Tinkering skill by 25 points. Additional spells can be layered over this.,25,780,361,10,Creature Enchantment,0.01,28,16,0,1,1 -4704,Epic Magic Resistance,Increases the target's Magic Defense skill by 25 points. Additional spells can be layered over this.,25,780,299,10,Creature Enchantment,0.01,22,16,0,1,1 -4705,Epic Mana Conversion Prowess,Increases the target's Mana Conversion skill by 25 points. Additional spells can be layered over this.,25,780,363,10,Creature Enchantment,0.01,26,16,0,1,1 -4706,Epic Monster Attunement,Increases the target's Assess Creature skill by 25 points. Additional spells can be layered over this.,25,780,365,10,Creature Enchantment,0.01,28,16,0,1,1 -4707,Epic Person Attunement,Increases the target's Assess Person skill by 25 points. Additional spells can be layered over this.,25,780,367,10,Creature Enchantment,0.01,28,16,0,1,1 -4708,Epic Salvaging Aptitude,Increases the target's Salvaging skill by 25 points. Additional spells can be layered over this.,25,780,437,10,Creature Enchantment,0.01,26,16,0,1,1 -4709,Epic Light Weapon Aptitude,Increases the target's Light Weapons skill by 25 points. Additional spells can be layered over this.,25,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -4710,Epic Sprint,Increases the target's Run skill by 25 points. Additional spells can be layered over this.,25,780,369,10,Creature Enchantment,0.01,24,16,0,1,1 -4711,Epic Light Weapon Aptitude,Increases the target's Light Weapons skill by 25 points. Additional spells can be layered over this.,25,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -4712,Epic Heavy Weapon Aptitude,Increases the target's Heavy Weapons skill by 25 points. Additional spells can be layered over this.,25,780,371,10,Creature Enchantment,0.01,18,16,0,1,1 -4713,Epic Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 25 points. Additional spells can be layered over this.,25,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -4714,Epic Light Weapon Aptitude,Increases the target's Light Weapons skill by 25 points. Additional spells can be layered over this.,25,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -4715,Epic War Magic Aptitude,Increases the target's War Magic skill by 25 points. Additional spells can be layered over this.,25,780,255,10,Creature Enchantment,0.01,26,16,0,1,1 -4716,Burning Curse,Does 100-250 points of fire damage to the cursed target.,350,-1,80,70,Life Magic,0.15,32,16,35,0,1 -4717,Expedient Return to Ulgrim,Teleports target far above Ayan Baqur.,150,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -4718,Welcomed by the Blood Witches,This spell teleports the character to the Waiting Area of the Falatacot Visitor's Alcove.,999,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4719,Welcomed by the Blood Witches,This spell teleports the character to the Outer Receiving Chamber of the Falatacot Visitor's Alcove.,999,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4720,Welcomed by the Blood Witches,This spell teleports the character to the Inner Receiving Chamber of the Falatacot Visitor's Alcove.,999,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4721,Travel to the Ruins of Degar'Alesh,Instantly transports the target to the Ruins of Degar'Alesh.,400,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4722,Bleed Other,Decreases target's health by 10 every heart beat.,10,30,530,20,Life Magic,0.01,100,16,5,1,1 -4723,Bleed Self,Decreases caster's health by 10 every heart beat.,10,30,530,20,Life Magic,0.01,100,16,5,1,1 -4724,Gateway to Nyr'leha,The Gateway to Nyr'leha. ancient city from beneath the waves.,350,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4725,The Pit of Heretics,Sends the target to the Sclavus Pit.,350,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4726,Poison,Lowers the total health of the target by 15%. This spell can stack up to three times.,300,30,410,10,Creature Enchantment,0.01,7,16,5,0.25,1 -4727,Poison,Lowers the total health of the target by 15%. This spell can stack up to three times.,300,30,536,10,Creature Enchantment,0.01,7,16,5,0.25,1 -4728,Poison,Lowers the total health of the target by 15%. This spell can stack up to three times.,300,30,537,10,Creature Enchantment,0.01,7,16,5,0.25,1 -4729,Travel to the Catacombs of Tar'Kelyn,Instantly transports the target to the Catacombs of Tar'Kelyn.,400,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4730,Novice Duelist's Coordination,Increases the target's Coordination by 3 points.,1,1800,568,10,Creature Enchantment,0.01,6,16,0,1,1 -4731,Apprentice Duelist's Coordination,Increases the target's Coordination by 5 points.,2,1800,568,10,Creature Enchantment,0.01,6,16,0,1,1 -4732,Journeyman Duelist's Coordination,Increases the target's Coordination by 10 points.,3,1800,568,10,Creature Enchantment,0.01,6,16,0,1,1 -4733,Master Duelist's Coordination,Increases the target's Coordination by 20 points.,4,1800,568,10,Creature Enchantment,0.01,6,16,0,1,1 -4734,Novice Hero's Endurance,Increases the target's Endurance by 3 points.,1,1800,567,10,Creature Enchantment,0.01,6,16,0,1,1 -4735,Apprentice Hero's Endurance,Increases the target's Endurance by 5 points.,2,1800,567,10,Creature Enchantment,0.01,6,16,0,1,1 -4736,Journeyman Hero's Endurance,Increases the target's Endurance by 10 points.,3,1800,567,10,Creature Enchantment,0.01,6,16,0,1,1 -4737,Master Hero's Endurance,Increases the target's Endurance by 20 points.,4,1800,567,10,Creature Enchantment,0.01,6,16,0,1,1 -4738,Novice Sage's Focus,Increases the target's Focus by 3 points.,1,1800,570,10,Creature Enchantment,0.01,6,16,0,1,1 -4739,Apprentice Sage's Focus,Increases the target's Focus by 5 points.,2,1800,570,10,Creature Enchantment,0.01,6,16,0,1,1 -4740,Journeyman Sage's Focus,Increases the target's Focus by 10 points.,3,1800,570,10,Creature Enchantment,0.01,6,16,0,1,1 -4741,Master Sage's Focus,Increases the target's Focus by 20 points.,4,1800,570,10,Creature Enchantment,0.01,6,16,0,1,1 -4742,Novice Rover's Quickness,Increases the target's Quickness by 3 points.,1,1800,569,10,Creature Enchantment,0.01,6,16,0,1,1 -4743,Apprentice Rover's Quickness,Increases the target's Quickness by 5 points.,2,1800,569,10,Creature Enchantment,0.01,6,16,0,1,1 -4744,Journeyman Rover's Quickness,Increases the target's Quickness by 10 points.,3,1800,569,10,Creature Enchantment,0.01,6,16,0,1,1 -4745,Master Rover's Quickness,Increases the target's Quickness by 20 points.,4,1800,569,10,Creature Enchantment,0.01,6,16,0,1,1 -4746,Novice Brute's Strength,Increases the target's Strength by 3 points.,1,1800,566,10,Creature Enchantment,0.01,6,16,0,1,1 -4747,Apprentice Brute's Strength,Increases the target's Strength by 5 points.,2,1800,566,10,Creature Enchantment,0.01,6,16,0,1,1 -4748,Journeyman Brute's Strength,Increases the target's Strength by 10 points.,3,1800,566,10,Creature Enchantment,0.01,6,16,0,1,1 -4749,Master Brute's Strength,Increases the target's Strength by 20 points.,4,1800,566,10,Creature Enchantment,0.01,6,16,0,1,1 -4750,Novice Adherent's Willpower,Increases the target's Self by 3 points.,1,1800,571,10,Creature Enchantment,0.01,6,16,0,1,1 -4751,Apprentice Adherent's Willpower,Increases the target's Self by 5 points.,2,1800,571,10,Creature Enchantment,0.01,6,16,0,1,1 -4752,Journeyman Adherent's Willpower,Increases the target's Self by 10 points.,3,1800,571,10,Creature Enchantment,0.01,6,16,0,1,1 -4753,Master Adherent's Willpower,Increases the target's Self by 20 points.,4,1800,571,10,Creature Enchantment,0.01,6,16,0,1,1 -4754,Apprentice Survivor's Health,Increases maximum health by 3 points.,2,510,572,70,Life Magic,0.3,31,16,0,0,1 -4755,Journeyman Survivor's Health,Increases maximum health by 10 points.,3,510,572,70,Life Magic,0.3,31,16,0,0,1 -4756,Apprentice Clairvoyant's Mana,Increases maximum mana by 6 points.,2,510,574,70,Life Magic,0.3,33,16,0,0,1 -4757,Journeyman Clairvoyant's Mana,Increases maximum mana by 20 points.,3,510,574,70,Life Magic,0.3,33,16,0,0,1 -4758,Apprentice Tracker's Stamina,Increases maximum stamina by 6 points.,2,510,573,70,Life Magic,0.3,35,16,0,0,1 -4759,Journeyman Tracker's Stamina,Increases maximum stamina by 20 points.,3,510,573,70,Life Magic,0.3,35,16,0,0,1 -4760,Incidental Acid Resistance,Reduces damage the target takes from Acid by 2%. ,1,780,581,10,Life Magic,0.01,55,16,0,1,1 -4761,Crude Acid Resistance,Reduces damage the target takes from Acid by 5%. ,2,780,581,10,Life Magic,0.01,55,16,0,1,1 -4762,Effective Acid Resistance,Reduces damage the target takes from Acid by 10%. ,3,780,581,10,Life Magic,0.01,55,16,0,1,1 -4763,Masterwork Acid Resistance,Reduces damage the target takes from Acid by 20%. ,4,780,581,10,Life Magic,0.01,55,16,0,1,1 -4764,Incidental Bludgeoning Resistance,Reduces damage the target takes from Bludgeoning by 2%. ,1,780,578,10,Life Magic,0.01,55,16,0,1,1 -4765,Crude Bludgeoning Resistance,Reduces damage the target takes from Bludgeoning by 5%. ,2,780,578,10,Life Magic,0.01,55,16,0,1,1 -4766,Effective Bludgeoning Resistance,Reduces damage the target takes from Bludgeoning by 10%. ,3,780,578,10,Life Magic,0.01,55,16,0,1,1 -4767,Masterwork Bludgeoning Resistance,Reduces damage the target takes from Bludgeoning by 20%. ,4,780,578,10,Life Magic,0.01,55,16,0,1,1 -4768,Incidental Flame Resistance,Reduces damage the target takes from Fire by 2%. ,1,780,580,10,Life Magic,0.01,55,16,0,1,1 -4769,Crude Flame Resistance,Reduces damage the target takes from Fire by 5%. ,2,780,580,10,Life Magic,0.01,55,16,0,1,1 -4770,Effective Flame Resistance,Reduces damage the target takes from Fire by 10%. ,3,780,580,10,Life Magic,0.01,55,16,0,1,1 -4771,Masterwork Flame Resistance,Reduces damage the target takes from Fire by 20%. ,4,780,580,10,Life Magic,0.01,55,16,0,1,1 -4772,Incidental Frost Resistance,Reduces damage the target takes from Cold by 2%. ,1,780,582,10,Life Magic,0.01,55,16,0,1,1 -4773,Crude Frost Resistance,Reduces damage the target takes from Cold by 5%. ,2,780,582,10,Life Magic,0.01,55,16,0,1,1 -4774,Effective Frost Resistance,Reduces damage the target takes from Cold by 10%. ,3,780,582,10,Life Magic,0.01,55,16,0,1,1 -4775,Masterwork Frost Resistance,Reduces damage the target takes from Cold by 20%. ,4,780,582,10,Life Magic,0.01,55,16,0,1,1 -4776,Incidental Lightning Resistance,Reduces damage the target takes from Lightning by 2%. ,1,780,583,10,Life Magic,0.01,55,16,0,1,1 -4777,Crude Lightning Resistance,Reduces damage the target takes from Lightning by 5%. ,2,780,583,10,Life Magic,0.01,55,16,0,1,1 -4778,Effective Lightning Resistance,Reduces damage the target takes from Lightning by 10%. ,3,780,583,10,Life Magic,0.01,55,16,0,1,1 -4779,Masterwork Lightning Resistance,Reduces damage the target takes from Lightning by 20%. ,4,780,583,10,Life Magic,0.01,55,16,0,1,1 -4780,Incidental Piercing Resistance,Reduces damage the target takes from Piercing by 2%. ,1,780,579,10,Life Magic,0.01,55,16,0,1,1 -4781,Crude Piercing Resistance,Reduces damage the target takes from Piercing by 5%. ,2,780,579,10,Life Magic,0.01,55,16,0,1,1 -4782,Effective Piercing Resistance,Reduces damage the target takes from Piercing by 10%. ,3,780,579,10,Life Magic,0.01,55,16,0,1,1 -4783,Masterwork Piercing Resistance,Reduces damage the target takes from Piercing by 20%. ,4,780,579,10,Life Magic,0.01,55,16,0,1,1 -4784,Incidental Slashing Resistance,Reduces damage the target takes from Slashing by 2%. ,1,780,577,10,Life Magic,0.01,55,16,0,1,1 -4785,Crude Slashing Resistance,Reduces damage the target takes from Slashing by 5%. ,2,780,577,10,Life Magic,0.01,55,16,0,1,1 -4786,Effective Slashing Resistance,Reduces damage the target takes from Slashing by 10%. ,3,780,577,10,Life Magic,0.01,55,16,0,1,1 -4787,Masterwork Slashing Resistance,Reduces damage the target takes from Slashing by 20%. ,4,780,577,10,Life Magic,0.01,55,16,0,1,1 -4788,Novice Concoctor's Alchemy Aptitude,Increases the target's Alchemy skill by 3 points.,1,1800,559,10,Creature Enchantment,0.01,20,16,0,1,1 -4789,Apprentice Concoctor's Alchemy Aptitude,Increases the target's Alchemy skill by 5 points.,2,1800,559,10,Creature Enchantment,0.01,20,16,0,1,1 -4790,Journeyman Concoctor's Alchemy Aptitude,Increases the target's Alchemy skill by 10 points.,3,1800,559,10,Creature Enchantment,0.01,20,16,0,1,1 -4791,Master Concoctor's Alchemy Aptitude,Increases the target's Alchemy skill by 20 points.,4,1800,559,10,Creature Enchantment,0.01,20,16,0,1,1 -4792,Novice Armorer's Armor Tinkering Aptitude,Increases the target's Armor Tinkering skill by 3 points.,1,1800,561,10,Creature Enchantment,0.01,20,16,0,1,1 -4793,Apprentice Armorer's Armor Tinkering Aptitude,Increases the target's Armor Tinkering skill by 5 points.,2,1800,561,10,Creature Enchantment,0.01,20,16,0,1,1 -4794,Journeyman Armorer's Armor Tinkering Aptitude,Increases the target's Armor Tinkering skill by 10 points.,3,1800,561,10,Creature Enchantment,0.01,20,16,0,1,1 -4795,Master Armorer's Armor Tinkering Aptitude,Increases the target's Armor Tinkering skill by 20 points.,4,1800,561,10,Creature Enchantment,0.01,20,16,0,1,1 -4796,Novice Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 3 points.,1,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4797,Apprentice Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 5 points.,2,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4798,Journeyman Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 10 points.,3,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4799,Master Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 20 points.,4,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4800,Novice Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 3 points.,1,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4801,Apprentice Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 5 points.,2,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4802,Journeyman Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 10 points.,3,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4803,Master Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 20 points.,4,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4804,Novice Chef's Cooking Aptitude,Increases the target's Cooking skill by 3 points.,1,1800,556,10,Creature Enchantment,0.01,20,16,0,1,1 -4805,Apprentice Chef's Cooking Aptitude,Increases the target's Cooking skill by 5 points.,2,1800,556,10,Creature Enchantment,0.01,20,16,0,1,1 -4806,Journeyman Chef's Cooking Aptitude,Increases the target's Cooking skill by 10 points.,3,1800,556,10,Creature Enchantment,0.01,20,16,0,1,1 -4807,Master Chef's Cooking Aptitude,Increases the target's Cooking skill by 20 points.,4,1800,556,10,Creature Enchantment,0.01,20,16,0,1,1 -4808,Novice Enchanter's Creature Aptitude,Increases the target's Creature Enchantment skill by 3 points.,1,1800,549,10,Creature Enchantment,0.01,18,16,0,1,1 -4809,Apprentice Enchanter's Creature Aptitude,Increases the target's Creature Enchantment skill by 5 points.,2,1800,549,10,Creature Enchantment,0.01,18,16,0,1,1 -4810,Journeyman Enchanter's Creature Aptitude,Increases the target's Creature Enchantment skill by 10 points.,3,1800,549,10,Creature Enchantment,0.01,18,16,0,1,1 -4811,Master Enchanter's Creature Aptitude,Increases the target's Creature Enchantment skill by 20 points.,4,1800,549,10,Creature Enchantment,0.01,18,16,0,1,1 -4812,Novice Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 3 points.,1,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4813,Apprentice Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 5 points.,2,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4814,Journeyman Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 10 points.,3,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4815,Master Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 20 points.,4,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4816,Novice Soldier's Finesse Weapon Aptitude,Increases the target's Finesse Weapons skill by 3 points.,1,1800,540,10,Creature Enchantment,0.01,18,16,0,1,1 -4817,Apprentice Soldier's Finesse Weapon Aptitude,Increases the target's Finesse Weapons skill by 5 points.,2,1800,540,10,Creature Enchantment,0.01,18,16,0,1,1 -4818,Journeyman Soldier's Finesse Weapon Aptitude,Increases the target's Finesse Weapons skill by 10 points.,3,1800,540,10,Creature Enchantment,0.01,18,16,0,1,1 -4819,Master Soldier's Finesse Weapon Aptitude,Increases the target's Finesse Weapons skill by 20 points.,4,1800,540,10,Creature Enchantment,0.01,18,16,0,1,1 -4820,Novice Huntsman's Fletching Aptitude,Increases the target's Fletching skill by 3 points.,1,1800,557,10,Creature Enchantment,0.01,20,16,0,1,1 -4821,Apprentice Huntsman's Fletching Aptitude,Increases the target's Fletching skill by 5 points.,2,1800,557,10,Creature Enchantment,0.01,20,16,0,1,1 -4822,Journeyman Huntsman's Fletching Aptitude,Increases the target's Fletching skill by 10 points.,3,1800,557,10,Creature Enchantment,0.01,20,16,0,1,1 -4823,Master Huntsman's Fletching Aptitude,Increases the target's Fletching skill by 20 points.,4,1800,557,10,Creature Enchantment,0.01,20,16,0,1,1 -4824,Novice Artifex's Item Aptitude,Increases the target's Item Enchantment skill by 3 points.,1,1800,548,10,Creature Enchantment,0.01,18,16,0,1,1 -4825,Apprentice Artifex's Item Aptitude,Increases the target's Item Enchantment skill by 5 points.,2,1800,548,10,Creature Enchantment,0.01,18,16,0,1,1 -4826,Journeyman Artifex's Item Aptitude,Increases the target's Item Enchantment skill by 10 points.,3,1800,548,10,Creature Enchantment,0.01,18,16,0,1,1 -4827,Master Artifex's Item Aptitude,Increases the target's Item Enchantment skill by 20 points.,4,1800,548,10,Creature Enchantment,0.01,18,16,0,1,1 -4828,Novice Inventor's Item Tinkering Aptitude,Increases the target's Item Tinkering skill by 3 points.,1,1800,563,10,Creature Enchantment,0.01,20,16,0,1,1 -4829,Apprentice Inventor's Item Tinkering Aptitude,Increases the target's Item Tinkering skill by 5 points.,2,1800,563,10,Creature Enchantment,0.01,20,16,0,1,1 -4830,Journeyman Inventor's Item Tinkering Aptitude,Increases the target's Item Tinkering skill by 10 points.,3,1800,563,10,Creature Enchantment,0.01,20,16,0,1,1 -4831,Master Inventor's Item Tinkering Aptitude,Increases the target's Item Tinkering skill by 20 points.,4,1800,563,10,Creature Enchantment,0.01,20,16,0,1,1 -4832,Novice Leaper's Jumping Aptitude,Increases the target's Jump skill by 3 points.,1,1800,576,10,Creature Enchantment,0.01,18,16,0,1,1 -4833,Apprentice Leaper's Jumping Aptitude,Increases the target's Jump skill by 5 points.,2,1800,576,10,Creature Enchantment,0.01,18,16,0,1,1 -4834,Journeyman Leaper's Jumping Aptitude,Increases the target's Jump skill by 10 points.,3,1800,576,10,Creature Enchantment,0.01,18,16,0,1,1 -4835,Master Leaper's Jumping Aptitude,Increases the target's Jump skill by 20 points.,4,1800,576,10,Creature Enchantment,0.01,18,16,0,1,1 -4836,Novice Theurge's Life Magic Aptitude,Increases the target's Life Magic skill by 3 points.,1,1800,551,10,Creature Enchantment,0.01,18,16,0,1,1 -4837,Apprentice Theurge's Life Magic Aptitude,Increases the target's Life Magic skill by 5 points.,2,1800,551,10,Creature Enchantment,0.01,18,16,0,1,1 -4838,Journeyman Theurge's Life Magic Aptitude,Increases the target's Life Magic skill by 10 points.,3,1800,551,10,Creature Enchantment,0.01,18,16,0,1,1 -4839,Master Theurge's Life Magic Aptitude,Increases the target's Life Magic skill by 20 points.,4,1800,551,10,Creature Enchantment,0.01,18,16,0,1,1 -4840,Novice Locksmith's Lockpick Aptitude,Increases the target's Lockpick skill by 3 points.,1,1800,558,10,Creature Enchantment,0.01,20,16,0,1,1 -4841,Apprentice Locksmith's Lockpick Aptitude,Increases the target's Lockpick skill by 5 points.,2,1800,558,10,Creature Enchantment,0.01,20,16,0,1,1 -4842,Journeyman Locksmith's Lockpick Aptitude,Increases the target's Lockpick skill by 10 points.,3,1800,558,10,Creature Enchantment,0.01,20,16,0,1,1 -4843,Master Locksmith's Lockpick Aptitude,Increases the target's Lockpick skill by 20 points.,4,1800,558,10,Creature Enchantment,0.01,20,16,0,1,1 -4844,Yeoman's Loyalty,Increases the target's Loyalty skill by 3 points.,1,1800,565,10,Creature Enchantment,0.01,18,16,0,1,1 -4845,Squire's Loyalty,Increases the target's Loyalty skill by 5 points.,2,1800,565,10,Creature Enchantment,0.01,18,16,0,1,1 -4846,Novice Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 3 points.,1,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4847,Apprentice Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 5 points.,2,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4848,Journeyman Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 10 points.,3,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4849,Master Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 20 points.,4,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4850,Novice Negator's Magic Resistance,Increases the target's Magic Defense skill by 3 points.,1,1800,554,10,Creature Enchantment,0.01,18,16,0,1,1 -4851,Apprentice Negator's Magic Resistance,Increases the target's Magic Defense skill by 5 points.,2,1800,554,10,Creature Enchantment,0.01,18,16,0,1,1 -4852,Journeyman Negator's Magic Resistance,Increases the target's Magic Defense skill by 10 points.,3,1800,554,10,Creature Enchantment,0.01,18,16,0,1,1 -4853,Master Negator's Magic Resistance,Increases the target's Magic Defense skill by 20 points.,4,1800,554,10,Creature Enchantment,0.01,18,16,0,1,1 -4854,Novice Arcanist's Magic Item Tinkering Aptitude,Increases the target's Magic Item Tinkering skill by 3 points.,1,1800,564,10,Creature Enchantment,0.01,20,16,0,1,1 -4855,Apprentice Arcanist's Magic Item Tinkering Aptitude,Increases the target's Magic Item Tinkering skill by 5 points.,2,1800,564,10,Creature Enchantment,0.01,20,16,0,1,1 -4856,Journeyman Arcanist's Magic Item Tinkering Aptitude,Increases the target's Magic Item Tinkering skill by 10 points.,3,1800,564,10,Creature Enchantment,0.01,20,16,0,1,1 -4857,Master Arcanist's Magic Item Tinkering Aptitude,Increases the target's Magic Item Tinkering skill by 20 points.,4,1800,564,10,Creature Enchantment,0.01,20,16,0,1,1 -4858,Novice Guardian's Invulnerability,Increases the target's Melee Defense skill by 3 points.,1,1800,552,10,Creature Enchantment,0.01,18,16,0,1,1 -4859,Apprentice Guardian's Invulnerability,Increases the target's Melee Defense skill by 5 points.,2,1800,552,10,Creature Enchantment,0.01,18,16,0,1,1 -4860,Journeyman Guardian's Invulnerability,Increases the target's Melee Defense skill by 10 points.,3,1800,552,10,Creature Enchantment,0.01,18,16,0,1,1 -4861,Master Guardian's Invulnerability,Increases the target's Melee Defense skill by 20 points.,4,1800,552,10,Creature Enchantment,0.01,18,16,0,1,1 -4862,Novice Wayfarer's Impregnability,Increases the target's Missile Defense skill by 3 points.,1,1800,553,10,Creature Enchantment,0.01,18,16,0,1,1 -4863,Apprentice Wayfarer's Impregnability,Increases the target's Missile Defense skill by 5 points.,2,1800,553,10,Creature Enchantment,0.01,18,16,0,1,1 -4864,Journeyman Wayfarer's Impregnability,Increases the target's Missile Defense skill by 10 points.,3,1800,553,10,Creature Enchantment,0.01,18,16,0,1,1 -4865,Master Wayfarer's Impregnability,Increases the target's Missile Defense skill by 20 points.,4,1800,553,10,Creature Enchantment,0.01,18,16,0,1,1 -4866,Novice Scavenger's Salvaging Aptitude,Increases the target's Salvaging skill by 3 points.,1,1800,560,10,Creature Enchantment,0.01,20,16,0,1,1 -4867,Apprentice Scavenger's Salvaging Aptitude,Increases the target's Salvaging skill by 5 points.,2,1800,560,10,Creature Enchantment,0.01,20,16,0,1,1 -4868,Novice Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 3 points.,1,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4869,Apprentice Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 5 points.,2,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4870,Journeyman Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 10 points.,3,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4871,Master Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 20 points.,4,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4872,Novice Messenger's Sprint Aptitude,Increases the target's Run skill by 3 points.,1,1800,575,10,Creature Enchantment,0.01,18,16,0,1,1 -4873,Apprentice Messenger's Sprint Aptitude,Increases the target's Run skill by 5 points.,2,1800,575,10,Creature Enchantment,0.01,18,16,0,1,1 -4874,Journeyman Messenger's Sprint Aptitude,Increases the target's Run skill by 10 points.,3,1800,575,10,Creature Enchantment,0.01,18,16,0,1,1 -4875,Master Messenger's Sprint Aptitude,Increases the target's Run skill by 20 points.,4,1800,575,10,Creature Enchantment,0.01,18,16,0,1,1 -4876,Novice Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 3 points.,1,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4877,Apprentice Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 5 points.,2,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4878,Journeyman Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 10 points.,3,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4879,Master Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 20 points.,4,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4880,Novice Soldier's Heavy Weapon Aptitude,Increases the target's Heavy Weapons skill by 3 points.,1,1800,538,10,Creature Enchantment,0.01,18,16,0,1,1 -4881,Apprentice Soldier's Heavy Weapon Aptitude,Increases the target's Heavy Weapons skill by 5 points.,2,1800,538,10,Creature Enchantment,0.01,18,16,0,1,1 -4882,Journeyman Soldier's Heavy Weapon Aptitude,Increases the target's Heavy Weapons skill by 10 points.,3,1800,538,10,Creature Enchantment,0.01,18,16,0,1,1 -4883,Master Soldier's Heavy Weapon Aptitude,Increases the target's Heavy Weapons skill by 20 points.,4,1800,538,10,Creature Enchantment,0.01,18,16,0,1,1 -4884,Novice Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 3 points.,1,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4885,Apprentice Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 5 points.,2,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4886,Journeyman Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 10 points.,3,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4887,Master Archer's Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 20 points.,4,1800,545,10,Creature Enchantment,0.01,18,16,0,1,1 -4888,Novice Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 3 points.,1,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4889,Apprentice Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 5 points.,2,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4890,Journeyman Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 10 points.,3,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4891,Master Soldier's Light Weapon Aptitude,Increases the target's Light Weapons skill by 20 points.,4,1800,539,10,Creature Enchantment,0.01,18,16,0,1,1 -4892,Novice Warlock's War Magic Aptitude,Increases the target's War Magic skill by 3 points.,1,1800,550,10,Creature Enchantment,0.01,18,16,0,1,1 -4893,Apprentice Warlock's War Magic Aptitude,Increases the target's War Magic skill by 5 points.,2,1800,550,10,Creature Enchantment,0.01,18,16,0,1,1 -4894,Journeyman Warlock's War Magic Aptitude,Increases the target's War Magic skill by 10 points.,3,1800,550,10,Creature Enchantment,0.01,18,16,0,1,1 -4895,Master Warlock's War Magic Aptitude,Increases the target's War Magic skill by 20 points.,4,1800,550,10,Creature Enchantment,0.01,18,16,0,1,1 -4896,Novice Swordsmith's Weapon Tinkering Aptitude,Increases the target's Weapon Tinkering skill by 3 points.,1,1800,562,10,Creature Enchantment,0.01,20,16,0,1,1 -4897,Apprentice Swordsmith's Weapon Tinkering Aptitude,Increases the target's Weapon Tinkering skill by 5 points.,2,1800,562,10,Creature Enchantment,0.01,20,16,0,1,1 -4898,Journeyman Swordsmith's Weapon Tinkering Aptitude,Increases the target's Weapon Tinkering skill by 10 points.,3,1800,562,10,Creature Enchantment,0.01,20,16,0,1,1 -4899,Master Swordsmith's Weapon Tinkering Aptitude,Increases the target's Weapon Tinkering skill by 20 points.,4,1800,562,10,Creature Enchantment,0.01,20,16,0,1,1 -4900,Society Initiate's Blessing,Increases all attributes by 3. This effect layers on top of normal spells as well as cantrips.,3,3600,517,10,Creature Enchantment,0.01,8,16,0,1,1 -4901,Society Adept's Blessing,Increases all attributes by 6. This effect layers on top of normal spells as well as cantrips.,6,3600,517,10,Creature Enchantment,0.01,8,16,0,1,1 -4902,Society Knight's Blessing,Increases all attributes by 9. This effect layers on top of normal spells as well as cantrips.,9,3600,517,10,Creature Enchantment,0.01,8,16,0,1,1 -4903,Society Lord's Blessing,Increases all attributes by 12. This effect layers on top of normal spells as well as cantrips.,12,3600,517,10,Creature Enchantment,0.01,8,16,0,1,1 -4904,Society Master's Blessing,Increases all attributes by 15. This effect layers on top of normal spells as well as cantrips.,15,3600,517,10,Creature Enchantment,0.01,8,16,0,1,1 -4905,Novice Challenger's Rejuvenation,Increases the rate at which the target regains Stamina by 30%.,1,2700,555,10,Life Magic,0.01,41,16,0,1,1 -4906,Apprentice Challenger's Rejuvenation,Increases the rate at which the target regains Stamina by 100%.,2,2700,555,10,Life Magic,0.01,41,16,0,1,1 -4907,Celestial Hand Stronghold Recall,Sends the caster to the Celestial Hand Stronghold.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -4908,Eldrytch Web Stronghold Recall,Sends the caster to the Eldrytch Web Stronghold.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -4909,Radiant Blood Stronghold Recall,Sends the caster to the Radiant Blood Stronghold.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -4910,Raider Tag,Drains 1-2 points of the target's Health.,1,-1,80,50,Life Magic,0.01,32,16,40,0,1 -4911,Epic Armor,Increases the target's natural armor by 60 points. Additional spells can be layered over this.,60,780,379,10,Life Magic,0.01,55,16,0,1,1 -4912,Epic Weapon Tinkering Expertise,Increases the target's Weapon Tinkering skill by 25 points. Additional spells can be layered over this.,25,780,377,10,Creature Enchantment,0.01,28,16,0,1,1 -4913,Aerlinthe Pyramid Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4914,Aerlinthe Pyramid Portal Exit,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4915,A'mun Pyramid Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4916,A'mun Pyramid Portal Exit,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4917,Esper Pyramid Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4918,Esper Pyramid Portal Exit,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4919,Halaetan Pyramid Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4920,Halaetan Pyramid Portal Exit,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4921,Linvak Pyramid Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4922,Linvak Pyramid Portal Exit,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4923,Obsidian Pyramid Portal Sending,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4924,Obsidian Pyramid Portal Exit,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4925,Dance,Causes the target to dance uncontrollably.,800,30,198,70,Creature Enchantment,0.15,0,16,0,0,1 -4926,Smite,Drains 400-800 points of the target's Health.,400,-1,80,10,Life Magic,0.01,150,16,90,0.1,1 -4927,Incantation of Acid Stream with 300 Spellpower,Shoots a stream of acid at the target. The stream does 135-195 points of acid damage to the first thing it hits.,300,-1,117,40,War Magic,0.15,0,16,30,0.2,1 -4928,Incantation of Acid Stream with 350 Spellpower,Shoots a stream of acid at the target. The stream does 135-195 points of acid damage to the first thing it hits.,350,-1,117,40,War Magic,0.15,0,16,30,0.2,1 -4929,Harm,Drains 5-10 points of the target's Health.,1,-1,80,10,Life Magic,0.01,32,16,8,0.1,1 -4930,Flame Bolt I,Shoots a mini fireball,900,-1,121,5,War Magic,0,0,16,30,0.7,1 -4931,Mini Fireball,Shoots a mini fireball,900,-1,121,5,War Magic,0,0,16,30,0.7,1 -4932,Mini Fireball,Shoots a mini fireball,900,-1,121,5,War Magic,0,0,16,30,0.7,1 -4933,Slowness,Decreases the target's Quickness by 9 points.,1,5,6,10,Creature Enchantment,0.01,13,16,10,0.5,1 -4934,Slowness,Decreases the target's Quickness by 9 points.,1,10,6,10,Creature Enchantment,0.01,13,16,10,0.5,1 -4935,Slowness,Decreases the target's Quickness by 9 points.,1,20,6,10,Creature Enchantment,0.01,13,16,10,0.5,1 -4936,Flame Bolt I,Shoots a mini iceball,900,-1,121,5,War Magic,0,0,16,30,0.7,1 -4937,Flame Bolt I,Shoots a mini iceball,900,-1,121,5,War Magic,0,0,16,30,0.7,1 -4938,Flame Bolt I,Shoots a mini arrow,900,-1,121,5,War Magic,0,0,16,30,0.7,1 -4939,Mini Uber,Shoots a bolt of elemental energy at the target.,900,-1,121,50,War Magic,0.15,0,16,30,1,1 -4940,Mini Ring,Shoots eight waves of force outward from the caster.,200,-1,227,80,War Magic,0.2,0,0,1,0,1 -4941,Mini Ring,Shoots eight waves of force outward from the caster.,200,-1,227,80,War Magic,0.2,0,0,1.2,0,1 -4942,Mini Ring,Shoots eight waves of force outward from the caster.,200,-1,227,80,War Magic,0.2,0,0,1.4,0,1 -4943,Mini Fireball,Shoots a mini fireball,900,-1,121,5,War Magic,0,0,16,30,0.7,1 -4944,Slowness,Decreases the target's Quickness by 9 points.,1,40,6,10,Creature Enchantment,0.01,13,16,10,0.5,1 -4945,Flame Bolt I,Shoots a mini arrow,900,-1,121,5,War Magic,0,0,16,30,0.7,1 -4946,Mini Ring,Shoots eight waves of force outward from the caster.,200,-1,227,80,War Magic,0.2,0,0,1.8,0,1 -4947,Harm,Drains 10-20 points of the target's Health.,1,-1,80,10,Life Magic,0.01,32,16,8,0.1,1 -4948,Harm,Drains 20-30 points of the target's Health.,1,-1,80,10,Life Magic,0.01,32,16,8,0.1,1 -4949,Harm,Drains 60-80 points of the target's Health.,1,-1,80,10,Life Magic,0.01,32,16,8,0.1,1 -4950,Tactical Defense,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4951,Tactical Defense,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4952,Tactical Defense,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4953,Test Portal,Target is portaled for testing purposes and doesn't really go anywhere.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4954,Crystalline Portal,Target is portaled into up to the Crystalline Crag,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4955,Portal Space Eddy,Target is portaled for testing purposes and doesn't really go anywhere,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4956,Tanada Sanctum Portal Sending,This spell sends the player to the Tanada Clan inner sanctum.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4957,Tanada Sanctum Return,This spell sends the player to Tanada Sajo in Hebian-To.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4958,Greater Rockslide,Increases the target's Missile Weapons skill by 55 points.,450,5400,19,80,Creature Enchantment,0.3,18,257,25,0,1 -4959,Lesser Rockslide,Increases the target's Missile Weapons skill by 45 points.,400,5400,19,80,Creature Enchantment,0.3,18,257,25,0,1 -4960,Lesser Rockslide,Increases the target's Missile Weapons skill by 45 points.,400,5400,19,80,Creature Enchantment,0.3,18,257,25,0,1 -4961,Lesser Rockslide,Increases the target's Missile Weapons skill by 45 points.,400,5400,19,80,Creature Enchantment,0.3,18,257,25,0,1 -4962,Rockslide,Increases the target's Missile Weapons skill by 50 points.,425,5400,19,80,Creature Enchantment,0.3,18,257,25,0,1 -4963,Rockslide,Increases the target's Missile Weapons skill by 50 points.,425,5400,19,80,Creature Enchantment,0.3,18,257,25,0,1 -4964,Rockslide,Increases the target's Missile Weapons skill by 50 points.,425,5400,19,80,Creature Enchantment,0.3,18,257,25,0,1 -4965,Greater Rockslide,Increases the target's Missile Weapons skill by 55 points.,450,5400,19,80,Creature Enchantment,0.3,18,257,25,0,1 -4966,Greater Rockslide,Increases the target's Missile Weapons skill by 55 points.,450,5400,19,80,Creature Enchantment,0.3,18,257,25,0,1 -4967,Cleansing Ring of Fire,Shoots eight waves of flame outward from the caster. Each wave does 31-52 points of fire damage to the first thing it hits.,200,-1,226,80,War Magic,0.2,0,0,4.5,0,1 -4968,Ranger's Boon,Increases the target's Missile Weapons skill by 15 points. Additional spells can be layered over this.,2,780,439,10,Creature Enchantment,0.01,18,16,0,1,1 -4969,Ranger's Boon,Increases the target's Missile Weapons skill by 15 points. Additional spells can be layered over this.,2,780,439,10,Creature Enchantment,0.01,18,16,0,1,1 -4970,Ranger's Boon,Increases the target's Missile Weapons skill by 15 points. Additional spells can be layered over this.,2,780,439,10,Creature Enchantment,0.01,18,16,0,1,1 -4971,Enchanter's Boon,Increases the target's Creature Enchantment skill by 15 points. Additional spells can be layered over this.,2,780,430,10,Creature Enchantment,0.01,26,16,0,1,1 -4972,Hieromancer's Boon,Increases the target's War Magic skill by 15 points. Additional spells can be layered over this.,2,780,426,10,Creature Enchantment,0.01,26,16,0,1,1 -4973,Fencer's Boon,Increases the target's Finesse Weapons skill by 15 points. Additional spells can be layered over this.,2,780,442,10,Creature Enchantment,0.01,18,16,0,1,1 -4974,Life Giver's Boon,Increases the target's Life Magic skill by 15 points. Additional spells can be layered over this.,2,780,429,10,Creature Enchantment,0.01,26,16,0,1,1 -4975,Kern's Boon,Increases the target's Light Weapons skill by 15 points. Additional spells can be layered over this.,2,600,438,10,Creature Enchantment,0.01,18,16,0,1,1 -4976,Kern's Boon,Increases the target's Light Weapons skill by 15 points. Additional spells can be layered over this.,2,600,438,10,Creature Enchantment,0.01,18,16,0,1,1 -4977,Kern's Boon,Increases the target's Light Weapons skill by 15 points. Additional spells can be layered over this.,2,600,438,10,Creature Enchantment,0.01,18,16,0,1,1 -4978,Kern's Boon,Increases the target's Light Weapons skill by 15 points. Additional spells can be layered over this.,2,600,438,10,Creature Enchantment,0.01,18,16,0,1,1 -4979,Soldier's Boon,Increases the target's Heavy Weapons skill by 15 points. Additional spells can be layered over this.,2,780,447,10,Creature Enchantment,0.01,18,16,0,1,1 -4980,Kern's Boon,Increases the target's Light Weapons skill by 15 points. Additional spells can be layered over this.,2,600,438,10,Creature Enchantment,0.01,18,16,0,1,1 -4981,Incantation of Stamina to Mana Self,Drains one-half of the caster's Stamina and gives 200% of that to his/her Mana.,400,-1,89,80,Life Magic,0.15,76,16,0,0,0 -4982,Nimble Fingers - Lockpick,Increases the target's Lockpick skill by 5 points. This stacks with all other Lockpick bonuses. ,5,360,584,70,Creature Enchantment,0.15,20,16,5,0.25,1 -4983,Nimble Fingers - Alchemy,Increases the caster's Alchemy skill by 5 points. This stacks with all other Alchemy bonuses. ,5,360,587,50,Creature Enchantment,0.15,26,16,0,0,1 -4984,Nimble Fingers - Cooking,Increases the target's Cooking skill by 5 points. This stacks with all other Cooking bonuses. ,5,360,586,70,Creature Enchantment,0.15,20,16,5,0.25,1 -4985,Nimble Fingers - Fletching,Increases the target's Fletching skill by 5 points. This stacks with all other Fletching bonuses. ,5,360,585,50,Creature Enchantment,0.2,20,16,5,0.4,1 -4986,Assassin's Alchemy Kit,Increases the caster's Alchemy skill by 1%. This increase stacks with all other Alchemy increases.,1,360,592,50,Creature Enchantment,0.15,26,16,0,0,1 -4987,Olthoi Spit,A spell-like projectile of condensed olthoi acid.,1,-1,117,5,War Magic,0.01,0,16,30,0.7,1 -4988,Tunnel Out,The olthoi matron tunnels away.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4989,Mysterious Portal,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4990,Floor Puzzle Bypass,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4991,Jump Puzzle Bypass,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4992,Direct Assassin Access,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4993,Portal to Derethian Combat Arena,Transports the target to the PK Challenge.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4994,Get over here!,The assassin teleports you to her.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4995,Portal to Derethian Combat Arena,Transports the target to the PK Challenge.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4996,Portal to Derethian Combat Arena,Transports the target to the PK Challenge.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4997,Portal to Derethian Combat Arena,Transports the target to the PK Challenge.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -4998,Arena Stamina,Increases maximum stamina by 25 points.,15,180,281,70,Life Magic,0.3,35,16,0,0,1 -4999,Arena Life,Increases maximum health by 25 points.,15,180,279,70,Life Magic,0.3,31,16,0,0,1 -5000,Arena Mana,Increases maximum mana by 25 points.,250,180,283,70,Life Magic,0.3,33,16,0,0,1 -5001,Arena Piercing Protection Other,Reduces damage the target takes from Piercing by 70%,400,180,111,80,Life Magic,0.15,45,16,5,0.25,0 -5002,Arena Acid Protection Other,Reduces damage the target takes from acid by 70%,400,180,101,80,Life Magic,0.15,49,16,5,0.25,0 -5003,Arena Blade Protection Other,Reduces damage the target takes from Slashing by 70%,400,180,113,80,Life Magic,0.15,47,16,5,0.25,0 -5004,Arena Bludgeoning Protection Other,Reduces damage the target takes from Bludgeoning by 70%,400,180,103,80,Life Magic,0.15,55,16,5,0.25,0 -5005,Arena Cold Protection Other,Reduces damage the target takes from Cold by 70%,400,180,105,80,Life Magic,0.15,51,16,5,0.25,0 -5006,Arena Fire Protection Other,Reduces damage the target takes from fire by 70%,400,180,109,80,Life Magic,0.15,43,16,5,0.25,0 -5007,Arena Lightning Protection Other,Reduces damage the target takes from Lightning by 70%,400,180,107,80,Life Magic,0.15,53,16,5,0.25,0 -5008,Apostate Nexus Portal Sending,Teleports the user to the Apostate Nexus dungeon.,200,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5009,Aerfalle's Greater Ward,Improves a shield or piece of armor's armor value by 400 points.,401,3600,160,60,Item Enchantment,0.3,142,6,25,0,1 -5010,Entering Aerfalle's Sanctum,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5011,Geomantic Raze,Drains 150-300 points of the target's Health.,400,-1,80,70,Life Magic,0.15,32,16,35,0,1 -5012,Mar'uun,A portal to the town of Mar'uun; there is something strange about it.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5013,Mar'uun,A portal to the town of Mar'uun; there is something strange about it.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5014,Mar'uun,A portal to the town of Mar'uun; there is something strange about it.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5015,Mar'uun,A portal to the town of Mar'uun; there is something strange about it.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5016,Mar'uun,A portal to the town of Mar'uun; there is something strange about it.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5017,Mar'uun,A portal to the town of Mar'uun; there is something strange about it.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5018,Story of the Unknown Warrior,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5019,Portalspace Rift,A rift in portal space.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5020,Portalspace Rift,A rift in portal space.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5021,Portalspace Rift,A rift in portal space.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5022,Portalspace Rift,A rift in portal space.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5023,Spectral Two Handed Combat Mastery,Increases the caster's Two Handed Combat skill by 150 points for 9 minutes.,250,540,598,70,Creature Enchantment,0.15,18,16,0,0,1 -5024,Spectral Item Expertise,Increases the caster's Item Tinkering skill by 150 points.,600,900,453,70,Creature Enchantment,0.15,28,16,0,0,1 -5025,Prodigal Item Expertise,Increases the caster's Item Tinkering skill by 250 points.,600,900,453,70,Creature Enchantment,0.15,28,16,0,0,1 -5026,Prodigal Two Handed Combat Mastery,Increases the caster's Two Handed Combat skill by 250 points.,600,900,598,70,Creature Enchantment,0.15,18,16,0,0,1 -5027,Greater Cascade,Increases the target's Two Handed Combat skill by 15 points.,15,780,595,30,Creature Enchantment,0.1,18,16,5,0.7,1 -5028,Lesser Cascade,Increases the target's Two Handed Combat skill by 8 points.,8,780,595,30,Creature Enchantment,0.1,18,16,5,0.7,1 -5029,Cascade,Increases the target's Two Handed Combat skill by 12 points.,12,780,595,30,Creature Enchantment,0.1,18,16,5,0.7,1 -5030,Two Handed Fighter's Boon,Increases the target's Two Handed Combat skill by 2 points. Additional spells can be layered over this.,2,780,597,10,Creature Enchantment,0.01,18,16,0,1,1 -5031,Two Handed Fighter's Boon,Increases the target's Two Handed Combat skill by 15 points. Additional spells can be layered over this.,2,780,597,10,Creature Enchantment,0.01,18,16,0,1,1 -5032,Incantation of Two Handed Combat Mastery Self,Increases the caster's Two Handed Combat skill by 45 points.,400,5400,593,80,Creature Enchantment,0.15,18,16,0,0,1 -5033,Epic Item Tinkering Expertise,Increases the target's Item Tinkering skill by 25 points. Additional spells can be layered over this.,25,780,353,10,Creature Enchantment,0.01,28,16,0,1,1 -5034,Epic Two Handed Combat Aptitude,Increases the target's Two Handed Combat skill by 25 points. Additional spells can be layered over this.,25,780,595,10,Creature Enchantment,0.01,18,16,0,1,1 -5035,Feeble Sword Aptitude,Increases the target's Sword skill by 3 points. Additional spells can be layered over this.,3,780,595,10,Creature Enchantment,0.01,18,16,0,1,1 -5036,Feeble Two Handed Combat Aptitude,Increases the target's Two Handed Combat skill by 3 points. Additional spells can be layered over this.,3,780,595,10,Creature Enchantment,0.01,18,16,0,1,1 -5037,Item Tinkering Ignorance Other I,Decreases the target's Item Tinkering skill by 10 points.,1,60,58,10,Creature Enchantment,0.01,29,16,0,1,1 -5038,Item Tinkering Ignorance Other II,Decreases the target's Item Tinkering skill by 15 points.,75,90,58,20,Creature Enchantment,0.05,29,16,5,0.85,1 -5039,Item Tinkering Ignorance Other III,Decreases the target's Item Tinkering skill by 20 points.,125,120,58,30,Creature Enchantment,0.1,29,16,5,0.7,1 -5040,Item Tinkering Ignorance Other IV,Decreases the target's Item Tinkering skill by 25 points.,175,150,58,40,Creature Enchantment,0.15,29,16,5,0.55,1 -5041,Item Tinkering Ignorance Other V,Decreases the target's Item Tinkering skill by 30 points.,225,180,58,50,Creature Enchantment,0.2,29,16,5,0.4,1 -5042,Item Tinkering Ignorance Other VI,Decreases the target's Item Tinkering skill by 35 points.,275,210,58,60,Creature Enchantment,0.3,29,16,5,0.25,1 -5043,Unfortunate Appraisal,Decreases the target's Item Tinkering skill by 40 points.,325,240,58,70,Creature Enchantment,0.15,29,16,5,0.25,1 -5044,Incantation of Item Tinkering Ignorance Other,Decreases the target's Item Tinkering skill by 45 points.,400,300,58,80,Creature Enchantment,0.15,29,16,5,0.25,1 -5045,Item Tinkering Ignorance Self I,Decreases the caster's Item Tinkering skill by 10 points.,1,60,58,15,Creature Enchantment,0.01,29,16,0,0,1 -5046,Item Tinkering Ignorance Self II,Decreases the caster's Item Tinkering skill by 15 points.,75,90,58,30,Creature Enchantment,0.05,29,16,0,0,1 -5047,Item Tinkering Ignorance Self III,Decreases the caster's Item Tinkering skill by 20 points.,125,120,58,40,Creature Enchantment,0.1,29,16,0,0,1 -5048,Item Tinkering Ignorance Self IV,Decreases the caster's Item Tinkering skill by 25 points.,175,150,58,50,Creature Enchantment,0.15,29,16,0,0,1 -5049,Item Tinkering Ignorance Self V,Decreases the caster's Item Tinkering skill by 30 points.,225,180,58,60,Creature Enchantment,0.2,29,16,0,0,1 -5050,Item Tinkering Ignorance Self VI,Decreases the caster's Item Tinkering skill by 35 points.,275,210,58,70,Creature Enchantment,0.3,29,16,0,0,1 -5051,Item Tinkering Ignorance Self VII,Decreases the caster's Item Tinkering skill by 40 points.,325,240,58,70,Creature Enchantment,0.15,29,16,0,0,1 -5052,Incantation of Item Tinkering Ignorance Self,Decreases the caster's Item Tinkering skill by 45 points.,400,300,58,80,Creature Enchantment,0.15,29,16,0,0,1 -5053,Item Tinkering Expertise Other I,Increases the target's Item Tinkering skill by 10 points.,1,1800,57,10,Creature Enchantment,0.01,28,16,0,1,1 -5054,Item Tinkering Expertise Other II,Increases the target's Item Tinkering skill by 15 points.,50,1800,57,20,Creature Enchantment,0.05,28,16,5,0.85,1 -5055,Item Tinkering Expertise Other III,Increases the target's Item Tinkering skill by 20 points.,100,1800,57,30,Creature Enchantment,0.1,28,16,5,0.7,1 -5056,Item Tinkering Expertise Other IV,Increases the target's Item Tinkering skill by 25 points.,150,1800,57,40,Creature Enchantment,0.15,28,16,5,0.55,1 -5057,Item Tinkering Expertise Other V,Increases the target's Item Tinkering skill by 30 points.,200,1800,57,50,Creature Enchantment,0.2,28,16,5,0.4,1 -5058,Item Tinkering Expertise Other VI,Increases the target's Item Tinkering skill by 35 points.,250,2700,57,60,Creature Enchantment,0.3,28,16,5,0.25,1 -5059,Yoshi's Boon,Increases the target's Item Tinkering skill by 40 points.,300,3600,57,70,Creature Enchantment,0.15,28,16,5,0.25,1 -5060,Incantation of Item Tinkering Expertise Other,Increases the target's Item Tinkering skill by 45 points.,400,5400,57,80,Creature Enchantment,0.15,28,16,5,0.25,1 -5061,Item Tinkering Expertise Self I,Increases the caster's Item Tinkering skill by 10 points.,1,1800,57,15,Creature Enchantment,0.01,28,16,0,0,1 -5062,Item Tinkering Expertise Self II,Increases the caster's Item Tinkering skill by 15 points.,50,1800,57,30,Creature Enchantment,0.05,28,16,0,0,1 -5063,Item Tinkering Expertise Self III,Increases the caster's Item Tinkering skill by 20 points.,100,1800,57,40,Creature Enchantment,0.1,28,16,0,0,1 -5064,Item Tinkering Expertise Self IV,Increases the caster's Item Tinkering skill by 25 points.,150,1800,57,50,Creature Enchantment,0.15,28,16,0,0,1 -5065,Item Tinkering Expertise Self V,Increases the caster's Item Tinkering skill by 30 points.,200,1800,57,60,Creature Enchantment,0.2,28,16,0,0,1 -5066,Item Tinkering Expertise Self VI,Increases the caster's Item Tinkering skill by 35 points.,250,2700,57,70,Creature Enchantment,0.3,28,16,0,0,1 -5067,Yoshi's Blessing,Increases the caster's Item Tinkering skill by 40 points.,300,3600,57,70,Creature Enchantment,0.15,28,16,0,0,1 -5068,Incantation of Item Tinkering Expertise Self,Increases the caster's Item Tinkering skill by 45 points.,400,5400,57,80,Creature Enchantment,0.15,28,16,0,0,1 -5069,Major Item Tinkering Expertise,Increases the target's Item Tinkering skill by 15 points. Additional spells can be layered over this.,2,780,353,10,Creature Enchantment,0.01,28,16,0,1,1 -5070,Major Two Handed Combat Aptitude,Increases the target's Two Handed Combat skill by 15 points. Additional spells can be layered over this.,15,780,595,10,Creature Enchantment,0.01,18,16,0,1,1 -5071,Minor Item Tinkering Expertise,Increases the target's Item Tinkering skill by 5 points. Additional spells can be layered over this.,1,780,353,10,Creature Enchantment,0.01,28,16,0,1,1 -5072,Minor Two Handed Combat Aptitude,Increases the target's Two Handed Combat skill by 5 points. Additional spells can be layered over this.,5,780,595,10,Creature Enchantment,0.01,18,16,0,1,1 -5073,Moderate Item Tinkering Expertise,Increases the target's Item Tinkering skill by 10 points. Additional spells can be layered over this.,10,780,602,10,Creature Enchantment,0.01,18,16,0,1,1 -5074,Moderate Two Handed Combat Aptitude,Increases the target's Two Handed Combat skill by 10 points. Additional spells can be layered over this.,10,780,595,10,Creature Enchantment,0.01,18,16,0,1,1 -5075,Two Handed Combat Ineptitude Other I,Decreases the target's Two Handed Combat skill by 10 points.,1,60,594,10,Creature Enchantment,0.01,19,16,0,1,1 -5076,Two Handed Combat Ineptitude Other II,Decreases the target's Two Handed Combat skill by 15 points.,75,90,594,20,Creature Enchantment,0.05,19,16,5,0.85,1 -5077,Two Handed Combat Ineptitude Other III,Decreases the target's Two Handed Combat skill by 20 points.,125,120,594,30,Creature Enchantment,0.1,19,16,5,0.7,1 -5078,Two Handed Combat Ineptitude Other IV,Decreases the target's Two Handed Combat skill by 25 points.,175,150,594,40,Creature Enchantment,0.15,19,16,5,0.55,1 -5079,Two Handed Combat Ineptitude Other V,Decreases the target's Two Handed Combat skill by 30 points.,225,180,594,50,Creature Enchantment,0.2,19,16,5,0.4,1 -5080,Two Handed Combat Ineptitude Other VI,Decreases the target's Two Handed Combat skill by 35 points.,275,210,594,60,Creature Enchantment,0.3,19,16,5,0.25,1 -5081,Greased Palms,Decreases the target's Two Handed Combat skill by 40 points.,325,240,594,70,Creature Enchantment,0.15,19,16,5,0.25,1 -5082,Incantation of Two Handed Combat Ineptitude Other,Decreases the target's Two Handed Combat skill by 45 points.,400,300,594,80,Creature Enchantment,0.15,19,16,5,0.25,1 -5083,Two Handed Combat Ineptitude Self I,Decreases the caster's Two Handed Combat skill by 10 points.,1,60,594,15,Creature Enchantment,0.01,19,16,0,0,1 -5084,Two Handed Combat Ineptitude Self II,Decreases the caster's Two Handed Combat skill by 15 points.,75,90,594,30,Creature Enchantment,0.05,19,16,0,0,1 -5085,Two Handed Combat Ineptitude Self III,Decreases the caster's Two Handed Combat skill by 20 points.,125,120,594,40,Creature Enchantment,0.1,19,16,0,0,1 -5086,Two Handed Combat Ineptitude Self IV,Decreases the caster's Two Handed Combat skill by 25 points.,175,150,594,50,Creature Enchantment,0.15,19,16,0,0,1 -5087,Two Handed Combat Ineptitude Self V,Decreases the caster's Two Handed Combat skill by 30 points.,225,180,594,60,Creature Enchantment,0.2,19,16,0,0,1 -5088,Two Handed Combat Ineptitude Self VI,Decreases the caster's Two Handed Combat skill by 35 points.,275,210,594,70,Creature Enchantment,0.3,19,16,0,0,1 -5089,Two Handed Combat Ineptitude Self VII,Decreases the caster's Two Handed Combat skill by 40 points.,325,240,594,70,Creature Enchantment,0.15,19,16,0,0,1 -5090,Incantation of Two Handed Combat Ineptitude Self,Decreases the caster's Two Handed Combat skill by 45 points.,400,300,594,80,Creature Enchantment,0.15,19,16,0,0,1 -5091,Two Handed Combat Mastery Other I,Increases the target's Two Handed Combat skill by 10 points.,1,1800,593,10,Creature Enchantment,0.01,18,16,0,1,1 -5092,Two Handed Combat Mastery Other II,Increases the target's Two Handed Combat skill by 15 points.,50,1800,593,20,Creature Enchantment,0.05,18,16,5,0.85,1 -5093,Two Handed Combat Mastery Other III,Increases the target's Two Handed Combat skill by 20 points.,100,1800,593,30,Creature Enchantment,0.1,18,16,5,0.7,1 -5094,Two Handed Combat Mastery Other IV,Increases the target's Two Handed Combat skill by 25 points.,150,1800,593,40,Creature Enchantment,0.15,18,16,5,0.55,1 -5095,Two Handed Combat Mastery Other V,Increases the target's Two Handed Combat skill by 30 points.,200,1800,593,50,Creature Enchantment,0.2,18,16,5,0.4,1 -5096,Two Handed Combat Mastery Other VI,Increases the target's Two Handed Combat skill by 35 points.,250,2700,593,60,Creature Enchantment,0.3,18,16,5,0.25,1 -5097,Boon of T'ing,Increases the target's Two Handed Combat skill by 40 points.,300,3600,593,70,Creature Enchantment,0.15,18,16,5,0.25,1 -5098,Incantation of Two Handed Combat Mastery Other,Increases the target's Two Handed Combat skill by 45 points.,400,5400,593,80,Creature Enchantment,0.15,18,16,5,0.25,1 -5099,Two Handed Combat Mastery Self I,Increases the caster's Two Handed Combat skill by 10 points.,1,1800,593,15,Creature Enchantment,0.01,18,16,0,0,1 -5100,Two Handed Combat Mastery Self II,Increases the caster's Two Handed Combat skill by 15 points.,50,1800,593,30,Creature Enchantment,0.05,18,16,0,0,1 -5101,Two Handed Combat Mastery Self III,Increases the caster's Two Handed Combat skill by 20 points.,100,1800,593,40,Creature Enchantment,0.1,18,16,0,0,1 -5102,Two Handed Combat Mastery Self IV,Increases the caster's Two Handed Combat skill by 25 points.,150,1800,593,50,Creature Enchantment,0.15,18,16,0,0,1 -5103,Two Handed Combat Mastery Self V,Increases the caster's Two Handed Combat skill by 30 points.,200,1800,593,60,Creature Enchantment,0.2,18,16,0,0,1 -5104,Two Handed Combat Mastery Self VI,Increases the caster's Two Handed Combat skill by 35 points.,250,2700,593,70,Creature Enchantment,0.3,18,16,0,0,1 -5105,Blessing of T'ing,Increases the caster's Two Handed Combat skill by 40 points.,300,3600,593,70,Creature Enchantment,0.15,18,16,0,0,1 -5106,Master Inventor's Item Tinkering Aptitude,Increases the target's Item Tinkering skill by 20 points.,4,1800,563,10,Creature Enchantment,0.01,20,16,0,1,1 -5107,Novice Soldier's Two Handed Combat Aptitude,Increases the target's Two Handed Combat skill by 3 points.,1,1800,599,10,Creature Enchantment,0.01,18,16,0,1,1 -5108,Apprentice Soldier's Two Handed Combat Aptitude,Increases the target's Two Handed Combat skill by 5 points.,2,1800,599,10,Creature Enchantment,0.01,18,16,0,1,1 -5109,Journeyman Soldier's Two Handed Combat Aptitude,Increases the target's Two Handed Combat skill by 10 points.,3,1800,599,10,Creature Enchantment,0.01,18,16,0,1,1 -5110,Master Soldier's Two Handed Combat Aptitude,Increases the target's Two Handed Combat skill by 20 points.,4,1800,599,10,Creature Enchantment,0.01,18,16,0,1,1 -5111,Novice Inventor's Item Tinkering Aptitude,Increases the target's Item Tinkering skill by 3 points.,1,1800,563,10,Creature Enchantment,0.01,20,16,0,1,1 -5112,Apprentice Inventor's Item Tinkering Aptitude,Increases the target's Item Tinkering skill by 5 points.,2,1800,563,10,Creature Enchantment,0.01,20,16,0,1,1 -5113,Journeyman Inventor's Item Tinkering Aptitude,Increases the target's Item Tinkering skill by 10 points.,3,1800,563,10,Creature Enchantment,0.01,20,16,0,1,1 -5114,Expose Weakness VIII,Decreases the target's natural armor by 225 points.,400,300,116,80,Life Magic,0.15,56,16,5,0.25,1 -5115,Expose Weakness I,Decreases the target's natural armor by 20 points.,25,60,116,10,Life Magic,0.01,56,16,5,1,1 -5116,Expose Weakness II,Decreases the target's natural armor by 50 points.,75,90,116,20,Life Magic,0.05,56,16,5,0.85,1 -5117,Expose Weakness III,Decreases the target's natural armor by 75 points.,125,120,116,30,Life Magic,0.1,56,16,5,0.7,1 -5118,Expose Weakness IV,Decreases the target's natural armor by 100 points.,175,150,116,40,Life Magic,0.15,56,16,5,0.55,1 -5119,Expose Weakness V,Decreases the target's natural armor by 150 points.,225,180,116,50,Life Magic,0.2,56,16,5,0.4,1 -5120,Expose Weakness VI,Decreases the target's natural armor by 200 points.,275,210,116,60,Life Magic,0.3,56,16,5,0.25,1 -5121,Expose Weakness VII,Decreases the target's natural armor by 225 points.,325,240,116,70,Life Magic,0.15,56,16,5,0.25,1 -5122,Call of Leadership V,Increases maximum health by 10 points for 30 minutes.,400,1800,609,80,Life Magic,0.01,10,16,5,0.25,1 -5123,Answer of Loyalty (Mana) I,Enhances the Mana of all Fellowship members by 2 points for 30 minutes.,175,1800,607,40,Life Magic,0.01,10,16,5,0.55,1 -5124,Answer of Loyalty (Mana) II,Enhances the Mana of all Fellowship members by 4 points for 30 minutes.,225,1800,607,50,Life Magic,0.01,10,16,5,0.4,1 -5125,Answer of Loyalty (Mana) III,Enhances the Mana of all Fellowship members by 6 points for 30 minutes.,275,1800,607,60,Life Magic,0.01,10,16,5,0.25,1 -5126,Answer of Loyalty (Mana) IV,Enhances the Mana of all Fellowship members by 8 points for 30 minutes.,325,1800,607,70,Life Magic,0.01,10,16,5,0.25,1 -5127,Answer of Loyalty (Mana) V,Enhances the Mana of all Fellowship members by 10 points for 30 minutes.,400,1800,607,80,Life Magic,0.01,10,16,5,0.25,1 -5128,Answer of Loyalty (Stamina) I,Enhances the Endurance of all Fellowship members by 2 points for 30 minutes.,175,1800,608,40,Life Magic,0.01,10,16,5,0.55,1 -5129,Answer of Loyalty (Stamina) II,Enhances the Endurance of all Fellowship members by 4 points for 30 minutes.,225,1800,608,50,Life Magic,0.01,10,16,5,0.4,1 -5130,Answer of Loyalty (Stamina) III,Enhances the Endurance of all Fellowship members by 6 points for 30 minutes.,275,1800,608,60,Life Magic,0.01,10,16,5,0.25,1 -5131,Answer of Loyalty (Stamina) IV,Enhances the Endurance of all Fellowship members by 8 points for 30 minutes.,325,1800,608,70,Life Magic,0.01,10,16,5,0.25,1 -5132,Answer of Loyalty (Stamina) V,Enhances the Endurance of all Fellowship members by 10 points for 30 minutes.,400,1800,608,80,Life Magic,0.01,10,16,5,0.25,1 -5133,Call of Leadership I,Increases maximum health by 2 points for 30 minutes.,175,1800,609,40,Life Magic,0.01,10,16,5,0.55,1 -5134,Call of Leadership II,Increases maximum health by 4 points for 30 minutes.,225,1800,609,50,Life Magic,0.01,10,16,5,0.4,1 -5135,Call of Leadership III,Increases maximum health by 6 points for 30 minutes.,275,1800,609,60,Life Magic,0.01,10,16,5,0.25,1 -5136,Call of Leadership IV,Increases maximum health by 8 points for 30 minutes.,325,1800,609,70,Life Magic,0.01,10,16,5,0.25,1 -5137,Augmented Understanding III,Increases experience by 6%. ,3,510,615,70,Life Magic,0.3,35,16,0,0,1 -5138,Augmented Damage I,Increases damage rating by 1.,1,510,610,70,Life Magic,0.3,35,16,0,0,1 -5139,Augmented Damage II,Increases damage rating by 2.,2,510,610,70,Life Magic,0.3,35,16,0,0,1 -5140,Augmented Damage III,Increases damage rating by 3.,3,510,610,70,Life Magic,0.3,35,16,0,0,1 -5141,Augmented Damage Reduction I,Increases damage reduction rating by 1.,1,510,611,70,Life Magic,0.3,35,16,0,0,1 -5142,Augmented Damage Reduction II,Increases damage reduction rating by 2.,2,510,611,70,Life Magic,0.3,35,16,0,0,1 -5143,Augmented Damage Reduction III,Increases damage reduction rating by 3.,3,510,611,70,Life Magic,0.3,35,16,0,0,1 -5144,Augmented Health I,Increases maximum health by 5 points.,1,510,612,70,Life Magic,0.3,31,16,0,0,1 -5145,Augmented Health II,Increases maximum health by 10 points.,2,510,612,70,Life Magic,0.3,31,16,0,0,1 -5146,Augmented Health III,Increases maximum health by 15 points.,3,510,612,70,Life Magic,0.3,31,16,0,0,1 -5147,Augmented Mana I,Increases maximum mana by 10 points.,1,510,614,70,Life Magic,0.3,33,16,0,0,1 -5148,Augmented Mana II,Increases maximum mana by 20 points.,2,510,614,70,Life Magic,0.3,33,16,0,0,1 -5149,Augmented Mana III,Increases maximum mana by 30 points.,3,510,614,70,Life Magic,0.3,33,16,0,0,1 -5150,Augmented Stamina I,Increases maximum stamina by 10 points.,1,510,613,70,Life Magic,0.3,35,16,0,0,1 -5151,Augmented Stamina II,Increases maximum stamina by 20 points.,2,510,613,70,Life Magic,0.3,35,16,0,0,1 -5152,Augmented Stamina III,Increases maximum stamina by 30 points.,3,510,613,70,Life Magic,0.3,35,16,0,0,1 -5153,Augmented Understanding I,Increases experience by 2%. ,1,510,615,70,Life Magic,0.3,35,16,0,0,1 -5154,Augmented Understanding II,Increases experience by 4%. ,2,510,615,70,Life Magic,0.3,35,16,0,0,1 -5155,Virindi Whisper IV,Increases the target's Arcane Lore skill by 32 points for 60 seconds.,150,60,616,40,Creature Enchantment,0.15,26,16,5,0.55,1 -5156,Virindi Whisper V,Increases the target's Arcane Lore skill by 40 points for 60 seconds.,225,60,616,50,Creature Enchantment,0.2,26,16,5,0.4,1 -5157,Virindi Whisper I,Increases the target's Arcane Lore skill by 8 points for 60 seconds.,1,60,616,10,Creature Enchantment,0.01,26,16,0,1,1 -5158,Virindi Whisper II,Increases the target's Arcane Lore skill by 16 points for 60 seconds.,50,60,616,20,Creature Enchantment,0.05,26,16,5,0.85,1 -5159,Virindi Whisper III,Increases the target's Arcane Lore skill by 24 points for 60 seconds.,100,60,616,30,Creature Enchantment,0.1,26,16,5,0.7,1 -5160,Mhoire Castle,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5161,Mhoire Castle Great Hall,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5162,Mhoire Castle Northeast Tower,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5163,Mhoire Castle Northwest Tower,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5164,Mhoire Castle Southeast Tower,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5165,Mhoire Castle Southwest Tower,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5166,Flaming Skull,A burning skull,320,-1,121,120,War Magic,0,0,0,100,0,1 -5167,Mhoire Castle Exit Portal,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5168,a spectacular view of the Mhoire lands,You've fallen into the spectral waters!,125,-1,214,50,Item Enchantment,0.25,14,16,30,0,1 -5169,a descent into the Mhoire catacombs,You've fallen into the spectral waters!,125,-1,214,50,Item Enchantment,0.25,14,16,30,0,1 -5170,a descent into the Mhoire catacombs,You've fallen into the spectral waters!,125,-1,214,50,Item Enchantment,0.25,14,16,30,0,1 -5171,Spectral Fountain Sip,You've sipped the spectral waters. You're feeling pretty good.,250,300,617,80,Life Magic,0.15,31,16,5,0.25,1 -5172,Spectral Fountain Sip,You've sipped the spectral waters. Your blood is poisoned.,250,300,618,80,Life Magic,0.15,32,16,5,0.25,1 -5173,Spectral Fountain Sip,You've sipped the spectral waters. Your wounds are poisoned and don't heal as well.,250,300,619,80,Life Magic,0.15,32,16,5,0.25,1 -5174,Mhoire's Blessing of Power,Your damage has been augmented by the magic of the Mhoire blood.,250,300,610,80,Life Magic,0.15,31,16,5,0.25,1 -5175,Facility Hub Recall,Transports the caster to the Facilty Hub.,125,-1,214,10,Item Enchantment,0.25,16,16,30,0,1 -5176,Celestial Hand Basement,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5177,Radiant Blood Basement,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5178,Eldrytch Web Basement,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5179,Celestial Hand Basement,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5180,Radiant Blood Basement,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5181,Eldrytch Web Basement,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5182,Aura of Incantation of Spirit Drinker,Increases the elemental damage bonus of an elemental magic caster by 8%.,350,5400,695,80,Item Enchantment,0.15,57,16,25,0,1 -5183,Aura of Incantation of Blood Drinker Self,Increases a weapon's damage value by 24 points.,350,5400,154,80,Item Enchantment,0.15,57,16,25,0,1 -5184,Rare Damage Boost VII,Your damage rating is increased by 7.,1,10800,633,70,Life Magic,0.3,35,16,0,0,1 -5185,Rare Damage Boost VIII,Your damage rating is increased by 8.,1,10800,633,70,Life Magic,0.3,35,16,0,0,1 -5186,Rare Damage Boost IX,Your damage rating is increased by 9.,1,10800,633,70,Life Magic,0.3,35,16,0,0,1 -5187,Rare Damage Boost X,Your damage rating is increased by 10.,1,10800,633,70,Life Magic,0.3,35,16,0,0,1 -5188,Rare Damage Reduction I,Your damage reduction rating is increased by 1.,1,10800,634,70,Life Magic,0.3,35,16,0,0,1 -5189,Rare Damage Reduction II,Your damage reduction rating is increased by 2.,1,10800,634,70,Life Magic,0.3,35,16,0,0,1 -5190,Rare Damage Reduction III,Your damage reduction rating is increased by 3.,1,10800,634,70,Life Magic,0.3,35,16,0,0,1 -5191,Rare Damage Reduction IV,Your damage reduction rating is increased by 4.,1,10800,634,70,Life Magic,0.3,35,16,0,0,1 -5192,Rare Damage Reduction V,Your damage reduction rating is increased by 5.,1,10800,634,70,Life Magic,0.3,35,16,0,0,1 -5193,Rare Damage Reduction V,Your damage reduction rating is increased by 5.,1,10800,634,70,Life Magic,0.3,35,16,0,0,1 -5194,Rare Damage Reduction V,Your damage reduction rating is increased by 5.,1,10800,634,70,Life Magic,0.3,35,16,0,0,1 -5195,Rare Damage Reduction V,Your damage reduction rating is increased by 5.,1,10800,634,70,Life Magic,0.3,35,16,0,0,1 -5196,Rare Damage Reduction V,Your damage reduction rating is increased by 5.,1,10800,634,70,Life Magic,0.3,35,16,0,0,1 -5197,Rare Damage Reduction V,Your damage reduction rating is increased by 5.,1,10800,634,70,Life Magic,0.3,35,16,0,0,1 -5198,Rare Damage Boost I,Your damage rating is increased by 1.,1,10800,633,70,Life Magic,0.3,35,16,0,0,1 -5199,Rare Damage Boost II,Your damage rating is increased by 2.,1,10800,633,70,Life Magic,0.3,35,16,0,0,1 -5200,Rare Damage Boost III,Your damage rating is increased by 3.,1,10800,633,70,Life Magic,0.3,35,16,0,0,1 -5201,Rare Damage Boost IV,Your damage rating is increased by 4.,1,10800,633,70,Life Magic,0.3,35,16,0,0,1 -5202,Rare Damage Boost V,Your damage rating is increased by 5.,1,10800,633,70,Life Magic,0.3,35,16,0,0,1 -5203,Rare Damage Boost VI,Your damage rating is increased by 6.,1,10800,633,70,Life Magic,0.3,35,16,0,0,1 -5204,Surge of Destruction,The damage rating of the caster is increased by 20.,1,8,628,70,Life Magic,0.3,162,16,0,0,1 -5205,Surge of Affliction,The target loses 150 points of health over 19 seconds.,250,19,631,80,Life Magic,0.15,165,16,5,0.25,1 -5206,Surge of Protection,The damage reduction rating of the caster is increased by 20.,1,12,629,70,Life Magic,0.3,163,16,0,0,1 -5207,Surge of Festering,The heal rating of the target is decreased by 20.,250,12,619,80,Life Magic,0.15,166,16,5,0.25,1 -5208,Surge of Regeneration,The caster gains 150 points of health over 19 seconds.,250,19,630,80,Life Magic,0.15,164,16,5,0.25,1 -5209,Sigil of Fury I (Critical Damage),Your critical damage rating is increased by 1.,1,510,626,70,Life Magic,0.3,35,16,0,0,1 -5210,Sigil of Fury II (Critical Damage),Your critical damage rating is increased by 2.,2,510,626,70,Life Magic,0.3,35,16,0,0,1 -5211,Sigil of Fury III (Critical Damage),Your critical damage rating is increased by 3.,3,510,626,70,Life Magic,0.3,35,16,0,0,1 -5212,Sigil of Fury IV (Critical Damage),Your critical damage rating is increased by 4.,4,510,626,70,Life Magic,0.3,35,16,0,0,1 -5213,Sigil of Fury V (Critical Damage),Your critical damage rating is increased by 5.,5,510,626,70,Life Magic,0.3,35,16,0,0,1 -5214,Sigil of Fury VI (Critical Damage),Your critical damage rating is increased by 6.,6,510,626,70,Life Magic,0.3,35,16,0,0,1 -5215,Sigil of Fury VII (Critical Damage),Your critical damage rating is increased by 7.,7,510,626,70,Life Magic,0.3,35,16,0,0,1 -5216,Sigil of Fury VIII (Critical Damage),Your critical damage rating is increased by 8.,8,510,626,70,Life Magic,0.3,35,16,0,0,1 -5217,Sigil of Fury IX (Critical Damage),Your critical damage rating is increased by 9.,9,510,626,70,Life Magic,0.3,35,16,0,0,1 -5218,Sigil of Fury X (Critical Damage),Your critical damage rating is increased by 10.,10,510,626,70,Life Magic,0.3,35,16,0,0,1 -5219,Sigil of Fury XI (Critical Damage),Your critical damage rating is increased by 11.,11,510,626,70,Life Magic,0.3,35,16,0,0,1 -5220,Sigil of Fury XII (Critical Damage),Your critical damage rating is increased by 12.,12,510,626,70,Life Magic,0.3,35,16,0,0,1 -5221,Sigil of Fury XIII (Critical Damage),Your critical damage rating is increased by 13.,13,510,626,70,Life Magic,0.3,35,16,0,0,1 -5222,Sigil of Fury XIV (Critical Damage),Your critical damage rating is increased by 14.,14,510,626,70,Life Magic,0.3,35,16,0,0,1 -5223,Sigil of Fury XV (Critical Damage),Your critical damage rating is increased by 15.,15,510,626,70,Life Magic,0.3,35,16,0,0,1 -5224,Sigil of Destruction I,Your damage rating is increased by 1.,1,510,620,70,Life Magic,0.3,35,16,0,0,1 -5225,Sigil of Destruction II,Your damage rating is increased by 2.,2,510,620,70,Life Magic,0.3,35,16,0,0,1 -5226,Sigil of Destruction III,Your damage rating is increased by 3.,3,510,620,70,Life Magic,0.3,35,16,0,0,1 -5227,Sigil of Destruction IV,Your damage rating is increased by 4.,4,510,620,70,Life Magic,0.3,35,16,0,0,1 -5228,Sigil of Destruction V,Your damage rating is increased by 5.,5,510,620,70,Life Magic,0.3,35,16,0,0,1 -5229,Sigil of Destruction VI,Your damage rating is increased by 6.,6,510,620,70,Life Magic,0.3,35,16,0,0,1 -5230,Sigil of Destruction VII,Your damage rating is increased by 7.,7,510,620,70,Life Magic,0.3,35,16,0,0,1 -5231,Sigil of Destruction VIII,Your damage rating is increased by 8.,8,510,620,70,Life Magic,0.3,35,16,0,0,1 -5232,Sigil of Destruction IX,Your damage rating is increased by 9.,9,510,620,70,Life Magic,0.3,35,16,0,0,1 -5233,Sigil of Destruction X,Your damage rating is increased by 10.,10,510,620,70,Life Magic,0.3,35,16,0,0,1 -5234,Sigil of Destruction XI,Your damage rating is increased by 11.,11,510,620,70,Life Magic,0.3,35,16,0,0,1 -5235,Sigil of Destruction XII,Your damage rating is increased by 12.,12,510,620,70,Life Magic,0.3,35,16,0,0,1 -5236,Sigil of Destruction XIII,Your damage rating is increased by 13.,13,510,620,70,Life Magic,0.3,35,16,0,0,1 -5237,Sigil of Destruction XIV,Your damage rating is increased by 14.,14,510,620,70,Life Magic,0.3,35,16,0,0,1 -5238,Sigil of Destruction XV,Your damage rating is increased by 15.,15,510,620,70,Life Magic,0.3,35,16,0,0,1 -5239,Sigil of Defense I,Your damage reduction rating is increased by 1.,1,510,621,70,Life Magic,0.3,35,16,0,0,1 -5240,Sigil of Defense II,Your damage reduction rating is increased by 2.,2,510,621,70,Life Magic,0.3,35,16,0,0,1 -5241,Sigil of Defense III,Your damage reduction rating is increased by 3.,3,510,621,70,Life Magic,0.3,35,16,0,0,1 -5242,Sigil of Defense IV,Your damage reduction rating is increased by 4.,4,510,621,70,Life Magic,0.3,35,16,0,0,1 -5243,Sigil of Defense V,Your damage reduction rating is increased by 5.,5,510,621,70,Life Magic,0.3,35,16,0,0,1 -5244,Sigil of Defense VI,Your damage reduction rating is increased by 6.,6,510,621,70,Life Magic,0.3,35,16,0,0,1 -5245,Sigil of Defense VII,Your damage reduction rating is increased by 7.,7,510,621,70,Life Magic,0.3,35,16,0,0,1 -5246,Sigil of Defense VIII,Your damage reduction rating is increased by 8.,8,510,621,70,Life Magic,0.3,35,16,0,0,1 -5247,Sigil of Defense IX,Your damage reduction rating is increased by 9.,9,510,621,70,Life Magic,0.3,35,16,0,0,1 -5248,Sigil of Defense X,Your damage reduction rating is increased by 10.,10,510,621,70,Life Magic,0.3,35,16,0,0,1 -5249,Sigil of Defense XI,Your damage reduction rating is increased by 11.,11,510,621,70,Life Magic,0.3,35,16,0,0,1 -5250,Sigil of Defense XII,Your damage reduction rating is increased by 12.,12,510,621,70,Life Magic,0.3,35,16,0,0,1 -5251,Sigil of Defense XIII,Your damage reduction rating is increased by 13.,13,510,621,70,Life Magic,0.3,35,16,0,0,1 -5252,Sigil of Defense XIV,Your damage reduction rating is increased by 14.,14,510,621,70,Life Magic,0.3,35,16,0,0,1 -5253,Sigil of Defense XV,Your damage reduction rating is increased by 15.,15,510,621,70,Life Magic,0.3,35,16,0,0,1 -5254,Sigil of Growth I,Your healing rating is increased by 1.,1,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5255,Sigil of Growth II,Your healing rating is increased by 2.,2,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5256,Sigil of Growth III,Your healing rating is increased by 3.,3,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5257,Sigil of Growth IV,Your healing rating is increased by 4.,4,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5258,Sigil of Growth V,Your healing rating is increased by 5.,5,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5259,Sigil of Growth VI,Your healing rating is increased by 6.,6,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5260,Sigil of Growth VII,Your healing rating is increased by 7.,7,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5261,Sigil of Growth VIII,Your healing rating is increased by 8.,8,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5262,Sigil of Growth IX,Your healing rating is increased by 9.,9,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5263,Sigil of Growth X,Your healing rating is increased by 10.,10,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5264,Sigil of Growth XI,Your healing rating is increased by 11.,11,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5265,Sigil of Growth XII,Your healing rating is increased by 12.,12,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5266,Sigil of Growth XIII,Your healing rating is increased by 13.,13,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5267,Sigil of Growth XIV,Your healing rating is increased by 14.,14,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5268,Sigil of Growth XV,Your healing rating is increased by 15.,15,300,627,80,Life Magic,0.15,32,16,5,0.25,1 -5269,Sigil of Vigor I (Health),Your health is increased by 1.,1,510,623,70,Life Magic,0.3,31,16,0,0,1 -5270,Sigil of Vigor II (Health),Your health is increased by 2.,2,510,623,70,Life Magic,0.3,31,16,0,0,1 -5271,Sigil of Vigor III (Health),Your health is increased by 3.,3,510,623,70,Life Magic,0.3,31,16,0,0,1 -5272,Sigil of Vigor IV (Health),Your health is increased by 4.,4,510,623,70,Life Magic,0.3,31,16,0,0,1 -5273,Sigil of Vigor V (Health),Your health is increased by 5.,5,510,623,70,Life Magic,0.3,31,16,0,0,1 -5274,Sigil of Vigor VI (Health),Your health is increased by 6.,6,510,623,70,Life Magic,0.3,31,16,0,0,1 -5275,Sigil of Vigor VII (Health),Your health is increased by 7.,7,510,623,70,Life Magic,0.3,31,16,0,0,1 -5276,Sigil of Vigor VIII (Health),Your health is increased by 8.,8,510,623,70,Life Magic,0.3,31,16,0,0,1 -5277,Sigil of Vigor IX (Health),Your health is increased by 9.,9,510,623,70,Life Magic,0.3,31,16,0,0,1 -5278,Sigil of Vigor X (Health),Your health is increased by 10.,10,510,623,70,Life Magic,0.3,31,16,0,0,1 -5279,Sigil of Vigor XI (Health),Your health is increased by 11.,11,510,623,70,Life Magic,0.3,31,16,0,0,1 -5280,Sigil of Vigor XII (Health),Your health is increased by 12.,12,510,623,70,Life Magic,0.3,31,16,0,0,1 -5281,Sigil of Vigor XIII (Health),Your health is increased by 13.,13,510,623,70,Life Magic,0.3,31,16,0,0,1 -5282,Sigil of Vigor XIV (Health),Your health is increased by 14.,14,510,623,70,Life Magic,0.3,31,16,0,0,1 -5283,Sigil of Vigor XV (Health),Your health is increased by 15.,15,510,623,70,Life Magic,0.3,31,16,0,0,1 -5284,Sigil of Vigor I (Mana),Your mana is increased by 5.,1,510,625,70,Life Magic,0.3,33,16,0,0,1 -5285,Sigil of Vigor II (Mana),Your mana is increased by 10.,2,510,625,70,Life Magic,0.3,33,16,0,0,1 -5286,Sigil of Vigor III (Mana),Your mana is increased by 15.,3,510,625,70,Life Magic,0.3,33,16,0,0,1 -5287,Sigil of Vigor IV (Mana),Your mana is increased by 20.,4,510,625,70,Life Magic,0.3,33,16,0,0,1 -5288,Sigil of Vigor V (Mana),Your mana is increased by 25.,5,510,625,70,Life Magic,0.3,33,16,0,0,1 -5289,Sigil of Vigor VI (Mana),Your mana is increased by 30.,6,510,625,70,Life Magic,0.3,33,16,0,0,1 -5290,Sigil of Vigor VII (Mana),Your mana is increased by 35.,7,510,625,70,Life Magic,0.3,33,16,0,0,1 -5291,Sigil of Vigor VIII (Mana),Your mana is increased by 40.,8,510,625,70,Life Magic,0.3,33,16,0,0,1 -5292,Sigil of Vigor IX (Mana),Your mana is increased by 45.,9,510,625,70,Life Magic,0.3,33,16,0,0,1 -5293,Sigil of Vigor X (Mana),Your mana is increased by 50.,10,510,625,70,Life Magic,0.3,33,16,0,0,1 -5294,Sigil of Vigor XI (Mana),Your mana is increased by 55.,11,510,625,70,Life Magic,0.3,33,16,0,0,1 -5295,Sigil of Vigor XII (Mana),Your mana is increased by 60.,12,510,625,70,Life Magic,0.3,33,16,0,0,1 -5296,Sigil of Vigor XIII (Mana),Your mana is increased by 65.,13,510,625,70,Life Magic,0.3,33,16,0,0,1 -5297,Sigil of Vigor XIV (Mana),Your mana is increased by 70.,14,510,625,70,Life Magic,0.3,33,16,0,0,1 -5298,Sigil of Vigor XV (Mana),Your mana is increased by 75.,15,510,625,70,Life Magic,0.3,33,16,0,0,1 -5299,Sigil of Vigor I (Stamina),Your stamina is increased by 5.,1,510,624,70,Life Magic,0.3,35,16,0,0,1 -5300,Sigil of Vigor II (Stamina),Your stamina is increased by 10.,2,510,624,70,Life Magic,0.3,35,16,0,0,1 -5301,Sigil of Vigor III (Stamina),Your stamina is increased by 15.,3,510,624,70,Life Magic,0.3,35,16,0,0,1 -5302,Sigil of Vigor IV (Stamina),Your stamina is increased by 20.,4,510,624,70,Life Magic,0.3,35,16,0,0,1 -5303,Sigil of Vigor V (Stamina),Your stamina is increased by 25.,5,510,624,70,Life Magic,0.3,35,16,0,0,1 -5304,Sigil of Vigor VI (Stamina),Your stamina is increased by 30.,6,510,624,70,Life Magic,0.3,35,16,0,0,1 -5305,Sigil of Vigor VII (Stamina),Your stamina is increased by 35.,7,510,624,70,Life Magic,0.3,35,16,0,0,1 -5306,Sigil of Vigor VIII (Stamina),Your stamina is increased by 40.,8,510,624,70,Life Magic,0.3,35,16,0,0,1 -5307,Sigil of Vigor IX (Stamina),Your stamina is increased by 45.,9,510,624,70,Life Magic,0.3,35,16,0,0,1 -5308,Sigil of Vigor X (Stamina),Your stamina is increased by 50.,10,510,624,70,Life Magic,0.3,35,16,0,0,1 -5309,Sigil of Vigor XI (Stamina),Your stamina is increased by 55.,11,510,624,70,Life Magic,0.3,35,16,0,0,1 -5310,Sigil of Vigor XII (Stamina),Your stamina is increased by 60.,12,510,624,70,Life Magic,0.3,35,16,0,0,1 -5311,Sigil of Vigor XIII (Stamina),Your stamina is increased by 65.,13,510,624,70,Life Magic,0.3,35,16,0,0,1 -5312,Sigil of Vigor XIV (Stamina),Your stamina is increased by 70.,14,510,624,70,Life Magic,0.3,35,16,0,0,1 -5313,Sigil of Vigor XV (Stamina),Your stamina is increased by 75.,15,510,624,70,Life Magic,0.3,35,16,0,0,1 -5314,Blessing of Unity,You heal 10 points of health every 5 seconds for 50 seconds.,250,50,617,80,Life Magic,0.15,31,16,5,0.25,1 -5315,Sigil of Fury I (Endurance),Your endurance is increased by 1.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5316,Sigil of Fury II (Endurance),Your endurance is increased by 2.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5317,Sigil of Fury III (Endurance),Your endurance is increased by 3.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5318,Sigil of Fury IV (Endurance),Your endurance is increased by 4.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5319,Sigil of Fury V (Endurance),Your endurance is increased by 5.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5320,Sigil of Fury VI (Endurance),Your endurance is increased by 6.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5321,Sigil of Fury VII (Endurance),Your endurance is increased by 7.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5322,Sigil of Fury VIII (Endurance),Your endurance is increased by 8.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5323,Sigil of Fury IX (Endurance),Your endurance is increased by 9.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5324,Sigil of Fury X (Endurance),Your endurance is increased by 10.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5325,Sigil of Fury XI (Endurance),Your endurance is increased by 11.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5326,Sigil of Fury XII (Endurance),Your endurance is increased by 12.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5327,Sigil of Fury XIII (Endurance),Your endurance is increased by 13.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5328,Sigil of Fury XIV (Endurance),Your endurance is increased by 14.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5329,Sigil of Fury XV (Endurance),Your endurance is increased by 15.,1,510,635,70,Life Magic,0.3,10,16,0,0,1 -5330,Gear Knight Invasion Area Camp Recall,Sends the caster to the Gear Knight Invasion Area Camp.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -5331,Clouded Soul,Shoots eight waves of nether outward from the caster. Each wave does 200-250 points of nether damage to the first thing it hits.,700,-1,225,80,War Magic,0.2,0,0,4.5,0,1 -5332,Bael'zharon's Nether Streak,Sends a bolt of nether streaking towards the target. The bolt does 125-200 points of nether damage to the first thing it hits.,700,-1,639,80,War Magic,0.15,0,16,30,0.2,1 -5333,Bael'zharon's Nether Arc,Shoots a bolt of nether at the target. The bolt does 125-200 points of nether damage to the first thing it hits.,700,-1,640,40,War Magic,0.15,0,16,30,0.2,1 -5334,Bael'zharons Curse of Destruction,The target loses 600 points of health over 30 seconds.,700,30,636,80,War Magic,0.15,167,16,35,0,1 -5335,Bael'zharons Curse of Minor Destruction,The target loses 720 points of health over 120 seconds.,700,240,637,80,War Magic,0.15,167,16,35,0,1 -5336,Bael'zharons Curse of Festering,The heal rating of the target is decreased by 90.,700,60,619,80,Life Magic,0.15,168,16,35,0,1 -5337,Destructive Curse VII,The target loses 294 points of health over 30 seconds.,325,30,636,70,Void Magic,0.15,167,16,10,0,1 -5338,Incantation of Destructive Curse,The target loses 357 points of health over 30 seconds.,400,30,636,80,Void Magic,0.15,167,16,10,0,1 -5339,Destructive Curse I,The target loses 56 points of health over 30 seconds.,25,30,636,10,Void Magic,0,167,16,10,0,1 -5340,Destructive Curse II,The target loses 91 points of health over 30 seconds.,75,30,636,20,Void Magic,0.05,167,16,10,0,1 -5341,Destructive Curse III,The target loses 126 points of health over 30 seconds.,125,30,636,30,Void Magic,0.1,167,16,10,0,1 -5342,Destructive Curse IV,The target loses 154 points of health over 30 seconds.,175,30,636,40,Void Magic,0.15,167,16,10,0,1 -5343,Destructive Curse V,The target loses 189 points of health over 30 seconds.,225,30,636,50,Void Magic,0.2,167,16,10,0,1 -5344,Destructive Curse VI,The target loses 231 points of health over 30 seconds.,275,30,636,60,Void Magic,0.3,167,16,10,0,1 -5345,Nether Streak V,Sends a bolt of nether streaking towards the target. The bolt does 35-88 points of nether damage to the first thing it hits.,200,-1,639,50,Void Magic,0.2,0,16,30,0.3,1 -5346,Nether Streak VI,Sends a bolt of nether streaking towards the target. The bolt does 42-105 points of nether damage to the first thing it hits.,250,-1,639,60,Void Magic,0.3,0,16,30,0.2,1 -5347,Nether Streak VII,Sends a bolt of nether streaking towards the target. The bolt does 84-130 points of nether damage to the first thing it hits.,300,-1,639,70,Void Magic,0.15,0,16,30,0.2,1 -5348,Incantation of Nether Streak,Sends a bolt of nether streaking towards the target. The bolt does 126-162 points of nether damage to the first thing it hits.,400,-1,639,80,Void Magic,0.15,0,16,30,0.2,1 -5349,Nether Bolt I,Shoots a bolt of nether at the target. The bolt does 21-52 points of nether damage to the first thing it hits.,1,-1,640,5,Void Magic,0,0,16,30,0.7,1 -5350,Nether Bolt II,Shoots a bolt of nether at the target. The bolt does 42-84 points of nether damage to the first thing it hits.,50,-1,640,10,Void Magic,0.05,0,16,30,0.6,1 -5351,Nether Bolt III,Shoots a bolt of nether at the target. The bolt does 63-115 points of nether damage to the first thing it hits.,100,-1,640,15,Void Magic,0.1,0,16,30,0.5,1 -5352,Nether Bolt IV,Shoots a bolt of nether at the target. The bolt does 73-146 points of nether damage to the first thing it hits.,150,-1,640,20,Void Magic,0.15,0,16,30,0.4,1 -5353,Nether Bolt V,Shoots a bolt of nether at the target. The bolt does 84-178 points of nether damage to the first thing it hits.,200,-1,640,25,Void Magic,0.2,0,16,30,0.3,1 -5354,Nether Bolt VI,Shoots a bolt of nether at the target. The bolt does 105-210 points of nether damage to the first thing it hits.,250,-1,640,30,Void Magic,0.3,0,16,30,0.2,1 -5355,Nether Bolt VII,Shoots a bolt of nether at the target. The bolt does 168-262 points of nether damage to the first thing it hits.,300,-1,640,35,Void Magic,0.15,0,16,30,0.2,1 -5356,Incantation of Nether Bolt,Shoots a bolt of nether at the target. The bolt does 252-325 points of nether damage to the first thing it hits.,400,-1,640,40,Void Magic,0.15,0,16,30,0.2,1 -5357,Nether Streak I,Sends a bolt of nether streaking towards the target. The bolt does 10-27 points of nether damage to the first thing it hits.,1,-1,639,10,Void Magic,0,0,16,30,0.7,1 -5358,Nether Streak II,Sends a bolt of nether streaking towards the target. The bolt does 21-42 points of nether damage to the first thing it hits.,50,-1,639,20,Void Magic,0.05,0,16,30,0.6,1 -5359,Nether Streak III,Sends a bolt of nether streaking towards the target. The bolt does 25-56 points of nether damage to the first thing it hits.,100,-1,639,30,Void Magic,0.1,0,16,30,0.5,1 -5360,Nether Streak IV,Sends a bolt of nether streaking towards the target. The bolt does 31-73 points of nether damage to the first thing it hits.,150,-1,639,40,Void Magic,0.15,0,16,30,0.4,1 -5361,Clouded Soul,Shoots eight waves of nether outward from the caster. Each wave does 94-147 points of nether damage to the first thing it hits.,200,-1,641,80,Void Magic,0.2,0,0,4.5,0,1 -5362,Nether Arc II,Shoots a bolt of nether at the target. The bolt does 42-84 points of nether damage to the first thing it hits.,50,-1,640,10,Void Magic,0.05,0,16,30,0.6,1 -5363,Nether Arc III,Shoots a bolt of nether at the target. The bolt does 63-115 points of nether damage to the first thing it hits.,100,-1,640,15,Void Magic,0.1,0,16,30,0.5,1 -5364,Nether Arc IV,Shoots a bolt of nether at the target. The bolt does 73-147 points of nether damage to the first thing it hits.,150,-1,640,20,Void Magic,0.15,0,16,30,0.4,1 -5365,Nether Arc V,Shoots a bolt of nether at the target. The bolt does 84-178 points of nether damage to the first thing it hits.,200,-1,640,25,Void Magic,0.2,0,16,30,0.3,1 -5366,Nether Arc VI,Shoots a bolt of nether at the target. The bolt does 105-210 points of nether damage to the first thing it hits.,250,-1,640,30,Void Magic,0.3,0,16,30,0.2,1 -5367,Nether Arc VII,Shoots a bolt of nether at the target. The bolt does 168-262 points of nether damage to the first thing it hits.,300,-1,640,35,Void Magic,0.15,0,16,30,0.2,1 -5368,Incantation of Nether Arc,Shoots a bolt of nether at the target. The bolt does 252-325 points of nether damage to the first thing it hits.,400,-1,640,40,Void Magic,0.15,0,16,30,0.2,1 -5369,Nether Arc I,Shoots a bolt of nether at the target. The bolt does 21-52 points of nether damage to the first thing it hits.,1,-1,640,5,Void Magic,0,0,16,30,0.7,1 -5370,Incantation of Nether Streak,Sends a bolt of lighting streaking towards the target. The bolt does 42-57 points of electrical damage to the first thing it hits.,400,-1,246,80,Void Magic,0.15,0,16,30,0.2,1 -5371,Festering Curse I,The heal rating of the target is decreased by 5.,25,30,643,10,Void Magic,0.15,168,16,20,0,1 -5372,Festering Curse II,The heal rating of the target is decreased by 10.,75,30,643,20,Void Magic,0.15,168,16,20,0,1 -5373,Festering Curse III,The heal rating of the target is decreased by 15.,125,30,643,30,Void Magic,0.15,168,16,20,0,1 -5374,Festering Curse IV,The heal rating of the target is decreased by 20.,175,30,643,40,Void Magic,0.15,168,16,20,0,1 -5375,Festering Curse V,The heal rating of the target is decreased by 25.,225,30,643,50,Void Magic,0.2,168,16,20,0,1 -5376,Festering Curse VI,The heal rating of the target is decreased by 30.,275,30,643,60,Void Magic,0.3,168,16,20,0,1 -5377,Festering Curse VII,The heal rating of the target is decreased by 35.,325,30,643,70,Void Magic,0.15,168,16,20,0,1 -5378,Incantation of Festering Curse,The heal rating of the target is decreased by 45.,400,30,643,80,Void Magic,0.15,168,16,20,0,1 -5379,Weakening Curse I,Decreases the target's damage rating by 1.,25,15,642,10,Void Magic,0,169,16,20,0,1 -5380,Weakening Curse II,Decreases the target's damage rating by 2.,75,15,642,20,Void Magic,0,169,16,20,0,1 -5381,Weakening Curse III,Decreases the target's damage rating by 4.,125,15,642,30,Void Magic,0.1,169,16,20,0,1 -5382,Weakening Curse IV,Decreases the target's damage rating by 6.,175,15,642,40,Void Magic,0.15,169,16,20,0,1 -5383,Weakening Curse V,Decreases the target's damage rating by 8.,225,15,642,50,Void Magic,0.2,169,16,20,0,1 -5384,Weakening Curse VI,Decreases the target's damage rating by 10.,275,15,642,60,Void Magic,0.3,169,16,20,0,1 -5385,Weakening Curse VII,Decreases the target's damage rating by 12.,325,15,642,70,Void Magic,0.15,169,16,20,0,1 -5386,Incantation of Weakening Curse,Decreases the target's damage rating by 15.,400,15,642,80,Void Magic,0.15,169,16,20,0,1 -5387,Corrosion I,Sends a bolt of corrosion towards the target. The bolt does 76 points of damage over 15 seconds.,1,-1,637,5,Void Magic,0,0,16,30,0.7,1 -5388,Corrosion II,Sends a bolt of corrosion towards the target. The bolt does 116 points of damage over 15 seconds.,50,-1,637,10,Void Magic,0.05,0,16,30,0.6,1 -5389,Corrosion III,Sends a bolt of corrosion towards the target. The bolt does 152 points of damage over 15 seconds.,100,-1,637,15,Void Magic,0.1,0,16,30,0.5,1 -5390,Corrosion IV,Sends a bolt of corrosion towards the target. The bolt does 192 points of damage over 15 seconds.,150,-1,637,20,Void Magic,0.15,0,16,30,0.4,1 -5391,Corrosion V,Sends a bolt of corrosion towards the target. The bolt does 204 points of damage over 15 seconds.,200,-1,637,25,Void Magic,0.2,0,16,30,0.3,1 -5392,Corrosion VI,Sends a bolt of corrosion towards the target. The bolt does 288 points of damage over 15 seconds.,250,-1,637,30,Void Magic,0.3,0,16,30,0.2,1 -5393,Corrosion VII,Sends a bolt of corrosion towards the target. The bolt does 360 points of damage over 15 seconds.,300,-1,637,35,Void Magic,0.15,0,16,30,0.2,1 -5394,Incantation of Corrosion,Sends a bolt of corrosion towards the target. The bolt does 448 points of damage over 15 seconds.,400,-1,637,40,Void Magic,0.15,0,16,30,0.2,1 -5395,Corruption I,Sends 3 bolts of corruption outward from the caster. Each bolt does 56 points of damage over 30 seconds.,1,-1,638,10,Void Magic,0,0,16,30,0.7,1 -5396,Corruption II,Sends 3 bolts of corruption outward from the caster. Each bolt does 91 points of damage over 30 seconds.,50,-1,638,20,Void Magic,0.05,0,16,30,0.6,1 -5397,Corruption III,Sends 3 bolts of corruption outward from the caster. Each bolt does 126 points of damage over 30 seconds.,100,-1,638,30,Void Magic,0.1,0,16,30,0.5,1 -5398,Corruption IV,Sends 3 bolts of corruption outward from the caster. Each bolt does 154 points of damage over 30 seconds.,150,-1,638,40,Void Magic,0.15,0,16,30,0.4,1 -5399,Corruption V,Sends 3 bolts of corruption outward from the caster. Each bolt does 189 points of damage over 30 seconds.,200,-1,638,50,Void Magic,0.2,0,16,30,0.3,1 -5400,Corruption VI,Sends 3 bolts of corruption outward from the caster. Each bolt does 231 points of damage over 30 seconds.,250,-1,638,60,Void Magic,0.3,0,16,30,0.2,1 -5401,Corruption VII,Sends 5 bolts of corruption outward from the caster. Each bolt does 294 points of damage over 30 seconds.,300,-1,638,70,Void Magic,0.15,0,16,30,0.2,1 -5402,Incantation of Corruption,Sends 5 bolts of corruption outward from the caster. Each bolt does 357 points of damage over 30 seconds.,400,-1,638,80,Void Magic,0.15,0,16,30,0.2,1 -5403,Void Magic Mastery Other I,Increases the target's Void Magic skill by 10 points.,1,1800,645,10,Creature Enchantment,0.01,26,16,0,1,1 -5404,Void Magic Mastery Other II,Increases the target's Void Magic skill by 15 points.,50,1800,645,20,Creature Enchantment,0.05,26,16,5,0.85,1 -5405,Void Magic Mastery Other III,Increases the target's Void Magic skill by 20 points.,100,1800,645,30,Creature Enchantment,0.1,26,16,5,0.7,1 -5406,Void Magic Mastery Other IV,Increases the target's Void Magic skill by 25 points.,150,1800,645,40,Creature Enchantment,0.15,26,16,5,0.55,1 -5407,Void Magic Mastery Other V,Increases the target's Void Magic skill by 30 points.,200,1800,645,50,Creature Enchantment,0.2,26,16,5,0.4,1 -5408,Void Magic Mastery Other VI,Increases the target's Void Magic skill by 35 points.,250,2700,645,60,Creature Enchantment,0.3,26,16,5,0.25,1 -5409,Void Magic Mastery Other VII,Increases the target's Void Magic skill by 40 points.,300,3600,645,70,Creature Enchantment,0.15,26,16,5,0.25,1 -5410,Incantation of Void Magic Mastery Other,Increases the target's Void Magic skill by 45 points.,400,5400,645,80,Creature Enchantment,0.15,26,16,5,0.25,1 -5411,Void Magic Mastery Self I,Increases the caster's Void Magic skill by 10 points.,1,1800,645,15,Creature Enchantment,0.01,26,16,0,0,1 -5412,Void Magic Mastery Self II,Increases the caster's Void Magic skill by 15 points.,50,1800,645,30,Creature Enchantment,0.05,26,16,0,0,1 -5413,Void Magic Mastery Self III,Increases the caster's Void Magic skill by 20 points.,100,1800,645,40,Creature Enchantment,0.1,26,16,0,0,1 -5414,Void Magic Mastery Self IV,Increases the caster's Void Magic skill by 25 points.,150,1800,645,50,Creature Enchantment,0.15,26,16,0,0,1 -5415,Void Magic Mastery Self V,Increases the caster's Void Magic skill by 30 points.,200,1800,645,60,Creature Enchantment,0.2,26,16,0,0,1 -5416,Void Magic Mastery Self VI,Increases the caster's Void Magic skill by 35 points.,250,2700,645,70,Creature Enchantment,0.3,26,16,0,0,1 -5417,Void Magic Mastery Self VII,Increases the caster's Void Magic skill by 40 points.,300,3600,645,70,Creature Enchantment,0.15,26,16,0,0,1 -5418,Incantation of Void Magic Mastery Self,Increases the caster's Void Magic skill by 45 points.,400,5400,645,80,Creature Enchantment,0.15,26,16,0,0,1 -5419,Void Magic Ineptitude Other I,Decreases the target's Void Magic skill by 10 points.,1,60,644,10,Creature Enchantment,0.01,27,16,0,1,1 -5420,Void Magic Ineptitude Other II,Decreases the target's Void Magic skill by 15 points.,75,90,644,20,Creature Enchantment,0.05,27,16,5,0.85,1 -5421,Void Magic Ineptitude Other III,Decreases the target's Void Magic skill by 20 points.,125,120,644,30,Creature Enchantment,0.1,27,16,5,0.7,1 -5422,Void Magic Ineptitude Other IV,Decreases the target's Void Magic skill by 25 points.,175,150,644,40,Creature Enchantment,0.15,27,16,5,0.55,1 -5423,Void Magic Ineptitude Other V,Decreases the target's Void Magic skill by 30 points.,225,180,644,50,Creature Enchantment,0.2,27,16,5,0.4,1 -5424,Void Magic Ineptitude Other VI,Decreases the target's Void Magic skill by 35 points.,275,210,644,60,Creature Enchantment,0.3,27,16,5,0.25,1 -5425,Void Magic Ineptitude Other VII,Decreases the target's Void Magic skill by 40 points.,325,240,644,70,Creature Enchantment,0.15,27,16,5,0.25,1 -5426,Incantation of Void Magic Ineptitude Other,Decreases the target's Void Magic skill by 45 points.,400,300,644,80,Creature Enchantment,0.15,27,16,5,0.25,1 -5427,Minor Void Magic Aptitude,Increases the target's Void Magic skill by 5 points. Additional spells can be layered over this.,5,780,646,10,Creature Enchantment,0.01,26,16,0,1,1 -5428,Major Void Magic Aptitude,Increases the target's Void Magic skill by 15 points. Additional spells can be layered over this.,15,780,646,10,Creature Enchantment,0.01,26,16,0,1,1 -5429,Epic Void Magic Aptitude,Increases the target's Void Magic skill by 25 points. Additional spells can be layered over this.,25,780,646,10,Creature Enchantment,0.01,26,16,0,1,1 -5430,Moderate Void Magic Aptitude,Increases the target's Void Magic skill by 10 points. Additional spells can be layered over this.,10,780,646,10,Creature Enchantment,0.01,26,16,0,1,1 -5431,Novice Shadow's Void Magic Aptitude,Increases the target's Void Magic skill by 3 points.,1,1800,647,10,Creature Enchantment,0.01,18,16,0,1,1 -5432,Apprentice Voidlock's Void Magic Aptitude,Increases the target's Void Magic skill by 5 points.,2,1800,647,10,Creature Enchantment,0.01,18,16,0,1,1 -5433,Journeyman Voidlock's Void Magic Aptitude,Increases the target's Void Magic skill by 10 points.,3,1800,647,10,Creature Enchantment,0.01,18,16,0,1,1 -5434,Master Voidlock's Void Magic Aptitude,Increases the target's Void Magic skill by 20 points.,4,1800,647,10,Creature Enchantment,0.01,18,16,0,1,1 -5435,Spectral Void Magic Mastery,Increases the caster's Void Magic skill by 150 points for 9 minutes.,250,540,648,70,Creature Enchantment,0.15,26,16,0,0,1 -5436,Prodigal Void Magic Mastery,Increases the caster's Void Magic skill by 250 points.,600,900,648,70,Creature Enchantment,0.15,26,16,0,0,1 -5437,Corruptor's Boon,Increases the target's Void Magic skill by 2 points. Additional spells can be layered over this.,2,780,649,10,Creature Enchantment,0.01,26,16,0,1,1 -5438,Corruptor's Boon,Increases the target's Void Magic skill by 15 points. Additional spells can be layered over this.,2,780,649,10,Creature Enchantment,0.01,26,16,0,1,1 -5439,Acid Spit Streak 1,Spits a stream of acid streaking towards the target. The stream does 54-94 points of acid damage to the first thing it hits.,300,-1,243,70,War Magic,0.15,0,16,30,0.2,1 -5440,Acid Spit 1,Spits a stream of acid at the target. The stream does 149-219 points of acid damage to the first thing it hits.,300,-1,117,35,War Magic,0.15,0,16,30,0.2,1 -5441,Acid Spit 2,Spits a stream of acid at the target. The stream does 182-232 points of acid damage to the first thing it hits.,400,-1,117,40,War Magic,0.15,0,16,30,0.2,1 -5442,Acid Spit Arc 1,Spits a stream of acid at the target. The stream does 149-219 points of acid damage to the first thing it hits.,300,-1,117,35,War Magic,0.15,0,16,30,0.2,1 -5443,Acid Spit Arc 2,Spits a stream of acid at the target. The stream does 182-232 points of acid damage to the first thing it hits.,400,-1,117,40,War Magic,0.15,0,16,30,0.2,1 -5444,Acid Spit Blast 1,Spits five streams of acid outward from the caster. Each stream does 54-94 points of acid damage to the first thing it hits.,325,-1,131,35,War Magic,0.15,0,16,30,0.2,1 -5445,Acid Spit Blast 2,Spits five streams of acid outward from the caster. Each stream does 61-106 points of acid damage to the first thing it hits.,400,-1,131,40,War Magic,0.15,0,16,30,0.2,1 -5446,Acid Spit Volley 1,Spits five streams of acid toward the target. Each stream does 54-94 points of acid damage to the first thing it hits.,325,-1,207,35,War Magic,0.15,0,16,30,0.2,1 -5447,Acid Spit Volley 2,Shoots five streams of acid toward the target. Each stream does 61-106 points of acid damage to the first thing it hits.,400,-1,207,40,War Magic,0.15,0,16,30,0.2,1 -5448,Acid Spit Streak,Spits a stream of acid streaking towards the target. The stream does 61-106 points of acid damage to the first thing it hits.,400,-1,243,80,War Magic,0.15,0,16,30,0.2,1 -5449,Surging Strength,The damage rating of the caster is increased by 20. This spell stacks with other effects that boost damage rating.,2,15,650,70,Life Magic,0.3,162,16,0,0,1 -5450,Towering Defense,The damage reduction rating of the caster is increased by 30. This spell stacks with other effects that boost damage reduction rating.,2,15,651,70,Life Magic,0.3,163,16,0,0,1 -5451,Luminous Vitality,Increases maximum health by 5 points. This spell stacks with other effects that increase health.,5,10800,652,70,Life Magic,0.3,31,16,0,0,1 -5452,Queen's Willpower,Increases the target's Self by 45 points.,400,10800,11,80,Creature Enchantment,0.15,14,16,5,0.25,1 -5453,Queen's Armor,Increases the target's natural armor by 250 points.,400,10800,115,80,Life Magic,0.15,55,16,5,0.25,1 -5454,Queen's Coordination,Increases the target's Coordination by 45 points.,400,10800,7,80,Creature Enchantment,0.15,8,16,5,0.25,1 -5455,Queen's Endurance,Increases the target's Endurance by 45 points.,400,10800,3,80,Creature Enchantment,0.15,10,16,5,0.25,1 -5456,Queen's Focus,Increases the target's Focus by 45 points.,400,10800,9,80,Creature Enchantment,0.15,16,16,5,0.25,1 -5457,Queen's Quickness,Increases the target's Quickness by 45 points.,400,10800,5,80,Creature Enchantment,0.15,12,16,5,0.25,1 -5458,Queen's Strength,Increases the target's Strength by 45 points.,400,10800,1,80,Creature Enchantment,0.15,6,16,5,0.25,1 -5459,Queen's Piercing Protection,Reduces damage the target takes from Piercing by 68%,400,10800,111,80,Life Magic,0.15,45,16,5,0.25,0 -5460,Queen's Acid Protection,Reduces damage the target takes from acid by 68%,400,10800,101,80,Life Magic,0.15,49,16,5,0.25,0 -5461,Queen's Blade Protection,Reduces damage the target takes from Slashing by 68%,400,10800,113,80,Life Magic,0.15,47,16,5,0.25,0 -5462,Queen's Bludgeoning Protection,Reduces damage the target takes from Bludgeoning by 68%,400,10800,103,80,Life Magic,0.15,55,16,5,0.25,0 -5463,Queen's Cold Protection,Reduces damage the target takes from Cold by 68%,400,10800,105,80,Life Magic,0.15,51,16,5,0.25,0 -5464,Queen's Fire Protection,Reduces damage the target takes from fire by 68%,400,10800,109,80,Life Magic,0.15,43,16,5,0.25,0 -5465,Queen's Lightning Protection,Reduces damage the target takes from Lightning by 68%,400,10800,107,80,Life Magic,0.15,53,16,5,0.25,0 -5466,Queen's Rejuvenation,Increases the rate at which the target regains Stamina by 145%.,400,10800,95,80,Life Magic,0.15,41,16,5,0.25,1 -5467,Queen's Mana Renewal,Increases the target's natural mana rate by 145%.,400,10800,97,80,Life Magic,0.15,39,16,5,0.25,1 -5468,Queen's Regeneration,Increase target's natural healing rate by 145%.,400,10800,93,80,Life Magic,0.15,37,16,5,0.25,1 -5469,Queen's Impregnability Other,Increases the target's Missile Defense skill by 45 points.,400,10800,39,80,Creature Enchantment,0.15,22,16,5,0.25,1 -5470,Queen's Invulnerability Other,Increases the target's Melee Defense skill by 45 points.,400,10800,37,80,Creature Enchantment,0.15,22,16,5,0.25,1 -5471,Queen's Magic Resistance,Increases the target's Magic Defense skill by 45 points.,400,10800,41,80,Creature Enchantment,0.15,22,16,5,0.25,1 -5472,Queen's Mana Conversion Mastery,Increases the target's Mana Conversion skill by 45 points.,400,10800,51,80,Creature Enchantment,0.15,26,16,5,0.25,1 -5473,Queen's Salvaging Mastery Other,Increases the caster's Salvaging skill by 45 points.,400,10800,435,80,Creature Enchantment,0.15,26,16,0,0,1 -5474,Queen's Sprint,Increases the target's Run skill by 45 points.,400,10800,77,80,Creature Enchantment,0.15,24,16,5,0.25,1 -5475,Queen's Light Weapon Mastery,Increases the target's Light Weapons skill by 45 points.,400,10800,17,80,Creature Enchantment,0.15,18,16,5,0.25,1 -5476,Queen's War Magic Mastery,Increases the target's War Magic skill by 45 points.,400,10800,49,80,Creature Enchantment,0.15,26,16,5,0.25,1 -5477,Critical Damage Metamorphi I,Your critical damage rating is increased by 2.,1,510,626,70,Life Magic,0.3,35,16,0,0,1 -5478,Critical Damage Metamorphi II,Your critical damage rating is increased by 4.,2,510,626,70,Life Magic,0.3,35,16,0,0,1 -5479,Critical Damage Metamorphi III,Your critical damage rating is increased by 6.,3,510,626,70,Life Magic,0.3,35,16,0,0,1 -5480,Critical Damage Metamorphi IV,Your critical damage rating is increased by 8.,4,510,626,70,Life Magic,0.3,35,16,0,0,1 -5481,Critical Damage Metamorphi V,Your critical damage rating is increased by 10.,5,510,626,70,Life Magic,0.3,35,16,0,0,1 -5482,Critical Damage Metamorphi VI,Your critical damage rating is increased by 12.,6,510,626,70,Life Magic,0.3,35,16,0,0,1 -5483,Critical Damage Metamorphi VII,Your critical damage rating is increased by 14.,7,510,626,70,Life Magic,0.3,35,16,0,0,1 -5484,Critical Damage Metamorphi VIII,Your critical damage rating is increased by 16.,8,510,626,70,Life Magic,0.3,35,16,0,0,1 -5485,Critical Damage Metamorphi IX,Your critical damage rating is increased by 20.,9,510,626,70,Life Magic,0.3,35,16,0,0,1 -5486,Critical Damage Metamorphi X,Your critical damage rating is increased by 24.,10,510,626,70,Life Magic,0.3,35,16,0,0,1 -5487,Critical Damage Metamorphi XI,Your critical damage rating is increased by 30.,11,510,626,70,Life Magic,0.3,35,16,0,0,1 -5489,Critical Damage Reduction Metamorphi I,Your critical damage reduction rating is increased by 2.,1,510,653,70,Life Magic,0.3,35,16,0,0,1 -5490,Critical Damage Reduction Metamorphi II,Your critical damage reduction rating is increased by 4.,2,510,653,70,Life Magic,0.3,35,16,0,0,1 -5491,Critical Damage Reduction Metamorphi III,Your critical damage reduction rating is increased by 6.,3,510,653,70,Life Magic,0.3,35,16,0,0,1 -5492,Critical Damage Reduction Metamorphi IV,Your critical damage reduction rating is increased by 8.,4,510,653,70,Life Magic,0.3,35,16,0,0,1 -5493,Critical Damage Reduction Metamorphi V,Your critical damage reduction rating is increased by 10.,5,510,653,70,Life Magic,0.3,35,16,0,0,1 -5494,Critical Damage Reduction Metamorphi VI,Your critical damage reduction rating is increased by 12.,6,510,653,70,Life Magic,0.3,35,16,0,0,1 -5495,Critical Damage Reduction Metamorphi VII,Your critical damage reduction rating is increased by 14.,7,510,653,70,Life Magic,0.3,35,16,0,0,1 -5496,Critical Damage Reduction Metamorphi VIII,Your critical damage reduction rating is increased by 16.,8,510,653,70,Life Magic,0.3,35,16,0,0,1 -5497,Critical Damage Reduction Metamorphi IX,Your critical damage reduction rating is increased by 20.,9,510,653,70,Life Magic,0.3,35,16,0,0,1 -5498,Critical Damage Reduction Metamorphi X,Your critical damage reduction rating is increased by 24.,10,510,653,70,Life Magic,0.3,35,16,0,0,1 -5499,Critical Damage Reduction Metamorphi XI,Your critical damage reduction rating is increased by 30.,11,510,653,70,Life Magic,0.3,35,16,0,0,1 -5500,Damage Metamorphi I,Your damage rating is increased by 1.,1,510,620,70,Life Magic,0.3,35,16,0,0,1 -5501,Damage Metamorphi II,Your damage rating is increased by 2.,2,510,620,70,Life Magic,0.3,35,16,0,0,1 -5502,Damage Metamorphi III,Your damage rating is increased by 3.,3,510,620,70,Life Magic,0.3,35,16,0,0,1 -5503,Damage Metamorphi IV,Your damage rating is increased by 4.,4,510,620,70,Life Magic,0.3,35,16,0,0,1 -5504,Damage Metamorphi V,Your damage rating is increased by 5.,5,510,620,70,Life Magic,0.3,35,16,0,0,1 -5505,Damage Metamorphi VI,Your damage rating is increased by 6.,6,510,620,70,Life Magic,0.3,35,16,0,0,1 -5506,Damage Metamorphi VII,Your damage rating is increased by 7.,7,510,620,70,Life Magic,0.3,35,16,0,0,1 -5507,Damage Metamorphi VIII,Your damage rating is increased by 8.,8,510,620,70,Life Magic,0.3,35,16,0,0,1 -5508,Damage Metamorphi IX,Your damage rating is increased by 10.,9,510,620,70,Life Magic,0.3,35,16,0,0,1 -5509,Damage Metamorphi X,Your damage rating is increased by 12.,10,510,620,70,Life Magic,0.3,35,16,0,0,1 -5510,Damage Metamorphi XI,Your damage rating is increased by 15.,11,510,620,70,Life Magic,0.3,35,16,0,0,1 -5511,Damage Reduction Metamorphi I,Your damage reduction rating is increased by 1.,1,510,621,70,Life Magic,0.3,35,16,0,0,1 -5512,Damage Reduction Metamorphi II,Your damage reduction rating is increased by 2.,2,510,621,70,Life Magic,0.3,35,16,0,0,1 -5513,Damage Reduction Metamorphi III,Your damage reduction rating is increased by 3.,3,510,621,70,Life Magic,0.3,35,16,0,0,1 -5514,Damage Reduction Metamorphi IV,Your damage reduction rating is increased by 4.,4,510,621,70,Life Magic,0.3,35,16,0,0,1 -5515,Damage Reduction Metamorphi V,Your damage reduction rating is increased by 5.,5,510,621,70,Life Magic,0.3,35,16,0,0,1 -5516,Damage Reduction Metamorphi VI,Your damage reduction rating is increased by 6.,6,510,621,70,Life Magic,0.3,35,16,0,0,1 -5517,Damage Reduction Metamorphi VII,Your damage reduction rating is increased by 7.,7,510,621,70,Life Magic,0.3,35,16,0,0,1 -5518,Damage Reduction Metamorphi VIII,Your damage reduction rating is increased by 8.,8,510,621,70,Life Magic,0.3,35,16,0,0,1 -5519,Damage Reduction Metamorphi IX,Your damage reduction rating is increased by 10.,9,510,621,70,Life Magic,0.3,35,16,0,0,1 -5520,Damage Reduction Metamorphi X,Your damage reduction rating is increased by 12.,10,510,621,70,Life Magic,0.3,35,16,0,0,1 -5521,Damage Reduction Metamorphi XI,Your damage reduction rating is increased by 15.,11,510,621,70,Life Magic,0.3,35,16,0,0,1 -5522,Acid Spit Vulnerability 1,Increases damage the target takes from acid by 185%.,325,-1,102,70,War Magic,0.15,50,16,5,0.25,1 -5523,Acid Spit Vulnerability 2,Increases damage the target takes from acid by 210%.,400,-1,102,80,War Magic,0.15,50,16,5,0.25,1 -5524,Falling stalactite,Stalactites fall from the ceiling piercing anyone below.,400,-1,237,120,War Magic,0.25,0,0,30,0.5,1 -5525,Bloodstone Bolt I,Shoots a bolt of corrupted life energy at the target. The bolt drains 16-40 points of health from the first thing it hits.,1,-1,80,10,Life Magic,0.15,0,16,30,0.2,1 -5526,Bloodstone Bolt II,Shoots a bolt of corrupted life energy at the target. The bolt drains 32-64 points of health from the first thing it hits.,50,-1,80,20,Life Magic,0.15,0,16,30,0.2,1 -5527,Bloodstone Bolt III,Shoots a bolt of corrupted life energy at the target. The bolt drains 48-88 points of health from the first thing it hits.,100,-1,80,30,Life Magic,0.15,0,16,30,0.2,1 -5528,Bloodstone Bolt IV,Shoots a bolt of corrupted life energy at the target. The bolt drains 56-112 points of health from the first thing it hits.,150,-1,80,40,Life Magic,0.15,0,16,30,0.2,1 -5529,Bloodstone Bolt V,Shoots a bolt of corrupted life energy at the target. The bolt drains 64-136 points of health from the first thing it hits.,200,-1,80,50,Life Magic,0.15,0,16,30,0.2,1 -5530,Bloodstone Bolt VI,Shoots a bolt of corrupted life energy at the target. The bolt drains 80-160 points of health from the first thing it hits.,250,-1,80,60,Life Magic,0.15,0,16,30,0.2,1 -5531,Bloodstone Bolt VII,Shoots a bolt of corrupted life energy at the target. The bolt drains 128-200 points of health from the first thing it hits.,300,-1,80,70,Life Magic,0.15,0,16,30,0.2,1 -5532,Incantation of Bloodstone Bolt,Shoots a bolt of corrupted life energy at the target. The bolt drains 192-248 points of health from the first thing it hits.,400,-1,80,80,Life Magic,0.15,0,16,30,0.2,1 -5533,Entering Lord Kastellar's Lab,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5534,Entering the Bloodstone Factory,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5535,Acidic Blood,Shoots a stream of acidic blood at the target. The stream does 80-160 points of acid damage to the first thing it hits.,250,-1,117,30,War Magic,0.3,0,16,30,0.2,1 -5536,Acidic Blood,Shoots a stream of acidic blood at the target. The stream does 135-195 points of acid damage to the first thing it hits.,400,-1,117,40,War Magic,0.15,0,16,30,0.2,1 -5537,Acidic Blood,Shoots a stream of acidic blood at the target. The stream does 50-100 points of acid damage to the first thing it hits.,150,-1,117,20,War Magic,0.15,0,16,30,0.4,1 -5538,Darkened Heart,Your heart. darkened with hate. provides an increase to your Void Magic skill by 2.,2,10800,649,10,Creature Enchantment,0.01,26,16,0,1,1 -5539,Warded Cavern Passage,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5540,Warded Dungeon Passage,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -5541,Lost City of Neftet Recall,Sends the caster to the Lost City of Neftet.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -5542,Burning Sands Infliction,You've been covered in burning sand. causing damage over time. The target loses 357 points of health over 30 seconds.,350,30,618,80,Life Magic,0.15,32,16,5,0.25,1 -5543,Curse of the Burning Sands,Your wounds are cursed and don't heal as well.,350,300,619,80,Life Magic,0.15,38,16,5,0.25,1 -5544,Nether Blast I,Shoots three bolts of nether outward from the caster. Each bolt does 10-21 points of nether damage to the first thing it hits.,75,-1,135,40,Void Magic,0.2,0,16,15,0.33,1 -5545,Nether Blast II,Shoots three bolts of nether outward from the caster. Each bolt does 10-21 points of nether damage to the first thing it hits.,75,-1,135,40,Void Magic,0.2,0,16,15,0.33,1 -5546,Nether Blast III,Shoots three bolts of nether outward from the caster. Each bolt does 21-47 points of nether damage to the first thing it hits.,125,-1,135,15,Void Magic,0.15,0,16,30,0.5,1 -5547,Nether Blast IV,Shoots three bolts of nether outward from the caster. Each bolt does 31-63 points of nether damage to the first thing it hits.,175,-1,135,20,Void Magic,0.2,0,16,30,0.4,1 -5548,Nether Blast V,Shoots three bolts of nether outward from the caster. Each bolt does 36-73 points of nether damage to the first thing it hits.,225,-1,135,25,Void Magic,0.3,0,16,30,0.3,1 -5549,Nether Blast VI,Shoots three bolts of nether outward from the caster. Each bolt does 42-89 points of nether damage to the first thing it hits.,275,-1,135,30,Void Magic,0.4,0,16,30,0.2,1 -5550,Nether Blast VII,Shoots five bolts of nether outward from the caster. Each bolt does 78-126 points of nether damage to the first thing it hits.,325,-1,135,35,Void Magic,0.15,0,16,30,0.2,1 -5551,Incantation of Nether Blast,Shoots five bolts of nether outward from the caster. Each bolt does 115-158 points of nether damage to the first thing it hits.,400,-1,135,40,Void Magic,0.15,0,16,30,0.2,1 -5552,Sigil of Purity IX,Your DoT reduction rating is increased by 36.,9,510,658,70,Life Magic,0.3,31,16,0,0,1 -5553,Sigil of Perserverance I,Your health drain resistance rating is increased by 4.,1,510,657,70,Life Magic,0.3,31,16,0,0,1 -5554,Sigil of Perserverance X,Your health drain resistance rating is increased by 40.,10,510,657,70,Life Magic,0.3,31,16,0,0,1 -5555,Sigil of Perserverance XI,Your health drain resistance rating is increased by 44.,11,510,657,70,Life Magic,0.3,31,16,0,0,1 -5556,Sigil of Perserverance XII,Your health drain resistance rating is increased by 48.,12,510,657,70,Life Magic,0.3,31,16,0,0,1 -5557,Sigil of Perserverance XIII,desc desc Your health drain resistance rating is increased by 52.,13,510,657,70,Life Magic,0.3,31,16,0,0,1 -5558,Sigil of Perserverance XIV,desc desc Your health drain resistance rating is increased by 56.,14,510,657,70,Life Magic,0.3,31,16,0,0,1 -5559,Sigil of Perserverance XV,desc desc Your health drain resistance rating is increased by 50.,15,510,657,70,Life Magic,0.3,31,16,0,0,1 -5560,Sigil of Perserverance II,Your health drain resistance rating is increased by 8.,2,510,657,70,Life Magic,0.3,31,16,0,0,1 -5561,Sigil of Perserverance III,Your health drain resistance rating is increased by 12.,3,510,657,70,Life Magic,0.3,31,16,0,0,1 -5562,Sigil of Perserverance IV,Your health drain resistance rating is increased by 16.,4,510,657,70,Life Magic,0.3,31,16,0,0,1 -5563,Sigil of Perserverance V,Your health drain resistance rating is increased by 20.,5,510,657,70,Life Magic,0.3,31,16,0,0,1 -5564,Sigil of Perserverance VI,Your health drain resistance rating is increased by 24.,6,510,657,70,Life Magic,0.3,31,16,0,0,1 -5565,Sigil of Perserverance VII,Your health drain resistance rating is increased by 28.,7,510,657,70,Life Magic,0.3,31,16,0,0,1 -5566,Sigil of Perserverance VIII,Your health drain resistance rating is increased by 32.,8,510,657,70,Life Magic,0.3,31,16,0,0,1 -5567,Sigil of Perserverance IX,Your health drain resistance rating is increased by 36.,9,510,657,70,Life Magic,0.3,31,16,0,0,1 -5568,Sigil of Purity I,Your DoT reduction rating is increased by 4.,1,510,658,70,Life Magic,0.3,31,16,0,0,1 -5569,Sigil of Purity X,Your DoT reduction rating is increased by 40.,10,510,658,70,Life Magic,0.3,31,16,0,0,1 -5570,Sigil of Purity XI,Your DoT reduction rating is increased by 44.,11,510,658,70,Life Magic,0.3,31,16,0,0,1 -5571,Sigil of Purity XII,Your DoT reduction rating is increased by 48.,12,510,658,70,Life Magic,0.3,31,16,0,0,1 -5572,Sigil of Purity XIII,Your DoT reduction rating is increased by 52.,13,510,658,70,Life Magic,0.3,31,16,0,0,1 -5573,Sigil of Purity XIV,Your DoT reduction rating is increased by 56.,14,510,658,70,Life Magic,0.3,31,16,0,0,1 -5574,Sigil of Purity XV,Your DoT reduction rating is increased by 60.,15,510,658,70,Life Magic,0.3,31,16,0,0,1 -5575,Sigil of Purity II,Your DoT reduction rating is increased by 8.,2,510,658,70,Life Magic,0.3,31,16,0,0,1 -5576,Sigil of Purity III,Your DoT reduction rating is increased by 12.,3,510,658,70,Life Magic,0.3,31,16,0,0,1 -5577,Sigil of Purity IV,Your DoT reduction rating is increased by 16.,4,510,658,70,Life Magic,0.3,31,16,0,0,1 -5578,Sigil of Purity V,Your DoT reduction rating is increased by 20.,5,510,658,70,Life Magic,0.3,31,16,0,0,1 -5579,Sigil of Purity VI,Your DoT reduction rating is increased by 24.,6,510,658,70,Life Magic,0.3,31,16,0,0,1 -5580,Sigil of Purity VII,Your DoT reduction rating is increased by 28.,7,510,658,70,Life Magic,0.3,31,16,0,0,1 -5581,Sigil of Purity VIII,Your DoT reduction rating is increased by 32.,8,510,658,70,Life Magic,0.3,31,16,0,0,1 -5582,Nullify All Rares,Dispels all rare enchantments on the player.,600,-1,250,340,Life Magic,0.35,148,16,30,0.25,1 -5583,Weave of Alchemy I,Increases the target's Alchemy skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5584,Weave of Alchemy II,Increases the target's Alchemy skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5585,Weave of Alchemy III,Increases the target's Alchemy skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5586,Weave of Alchemy IV,Increases the target's Alchemy skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5587,Weave of Alchemy V,Increases the target's Alchemy skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5588,Weave of Arcane Lore I,Increases the target's Arcane Lore skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5589,Weave of Arcane Lore II,Increases the target's Arcane Lore skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5590,Weave of Arcane Lore III,Increases the target's Arcane Lore skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5591,Weave of Arcane Lore IV,Increases the target's Arcane Lore skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5592,Weave of Arcane Lore V,Increases the target's Arcane Lore skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5593,Weave of Armor Tinkering I,Increases the target's Armor Tinkering skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5594,Weave of Armor Tinkering II,Increases the target's Armor Tinkering skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5595,Weave of Armor Tinkering III,Increases the target's Armor Tinkering skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5596,Weave of Armor Tinkering IV,Increases the target's Armor Tinkering skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5597,Weave of Armor Tinkering V,Increases the target's Armor Tinkering skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5598,Weave of Person Attunement I,Increases the target's Assess Person skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5599,Weave of Person Attunement II,Increases the target's Assess Person skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5600,Weave of Person Attunement III,Increases the target's Assess Person skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5601,Weave of Person Attunement IV,Increases the target's Assess Person skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5602,Weave of the Person Attunement V,Increases the target's Assess Person skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5603,Weave of Light Weapons I,Increases the target's Light Weapons skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5604,Weave of Light Weapons II,Increases the target's Light Weapons skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5605,Weave of Light Weapons III,Increases the target's Light Weapons skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5606,Weave of Light Weapons IV,Increases the target's Light Weapons skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5607,Weave of Light Weapons V,Increases the target's Light Weapons skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5608,Weave of Missile Weapons I,Increases the target's Missile Weapons skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5609,Weave of Missile Weapons II,Increases the target's Missile Weapons skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5610,Weave of Missile Weapons III,Increases the target's Missile Weapons skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5611,Weave of Missile Weapons IV,Increases the target's Missile Weapons skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5612,Weave of Missile Weapons V,Increases the target's Missile Weapons skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5613,Weave of Cooking I,Increases the target's Cooking skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5614,Weave of Cooking II,Increases the target's Cooking skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5615,Weave of Cooking III,Increases the target's Cooking skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5616,Weave of Cooking IV,Increases the target's Cooking skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5617,Weave of the Cooking V,Increases the target's Cooking skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5618,Weave of Creature Enchantment I,Increases the target's Creature Enchantment skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5619,Weave of Creature Enchantment II,Increases the target's Creature Enchantment skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5620,Weave of Creature Enchantment III,Increases the target's Creature Enchantment skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5621,Weave of Creature Enchantment IV,Increases the target's Creature Enchantment skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5622,Weave of the Creature Enchantment V,Increases the target's Creature Enchantment skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5623,Weave of Missile Weapons I,Increases the target's Missile Weapons skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5624,Weave of Missile Weapons II,Increases the target's Missile Weapons skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5625,Weave of Missile Weapons III,Increases the target's Missile Weapons skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5626,Weave of Missile Weapons IV,Increases the target's Missile Weapons skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5627,Weave of Missile Weapons V,Increases the target's Missile Weapons skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5628,Weave of Finesse Weapons I,Increases the target's Finesse Weapons skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5629,Weave of Finesse Weapons II,Increases the target's Finesse Weapons skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5630,Weave of Finesse Weapons III,Increases the target's Finesse Weapons skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5631,Weave of Finesse Weapons IV,Increases the target's Finesse Weapons skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5632,Weave of Finesse Weapons V,Increases the target's Finesse Weapons skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5633,Weave of Deception I,Increases the target's Deception skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5634,Weave of the Deception II,Increases the target's Deception skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5635,Weave of the Deception III,Increases the target's Deception skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5636,Weave of the Deception IV,Increases the target's Deception skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5637,Weave of the Deception V,Increases the target's Deception skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5638,Weave of Fletching I,Increases the target's Fletching skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5639,Weave of the Fletching II,Increases the target's Fletching skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5640,Weave of the Fletching III,Increases the target's Fletching skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5641,Weave of the Fletching IV,Increases the target's Fletching skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5642,Weave of the Fletching V,Increases the target's Fletching skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5643,Weave of Healing I,Increases the target's Healing skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5644,Weave of the Healing II,Increases the target's Healing skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5645,Weave of the Healing III,Increases the target's Healing skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5646,Weave of the Healing IV,Increases the target's Healing skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5647,Weave of the Healing V,Increases the target's Healing skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5648,Weave of Item Enchantment I,Increases the target's Item Enchantment skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5649,Weave of Item Enchantment II,Increases the target's Item Enchantment skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5650,Weave of Item Enchantment III,Increases the target's Item Enchantment skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5651,Weave of Item Enchantment IV,Increases the target's Item Enchantment skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5652,Weave of the Item Enchantment V,Increases the target's Item Enchantment skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5653,Weave of Item Tinkering I,Increases the target's Item Tinkering skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5654,Weave of Item Tinkering II,Increases the target's Item Tinkering skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5655,Weave of Item Tinkering III,Increases the target's Item Tinkering skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5656,Weave of Item Tinkering IV,Increases the target's Item Tinkering skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5657,Weave of the Item Tinkering V,Increases the target's Item Tinkering skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5658,Weave of Leadership I,Increases the target's Leadership skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5659,Weave of Leadership II,Increases the target's Leadership skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5660,Weave of Leadership III,Increases the target's Leadership skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5661,Weave of Leadership IV,Increases the target's Leadership skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5662,Weave of Leadership V,Increases the target's Leadership skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5663,Weave of Life Magic I,Increases the target's Life Magic skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5664,Weave of Life Magic II,Increases the target's Life Magic skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5665,Weave of Life Magic III,Increases the target's Life Magic skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5666,Weave of Life Magic IV,Increases the target's Life Magic skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5667,Weave of Life Magic V,Increases the target's Life Magic skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5668,Weave of Fealty I,Increases the target's Loyalty skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5669,Weave of Fealty II,Increases the target's Loyalty skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5670,Weave of Fealty III,Increases the target's Loyalty skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5671,Weave of Fealty IV,Increases the target's Loyalty skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5672,Weave of Fealty V,Increases the target's Loyalty skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,20,16,0,0,1 -5673,Weave of Light Weapons I,Increases the target's Light Weapons skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5674,Weave of Light Weapons II,Increases the target's Light Weapons skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5675,Weave of Light Weapons III,Increases the target's Light Weapons skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5676,Weave of Light Weapons IV,Increases the target's Light Weapons skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5677,Weave of Light Weapons V,Increases the target's Light Weapons skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5678,Weave of Magic Resistance I,Increases the target's Magic Defense skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5679,Weave of Magic Resistance II,Increases the target's Magic Defense skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5680,Weave of Magic Resistance III,Increases the target's Magic Defense skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5681,Weave of Magic Resistance IV,Increases the target's Magic Defense skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5682,Weave of the Magic Resistance V,Increases the target's Magic Defense skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5683,Weave of Magic Item Tinkering I,Increases the target's Magic Item Tinkering skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5684,Weave of Magic Item Tinkering II,Increases the target's Magic Item Tinkering skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5685,Weave of Magic Item Tinkering III,Increases the target's Magic Item Tinkering skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5686,Weave of Magic Item Tinkering IV,Increases the target's Magic Item Tinkering skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5687,Weave of the Magic Item Tinkering V,Increases the target's Magic Item Tinkering skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5688,Weave of Mana Conversion I,Increases the target's Mana Conversion skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5689,Weave of Mana Conversion II,Increases the target's Mana Conversion skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5690,Weave of Mana Conversion III,Increases the target's Mana Conversion skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5691,Weave of Mana Conversion IV,Increases the target's Mana Conversion skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5692,Weave of Mana Conversion V,Increases the target's Mana Conversion skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5693,Weave of Invulnerability I,Increases the target's Melee Defense skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5694,Weave of Invulnerability II,Increases the target's Melee Defense skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5695,Weave of Invulnerability III,Increases the target's Melee Defense skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5696,Weave of Invulnerability IV,Increases the target's Melee Defense skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5697,Weave of the Invulnerability V,Increases the target's Melee Defense skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5698,Weave of Impregnability I,Increases the target's Missile Defense skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5699,Weave of Impregnability II,Increases the target's Missile Defense skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5700,Weave of Impregnability III,Increases the target's Missile Defense skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5701,Weave of Impregnability IV,Increases the target's Missile Defense skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5702,Weave of the Impregnability V,Increases the target's Missile Defense skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,22,16,0,0,1 -5703,Weave of Salvaging I,Increases the target's Salvaging skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5704,Weave of Salvaging II,Increases the target's Salvaging skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5705,Weave of Salvaging III,Increases the target's Salvaging skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5706,Weave of Salvaging IV,Increases the target's Salvaging skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5707,Weave of Salvaging V,Increases the target's Salvaging skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5708,Weave of Light Weapons I,Increases the target's Light Weapons skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5709,Weave of Light Weapons II,Increases the target's Light Weapons skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5710,Weave of Light Weapons III,Increases the target's Light Weapons skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5711,Weave of Light Weapons IV,Increases the target's Light Weapons skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5712,Weave of Light Weapons V,Increases the target's Light Weapons skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5713,Weave of Light Weapons I,Increases the target's Light Weapons skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5714,Weave of Light Weapons II,Increases the target's Light Weapons skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5715,Weave of Light Weapons III,Increases the target's Light Weapons skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5716,Weave of Light Weapons IV,Increases the target's Light Weapons skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5717,Weave of Light Weapons V,Increases the target's Light Weapons skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5718,Weave of Heavy Weapons I,Increases the target's Heavy Weapons skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5719,Weave of Heavy Weapons II,Increases the target's Heavy Weapons skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5720,Weave of Heavy Weapons III,Increases the target's Heavy Weapons skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5721,Weave of Heavy Weapons IV,Increases the target's Heavy Weapons skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5722,Weave of Heavy Weapons V,Increases the target's Heavy Weapons skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5723,Weave of Missile Weapons I,Increases the target's Missile Weapons skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5724,Weave of Missile Weapons II,Increases the target's Missile Weapons skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5725,Weave of Missile Weapons III,Increases the target's Missile Weapons skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5726,Weave of Missile Weapons IV,Increases the target's Missile Weapons skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5727,Weave of Missile Weapons V,Increases the target's Missile Weapons skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5728,Weave of Two Handed Combat I,Increases the target's Two Handed Combat skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5729,Weave of Two Handed Combat II,Increases the target's Two Handed Combat skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5730,Weave of Two Handed Combat III,Increases the target's Two Handed Combat skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5731,Weave of Two Handed Combat IV,Increases the target's Two Handed Combat skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5732,Weave of Two Handed Combat V,Increases the target's Two Handed Combat skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5733,Weave of Light Weapons I,Increases the target's Light Weapons skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5734,Weave of Light Weapons II,Increases the target's Light Weapons skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5735,Weave of Light Weapons III,Increases the target's Light Weapons skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5736,Weave of Light Weapons IV,Increases the target's Light Weapons skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5737,Weave of Light Weapons V,Increases the target's Light Weapons skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5738,Weave of Void Magic I,Increases the target's Void Magic skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5739,Weave of Void Magic II,Increases the target's Void Magic skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5740,Weave of Void Magic III,Increases the target's Void Magic skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5741,Weave of Void Magic IV,Increases the target's Void Magic skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5742,Weave of Void Magic V,Increases the target's Void Magic skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5743,Weave of War Magic I,Increases the target's War Magic skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5744,Weave of War Magic II,Increases the target's War Magic skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5745,Weave of War Magic III,Increases the target's War Magic skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5746,Weave of War Magic IV,Increases the target's War Magic skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5747,Weave of War Magic V,Increases the target's War Magic skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5748,Weave of Weapon Tinkering I,Increases the target's Weapon Tinkering skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5749,Weave of Weapon Tinkering II,Increases the target's Weapon Tinkering skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5750,Weave of Weapon Tinkering III,Increases the target's Weapon Tinkering skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5751,Weave of Weapon Tinkering IV,Increases the target's Weapon Tinkering skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5752,Weave of the Weapon Tinkering V,Increases the target's Weapon Tinkering skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5753,Cloaked in Skill,Increases all of the target's skills by 20 for 20 seconds.,1,20,660,70,Creature Enchantment,0.15,22,16,5,0.25,1 -5754,Shroud of Darkness (Magic),Decreases the target's Magic Defense skill by half.,1,-1,661,70,Creature Enchantment,0.15,23,16,4.5,0,1 -5755,Shroud of Darkness (Melee),Decreases the targets's Melee Defense skill by half.,1,-1,662,70,Creature Enchantment,0.15,23,16,4.5,0,1 -5756,Shroud of Darkness (Missile),Decreases the target's Missile Defense skill by half.,1,-1,663,70,Creature Enchantment,0.15,23,16,4.5,0,1 -5757,Weave of Creature Attunement III,Increases the target's Assess Creature skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -5758,Weave of Creature Attunement IV,Increases the target's Assess Creature skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5759,Weave of the Creature Attunement V,Increases the target's Assess Creature skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5760,Weave of Creature Attunement I,Increases the target's Assess Creature skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5761,Weave of Creature Attunement II,Increases the target's Assess Creature skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,28,16,0,0,1 -5762,Rolling Death,A giant snowball.,320,-1,117,120,War Magic,0,0,0,100,0,1 -5763,Dirty Fighting Ineptitude Other I,Decreases the target's Dirty Fighting skill by 10 points.,1,60,664,10,Creature Enchantment,0.01,29,16,0,1,1 -5764,Dirty Fighting Ineptitude Other II,Decreases the target's Dirty Fighting skill by 15 points.,75,90,664,20,Creature Enchantment,0.05,21,16,5,0.85,1 -5765,Dirty Fighting Ineptitude Other III,Decreases the target's Dirty Fighting skill by 20 points.,125,120,664,30,Creature Enchantment,0.1,21,16,5,0.7,1 -5766,Dirty Fighting Ineptitude Other IV,Decreases the target's Dirty Fighting skill by 25 points.,175,150,664,40,Creature Enchantment,0.15,21,16,5,0.55,1 -5767,Dirty Fighting Ineptitude Other V,Decreases the target's Dirty Fighting skill by 30 points.,225,180,664,50,Creature Enchantment,0.2,21,16,5,0.4,1 -5768,Dirty Fighting Ineptitude Other VI,Decreases the target's Dirty Fighting skill by 35 points.,275,210,664,60,Creature Enchantment,0.3,21,16,5,0.25,1 -5769,Dirty Fighting Ineptitude Other VII,Decreases the target's Dirty Fighting skill by 40 points.,325,240,664,70,Creature Enchantment,0.15,21,16,5,0.25,1 -5770,Incantation of Dirty Fighting Ineptitude Other,Decreases the target's Dirty Fighting skill by 45 points.,400,300,664,80,Creature Enchantment,0.15,21,16,5,0.25,1 -5771,Dirty Fighting Mastery Other I,Increases the target's Dirty Fighting skill by 10 points.,1,1800,665,10,Creature Enchantment,0.01,20,16,0,1,1 -5772,Dirty Fighting Mastery Other II,Increases the target's Dirty Fighting skill by 15 points.,50,1800,665,20,Creature Enchantment,0.05,20,16,5,0.85,1 -5773,Dirty Fighting Mastery Other III,Increases the target's Dirty Fighting skill by 20 points.,100,1800,665,30,Creature Enchantment,0.1,20,16,5,0.7,1 -5774,Dirty Fighting Mastery Other IV,Increases the target's Dirty Fighting skill by 25 points.,150,1800,665,40,Creature Enchantment,0.15,20,16,5,0.55,1 -5775,Dirty Fighting Mastery Other V,Increases the target's Dirty Fighting skill by 30 points.,200,1800,665,50,Creature Enchantment,0.2,20,16,5,0.4,1 -5776,Dirty Fighting Mastery Other VI,Increases the target's Dirty Fighting skill by 35 points.,250,2700,665,60,Creature Enchantment,0.3,20,16,5,0.25,1 -5777,Dirty Fighting Mastery Other VII,Increases the target's Dirty Fighting skill by 40 points.,300,3600,665,70,Creature Enchantment,0.15,20,16,5,0.25,1 -5778,Incantation of Dirty Fighting Mastery Other,Increases the target's Dirty Fighting skill by 45 points.,400,5400,665,80,Creature Enchantment,0.15,20,16,5,0.25,1 -5779,Dirty Fighting Mastery Self I,Increases the caster's Dirty Fighting skill by 10 points.,1,1800,665,15,Creature Enchantment,0.01,20,16,0,0,1 -5780,Dirty Fighting Mastery Self II,Increases the caster's Dirty Fighting skill by 15 points.,50,1800,665,30,Creature Enchantment,0.05,20,16,0,0,1 -5781,Dirty Fighting Mastery Self III,Increases the caster's Dirty Fighting skill by 20 points.,100,1800,665,40,Creature Enchantment,0.1,20,16,0,0,1 -5782,Dirty Fighting Mastery Self IV,Increases the caster's Dirty Fighting skill by 25 points.,150,1800,665,50,Creature Enchantment,0.15,20,16,0,0,1 -5783,Dirty Fighting Mastery Self V,Increases the caster's Dirty Fighting skill by 30 points.,200,1800,665,60,Creature Enchantment,0.2,20,16,0,0,1 -5784,Dirty Fighting Mastery Self VI,Increases the caster's Dirty Fighting skill by 35 points.,250,2700,665,70,Creature Enchantment,0.3,20,16,0,0,1 -5785,Dirty Fighting Mastery Self VII,Increases the caster's Dirty Fighting skill by 40 points.,300,3600,665,70,Creature Enchantment,0.15,20,16,0,0,1 -5786,Incantation of Dirty Fighting Mastery Self,Increases the caster's Dirty Fighting skill by 45 points.,400,5400,665,80,Creature Enchantment,0.15,20,16,0,0,1 -5787,Dual Wield Ineptitude Other I,Decreases the target's Dual Wield skill by 10 points.,1,60,667,10,Creature Enchantment,0.01,29,16,0,1,1 -5788,Dual Wield Ineptitude Other II,Decreases the target's Dual Wield skill by 15 points.,75,90,667,20,Creature Enchantment,0.05,21,16,5,0.85,1 -5789,Dual Wield Ineptitude Other III,Decreases the target's Dual Wield skill by 20 points.,125,120,667,30,Creature Enchantment,0.1,21,16,5,0.7,1 -5790,Dual Wield Ineptitude Other IV,Decreases the target's Dual Wield skill by 25 points.,175,150,667,40,Creature Enchantment,0.15,21,16,5,0.55,1 -5791,Dual Wield Ineptitude Other V,Decreases the target's Dual Wield skill by 30 points.,225,180,667,50,Creature Enchantment,0.2,21,16,5,0.4,1 -5792,Dual Wield Ineptitude Other VI,Decreases the target's Dual Wield skill by 35 points.,275,210,667,60,Creature Enchantment,0.3,21,16,5,0.25,1 -5793,Dual Wield Ineptitude Other VII,Decreases the target's Dual Wield skill by 40 points.,325,240,667,70,Creature Enchantment,0.15,21,16,5,0.25,1 -5794,Incantation of Dual Wield Ineptitude Other,Decreases the target's Dual Wield skill by 45 points.,400,300,667,80,Creature Enchantment,0.15,21,16,5,0.25,1 -5795,Dual Wield Mastery Other I,Increases the target's Dual Wield skill by 10 points.,1,1800,668,10,Creature Enchantment,0.01,20,16,0,1,1 -5796,Dual Wield Mastery Other II,Increases the target's Dual Wield skill by 15 points.,50,1800,668,20,Creature Enchantment,0.05,20,16,5,0.85,1 -5797,Dual Wield Mastery Other III,Increases the target's Dual Wield skill by 20 points.,100,1800,668,30,Creature Enchantment,0.1,20,16,5,0.7,1 -5798,Dual Wield Mastery Other IV,Increases the target's Dual Wield skill by 25 points.,150,1800,668,40,Creature Enchantment,0.15,20,16,5,0.55,1 -5799,Dual Wield Mastery Other V,Increases the target's Dual Wield skill by 30 points.,200,1800,668,50,Creature Enchantment,0.2,20,16,5,0.4,1 -5800,Dual Wield Mastery Other VI,Increases the target's Dual Wield skill by 35 points.,250,2700,668,60,Creature Enchantment,0.3,20,16,5,0.25,1 -5801,Dual Wield Mastery Other VII,Increases the target's Dual Wield skill by 40 points.,300,3600,668,70,Creature Enchantment,0.15,20,16,5,0.25,1 -5802,Incantation of Dual Wield Mastery Other,Increases the target's Dual Wield skill by 45 points.,400,5400,668,80,Creature Enchantment,0.15,20,16,5,0.25,1 -5803,Dual Wield Mastery Self I,Increases the caster's Dual Wield skill by 10 points.,1,1800,668,15,Creature Enchantment,0.01,20,16,0,0,1 -5804,Dual Wield Mastery Self II,Increases the caster's Dual Wield skill by 15 points.,50,1800,668,30,Creature Enchantment,0.05,20,16,0,0,1 -5805,Dual Wield Mastery Self III,Increases the caster's Dual Wield skill by 20 points.,100,1800,668,40,Creature Enchantment,0.1,20,16,0,0,1 -5806,Dual Wield Mastery Self IV,Increases the caster's Dual Wield skill by 25 points.,150,1800,668,50,Creature Enchantment,0.15,20,16,0,0,1 -5807,Dual Wield Mastery Self V,Increases the caster's Dual Wield skill by 30 points.,200,1800,668,60,Creature Enchantment,0.2,20,16,0,0,1 -5808,Dual Wield Mastery Self VI,Increases the caster's Dual Wield skill by 35 points.,250,2700,668,70,Creature Enchantment,0.3,20,16,0,0,1 -5809,Dual Wield Mastery Self VII,Increases the caster's Dual Wield skill by 40 points.,300,3600,668,70,Creature Enchantment,0.15,20,16,0,0,1 -5810,Incantation of Dual Wield Mastery Self,Increases the caster's Dual Wield skill by 45 points.,400,5400,668,80,Creature Enchantment,0.15,20,16,0,0,1 -5811,Recklessness Ineptitude Other I,Decreases the target's Recklessness skill by 10 points.,1,60,670,10,Creature Enchantment,0.01,29,16,0,1,1 -5812,Recklessness Ineptitude Other II,Decreases the target's Recklessness skill by 15 points.,75,90,670,20,Creature Enchantment,0.05,21,16,5,0.85,1 -5813,Recklessness Ineptitude Other III,Decreases the target's Recklessness skill by 20 points.,125,120,670,30,Creature Enchantment,0.1,21,16,5,0.7,1 -5814,Recklessness Ineptitude Other IV,Decreases the target's Recklessness skill by 25 points.,175,150,670,40,Creature Enchantment,0.15,21,16,5,0.55,1 -5815,Recklessness Ineptitude Other V,Decreases the target's Recklessness skill by 30 points.,225,180,670,50,Creature Enchantment,0.2,21,16,5,0.4,1 -5816,Recklessness Ineptitude Other VI,Decreases the target's Recklessness skill by 35 points.,275,210,670,60,Creature Enchantment,0.3,21,16,5,0.25,1 -5817,Recklessness Ineptitude Other VII,Decreases the target's Recklessness skill by 40 points.,325,240,670,70,Creature Enchantment,0.15,21,16,5,0.25,1 -5818,Incantation of Recklessness Ineptitude Other,Decreases the target's Recklessness skill by 45 points.,400,300,670,80,Creature Enchantment,0.15,21,16,5,0.25,1 -5819,Recklessness Mastery Other I,Increases the target's Recklessness skill by 10 points.,1,1800,671,10,Creature Enchantment,0.01,20,16,0,1,1 -5820,Recklessness Mastery Other II,Increases the target's Recklessness skill by 15 points.,50,1800,671,20,Creature Enchantment,0.05,20,16,5,0.85,1 -5821,Recklessness Mastery Other III,Increases the target's Recklessness skill by 20 points.,100,1800,671,30,Creature Enchantment,0.1,20,16,5,0.7,1 -5822,Recklessness Mastery Other IV,Increases the target's Recklessness skill by 25 points.,150,1800,671,40,Creature Enchantment,0.15,20,16,5,0.55,1 -5823,Recklessness Mastery Other V,Increases the target's Recklessness skill by 30 points.,200,1800,671,50,Creature Enchantment,0.2,20,16,5,0.4,1 -5824,Recklessness Mastery Other VI,Increases the target's Recklessness skill by 35 points.,250,2700,671,60,Creature Enchantment,0.3,20,16,5,0.25,1 -5825,Recklessness Mastery Other VII,Increases the target's Recklessness skill by 40 points.,300,3600,671,70,Creature Enchantment,0.15,20,16,5,0.25,1 -5826,Incantation of Recklessness Mastery Other,Increases the target's Recklessness skill by 45 points.,400,5400,671,80,Creature Enchantment,0.15,20,16,5,0.25,1 -5827,Recklessness Mastery Self I,Increases the caster's Recklessness skill by 10 points.,1,1800,671,15,Creature Enchantment,0.01,20,16,0,0,1 -5828,Recklessness Mastery Self II,Increases the caster's Recklessness skill by 15 points.,50,1800,671,30,Creature Enchantment,0.05,20,16,0,0,1 -5829,Recklessness Mastery Self III,Increases the caster's Recklessness skill by 20 points.,100,1800,671,40,Creature Enchantment,0.1,20,16,0,0,1 -5830,Recklessness Mastery Self IV,Increases the caster's Recklessness skill by 25 points.,150,1800,671,50,Creature Enchantment,0.15,20,16,0,0,1 -5831,Recklessness Mastery Self V,Increases the caster's Recklessness skill by 30 points.,200,1800,671,60,Creature Enchantment,0.2,20,16,0,0,1 -5832,Recklessness Mastery Self VI,Increases the caster's Recklessness skill by 35 points.,250,2700,671,70,Creature Enchantment,0.3,20,16,0,0,1 -5833,Recklessness Mastery Self VII,Increases the caster's Recklessness skill by 40 points.,300,3600,671,70,Creature Enchantment,0.15,20,16,0,0,1 -5834,Incantation of Recklessness Mastery Self,Increases the caster's Recklessness skill by 45 points.,400,5400,671,80,Creature Enchantment,0.15,20,16,0,0,1 -5835,Shield Ineptitude Other I,Decreases the target's Shield skill by 10 points.,1,60,673,10,Creature Enchantment,0.01,29,16,0,1,1 -5836,Shield Ineptitude Other II,Decreases the target's Shield skill by 15 points.,75,90,673,20,Creature Enchantment,0.05,21,16,5,0.85,1 -5837,Shield Ineptitude Other III,Decreases the target's Shield skill by 20 points.,125,120,673,30,Creature Enchantment,0.1,21,16,5,0.7,1 -5838,Shield Ineptitude Other IV,Decreases the target's Shield skill by 25 points.,175,150,673,40,Creature Enchantment,0.15,21,16,5,0.55,1 -5839,Shield Ineptitude Other V,Decreases the target's Shield skill by 30 points.,225,180,673,50,Creature Enchantment,0.2,21,16,5,0.4,1 -5840,Shield Ineptitude Other VI,Decreases the target's Shield skill by 35 points.,275,210,673,60,Creature Enchantment,0.3,21,16,5,0.25,1 -5841,Shield Ineptitude Other VII,Decreases the target's Shield skill by 40 points.,325,240,673,70,Creature Enchantment,0.15,21,16,5,0.25,1 -5842,Incantation of Shield Ineptitude Other,Decreases the target's Shield skill by 45 points.,400,300,673,80,Creature Enchantment,0.15,21,16,5,0.25,1 -5843,Shield Mastery Other I,Increases the target's Shield skill by 10 points.,1,1800,674,10,Creature Enchantment,0.01,20,16,0,1,1 -5844,Shield Mastery Other II,Increases the target's Shield skill by 15 points.,50,1800,674,20,Creature Enchantment,0.05,20,16,5,0.85,1 -5845,Shield Mastery Other III,Increases the target's Shield skill by 20 points.,100,1800,674,30,Creature Enchantment,0.1,20,16,5,0.7,1 -5846,Shield Mastery Other IV,Increases the target's Shield skill by 25 points.,150,1800,674,40,Creature Enchantment,0.15,20,16,5,0.55,1 -5847,Shield Mastery Other V,Increases the target's Shield skill by 30 points.,200,1800,674,50,Creature Enchantment,0.2,20,16,5,0.4,1 -5848,Shield Mastery Other VI,Increases the target's Shield skill by 35 points.,250,2700,674,60,Creature Enchantment,0.3,20,16,5,0.25,1 -5849,Shield Mastery Other VII,Increases the target's Shield skill by 40 points.,300,3600,674,70,Creature Enchantment,0.15,20,16,5,0.25,1 -5850,Incantation of Shield Mastery Other,Increases the target's Shield skill by 45 points.,400,5400,674,80,Creature Enchantment,0.15,20,16,5,0.25,1 -5851,Shield Mastery Self I,Increases the caster's Shield skill by 10 points.,1,1800,674,15,Creature Enchantment,0.01,20,16,0,0,1 -5852,Shield Mastery Self II,Increases the caster's Shield skill by 15 points.,50,1800,674,30,Creature Enchantment,0.05,20,16,0,0,1 -5853,Shield Mastery Self III,Increases the caster's Shield skill by 20 points.,100,1800,674,40,Creature Enchantment,0.1,20,16,0,0,1 -5854,Shield Mastery Self IV,Increases the caster's Shield skill by 25 points.,150,1800,674,50,Creature Enchantment,0.15,20,16,0,0,1 -5855,Shield Mastery Self V,Increases the caster's Shield skill by 30 points.,200,1800,674,60,Creature Enchantment,0.2,20,16,0,0,1 -5856,Shield Mastery Self VI,Increases the caster's Shield skill by 35 points.,250,2700,674,70,Creature Enchantment,0.3,20,16,0,0,1 -5857,Shield Mastery Self VII,Increases the caster's Shield skill by 40 points.,300,3600,674,70,Creature Enchantment,0.15,20,16,0,0,1 -5858,Incantation of Shield Mastery Self,Increases the caster's Shield skill by 45 points.,400,5400,674,80,Creature Enchantment,0.15,20,16,0,0,1 -5859,Sneak Attack Ineptitude Other I,Decreases the target's Sneak Attack skill by 10 points.,1,60,676,10,Creature Enchantment,0.01,29,16,0,1,1 -5860,Sneak Attack Ineptitude Other II,Decreases the target's Sneak Attack skill by 15 points.,75,90,676,20,Creature Enchantment,0.05,21,16,5,0.85,1 -5861,Sneak Attack Ineptitude Other III,Decreases the target's Sneak Attack skill by 20 points.,125,120,676,30,Creature Enchantment,0.1,21,16,5,0.7,1 -5862,Sneak Attack Ineptitude Other IV,Decreases the target's Sneak Attack skill by 25 points.,175,150,676,40,Creature Enchantment,0.15,21,16,5,0.55,1 -5863,Sneak Attack Ineptitude Other V,Decreases the target's Sneak Attack skill by 30 points.,225,180,676,50,Creature Enchantment,0.2,21,16,5,0.4,1 -5864,Sneak Attack Ineptitude Other VI,Decreases the target's Sneak Attack skill by 35 points.,275,210,676,60,Creature Enchantment,0.3,21,16,5,0.25,1 -5865,Sneak Attack Ineptitude Other VII,Decreases the target's Sneak Attack skill by 40 points.,325,240,676,70,Creature Enchantment,0.15,21,16,5,0.25,1 -5866,Incantation of Sneak Attack Ineptitude Other,Decreases the target's Sneak Attack skill by 45 points.,400,300,676,80,Creature Enchantment,0.15,21,16,5,0.25,1 -5867,Sneak Attack Mastery Other I,Increases the target's Sneak Attack skill by 10 points.,1,1800,677,10,Creature Enchantment,0.01,20,16,0,1,1 -5868,Sneak Attack Mastery Other II,Increases the target's Sneak Attack skill by 15 points.,50,1800,677,20,Creature Enchantment,0.05,20,16,5,0.85,1 -5869,Sneak Attack Mastery Other III,Increases the target's Sneak Attack skill by 20 points.,100,1800,677,30,Creature Enchantment,0.1,20,16,5,0.7,1 -5870,Sneak Attack Mastery Other IV,Increases the target's Sneak Attack skill by 25 points.,150,1800,677,40,Creature Enchantment,0.15,20,16,5,0.55,1 -5871,Sneak Attack Mastery Other V,Increases the target's Sneak Attack skill by 30 points.,200,1800,677,50,Creature Enchantment,0.2,20,16,5,0.4,1 -5872,Sneak Attack Mastery Other VI,Increases the target's Sneak Attack skill by 35 points.,250,2700,677,60,Creature Enchantment,0.3,20,16,5,0.25,1 -5873,Sneak Attack Mastery Other VII,Increases the target's Sneak Attack skill by 40 points.,300,3600,677,70,Creature Enchantment,0.15,20,16,5,0.25,1 -5874,Incantation of Sneak Attack Mastery Other,Increases the target's Sneak Attack skill by 45 points.,400,5400,677,80,Creature Enchantment,0.15,20,16,5,0.25,1 -5875,Sneak Attack Mastery Self I,Increases the caster's Sneak Attack skill by 10 points.,1,1800,677,15,Creature Enchantment,0.01,20,16,0,0,1 -5876,Sneak Attack Mastery Self II,Increases the caster's Sneak Attack skill by 15 points.,50,1800,677,30,Creature Enchantment,0.05,20,16,0,0,1 -5877,Sneak Attack Mastery Self III,Increases the caster's Sneak Attack skill by 20 points.,100,1800,677,40,Creature Enchantment,0.1,20,16,0,0,1 -5878,Sneak Attack Mastery Self IV,Increases the caster's Sneak Attack skill by 25 points.,150,1800,677,50,Creature Enchantment,0.15,20,16,0,0,1 -5879,Sneak Attack Mastery Self V,Increases the caster's Sneak Attack skill by 30 points.,200,1800,677,60,Creature Enchantment,0.2,20,16,0,0,1 -5880,Sneak Attack Mastery Self VI,Increases the caster's Sneak Attack skill by 35 points.,250,2700,677,70,Creature Enchantment,0.3,20,16,0,0,1 -5881,Sneak Attack Mastery Self VII,Increases the caster's Sneak Attack skill by 40 points.,300,3600,677,70,Creature Enchantment,0.15,20,16,0,0,1 -5882,Incantation of Sneak Attack Mastery Self,Increases the caster's Sneak Attack skill by 45 points.,400,5400,677,80,Creature Enchantment,0.15,20,16,0,0,1 -5883,Minor Dirty Fighting Prowess,Increases the target's Dirty Fighting skill by 5 points. Additional spells can be layered over this.,1,780,666,10,Creature Enchantment,0.01,20,16,0,1,1 -5884,Minor Dual Wield Aptitude,Increases the target's Dual Wield skill by 5 points. Additional spells can be layered over this.,1,780,669,10,Creature Enchantment,0.01,20,16,0,1,1 -5885,Minor Recklessness Prowess,Increases the target's Recklessness skill by 5 points. Additional spells can be layered over this.,1,780,672,10,Creature Enchantment,0.01,20,16,0,1,1 -5886,Minor Shield Aptitude,Increases the target's Shield skill by 5 points. Additional spells can be layered over this.,1,780,675,10,Creature Enchantment,0.01,20,16,0,1,1 -5887,Minor Sneak Attack Prowess,Increases the target's Sneak Attack skill by 5 points. Additional spells can be layered over this.,1,780,678,10,Creature Enchantment,0.01,20,16,0,1,1 -5888,Major Dirty Fighting Prowess,Increases the target's Dirty Fighting skill by 15 points. Additional spells can be layered over this.,2,780,666,10,Creature Enchantment,0.01,20,16,0,1,1 -5889,Major Dual Wield Aptitude,Increases the target's Dual Wield skill by 15 points. Additional spells can be layered over this.,2,780,669,10,Creature Enchantment,0.01,20,16,0,1,1 -5890,Major Recklessness Prowess,Increases the target's Recklessness skill by 15 points. Additional spells can be layered over this.,2,780,672,10,Creature Enchantment,0.01,20,16,0,1,1 -5891,Major Shield Aptitude,Increases the target's Shield skill by 15 points. Additional spells can be layered over this.,2,780,675,10,Creature Enchantment,0.01,20,16,0,1,1 -5892,Major Sneak Attack Prowess,Increases the target's Sneak Attack skill by 15 points. Additional spells can be layered over this.,2,780,678,10,Creature Enchantment,0.01,20,16,0,1,1 -5893,Epic Dirty Fighting Prowess,Increases the target's Dirty Fighting skill by 25 points. Additional spells can be layered over this.,25,780,666,10,Creature Enchantment,0.01,20,16,0,1,1 -5894,Epic Dual Wield Aptitude,Increases the target's Dual Wield skill by 25 points. Additional spells can be layered over this.,25,780,669,10,Creature Enchantment,0.01,20,16,0,1,1 -5895,Epic Recklessness Prowess,Increases the target's Recklessness skill by 25 points. Additional spells can be layered over this.,25,780,672,10,Creature Enchantment,0.01,20,16,0,1,1 -5896,Epic Shield Aptitude,Increases the target's Shield skill by 25 points. Additional spells can be layered over this.,25,780,675,10,Creature Enchantment,0.01,20,16,0,1,1 -5897,Epic Sneak Attack Prowess,Increases the target's Sneak Attack skill by 25 points. Additional spells can be layered over this.,25,780,678,10,Creature Enchantment,0.01,20,16,0,1,1 -5898,Moderate Dirty Fighting Prowess,Increases the target's Dirty Fighting skill by 10 points. Additional spells can be layered over this.,10,780,666,10,Creature Enchantment,0.01,26,16,0,1,1 -5899,Moderate Dual Wield Aptitude,Increases the target's Dual Wield skill by 10 points. Additional spells can be layered over this.,10,780,669,10,Creature Enchantment,0.01,26,16,0,1,1 -5900,Moderate Recklessness Prowess,Increases the target's Recklessness skill by 10 points. Additional spells can be layered over this.,10,780,672,10,Creature Enchantment,0.01,26,16,0,1,1 -5901,Moderate Shield Aptitude,Increases the target's Shield skill by 10 points. Additional spells can be layered over this.,10,780,675,10,Creature Enchantment,0.01,26,16,0,1,1 -5902,Moderate Sneak Attack Prowess,Increases the target's Sneak Attack skill by 10 points. Additional spells can be layered over this.,10,780,678,10,Creature Enchantment,0.01,26,16,0,1,1 -5903,Prodigal Dual Wield Mastery,Increases the caster's Dual Wield skill by 250 points.,600,900,680,70,Creature Enchantment,0.15,18,16,0,0,1 -5904,Spectral Dual Wield Mastery,Increases the caster's Dual Wield skill by 150 points for 9 minutes.,250,540,680,70,Creature Enchantment,0.15,18,16,0,0,1 -5905,Prodigal Recklessness Mastery,Increases the caster's Recklessness skill by 250 points.,600,900,681,70,Creature Enchantment,0.15,18,16,0,0,1 -5906,Spectral Recklessness Mastery,Increases the caster's Recklessness skill by 150 points for 9 minutes.,250,540,681,70,Creature Enchantment,0.15,18,16,0,0,1 -5907,Prodigal Shield Mastery,Increases the caster's Shield skill by 250 points.,600,900,682,70,Creature Enchantment,0.15,18,16,0,0,1 -5908,Spectral Shield Mastery,Increases the caster's Shield skill by 150 points for 9 minutes.,250,540,682,70,Creature Enchantment,0.15,18,16,0,0,1 -5909,Prodigal Sneak Attack Mastery,Increases the caster's Sneak Attack skill by 250 points.,600,900,683,70,Creature Enchantment,0.15,18,16,0,0,1 -5910,Spectral Sneak Attack Mastery,Increases the caster's Sneak Attack skill by 150 points for 9 minutes.,250,540,683,70,Creature Enchantment,0.15,18,16,0,0,1 -5911,Prodigal Dirty Fighting Mastery,Increases the caster's Dirty Fighting skill by 250 points.,600,900,679,70,Creature Enchantment,0.15,18,16,0,0,1 -5912,Spectral Dirty Fighting Mastery,Increases the caster's Dirty Fighting skill by 150 points for 9 minutes.,250,540,679,70,Creature Enchantment,0.15,18,16,0,0,1 -5913,Weave of Dirty Fighting I,Increases the target's Dirty Fighting skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5914,Weave of Dirty Fighting II,Increases the target's Dirty Fighting skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5915,Weave of Dirty Fighting III,Increases the target's Dirty Fighting skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5916,Weave of Dirty Fighting IV,Increases the target's Dirty Fighting skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5917,Weave of Dirty Fighting V,Increases the target's Dirty Fighting skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5918,Weave of Dual Wield I,Increases the target's Dual Wield skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5919,Weave of Dual Wield II,Increases the target's Dual Wield skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5920,Weave of Dual Wield III,Increases the target's Dual Wield skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5921,Weave of Dual Wield IV,Increases the target's Dual Wield skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5922,Weave of Dual Wield V,Increases the target's Dual Wield skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5923,Weave of Recklessness I,Increases the target's Recklessness skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5924,Weave of Recklessness II,Increases the target's Recklessness skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5925,Weave of Recklessness III,Increases the target's Recklessness skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5926,Weave of Recklessness IV,Increases the target's Recklessness skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5927,Weave of Recklessness V,Increases the target's Recklessness skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5928,Weave of Shield I,Increases the target's Shield skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5929,Weave of Shield II,Increases the target's Shield skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5930,Weave of Shield III,Increases the target's Shield skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5931,Weave of Shield IV,Increases the target's Shield skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5932,Weave of Shield V,Increases the target's Shield skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5933,Weave of Sneak Attack I,Increases the target's Sneak Attack skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5934,Weave of Sneak Attack II,Increases the target's Sneak Attack skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5935,Weave of Sneak Attack III,Increases the target's Sneak Attack skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5936,Weave of Sneak Attack IV,Increases the target's Sneak Attack skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5937,Weave of Sneak Attack V,Increases the target's Sneak Attack skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,18,16,0,0,1 -5938,Blinding Assault,Decreases all of the target's attack skills by 20 for 20 seconds.,1,20,684,70,Creature Enchantment,0.15,171,16,5,0.25,1 -5939,Bleeding Assault,The target loses 120 points of health over 20 seconds.,250,20,685,80,Life Magic,0.15,173,16,5,0.25,1 -5940,Unbalancing Assault,Decreases all of the target's defense skills by 20 for 20 seconds.,1,20,686,70,Creature Enchantment,0.15,172,16,5,0.25,1 -5941,Traumatic Assault,Decreases heals cast on the target by a rating of 20 for 20 seconds.,1,20,687,70,Creature Enchantment,0.15,170,16,5,0.25,1 -5942,Blinding Blow,Decreases all of the target's attack skills by 10 for 20 seconds.,1,20,684,70,Creature Enchantment,0.15,171,16,5,0.25,1 -5943,Bleeding Blow,The target loses 60 points of health over 20 seconds.,250,20,685,80,Life Magic,0.15,173,16,5,0.25,1 -5944,Unbalancing Blow,Decreases all of the target's defense skills by 10 for 20 seconds.,1,20,686,70,Creature Enchantment,0.15,172,16,5,0.25,1 -5945,Traumatic Blow,Decreases heals cast on the target by a rating of 10 for 20 seconds.,1,20,687,70,Creature Enchantment,0.15,170,16,5,0.25,1 -5946,Novice Soldier's Dirty Fighting Aptitude,Increases the target's Dirty Fighting skill by 3 points.,1,1800,688,10,Creature Enchantment,0.01,18,16,0,1,1 -5947,Apprentice Soldier's Dirty Fighting Aptitude,Increases the target's Dirty Fighting skill by 5 points.,2,1800,688,10,Creature Enchantment,0.01,18,16,0,1,1 -5948,Journeyman Soldier's Dirty Fighting Aptitude,Increases the target's Dirty Fighting skill by 10 points.,3,1800,688,10,Creature Enchantment,0.01,18,16,0,1,1 -5949,Master Soldier's Dirty Fighting Aptitude,Increases the target's Dirty Fighting skill by 20 points.,4,1800,688,10,Creature Enchantment,0.01,18,16,0,1,1 -5950,Novice Soldier's Dual Wield Aptitude,Increases the target's Dual Wield skill by 3 points.,1,1800,689,10,Creature Enchantment,0.01,18,16,0,1,1 -5951,Apprentice Soldier's Dual Wield Aptitude,Increases the target's Dual Wield skill by 5 points.,2,1800,689,10,Creature Enchantment,0.01,18,16,0,1,1 -5952,Journeyman Soldier's Dual Wield Aptitude,Increases the target's Dual Wield skill by 10 points.,3,1800,689,10,Creature Enchantment,0.01,18,16,0,1,1 -5953,Master Soldier's Dual Wield Aptitude,Increases the target's Dual Wield skill by 20 points.,4,1800,689,10,Creature Enchantment,0.01,18,16,0,1,1 -5954,Novice Soldier's Recklessness Aptitude,Increases the target's Recklessness skill by 3 points.,1,1800,690,10,Creature Enchantment,0.01,18,16,0,1,1 -5955,Apprentice Soldier's Recklessness Aptitude,Increases the target's Recklessness skill by 5 points.,2,1800,690,10,Creature Enchantment,0.01,18,16,0,1,1 -5956,Journeyman Soldier's Recklessness Aptitude,Increases the target's Recklessness skill by 10 points.,3,1800,690,10,Creature Enchantment,0.01,18,16,0,1,1 -5957,Master Soldier's Recklessness Aptitude,Increases the target's Recklessness skill by 20 points.,4,1800,690,10,Creature Enchantment,0.01,18,16,0,1,1 -5958,Novice Soldier's Shield Aptitude,Increases the target's Shield skill by 3 points.,1,1800,691,10,Creature Enchantment,0.01,18,16,0,1,1 -5959,Apprentice Soldier's Shield Aptitude,Increases the target's Shield skill by 5 points.,2,1800,691,10,Creature Enchantment,0.01,18,16,0,1,1 -5960,Journeyman Soldier's Shield Aptitude,Increases the target's Shield skill by 10 points.,3,1800,691,10,Creature Enchantment,0.01,18,16,0,1,1 -5961,Master Soldier's Shield Aptitude,Increases the target's Shield skill by 20 points.,4,1800,691,10,Creature Enchantment,0.01,18,16,0,1,1 -5962,Novice Soldier's Sneak Attack Aptitude,Increases the target's Sneak Attack skill by 3 points.,1,1800,692,10,Creature Enchantment,0.01,18,16,0,1,1 -5963,Apprentice Soldier's Sneak Attack Aptitude,Increases the target's Sneak Attack skill by 5 points.,2,1800,692,10,Creature Enchantment,0.01,18,16,0,1,1 -5964,Journeyman Soldier's Sneak Attack Aptitude,Increases the target's Sneak Attack skill by 10 points.,3,1800,692,10,Creature Enchantment,0.01,18,16,0,1,1 -5965,Master Soldier's Sneak Attack Aptitude,Increases the target's Sneak Attack skill by 20 points.,4,1800,692,10,Creature Enchantment,0.01,18,16,0,1,1 -5966,Vigor of Mhoire,Increases maximum health by 20 points.,20,10800,693,70,Life Magic,0.3,31,16,0,0,1 -5967,Galvanic Arc,Shoots a blue bolt of lighting at the target. The bolt does 200-300 points of electrical damage to the first thing it hits.,400,-1,120,40,War Magic,0.15,0,16,30,0.2,1 -5968,Galvanic Blast,Shoots five blue bolts of lightning outward from the caster. Each bolt does 50-100 points of electric damage to the first thing it hits.,400,-1,134,40,War Magic,0.15,0,16,30,0.2,1 -5969,Galvanic Strike,Shoots a bolt of blue lighting at the target. The bolt does 200-300 points of electrical damage to the target.,400,-1,120,35,War Magic,0.15,0,16,30,0.2,1 -5970,Galvanic Streak,Sends a bolt of lighting streaking towards the target. The bolt does 50-100 points of electrical damage to the first thing it hits.,400,-1,246,80,War Magic,0.15,0,16,30,0.2,1 -5971,Galvanic Volley,Shoots five blue bolts of lightning toward the target. Each bolt does 50-100 points of electric damage to the first thing it hits.,400,-1,210,40,War Magic,0.15,0,16,30,0.2,1 -5972,Galvanic Bomb,Shoots 12 waves of blue lightning outward from the caster. Each wave does 200-1000 points of electric damage to the first thing it hits.,400,-1,225,80,War Magic,0.2,0,0,5,0,1 -5973,Protection of Mouf,Reduces damage the target takes from Cold by 15%. Additional spells can be layered over this.,15,5400,289,10,Life Magic,0.01,51,16,0,1,1 -5974,Rare Armor Damage Boost I,Your damage rating is increased by 1.,1,10800,694,70,Life Magic,0.3,35,16,0,0,1 -5975,Rare Armor Damage Boost II,Your damage rating is increased by 2.,1,10800,694,70,Life Magic,0.3,35,16,0,0,1 -5976,Rare Armor Damage Boost III,Your damage rating is increased by 3.,1,10800,694,70,Life Magic,0.3,35,16,0,0,1 -5977,Rare Armor Damage Boost IV,Your damage rating is increased by 4.,1,10800,694,70,Life Magic,0.3,35,16,0,0,1 -5978,Rare Armor Damage Boost V,Your damage rating is increased by 5.,1,10800,694,70,Life Magic,0.3,35,16,0,0,1 -5979,Blighted Touch,Sath'tik's blighted touch wracks your body. you are afflicted with his corruption and suffer greatly. All secondary attributes are reduced by 40% for the duration of the spell.,327,60,410,10,Creature Enchantment,0.01,9,16,0,1,1 -5980,Corrupted Touch,Sath'tik's corruption has seeped into your skin. causing damage over time. The target loses 357 points of health over 30 seconds.,350,30,618,80,Life Magic,0.15,32,16,5,0.25,1 -5981,Sath'tik's Curse,Your wounds are cursed and don't heal as well.,350,300,619,80,Life Magic,0.15,38,16,5,0.25,1 -5982,Aura of Hermetic Link Other I,Increases a magic casting implement's mana conversion bonus by 10%.,25,1800,195,10,Item Enchantment,0.01,67,16,25,0,1 -5983,Aura of Hermetic Link Other II,Increases a magic casting implement's mana conversion bonus by 20%.,50,1800,195,20,Item Enchantment,0.05,67,16,25,0,1 -5984,Aura of Hermetic Link Other III,Increases a magic casting implement's mana conversion bonus by 30%.,100,1800,195,30,Item Enchantment,0.1,67,16,25,0,1 -5985,Aura of Hermetic Link Other IV,Increases a magic casting implement's mana conversion bonus by 40%.,150,1800,195,40,Item Enchantment,0.15,67,16,25,0,1 -5986,Aura of Hermetic Link Other V,Increases a magic casting implement's mana conversion bonus by 50%.,200,1800,195,50,Item Enchantment,0.2,67,16,25,0,1 -5987,Aura of Hermetic Link Other VI,Increases a magic casting implement's mana conversion bonus by 60%.,250,2700,195,60,Item Enchantment,0.3,67,16,25,0,1 -5988,Aura of Hermetic Link Other VII,Increases a magic casting implement's mana conversion bonus by 70%.,300,3600,195,70,Item Enchantment,0.15,67,16,25,0,1 -5989,Aura of Incantation of Hermetic Link Other,Increases a magic casting implement's mana conversion bonus by 80%.,400,5400,195,80,Item Enchantment,0.15,67,16,25,0,1 -5990,Aura of Blood Drinker Other I,Increases a weapon's damage value by 2 points.,1,1800,154,10,Item Enchantment,0,57,16,25,0,1 -5991,Aura of Blood Drinker Other II,Increases a weapon's damage value by 4 points.,50,1800,154,20,Item Enchantment,0.05,57,16,25,0,1 -5992,Aura of Blood Drinker Other III,Increases a weapon's damage value by 8 points.,100,1800,154,30,Item Enchantment,0.1,57,16,25,0,1 -5993,Aura of Blood Drinker Other IV,Increases a weapon's damage value by 12 points.,150,1800,154,40,Item Enchantment,0.15,57,16,25,0,1 -5994,Aura of Blood Drinker Other V,Increases a weapon's damage value by 16 points.,200,1800,154,50,Item Enchantment,0.2,57,16,25,0,1 -5995,Aura of Blood Drinker Other VI,Increases a weapon's damage value by 20 points.,250,2700,154,60,Item Enchantment,0.3,57,16,25,0,1 -5996,Aura of Blood Drinker Other VII,Increases a weapon's damage value by 22 points.,300,3600,154,70,Item Enchantment,0.15,57,16,25,0,1 -5997,Aura of Incantation of Blood Drinker Other,Increases a weapon's damage value by 24 points.,400,5400,154,80,Item Enchantment,0.15,57,16,25,0,1 -5998,Aura of Incantation of Blood Drinker Other,Increases a weapon's damage value by 22 points.,350,5400,154,80,Item Enchantment,0.15,57,16,25,0,1 -5999,Aura of Defender Other I,Increases the Melee Defense skill modifier of a weapon or magic caster by 3%.,1,1800,156,10,Item Enchantment,0.01,61,16,25,0,1 -6000,Aura of Defender Other II,Increases the Melee Defense skill modifier of a weapon or magic caster by 5%.,50,1800,156,20,Item Enchantment,0.05,61,16,25,0,1 -6001,Aura of Defender Other III,Increases the Melee Defense skill modifier of a weapon or magic caster by 7.5%.,100,1800,156,30,Item Enchantment,0.1,61,16,25,0,1 -6002,Aura of Defender Other IV,Increases the Melee Defense skill modifier of a weapon or magic caster by 10%.,150,1800,156,40,Item Enchantment,0.15,61,16,25,0,1 -6003,Aura of Defender Other V,Increases the Melee Defense skill modifier of a weapon or magic caster by 13%.,200,1800,156,50,Item Enchantment,0.2,61,16,25,0,1 -6004,Aura of Defender Other VI,Increases the Melee Defense skill modifier of a weapon or magic caster by 15%.,250,2700,156,60,Item Enchantment,0.3,61,16,25,0,1 -6005,Aura of Defender Other VII,Increases the Melee Defense skill modifier of a weapon or magic caster by 17%.,300,3600,156,70,Item Enchantment,0.15,61,16,25,0,1 -6006,Aura of Incantation of Defender Other,Increases the Melee Defense skill modifier of a weapon or magic caster by 17%.,350,5400,156,80,Item Enchantment,0.15,61,16,25,0,1 -6007,Aura of Heart Seeker Other I,Increases a weapon's Attack Skill modifier by 2.5 percentage points.,1,1800,152,10,Item Enchantment,0.01,59,16,25,0,1 -6008,Aura of Heart Seeker Other II,Increases a weapon's Attack Skill modifier by 5.0 percentage points.,50,1800,152,20,Item Enchantment,0.05,59,16,25,0,1 -6009,Aura of Heart Seeker Other III,Increases a weapon's Attack Skill modifier by 7.5 percentage points.,100,1800,152,30,Item Enchantment,0.1,59,16,25,0,1 -6010,Aura of Heart Seeker Other IV,Increases a weapon's Attack Skill modifier by 10.0 percentage points.,150,1800,152,40,Item Enchantment,0.15,59,16,25,0,1 -6011,Aura of Heart Seeker Other V,Increases a weapon's Attack Skill modifier by 12.5 percentage points.,200,1800,152,50,Item Enchantment,0.2,59,16,25,0,1 -6012,Aura of Heart Seeker Other VI,Increases a weapon's Attack Skill modifier by 15.0 percentage points.,250,2700,152,60,Item Enchantment,0.3,59,16,25,0,1 -6013,Aura of Heart Seeker Other VII,Increases a weapon's Attack Skill modifier by 17.0 percentage points.,300,3600,152,70,Item Enchantment,0.15,59,16,25,0,1 -6014,Aura of Incantation of Heart Seeker Other,Increases a weapon's Attack Skill modifier by 20.0 percentage points.,400,5400,152,80,Item Enchantment,0.15,59,16,25,0,1 -6015,Aura of Spirit Drinker Other I,Increases the elemental damage bonus of an elemental magic caster by 1%.,1,1800,695,10,Item Enchantment,0,57,16,25,0,1 -6016,Aura of Spirit Drinker Other II,Increases the elemental damage bonus of an elemental magic caster by 2%.,50,1800,695,20,Item Enchantment,0.05,57,16,25,0,1 -6017,Aura of Spirit Drinker Other III,Increases the elemental damage bonus of an elemental magic caster by 3%.,100,1800,695,30,Item Enchantment,0.1,57,16,25,0,1 -6018,Aura of Spirit Drinker Other IV,Increases the elemental damage bonus of an elemental magic caster by 4%.,150,1800,695,40,Item Enchantment,0.15,57,16,25,0,1 -6019,Aura of Spirit Drinker Other V,Increases the elemental damage bonus of an elemental magic caster by 5%.,200,1800,695,50,Item Enchantment,0.2,57,16,25,0,1 -6020,Aura of Spirit Drinker Other VI,Increases the elemental damage bonus of an elemental magic caster by 6%.,250,2700,695,60,Item Enchantment,0.3,57,16,25,0,1 -6021,Aura of Spirit Drinker Other VII,Increases the elemental damage bonus of an elemental magic caster by 7%.,300,3600,695,70,Item Enchantment,0.15,57,16,25,0,1 -6022,Aura of Incantation of Spirit Drinker Other,Increases the elemental damage bonus of an elemental magic caster by 8%.,400,5400,695,80,Item Enchantment,0.15,57,16,25,0,1 -6023,Aura of Incantation of Spirit Drinker Other,Increases the elemental damage bonus of an elemental magic caster by 7%.,350,5400,695,80,Item Enchantment,0.15,57,16,25,0,1 -6024,Aura of Swift Killer Other I,Improves a weapon's speed by 10 points.,1,1800,158,10,Item Enchantment,0,63,16,25,0,1 -6025,Aura of Swift Killer Other II,Improves a weapon's speed by 20 points.,50,1800,158,20,Item Enchantment,0.05,63,16,25,0,1 -6026,Aura of Swift Killer Other III,Improves a weapon's speed by 30 points.,100,1800,158,30,Item Enchantment,0.1,63,16,25,0,1 -6027,Aura of Swift Killer Other IV,Improves a weapon's speed by 40 points.,150,1800,158,40,Item Enchantment,0.15,63,16,25,0,1 -6028,Aura of Swift Killer Other V,Improves a weapon's speed by 50 points.,200,1800,158,50,Item Enchantment,0.2,63,16,25,0,1 -6029,Aura of Swift Killer Other VI,Improves a weapon's speed by 60 points.,250,2700,158,60,Item Enchantment,0.3,63,16,25,0,1 -6030,Aura of Swift Killer Other VII,Improves a weapon's speed by 70 points.,300,3600,158,70,Item Enchantment,0.15,63,16,25,0,1 -6031,Aura of Incantation of Swift Killer Other,Improves a weapon's speed by 80 points.,400,5400,158,80,Item Enchantment,0.15,63,16,25,0,1 -6032,Imprisoned,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -6033,Impudence,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -6034,Proving Grounds Rolling Death,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -6035,Spirit of Izexi,Infuses a magic caster with the spirit of the Dark Falatacot. Izexi. Increases the elemental damage bonus of an elemental magic caster by 1%. Additional spells can be layered over this.,1,10800,323,10,Item Enchantment,0,57,32768,25,0,1 -6036,No Escape,There is no escape! Target's run skill is reduced by 95%.,500,180,78,10,Creature Enchantment,0.01,9,16,0,1,1 -6037,Fleeting Will,The voices in your head command you. This spell decreases the target's Self by 80%.,285,180,12,10,Creature Enchantment,0.15,15,16,5,0.25,1 -6038,Warm and Fuzzy,The cider makes you feel all warm and fuzzy inside. raising your Stamina by 10% for 1 hour.,300,3600,411,10,Creature Enchantment,0.01,6,16,0,1,1 -6039,Legendary Weapon Tinkering Expertise,Increases the target's Weapon Tinkering skill by 35 points. Additional spells can be layered over this.,35,780,377,10,Creature Enchantment,0.01,28,16,0,1,1 -6040,Legendary Alchemical Prowess,Increases the target's Alchemy skill by 35 points. Additional spells can be layered over this.,35,780,333,10,Creature Enchantment,0.01,26,16,0,1,1 -6041,Legendary Arcane Prowess,Increases the target's Arcane Lore skill by 35 points. Additional spells can be layered over this.,35,780,335,10,Creature Enchantment,0.01,26,16,0,1,1 -6042,Legendary Armor Tinkering Expertise,Increases the target's Armor Tinkering skill by 35 points. Additional spells can be layered over this.,35,780,337,10,Creature Enchantment,0.01,28,16,0,1,1 -6043,Legendary Light Weapon Aptitude,Increases the target's Light Weapons skill by 35 points. Additional spells can be layered over this.,35,780,311,10,Creature Enchantment,0.01,18,16,0,1,1 -6044,Legendary Missile Weapon Aptitude,Increases the target's Missile Weapons skill by 35 points. Additional spells can be layered over this.,35,780,331,10,Creature Enchantment,0.01,18,16,0,1,1 -6045,Legendary Cooking Prowess,Increases the target's Cooking skill by 35 points. Additional spells can be layered over this.,35,780,339,10,Creature Enchantment,0.01,20,16,0,1,1 -6046,Legendary Creature Enchantment Aptitude,Increases the target's Creature Enchantment skill by 35 points. Additional spells can be layered over this.,35,780,251,10,Creature Enchantment,0.01,26,16,0,1,1 -6047,Legendary Finesse Weapon Aptitude,Increases the target's Finesse Weapons skill by 35 points. Additional spells can be layered over this.,35,780,313,10,Creature Enchantment,0.01,18,16,0,1,1 -6048,Legendary Deception Prowess,Increases the target's Deception skill by 35 points. Additional spells can be layered over this.,35,780,343,10,Creature Enchantment,0.01,28,16,0,1,1 -6049,Legendary Dirty Fighting Prowess,Increases the target's Dirty Fighting skill by 35 points. Additional spells can be layered over this.,35,780,666,10,Creature Enchantment,0.01,20,16,0,1,1 -6050,Legendary Dual Wield Aptitude,Increases the target's Dual Wield skill by 35 points. Additional spells can be layered over this.,35,780,669,10,Creature Enchantment,0.01,20,16,0,1,1 -6051,Legendary Fealty,Increases the target's Loyalty skill by 35 points. Additional spells can be layered over this.,35,780,345,10,Creature Enchantment,0.01,20,16,0,1,1 -6052,Legendary Fletching Prowess,Increases the target's Fletching skill by 35 points. Additional spells can be layered over this.,35,780,347,10,Creature Enchantment,0.01,20,16,0,1,1 -6053,Legendary Healing Prowess,Increases the target's Healing skill by 35 points. Additional spells can be layered over this.,35,780,349,10,Creature Enchantment,0.01,20,16,0,1,1 -6054,Legendary Impregnability,Increases the target's Missile Defense skill by 35 points. Additional spells can be layered over this.,35,780,654,10,Creature Enchantment,0.01,22,16,0,1,1 -6055,Legendary Invulnerability,Increases the target's Melee Defense skill by 35 points. Additional spells can be layered over this.,35,780,351,10,Creature Enchantment,0.01,22,16,0,1,1 -6056,Legendary Item Enchantment Aptitude,Increases the target's Item Enchantment skill by 35 points. Additional spells can be layered over this.,35,780,253,10,Creature Enchantment,0.01,26,16,0,1,1 -6057,Legendary Item Tinkering Expertise,Increases the target's Item Tinkering skill by 35 points. Additional spells can be layered over this.,35,780,353,10,Creature Enchantment,0.01,28,16,0,1,1 -6058,Legendary Jumping Prowess,Increases the target's Jump skill by 35 points. Additional spells can be layered over this.,35,780,355,10,Creature Enchantment,0.01,24,16,0,1,1 -6059,Legendary Leadership,Increases the target's Leadership skill by 35 points. Additional spells can be layered over this.,35,780,293,10,Creature Enchantment,0.01,20,16,0,1,1 -6060,Legendary Life Magic Aptitude,Increases the target's Life Magic skill by 35 points. Additional spells can be layered over this.,35,780,357,10,Creature Enchantment,0.01,26,16,0,1,1 -6061,Legendary Lockpick Prowess,Increases the target's Lockpick skill by 35 points. Additional spells can be layered over this.,35,780,359,10,Creature Enchantment,0.01,20,16,0,1,1 -6062,Legendary Magic Item Tinkering Expertise,Increases the target's Magic Item Tinkering skill by 35 points. Additional spells can be layered over this.,35,780,361,10,Creature Enchantment,0.01,28,16,0,1,1 -6063,Legendary Magic Resistance,Increases the target's Magic Defense skill by 35 points. Additional spells can be layered over this.,35,780,299,10,Creature Enchantment,0.01,22,16,0,1,1 -6064,Legendary Mana Conversion Prowess,Increases the target's Mana Conversion skill by 35 points. Additional spells can be layered over this.,35,780,363,10,Creature Enchantment,0.01,26,16,0,1,1 -6065,Legendary Monster Attunement,Increases the target's Assess Creature skill by 35 points. Additional spells can be layered over this.,35,780,365,10,Creature Enchantment,0.01,28,16,0,1,1 -6066,Legendary Person Attunement,Increases the target's Assess Person skill by 35 points. Additional spells can be layered over this.,35,780,367,10,Creature Enchantment,0.01,28,16,0,1,1 -6067,Legendary Recklessness Prowess,Increases the target's Recklessness skill by 35 points. Additional spells can be layered over this.,35,780,672,10,Creature Enchantment,0.01,20,16,0,1,1 -6068,Legendary Salvaging Aptitude,Increases the target's Salvaging skill by 35 points. Additional spells can be layered over this.,35,780,437,10,Creature Enchantment,0.01,26,16,0,1,1 -6069,Legendary Shield Aptitude,Increases the target's Shield skill by 35 points. Additional spells can be layered over this.,35,780,675,10,Creature Enchantment,0.01,20,16,0,1,1 -6070,Legendary Sneak Attack Prowess,Increases the target's Sneak Attack skill by 35 points. Additional spells can be layered over this.,35,780,678,10,Creature Enchantment,0.01,20,16,0,1,1 -6071,Legendary Sprint,Increases the target's Run skill by 35 points. Additional spells can be layered over this.,35,780,369,10,Creature Enchantment,0.01,24,16,0,1,1 -6072,Legendary Heavy Weapon Aptitude,Increases the target's Heavy Weapons skill by 35 points. Additional spells can be layered over this.,35,780,371,10,Creature Enchantment,0.01,18,16,0,1,1 -6073,Legendary Two Handed Combat Aptitude,Increases the target's Two Handed Combat skill by 35 points. Additional spells can be layered over this.,35,780,595,10,Creature Enchantment,0.01,18,16,0,1,1 -6074,Legendary Void Magic Aptitude,Increases the target's Void Magic skill by 35 points. Additional spells can be layered over this.,35,780,646,10,Creature Enchantment,0.01,26,16,0,1,1 -6075,Legendary War Magic Aptitude,Increases the target's War Magic skill by 35 points. Additional spells can be layered over this.,35,780,255,10,Creature Enchantment,0.01,26,16,0,1,1 -6076,Legendary Stamina Gain,Increases the rate at which the target regains Stamina by 60%. Additional spells can be layered over this.,60,780,407,10,Life Magic,0,41,16,5,1,1 -6077,Legendary Health Gain,Increases the rate at which the target regains Health by 60%. Additional spells can be layered over this.,60,780,257,10,Life Magic,0.01,37,16,5,1,1 -6078,Legendary Mana Gain,Increases the rate at which the target regains Mana by 60%. Additional spells can be layered over this.,60,780,259,10,Life Magic,0.01,39,16,5,1,1 -6079,Legendary Storm Ward,Reduces damage the target takes from Lightning by 25%. Additional spells can be layered over this.,25,780,291,10,Life Magic,0.01,53,16,0,1,1 -6080,Legendary Acid Ward,Reduces damage the target takes from Acid by 25%. Additional spells can be layered over this.,25,780,285,10,Life Magic,0.01,49,16,0,1,1 -6081,Legendary Bludgeoning Ward,Reduces damage the target takes from Bludgeoning by 25%. Additional spells can be layered over this.,25,780,401,10,Life Magic,0.01,55,16,0,1,1 -6082,Legendary Flame Ward,Reduces damage the target takes from Fire by 25%. Additional spells can be layered over this.,25,780,287,10,Life Magic,0.01,43,16,0,1,1 -6083,Legendary Frost Ward,Reduces damage the target takes from Cold by 25%. Additional spells can be layered over this.,25,780,289,10,Life Magic,0.01,51,16,0,1,1 -6084,Legendary Piercing Ward,Reduces damage the target takes from Piercing by 25%. Additional spells can be layered over this.,25,780,405,10,Life Magic,0.01,45,16,0,1,1 -6085,Legendary Slashing Ward,Reduces damage the target takes from Slashing by 25%. Additional spells can be layered over this.,25,780,403,10,Life Magic,0.01,47,16,0,1,1 -6086,Epic Hermetic Link,Increases a magic casting implement's mana conversion bonus by 25%.,25,1800,425,10,Item Enchantment,0.01,67,33025,25,0,1 -6087,Legendary Hermetic Link,Increases a magic casting implement's mana conversion bonus by 30%.,30,1800,425,10,Item Enchantment,0.01,67,33025,25,0,1 -6088,Legendary Acid Bane,Increases a shield or piece of armor's resistance to Acid damage by 25%. Additional spells can be layered over this.,4,780,381,10,Item Enchantment,0.01,63,6,25,0,1 -6089,Legendary Blood Thirst,Increases a weapon's damage value by 10 points. Additional spells can be layered over this.,10,780,323,10,Item Enchantment,0,57,257,35,0,1 -6090,Legendary Bludgeoning Bane,Increases a shield or piece of armor's resistance to Bludgeoning damage by 25%. Additional spells can be layered over this.,4,780,383,10,Item Enchantment,0.01,67,6,25,0,1 -6091,Legendary Defender,Increases the Melee Defense skill modifier of a weapon or magic caster by 9%. Additional spells can be layered over this.,9,780,329,10,Item Enchantment,0.01,61,33025,35,0,1 -6092,Legendary Flame Bane,Increases a shield or piece of armor's resistance to Fire damage by 25%. Additional spells can be layered over this.,4,780,385,10,Item Enchantment,0.01,57,6,25,0,1 -6093,Legendary Frost Bane,Increases a shield or piece of armor's resistance to Cold damage by 25%. Additional spells can be layered over this.,4,780,387,10,Item Enchantment,0.01,65,6,25,0,1 -6094,Legendary Heart Thirst,Increases a weapon's Attack Skill modifier by 9%. Additional spells can be layered over this.,9,780,389,10,Item Enchantment,0.01,59,257,35,0,1 -6095,Legendary Impenetrability,Improves a shield or piece of armor's Armor value by 80 points. Additional spells can be layered over this.,4,780,391,10,Item Enchantment,0,142,6,25,0,1 -6096,Legendary Piercing Bane,Increases a shield or piece of armor's resistance to Piercing damage by 25%. Additional spells can be layered over this.,4,780,393,10,Item Enchantment,0.01,59,6,25,0,1 -6097,Legendary Slashing Bane,Increases a shield or piece of armor's resistance to Slashing damage by 25%. Additional spells can be layered over this.,4,780,395,10,Item Enchantment,0.01,61,6,25,0,1 -6098,Legendary Spirit Thirst,Increases the elemental damage bonus of an elemental magic caster by 7%. Additional spells can be layered over this.,7,780,323,10,Item Enchantment,0,57,32768,35,0,1 -6099,Legendary Storm Bane,Increases a shield or piece of armor's resistance to Electric damage by 25%. Additional spells can be layered over this.,4,780,397,10,Item Enchantment,0.01,67,6,25,0,1 -6100,Legendary Swift Hunter,Improves a weapon's speed by 40 points. Additional spells can be layered over this.,40,780,399,10,Item Enchantment,0,63,257,25,0,1 -6101,Legendary Willpower,Increases the target's Self by 35 points. Additional spells can be layered over this.,35,780,271,10,Creature Enchantment,0.01,14,16,0,1,1 -6102,Legendary Armor,Increases the target's natural armor by 80 points. Additional spells can be layered over this.,80,780,379,10,Life Magic,0.01,55,16,0,1,1 -6103,Legendary Coordination,Increases the target's Coordination by 35 points. Additional spells can be layered over this.,35,780,267,10,Creature Enchantment,0.01,8,16,0,1,1 -6104,Legendary Endurance,Increases the target's Endurance by 35 points. Additional spells can be layered over this.,35,780,263,10,Creature Enchantment,0.01,10,16,0,1,1 -6105,Legendary Focus,Increases the target's Focus by 35 points. Additional spells can be layered over this.,35,780,269,10,Creature Enchantment,0.01,16,16,0,1,1 -6106,Legendary Quickness,Increases the target's Quickness by 35 points. Additional spells can be layered over this.,35,780,265,10,Creature Enchantment,0.01,12,16,0,1,1 -6107,Legendary Strength,Increases the target's Strength by 35 points. Additional spells can be layered over this.,35,780,261,10,Creature Enchantment,0.01,6,16,0,1,1 -6108,Summoning Mastery Other I,Increases the target's Summoning skill by 10 points.,1,1800,696,10,Creature Enchantment,0.01,26,16,0,1,1 -6109,Summoning Mastery Other II,Increases the target's Summoning skill by 15 points.,50,1800,696,20,Creature Enchantment,0.05,26,16,5,0.85,1 -6110,Summoning Mastery Other III,Increases the target's Summoning skill by 20 points.,100,1800,696,30,Creature Enchantment,0.1,26,16,5,0.7,1 -6111,Summoning Mastery Other IV,Increases the target's Summoning skill by 25 points.,150,1800,696,40,Creature Enchantment,0.15,26,16,5,0.55,1 -6112,Summoning Mastery Other V,Increases the target's Summoning skill by 30 points.,200,1800,696,50,Creature Enchantment,0.2,26,16,5,0.4,1 -6113,Summoning Mastery Other VI,Increases the target's Summoning skill by 35 points.,250,2700,696,60,Creature Enchantment,0.3,26,16,5,0.25,1 -6114,Summoning Mastery Other VII,Increases the target's Summoning skill by 40 points.,300,3600,696,70,Creature Enchantment,0.15,26,16,5,0.25,1 -6115,Incantation of Summoning Mastery Other,Increases the target's Summoning skill by 45 points.,400,5400,696,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6116,Summoning Mastery Self I,Increases the caster's Summoning skill by 10 points.,1,1800,696,15,Creature Enchantment,0.01,26,16,0,0,1 -6117,Summoning Mastery Self II,Increases the caster's Summoning skill by 15 points.,50,1800,696,30,Creature Enchantment,0.05,26,16,0,0,1 -6118,Summoning Mastery Self III,Increases the caster's Summoning skill by 20 points.,100,1800,696,40,Creature Enchantment,0.1,26,16,0,0,1 -6119,Summoning Mastery Self IV,Increases the caster's Summoning skill by 25 points.,150,1800,696,50,Creature Enchantment,0.15,26,16,0,0,1 -6120,Summoning Mastery Self V,Increases the caster's Summoning skill by 30 points.,200,1800,696,60,Creature Enchantment,0.2,26,16,0,0,1 -6121,Summoning Mastery Self VI,Increases the caster's Summoning skill by 35 points.,250,2700,696,70,Creature Enchantment,0.3,26,16,0,0,1 -6122,Summoning Mastery Self VII,Increases the caster's Summoning skill by 40 points.,300,3600,696,70,Creature Enchantment,0.15,26,16,0,0,1 -6123,Incantation of Summoning Mastery Self,Increases the caster's Summoning skill by 45 points.,400,5400,696,80,Creature Enchantment,0.15,26,16,0,0,1 -6124,Epic Summoning Prowess,Increases the target's Summoning skill by 25 points. Additional spells can be layered over this.,25,780,698,10,Creature Enchantment,0.01,26,16,0,1,1 -6125,Legendary Summoning Prowess,Increases the target's Summoning skill by 35 points. Additional spells can be layered over this.,35,780,698,10,Creature Enchantment,0.01,26,16,0,1,1 -6126,Major Summoning Prowess,Increases the target's Summoning skill by 15 points. Additional spells can be layered over this.,2,780,698,10,Creature Enchantment,0.01,26,16,0,1,1 -6127,Minor Summoning Prowess,Increases the target's Summoning skill by 5 points. Additional spells can be layered over this.,1,780,698,10,Creature Enchantment,0.01,26,16,0,1,1 -6128,Moderate Summoning Prowess,Increases the target's Summoning skill by 10 points. Additional spells can be layered over this.,10,780,698,10,Creature Enchantment,0.01,26,16,0,1,1 -6129,Summoning Ineptitude Other I,Decreases the target's Summoning skill by 10 points.,1,60,697,10,Creature Enchantment,0.01,27,16,0,1,1 -6130,Summoning Ineptitude Other II,Decreases the target's Summoning skill by 15 points.,75,90,697,20,Creature Enchantment,0.05,27,16,5,0.85,1 -6131,Summoning Ineptitude Other III,Decreases the target's Summoning skill by 20 points.,125,120,697,30,Creature Enchantment,0.1,27,16,5,0.7,1 -6132,Summoning Ineptitude Other IV,Decreases the target's Summoning skill by 25 points.,175,150,697,40,Creature Enchantment,0.15,27,16,5,0.55,1 -6133,Summoning Ineptitude Other V,Decreases the target's Summoning skill by 30 points.,225,180,697,50,Creature Enchantment,0.2,27,16,5,0.4,1 -6134,Summoning Ineptitude Other VI,Decreases the target's Summoning skill by 35 points.,275,210,697,60,Creature Enchantment,0.3,27,16,5,0.25,1 -6135,Summoning Ineptitude Other VII,Decreases the target's Summoning skill by 40 points.,325,240,697,70,Creature Enchantment,0.15,27,16,5,0.25,1 -6136,Incantation of Summoning Ineptitude Other,Decreases the target's Summoning skill by 45 points.,400,300,697,80,Creature Enchantment,0.15,27,16,5,0.25,1 -6137,Weave of Summoning II,Increases the target's Summoning skill by 4 points.,4,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -6138,Weave of Summoning III,Increases the target's Summoning skill by 6 points.,6,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -6139,Weave of Summoning IV,Increases the target's Summoning skill by 8 points.,8,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -6140,Weave of Summoning V,Increases the target's Summoning skill by 10 points.,10,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -6141,Weave of Summoning I,Increases the target's Summoning skill by 2 points.,2,500,659,70,Creature Enchantment,0.3,26,16,0,0,1 -6142,Novice Invoker's Summoning Aptitude,Increases the target's Summoning skill by 3 points.,1,1800,699,10,Creature Enchantment,0.01,20,16,0,1,1 -6143,Apprentice Invoker's Summoning Aptitude,Increases the target's Summoning skill by 5 points.,2,1800,699,10,Creature Enchantment,0.01,20,16,0,1,1 -6144,Journeyman Invoker's Summoning Aptitude,Increases the target's Summoning skill by 10 points.,3,1800,699,10,Creature Enchantment,0.01,20,16,0,1,1 -6145,Master Invoker's Summoning Aptitude,Increases the target's Summoning skill by 20 points.,4,1800,699,10,Creature Enchantment,0.01,20,16,0,1,1 -6146,Ride The Lightning,Reduces damage the target takes from Lightning by 70%.,425,10800,107,80,Life Magic,0.15,53,16,0,0,0 -6147,Entrance to the Frozen Valley,Transports target to the Frozen Valley.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -6148,Begone and Be Afraid,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -6149,Rynthid Vision,Transports the target to the specified destination.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -6150,Rynthid Recall,Transports the caster to the area overrun by the Rynthid.,225,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -6151,Crimson Storm,Shoots eight waves of lightning outward from the caster. Each wave does 42-84 points of electric damage to the first thing it hits.,200,-1,225,80,War Magic,0.2,0,0,4.5,0,1 -6152,Rocky Shrapnel,Shoots 12 waves of boulders outward from the caster. Each wave does 100-400 points of bludgeoning damage to the first thing it hits.,400,-1,223,80,War Magic,0.2,0,0,10,0,1 -6153,Tryptophan Coma,You are soooooo sleepy. reducing your Quickness.,400,300,6,80,Creature Enchantment,0.15,13,16,5,0.25,1 -6154,Entering the Basement,Entering the Basement,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -6155,Earthen Stomp,The stomp of these creatures creates powerful rings of destructive force.,1200,-1,223,80,Life Magic,0.2,0,0,3,0,1 -6156,Viridian Ring,A powerful emanation that creates a ring of overwhelming life magic.,1200,-1,80,150,Life Magic,0.15,32,0,3,0,1 -6157,Withering Ring,A terrible emanation that destroys the victim's ability to heal wounds.,1200,-1,643,150,Life Magic,0.15,38,0,3,0,1 -6158,Poison Breath,A deadly cone of poison.,1200,-1,530,40,Life Magic,0.15,0,0,30,0.2,1 -6159,Thorn Volley,A cone of thorns and quill like projectiles.,600,-1,136,40,Life Magic,0.15,0,0,30,0.2,1 -6160,Thorns,Shoots a cluster of sharp thorns at the target. The cluster does 142-204 points of piercing damage to the first thing it hits.,400,-1,122,40,War Magic,0.15,0,16,30,0.2,1 -6161,Acidic Thorns,Shoots a cluster of acidic thorns at the target. The cluster does 142-204 points of acid damage to the first thing it hits.,400,-1,117,40,War Magic,0.15,0,16,30,0.2,1 -6162,Thorn Arc,Shoots a cluster of sharp thorns at the target. The thorns do 142-204 points of piercing damage to the first thing it hits.,400,-1,122,40,War Magic,0.15,0,16,30,0.2,1 -6163,Ring of Thorns,Shoots eight clusters of thorns outward from the caster. Each does 42-84 points of piercing damage to the first thing it hits.,300,-1,227,80,War Magic,0.2,0,0,4.5,0,1 -6164,Deadly Ring of Thorns,Shoots eight clusters of thorns outward from the caster. Each does 42-84 points of piercing damage to the first thing it hits.,1200,-1,227,80,War Magic,0.2,0,0,4.5,0,1 -6165,Deadly Thorn Volley,A deadly cone of thorns and quill like projectiles.,1200,-1,136,40,Life Magic,0.15,0,0,30,0.2,1 -6166,Poisoned Wounds,Your wounds are poisoned and don't heal as well.,350,30,619,80,Life Magic,0.15,38,16,5,0.25,1 -6167,Poisoned Vitality,Poison flows in your veins reducing your total health by 50%.,50,30,410,10,Creature Enchantment,0.01,9,16,0,1,1 -6168,Deadly Ring of Lightning,The power of storms creates a deadly ring of lightning.,1200,-1,225,80,War Magic,0.2,0,0,4.5,0,1 -6169,Deadly Lightning Volley,A deadly cone of lightning.,1200,-1,134,40,War Magic,0.15,0,0,30,0.2,1 -6170,Honeyed Life Mead,Increases maximum health by 20 points.,20,10800,700,70,Life Magic,0.3,31,16,0,0,1 -6171,Honeyed Mana Mead,Increases maximum mana by 50 points.,20,10800,701,70,Life Magic,0.3,31,16,0,0,1 -6172,Honeyed Vigor Mead,Increases maximum stamina by 50 points.,20,10800,702,70,Life Magic,0.3,31,16,0,0,1 -6173,Raging Heart,Increases maximum health by 65 points for 1 hour.,65,3600,279,70,Life Magic,0.3,31,16,0,0,1 -6174,Twisting Wounds,The Critical Damage Rating of the caster is increased by 10.,2,1200,703,70,Life Magic,0.3,162,16,0,0,1 -6175,Increasing Pain,The damage rating of the caster is increased by 10. This spell does not stack with Luminous Crystal of Surging Strength.,2,1200,650,70,Life Magic,0.3,162,16,0,0,1 -6176,Genius,Increases the caster's Focus by 50 points for a short period of time.,250,30,15,60,Creature Enchantment,0.3,16,16,0,0,1 -6177,Gauntlet Item Mastery,Increases the caster's Item Tinkering skill by 150 points for 10 minutes. This effect does not stack with Prodigal rare spells.,250,600,453,70,Creature Enchantment,0.15,26,16,0,0,1 -6178,Gauntlet Weapon Mastery,Increases the caster's Weapon Tinkering skill by 150 points for 10 minutes. This effect does not stack with Prodigal rare spells.,250,600,455,70,Creature Enchantment,0.15,26,16,0,0,1 -6179,Gauntlet Magic Item Mastery,Increases the caster's Magic Item Tinkering skill by 150 points for 10 minutes. This effect does not stack with Prodigal rare spells.,250,600,454,70,Creature Enchantment,0.15,26,16,0,0,1 -6180,Gauntlet Armor Mastery,Increases the caster's Armor Tinkering skill by 150 points for 10 minutes. This effect does not stack with Prodigal rare spells.,250,600,452,70,Creature Enchantment,0.15,26,16,0,0,1 -6181,Singeing Flames,Shoots eight waves of flame forward from the caster. Each wave does 150-250 points of fire damage to the first thing it hits.,400,-1,226,80,War Magic,0.01,0,16,30,0,1 -6182,Over-Exerted,Decreases all of the target's defense skills by 500 for 1 minute.,100,60,686,70,Creature Enchantment,0.15,172,16,5,0.25,1 -6183,Return to the Stronghold,Transports the target to the Gauntlet.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -6184,Return to the Stronghold,Transports the target to the Gauntlet.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -6185,Return to the Stronghold,Transports the target to the Gauntlet.,125,-1,214,50,Item Enchantment,0.25,16,16,30,0,1 -6186,Deafening Wail,The bark of these creatures creates powerful rings of destructive force.,1200,-1,223,80,War Magic,0.2,0,0,3,0,1 -6187,Screeching Howl,A deafening howl creating deadly shockwaves.,1200,-1,132,40,War Magic,0.15,0,0,30,0.2,1 -6188,Earthquake,The stomp of this creature violently shakes the ground.,1200,-1,223,80,War Magic,0.2,0,0,3,0,1 -6189,Searing Disc II,Shoots eight waves of acid outward from the caster. Each wave does 49-96 points of acid damage to the first thing it hits.,300,-1,222,90,War Magic,0.2,0,0,4.5,0,1 -6190,Horizon's Blades II,Shoots eight blades outward from the caster. Each blade does 49-98 points of slashing damage to the first thing it hits.,300,-1,228,90,War Magic,0.2,0,0,4.5,0,1 -6191,Cassius' Ring of Fire II,Shoots eight waves of flame outward from the caster. Each wave does 49-98 points of fire damage to the first thing it hits.,300,-1,226,90,War Magic,0.2,0,0,4.5,0,1 -6192,Nuhmudira's Spines II,Shoots eight waves of force outward from the caster. Each wave does 49-98 points of piercing damage to the first thing it hits.,300,-1,227,90,War Magic,0.2,0,0,4.5,0,1 -6193,Halo of Frost II,Shoots eight waves of frost outward from the caster. Each wave does 49-98 points of cold damage to the first thing it hits.,300,-1,224,90,War Magic,0.2,0,0,4.5,0,1 -6194,Eye of the Storm II,Shoots eight waves of lightning outward from the caster. Each wave does 49-98 points of electric damage to the first thing it hits.,300,-1,225,90,War Magic,0.2,0,0,4.5,0,1 -6195,Clouded Soul II,Shoots eight waves of nether outward from the caster. Each wave does 109-172 points of nether damage to the first thing it hits.,300,-1,641,90,Void Magic,0.2,0,0,4.5,0,1 -6196,Tectonic Rifts II,Shoots eight shock waves outward from the caster. Each wave does 49-96 points of bludgeoning damage to the first thing it hits.,300,-1,223,90,War Magic,0.2,0,0,4.5,0,1 -6197,Eye of the Storm II,Shoots eight waves of lightning outward from the caster. Each wave does 49-98 points of electric damage to the first thing it hits.,250,-1,225,90,War Magic,0.2,0,0,4.5,0,1 -6198,Incantation of Lightning Bolt,Shoots a bolt of lighting at the target. The bolt does 142-204 points of electrical damage to the first thing it hits.,400,-1,120,40,War Magic,0.15,0,16,30,0.2,1 -6199,Incantation of Lightning Arc,Shoots a bolt of lighting at the target. The bolt does 142-204 points of electrical damage to the first thing it hits.,400,-1,120,40,War Magic,0.15,0,16,30,0.2,1 -6200,Paragon's Dual Wield Mastery V,Increases the wielder's Dual Wield skill by 5 points.,5,5400,708,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6201,Paragon's Finesse Weapon Mastery I,Increases the wielder's Finesse Weapons skill by 1 point.,1,5400,716,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6202,Paragon's Finesse Weapon Mastery II,Increases the wielder's Finesse Weapons skill by 2 points.,2,5400,716,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6203,Paragon's Finesse Weapon Mastery III,Increases the wielder's Finesse Weapons skill by 3 points.,3,5400,716,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6204,Paragon's Finesse Weapon Mastery IV,Increases the wielder's Finesse Weapons skill by 4 points.,4,5400,716,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6205,Paragon's Finesse Weapon Mastery V,Increases the wielder's Finesse Weapons skill by 5 points.,5,5400,716,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6206,Paragon's Heavy Weapon Mastery I,Increases the wielder's Heavy Weapons skill by 1 point.,1,5400,717,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6207,Paragon's Heavy Weapon Mastery II,Increases the wielder's Heavy Weapons skill by 2 points.,2,5400,717,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6208,Paragon's Heavy Weapon Mastery III,Increases the wielder's Heavy Weapons skill by 3 points.,3,5400,717,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6209,Paragon's Heavy Weapon Mastery IV,Increases the wielder's Heavy Weapons skill by 4 points.,4,5400,717,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6210,Paragon's Heavy Weapon Mastery V,Increases the wielder's Heavy Weapons skill by 5 points.,5,5400,717,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6211,Paragon's Life Magic Mastery I,Increases the wielder's Life Magic skill by 1 point.,1,5400,719,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6212,Paragon's Life Magic Mastery II,Increases the wielder's Life Magic skill by 2 points.,2,5400,719,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6213,Paragon's Life Magic Mastery III,Increases the wielder's Life Magic skill by 3 points.,3,5400,719,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6214,Paragon's Life Magic Mastery IV,Increases the wielder's Life Magic skill by 4 points.,4,5400,719,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6215,Paragon's Life Magic Mastery V,Increases the wielder's Life Magic skill by 5 points.,5,5400,719,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6216,Paragon's Light Weapon Mastery I,Increases the wielder's Light Weapons skill by 1 point.,1,5400,715,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6217,Paragon's Light Weapon Mastery II,Increases the wielder's Light Weapons skill by 2 points.,2,5400,715,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6218,Paragon's Light Weapon Mastery III,Increases the wielder's Light Weapons skill by 3 points.,3,5400,715,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6219,Paragon's Light Weapon Mastery IV,Increases the wielder's Light Weapons skill by 4 points.,4,5400,715,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6220,Paragon's Light Weapon Mastery V,Increases the wielder's Light Weapons skill by 5 points.,5,5400,715,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6221,Paragon's Missile Weapon Mastery I,Increases the wielder's Missile Weapons skill by 1 point.,1,5400,721,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6222,Paragon's Missile Weapon Mastery II,Increases the wielder's Missile Weapons skill by 2 points.,2,5400,721,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6223,Paragon's Missile Weapon Mastery III,Increases the wielder's Missile Weapons skill by 3 points.,3,5400,721,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6224,Paragon's Missile Weapon Mastery IV,Increases the wielder's Missile Weapons skill by 4 points.,4,5400,721,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6225,Paragon's Missile Weapon Mastery V,Increases the wielder's Missile Weapons skill by 5 points.,5,5400,721,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6226,Paragon's Recklessness Mastery I,Increases the wielder's Recklessness skill by 1 point.,1,5400,709,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6227,Paragon's Recklessness Mastery II,Increases the wielder's Recklessness skill by 2 points.,2,5400,709,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6228,Paragon's Recklessness Mastery III,Increases the wielder's Recklessness skill by 3 points.,3,5400,709,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6229,Paragon's Recklessness Mastery IV,Increases the wielder's Recklessness skill by 4 points.,4,5400,709,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6230,Paragon's Recklessness Mastery V,Increases the wielder's Recklessness skill by 5 points.,5,5400,709,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6231,Paragon's Sneak Attack Mastery I,Increases the wielder's Sneak Attack skill by 1 point.,1,5400,710,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6232,Paragon's Sneak Attack Mastery II,Increases the wielder's Sneak Attack skill by 2 points.,2,5400,710,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6233,Paragon's Sneak Attack Mastery III,Increases the wielder's Sneak Attack skill by 3 points.,3,5400,710,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6234,Paragon's Sneak Attack Mastery IV,Increases the wielder's Sneak Attack skill by 4 points.,4,5400,710,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6235,Paragon's Sneak Attack Mastery V,Increases the wielder's Sneak Attack skill by 5 points.,5,5400,710,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6236,Paragon's Two Handed Combat Mastery I,Increases the wielder's Two Handed Combat skill by 1 point.,1,5400,727,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6237,Paragon's Two Handed Combat Mastery II,Increases the wielder's Two Handed Combat skill by 2 points.,2,5400,727,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6238,Paragon's Two Handed Combat Mastery III,Increases the wielder's Two Handed Combat skill by 3 points.,3,5400,727,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6239,Paragon's Two Handed Combat Mastery IV,Increases the wielder's Two Handed Combat skill by 4 points.,4,5400,727,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6240,Paragon's Two Handed Combat Mastery V,Increases the wielder's Two Handed Combat skill by 5 points.,5,5400,727,80,Creature Enchantment,0.15,18,16,5,0.25,1 -6241,Paragon's Void Magic Mastery I,Increases the wielder's Void Magic skill by 1 point.,1,5400,720,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6242,Paragon's Void Magic Mastery II,Increases the wielder's Void Magic skill by 2 points.,2,5400,720,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6243,Paragon's Void Magic Mastery III,Increases the wielder's Void Magic skill by 3 points.,3,5400,720,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6244,Paragon's Void Magic Mastery IV,Increases the wielder's Void Magic skill by 4 points.,4,5400,720,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6245,Paragon's Void Magic Mastery V,Increases the wielder's Void Magic skill by 5 points.,5,5400,720,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6246,Paragon's War Magic Mastery I,Increases the wielder's War Magic skill by 1 point.,1,5400,718,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6247,Paragon's War Magic Mastery II,Increases the wielder's War Magic skill by 2 points.,2,5400,718,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6248,Paragon's War Magic Mastery III,Increases the wielder's War Magic skill by 3 points.,3,5400,718,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6249,Paragon's War Magic Mastery IV,Increases the wielder's War Magic skill by 4 points.,4,5400,718,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6250,Paragon's War Magic Mastery V,Increases the wielder's War Magic skill by 5 points.,5,5400,718,80,Creature Enchantment,0.15,26,16,5,0.25,1 -6251,Paragon's Dirty Fighting Mastery I,Increases the wielder's Dirty Fighting skill by 1 point.,1,5400,707,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6252,Paragon's Dirty Fighting Mastery II,Increases the wielder's Dirty Fighting skill by 2 points.,2,5400,707,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6253,Paragon's Dirty Fighting Mastery III,Increases the wielder's Dirty Fighting skill by 3 points.,3,5400,707,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6254,Paragon's Dirty Fighting Mastery IV,Increases the wielder's Dirty Fighting skill by 4 points.,4,5400,707,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6255,Paragon's Dirty Fighting Mastery V,Increases the wielder's Dirty Fighting skill by 5 points.,5,5400,707,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6256,Paragon's Dual Wield Mastery I,Increases the wielder's Dual Wield skill by 1 point.,1,5400,708,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6257,Paragon's Dual Wield Mastery II,Increases the wielder's Dual Wield skill by 2 points.,2,5400,708,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6258,Paragon's Dual Wield Mastery III,Increases the wielder's Dual Wield skill by 3 points.,3,5400,708,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6259,Paragon's Dual Wield Mastery IV,Increases the wielder's Dual Wield skill by 4 points.,4,5400,708,80,Creature Enchantment,0.15,20,16,5,0.25,1 -6260,Paragon's Willpower V,Increases the wielder's Self by 5 points.,5,5400,726,80,Creature Enchantment,0.15,14,16,5,0.25,1 -6261,Paragon's Coordination I,Increases the wielder's Coordination by 1 point.,1,5400,723,80,Creature Enchantment,0.15,8,16,5,0.25,1 -6262,Paragon's Coordination II,Increases the wielder's Coordination by 2 points.,2,5400,723,80,Creature Enchantment,0.15,8,16,5,0.25,1 -6263,Paragon's Coordination III,Increases the wielder's Coordination by 3 points.,3,5400,723,80,Creature Enchantment,0.15,8,16,5,0.25,1 -6264,Paragon's Coordination IV,Increases the wielder's Coordination by 4 points.,4,5400,723,80,Creature Enchantment,0.15,8,16,5,0.25,1 -6265,Paragon's Coordination V,Increases the wielder's Coordination by 5 points.,5,5400,723,80,Creature Enchantment,0.15,8,16,5,0.25,1 -6266,Paragon's Endurance I,Increases the wielder's Endurance by 1 point.,1,5400,704,80,Creature Enchantment,0.15,10,16,5,0.25,1 -6267,Paragon's Endurance II,Increases the wielder's Endurance by 2 points.,2,5400,704,80,Creature Enchantment,0.15,10,16,5,0.25,1 -6268,Paragon's Endurance III,Increases the wielder's Endurance by 3 points.,3,5400,704,80,Creature Enchantment,0.15,10,16,5,0.25,1 -6269,Paragon's Endurance IV,Increases the wielder's Endurance by 4 points.,4,5400,704,80,Creature Enchantment,0.15,10,16,5,0.25,1 -6270,Paragon's Endurance V,Increases the wielder's Endurance by 5 points.,5,5400,704,80,Creature Enchantment,0.15,10,16,5,0.25,1 -6271,Paragon's Focus I,Increases the wielder's Focus by 1 point.,1,5400,725,80,Creature Enchantment,0.15,16,16,5,0.25,1 -6272,Paragon's Focus II,Increases the wielder's Focus by 2 points.,2,5400,725,80,Creature Enchantment,0.15,16,16,5,0.25,1 -6273,Paragon's Focus III,Increases the wielder's Focus by 3 points.,3,5400,725,80,Creature Enchantment,0.15,16,16,5,0.25,1 -6274,Paragon's Focus IV,Increases the wielder's Focus by 4 points.,4,5400,725,80,Creature Enchantment,0.15,16,16,5,0.25,1 -6275,Paragon's Focus V,Increases the wielder's Focus by 5 points.,5,5400,725,80,Creature Enchantment,0.15,16,16,5,0.25,1 -6276,Paragon Quickness I,Increases the wielder's Quickness by 1 point.,1,5400,724,80,Creature Enchantment,0.15,12,16,5,0.25,1 -6277,Paragon Quickness II,Increases the wielder's Quickness by 2 points.,2,5400,724,80,Creature Enchantment,0.15,12,16,5,0.25,1 -6278,Paragon Quickness III,Increases the wielder's Quickness by 3 points.,3,5400,724,80,Creature Enchantment,0.15,12,16,5,0.25,1 -6279,Paragon Quickness IV,Increases the wielder's Quickness by 4 points.,4,5400,724,80,Creature Enchantment,0.15,12,16,5,0.25,1 -6280,Paragon Quickness V,Increases the wielder's Quickness by 5 points.,5,5400,724,80,Creature Enchantment,0.15,12,16,5,0.25,1 -6281,Paragon's Strength I,Increases the wielder's Strength by 1 point.,1,5400,722,80,Creature Enchantment,0.15,6,16,5,0.25,1 -6282,Paragon's Strength II,Increases the wielder's Strength by 2 points.,2,5400,722,80,Creature Enchantment,0.15,6,16,5,0.25,1 -6283,Paragon's Strength III,Increases the wielder's Strength by 3 points.,3,5400,722,80,Creature Enchantment,0.15,6,16,5,0.25,1 -6284,Paragon's Strength IV,Increases the wielder's Strength by 4 points.,4,5400,722,80,Creature Enchantment,0.15,6,16,5,0.25,1 -6285,Paragon's Strength V,Increases the wielder's Strength by 5 points.,5,5400,722,80,Creature Enchantment,0.15,6,16,5,0.25,1 -6286,Paragon's Willpower I,Increases the wielder's Self by 1 point.,1,5400,726,80,Creature Enchantment,0.15,14,16,5,0.25,1 -6287,Paragon's Willpower II,Increases the wielder's Self by 2 points.,2,5400,726,80,Creature Enchantment,0.15,14,16,5,0.25,1 -6288,Paragon's Willpower III,Increases the wielder's Self by 3 points.,3,5400,726,80,Creature Enchantment,0.15,14,16,5,0.25,1 -6289,Paragon's Willpower IV,Increases the wielder's Self by 4 points.,4,5400,726,80,Creature Enchantment,0.15,14,16,5,0.25,1 -6290,Paragon's Stamina V,Increases maximum stamina by 10 points.,10,5400,706,70,Life Magic,0.3,35,16,0,0,1 -6291,Paragon's Critical Boost I,The critical damage rating of the wielder is increased by 1.,1,5400,713,70,Life Magic,0.3,162,16,0,0,1 -6292,Paragon's Critical Damage Boost II,The critical damage rating of the wielder is increased by 2.,2,5400,713,70,Life Magic,0.3,162,16,0,0,1 -6293,Paragon's Critical Damage Boost III,The critical damage rating of the wielder is increased by 3.,3,5400,713,70,Life Magic,0.3,162,16,0,0,1 -6294,Paragon's Critical Damage Boost IV,The damage rating of the wielder is increased by 4.,4,5400,713,70,Life Magic,0.3,162,16,0,0,1 -6295,Paragon's Critical Damage Boost V,The critical damage rating of the wielder is increased by 5.,5,5400,713,70,Life Magic,0.3,162,16,0,0,1 -6296,Paragon's Critical Damage Reduction I,The critical damage reduction rating of the wielder is increased by 1.,1,5400,714,70,Life Magic,0.3,163,16,0,0,1 -6297,Paragon's Critical Damage Reduction II,The critical damage reduction rating of the wielder is increased by 2.,2,5400,714,70,Life Magic,0.3,163,16,0,0,1 -6298,Paragon's Critical Damage Reduction III,The critical damage reduction rating of the wielder is increased by 3.,3,5400,714,70,Life Magic,0.3,163,16,0,0,1 -6299,Paragon's Critical Damage Reduction IV,The critical damage reduction rating of the wielder is increased by 4.,4,5400,714,70,Life Magic,0.3,163,16,0,0,1 -6300,Paragon's Critical Damage Reduction V,The critical damage reduction rating of the wielder is increased by 5.,5,5400,714,70,Life Magic,0.3,163,16,0,0,1 -6301,Paragon's Damage Boost I,The damage rating of the wielder is increased by 1.,1,5400,711,70,Life Magic,0.3,162,16,0,0,1 -6302,Paragon's Damage Boost II,The damage rating of the wielder is increased by 2.,2,5400,711,70,Life Magic,0.3,162,16,0,0,1 -6303,Paragon's Damage Boost III,The damage rating of the wielder is increased by 3.,3,5400,711,70,Life Magic,0.3,162,16,0,0,1 -6304,Paragon's Damage Boost IV,The damage rating of the wielder is increased by 4.,4,5400,711,70,Life Magic,0.3,162,16,0,0,1 -6305,Paragon's Damage Boost V,The damage rating of the wielder is increased by 5.,5,5400,711,70,Life Magic,0.3,162,16,0,0,1 -6306,Paragon's Damage Reduction I,The damage reduction rating of the wielder is increased by 1.,1,5400,712,70,Life Magic,0.3,163,16,0,0,1 -6307,Paragon's Damage Reduction II,The damage reduction rating of the wielder is increased by 2.,2,5400,712,70,Life Magic,0.3,163,16,0,0,1 -6308,Paragon's Damage Reduction III,The damage reduction rating of the wielder is increased by 3.,3,5400,712,70,Life Magic,0.3,163,16,0,0,1 -6309,Paragon's Damage Reduction IV,The damage reduction rating of the wielder is increased by 4.,4,5400,712,70,Life Magic,0.3,163,16,0,0,1 -6310,Paragon's Damage Reduction V,The damage reduction rating of the wielder is increased by 5.,5,5400,712,70,Life Magic,0.3,163,16,0,0,1 -6311,Paragon's Mana I,Increases maximum mana by 2 points.,2,5400,705,70,Life Magic,0.3,33,16,0,0,1 -6312,Paragon's Mana II,Increases maximum mana by 4 points.,4,5400,705,70,Life Magic,0.3,33,16,0,0,1 -6313,Paragon's Mana III,Increases maximum mana by 6 points.,6,5400,705,70,Life Magic,0.3,33,16,0,0,1 -6314,Paragon's Mana IV,Increases maximum mana by 8 points.,8,5400,705,70,Life Magic,0.3,33,16,0,0,1 -6315,Paragon's Mana V,Increases maximum mana by 10 points.,10,5400,705,70,Life Magic,0.3,33,16,0,0,1 -6316,Paragon's Stamina I,Increases maximum stamina by 2 points.,2,5400,706,70,Life Magic,0.3,35,16,0,0,1 -6317,Paragon's Stamina II,Increases maximum stamina by 4 points.,4,5400,706,70,Life Magic,0.3,35,16,0,0,1 -6318,Paragon's Stamina III,Increases maximum stamina by 6 points.,6,5400,706,70,Life Magic,0.3,35,16,0,0,1 -6319,Paragon's Stamina IV,Increases maximum stamina by 8 points.,8,5400,706,70,Life Magic,0.3,35,16,0,0,1 -6320,Ring of Skulls II,Shoots eight nether skulls outward from the caster. Each skull does 109-172 points of nether damage to the first thing it hits.,300,-1,641,90,Void Magic,0.2,0,0,4.5,0,1 -6321,Viridian Rise Recall,Transports the target to the specified destination.,250,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -6322,Viridian Rise Great Tree Recall,Transports the target to the specified destination.,250,-1,214,150,Item Enchantment,0.25,16,16,0,0,1 -6323,Gauntlet Imperil Self,Decreases the caster's natural armor by 300 points.,400,1800,116,80,Life Magic,0.15,56,16,0,0,1 -6324,Gauntlet Vulnerability Self,Increases damage the caster takes from Fire by 210%.,400,1800,110,80,Life Magic,0.15,44,16,0,0,1 -6325,Celestial Hand Stronghold Recall,Sends the caster to the Stronghold of the Celestial Hand.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -6326,Eldrytch Web Stronghold Recall,Sends the caster to the Stronghold of the Eldrytch Web.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -6327,Radiant Blood Stronghold Recall,Sends the caster to the Stronghold of the Radiant Blood.,150,-1,214,50,Item Enchantment,0.25,0,16,0,0,1 -6328,Gauntlet Critical Damage Boost I,Your critical damage rating is increased by 1.,1,10800,732,70,Life Magic,0.3,35,16,0,0,1 -6329,Gauntlet Critical Damage Boost II,Your critical damage rating is increased by 2.,1,10800,732,70,Life Magic,0.3,35,16,0,0,1 -6330,Gauntlet Damage Boost I,Your damage rating is increased by 1.,1,10800,729,70,Life Magic,0.3,35,16,0,0,1 -6331,Gauntlet Damage Boost II,Your damage rating is increased by 2.,1,10800,729,70,Life Magic,0.3,35,16,0,0,1 -6332,Gauntlet Damage Reduction I,Your damage reduction rating is increased by 1.,1,10800,728,70,Life Magic,0.3,35,16,0,0,1 -6333,Gauntlet Damage Reduction II,Your damage reduction rating is increased by 2.,1,10800,728,70,Life Magic,0.3,35,16,0,0,1 -6334,Gauntlet Critical Damage Reduction I,Your critical damage reduction rating is increased by 1.,1,10800,733,70,Life Magic,0.3,35,16,0,0,1 -6335,Gauntlet Critical Damage Reduction II,Your critical damage reduction rating is increased by 2.,1,10800,733,70,Life Magic,0.3,35,16,0,0,1 -6336,Gauntlet Healing Boost I,Your healing rating is increased by 1.,1,10800,730,70,Life Magic,0.3,35,16,0,0,1 -6337,Gauntlet Healing Boost II,Your healing rating is increased by 2.,1,10800,730,70,Life Magic,0.3,35,16,0,0,1 -6338,Gauntlet Vitality I,Your vitality is increased by 1.,1,10800,731,70,Life Magic,0.3,35,16,0,0,1 -6339,Gauntlet Vitality II,Your vitality is increased by 2.,1,10800,731,70,Life Magic,0.3,35,16,0,0,1 -6340,Gauntlet Vitality III,Your vitality is increased by 3.,1,10800,731,70,Life Magic,0.3,35,16,0,0,1 \ No newline at end of file diff --git a/Shared/User32.cs b/Shared/User32.cs deleted file mode 100644 index 8a877d4..0000000 --- a/Shared/User32.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace Mag.Shared -{ - public static class User32 - { - public const int WM_ACTIVATE = 0x0006; - public const int WM_SETFOCUS = 0x0007; - public const int WM_KILLFOCUS = 0x0008; - public const int WM_ACTIVATEAPP = 0x001C; - public const int WM_DESTROY = 0x0002; - public const int WM_KEYDOWN = 0x0100; - public const int WM_KEYUP = 0x0101; - public const int WM_CHAR = 0x0102; - - public const int WM_MOUSEMOVE = 0x0200; - public const int WM_LBUTTONDOWN = 0x0201; - public const int WM_LBUTTONUP = 0x0202; - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - public static extern bool PostMessage(IntPtr hhwnd, uint msg, IntPtr wparam, UIntPtr lparam); - - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool GetCursorPos(out System.Drawing.Point lpPoint); - - [StructLayout(LayoutKind.Sequential)] - public struct RECT - { - public int Left; - public int Top; - public int Right; - public int Bottom; - - public int Width { get { return Right - Left; } } - public int Height { get { return Bottom - Top; } } - } - - [DllImport("user32.dll", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); - - //Gets window attributes - [DllImport("user32.dll", SetLastError = true)] - public static extern int GetWindowLong(IntPtr hWnd, int nIndex); - - //Sets window attributes - /// - /// Changes an attribute of the specified window. The function also sets the 32-bit (long) value at the specified offset into the extra window memory. - /// - /// A handle to the window and, indirectly, the class to which the window belongs.. - /// The zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer. To set any other value, specify one of the following values: GWL_EXSTYLE, GWL_HINSTANCE, GWL_ID, GWL_STYLE, GWL_USERDATA, GWL_WNDPROC - /// The replacement value. - /// If the function succeeds, the return value is the previous value of the specified 32-bit integer. - /// If the function fails, the return value is zero. To get extended error information, call GetLastError. - [DllImport("user32.dll")] - public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); - - /// - /// The MoveWindow function changes the position and dimensions of the specified window. For a top-level window, the position and dimensions are relative to the upper-left corner of the screen. For a child window, they are relative to the upper-left corner of the parent window's client area. - /// - /// Handle to the window. - /// Specifies the new position of the left side of the window. - /// Specifies the new position of the top of the window. - /// Specifies the new width of the window. - /// Specifies the new height of the window. - /// Specifies whether the window is to be repainted. If this parameter is TRUE, the window receives a message. If the parameter is FALSE, no repainting of any kind occurs. This applies to the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent window uncovered as a result of moving a child window. - /// If the function succeeds, the return value is nonzero. - /// If the function fails, the return value is zero. To get extended error information, call GetLastError. - [DllImport("user32.dll", SetLastError = true)] - public static extern bool MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool bRepaint); - - - public const int SW_MINIMIZE = 6; - - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); - } -} diff --git a/Shared/Util.cs b/Shared/Util.cs deleted file mode 100644 index db73da6..0000000 --- a/Shared/Util.cs +++ /dev/null @@ -1,415 +0,0 @@ -using System; -using System.IO; -using System.Text.RegularExpressions; - -using Decal.Adapter; -using Decal.Adapter.Wrappers; - -using Decal.Filters; - -namespace Mag.Shared -{ - public static class Util - { - public static CoordsObject GetCoords(int landBlock, double x, double y) - { - int ilbLng = (int)(Math.Floor(landBlock / (double)(0x1000000))) & 0xFF; - int ilbLat = (int)(Math.Floor(landBlock / (double)(0x10000))) & 0xFF; - - double latOut = ((double)(ilbLat - 0x7F) * 192 + y - 84) / 240; - double lngOut = ((double)(ilbLng - 0x7F) * 192 + x - 84) / 240; - - return new CoordsObject(latOut, lngOut); - } - - /// - /// This function will return the distance in meters. - /// The manual distance units are in map compass units, while the distance units used in the UI are meters. - /// In AC there are 240 meters in a kilometer; thus if you set your attack range to 1 in the UI it - /// will showas 0.00416666666666667in the manual options (0.00416666666666667 being 1/240). - /// - /// - /// - /// - /// Object passed with an Id of 0 - public static double GetDistance(WorldObject obj1, WorldObject obj2) - { - if (obj1.Id == 0) - throw new ArgumentOutOfRangeException("obj1", "Object passed with an Id of 0"); - - if (obj2.Id == 0) - throw new ArgumentOutOfRangeException("obj2", "Object passed with an Id of 0"); - - return CoreManager.Current.WorldFilter.Distance(obj1.Id, obj2.Id) * 240; - } - - /// - /// This function will return the distance in meters. - /// The manual distance units are in map compass units, while the distance units used in the UI are meters. - /// In AC there are 240 meters in a kilometer; thus if you set your attack range to 1 in the UI it - /// will showas 0.00416666666666667in the manual options (0.00416666666666667 being 1/240). - /// - /// - /// - /// CharacterFilder.Id or Object passed with an Id of 0 - public static double GetDistanceFromPlayer(WorldObject destObj) - { - if (CoreManager.Current.CharacterFilter.Id == 0) - throw new ArgumentOutOfRangeException("destObj", "CharacterFilter.Id of 0"); - - if (destObj.Id == 0) - throw new ArgumentOutOfRangeException("destObj", "Object passed with an Id of 0"); - - return CoreManager.Current.WorldFilter.Distance(CoreManager.Current.CharacterFilter.Id, destObj.Id) * 240; - } - - /// - /// Gets the closest object found of the specified object class. If no object is found, null is returned. - /// - /// - public static WorldObject GetClosestObject(ObjectClass objectClass) - { - WorldObject closest = null; - - foreach (WorldObject obj in CoreManager.Current.WorldFilter.GetLandscape()) - { - if (obj.ObjectClass != objectClass) - continue; - - if (closest == null || GetDistanceFromPlayer(obj) < GetDistanceFromPlayer(closest)) - closest = obj; - } - - return closest; - } - - public static WorldObject GetClosestObject(string objectName, bool partialMatch = false) - { - WorldObject closest = null; - - foreach (WorldObject obj in CoreManager.Current.WorldFilter.GetLandscape()) - { - if (!partialMatch && String.Compare(obj.Name, objectName, StringComparison.OrdinalIgnoreCase) != 0) - continue; - if (partialMatch && !obj.Name.ToLower().Contains(objectName.ToLower())) - continue; - - if (closest == null || GetDistanceFromPlayer(obj) < GetDistanceFromPlayer(closest)) - closest = obj; - } - - return closest; - } - - /// - /// - /// - /// - /// - /// - public static int GetFreePackSlots(int container) - { - if (container == 0) - throw new ArgumentOutOfRangeException("container", "Invalid container passed, id of 0."); - - WorldObject target = CoreManager.Current.WorldFilter[container]; - - if (target == null || (target.ObjectClass != ObjectClass.Player && target.ObjectClass != ObjectClass.Container)) - throw new ArgumentOutOfRangeException("container", "Invalid container passed, null reference"); - - int slotsFilled = 0; - - foreach (WorldObject obj in CoreManager.Current.WorldFilter.GetByContainer(container)) - { - if (obj.ObjectClass == ObjectClass.Container || obj.ObjectClass == ObjectClass.Foci || obj.Values(LongValueKey.EquippedSlots) != 0) - continue; - - slotsFilled++; - } - - return CoreManager.Current.WorldFilter[container].Values(LongValueKey.ItemSlots) - slotsFilled; - } - - // http://www.regular-expressions.info/reference.html - - // Local Chat - // You say, "test" - private static readonly Regex YouSay = new Regex("^You say, \"(?.*)\"$"); - // PlayerName<\Tell> says, "asdf" - private static readonly Regex PlayerSaysLocal = new Regex("^[\\w\\s'-]+)>[\\w\\s'-]+<\\\\Tell> says, \"(?.*)\"$"); - // - // Master Arbitrator says, "Arena Three is now available for new warriors!" - private static readonly Regex NpcSays = new Regex("^(?[\\w\\s'-]+) says, \"(?.*)\"$"); - - // Channel Chat - // [Allegiance] PlayerName<\Tell> says, "kk" - // [General] PlayerName<\Tell> says, "asdfasdfasdf" - // [Fellowship] PlayerName<\Tell> says, "test" - private static readonly Regex PlayerSaysChannel = new Regex("^\\[(?.+)]+ [\\w\\s'-]+)>[\\w\\s'-]+<\\\\Tell> says, \"(?.*)\"$"); - // - // [Fellowship] Master Arbitrator<\Tell> says, "Good Luck!" - - // Tells - // You tell PlayerName, "test" - private static readonly Regex YouTell = new Regex("^You tell .+, \"(?.*)\"$"); - // PlayerName<\Tell> tells you, "test" - private static readonly Regex PlayerTellsYou = new Regex("^[\\w\\s'-]+)>[\\w\\s'-]+<\\\\Tell> tells you, \"(?.*)\"$"); - // - // Master Arbitrator tells you, "You fought in the Colosseum's Arenas too recently. I cannot reward you for 4s." - private static readonly Regex NpcTellsYou = new Regex("^(?[\\w\\s'-]+) tells you, \"(?.*)\"$"); - - [Flags] - public enum ChatFlags : byte - { - None = 0x00, - - PlayerSaysLocal = 0x01, - PlayerSaysChannel = 0x02, - YouSay = 0x04, - - PlayerTellsYou = 0x08, - YouTell = 0x10, - - NpcSays = 0x20, - NpcTellsYou = 0x40, - - All = 0xFF, - } - - /// - /// Returns true if the text was said by a person, envoy, npc, monster, etc.. - /// - /// - /// - /// - public static bool IsChat(string text, ChatFlags chatFlags = ChatFlags.All) - { - if ((chatFlags & ChatFlags.PlayerSaysLocal) == ChatFlags.PlayerSaysLocal && PlayerSaysLocal.IsMatch(text)) - return true; - - if ((chatFlags & ChatFlags.PlayerSaysChannel) == ChatFlags.PlayerSaysChannel && PlayerSaysChannel.IsMatch(text)) - return true; - - if ((chatFlags & ChatFlags.YouSay) == ChatFlags.YouSay && YouSay.IsMatch(text)) - return true; - - - if ((chatFlags & ChatFlags.PlayerTellsYou) == ChatFlags.PlayerTellsYou && PlayerTellsYou.IsMatch(text)) - return true; - - if ((chatFlags & ChatFlags.YouTell) == ChatFlags.YouTell && YouTell.IsMatch(text)) - return true; - - - if ((chatFlags & ChatFlags.NpcSays) == ChatFlags.NpcSays && NpcSays.IsMatch(text)) - return true; - - if ((chatFlags & ChatFlags.NpcTellsYou) == ChatFlags.NpcTellsYou && NpcTellsYou.IsMatch(text)) - return true; - - return false; - } - - /// - /// This will return the name of the person/monster/npc of a chat message or tell. - /// - /// - /// - public static string GetSourceOfChat(string text) - { - bool isSays = IsChat(text, ChatFlags.NpcSays | ChatFlags.PlayerSaysChannel | ChatFlags.PlayerSaysLocal); - bool isTell = IsChat(text, ChatFlags.NpcTellsYou | ChatFlags.PlayerTellsYou); - - if (isSays && isTell) - { - int indexOfSays = text.IndexOf(" says, \"", StringComparison.Ordinal); - int indexOfTell = text.IndexOf(" tells you", StringComparison.Ordinal); - - if (indexOfSays <= indexOfTell) - isTell = false; - else - isSays = false; - } - - string source = string.Empty; - - if (isSays) - source = text.Substring(0, text.IndexOf(" says, \"", StringComparison.Ordinal)); - else if (isTell) - source = text.Substring(0, text.IndexOf(" tells you", StringComparison.Ordinal)); - else - return source; - - source = source.Trim(); - - if (source.Contains(">") && source.Contains("<")) - { - source = source.Remove(0, source.IndexOf('>') + 1); - if (source.Contains("<")) - source = source.Substring(0, source.IndexOf('<')); - } - - return source; - } - - [Flags] - public enum ChatChannels : ushort - { - None = 0x0000, - - Area = 0x0001, - Tells = 0x0002, - - Fellowship = 0x0004, - Allegiance = 0x0008, - General = 0x0010, - Trade = 0x0020, - LFG = 0x0040, - Roleplay = 0x0080, - Society = 0x0100, - - All = 0xFFFF, - } - - public static ChatChannels GetChatChannel(string text) - { - if (IsChat(text, ChatFlags.PlayerSaysLocal | ChatFlags.YouSay | ChatFlags.NpcSays)) - return ChatChannels.Area; - - if (IsChat(text, ChatFlags.PlayerTellsYou | ChatFlags.YouTell | ChatFlags.NpcTellsYou)) - return ChatChannels.Tells; - - if (IsChat(text, ChatFlags.PlayerSaysChannel)) - { - Match match = PlayerSaysChannel.Match(text); - - if (match.Success) - { - string channel = match.Groups["channel"].Value; - - if (channel == "Fellowship") return ChatChannels.Fellowship; - if (channel == "Allegiance") return ChatChannels.Allegiance; - if (channel == "General") return ChatChannels.General; - if (channel == "Trade") return ChatChannels.Trade; - if (channel == "LFG") return ChatChannels.LFG; - if (channel == "Roleplay") return ChatChannels.Roleplay; - if (channel == "Society") return ChatChannels.Society; - } - } - - return ChatChannels.None; - } - - /// - /// Converts a message of: - /// [Allegiance] <Tell:IIDString:0:PlayerName>PlayerName<\Tell> says, "kk" - /// to: - /// [Allegiance] PlayerName says, "kk" - /// - /// - /// - public static string CleanMessage(string text) - { - string output = text; - - int ltIndex = output.IndexOf('<'); - int gtIndex = output.IndexOf('>'); - int cIndex = output.IndexOf(','); - - if (ltIndex != -1 && ltIndex < gtIndex && gtIndex < cIndex) - output = output.Substring(0, ltIndex) + output.Substring(gtIndex + 1, output.Length - gtIndex - 1); - - ltIndex = output.IndexOf('<'); - gtIndex = output.IndexOf('>'); - cIndex = output.IndexOf(','); - - if (ltIndex != -1 && ltIndex < gtIndex && gtIndex < cIndex) - output = output.Substring(0, ltIndex) + output.Substring(gtIndex + 1, output.Length - gtIndex - 1); - - return output; - } - - // You say, "Zojak ...." - private static readonly Regex YouSaySpellCast = new Regex("^You say, \"(Zojak|Malar|Puish|Cruath|Volae|Quavosh|Shurov|Boquar|Helkas|Equin|Roiga|Malar|Jevak|Tugak|Slavu|Drostu|Traku|Yanoi|Drosta|Feazh) .*\"$"); - // Player says, "Zojak ...." - private static readonly Regex PlayerSaysSpellCast = new Regex("^[\\w\\s'-]+)>[\\w\\s'-]+<\\\\Tell> says, \"(Zojak|Malar|Puish|Cruath|Volae|Quavosh|Shurov|Boquar|Helkas|Equin|Roiga|Malar|Jevak|Tugak|Slavu|Drostu|Traku|Yanoi|Drosta|Feazh) .*\"$"); - - /// - /// Returns true for messages that are like: - /// You say, "Zojak.... - /// or - /// Somebody says, "Zojak... - /// - /// - /// - /// - /// - public static bool IsSpellCastingMessage(string text, bool isMine = true, bool isPlayer = true) - { - if (isMine && YouSaySpellCast.IsMatch(text)) - return true; - - if (isPlayer && PlayerSaysSpellCast.IsMatch(text)) - return true; - - return false; - } - - public static void ExportSpells(string targetFileName) - { - using (StreamWriter writer = new StreamWriter(targetFileName, true)) - { - writer.WriteLine("Id,Name,Description,Difficulty,Duration,Family,Flags,Generation,IconId,IsDebuff,IsFastWindup,IsFellowship,IsIrresistible,IsOffensive,IsUntargetted,Mana,School,SortKey,Speed,TargetEffect,TargetMask,Type,Unknown1,Unknown2,Unknown3,Unknown4,Unknown5,Unknown6,Unknown7,Unknown8,Unknown9,Unknown10"); - - FileService service = CoreManager.Current.Filter(); - - for (int i = 0 ; i < service.SpellTable.Length ; i++) - { - Spell spell = service.SpellTable[i]; - - string flags = ""; - flags += ((spell.Flags & 0x80000) == 0x80000) ? "1" : "0"; - flags += ((spell.Flags & 0x40000) == 0x40000) ? "1" : "0"; - flags += ((spell.Flags & 0x20000) == 0x20000) ? "1" : "0"; - flags += ((spell.Flags & 0x10000) == 0x10000) ? "1" : "0"; - flags += ((spell.Flags & 0x8000) == 0x8000) ? "1" : "0"; - flags += ((spell.Flags & 0x4000) == 0x4000) ? "1" : "0"; - flags += ((spell.Flags & 0x2000) == 0x2000) ? "1" : "0"; - flags += ((spell.Flags & 0x1000) == 0x1000) ? "1" : "0"; - flags += ((spell.Flags & 0x800) == 0x800) ? "1" : "0"; - flags += ((spell.Flags & 0x400) == 0x400) ? "1" : "0"; - flags += ((spell.Flags & 0x200) == 0x200) ? "1" : "0"; - flags += ((spell.Flags & 0x100) == 0x100) ? "1" : "0"; - flags += ((spell.Flags & 0x80) == 0x80) ? "1" : "0"; - flags += ((spell.Flags & 0x40) == 0x40) ? "1" : "0"; - flags += ((spell.Flags & 0x20) == 0x20) ? "1" : "0"; - flags += ((spell.Flags & 0x10) == 0x10) ? "1" : "0"; - flags += ((spell.Flags & 0x8) == 0x8) ? "1" : "0"; - flags += ((spell.Flags & 0x4) == 0x4) ? "1" : "0"; - flags += ((spell.Flags & 0x2) == 0x2) ? "1" : "0"; - flags += ((spell.Flags & 0x1) == 0x1) ? "1" : "0"; - - writer.WriteLine(spell.Id + "," + spell.Name.Replace(",", ".") + "," + spell.Description.Replace(",", ".") + "," + spell.Difficulty + "," + spell.Duration + "," + spell.Family + "," + flags + "," + spell.Generation + "," + spell.IconId + "," + spell.IsDebuff + "," + spell.IsFastWindup + "," + spell.IsFellowship + "," + spell.IsIrresistible + "," + spell.IsOffensive + "," + spell.IsUntargetted + "," + spell.Mana + "," + spell.School + "," + spell.SortKey + "," + spell.Speed + "," + spell.TargetEffect + "," + spell.TargetMask + "," + spell.Type + "," + spell.Unknown1 + "," + spell.Unknown2 + "," + spell.Unknown3 + "," + spell.Unknown4 + "," + spell.Unknown5 + "," + spell.Unknown6 + "," + spell.Unknown7 + "," + spell.Unknown8 + "," + spell.Unknown9 + "," + spell.Unknown10); - } - - writer.Close(); - } - } - - public static string NumberFormatter(long number, string format, int largestViewableNumber, string reducedFormat = "#,##0") - { - if (number <= largestViewableNumber) - return number.ToString(format); - - int spaces = largestViewableNumber.ToString(format).Length; - - if (((float)number / 1000).ToString(reducedFormat).Length <= spaces) - return ((float)number / 1000).ToString(reducedFormat) + "k"; // thousand - - if (((float)number / 1000000).ToString(reducedFormat).Length <= spaces) - return ((float)number / 1000000).ToString(reducedFormat) + "M"; // million - - return ((float)number / 1000000000).ToString(reducedFormat) + "G"; // billion - } - } -} diff --git a/Shared/VCS_Connector.cs b/Shared/VCS_Connector.cs deleted file mode 100644 index 68f724d..0000000 --- a/Shared/VCS_Connector.cs +++ /dev/null @@ -1,266 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -//File: VCS_Connector.cs -// -//Description: Connector class for Virindi Chat System 5. -// -//References required: -// VCS5 -// -//This file is Copyright (c) 2013 VirindiPlugins -// -//Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -//The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -/////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Text; -using Decal.Adapter; -using Decal.Adapter.Wrappers; -using System.Reflection; - -namespace MyClasses -{ - static class VCS_Connector - { - public enum eVVSConsoleColorClass - { - SystemMessage = 0, - Magic = 1, - MyMeleeAttack = 2, - OtherMeleeAttack = 3, - MyTell = 4, - OtherTell = 5, - GlobalChat = 6, - AllegianceChat = 7, - FellowChat = 8, - OpenChat = 9, - OpenEmote = 10, - StatusError = 11, - StatRaised = 12, - RareFound = 13, - - PluginMessage = 96, - PluginError = 97, - Link = 98, - Unknown = 99, - } - - public static string ThisPluginName = "???"; - public static PluginHost Host = null; - - /// - /// A shortcut method to initialize plugin name and the PluginHost object. - /// - /// PluginCore.Host - /// The friendly name of this plugin. Used in the presets list. - public static void Initialize(PluginHost myhost, string mypluginname) - { - Host = myhost; - ThisPluginName = mypluginname; - } - - #region SendChatText - - /// - /// Sends text as regular chat. Deprecated. - /// - /// PluginCore.Host - /// The chat message. - /// The default AC console color ID. - /// The default target window, 0=auto, 1=main, 2=float1 - /// The VVS console control filter type. - [Obsolete] - public static void SendChatText(PluginHost host, string text, int color, int window, eVVSConsoleColorClass vvsfilteras) - { - if (IsVCSPresent(host)) - { - //Send using VCS - Curtain_SendChatTextVCS(text, color, window); - } - else - { - //Send the old way - host.Actions.AddChatTextRaw(text, color, window); - } - - - if (IsVirindiViewsPresent(host)) - Curtain_SendChatTextVViews(text, color, (int)vvsfilteras); - } - - static void Curtain_SendChatTextVCS(string text, int color, int window) - { - VCS5.PluginCore.Instance.FilterOutputText(text, window, color); - } - - static void Curtain_SendChatTextVViews(string text, int color, int vvsfilteras) - { - VirindiViewService.Controls.HudChatbox.SendChatText(text, (VirindiViewService.Controls.HudConsole.eACTextColor)color, (VirindiViewService.eConsoleColorClass)vvsfilteras); - } - - #endregion SendChatText - - #region Sending Categorized Text - - /// - /// Send a filtered chat message by VCS preset. Call Initialize() first, then call InitializeCategory() to - /// create the preset, then finally call this to output text. - /// - /// The preset name. Should already be initialized by InitializeCategory(). - /// The output chat text. - /// The default AC console color ID. - /// The default target windows, 0=auto, 1=main, 2=float1 - public static void SendChatTextCategorized(string categoryname, string text, int color, params int[] windows) - { - if ((windows == null) || (windows.Length == 0)) windows = new int[] { 1 }; - - if (IsVCSPresent(Host)) - { - Curtain_SendChatTextCategorized(categoryname, text, color, windows); - } - else - { - foreach (int x in windows) - { - if (Host != null) - Host.Actions.AddChatText(text, color, x); - else - CoreManager.Current.Actions.AddChatText(text, color, x); - } - } - - if (IsVirindiViewsPresent(Host)) - Curtain_SendChatTextVViews(text, color, (int)eVVSConsoleColorClass.PluginMessage); - } - - static void Curtain_SendChatTextCategorized(string categoryname, string text, int color, params int[] windows) - { - VCS5.Presets.FilterOutputPreset(ThisPluginName, categoryname, text, color, windows); - } - - /// - /// Creates a VCS preset type which can later be used for chat. Will appear in the VCS presets list. Call Initialize() first. - /// - /// The preset name. - /// The preset description. - public static void InitializeCategory(string categoryname, string description) - { - if (IsVCSPresent(Host)) - Curtain_InitializeCategory(categoryname, description); - } - - static void Curtain_InitializeCategory(string categoryname, string description) - { - VCS5.Presets.RegisterPreset(ThisPluginName, categoryname, description); - } - - #endregion Sending Categorized Text - - #region VCS and VVS online checks - - static bool seenvcsassembly = false; - - public static bool IsVCSPresent(PluginHost pHost) - { - try - { - //See if VCS assembly is loaded - if (!seenvcsassembly) - { - System.Reflection.Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); - foreach (System.Reflection.Assembly a in asms) - { - AssemblyName nmm = a.GetName(); - if ((nmm.Name == "VCS5") && (nmm.Version >= new System.Version("5.0.0.5"))) - { - seenvcsassembly = true; - break; - } - } - } - - if (seenvcsassembly) - if (Curtain_VCSInstanceEnabled()) - return true; - } - catch - { - - } - - return false; - } - - static bool Curtain_VCSInstanceEnabled() - { - return VCS5.PluginCore.Running; - } - - static bool has_cachedvvsresult = false; - static bool cachedvvsresult = false; - - //Doh - //Need to know about VVS to post to VVS "console" controls. - //Since VVS is a service and can't be turned on and off at runtime, we only need to do this once. - public static bool IsVirindiViewsPresent(PluginHost pHost) - { - try - { - if (has_cachedvvsresult) return cachedvvsresult; - - //See if VCS assembly is loaded - System.Reflection.Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); - bool l = false; - foreach (System.Reflection.Assembly a in asms) - { - AssemblyName nmm = a.GetName(); - if ((nmm.Name == "VirindiViewService") && (nmm.Version >= new System.Version("1.0.0.14"))) - { - l = true; - break; - } - } - - if (l) - if (Curtain_VirindiViewsInstanceEnabled()) - { - has_cachedvvsresult = true; - cachedvvsresult = true; - return true; - } - } - catch - { - - } - - has_cachedvvsresult = true; - cachedvvsresult = false; - return false; - } - - static bool Curtain_VirindiViewsInstanceEnabled() - { - return VirindiViewService.Service.Running; - } - - #endregion VCS and VVS online checks - - } -} \ No newline at end of file diff --git a/Unused/CustomCollections/HashedList.cs b/Unused/CustomCollections/HashedList.cs deleted file mode 100644 index b65b0f5..0000000 --- a/Unused/CustomCollections/HashedList.cs +++ /dev/null @@ -1,353 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace CustomCollections; - -/// -/// A doubly-linked list with a Dictionary index. Duplicate items are not allowed. -/// -Add is O(1) -/// -Contains is O(1) -/// -Remove is O(1) -/// -Get/set by index is O(n) -/// -Insert is O(n) -/// -RemoveAt is O(n) -/// Additionally, a cached pointer (with associated index) is kept pointing to the last used index item. -/// When looking up an item by index, the list is walked from the head, tail, or cached index pointer. -/// Thus, doing multiple operations in index order is O(1) even without an enumerator. -/// -/// -internal class HashedList : IList, ICollection, IEnumerable, IEnumerable -{ - private class ListNode - { - public ListNode Previous; - - public ListNode Next; - - public T Value; - - public ListNode(T v, ListNode prev, ListNode nxt) - { - Previous = prev; - Next = nxt; - Value = v; - } - } - - private ListNode Head; - - private ListNode Tail; - - private Dictionary HashIndex = new Dictionary(); - - private int ChangeMarker; - - private bool IndexCacheValid; - - private int IndexCache_Index; - - private ListNode IndexCache_Value; - - public T this[int index] - { - get - { - if (index >= HashIndex.Count || index < 0) - { - throw new ArgumentOutOfRangeException(); - } - return RunToIndex(index).Value; - } - set - { - if (index >= HashIndex.Count || index < 0) - { - throw new ArgumentOutOfRangeException(); - } - if (HashIndex.ContainsKey(value)) - { - throw new ArgumentException("Duplicate value"); - } - ListNode listNode = RunToIndex(index); - HashIndex.Remove(listNode.Value); - listNode.Value = value; - HashIndex.Add(value, listNode); - ChangeMarker++; - } - } - - public int Count => HashIndex.Count; - - public bool IsReadOnly => false; - - public HashedList() - { - } - - public HashedList(T[] arr) - { - foreach (T item in arr) - { - Add(item); - } - } - - /// - /// This method gets the node corresponding to a particular index. To get there, - /// the list is traversed from the head, tail, or cached index pointer (if valid). - /// - /// - /// - private ListNode RunToIndex(int ind) - { - int num = HashIndex.Count / 2; - if (IndexCacheValid) - { - if (ind > IndexCache_Index) - { - if (ind - IndexCache_Index < num) - { - ListNode listNode = IndexCache_Value; - for (int i = IndexCache_Index; i < ind; i++) - { - listNode = listNode.Next; - } - IndexCache_Index = ind; - IndexCache_Value = listNode; - IndexCacheValid = true; - return listNode; - } - } - else if (IndexCache_Index - ind < num) - { - ListNode listNode2 = IndexCache_Value; - for (int num2 = IndexCache_Index; num2 > ind; num2--) - { - listNode2 = listNode2.Previous; - } - IndexCache_Index = ind; - IndexCache_Value = listNode2; - IndexCacheValid = true; - return listNode2; - } - } - if (ind < num) - { - ListNode listNode3 = Head; - for (int j = 0; j < ind; j++) - { - listNode3 = listNode3.Next; - } - if (listNode3 == null) - { - throw new Exception(); - } - IndexCache_Index = ind; - IndexCache_Value = listNode3; - IndexCacheValid = true; - return listNode3; - } - ListNode listNode4 = Tail; - for (int num3 = HashIndex.Count - 1; num3 > ind; num3--) - { - listNode4 = listNode4.Previous; - } - if (listNode4 == null) - { - throw new Exception(); - } - IndexCache_Index = ind; - IndexCache_Value = listNode4; - IndexCacheValid = true; - return listNode4; - } - - private void RemoveNode(ListNode n) - { - if (n.Previous == null) - { - Head = n.Next; - } - else - { - n.Previous.Next = n.Next; - } - if (n.Next == null) - { - Tail = n.Previous; - } - else - { - n.Next.Previous = n.Previous; - } - HashIndex.Remove(n.Value); - } - - public ReadOnlyCollection AsReadOnly() - { - return new ReadOnlyCollection(this); - } - - public bool GetIfContains(T matchval, ref T outval) - { - if (HashIndex.ContainsKey(matchval)) - { - outval = HashIndex[matchval].Value; - return true; - } - return false; - } - - public int IndexOf(T item) - { - if (HashIndex.ContainsKey(item)) - { - ListNode listNode = HashIndex[item]; - ListNode listNode2 = Head; - for (int i = 0; i < HashIndex.Count; i++) - { - if (listNode2 == listNode) - { - return i; - } - listNode2 = listNode2.Next; - } - return -1; - } - return -1; - } - - public void Insert(int index, T item) - { - if (index > HashIndex.Count || index < 0) - { - throw new ArgumentOutOfRangeException(); - } - if (HashIndex.ContainsKey(item)) - { - throw new ArgumentException("Duplicate value"); - } - ListNode listNode; - if (index == HashIndex.Count) - { - Add(item); - listNode = HashIndex[item]; - } - else if (index == 0) - { - listNode = new ListNode(item, null, Head); - Head.Previous = listNode; - Head = listNode; - HashIndex.Add(item, listNode); - } - else - { - ListNode listNode2 = RunToIndex(index - 1); - listNode = (listNode2.Next = new ListNode(item, listNode2, listNode2.Next)); - listNode.Next.Previous = listNode; - HashIndex.Add(item, listNode); - } - ChangeMarker++; - IndexCache_Index = index; - IndexCache_Value = listNode; - IndexCacheValid = true; - } - - public void RemoveAt(int index) - { - if (index >= HashIndex.Count || index < 0) - { - throw new ArgumentOutOfRangeException(); - } - ListNode n = RunToIndex(index); - RemoveNode(n); - ChangeMarker++; - IndexCacheValid = false; - } - - public void Add(T item) - { - ListNode listNode; - if (HashIndex.Count == 0) - { - listNode = (Tail = (Head = new ListNode(item, null, null))); - } - else - { - if (HashIndex.ContainsKey(item)) - { - throw new ArgumentException("Duplicate value"); - } - listNode = new ListNode(item, Tail, null); - Tail.Next = listNode; - Tail = listNode; - } - HashIndex.Add(item, listNode); - ChangeMarker++; - IndexCacheValid = false; - } - - public void Clear() - { - Head = null; - Tail = null; - HashIndex.Clear(); - ChangeMarker++; - IndexCacheValid = false; - } - - public bool Contains(T item) - { - return HashIndex.ContainsKey(item); - } - - public bool Remove(T item) - { - if (!HashIndex.ContainsKey(item)) - { - return false; - } - RemoveNode(HashIndex[item]); - ChangeMarker++; - IndexCacheValid = false; - return true; - } - - public void CopyTo(T[] array, int arrayIndex) - { - int num = arrayIndex + HashIndex.Count; - IEnumerator enumerator = GetEnumerator(); - for (int i = arrayIndex; i < num; i++) - { - enumerator.MoveNext(); - array[i] = enumerator.Current; - } - } - - public T[] ToArray() - { - T[] array = new T[HashIndex.Count]; - CopyTo(array, 0); - return array; - } - - public IEnumerator GetEnumerator() - { - int startchangemarker = ChangeMarker; - for (ListNode cur = Head; cur != null; cur = cur.Next) - { - yield return cur.Value; - if (ChangeMarker != startchangemarker) - { - throw new Exception("Collection modified during enumeration"); - } - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } -} diff --git a/Unused/Decal.Adapter.IDQueue/FairIDQueue.cs b/Unused/Decal.Adapter.IDQueue/FairIDQueue.cs deleted file mode 100644 index 787ea0b..0000000 --- a/Unused/Decal.Adapter.IDQueue/FairIDQueue.cs +++ /dev/null @@ -1,231 +0,0 @@ -using System; -using System.ComponentModel; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using Decal.Adapter.Support; -using Decal.Adapter.Wrappers; -using Decal.Interop.Core; - -namespace Decal.Adapter.IDQueue; - -/// -/// An IDQueue that is fair with respect to plugins and round-robin with respect to ID requests. -/// -[ComVisible(true)] -[ClassInterface(ClassInterfaceType.None)] -[ComDefaultInterface(typeof(IIdentifyFilter))] -[ProgId("DecalAdapter.FairIDQueue")] -[Guid("5CD85A12-3DED-48E7-B440-B41E2A1452D9")] -[CLSCompliant(true)] -public class FairIDQueue : FairRoundRobinScheduleQueue, IIdentifyFilter -{ - private static int iVal = 1126270821; - - private const int REQUEST_INTERVAL = 600; - - private const int MAX_TRY_COUNT = 3; - - private const int NULL_ACTION_ID = -1; - - private Timer FireTimer = new Timer(); - - private DateTime LastFireTime = DateTime.MinValue; - - private uint CurrentTimerFrame; - - private uint LastTimerFireFrame; - - private int UserRequestedID = -1; - - private int UserRequestedAttempts; - - private EventHandler mUserIDRequestProcessed; - - [CLSCompliant(false)] - public event EventHandler UserIDRequestProcessed - { - add - { - mUserIDRequestProcessed = (EventHandler)Delegate.Combine(mUserIDRequestProcessed, value); - } - remove - { - mUserIDRequestProcessed = (EventHandler)Delegate.Remove(mUserIDRequestProcessed, value); - } - } - - internal FairIDQueue() - : base(3, -1) - { - FireTimer.Interval = 600; - FireTimer.Tick += FireTimer_Tick; - CoreManager.Current.Actions.Underlying.SetIDFilter(this); - CoreManager.Current.MessageProcessed += Current_MessageProcessed; - CoreManager.Current.RenderFrame += Current_RenderFrame; - } - - private void Current_RenderFrame(object sender, EventArgs e) - { - CurrentTimerFrame++; - } - - private void Current_MessageProcessed(object sender, MessageProcessedEventArgs e) - { - if (e.Message.Type == 63408 && e.Message.Value("event") == 201) - { - int num = e.Message.Value("object"); - DeleteAction(num); - if (UserRequestedID == num) - { - UserRequestedID = -1; - Util.SafeFireEvent(this, mUserIDRequestProcessed, new UserIDRequestProcessedEventArgs(num)); - } - } - } - - internal void Start() - { - LastFireTime = DateTime.MinValue; - FireTimer.Enabled = true; - } - - internal void Stop() - { - FireTimer.Enabled = false; - ClearAll(); - UserRequestedID = -1; - } - - private void FireTimer_Tick(object sender, EventArgs e) - { - if (FireTimer.Interval != 600) - { - FireTimer.Enabled = false; - FireTimer.Interval = 600; - FireTimer.Enabled = true; - } - if (CurrentTimerFrame != LastTimerFireFrame) - { - LastTimerFireFrame = CurrentTimerFrame; - FireNow(); - } - } - - private void FireNow() - { - Assembly requester = null; - int num = -1; - if (UserRequestedID != -1) - { - num = UserRequestedID; - UserRequestedAttempts++; - if (UserRequestedAttempts > 3) - { - UserRequestedID = -1; - } - } - if (num == -1) - { - num = GetNextAction(ref requester); - } - if (num != -1) - { - LastFireTime = DateTime.Now; - int num2 = num ^ iVal; - CoreManager.Current.Actions.Underlying.CallerRefInstanceInternal = num2; - iVal = (num2 << 5) ^ (num2 >> 13) ^ iVal; - } - } - - protected override bool IsActionValidNow(int action) - { - WorldObject worldObject = CoreManager.Current.WorldFilter[action]; - if (worldObject == null) - { - return true; - } - if (worldObject.Container == 0) - { - WorldObject worldObject2 = CoreManager.Current.WorldFilter[CoreManager.Current.CharacterFilter.Id]; - if (worldObject2 != null && worldObject.Coordinates().DistanceToCoords(worldObject2.Coordinates()) > 0.375) - { - return false; - } - } - return true; - } - - protected override bool IsActionPermanentlyInvalid(int action) - { - return !CoreManager.Current.Actions.IsValidObject(action); - } - - /// - /// Adds a request to the queue. - /// - /// The game object ID to identify. - public void AddToQueue(int lObjectID) - { - AddToQueue(lObjectID, DateTime.MaxValue); - } - - /// - /// Adds a request to the queue with a timeout time. - /// Note: if something else requests this ID while this request is still pending, - /// the later of the two timeouts will prevail. - /// - /// The game object ID to identify. - /// - public void AddToQueue(int lObjectID, DateTime pTimeout) - { - Assembly assembly = Assembly.GetCallingAssembly(); - if (assembly == null) - { - assembly = Assembly.GetExecutingAssembly(); - } - AddToQueueForCaller(lObjectID, assembly, pTimeout); - } - - internal void AddToQueueForCaller(int lObjectID, Assembly pCaller, DateTime pTimeout) - { - try - { - if (FireTimer.Enabled && lObjectID != -1) - { - Enqueue(pCaller, lObjectID, DateTime.MaxValue); - if ((DateTime.Now - LastFireTime).TotalMilliseconds > 700.0) - { - FireTimer.Enabled = false; - FireTimer.Interval = 1; - FireTimer.Enabled = true; - } - } - } - catch (Exception ex) - { - Util.WriteLine("Queue exception in addtoqueue: " + ex.ToString()); - } - } - - /// - /// Send an ID request which bypasses the queue. - /// This is used when the user manually requests an ID. Only one object - /// at a time can be pending here. - /// - /// The game object ID to identify. - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public void ShortcircuitID(int lObjectID) - { - if (FireTimer.Enabled && lObjectID != -1) - { - UserRequestedID = lObjectID; - UserRequestedAttempts = 0; - if ((DateTime.Now - LastFireTime).TotalMilliseconds > 700.0) - { - LastFireTime = DateTime.Now; - } - } - } -} diff --git a/Unused/Decal.Adapter.IDQueue/FairRoundRobinScheduleQueue.cs b/Unused/Decal.Adapter.IDQueue/FairRoundRobinScheduleQueue.cs deleted file mode 100644 index 26e2139..0000000 --- a/Unused/Decal.Adapter.IDQueue/FairRoundRobinScheduleQueue.cs +++ /dev/null @@ -1,298 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Runtime.InteropServices; -using CustomCollections; - -namespace Decal.Adapter.IDQueue; - -/// -/// A scheduler: callers request actions. Multiple callers can request the same action. -/// -Each caller gets one action, then the other callers get a turn. -/// -If a new caller arrives, it is given priority in the turns list. -/// -Everytime a caller gets a turn, it selects its next available action in round-robin fashion. -/// -If all of a caller's actions are unavailable when it is that caller's turn, its turn is lost and it must wait in line again. -/// -If no caller can take a turn, the null action is returned. -/// Thus if multiple callers request the same action, it will be tried more often -/// since the attempt will occur during the turns of multiple callers. -/// -/// -/// -[CLSCompliant(true)] -[ClassInterface(ClassInterfaceType.None)] -public abstract class FairRoundRobinScheduleQueue -{ - public class ActionRemovedEventArgs : EventArgs - { - private ACTIONTYPE mAction; - - public ACTIONTYPE Action => mAction; - - internal ActionRemovedEventArgs(ACTIONTYPE pAction) - { - mAction = pAction; - } - } - - private class ActionInfo : IEquatable - { - public ACTIONTYPE Action; - - public DateTime Expires; - - public int TryCount; - - public ActionInfo(ACTIONTYPE pAction, DateTime pExpires) - { - Action = pAction; - Expires = pExpires; - } - - public bool IsExpired() - { - return Expires < DateTime.Now; - } - - public bool Equals(ActionInfo other) - { - ref ACTIONTYPE action = ref Action; - object obj = other.Action; - return action.Equals(obj); - } - - public override bool Equals(object obj) - { - return Equals(obj as ActionInfo); - } - - public override int GetHashCode() - { - return Action.GetHashCode(); - } - } - - private HashedList Callers = new HashedList(); - - private Dictionary ActInfos = new Dictionary(); - - private Dictionary> CallerActions = new Dictionary>(); - - private Dictionary> ActionCallers = new Dictionary>(); - - private int MaximumTryCount; - - private ACTIONTYPE NullAction; - - public int CallerCount => Callers.Count; - - public int ActionCount => ActInfos.Count; - - public event EventHandler OnActionRemoved; - - /// - /// - /// - /// The most times an action can be attempted before it fails. - /// An ACTIONTYPE to return when no action is available. - protected FairRoundRobinScheduleQueue(int pMaximumTryCount, ACTIONTYPE pNullAction) - { - MaximumTryCount = pMaximumTryCount; - NullAction = pNullAction; - } - - protected abstract bool IsActionValidNow(ACTIONTYPE action); - - protected abstract bool IsActionPermanentlyInvalid(ACTIONTYPE action); - - private void RotateQueue(HashedList q) - { - if (q.Count > 0) - { - T item = q[0]; - q.RemoveAt(0); - q.Add(item); - } - } - - public void ClearAll() - { - Callers.Clear(); - ActInfos.Clear(); - CallerActions.Clear(); - ActionCallers.Clear(); - } - - public void DeleteAction(ACTIONTYPE action) - { - if (!ActionCallers.ContainsKey(action) || !ActInfos.ContainsKey(action)) - { - return; - } - ActionInfo item = ActInfos[action]; - ActInfos.Remove(action); - HashedList hashedList = ActionCallers[action]; - ActionCallers.Remove(action); - foreach (CALLERTYPE item2 in hashedList) - { - CallerActions[item2].Remove(item); - if (CallerActions[item2].Count == 0) - { - CallerActions.Remove(item2); - Callers.Remove(item2); - } - } - if (this.OnActionRemoved != null) - { - this.OnActionRemoved(this, new ActionRemovedEventArgs(action)); - } - } - - public void DeleteCaller(CALLERTYPE caller) - { - Callers.Remove(caller); - if (!CallerActions.ContainsKey(caller)) - { - return; - } - HashedList hashedList = CallerActions[caller]; - CallerActions.Remove(caller); - HashedList hashedList2 = new HashedList(); - foreach (ActionInfo item in hashedList) - { - if (ActionCallers.ContainsKey(item.Action)) - { - ActionCallers[item.Action].Remove(caller); - if (ActionCallers[item.Action].Count == 0) - { - ActionCallers.Remove(item.Action); - ActInfos.Remove(item.Action); - hashedList2.Add(item); - } - } - } - if (this.OnActionRemoved == null) - { - return; - } - foreach (ActionInfo item2 in hashedList2) - { - this.OnActionRemoved(this, new ActionRemovedEventArgs(item2.Action)); - } - } - - public ReadOnlyCollection GetActionsForCaller(CALLERTYPE caller) - { - List list = new List(); - if (CallerActions.ContainsKey(caller)) - { - foreach (ActionInfo item in CallerActions[caller]) - { - list.Add(item.Action); - } - } - return list.AsReadOnly(); - } - - public ReadOnlyCollection GetCallersForAction(ACTIONTYPE action) - { - if (ActionCallers.ContainsKey(action)) - { - return ActionCallers[action].AsReadOnly(); - } - return new List().AsReadOnly(); - } - - public void Enqueue(CALLERTYPE caller, ACTIONTYPE action, DateTime expiration) - { - ActionInfo actionInfo; - if (ActInfos.ContainsKey(action)) - { - actionInfo = ActInfos[action]; - if (actionInfo.Expires < expiration) - { - actionInfo.Expires = expiration; - } - actionInfo.TryCount = 0; - } - else - { - actionInfo = new ActionInfo(action, expiration); - ActInfos[action] = actionInfo; - } - if (!CallerActions.ContainsKey(caller) || !CallerActions[caller].Contains(actionInfo)) - { - if (!Callers.Contains(caller)) - { - Callers.Insert(0, caller); - } - if (!CallerActions.ContainsKey(caller)) - { - CallerActions.Add(caller, new HashedList()); - } - CallerActions[caller].Add(actionInfo); - if (!ActionCallers.ContainsKey(action)) - { - ActionCallers.Add(action, new HashedList()); - } - ActionCallers[action].Add(caller); - } - } - - public ACTIONTYPE GetNextAction(ref CALLERTYPE requester) - { - HashedList hashedList = new HashedList(); - ACTIONTYPE result = NullAction; - for (int i = 0; i < Callers.Count; i++) - { - CALLERTYPE val = Callers[0]; - HashedList hashedList2 = CallerActions[val]; - bool flag = false; - for (int j = 0; j < hashedList2.Count; j++) - { - ActionInfo actionInfo = hashedList2[0]; - if (hashedList.Contains(actionInfo)) - { - RotateQueue(hashedList2); - continue; - } - if (actionInfo.IsExpired()) - { - hashedList.Add(actionInfo); - RotateQueue(hashedList2); - continue; - } - if (IsActionPermanentlyInvalid(actionInfo.Action)) - { - hashedList.Add(actionInfo); - RotateQueue(hashedList2); - continue; - } - if (!IsActionValidNow(actionInfo.Action)) - { - RotateQueue(hashedList2); - continue; - } - flag = true; - result = actionInfo.Action; - requester = val; - RotateQueue(hashedList2); - actionInfo.TryCount++; - if (actionInfo.TryCount > MaximumTryCount) - { - hashedList.Add(actionInfo); - } - break; - } - RotateQueue(Callers); - if (flag) - { - break; - } - } - foreach (ActionInfo item in hashedList) - { - DeleteAction(item.Action); - } - return result; - } -} diff --git a/Unused/Decal.Adapter.IDQueue/UserIDRequestProcessedEventArgs.cs b/Unused/Decal.Adapter.IDQueue/UserIDRequestProcessedEventArgs.cs deleted file mode 100644 index e2796c8..0000000 --- a/Unused/Decal.Adapter.IDQueue/UserIDRequestProcessedEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.IDQueue; - -public class UserIDRequestProcessedEventArgs : EventArgs -{ - private int mObjectId; - - public int ObjectId => mObjectId; - - internal UserIDRequestProcessedEventArgs(int ObjectId) - { - mObjectId = ObjectId; - } -} diff --git a/Unused/Decal.Adapter.Messages/AdapterMessageEventArgs.cs b/Unused/Decal.Adapter.Messages/AdapterMessageEventArgs.cs deleted file mode 100644 index b6383bf..0000000 --- a/Unused/Decal.Adapter.Messages/AdapterMessageEventArgs.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Decal.Adapter.Messages; - -/// -/// The base from which Adapter messages derive -/// -[CLSCompliant(true)] -public class AdapterMessageEventArgs : EventArgs -{ - private EventHandler responder; - - private List handlers; - - private bool canAddHandlers; - - internal bool CanAddHandlers - { - get - { - return canAddHandlers; - } - set - { - canAddHandlers = value; - } - } - - /// - /// Fires for each handler that completes processing of the message - /// - public event EventHandler MessageComplete - { - add - { - responder = (EventHandler)Delegate.Combine(responder, value); - } - remove - { - responder = (EventHandler)Delegate.Remove(responder, value); - } - } - - internal AdapterMessageEventArgs() - { - handlers = new List(); - } - - /// - /// Acknowledges that the object intends to process the message - /// - /// The object that will do the processing - public void AddHandler(object obj) - { - if (!CanAddHandlers) - { - throw new InvalidOperationException("Unable to add handlers at this time"); - } - if (obj != null) - { - handlers.Add(obj); - } - } - - /// - /// Signals completion of message processing - /// - /// The object that handled the message - /// The message response - public void SetComplete(object handler, AdapterMessageResponseEventArgs e) - { - handlers.Remove(handler); - if (handlers.Count == 0) - { - e.Complete = true; - } - if (responder != null) - { - responder(this, e); - } - } -} diff --git a/Unused/Decal.Adapter.Messages/AdapterMessageResponseEventArgs.cs b/Unused/Decal.Adapter.Messages/AdapterMessageResponseEventArgs.cs deleted file mode 100644 index 2c57e74..0000000 --- a/Unused/Decal.Adapter.Messages/AdapterMessageResponseEventArgs.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; - -namespace Decal.Adapter.Messages; - -/// -/// Defines a response to a message request -/// -[CLSCompliant(true)] -public class AdapterMessageResponseEventArgs : EventArgs -{ - private bool success; - - private bool complete; - - /// - /// Whether or not the actions take due to the message succeeded - /// - public bool Succeeded => success; - - /// - /// Whether or not all handlers have completed processing - /// - public bool Complete - { - get - { - return complete; - } - internal set - { - complete = value; - } - } - - /// - /// Create a new AdapterMessageResponse - /// - /// Did these actions succeed? - protected AdapterMessageResponseEventArgs(bool success) - { - this.success = success; - } -} diff --git a/Unused/Decal.Adapter.NetParser/MemberParser.cs b/Unused/Decal.Adapter.NetParser/MemberParser.cs deleted file mode 100644 index a0fa33d..0000000 --- a/Unused/Decal.Adapter.NetParser/MemberParser.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; - -namespace Decal.Adapter.NetParser; - -internal class MemberParser : MarshalByRefObject -{ - public MemberParser Next; - - public MemberParser Child; - - public MemberParserType MemberType; - - public string MemberName; - - public MemberParserCondition Condition; - - public string ConditionField; - - public long ConditionXor; - - public long ConditionAnd; - - public long ConditionResult; - - public string LengthField; - - public long LengthMask; - - public int LengthDelta; - - public int PreAlignment; - - public int PostAlignment; - - public MemberParser() - { - } - - public MemberParser(MemberParser Source) - { - Next = Source.Next; - Child = Source.Child; - MemberType = Source.MemberType; - MemberName = Source.MemberName; - Condition = Source.Condition; - ConditionField = Source.ConditionField; - ConditionXor = Source.ConditionXor; - ConditionAnd = Source.ConditionAnd; - ConditionResult = Source.ConditionResult; - LengthField = Source.LengthField; - LengthMask = Source.LengthMask; - LengthDelta = Source.LengthDelta; - PreAlignment = Source.PreAlignment; - PostAlignment = Source.PostAlignment; - } -} diff --git a/Unused/Decal.Adapter.NetParser/MemberParserCondition.cs b/Unused/Decal.Adapter.NetParser/MemberParserCondition.cs deleted file mode 100644 index 7b8741a..0000000 --- a/Unused/Decal.Adapter.NetParser/MemberParserCondition.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Decal.Adapter.NetParser; - -internal enum MemberParserCondition -{ - None, - EQ, - NE, - GE, - GT, - LE, - LT -} diff --git a/Unused/Decal.Adapter.NetParser/MemberParserType.cs b/Unused/Decal.Adapter.NetParser/MemberParserType.cs deleted file mode 100644 index 50f98ca..0000000 --- a/Unused/Decal.Adapter.NetParser/MemberParserType.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Decal.Adapter.NetParser; - -internal enum MemberParserType -{ - BYTE, - WORD, - PackedWORD, - DWORD, - PackedDWORD, - QWORD, - @float, - @double, - String, - WString, - Struct, - Vector, - Case -} diff --git a/Unused/Decal.Adapter.NetParser/MessageFactory.cs b/Unused/Decal.Adapter.NetParser/MessageFactory.cs deleted file mode 100644 index 03cd08c..0000000 --- a/Unused/Decal.Adapter.NetParser/MessageFactory.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using Decal.Interop.Net; - -namespace Decal.Adapter.NetParser; - -/// -/// Decal Message Factory Implementation -/// -[ComVisible(true)] -[ClassInterface(ClassInterfaceType.None)] -[ComDefaultInterface(typeof(IMessageFactory))] -[ProgId("DecalAdapter.MessageFactory")] -[Guid("59D7815E-6716-4bd7-B264-69B6A9382701")] -public class MessageFactory : IMessageFactory -{ - /// - /// Construct a new MessageFacytory instance - /// - public MessageFactory() - { - } - - /// - /// Creates an IMessage2 instance from the provided raw packet data - /// - /// Pointer to the raw packet bytes - /// Size of pData in bytes - /// Packet direction - /// IMessage2 instance to navigate the packet - IMessage2 IMessageFactory.CreateMessage(int pData, int size, bool outgoing) - { - if (pData != 0 && size != 0) - { - byte[] array = (byte[])Array.CreateInstance(typeof(byte), size); - Marshal.Copy(new IntPtr(pData), array, 0, size); - return new MessageWrapper(new Message(array, Message.GetParser(BitConverter.ToInt32(array, 0), outgoing ? MessageDirection.Outbound : MessageDirection.Inbound))); - } - return null; - } -} diff --git a/Unused/Decal.Adapter.NetParser/MessageMemberWrapper.cs b/Unused/Decal.Adapter.NetParser/MessageMemberWrapper.cs deleted file mode 100644 index 7c4b0da..0000000 --- a/Unused/Decal.Adapter.NetParser/MessageMemberWrapper.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Runtime.InteropServices; -using Decal.Interop.Net; - -namespace Decal.Adapter.NetParser; - -[ComVisible(true)] -[ClassInterface(ClassInterfaceType.None)] -[ComDefaultInterface(typeof(IMessageMember))] -[ProgId("DecalAdapter.MessageMemberWrapper")] -[Guid("BD22CFC5-0950-4ab3-9752-5053EE934BE6")] -public class MessageMemberWrapper : MessageRootImpl, IMessageMember -{ - public int BeginOffset => Data.mOffset; - - public int Count => Data.Count; - - public int EndOffset => Data.mOffset + Data.mLength; - - public MessageMemberWrapper() - { - } - - internal MessageMemberWrapper(MessageStruct msg, MessageWrapper wrapper) - : base(msg, wrapper) - { - } - - public string get_FieldName(int Index) - { - return Data.Name(Index); - } - - public byte[] get_RawValue(object vIndex) - { - return Data.RawValue(Data.ObjectToIndex(vIndex)); - } - - public IMessageMember get_Struct(object vIndex) - { - int num = Data.ObjectToIndex(vIndex); - if (num < 0) - { - throw new COMHResultException((HResults)(-2147352571)); - } - return new MessageMemberWrapper(Data.Struct(num), Wrapped); - } - - public object get_Value(object vIndex) - { - int num = Data.ObjectToIndex(vIndex); - if (num >= 0) - { - return Data.Value(num); - } - throw new COMHResultException((HResults)(-2147352571)); - } -} diff --git a/Unused/Decal.Adapter.NetParser/MessageRootImpl.cs b/Unused/Decal.Adapter.NetParser/MessageRootImpl.cs deleted file mode 100644 index 5034aa9..0000000 --- a/Unused/Decal.Adapter.NetParser/MessageRootImpl.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System.Diagnostics; -using Decal.Interop.Net; - -namespace Decal.Adapter.NetParser; - -/// -/// IMessageIterator base implementation -/// -public class MessageRootImpl : MessageRoot, IMessageIterator -{ - protected MessageWrapper Wrapped; - - protected MessageStruct Data; - - protected int FieldIndex; - - protected const int Error = -1; - - public object Current => Data.Value(FieldIndex); - - public string FieldName => Data.Name(FieldIndex); - - public int Index => FieldIndex; - - public IMessage Message => Wrapped; - - public MessageRoot NextObjectIndex - { - [DebuggerNonUserCode] - get - { - if (FieldIndex < Data.mCount) - { - MessageMemberWrapper result = new MessageMemberWrapper(Data.Struct(FieldIndex), Wrapped); - FieldIndex++; - return result; - } - throw new COMHResultException(HResults.E_FAIL); - } - } - - protected MessageRootImpl() - { - } - - protected MessageRootImpl(MessageStruct data, MessageWrapper wrapper) - : this() - { - Wrapped = wrapper; - Data = data; - if (!Data.mParsed) - { - Data.Parse(); - } - } - - public void Reset() - { - FieldIndex = 0; - } - - [DebuggerNonUserCode] - private T GetNext(string name) - { - FieldIndex = Data.IndexFromName(name); - if (FieldIndex != -1) - { - return Data.Value(FieldIndex); - } - throw new COMHResultException(HResults.E_FAIL); - } - - [DebuggerNonUserCode] - private T GetNext(int index) - { - if (index >= 0 && index < Data.mCount) - { - FieldIndex = index; - return Data.Value(FieldIndex); - } - throw new COMHResultException(HResults.E_FAIL); - } - - [DebuggerNonUserCode] - public object get_Next(object vIndex) - { - return GetNext(Data.ObjectToIndex(vIndex)); - } - - [DebuggerNonUserCode] - public double get_NextFloat(string Name) - { - return GetNext(Name); - } - - [DebuggerNonUserCode] - public int get_NextInt(string Name) - { - return GetNext(Name); - } - - [DebuggerNonUserCode] - public MessageRoot get_NextObject(string Name) - { - FieldIndex = Data.IndexFromName(Name); - if (FieldIndex != -1) - { - return new MessageMemberWrapper(Data.Struct(FieldIndex), Wrapped); - } - throw new COMHResultException(HResults.E_FAIL); - } - - [DebuggerNonUserCode] - public ulong get_NextQWord(string Name) - { - return GetNext(Name); - } - - [DebuggerNonUserCode] - public string get_NextString(string Name) - { - return GetNext(Name); - } -} diff --git a/Unused/Decal.Adapter.NetParser/MessageRootWrapper.cs b/Unused/Decal.Adapter.NetParser/MessageRootWrapper.cs deleted file mode 100644 index 325a935..0000000 --- a/Unused/Decal.Adapter.NetParser/MessageRootWrapper.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Runtime.InteropServices; -using Decal.Interop.Net; - -namespace Decal.Adapter.NetParser; - -[ComVisible(true)] -[ClassInterface(ClassInterfaceType.None)] -[ComDefaultInterface(typeof(MessageRoot))] -[ProgId("DecalAdapter.MessageRootWrapper")] -[Guid("E33FBF17-B6C5-471e-9ED6-A394DEDEBFE5")] -public class MessageRootWrapper : MessageRootImpl -{ - public MessageRootWrapper() - { - } - - internal MessageRootWrapper(MessageWrapper msg) - : base(msg.Wrapped.mStruct, msg) - { - } -} diff --git a/Unused/Decal.Adapter.NetParser/MessageWrapper.cs b/Unused/Decal.Adapter.NetParser/MessageWrapper.cs deleted file mode 100644 index bf50dd2..0000000 --- a/Unused/Decal.Adapter.NetParser/MessageWrapper.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Runtime.InteropServices; -using Decal.Interop.Net; - -namespace Decal.Adapter.NetParser; - -/// -/// IMessage2 Implementation -/// -[ComVisible(true)] -[ClassInterface(ClassInterfaceType.None)] -[ComDefaultInterface(typeof(IMessage2))] -[ProgId("DecalAdapter.MessageWrapper")] -[Guid("76142307-98E3-494d-8320-3C801010221D")] -public class MessageWrapper : IMessage2, IMessage -{ - private Message msg; - - internal Message Wrapped => msg; - - /// - /// Return an IMessageIterator instance for this packet - /// - public MessageRoot Begin => new MessageRootWrapper(this); - - /// - /// Return the number of items within this structure - /// - public int Count => msg.Count; - - /// - /// Return the raw bytes of this structure - /// - public byte[] RawData => msg.RawData; - - /// - /// Return the message type - /// - public int Type => msg.Type; - - /// - /// Public constructor... - /// - public MessageWrapper() - { - } - - /// - /// Internal constructor to wrap the Adapter parser - /// - /// Adapter Message instance - internal MessageWrapper(Message msg) - { - this.msg = msg; - if (!this.msg.mStruct.mParsed) - { - this.msg.mStruct.Parse(); - } - } - - /// - /// Get the field name for the specified index - /// - /// message member index - /// field name - public string get_FieldName(int Index) - { - return msg.Name(Index); - } - - /// - /// Return the raw bytes for the specified member - /// - /// Member index (string or int) - /// Byte array containing the member data - public byte[] get_RawValue(object vElement) - { - return msg.RawValue(msg.mStruct.ObjectToIndex(vElement)); - } - - /// - /// Return the specified member struct - /// - /// Member index (string or int) - /// Member data - public IMessageMember get_Struct(object vElement) - { - int num = msg.mStruct.ObjectToIndex(vElement); - if (num < 0) - { - throw new COMHResultException((HResults)1); - } - return new MessageMemberWrapper(msg.Struct(num), this); - } - - /// - /// Return the specified member data - /// - /// Member index (string or int) - /// Member data - public object get_Value(object vElement) - { - int num = msg.mStruct.ObjectToIndex(vElement); - if (num >= 0) - { - return msg.Value(num); - } - return null; - } -} diff --git a/Unused/Decal.Adapter.Support/Util.cs b/Unused/Decal.Adapter.Support/Util.cs deleted file mode 100644 index 86357e7..0000000 --- a/Unused/Decal.Adapter.Support/Util.cs +++ /dev/null @@ -1,174 +0,0 @@ -#define TRACE -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Drawing; -using Decal.Interop.Core; -using Microsoft.CSharp; -using Microsoft.Win32; - -namespace Decal.Adapter.Support; - -internal static class Util -{ - private static int mTrace; - - internal static int TraceLevel - { - get - { - return mTrace; - } - set - { - mTrace = value; - } - } - - internal static Color ColorFromBGR(int color) - { - return Color.FromArgb(color & 0xFF, (color & 0xFF00) >> 8, (color & 0xFF0000) >> 16); - } - - internal static int ColorToBGR(Color color) - { - return (color.B << 16) | (color.G << 8) | color.R; - } - - internal static Rectangle toRectangle(tagRECT tr) - { - return new Rectangle(tr.left, tr.top, tr.right - tr.left, tr.bottom - tr.top); - } - - internal static tagRECT toTagRECT(Rectangle r) - { - tagRECT result = default(tagRECT); - result.top = r.Top; - result.left = r.Left; - result.bottom = r.Bottom; - result.right = r.Right; - return result; - } - - internal static T UnboxTo(object obj) - { - try - { - return (T)obj; - } - catch (InvalidCastException) - { - TypeConverter converter = new CSharpCodeProvider().GetConverter(obj.GetType()); - if (converter.CanConvertTo(typeof(T))) - { - return (T)converter.ConvertTo(obj, typeof(T)); - } - WriteLine("Error Converting object type {0} to {1}", obj.GetType(), typeof(T)); - throw; - } - } - - internal static void InitializeTracing(string key, string value, int defaultValue) - { - try - { - TraceLevel = (int)Registry.GetValue(key, value, defaultValue); - } - catch - { - TraceLevel = 0; - } - } - - public static void WriteLine(string fmt, params object[] args) - { - WriteLine(1, fmt, args); - } - - public static void WriteLine(int traceLevel, string fmt, params object[] args) - { - WriteLine(traceLevel, string.Format(fmt, args)); - } - - public static void WriteLine(int traceLevel, string msg) - { - Trace.WriteLineIf(mTrace >= traceLevel, msg); - } - - public static void Write(string fmt, params object[] args) - { - Write(1, string.Format(fmt, args)); - } - - public static void Write(int traceLevel, string msg) - { - Trace.WriteIf(mTrace >= traceLevel, msg); - } - - public static void SafeFireEvent(object sender, EventHandler eventHandler, EventArgs args) - { - if (eventHandler == null) - { - return; - } - Delegate[] invocationList = eventHandler.GetInvocationList(); - for (int i = 0; i < invocationList.Length; i++) - { - EventHandler eventHandler2 = (EventHandler)invocationList[i]; - try - { - eventHandler2(sender, args); - } - catch (Exception ex) - { - WriteLine("SafeFire exception: {0}", ex.ToString()); - } - } - } - - public static void SafeFireEvent(object sender, EventHandler eventHandler, T args) where T : EventArgs - { - if (eventHandler == null) - { - return; - } - Delegate[] invocationList = eventHandler.GetInvocationList(); - for (int i = 0; i < invocationList.Length; i++) - { - EventHandler eventHandler2 = (EventHandler)invocationList[i]; - try - { - eventHandler2(sender, args); - } - catch (Exception ex) - { - WriteLine("SafeFire exception: {0}", ex.ToString()); - } - } - } - - public static void SafeFireEvent(object sender, EventHandler eventHandler, T args, ref bool eaten) where T : EatableEventArgs - { - if (eventHandler == null) - { - return; - } - Delegate[] invocationList = eventHandler.GetInvocationList(); - for (int i = 0; i < invocationList.Length; i++) - { - EventHandler eventHandler2 = (EventHandler)invocationList[i]; - try - { - eventHandler2(sender, args); - if (args.Eat) - { - eaten = true; - } - } - catch (Exception ex) - { - WriteLine("SafeFire exception: {0}", ex.ToString()); - } - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/AcceptTradeEventArgs.cs b/Unused/Decal.Adapter.Wrappers/AcceptTradeEventArgs.cs deleted file mode 100644 index 212c690..0000000 --- a/Unused/Decal.Adapter.Wrappers/AcceptTradeEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class AcceptTradeEventArgs : EventArgs -{ - private int mTargetId; - - public int TargetId => mTargetId; - - internal AcceptTradeEventArgs(int TargetId) - { - mTargetId = TargetId; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/AccountCharInfo.cs b/Unused/Decal.Adapter.Wrappers/AccountCharInfo.cs deleted file mode 100644 index 397b94b..0000000 --- a/Unused/Decal.Adapter.Wrappers/AccountCharInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class AccountCharInfo : MarshalByRefObject -{ - private int myIndex; - - private CharacterFilter myFilter; - - public string Name => myFilter.get_AccountCharName(myIndex); - - public int Id => myFilter.get_AccountCharID(myIndex); - - public int Index => myIndex; - - internal AccountCharInfo(CharacterFilter filter, int index) - { - myFilter = filter; - myIndex = index; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/AddRemoveEventType.cs b/Unused/Decal.Adapter.Wrappers/AddRemoveEventType.cs deleted file mode 100644 index acedb9b..0000000 --- a/Unused/Decal.Adapter.Wrappers/AddRemoveEventType.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum AddRemoveEventType -{ - Add, - Delete -} diff --git a/Unused/Decal.Adapter.Wrappers/AddTradeItemEventArgs.cs b/Unused/Decal.Adapter.Wrappers/AddTradeItemEventArgs.cs deleted file mode 100644 index 866768b..0000000 --- a/Unused/Decal.Adapter.Wrappers/AddTradeItemEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class AddTradeItemEventArgs : EventArgs -{ - private int mItemId; - - private int mSideId; - - public int ItemId => mItemId; - - public int SideId => mSideId; - - internal AddTradeItemEventArgs(int ItemId, int SideId) - { - mItemId = ItemId; - mSideId = SideId; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/AllegianceInfoWrapper.cs b/Unused/Decal.Adapter.Wrappers/AllegianceInfoWrapper.cs deleted file mode 100644 index bbaed41..0000000 --- a/Unused/Decal.Adapter.Wrappers/AllegianceInfoWrapper.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class AllegianceInfoWrapper : MarshalByRefObject, IDisposable -{ - private AllegianceInfo myAllegianceInfo; - - private bool isDisposed; - - public int Id => myAllegianceInfo.GUID; - - public int Gender => myAllegianceInfo.Gender; - - public int Leadership => myAllegianceInfo.Leadership; - - public int Loyalty => myAllegianceInfo.Loyalty; - - public string Name => myAllegianceInfo.Name; - - public int Race => myAllegianceInfo.Race; - - public int Rank => myAllegianceInfo.Rank; - - public int ParentId => myAllegianceInfo.TreeParent; - - public int Type => myAllegianceInfo.Type; - - public double Unknown => myAllegianceInfo.Unknown; - - public long XP => myAllegianceInfo.XP_64; - - internal AllegianceInfoWrapper(AllegianceInfo info) - { - myAllegianceInfo = info; - } - - ~AllegianceInfoWrapper() - { - Dispose(disposing: false); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!isDisposed) - { - } - if (myAllegianceInfo != null) - { - Marshal.ReleaseComObject(myAllegianceInfo); - } - isDisposed = true; - } - - protected void EnforceDisposedOnce() - { - if (isDisposed) - { - throw new ObjectDisposedException("AllegianceInfoWrapper"); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ApproachVendorEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ApproachVendorEventArgs.cs deleted file mode 100644 index 82caaac..0000000 --- a/Unused/Decal.Adapter.Wrappers/ApproachVendorEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ApproachVendorEventArgs : EventArgs -{ - private int mMerchantId; - - private Vendor vendor; - - public int MerchantId => mMerchantId; - - public Vendor Vendor => vendor; - - internal ApproachVendorEventArgs(int MerchantId, Vendor ven) - { - mMerchantId = MerchantId; - vendor = ven; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/AttributeInfoWrapper.cs b/Unused/Decal.Adapter.Wrappers/AttributeInfoWrapper.cs deleted file mode 100644 index 677a1d4..0000000 --- a/Unused/Decal.Adapter.Wrappers/AttributeInfoWrapper.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class AttributeInfoWrapper : MarshalByRefObject, IDisposable -{ - private AttributeInfo myAttribInfo; - - private bool isDisposed; - - public int Base => myAttribInfo.Base; - - public int Buffed => myAttribInfo.Buffed; - - public int Creation => myAttribInfo.Creation; - - public int Exp => myAttribInfo.Exp; - - public string Name => myAttribInfo.Name; - - internal AttributeInfoWrapper(AttributeInfo info) - { - myAttribInfo = info; - } - - ~AttributeInfoWrapper() - { - Dispose(disposing: false); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!isDisposed) - { - } - if (myAttribInfo != null) - { - Marshal.ReleaseComObject(myAttribInfo); - } - isDisposed = true; - } - - protected void EnforceDisposedOnce() - { - if (isDisposed) - { - throw new ObjectDisposedException("AttributeInfoWrapper"); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/AttributeType.cs b/Unused/Decal.Adapter.Wrappers/AttributeType.cs deleted file mode 100644 index 58485ce..0000000 --- a/Unused/Decal.Adapter.Wrappers/AttributeType.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum AttributeType -{ - CurrentStrength = 1, - CurrentEndurance, - CurrentQuickness, - CurrentCoordination, - CurrentFocus, - CurrentSelf, - BaseStrength, - BaseEndurance, - BaseQuickness, - BaseCoordination, - BaseFocus, - BaseSelf -} diff --git a/Unused/Decal.Adapter.Wrappers/Augmentations.cs b/Unused/Decal.Adapter.Wrappers/Augmentations.cs deleted file mode 100644 index b5a8ae7..0000000 --- a/Unused/Decal.Adapter.Wrappers/Augmentations.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum Augmentations -{ - ReinforcementLugians = 218, - BleearghFortitude = 219, - OswaldEnchancement = 220, - SiraluunBlessing = 221, - EnduringCalm = 222, - SteadfastWill = 223, - CiandraEssence = 224, - YoshiEssence = 225, - JibrilEssence = 226, - CeldisethEssence = 227, - KogaEssence = 228, - ShadowSeventhMule = 229, - MightSeventhMule = 230, - ClutchMiser = 231, - EnduringEnchantment = 232, - CriticalProtection = 233, - QuickLearner = 234, - CiandraFortune = 235, - CharmedSmith = 236, - InnateRenewal = 237, - ArchmageEndurance = 238, - BladeTurner = 240, - ArrowTurner = 241, - MaceTurner = 242, - CausticEnhancement = 243, - FieryEnchancment = 244, - IcyEnchancement = 245, - LightningEnhancement = 246, - InfusedCreature = 294, - InfusedItem = 295, - InfusedLife = 296, - InfusedWar = 297, - EyeRemorseless = 298, - HandRemorseless = 299, - MasterSteelCircle = 300, - MasterFocusedEyed = 301, - MasterFiveFoldPath = 302, - FrenzySlayer = 309, - IronSkinInvincible = 310, - JackOfAllTrades = 326, - InfusedVoid = 328, - [Obsolete("Use InfusedVoid")] - UnknownAug1 = 328, - [Obsolete("Not an aug")] - UnknownAug2 = 329, - [Obsolete("Not an aug")] - UnknownAug3 = 330, - [Obsolete("Not an aug")] - UnknownAug4 = 331, - [Obsolete("Not an aug")] - UnknownAug5 = 332, - AuraValor = 333, - AuraProtection = 334, - AuraGlory = 335, - AuraTemperance = 336, - AuraSurge = 337, - [Obsolete("Not an aug")] - UnknownAug6 = 337, - AuraAethericVision = 338, - AuraManaFlow = 339, - AuraManaInfusion = 340, - [Obsolete("Use AuraManaInfusion")] - UnknownAug7 = 340, - AuraVitality = 341, - [Obsolete("Use AuraVitality")] - UnknownAug8 = 341, - AuraPurity = 342, - AuraCraftsman = 343, - AuraSpecialization = 344, - AuraWorld = 365 -} diff --git a/Unused/Decal.Adapter.Wrappers/Background.cs b/Unused/Decal.Adapter.Wrappers/Background.cs deleted file mode 100644 index 200bfbb..0000000 --- a/Unused/Decal.Adapter.Wrappers/Background.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using Decal.Interop.Render; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class Background : HudRenderTarget -{ - private HUDBackground internalBackground; - - internal HUDBackground Underlying => internalBackground; - - internal Background(HUDBackground background) - : base(background) - { - internalBackground = background; - } - - public Background Clone() - { - return new Background(internalBackground.Clone()); - } - - protected override void Dispose(bool disposing) - { - internalBackground = null; - base.Dispose(disposing); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/BoolValueKey.cs b/Unused/Decal.Adapter.Wrappers/BoolValueKey.cs deleted file mode 100644 index 5f19318..0000000 --- a/Unused/Decal.Adapter.Wrappers/BoolValueKey.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public enum BoolValueKey -{ - Lockable = 201326592, - Inscribable = 201326593, - Open = 2, - Locked = 3, - HookVisibility = 24, - UnlimitedUses = 63, - CanBeSold = 69, - Retained = 91, - Ivoryable = 99, - Dyeable = 100, - AwayFromKeyboard = 110 -} diff --git a/Unused/Decal.Adapter.Wrappers/ButtonWrapper.cs b/Unused/Decal.Adapter.Wrappers/ButtonWrapper.cs deleted file mode 100644 index 422c11a..0000000 --- a/Unused/Decal.Adapter.Wrappers/ButtonWrapper.cs +++ /dev/null @@ -1,229 +0,0 @@ -using System; -using System.Drawing; -using Decal.Adapter.Support; -using Decal.Interop.Inject; - -namespace Decal.Adapter.Wrappers; - -public class ButtonWrapper : ControlWrapperBase -{ - private EventHandler evtClick; - - private EventHandler evtCancel; - - private EventHandler evtDestroy; - - private EventHandler evtHit; - - private EventHandler evtUnhit; - - private int myBackground; - - public Color Matte - { - get - { - return Util.ColorFromBGR(base.Control.Matte); - } - set - { - base.Control.Matte = Util.ColorToBGR(value); - } - } - - public int Background - { - get - { - return myBackground; - } - set - { - myBackground = value; - base.Control.SetBackground(myBackground); - } - } - - public event EventHandler Click - { - add - { - if (evtClick == null) - { - base.Control.Accepted += ClickEvent; - } - evtClick = (EventHandler)Delegate.Combine(evtClick, value); - } - remove - { - evtClick = (EventHandler)Delegate.Remove(evtClick, value); - if (evtClick == null) - { - base.Control.Accepted -= ClickEvent; - } - } - } - - public event EventHandler Canceled - { - add - { - if (evtCancel == null) - { - base.Control.Canceled += CanceledEvent; - } - evtCancel = (EventHandler)Delegate.Combine(evtCancel, value); - } - remove - { - evtCancel = (EventHandler)Delegate.Remove(evtCancel, value); - if (evtCancel == null) - { - base.Control.Canceled -= CanceledEvent; - } - } - } - - public event EventHandler Destroy - { - add - { - if (evtDestroy == null) - { - base.Control.Destroy += DestroyEvent; - } - evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); - } - remove - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); - if (evtDestroy == null) - { - base.Control.Destroy -= DestroyEvent; - } - } - } - - public event EventHandler Hit - { - add - { - if (evtHit == null) - { - base.Control.Hit += HitEvent; - } - evtHit = (EventHandler)Delegate.Combine(evtHit, value); - } - remove - { - evtHit = (EventHandler)Delegate.Remove(evtHit, value); - if (evtHit == null) - { - base.Control.Hit -= HitEvent; - } - } - } - - public event EventHandler Unhit - { - add - { - if (evtUnhit == null) - { - base.Control.Unhit += UnhitEvent; - } - evtUnhit = (EventHandler)Delegate.Combine(evtUnhit, value); - } - remove - { - evtUnhit = (EventHandler)Delegate.Remove(evtUnhit, value); - if (evtUnhit == null) - { - base.Control.Unhit -= UnhitEvent; - } - } - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (evtClick != null) - { - evtClick = (EventHandler)Delegate.Remove(evtClick, evtClick); - base.Control.Accepted -= ClickEvent; - } - if (evtCancel != null) - { - evtCancel = (EventHandler)Delegate.Remove(evtCancel, evtCancel); - base.Control.Canceled -= CanceledEvent; - } - if (evtDestroy != null) - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); - base.Control.Destroy -= DestroyEvent; - } - if (evtHit != null) - { - evtHit = (EventHandler)Delegate.Remove(evtHit, evtHit); - base.Control.Hit -= HitEvent; - } - if (evtUnhit != null) - { - evtUnhit = (EventHandler)Delegate.Remove(evtUnhit, evtUnhit); - base.Control.Unhit -= UnhitEvent; - } - } - base.Dispose(disposing); - } - - public void SetImages(int released, int pressed) - { - SetImages(0, released, pressed); - } - - public void SetImages(int module, int released, int pressed) - { - base.Control.SetImages(module, released, pressed); - } - - private void ClickEvent(int ID) - { - if (evtClick != null) - { - evtClick(this, new ControlEventArgs(ID)); - } - } - - private void UnhitEvent(int ID) - { - if (evtUnhit != null) - { - evtUnhit(this, new ControlEventArgs(ID)); - } - } - - private void HitEvent(int ID) - { - if (evtHit != null) - { - evtHit(this, new ControlEventArgs(ID)); - } - } - - private void DestroyEvent(int ID) - { - if (evtDestroy != null) - { - evtDestroy(this, new ControlEventArgs(ID)); - } - } - - private void CanceledEvent(int ID) - { - if (evtCancel != null) - { - evtCancel(this, new ControlEventArgs(ID)); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ByAllFilter.cs b/Unused/Decal.Adapter.Wrappers/ByAllFilter.cs deleted file mode 100644 index 75db439..0000000 --- a/Unused/Decal.Adapter.Wrappers/ByAllFilter.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines the WorldObjectCollection filter for all objects -/// -public class ByAllFilter : WorldObjectCollectionFilter -{ - internal override void ApplyFilter(WorldIterator wi) - { - wi.ByAll(); - } - - internal override void ApplyFilter(Decal.Interop.Filters.Vendor ven) - { - ven.ByAll(); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ByCategoryFilter.cs b/Unused/Decal.Adapter.Wrappers/ByCategoryFilter.cs deleted file mode 100644 index 0af2140..0000000 --- a/Unused/Decal.Adapter.Wrappers/ByCategoryFilter.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines the WorldObjectCollection filter for objects having the same category -/// -public class ByCategoryFilter : WorldObjectCollectionFilter -{ - private int category; - - /// - /// Category of the items in this collection - /// - public int Category - { - get - { - return category; - } - set - { - category = value; - } - } - - /// - /// Creates a new filter - /// - public ByCategoryFilter() - { - } - - /// - /// Creates a new filter using the specified category - /// - /// Category to filter by - public ByCategoryFilter(int category) - { - this.category = category; - } - - internal override void ApplyFilter(WorldIterator wi) - { - wi.ByCategory(category); - } - - internal override void ApplyFilter(Decal.Interop.Filters.Vendor ven) - { - ven.ByCategory(category); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ByContainerFilter.cs b/Unused/Decal.Adapter.Wrappers/ByContainerFilter.cs deleted file mode 100644 index 33ea97a..0000000 --- a/Unused/Decal.Adapter.Wrappers/ByContainerFilter.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines the WorldObjectCollection filter for objects in a container -/// -public class ByContainerFilter : WorldObjectCollectionFilter -{ - private int container; - - /// - /// Id of the container filtered by - /// - public int Container - { - get - { - return container; - } - set - { - container = value; - } - } - - /// - /// Creates a new filter - /// - public ByContainerFilter() - { - } - - /// - /// Creates a new filter using the specified container - /// - /// Id of the container - public ByContainerFilter(int container) - { - this.container = container; - } - - internal override void ApplyFilter(WorldIterator wi) - { - wi.ByContainer(container); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ByInventoryFilter.cs b/Unused/Decal.Adapter.Wrappers/ByInventoryFilter.cs deleted file mode 100644 index 626bd32..0000000 --- a/Unused/Decal.Adapter.Wrappers/ByInventoryFilter.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines the WorldObjectCollection filter for inventory objects -/// -public class ByInventoryFilter : WorldObjectCollectionFilter -{ - internal override void ApplyFilter(WorldIterator wi) - { - wi.ByInventory(); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ByLandscapeFilter.cs b/Unused/Decal.Adapter.Wrappers/ByLandscapeFilter.cs deleted file mode 100644 index db13849..0000000 --- a/Unused/Decal.Adapter.Wrappers/ByLandscapeFilter.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines the WorldObjectCollection filter for landscape objects -/// -public class ByLandscapeFilter : WorldObjectCollectionFilter -{ - internal override void ApplyFilter(WorldIterator wi) - { - wi.ByLandscape(); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ByNameFilter.cs b/Unused/Decal.Adapter.Wrappers/ByNameFilter.cs deleted file mode 100644 index eb4dd7c..0000000 --- a/Unused/Decal.Adapter.Wrappers/ByNameFilter.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines the WorldObjectCollection filter for objects having the specified name -/// -public class ByNameFilter : WorldObjectCollectionFilter -{ - private string name; - - /// - /// Name of the objects in this collection - /// - public string Name - { - get - { - return name; - } - set - { - name = value; - } - } - - /// - /// Creates a new filter - /// - public ByNameFilter() - { - } - - /// - /// Creates a new filter using the specified name - /// - /// Name of the object - public ByNameFilter(string name) - { - this.name = name; - } - - internal override void ApplyFilter(WorldIterator wi) - { - wi.ByName(name); - } - - internal override void ApplyFilter(Decal.Interop.Filters.Vendor ven) - { - ven.ByName(name); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ByNameSubStringFilter.cs b/Unused/Decal.Adapter.Wrappers/ByNameSubStringFilter.cs deleted file mode 100644 index e3d532d..0000000 --- a/Unused/Decal.Adapter.Wrappers/ByNameSubStringFilter.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines the WorldObjectCollection filter for objects containing the specified name -/// -public class ByNameSubStringFilter : ByNameFilter -{ - internal override void ApplyFilter(WorldIterator wi) - { - wi.ByNameSubstring(base.Name); - } - - internal override void ApplyFilter(Decal.Interop.Filters.Vendor ven) - { - ven.ByNameSubstring(base.Name); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ByObjectClassFilter.cs b/Unused/Decal.Adapter.Wrappers/ByObjectClassFilter.cs deleted file mode 100644 index 9c6fc1d..0000000 --- a/Unused/Decal.Adapter.Wrappers/ByObjectClassFilter.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines the WorldObjectCollection filter for objects of the same type/class -/// -public class ByObjectClassFilter : WorldObjectCollectionFilter -{ - private ObjectClass objClass; - - /// - /// Class of the items in this collection - /// - public ObjectClass ObjectClass - { - get - { - return objClass; - } - set - { - objClass = value; - } - } - - /// - /// Creates a new filter - /// - public ByObjectClassFilter() - { - } - - /// - /// Creates a new filter using the specified ObjectClass - /// - /// Class of the items - public ByObjectClassFilter(ObjectClass objClass) - { - this.objClass = objClass; - } - - internal override void ApplyFilter(WorldIterator wi) - { - wi.ByObjectClass((eObjectClass)objClass); - } - - internal override void ApplyFilter(Decal.Interop.Filters.Vendor ven) - { - ven.ByObjectClass((eObjectClass)objClass); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ByOwnerFilter.cs b/Unused/Decal.Adapter.Wrappers/ByOwnerFilter.cs deleted file mode 100644 index db6a026..0000000 --- a/Unused/Decal.Adapter.Wrappers/ByOwnerFilter.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines the WorldObjectCollection filter for all objects owned by a character -/// -public class ByOwnerFilter : WorldObjectCollectionFilter -{ - private int owner; - - /// - /// Id of the owner of the objects - /// - public int Owner - { - get - { - return owner; - } - set - { - owner = value; - } - } - - /// - /// Creates a new filter - /// - public ByOwnerFilter() - { - } - - /// - /// Creates a new filter using the specified owner - /// - /// Id of the owner - public ByOwnerFilter(int owner) - { - this.owner = owner; - } - - internal override void ApplyFilter(WorldIterator wi) - { - wi.ByOwner(owner); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/CastEventType.cs b/Unused/Decal.Adapter.Wrappers/CastEventType.cs deleted file mode 100644 index 2d81540..0000000 --- a/Unused/Decal.Adapter.Wrappers/CastEventType.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum CastEventType -{ - Untargetted, - Targetted -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangeEnchantmentsEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangeEnchantmentsEventArgs.cs deleted file mode 100644 index 61e5447..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangeEnchantmentsEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ChangeEnchantmentsEventArgs : EventArgs -{ - private AddRemoveEventType myType; - - private EnchantmentWrapper myEnchantment; - - public AddRemoveEventType Type => myType; - - public EnchantmentWrapper Enchantment => myEnchantment; - - internal ChangeEnchantmentsEventArgs(AddRemoveEventType type, EnchantmentWrapper enchantment) - { - myType = type; - myEnchantment = enchantment; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangeExperienceEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangeExperienceEventArgs.cs deleted file mode 100644 index b354a1c..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangeExperienceEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ChangeExperienceEventArgs : EventArgs -{ - private PlayerXPEventType myType; - - private int myAmount; - - public PlayerXPEventType Type => myType; - - public int Amount => myAmount; - - internal ChangeExperienceEventArgs(PlayerXPEventType type, int amount) - { - myType = type; - myAmount = amount; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangeFellowshipEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangeFellowshipEventArgs.cs deleted file mode 100644 index 121db43..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangeFellowshipEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ChangeFellowshipEventArgs : EventArgs -{ - private FellowshipEventType myType; - - private int myId; - - public FellowshipEventType Type => myType; - - public int Id => myId; - - internal ChangeFellowshipEventArgs(FellowshipEventType type, int Id) - { - myType = type; - myId = Id; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangeObjectEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangeObjectEventArgs.cs deleted file mode 100644 index 64218cc..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangeObjectEventArgs.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -public class ChangeObjectEventArgs : EventArgs -{ - private WorldObject myChangedObject; - - private WorldChangeType myChangeType; - - public WorldObject Changed => myChangedObject; - - public WorldChangeType Change => myChangeType; - - internal ChangeObjectEventArgs(WorldObject changedObject, Decal.Interop.Filters.WorldChangeType changeType) - { - myChangedObject = changedObject; - myChangeType = (WorldChangeType)changeType; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangeOptionEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangeOptionEventArgs.cs deleted file mode 100644 index 742030b..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangeOptionEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ChangeOptionEventArgs : EventArgs -{ - private int myOption; - - private int myValue; - - public int Option => myOption; - - public int Value => myValue; - - internal ChangeOptionEventArgs(int option, int value) - { - myOption = option; - myValue = value; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangePlayerEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangePlayerEventArgs.cs deleted file mode 100644 index ca2af81..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangePlayerEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ChangePlayerEventArgs : EventArgs -{ - private PlayerModifyEventType myType; - - private int myStat; - - public PlayerModifyEventType Type => myType; - - public int Stat => myStat; - - internal ChangePlayerEventArgs(PlayerModifyEventType type, int Stat) - { - myType = type; - myStat = Stat; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangePortalModeEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangePortalModeEventArgs.cs deleted file mode 100644 index f821ced..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangePortalModeEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ChangePortalModeEventArgs : EventArgs -{ - private PortalEventType myType; - - public PortalEventType Type => myType; - - internal ChangePortalModeEventArgs(PortalEventType type) - { - myType = type; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangeSettingsFlagsEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangeSettingsFlagsEventArgs.cs deleted file mode 100644 index 1b6995e..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangeSettingsFlagsEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ChangeSettingsFlagsEventArgs : EventArgs -{ - private int mySettings; - - public int Settings => mySettings; - - internal ChangeSettingsFlagsEventArgs(int settings) - { - mySettings = settings; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangeShortcutEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangeShortcutEventArgs.cs deleted file mode 100644 index 70c7f1e..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangeShortcutEventArgs.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ChangeShortcutEventArgs : EventArgs -{ - private AddRemoveEventType myType; - - private int mySlot; - - private int myObjectId; - - public AddRemoveEventType Type => myType; - - public int Slot => mySlot; - - public int ObjectId => myObjectId; - - internal ChangeShortcutEventArgs(AddRemoveEventType type, int Slot, int ObjectId) - { - myType = type; - mySlot = Slot; - myObjectId = ObjectId; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangeSpellbarEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangeSpellbarEventArgs.cs deleted file mode 100644 index 71dafdc..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangeSpellbarEventArgs.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ChangeSpellbarEventArgs : EventArgs -{ - private AddRemoveEventType myType; - - private int myTab; - - private int mySlot; - - private int mySpellId; - - public AddRemoveEventType Type => myType; - - public int Tab => myTab; - - public int Slot => mySlot; - - public int SpellId => mySpellId; - - internal ChangeSpellbarEventArgs(AddRemoveEventType type, int Tab, int Slot, int SpellId) - { - myType = type; - myTab = Tab; - mySlot = Slot; - mySpellId = SpellId; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChangeVitalEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ChangeVitalEventArgs.cs deleted file mode 100644 index 6a63c87..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChangeVitalEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ChangeVitalEventArgs : EventArgs -{ - private CharFilterVitalType myType; - - private int myAmount; - - public CharFilterVitalType Type => myType; - - public int Amount => myAmount; - - internal ChangeVitalEventArgs(CharFilterVitalType type, int amount) - { - myType = type; - myAmount = amount; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/CharFilterAttributeType.cs b/Unused/Decal.Adapter.Wrappers/CharFilterAttributeType.cs deleted file mode 100644 index aba9dcd..0000000 --- a/Unused/Decal.Adapter.Wrappers/CharFilterAttributeType.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum CharFilterAttributeType -{ - Strength = 1, - Endurance, - Quickness, - Coordination, - Focus, - Self -} diff --git a/Unused/Decal.Adapter.Wrappers/CharFilterIndex.cs b/Unused/Decal.Adapter.Wrappers/CharFilterIndex.cs deleted file mode 100644 index 479a935..0000000 --- a/Unused/Decal.Adapter.Wrappers/CharFilterIndex.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public enum CharFilterIndex -{ - Vassals, - Enchantments, - Vitals, - Attributes, - Skills, - Characters, - Spells, - Augmentations, - EffectiveAttributes, - EffectiveVitals, - EffectiveSkills -} diff --git a/Unused/Decal.Adapter.Wrappers/CharFilterSkillType.cs b/Unused/Decal.Adapter.Wrappers/CharFilterSkillType.cs deleted file mode 100644 index d2a2e15..0000000 --- a/Unused/Decal.Adapter.Wrappers/CharFilterSkillType.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum CharFilterSkillType -{ - Axe = 1, - Bow = 2, - Crossbow = 3, - Dagger = 4, - Mace = 5, - MeleeDefense = 6, - MissileDefense = 7, - Spear = 9, - Staff = 10, - Sword = 11, - ThrownWeapons = 12, - Unarmed = 13, - ArcaneLore = 14, - MagicDefense = 15, - ManaConversion = 16, - ItemTinkering = 18, - AssessPerson = 19, - Deception = 20, - Healing = 21, - Jump = 22, - Lockpick = 23, - Run = 24, - AssessCreature = 27, - WeaponTinkering = 28, - ArmorTinkering = 29, - MagicItemTinkering = 30, - CreatureEnchantment = 31, - ItemEnchantment = 32, - LifeMagic = 33, - WarMagic = 34, - Leadership = 35, - Loyalty = 36, - Fletching = 37, - Alchemy = 38, - Cooking = 39, - Salvaging = 40, - TwoHandedCombat = 41, - Gearcraft = 42, - VoidMagic = 43, - HeavyWeapons = 44, - LightWeapons = 45, - FinesseWeapons = 46, - MissileWeapons = 47, - Shield = 48, - DualWield = 49, - Recklessness = 50, - SneakAttack = 51, - DirtyFighting = 52, - Summoning = 54 -} diff --git a/Unused/Decal.Adapter.Wrappers/CharFilterVitalType.cs b/Unused/Decal.Adapter.Wrappers/CharFilterVitalType.cs deleted file mode 100644 index 16d2db0..0000000 --- a/Unused/Decal.Adapter.Wrappers/CharFilterVitalType.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum CharFilterVitalType -{ - Health = 2, - Stamina = 4, - Mana = 6 -} diff --git a/Unused/Decal.Adapter.Wrappers/CharacterFilter.cs b/Unused/Decal.Adapter.Wrappers/CharacterFilter.cs deleted file mode 100644 index 2645c2a..0000000 --- a/Unused/Decal.Adapter.Wrappers/CharacterFilter.cs +++ /dev/null @@ -1,1173 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Decal.Adapter.Support; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -public class CharacterFilter : GenericDisposableWrapper, IIndexedProvider -{ - private EventHandler mSpellCast; - - private EventHandler mStatusMessage; - - private EventHandler mSpellbookChange; - - private EventHandler mChangePortalMode; - - private EventHandler mChangePlayer; - - private EventHandler mChangeFellowship; - - private EventHandler mChangeEnchantments; - - private EventHandler mChangeExperience; - - private EventHandler mChangeVital; - - private EventHandler mChangeSpellbar; - - private EventHandler mChangeShortcut; - - private EventHandler mLogin; - - private EventHandler mLogoff; - - private EventHandler mDeath; - - private EventHandler mChangeSettings; - - private EventHandler mActionComplete; - - private EventHandler mLoginComplete; - - private EventHandler mChangeSettingsFlags; - - private EventHandler mChangeOption; - - private Collection mySpellBook; - - private ReadOnlyCollection myAugmentations; - - private Dictionary> mySpellBars; - - private Dictionary allegianceData; - - private Dictionary enchantmentData; - - private Dictionary vitalSkillData; - - private Dictionary attributeData; - - public string AccountName - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.AccountName; - } - } - - public int Age - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Age; - } - } - - public DateTime Birth - { - get - { - EnforceDisposedOnce(); - return new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(base.Wrapped.Birth); - } - } - - public int Burden - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Burden; - } - } - - public int BurdenUnits - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.BurdenUnits; - } - } - - public string Name - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Name; - } - } - - public int Id - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Character; - } - } - - public int CharacterOptions - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.CharacterOptions; - } - } - - public int CharacterOptionFlags => base.Wrapped.CharacterOptionFlags; - - public string ClassTemplate - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.ClassTemplate; - } - } - - public int Deaths - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Deaths; - } - } - - public string Gender - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Gender; - } - } - - public int Health - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Health; - } - } - - public int Stamina - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Stamina; - } - } - - public int Mana - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Mana; - } - } - - public int Level - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Level; - } - } - - public int LoginStatus - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.LoginStatus; - } - } - - public string Race - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Race; - } - } - - public int Rank - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Rank; - } - } - - public string Server - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Server; - } - } - - public int ServerPopulation - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.ServerPopulation; - } - } - - public long TotalXP - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.TotalXP_64; - } - } - - [CLSCompliant(false)] - public IndexedCollection Vassals - { - get - { - EnforceDisposedOnce(); - return new IndexedCollection(this, CharFilterIndex.Vassals); - } - } - - [CLSCompliant(false)] - public IndexedCollection Characters - { - get - { - EnforceDisposedOnce(); - return new IndexedCollection(this, CharFilterIndex.Characters); - } - } - - [CLSCompliant(false)] - public IndexedCollection Enchantments - { - get - { - EnforceDisposedOnce(); - return new IndexedCollection(this, CharFilterIndex.Enchantments); - } - } - - [CLSCompliant(false)] - public IndexedCollection Vitals - { - get - { - EnforceDisposedOnce(); - return new IndexedCollection(this, CharFilterIndex.Vitals); - } - } - - [CLSCompliant(false)] - public IndexedCollection Attributes - { - get - { - EnforceDisposedOnce(); - return new IndexedCollection(this, CharFilterIndex.Attributes); - } - } - - [CLSCompliant(false)] - public IndexedCollection Skills - { - get - { - EnforceDisposedOnce(); - return new IndexedCollection(this, CharFilterIndex.Skills); - } - } - - public long UnassignedXP - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.UnassignedXP_64; - } - } - - public int Vitae - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Vitae; - } - } - - public AllegianceInfoWrapper Monarch - { - get - { - EnforceDisposedOnce(); - string key = "Monarch"; - AllegianceInfo monarch = base.Wrapped.Monarch; - AllegianceInfoWrapper value = null; - if (allegianceData.TryGetValue(key, out value) && value.Id != monarch.GUID) - { - allegianceData.Remove(key); - value.Dispose(); - value = null; - } - if (value == null) - { - value = new AllegianceInfoWrapper(monarch); - allegianceData.Add(key, value); - } - return value; - } - } - - public AllegianceInfoWrapper Patron - { - get - { - EnforceDisposedOnce(); - string key = "Patron"; - AllegianceInfo patron = base.Wrapped.Patron; - AllegianceInfoWrapper value = null; - if (allegianceData.TryGetValue(key, out value) && value.Id != patron.GUID) - { - allegianceData.Remove(key); - value.Dispose(); - value = null; - } - if (value == null) - { - value = new AllegianceInfoWrapper(patron); - allegianceData.Add(key, value); - } - return value; - } - } - - public AllegianceInfoWrapper Allegiance - { - get - { - EnforceDisposedOnce(); - string key = "MyAllegiance"; - AllegianceInfoWrapper value = null; - if (allegianceData.TryGetValue(key, out value)) - { - allegianceData.Remove(key); - value.Dispose(); - } - value = new AllegianceInfoWrapper(base.Wrapped.MyAllegiance); - allegianceData.Add(key, value); - return value; - } - } - - public int Followers - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.Followers; - } - } - - public int MonarchFollowers - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.MonarchFollowers; - } - } - - public int SkillPoints - { - get - { - EnforceDisposedOnce(); - return base.Wrapped.SkillPoints; - } - } - - public long XPToNextLevel => base.Wrapped.XPToNextLevel; - - public ReadOnlyCollection SpellBook - { - get - { - EnforceDisposedOnce(); - if (mySpellBook == null) - { - mySpellBook = new Collection(base.Wrapped.SpellbookArray); - } - return new ReadOnlyCollection(mySpellBook); - } - } - - public ReadOnlyCollection Augmentations - { - get - { - EnforceDisposedOnce(); - if (myAugmentations == null) - { - myAugmentations = new ReadOnlyCollection(base.Wrapped.AugmentationArray); - } - return myAugmentations; - } - } - - [CLSCompliant(false)] - public IndexedCollection EffectiveAttribute => new IndexedCollection(this, CharFilterIndex.EffectiveAttributes); - - [CLSCompliant(false)] - public IndexedCollection EffectiveSkill => new IndexedCollection(this, CharFilterIndex.EffectiveSkills); - - [CLSCompliant(false)] - public IndexedCollection EffectiveVital => new IndexedCollection(this, CharFilterIndex.EffectiveVitals); - - public event EventHandler ActionComplete - { - add - { - mActionComplete = (EventHandler)Delegate.Combine(mActionComplete, value); - } - remove - { - mActionComplete = (EventHandler)Delegate.Remove(mActionComplete, value); - } - } - - public event EventHandler LoginComplete - { - add - { - mLoginComplete = (EventHandler)Delegate.Combine(mLoginComplete, value); - } - remove - { - mLoginComplete = (EventHandler)Delegate.Remove(mLoginComplete, value); - } - } - - [CLSCompliant(false)] - public event EventHandler SpellbookChange - { - add - { - mSpellbookChange = (EventHandler)Delegate.Combine(mSpellbookChange, value); - } - remove - { - mSpellbookChange = (EventHandler)Delegate.Remove(mSpellbookChange, value); - } - } - - [CLSCompliant(false)] - public event EventHandler Death - { - add - { - mDeath = (EventHandler)Delegate.Combine(mDeath, value); - } - remove - { - mDeath = (EventHandler)Delegate.Remove(mDeath, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChangePortalMode - { - add - { - mChangePortalMode = (EventHandler)Delegate.Combine(mChangePortalMode, value); - } - remove - { - mChangePortalMode = (EventHandler)Delegate.Remove(mChangePortalMode, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChangePlayer - { - add - { - mChangePlayer = (EventHandler)Delegate.Combine(mChangePlayer, value); - } - remove - { - mChangePlayer = (EventHandler)Delegate.Remove(mChangePlayer, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChangeFellowship - { - add - { - mChangeFellowship = (EventHandler)Delegate.Combine(mChangeFellowship, value); - } - remove - { - mChangeFellowship = (EventHandler)Delegate.Remove(mChangeFellowship, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChangeEnchantments - { - add - { - mChangeEnchantments = (EventHandler)Delegate.Combine(mChangeEnchantments, value); - } - remove - { - mChangeEnchantments = (EventHandler)Delegate.Remove(mChangeEnchantments, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChangeExperience - { - add - { - mChangeExperience = (EventHandler)Delegate.Combine(mChangeExperience, value); - } - remove - { - mChangeExperience = (EventHandler)Delegate.Remove(mChangeExperience, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChangeVital - { - add - { - mChangeVital = (EventHandler)Delegate.Combine(mChangeVital, value); - } - remove - { - mChangeVital = (EventHandler)Delegate.Remove(mChangeVital, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChangeSpellbar - { - add - { - mChangeSpellbar = (EventHandler)Delegate.Combine(mChangeSpellbar, value); - } - remove - { - mChangeSpellbar = (EventHandler)Delegate.Remove(mChangeSpellbar, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChangeShortcut - { - add - { - mChangeShortcut = (EventHandler)Delegate.Combine(mChangeShortcut, value); - } - remove - { - mChangeShortcut = (EventHandler)Delegate.Remove(mChangeShortcut, value); - } - } - - [CLSCompliant(false)] - public event EventHandler Login - { - add - { - mLogin = (EventHandler)Delegate.Combine(mLogin, value); - } - remove - { - mLogin = (EventHandler)Delegate.Remove(mLogin, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChangeSettings - { - add - { - mChangeSettings = (EventHandler)Delegate.Combine(mChangeSettings, value); - } - remove - { - mChangeSettings = (EventHandler)Delegate.Remove(mChangeSettings, value); - } - } - - public event EventHandler ChangeSettingsFlags - { - add - { - mChangeSettingsFlags = (EventHandler)Delegate.Combine(mChangeSettingsFlags, value); - } - remove - { - mChangeSettingsFlags = (EventHandler)Delegate.Remove(mChangeSettingsFlags, value); - } - } - - public event EventHandler ChangeOption - { - add - { - mChangeOption = (EventHandler)Delegate.Combine(mChangeOption, value); - } - remove - { - mChangeOption = (EventHandler)Delegate.Remove(mChangeOption, value); - } - } - - [CLSCompliant(false)] - public event EventHandler Logoff - { - add - { - mLogoff = (EventHandler)Delegate.Combine(mLogoff, value); - } - remove - { - mLogoff = (EventHandler)Delegate.Remove(mLogoff, value); - } - } - - [CLSCompliant(false)] - public event EventHandler SpellCast - { - add - { - mSpellCast = (EventHandler)Delegate.Combine(mSpellCast, value); - } - remove - { - mSpellCast = (EventHandler)Delegate.Remove(mSpellCast, value); - } - } - - [CLSCompliant(false)] - public event EventHandler StatusMessage - { - add - { - mStatusMessage = (EventHandler)Delegate.Combine(mStatusMessage, value); - } - remove - { - mStatusMessage = (EventHandler)Delegate.Remove(mStatusMessage, value); - } - } - - public CharacterFilter(CharacterStats obj) - : base(obj) - { - base.Wrapped.CastSpell += myCS_CastSpell; - base.Wrapped.ChangeEnchantments += myCS_ChangeEnchantments; - base.Wrapped.ChangeFellowship += myCS_ChangeFellowship; - base.Wrapped.ChangePlayer += myCS_ChangePlayer; - base.Wrapped.ChangePortalMode += myCS_ChangePortalMode; - base.Wrapped.ChangeSettings += myCS_ChangeSettings; - base.Wrapped.ChangeShortcut += myCS_ChangeShortcut; - base.Wrapped.ChangeSpellbar += myCS_ChangeSpellbar; - base.Wrapped.ChangeVital += myCS_ChangeVital; - base.Wrapped.ChangeXPS += myCS_ChangeXPS; - base.Wrapped.Death += myCS_Death; - base.Wrapped.ActionComplete += myCS_ActionComplete; - base.Wrapped.Login += myCS_Login; - base.Wrapped.LoginComplete += myCS_LoginComplete; - base.Wrapped.Logoff += myCS_Logoff; - base.Wrapped.Spellbook_Add += myCS_Spellbook_Add; - base.Wrapped.Spellbook_Delete += myCS_Spellbook_Delete; - base.Wrapped.StatusMessage += myCS_StatusMessage; - base.Wrapped.ChangeSettingFlags += myCS_ChangeSettingFlags; - base.Wrapped.ChangeOption += myCS_ChangeOption; - Reset(createNew: true); - } - - protected override void Dispose(bool userCalled) - { - if (userCalled) - { - if (base.Wrapped != null) - { - base.Wrapped.CastSpell -= myCS_CastSpell; - base.Wrapped.ChangeEnchantments -= myCS_ChangeEnchantments; - base.Wrapped.ChangeFellowship -= myCS_ChangeFellowship; - base.Wrapped.ChangePlayer -= myCS_ChangePlayer; - base.Wrapped.ChangePortalMode -= myCS_ChangePortalMode; - base.Wrapped.ChangeSettings -= myCS_ChangeSettings; - base.Wrapped.ChangeShortcut -= myCS_ChangeShortcut; - base.Wrapped.ChangeSpellbar -= myCS_ChangeSpellbar; - base.Wrapped.ChangeVital -= myCS_ChangeVital; - base.Wrapped.ChangeXPS -= myCS_ChangeXPS; - base.Wrapped.Death -= myCS_Death; - base.Wrapped.ActionComplete -= myCS_ActionComplete; - base.Wrapped.Login -= myCS_Login; - base.Wrapped.LoginComplete -= myCS_LoginComplete; - base.Wrapped.Logoff -= myCS_Logoff; - base.Wrapped.Spellbook_Add -= myCS_Spellbook_Add; - base.Wrapped.Spellbook_Delete -= myCS_Spellbook_Delete; - base.Wrapped.StatusMessage -= myCS_StatusMessage; - } - Reset(createNew: false); - } - base.Dispose(userCalled); - } - - object IIndexedProvider.GetIndexedObject(CharFilterIndex objectIndex, int index) - { - EnforceDisposedOnce(); - object result = null; - switch (objectIndex) - { - case CharFilterIndex.Vassals: - { - if (index >= base.Wrapped.VassalCount) - { - throw new IndexOutOfRangeException("Requested Vassal " + index + " doesn't exist"); - } - string key = "Vassal" + index; - AllegianceInfoWrapper value3 = null; - if (allegianceData.TryGetValue(key, out value3)) - { - allegianceData.Remove(key); - value3?.Dispose(); - } - value3 = new AllegianceInfoWrapper(((ICharacterStats)base.Wrapped).get_Vassal(index)); - allegianceData.Add(key, value3); - return value3; - } - case CharFilterIndex.Enchantments: - { - if (index >= base.Wrapped.EnchantmentCount) - { - throw new IndexOutOfRangeException("Requested Enchantment " + index + " doesn't exist"); - } - string key = "Enchant-" + index; - EnchantmentWrapper value4 = null; - if (enchantmentData.TryGetValue(key, out value4)) - { - enchantmentData.Remove(key); - value4?.Dispose(); - } - value4 = new EnchantmentWrapper(((ICharacterStats)base.Wrapped).get_Enchantment(index)); - enchantmentData.Add(key, value4); - return value4; - } - case CharFilterIndex.Characters: - if (index >= base.Wrapped.AccountCharCount) - { - throw new IndexOutOfRangeException("Requested Character " + index + " doesn't exist"); - } - return new AccountCharInfo(this, index); - case CharFilterIndex.Vitals: - { - if (!Enum.IsDefined(typeof(eVitalID), index)) - { - throw new IndexOutOfRangeException("Requested Vital " + index + " doesn't exist"); - } - string key = "Vital-" + index; - SkillInfoWrapper value5 = null; - if (vitalSkillData.TryGetValue(key, out value5)) - { - vitalSkillData.Remove(key); - value5?.Dispose(); - } - value5 = new SkillInfoWrapper(((ICharacterStats)base.Wrapped).get_Vital((eVitalID)index)); - vitalSkillData.Add(key, value5); - return value5; - } - case CharFilterIndex.Attributes: - { - if (!Enum.IsDefined(typeof(eAttributeID), index)) - { - throw new IndexOutOfRangeException("Requested Attribute " + index + " doesn't exist"); - } - string key = "Attribute-" + index; - AttributeInfoWrapper value2 = null; - if (attributeData.TryGetValue(key, out value2)) - { - attributeData.Remove(key); - value2?.Dispose(); - } - value2 = new AttributeInfoWrapper(((ICharacterStats)base.Wrapped).get_Attribute((eAttributeID)index)); - attributeData.Add(key, value2); - return value2; - } - case CharFilterIndex.Skills: - { - if (!Enum.IsDefined(typeof(CharFilterSkillType), index)) - { - throw new IndexOutOfRangeException("Requested Skill " + index + " doesn't exist"); - } - string key = "Skill-" + index; - SkillInfoWrapper value = null; - if (vitalSkillData.TryGetValue(key, out value)) - { - vitalSkillData.Remove(key); - value?.Dispose(); - } - value = new SkillInfoWrapper(((ICharacterStats)base.Wrapped).get_Skill((eSkillID)index)); - vitalSkillData.Add(key, value); - return value; - } - case CharFilterIndex.EffectiveAttributes: - return ((ICharacterStats)base.Wrapped).get_EffectiveAttribute((eAttributeID)index); - case CharFilterIndex.EffectiveSkills: - return ((ICharacterStats)base.Wrapped).get_EffectiveSkill((eSkillID)index); - case CharFilterIndex.EffectiveVitals: - return ((ICharacterStats)base.Wrapped).get_EffectiveVital((eVitalID)index); - default: - return result; - } - } - - IEnumerator IIndexedProvider.GetEnumerator(CharFilterIndex objectIndex) - { - EnforceDisposedOnce(); - return objectIndex switch - { - CharFilterIndex.Vassals => VassalEnum(), - CharFilterIndex.Enchantments => EnchantmentEnum(), - CharFilterIndex.Vitals => VitalEnum(), - CharFilterIndex.Attributes => AttributeEnum(), - CharFilterIndex.Skills => SkillEnum(), - _ => null, - }; - } - - private IEnumerator VassalEnum() - { - int vassalCount = base.Wrapped.VassalCount; - for (int x = 0; x < vassalCount; x++) - { - yield return Vassals[x]; - } - } - - private IEnumerator EnchantmentEnum() - { - int enchantCount = base.Wrapped.EnchantmentCount; - for (int x = 0; x < enchantCount; x++) - { - yield return Enchantments[x]; - } - } - - private IEnumerator VitalEnum() - { - for (int x = 2; x <= 6; x += 2) - { - yield return Vitals[(CharFilterVitalType)x]; - } - } - - private IEnumerator AttributeEnum() - { - int AttributeCount = base.Wrapped.AttributeCount; - int x = 1; - while (x <= AttributeCount) - { - yield return Attributes[(CharFilterAttributeType)x]; - int num = x + 1; - x = num; - } - } - - private IEnumerator SkillEnum() - { - _ = base.Wrapped.SkillCount; - foreach (int value in Enum.GetValues(typeof(CharFilterSkillType))) - { - yield return Skills[(CharFilterSkillType)value]; - } - } - - int IIndexedProvider.Count(CharFilterIndex objectIndex) - { - EnforceDisposedOnce(); - return objectIndex switch - { - CharFilterIndex.Vassals => base.Wrapped.VassalCount, - CharFilterIndex.Enchantments => base.Wrapped.EnchantmentCount, - CharFilterIndex.Vitals => 3, - CharFilterIndex.Attributes => base.Wrapped.AttributeCount, - CharFilterIndex.Skills => base.Wrapped.SkillCount, - CharFilterIndex.Characters => base.Wrapped.AccountCharCount, - CharFilterIndex.Spells => base.Wrapped.TotalSpells, - CharFilterIndex.Augmentations => base.Wrapped.AugmentationCount(), - CharFilterIndex.EffectiveAttributes => base.Wrapped.AttributeCount, - CharFilterIndex.EffectiveSkills => base.Wrapped.SkillCount, - CharFilterIndex.EffectiveVitals => 3, - _ => 0, - }; - } - - private void myCS_StatusMessage(int type, string text) - { - Util.SafeFireEvent(this, mStatusMessage, new StatusMessageEventArgs(type, text)); - } - - private void myCS_Spellbook_Delete(int spellDeleted) - { - if (mySpellBook != null) - { - mySpellBook.Remove(spellDeleted); - } - Util.SafeFireEvent(this, mSpellbookChange, new SpellbookEventArgs(AddRemoveEventType.Delete, spellDeleted)); - } - - private void myCS_Spellbook_Add(int spellAdded) - { - if (mySpellBook != null) - { - mySpellBook.Add(spellAdded); - } - Util.SafeFireEvent(this, mSpellbookChange, new SpellbookEventArgs(AddRemoveEventType.Add, spellAdded)); - } - - private void myCS_Logoff(PlayerLogoffType type) - { - Util.SafeFireEvent(this, mLogoff, new LogoffEventArgs((LogoffEventType)type)); - Reset(createNew: true); - } - - private void myCS_LoginComplete() - { - Util.SafeFireEvent(this, mLoginComplete, new EventArgs()); - } - - private void myCS_Login(int character) - { - Util.SafeFireEvent(this, mLogin, new LoginEventArgs(character)); - } - - private void myCS_Death(string text) - { - Util.SafeFireEvent(this, mDeath, new DeathEventArgs(text)); - } - - private void myCS_ChangeXPS(PlayerXPType change, int amount) - { - Util.SafeFireEvent(this, mChangeExperience, new ChangeExperienceEventArgs((PlayerXPEventType)change, amount)); - } - - private void myCS_ChangeVital(PlayerVitalType change, int amount) - { - Util.SafeFireEvent(this, mChangeVital, new ChangeVitalEventArgs((CharFilterVitalType)change, amount)); - } - - private void myCS_ChangeSpellbar(PlayerAddRemoveType Change, int Tab, int Slot, int SpellID) - { - if (mySpellBars != null && mySpellBars.ContainsKey(Tab)) - { - mySpellBars.Remove(Tab); - } - Util.SafeFireEvent(this, mChangeSpellbar, new ChangeSpellbarEventArgs((AddRemoveEventType)Change, Tab, Slot, SpellID)); - } - - private void myCS_ChangeShortcut(PlayerAddRemoveType Change, int Slot, int ObjectID) - { - Util.SafeFireEvent(this, mChangeShortcut, new ChangeShortcutEventArgs((AddRemoveEventType)Change, Slot, ObjectID)); - } - - private void myCS_ChangeSettings(int Settings) - { - Util.SafeFireEvent(this, mChangeSettings, new SettingsEventArgs(Settings)); - } - - private void myCS_ChangePortalMode(PlayerPortalType Change) - { - Util.SafeFireEvent(this, mChangePortalMode, new ChangePortalModeEventArgs((PortalEventType)Change)); - } - - private void myCS_ChangePlayer(PlayerModifyType Change, int StatID) - { - if (Change == PlayerModifyType.pevtAugmentation && myAugmentations != null) - { - myAugmentations = null; - } - Util.SafeFireEvent(this, mChangePlayer, new ChangePlayerEventArgs((PlayerModifyEventType)Change, StatID)); - } - - private void myCS_ChangeFellowship(PlayerFellowshipType Change, int Character) - { - Util.SafeFireEvent(this, mChangeFellowship, new ChangeFellowshipEventArgs((FellowshipEventType)Change, Character)); - } - - private void myCS_ChangeEnchantments(PlayerAddRemoveType Change, Enchantment Enchantment) - { - using EnchantmentWrapper enchantment = new EnchantmentWrapper(Enchantment); - Util.SafeFireEvent(this, mChangeEnchantments, new ChangeEnchantmentsEventArgs((AddRemoveEventType)Change, enchantment)); - } - - private void myCS_ActionComplete() - { - Util.SafeFireEvent(this, mActionComplete, new EventArgs()); - } - - private void myCS_CastSpell(PlayerCastType Type, int SpellID, int TargetID) - { - Util.SafeFireEvent(this, mSpellCast, new SpellCastEventArgs((CastEventType)Type, SpellID, TargetID)); - } - - private void myCS_ChangeOption(int key, int value) - { - Util.SafeFireEvent(this, mChangeOption, new ChangeOptionEventArgs(key, value)); - } - - private void myCS_ChangeSettingFlags(int Settings) - { - Util.SafeFireEvent(this, mChangeSettingsFlags, new ChangeSettingsFlagsEventArgs(Settings)); - } - - private void Reset(bool createNew) - { - if (allegianceData != null) - { - foreach (KeyValuePair allegianceDatum in allegianceData) - { - if (allegianceDatum.Value != null) - { - allegianceDatum.Value.Dispose(); - } - } - } - if (enchantmentData != null) - { - foreach (KeyValuePair enchantmentDatum in enchantmentData) - { - if (enchantmentDatum.Value != null) - { - enchantmentDatum.Value.Dispose(); - } - } - } - if (vitalSkillData != null) - { - foreach (KeyValuePair vitalSkillDatum in vitalSkillData) - { - if (vitalSkillDatum.Value != null) - { - vitalSkillDatum.Value.Dispose(); - } - } - } - if (attributeData != null) - { - foreach (KeyValuePair attributeDatum in attributeData) - { - if (attributeDatum.Value != null) - { - attributeDatum.Value.Dispose(); - } - } - } - mySpellBook = null; - if (createNew) - { - mySpellBars = new Dictionary>(); - allegianceData = new Dictionary(); - enchantmentData = new Dictionary(); - vitalSkillData = new Dictionary(); - attributeData = new Dictionary(); - } - } - - internal int get_AccountCharID(int index) - { - EnforceDisposedOnce(); - return ((ICharacterStats)base.Wrapped).get_AccountCharID(index); - } - - internal string get_AccountCharName(int index) - { - EnforceDisposedOnce(); - return ((ICharacterStats)base.Wrapped).get_AccountCharName(index); - } - - public int Shortcut(int slot) - { - return ((ICharacterStats)base.Wrapped).get_Quickslots(slot); - } - - public bool IsSpellKnown(int spellId) - { - if (((ICharacterStats)base.Wrapped).get_SpellLearned(spellId) != 0) - { - return true; - } - return false; - } - - public int GetCharProperty(int key) - { - int pValue = 0; - if (base.Wrapped.AugmentationExists((eAugmentations)key, out pValue)) - { - return pValue; - } - return 0; - } - - public ReadOnlyCollection SpellBar(int barNumber) - { - EnforceDisposedOnce(); - if (barNumber < 0 || barNumber > 6) - { - throw new ArgumentOutOfRangeException("barNumber", barNumber, "barNumber must be between 0 and 6 inclusive"); - } - if (mySpellBars == null) - { - mySpellBars = new Dictionary>(); - } - if (!mySpellBars.ContainsKey(barNumber)) - { - mySpellBars.Add(barNumber, new ReadOnlyCollection(base.Wrapped.SpellBarArray(barNumber))); - } - return mySpellBars[barNumber]; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/CheckBoxWrapper.cs b/Unused/Decal.Adapter.Wrappers/CheckBoxWrapper.cs deleted file mode 100644 index 1ee97ee..0000000 --- a/Unused/Decal.Adapter.Wrappers/CheckBoxWrapper.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using System.Drawing; -using Decal.Adapter.Support; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public class CheckBoxWrapper : ControlWrapperBase -{ - private EventHandler evtDestroy; - - private EventHandler evtChange; - - public bool Checked - { - get - { - return base.Control.Checked; - } - set - { - base.Control.Checked = value; - } - } - - public bool RightToLeft - { - get - { - return base.Control.RightToLeft; - } - set - { - base.Control.RightToLeft = value; - } - } - - public string Text - { - get - { - return base.Control.Text; - } - set - { - base.Control.Text = value; - } - } - - public Color TextColor - { - get - { - return Util.ColorFromBGR(base.Control.TextColor); - } - set - { - base.Control.TextColor = Util.ColorToBGR(value); - } - } - - public event EventHandler Change - { - add - { - if (evtChange == null) - { - base.Control.Change += ChangeEvent; - } - evtChange = (EventHandler)Delegate.Combine(evtChange, value); - } - remove - { - evtChange = (EventHandler)Delegate.Remove(evtChange, value); - if (evtChange == null) - { - base.Control.Change -= ChangeEvent; - } - } - } - - public event EventHandler Destroy - { - add - { - if (evtDestroy == null) - { - base.Control.Destroy += DestroyEvent; - } - evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); - } - remove - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); - if (evtDestroy == null) - { - base.Control.Destroy -= DestroyEvent; - } - } - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (evtChange != null) - { - evtChange = (EventHandler)Delegate.Remove(evtChange, evtChange); - base.Control.Change -= ChangeEvent; - } - if (evtDestroy != null) - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); - base.Control.Destroy -= DestroyEvent; - } - } - base.Dispose(disposing); - } - - private void ChangeEvent(int ID, bool Checked) - { - if (evtChange != null) - { - evtChange(this, new CheckBoxChangeEventArgs(ID, Checked)); - } - } - - private void DestroyEvent(int ID) - { - if (evtDestroy != null) - { - evtDestroy(this, new ControlEventArgs(ID)); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChoiceDataIndexer.cs b/Unused/Decal.Adapter.Wrappers/ChoiceDataIndexer.cs deleted file mode 100644 index 34f6323..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChoiceDataIndexer.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public sealed class ChoiceDataIndexer : IDisposable -{ - private Choice myControl; - - public object this[int index] - { - get - { - return ((IChoice)myControl).get_Data(index); - } - set - { - ((IChoice)myControl).set_Data(index, value); - } - } - - internal ChoiceDataIndexer(Choice control) - { - myControl = control; - } - - public void Dispose() - { - Marshal.ReleaseComObject(myControl); - myControl = null; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChoiceTextIndexer.cs b/Unused/Decal.Adapter.Wrappers/ChoiceTextIndexer.cs deleted file mode 100644 index ab9df86..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChoiceTextIndexer.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public sealed class ChoiceTextIndexer : IDisposable -{ - private Choice myControl; - - public string this[int index] - { - get - { - return ((IChoice)myControl).get_Text(index); - } - set - { - ((IChoice)myControl).set_Text(index, value); - } - } - - internal ChoiceTextIndexer(Choice control) - { - myControl = control; - } - - public void Dispose() - { - myControl = null; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ChoiceWrapper.cs b/Unused/Decal.Adapter.Wrappers/ChoiceWrapper.cs deleted file mode 100644 index bfc7187..0000000 --- a/Unused/Decal.Adapter.Wrappers/ChoiceWrapper.cs +++ /dev/null @@ -1,191 +0,0 @@ -using System; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public class ChoiceWrapper : ControlWrapperBase -{ - private EventHandler evtDropDown; - - private EventHandler evtDestroy; - - private EventHandler evtChange; - - private ChoiceTextIndexer myTextIndex; - - private ChoiceDataIndexer myDataIndex; - - public int Count => base.Control.ChoiceCount; - - public int DropLines - { - get - { - return base.Control.DropLines; - } - set - { - base.Control.DropLines = value; - } - } - - public bool Dropped - { - get - { - return base.Control.Dropped; - } - set - { - base.Control.Dropped = value; - } - } - - public int Selected - { - get - { - return base.Control.Selected; - } - set - { - base.Control.Selected = value; - } - } - - public ChoiceTextIndexer Text => myTextIndex; - - public ChoiceDataIndexer Data => myDataIndex; - - public event EventHandler DropDown - { - add - { - if (evtDropDown == null) - { - base.Control.DropDown += DropDownEvent; - } - evtDropDown = (EventHandler)Delegate.Combine(evtDropDown, value); - } - remove - { - evtDropDown = (EventHandler)Delegate.Remove(evtDropDown, value); - if (evtDropDown == null) - { - base.Control.DropDown -= DropDownEvent; - } - } - } - - public event EventHandler Destroy - { - add - { - if (evtDestroy == null) - { - base.Control.Destroy += DestroyEvent; - } - evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); - } - remove - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); - if (evtDestroy == null) - { - base.Control.Destroy -= DestroyEvent; - } - } - } - - public event EventHandler Change - { - add - { - if (evtChange == null) - { - base.Control.Change += ChangeEvent; - } - evtChange = (EventHandler)Delegate.Combine(evtChange, value); - } - remove - { - evtChange = (EventHandler)Delegate.Remove(evtChange, value); - if (evtChange == null) - { - base.Control.Change -= ChangeEvent; - } - } - } - - [CLSCompliant(false)] - public override void Initialize(object control) - { - base.Initialize(control); - myTextIndex = new ChoiceTextIndexer(base.Control); - myDataIndex = new ChoiceDataIndexer(base.Control); - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (evtDropDown != null) - { - evtDropDown = (EventHandler)Delegate.Remove(evtDropDown, evtDropDown); - base.Control.DropDown -= DropDownEvent; - } - if (evtDestroy != null) - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); - base.Control.Destroy -= DestroyEvent; - } - if (evtChange != null) - { - evtChange = (EventHandler)Delegate.Remove(evtChange, evtChange); - base.Control.Change -= ChangeEvent; - } - myTextIndex.Dispose(); - myDataIndex.Dispose(); - } - base.Dispose(disposing); - } - - public void Add(string display, object data) - { - base.Control.AddChoice(display, data); - } - - public void Clear() - { - base.Control.Clear(); - } - - public void Remove(int index) - { - base.Control.RemoveChoice(index); - } - - private void DropDownEvent(int ID) - { - if (evtDropDown != null) - { - evtDropDown(this, new ControlEventArgs(ID)); - } - } - - private void ChangeEvent(int ID, int Index) - { - if (evtChange != null) - { - evtChange(this, new IndexChangeEventArgs(ID, Index)); - } - } - - private void DestroyEvent(int ID) - { - if (evtDestroy != null) - { - evtDestroy(this, new ControlEventArgs(ID)); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/CombatState.cs b/Unused/Decal.Adapter.Wrappers/CombatState.cs deleted file mode 100644 index 91e14fa..0000000 --- a/Unused/Decal.Adapter.Wrappers/CombatState.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum CombatState -{ - Peace = 1, - Melee = 2, - Missile = 4, - Magic = 8 -} diff --git a/Unused/Decal.Adapter.Wrappers/ControlRegistry.cs b/Unused/Decal.Adapter.Wrappers/ControlRegistry.cs deleted file mode 100644 index 035e88c..0000000 --- a/Unused/Decal.Adapter.Wrappers/ControlRegistry.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using Decal.Adapter.Support; -using Decal.Interop.Inject; - -namespace Decal.Adapter.Wrappers; - -/// -/// Used for the registration and creation of control wrappers -/// -public static class ControlRegistry -{ - private static Dictionary myWrappers; - - static ControlRegistry() - { - if (myWrappers == null) - { - myWrappers = new Dictionary(); - RegisterControls(Assembly.GetExecutingAssembly()); - } - } - - /// - /// Scans an assembly and registers all of its control wrappers - /// - /// the assembly to scan - public static void RegisterControls(Assembly assembly) - { - Type[] types = assembly.GetTypes(); - foreach (Type type in types) - { - try - { - Type baseType = type.BaseType; - if (!(baseType == null) && baseType.IsGenericType && baseType.GetGenericTypeDefinition() == typeof(ControlWrapperBase<>)) - { - Type key = baseType.GetGenericArguments()[0]; - myWrappers.Add(key, type); - } - } - catch (Exception ex) - { - Util.WriteLine("RegisterControls: " + ex.Message); - } - } - } - - /// - /// Creates a control wrapper for the passed in control - /// - /// the control to wrap - /// the new wrapper - internal static IControlWrapper CreateInstance(IControl control) - { - Util.WriteLine("Creating wrapper for: " + control.GetType()); - Type value; - IControlWrapper controlWrapper = ((!myWrappers.TryGetValue(control.GetType(), out value)) ? new ControlWrapper() : ((IControlWrapper)Activator.CreateInstance(value))); - controlWrapper.Initialize(control); - return controlWrapper; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ControlWrapper.cs b/Unused/Decal.Adapter.Wrappers/ControlWrapper.cs deleted file mode 100644 index 2f32092..0000000 --- a/Unused/Decal.Adapter.Wrappers/ControlWrapper.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Decal.Interop.Inject; - -namespace Decal.Adapter.Wrappers; - -public class ControlWrapper : ControlWrapperBase -{ -} diff --git a/Unused/Decal.Adapter.Wrappers/ControlWrapperBase.cs b/Unused/Decal.Adapter.Wrappers/ControlWrapperBase.cs deleted file mode 100644 index 1b7844d..0000000 --- a/Unused/Decal.Adapter.Wrappers/ControlWrapperBase.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.ComponentModel; -using System.Runtime.InteropServices; -using Decal.Interop.Inject; - -namespace Decal.Adapter.Wrappers; - -public abstract class ControlWrapperBase : MarshalByRefObject, IControlWrapper, IDisposable where T : class -{ - private T myControl; - - private bool isDisposed; - - [EditorBrowsable(EditorBrowsableState.Never)] - public object Underlying => myControl; - - public int Id => ((IControl)myControl).ID; - - public int ChildCount => ((IControl)myControl).ChildCount; - - protected bool Disposed => isDisposed; - - protected T Control => myControl; - - ~ControlWrapperBase() - { - Dispose(disposing: false); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public virtual void Initialize(object control) - { - myControl = control as T; - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public object ChildById(int id) - { - return ((IControl)myControl).get_Child(id, ePositionType.ePositionByID); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public object ChildByIndex(int index) - { - return ((IControl)myControl).get_Child(index, ePositionType.ePositionByIndex); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!isDisposed) - { - } - if (myControl != null) - { - Marshal.ReleaseComObject(myControl); - myControl = null; - } - isDisposed = true; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/CoordsObject.cs b/Unused/Decal.Adapter.Wrappers/CoordsObject.cs deleted file mode 100644 index ae19978..0000000 --- a/Unused/Decal.Adapter.Wrappers/CoordsObject.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class CoordsObject -{ - private double myNorthSouth; - - private double myEastWest; - - /// - /// The north or south component of these coordinates. North is - /// positive and south is negative. - /// - public double NorthSouth => myNorthSouth; - - /// - /// The east or west component of these coordinates. East is positive - /// and west is negative. - /// - public double EastWest => myEastWest; - - public CoordsObject(double northSouth, double eastWest) - { - myNorthSouth = northSouth; - myEastWest = eastWest; - } - - /// - /// Calculates the straight-line distance between these coordinates - /// and the given coordinates. - /// - /// The coordinates to calculate the - /// distance to. - /// The distance between these coordinates and the given - /// coordinates. - public double DistanceToCoords(CoordsObject destination) - { - if (destination == null) - { - throw new ArgumentNullException("destination"); - } - double num = myNorthSouth - destination.myNorthSouth; - double num2 = myEastWest - destination.myEastWest; - return Math.Sqrt(num * num + num2 * num2); - } - - /// - /// Calculates the angle from these coordinates to the given - /// coordinates, in degrees. North is 0, east is 90, south is 180, - /// and west is 270. - /// - /// The coordinates to calculate the - /// angle to. - /// The angle between these coordinates and the given - /// coordinates. - public double AngleToCoords(CoordsObject destination) - { - return 180.0 / Math.PI * AngleToCoordsRadians(destination); - } - - /// - /// Calculates the angle from these coordinates to the given - /// coordinates, in radians. North is 0, east is pi/2, south is pi, - /// and west is 3*pi/2. - /// - /// - /// - public double AngleToCoordsRadians(CoordsObject destination) - { - if (destination == null) - { - throw new ArgumentNullException("destination"); - } - double num = Math.Atan2(destination.myEastWest - myEastWest, destination.myNorthSouth - myNorthSouth); - if (num < 0.0) - { - num += Math.PI * 2.0; - } - return num; - } - - /// Formats the coordinates like "0.0N, 0.0E" - /// The formatted coordinate string. - public override string ToString() - { - return ToString("0.0"); - } - - /// - /// Formats the coordinates using the number style you choose to - /// format the NorthSouth and EastWest numbers. - /// - /// The format for the NorthSouth and - /// EastWest numbers. This can be any format string used by - /// double.ToString(). E.g., use "0.00" for 2-digit precision on - /// the coordinates. - /// The formatted coordinate string. - public string ToString(string numberFormat) - { - return Math.Abs(myNorthSouth).ToString(numberFormat) + ((myNorthSouth >= 0.0) ? "N" : "S") + ", " + Math.Abs(myEastWest).ToString(numberFormat) + ((myEastWest >= 0.0) ? "E" : "W"); - } - - public override bool Equals(object obj) - { - if (obj is CoordsObject) - { - CoordsObject coordsObject = (CoordsObject)obj; - if (coordsObject.myNorthSouth == myNorthSouth) - { - return coordsObject.myEastWest == myEastWest; - } - return false; - } - return false; - } - - public bool Equals(CoordsObject obj) - { - if (obj == null) - { - return false; - } - if (obj.myNorthSouth == myNorthSouth) - { - return obj.myEastWest == myEastWest; - } - return false; - } - - public override int GetHashCode() - { - return myNorthSouth.GetHashCode() ^ myEastWest.GetHashCode(); - } - - public static bool operator ==(CoordsObject a, CoordsObject b) - { - if (object.Equals(a, null)) - { - return object.Equals(b, null); - } - return a.Equals(b); - } - - public static bool operator !=(CoordsObject a, CoordsObject b) - { - return !(a == b); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/CreateObjectEventArgs.cs b/Unused/Decal.Adapter.Wrappers/CreateObjectEventArgs.cs deleted file mode 100644 index 12d221f..0000000 --- a/Unused/Decal.Adapter.Wrappers/CreateObjectEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class CreateObjectEventArgs : EventArgs -{ - private WorldObject myNewObject; - - public WorldObject New => myNewObject; - - internal CreateObjectEventArgs(WorldObject newObject) - { - myNewObject = newObject; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/D3DObj.cs b/Unused/Decal.Adapter.Wrappers/D3DObj.cs deleted file mode 100644 index 83b4116..0000000 --- a/Unused/Decal.Adapter.Wrappers/D3DObj.cs +++ /dev/null @@ -1,414 +0,0 @@ -using Decal.Interop.D3DService; - -namespace Decal.Adapter.Wrappers; - -public class D3DObj : GenericDisposableWrapper -{ - /// - /// Colors - /// - public int Color - { - get - { - return base.Wrapped.color; - } - set - { - base.Wrapped.color = value; - } - } - - public int Color2 - { - get - { - return base.Wrapped.color2; - } - set - { - base.Wrapped.color2 = value; - } - } - - /// - /// Autoscale - /// - public bool Autoscale - { - get - { - return base.Wrapped.autoscale; - } - set - { - base.Wrapped.autoscale = value; - } - } - - /// - /// DrawBackface - /// - public bool DrawBackface - { - get - { - return base.Wrapped.drawBackface; - } - set - { - base.Wrapped.drawBackface = value; - } - } - - /// - /// HBounce - /// - public float HBounce - { - get - { - return base.Wrapped.hBounce; - } - set - { - base.Wrapped.hBounce = value; - } - } - - /// - /// PBounce - /// - public float PBounce - { - get - { - return base.Wrapped.pBounce; - } - set - { - base.Wrapped.pBounce = value; - } - } - - /// - /// PFade - /// - public float PFade - { - get - { - return base.Wrapped.pFade; - } - set - { - base.Wrapped.pFade = value; - } - } - - /// - /// POrbit - /// - public float POrbit - { - get - { - return base.Wrapped.pOrbit; - } - set - { - base.Wrapped.pOrbit = value; - } - } - - /// - /// PSpin - /// - public float PSpin - { - get - { - return base.Wrapped.pSpin; - } - set - { - base.Wrapped.pSpin = value; - } - } - - /// - /// ROrbit - /// - public float ROrbit - { - get - { - return base.Wrapped.rOrbit; - } - set - { - base.Wrapped.rOrbit = value; - } - } - - /// - /// ScaleX - /// - public float ScaleX - { - get - { - return base.Wrapped.scaleX; - } - set - { - base.Wrapped.scaleX = value; - } - } - - /// - /// ScaleY - /// - public float ScaleY - { - get - { - return base.Wrapped.scaleY; - } - set - { - base.Wrapped.scaleY = value; - } - } - - /// - /// ScaleZ - /// - public float ScaleZ - { - get - { - return base.Wrapped.scaleZ; - } - set - { - base.Wrapped.scaleZ = value; - } - } - - /// - /// Visible - /// - public bool Visible - { - get - { - return base.Wrapped.visible; - } - set - { - base.Wrapped.visible = value; - } - } - - /// - /// AnimationPhaseOffset - /// - public float AnimationPhaseOffset - { - get - { - return base.Wrapped.AnimationPhaseOffset; - } - set - { - base.Wrapped.AnimationPhaseOffset = value; - } - } - - public D3DObj(CD3DObj obj) - : base(obj) - { - } - - protected override void Dispose(bool userCalled) - { - base.Dispose(userCalled); - } - - public void Scale(float factor) - { - base.Wrapped.SetScale(factor); - } - - /// - /// Orients to the Camera - /// - /// Vertical Tilt - public void OrientToCamera(bool verticalTilt) - { - base.Wrapped.OrientToCamera(verticalTilt); - } - - /// - /// Orients to the specified Coordinates - /// - /// Latitude - /// Longitude - /// Altitude - /// Vertical Tilt - public void OrientToCoords(float lat, float lng, float alt, bool verticalTilt) - { - base.Wrapped.OrientToCoords(lat, lng, alt, verticalTilt); - } - - /// - /// Orients to the specified Object - /// - /// Object ID - /// Relative Position - /// Vertical Tilt - public void OrientToObject(int guid, float fractHeight, bool verticalTilt) - { - base.Wrapped.OrientToObject(guid, fractHeight, verticalTilt); - } - - /// - /// Orients to the Current Player - /// - /// Vertical Tilt - public void OrientToPlayer(bool verticalTilt) - { - base.Wrapped.OrientToPlayer(verticalTilt); - } - - /// - /// Anchors to the specified Coordinates - /// - /// Latitude - /// Longitude - /// Altitude - public void Anchor(float lat, float lng, float alt) - { - base.Wrapped.AnchorToCoords(lat, lng, alt); - } - - /// - /// Anchors to the specified Object - /// - /// Object ID - /// Height - /// x offset - /// y offset - /// z offset - public void Anchor(int id, float height, float dx, float dy, float dz) - { - base.Wrapped.AnchorToObject(id, height, dx, dy, dz); - } - - /// - /// Displays 2D text using the Arial font - /// - /// Text to display - public void SetText(string text) - { - SetText(D3DTextType.Text2D, text, "Arial", 0); - } - - /// - /// Displays 2D text using the specified font - /// - /// Text to display - /// Font to use - public void SetText(string text, string fontName) - { - SetText(D3DTextType.Text2D, text, fontName, 0); - } - - /// - /// Displays 2D text using the specified font and options - /// - /// Text to display - /// Font to use - /// Options - public void SetText(string text, string fontName, int options) - { - SetText(D3DTextType.Text2D, text, fontName, options); - } - - /// - /// Displays text - /// - /// Type of text (2D/3D) - /// Text to display - /// Font to use - /// Options - public void SetText(D3DTextType type, string text, string fontName, int options) - { - switch (type) - { - case D3DTextType.Text2D: - base.Wrapped.Set2DText(text, fontName, options); - break; - case D3DTextType.Text3D: - base.Wrapped.Set3DText(text, fontName, options); - break; - } - } - - /// - /// Sets the icon to the portal file id - /// - /// portal file id - public void SetIcon(int id) - { - base.Wrapped.SetIcon(id); - } - - /// - /// Sets the icon from the specified file - /// - /// file containing the icon - public void SetIcon(string fileName) - { - base.Wrapped.SetIconFromFile(fileName); - } - - /// - /// Sets the icon from a resource dll - /// - /// module handle of the dll - /// resource id - public void SetIcon(int module, int res) - { - base.Wrapped.SetIconFromResource(module, res); - } - - /// - /// Sets the shape to that specified - /// - /// Shape to use - public void SetShape(D3DShape shape) - { - base.Wrapped.SetShape((eShape)shape); - } - - /// - /// Sets the shape to that contained in the file - /// - /// File containing the shape definition - public void SetShape(string fileName) - { - base.Wrapped.SetShapeFromFile(fileName); - } - - /// - /// Sets the shape from a resource dll - /// - /// module handle of the dll - /// resource id - public void SetShape(int module, int res) - { - base.Wrapped.SetShapeFromResource(module, res); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/D3DService.cs b/Unused/Decal.Adapter.Wrappers/D3DService.cs deleted file mode 100644 index 68d6162..0000000 --- a/Unused/Decal.Adapter.Wrappers/D3DService.cs +++ /dev/null @@ -1,180 +0,0 @@ -using Decal.Interop.D3DService; - -namespace Decal.Adapter.Wrappers; - -public class D3DService : GenericDisposableWrapper -{ - internal D3DService(CService obj) - : base(obj) - { - } - - protected override void Dispose(bool userCalled) - { - base.Dispose(userCalled); - } - - /// - /// Makes a new D3DObj - /// - public D3DObj NewD3DObj() - { - return new D3DObj(base.Wrapped.NewD3DObj()); - } - - /// - /// Creates an arrow that points to an object - /// - /// Object ID - /// Color - public D3DObj PointToObject(int guid, int color) - { - return new D3DObj(base.Wrapped.PointToObject(guid, color)); - } - - /// - /// Creates an arrow that points to specified Coordinates - /// - /// Latitude - /// Longitude - /// Altitude - /// Color - public D3DObj PointToCoords(float lat, float lng, float alt, int color) - { - return new D3DObj(base.Wrapped.PointToCoords(lat, lng, alt, color)); - } - - /// - /// Mark an Object with an Icon - /// - /// Object ID - /// Portal.dat Icon - public D3DObj MarkObjectWithIcon(int guid, int icon) - { - return new D3DObj(base.Wrapped.MarkObjectWithIcon(guid, icon)); - } - - /// - /// Mark an Object with a Shape - /// - /// Object ID - /// D3DShape - /// Color - public D3DObj MarkObjectWithShape(int guid, D3DShape shape, int color) - { - return new D3DObj(base.Wrapped.MarkObjectWithShape(guid, (eShape)shape, color)); - } - - /// - /// Mark an Object with a Shape - /// - /// Object ID - /// Mesh filename - /// Color - public D3DObj MarkObjectWithShapeFromFile(int guid, string filename, int color) - { - return new D3DObj(base.Wrapped.MarkObjectWithShapeFromFile(guid, filename, color)); - } - - /// - /// Mark an Object with 2DText - /// - /// Object ID - /// Text - /// Font - /// zero or more option flags from DecalPlugins::eFontOptions - public D3DObj MarkObjectWith2DText(int guid, string szText, string szFont, int options) - { - return new D3DObj(base.Wrapped.MarkObjectWith2DText(guid, szText, szFont, options)); - } - - /// - /// Mark an Object with 3DText - /// - /// Object ID - /// Text - /// Font - /// zero or more option flags from DecalPlugins::eFontOptions - public D3DObj MarkObjectWith3DText(int guid, string szText, string szFont, int options) - { - return new D3DObj(base.Wrapped.MarkObjectWith3DText(guid, szText, szFont, options)); - } - - /// - /// Mark specified Coordinates with Icon - /// - /// Latitude - /// Longitude - /// Altitude - /// Portal.dat Icon - public D3DObj MarkCoordsWithIcon(float lat, float lng, float alt, int icon) - { - return new D3DObj(base.Wrapped.MarkCoordsWithIcon(lat, lng, alt, icon)); - } - - /// - /// Mark specified Coordinates with Icon - /// - /// Latitude - /// Longitude - /// Altitude - /// Icon filename - public D3DObj MarkCoordsWithIconFromFile(float lat, float lng, float alt, string file) - { - return new D3DObj(base.Wrapped.MarkCoordsWithIconFromFile(lat, lng, alt, file)); - } - - /// - /// Mark specified Coordinates with Shape - /// - /// Latitude - /// Longitude - /// Altitude - /// D3DShape - /// Color - public D3DObj MarkCoordsWithShape(float lat, float lng, float alt, D3DShape shape, int color) - { - return new D3DObj(base.Wrapped.MarkCoordsWithShape(lat, lng, alt, (eShape)shape, color)); - } - - /// - /// Mark specified Coordinates with Shape - /// - /// Latitude - /// Longitude - /// Altitude - /// Mesh filename - /// Color - public D3DObj MarkCoordsWithShapeFromFile(float lat, float lng, float alt, string file, int color) - { - return new D3DObj(base.Wrapped.MarkCoordsWithShapeFromFile(lat, lng, alt, file, color)); - } - - /// - /// Mark specified Coordinates with 2DText - /// - /// Latitude - /// Longitude - /// Altitude - /// Text - /// Font - /// zero or more option flags from DecalPlugins::eFontOptions - public D3DObj MarkCoordsWith2DText(float lat, float lng, float alt, string szText, string szFont, int options) - { - return new D3DObj(base.Wrapped.MarkCoordsWith2DText(lat, lng, alt, szText, szFont, options)); - } - - /// - /// Mark specified Coordinates with 3DText - /// - /// Latitude - /// Longitude - /// Altitude - /// Text - /// Font - /// zero or more option flags from DecalPlugins::eFontOptions - public D3DObj MarkCoordsWith3DText(float lat, float lng, float alt, string szText, string szFont, int options) - { - return new D3DObj(base.Wrapped.MarkCoordsWith3DText(lat, lng, alt, szText, szFont, options)); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/D3DShape.cs b/Unused/Decal.Adapter.Wrappers/D3DShape.cs deleted file mode 100644 index 5dd5c83..0000000 --- a/Unused/Decal.Adapter.Wrappers/D3DShape.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public enum D3DShape -{ - HorizontalArrow, - VerticalArrow, - Ring, - Cylinder, - Sphere, - Cube, - TiltedCube -} diff --git a/Unused/Decal.Adapter.Wrappers/D3DTextType.cs b/Unused/Decal.Adapter.Wrappers/D3DTextType.cs deleted file mode 100644 index 90924de..0000000 --- a/Unused/Decal.Adapter.Wrappers/D3DTextType.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public enum D3DTextType -{ - Text2D, - Text3D -} diff --git a/Unused/Decal.Adapter.Wrappers/DeathEventArgs.cs b/Unused/Decal.Adapter.Wrappers/DeathEventArgs.cs deleted file mode 100644 index 0e9b676..0000000 --- a/Unused/Decal.Adapter.Wrappers/DeathEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class DeathEventArgs : EventArgs -{ - private string myText; - - public string Text => myText; - - internal DeathEventArgs(string text) - { - myText = text; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/DecalWrapper.cs b/Unused/Decal.Adapter.Wrappers/DecalWrapper.cs deleted file mode 100644 index 3bc60e7..0000000 --- a/Unused/Decal.Adapter.Wrappers/DecalWrapper.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.ComponentModel; -using System.Runtime.InteropServices; -using Decal.Adapter.Support; -using Decal.Interop.Core; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class DecalWrapper : MarshalByRefObject, IDisposable -{ - internal static Guid IID_IDISPATCH = new Guid("{00020400-0000-0000-C000-000000000046}"); - - internal static Guid IID_IUNKNOWN = new Guid("{00000000-0000-0000-C000-000000000046}"); - - private DecalCore myDecal; - - private bool isDisposed; - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public DecalCore Underlying => myDecal; - - public IntPtr Hwnd => new IntPtr(myDecal.HWND); - - public bool Focus => myDecal.Focus; - - internal DecalWrapper(DecalCore decal) - { - myDecal = decal; - } - - ~DecalWrapper() - { - Dispose(disposing: false); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool disposing) - { - if (!isDisposed) - { - } - if (myDecal != null) - { - Marshal.ReleaseComObject(myDecal); - myDecal = null; - } - isDisposed = true; - } - - public object GetObject(string path) - { - return GetObject(path, IID_IDISPATCH); - } - - public object GetObject(string path, string iid) - { - return GetObject(path, new Guid(iid)); - } - - public object GetObject(string path, Guid iid) - { - try - { - return ((IDecalCore)myDecal).get_Object(path, ref iid); - } - catch (Exception ex) - { - Util.WriteLine("Exception for {0} during get_Object: {1}", path, ex); - return null; - } - } - - public string MapPath(string path) - { - return myDecal.MapPath(path); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/DeclineTradeEventArgs.cs b/Unused/Decal.Adapter.Wrappers/DeclineTradeEventArgs.cs deleted file mode 100644 index fe3d457..0000000 --- a/Unused/Decal.Adapter.Wrappers/DeclineTradeEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class DeclineTradeEventArgs : EventArgs -{ - private int mTraderId; - - public int TraderId => mTraderId; - - internal DeclineTradeEventArgs(int TraderId) - { - mTraderId = TraderId; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/DoubleValueKey.cs b/Unused/Decal.Adapter.Wrappers/DoubleValueKey.cs deleted file mode 100644 index a4074ef..0000000 --- a/Unused/Decal.Adapter.Wrappers/DoubleValueKey.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public enum DoubleValueKey -{ - SlashProt = 167772160, - PierceProt = 167772161, - BludgeonProt = 167772162, - AcidProt = 167772163, - LightningProt = 167772164, - FireProt = 167772165, - ColdProt = 167772166, - Heading = 167772167, - ApproachDistance = 167772168, - SalvageWorkmanship = 167772169, - Scale = 167772170, - Variance = 167772171, - AttackBonus = 167772172, - Range = 167772173, - DamageBonus = 167772174, - ManaRateOfChange = 5, - MeleeDefenseBonus = 29, - ManaTransferEfficiency = 87, - HealingKitRestoreBonus = 100, - ManaStoneChanceDestruct = 137, - ManaCBonus = 144, - MissileDBonus = 149, - MagicDBonus = 150, - ElementalDamageVersusMonsters = 152 -} diff --git a/Unused/Decal.Adapter.Wrappers/EchoFilter2.cs b/Unused/Decal.Adapter.Wrappers/EchoFilter2.cs deleted file mode 100644 index 0bf2787..0000000 --- a/Unused/Decal.Adapter.Wrappers/EchoFilter2.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using Decal.Adapter.NetParser; -using Decal.Adapter.Support; -using Decal.Interop.Filters; -using Decal.Interop.Net; - -namespace Decal.Adapter.Wrappers; - -public class EchoFilter2 : GenericDisposableWrapper -{ - private event EventHandler serverDispatch; - - private event EventHandler clientDispatch; - - /// - /// Fires when the client receives a message from the server - /// - public event EventHandler ServerDispatch - { - add - { - serverDispatch += value; - } - remove - { - serverDispatch -= value; - } - } - - /// - /// Fires when the client sends a message to the server - /// - public event EventHandler ClientDispatch - { - add - { - clientDispatch += value; - } - remove - { - clientDispatch -= value; - } - } - - public EchoFilter2(Decal.Interop.Filters.EchoFilter2 obj) - : base(obj) - { - base.Wrapped.EchoClient += onEchoClient; - base.Wrapped.EchoServer += onEchoServer; - } - - protected override void Dispose(bool userCalled) - { - if (userCalled && base.Wrapped != null) - { - base.Wrapped.EchoClient -= onEchoClient; - base.Wrapped.EchoServer -= onEchoServer; - } - base.Dispose(userCalled); - } - - private void onEchoServer(IMessage2 pMsg) - { - try - { - Message message = null; - Util.SafeFireEvent(args: new NetworkMessageEventArgs((!(pMsg is MessageWrapper messageWrapper)) ? new Message(pMsg, MessageDirection.Inbound) : messageWrapper.Wrapped), sender: this, eventHandler: this.serverDispatch); - } - catch (Exception ex) - { - Util.WriteLine("Exception in onEchoServer {0}", ex); - } - } - - private void onEchoClient(IMessage2 pMsg) - { - try - { - Message message = null; - Util.SafeFireEvent(args: new NetworkMessageEventArgs((!(pMsg is MessageWrapper messageWrapper)) ? new Message(pMsg, MessageDirection.Inbound) : messageWrapper.Wrapped), sender: this, eventHandler: this.clientDispatch); - } - catch (Exception ex) - { - Util.WriteLine("Exception in onEchoClient {0}", ex); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/EnchantmentWrapper.cs b/Unused/Decal.Adapter.Wrappers/EnchantmentWrapper.cs deleted file mode 100644 index 423d79c..0000000 --- a/Unused/Decal.Adapter.Wrappers/EnchantmentWrapper.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -public class EnchantmentWrapper : MarshalByRefObject, IDisposable -{ - private Enchantment myEnchantment; - - private bool isDisposed; - - public double Adjustment => myEnchantment.Adjustment; - - public int Affected => myEnchantment.Affected; - - public int AffectedMask => myEnchantment.AffectedMask; - - public double Duration => myEnchantment.Duration; - - public int Family => myEnchantment.Family; - - public int Layer => myEnchantment.Layer; - - public int SpellId => myEnchantment.SpellID; - - public int TimeRemaining => myEnchantment.TimeRemaining; - - public DateTime Expires => DateTime.Now.AddSeconds(TimeRemaining); - - internal EnchantmentWrapper(Enchantment enchant) - { - myEnchantment = enchant; - } - - ~EnchantmentWrapper() - { - Dispose(disposing: false); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!isDisposed) - { - } - if (myEnchantment != null) - { - Marshal.ReleaseComObject(myEnchantment); - } - isDisposed = true; - } - - protected void EnforceDisposedOnce() - { - if (isDisposed) - { - throw new ObjectDisposedException("EnchantmentWrapper"); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/EndTradeEventArgs.cs b/Unused/Decal.Adapter.Wrappers/EndTradeEventArgs.cs deleted file mode 100644 index d6c27ca..0000000 --- a/Unused/Decal.Adapter.Wrappers/EndTradeEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class EndTradeEventArgs : EventArgs -{ - private int mReasonId; - - public int ReasonId => mReasonId; - - internal EndTradeEventArgs(int ReasonId) - { - mReasonId = ReasonId; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/EnterTradeEventArgs.cs b/Unused/Decal.Adapter.Wrappers/EnterTradeEventArgs.cs deleted file mode 100644 index 3aa609b..0000000 --- a/Unused/Decal.Adapter.Wrappers/EnterTradeEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class EnterTradeEventArgs : EventArgs -{ - private int mTraderId; - - private int mTradeeId; - - public int TraderId => mTraderId; - - public int TradeeId => mTradeeId; - - internal EnterTradeEventArgs(int TraderId, int TradeeId) - { - mTraderId = TraderId; - mTradeeId = TradeeId; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/FailToAddTradeItemEventArgs.cs b/Unused/Decal.Adapter.Wrappers/FailToAddTradeItemEventArgs.cs deleted file mode 100644 index 81ed4cb..0000000 --- a/Unused/Decal.Adapter.Wrappers/FailToAddTradeItemEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class FailToAddTradeItemEventArgs : EventArgs -{ - private int mItemId; - - private int mReasonId; - - public int ItemId => mItemId; - - public int ReasonId => mReasonId; - - internal FailToAddTradeItemEventArgs(int ItemId, int ReasonId) - { - mItemId = ItemId; - mReasonId = ReasonId; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/FellowshipEventType.cs b/Unused/Decal.Adapter.Wrappers/FellowshipEventType.cs deleted file mode 100644 index 309d061..0000000 --- a/Unused/Decal.Adapter.Wrappers/FellowshipEventType.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum FellowshipEventType -{ - Create, - Quit, - Dismiss, - Recruit, - Disband -} diff --git a/Unused/Decal.Adapter.Wrappers/FontWeight.cs b/Unused/Decal.Adapter.Wrappers/FontWeight.cs deleted file mode 100644 index d2317c5..0000000 --- a/Unused/Decal.Adapter.Wrappers/FontWeight.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -/// -/// FontWeight for use in HUD Rendering -/// -[CLSCompliant(true)] -public enum FontWeight -{ - Black = 900, - Bold = 700, - DemiBold = 600, - DoNotCare = 0, - ExtraBold = 800, - ExtraLight = 200, - Heavy = 900, - Light = 300, - Medium = 500, - Normal = 400, - Regular = 400, - SemiBold = 600, - Thin = 100, - UltraBold = 800, - UltraLight = 200 -} diff --git a/Unused/Decal.Adapter.Wrappers/HookIndexer.cs b/Unused/Decal.Adapter.Wrappers/HookIndexer.cs deleted file mode 100644 index 99360ba..0000000 --- a/Unused/Decal.Adapter.Wrappers/HookIndexer.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Globalization; - -namespace Decal.Adapter.Wrappers; - -/// -/// Support class for HooksWrapper -/// This class -/// -public sealed class HookIndexer : MarshalByRefObject where IndexType : struct, IConvertible -{ - private hookIndexType myIndex; - - private IIndexedValueProvider myWrap; - - public int this[IndexType item] => myWrap.GetIndexedObject(myIndex, item.ToInt32(CultureInfo.InvariantCulture)); - - internal HookIndexer(IIndexedValueProvider wrap, hookIndexType index) - { - myIndex = index; - myWrap = wrap; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/HooksWrapper.cs b/Unused/Decal.Adapter.Wrappers/HooksWrapper.cs deleted file mode 100644 index 32b4790..0000000 --- a/Unused/Decal.Adapter.Wrappers/HooksWrapper.cs +++ /dev/null @@ -1,1138 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Reflection; -using System.Runtime.InteropServices; -using Decal.Interop.Core; - -namespace Decal.Adapter.Wrappers; - -/// -/// Provides direct access to functions and properties in the AC client. -/// -[CLSCompliant(true)] -public sealed class HooksWrapper : MarshalByRefObject, IIndexedValueProvider, IDisposable -{ - private IACHooks myHooks; - - private bool isDisposed; - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public IACHooks Underlying => myHooks; - - /// - /// Gets a value indicating how the player is moving an item, or 0 - /// if the player is not moving an item. There are different values - /// for moving an item, combining/splitting a stack, picking - /// up/dropping an item, etc. - /// - /// - /// Here are some known values for BusyState: - /// 0: Idle. - /// 1: Combining a stack. - /// 2: Splitting a stack. - /// 3: ??? - /// 4: Picking up an item from the ground. - /// 5: Moving or unequipping an item. - /// 6: Dropping an item to the ground. - /// 7: Equipping an item. - /// - public int BusyState => myHooks.BusyState; - - /// - /// Gets the GUID of the object that the player is moving, or 0 if the - /// player is not currently moving any object. - /// - public int BusyStateId => myHooks.BusyStateID; - - /// - /// Returns true if the chat bar at the bottom of the screen - /// currently has keyboard focus. Doesn't apply to floating chat - /// windows. - /// - public bool ChatState => myHooks.ChatState; - - /// - /// Gets a value indicating the player's combat stance. - /// 1 is out of combat mode; - /// 2 is melee attack mode; - /// 4 is missile attack mode; - /// 8 is magic casting mode. - /// - public CombatState CombatMode => (CombatState)myHooks.CombatMode; - - /// - /// Returns a pointer to the CommandInterpreter object - /// - public int CommandInterpreter => myHooks.CommandInterpreter; - - /// - /// Gets or sets the GUID of the selected item. A GUID of 0 indicates - /// no item selected. - /// - public int CurrentSelection - { - get - { - return myHooks.CurrentSelection; - } - set - { - myHooks.CurrentSelection = value; - } - } - - /// - /// Gets or sets the compass heading of the player (in degrees). - /// North is 0, East is 90, etc. Setting the heading will cause the - /// player to turn. - /// - public double Heading - { - get - { - return myHooks.HeadingDegrees; - } - set - { - FaceHeading(value, bUnknown: true); - } - } - - /// - /// Gets or sets the compass heading of the player (in radians). - /// North is 0, East is pi/2, etc. Setting the heading will cause the - /// player to turn. - /// - public double HeadingRadians - { - get - { - return myHooks.HeadingRadians; - } - set - { - RadianFaceHeading(value, bUnknown: true); - } - } - - /// - /// Gets the ID of the player's current landcell (a.k.a. landblock). - /// - /// - /// Here is a description of landblocks from - /// David Simpson's - /// Dereth Cartography, from the header comment in his mapac.c - ///
- /// The map in Asheron's Call is 254 by 254 landblocks. Each landblock contains - /// a 9 by 9 grid of data points which makes for an 8 by 8 group of land squares - /// in game. Each landblock has a unique id, which is a word in length, and - /// has the format xxyyFFFF. In game, xx is the east-west position, and yy is the - /// north-south position. Landblock 0000FFFF is located in the southwest corner of - /// the map. Use /loc to find out which landblock you are on. Each square in a - /// landblock is 0.1 wide and tall, making each landblock 0.8 by 0.8. Although - /// each landblock contains 9 by 9 points, the points on the edges are redundant - /// with adjacent landblocks. The entire map is 2041 by 2041 data points, making - /// 2040 by 2040 squares. Lastly, each square is 24.0 by 24.0 units, whatever - /// they may be. - ///
- ///
- /// - /// This example shows how to calculate coordinates from - /// , , and - /// . North and east are positive, south and - /// west are negative. Round the result to one decimal place to get - /// identical coordinates to the ones AC reports. - /// = 0 ? "N" : "S") + ", " + Math.Abs(EW).ToString("0.0") + (EW >= 0 ? "E" : "W"); - /// ]]> - /// - /// - public int Landcell => myHooks.Landcell; - - /// - /// Gets the player's X-offset within the current landcell, measured in - /// meters. On the landscape, values range from 0 (west side of - /// landcell) to 192 (east side). In dungeons, values are unbounded. - /// - public double LocationX => myHooks.LocationX; - - /// - /// Gets the player's Y-offset within the current landcell, measured in - /// meters. On the landscape, values range from 0 (south side of - /// landcell) to 192 (north side). In dungeons, values are unbounded. - /// - public double LocationY => myHooks.LocationY; - - /// - /// Gets the player's altitude, measured in meters. 0 is sea-level. - /// - public double LocationZ => myHooks.LocationZ; - - /// - /// Gets the total number of items in the currently selected stack. - /// - public int MaxSelectedStackCount => myHooks.MaxSelectedStackCount; - - /// - /// Gets the GUID of the currently opened container, such as a chest or - /// corpse. Returns 0 if no container is currently opened. - /// - public int OpenedContainer => myHooks.OpenedContainer; - - /// - /// Gets the ID of the current mouse pointer graphics. This number - /// corresponds to an image in client_portal.dat. - /// - /// - /// Here are some known values of PointerState: - /// 0x6004D68: Brown idle cursor. - /// 0x6004D69: Brown idle cursor with yellow outline. - /// 0x6004D6A: Red combat mode cursor. - /// 0x6004D6B: Red combat mode cursor with yellow outline. - /// 0x6004D6C: Blue magic mode cursor. - /// 0x6004D6D: Blue magic mode cursor with yellow outline. - /// 0x6004D71: Magnifying glass cursor. - /// 0x6004D72: Hand cursor. - /// 0x6004D74: Hour glass cursor. - /// 0x6004D75: Hour glass cursor with yellow outline. - /// - public int PointerState => myHooks.PointerState; - - /// - /// Gets or sets the GUID of the previously-selected item. Setting - /// this will cause the given GUID to be selected when the user - /// presses the "select previous item" key. - /// - public int PreviousSelection - { - get - { - return myHooks.PreviousSelection; - } - set - { - myHooks.PreviousSelection = value; - } - } - - /// - /// Gets the bounding box of the 3D region in the AC window. The 3D - /// region is the area of the window where landscape and characters - /// are visible. - /// - public Rectangle Region3D - { - get - { - tagRECT aC3DRegionRect = myHooks.AC3DRegionRect; - return new Rectangle(aC3DRegionRect.left, aC3DRegionRect.top, aC3DRegionRect.right, aC3DRegionRect.bottom); - } - } - - /// - /// Gets the bounding box of the entire AC window, including the 2D - /// parts of the GUI. This is the resolution set on the settings tab - /// in AC. - /// - public Rectangle RegionWindow - { - get - { - tagRECT aCWindowRect = myHooks.ACWindowRect; - return new Rectangle(aCWindowRect.left, aCWindowRect.top, aCWindowRect.right, aCWindowRect.bottom); - } - } - - /// - /// Gets or sets the number of items in the currently selected stack. - /// Must be between 1 and . If - /// this is less than , then - /// moving the current selection will split the stack. - /// - public int SelectedStackCount - { - get - { - return myHooks.SelectedStackCount; - } - set - { - myHooks.SelectedStackCount = value; - } - } - - /// - /// Gets the GUID of the currently open vendor, or 0 if no vendor is - /// open. - /// - public int VendorId => myHooks.VendorID; - - /// - /// Gets the level an attribute. "Current" values include buffs, - /// vitae, etc. - /// - [CLSCompliant(false)] - public HookIndexer Attribute => new HookIndexer(this, hookIndexType.Attribute); - - /// - /// Gets the number of times a attribute has been raised above its - /// starting (innate) level. - /// - [CLSCompliant(false)] - public HookIndexer AttributeClicks => new HookIndexer(this, hookIndexType.AttributeClicks); - - /// - /// Gets the starting (innate) level of an attribute. - /// - [CLSCompliant(false)] - public HookIndexer AttributeStart => new HookIndexer(this, hookIndexType.AttributeStart); - - /// - /// Gets the total amount of XP spent on an attribute. - /// - [CLSCompliant(false)] - public HookIndexer AttributeTotalXP => new HookIndexer(this, hookIndexType.AttributeTotalXP); - - /// - /// Gets the value of a hook by its ID. - /// - [CLSCompliant(false)] - public HookIndexer Misc => new HookIndexer(this, hookIndexType.Misc); - - /// - /// Gets the level a skill. "Current" values include buffs, vitae, etc. - /// - [CLSCompliant(false)] - public HookIndexer Skill => new HookIndexer(this, hookIndexType.Skill); - - /// - /// Gets the number of times a skill has been raised above the level - /// calculated from the skill's attribute formula plus free points. - /// - [CLSCompliant(false)] - public HookIndexer SkillClicks => new HookIndexer(this, hookIndexType.SkillClicks); - - /// - /// Gets the number of free points for a skill. Specialized skills - /// have 10 free points. - /// - [CLSCompliant(false)] - public HookIndexer SkillFreePoints => new HookIndexer(this, hookIndexType.SkillFreePoints); - - /// - /// Gets the total amount of XP spent on a skill. - /// - [CLSCompliant(false)] - public HookIndexer SkillTotalXP => new HookIndexer(this, hookIndexType.SkillTotalXP); - - /// - /// Gets the level to which a skill is trained. - /// 0 is untrained; 1 is trained; 2 is specialized. - /// - [CLSCompliant(false)] - public HookIndexer SkillTrainLevel => new HookIndexer(this, hookIndexType.SkillTrainLevel); - - /// - /// Gets the level a vital. "Current" values include buffs, vitae, etc. - /// - [CLSCompliant(false)] - public HookIndexer Vital => new HookIndexer(this, hookIndexType.Vital); - - /// - /// Gets the number of times a vital has been raised above the level - /// calculated from the vital's attribute formula. - /// - [CLSCompliant(false)] - public HookIndexer VitalClicks => new HookIndexer(this, hookIndexType.VitalClicks); - - /// - /// Gets the total amount of XP spent on a vital. - /// - [CLSCompliant(false)] - public HookIndexer VitalTotalXP => new HookIndexer(this, hookIndexType.VitalTotalXP); - - internal HooksWrapper(ACHooks hooks) - { - myHooks = hooks; - } - - ~HooksWrapper() - { - Dispose(disposing: false); - } - - /// - /// Releases the resources used by this HooksWrapper. No plugin or - /// filter should use this function! - /// - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool disposing) - { - if (!isDisposed) - { - } - if (myHooks != null) - { - Marshal.ReleaseComObject(myHooks); - myHooks = null; - } - isDisposed = true; - } - - /// - /// Adds a line of text to the default chat window for the specified - /// text color. - /// - /// The text to add to the chat window. - /// The color ID of the text to add. This also - /// determines in which chat window the text will appear, as per the - /// user's chat settings. - public void AddChatText(string text, int color) - { - AddChatText(text, color, 0); - } - - /// - /// Adds a line of text to the specified chat window. - /// - /// The text to add to the chat window. - /// The color ID of the text to add. - /// The chat window where the text will appear. - /// 0 is the default chat window for the given color, 1 is main - /// chat, and 2-5 are chat tabs #1-4, respectively. - public void AddChatText(string text, int color, int target) - { - myHooks.AddChatText(text, color, target); - } - - /// - /// Adds text to the default chat window for the specified text color. - /// - /// The text to add to the chat window. - /// The color ID of the text to add. This also - /// determines in which chat window the text will appear, as per the - /// user's chat settings. - public void AddChatTextRaw(string text, int color) - { - AddChatTextRaw(text, color, 0); - } - - /// - /// Adds text to the specified chat window. - /// - /// The text to add to the chat window. - /// The color ID of the text to add. - /// The chat window where the text will appear. - /// 0 is the default chat window for the given color, 1 is main - /// chat, and 2-5 are chat tabs #1-4, respectively. - public void AddChatTextRaw(string text, int color, int target) - { - myHooks.AddChatTextRaw(text, color, target); - } - - /// - /// Adds a red status message to the status area at the top of the - /// screen. - /// - /// The status message. - public void AddStatusText(string text) - { - myHooks.AddStatusText(text); - } - - /// - /// Uses one item on another (for crafting, etc.) - /// This command will fail if the player is busy using an item, - /// casting a spell, etc. If you are using multiple items, you must - /// wait until the previous action is complete before attempting to - /// use the next item. - /// - /// The GUID of the item to use. - /// The GUID of the target. - /// - public void ApplyItem(int useThis, int onThis) - { - myHooks.ApplyItem(useThis, onThis); - } - - /// - /// Attempts to wield an item - /// This command will fail if the player is busy using an item, - /// casting a spell, etc. If you are using multiple items, you must - /// wait until the previous action is complete before attempting to - /// use the next item. - /// - /// The GUID of the item to use. - /// - public void AutoWield(int item) - { - myHooks.AutoWield(item); - } - - /// - /// Attempts to wield an item - /// This command will fail if the player is busy using an item, - /// casting a spell, etc. If you are using multiple items, you must - /// wait until the previous action is complete before attempting to - /// use the next item. - /// - /// The GUID of the item to use. - /// The slot to use - /// 1 if explicit placement, 0 if automatic placement - /// 0 if explic is 1, 1 if explic is 0 - /// - public void AutoWield(int item, int slot, int explic, int notexplic) - { - myHooks.AutoWieldEx(item, slot, explic, notexplic); - } - - /// - /// Attempts to wield an item - /// This command will fail if the player is busy using an item, - /// casting a spell, etc. If you are using multiple items, you must - /// wait until the previous action is complete before attempting to - /// use the next item. - /// - /// The GUID of the item to use. - /// The slot to use - /// 1 if explicit placement, 0 if automatic placement - /// 0 if explic is 1, 1 if explic is 0 - /// Zero - /// Zero - /// - public void AutoWield(int item, int slot, int explic, int notexplic, int zero1, int zero2) - { - myHooks.AutoWieldRaw(item, slot, explic, notexplic, zero1, zero2); - } - - /// - /// Causes the player to attempt to cast a spell. The player must be - /// in spellcasting mode and the spell must be in his spellbook. - /// - /// The ID of the spell to cast. - /// The GUID of the target. This is ignored for - /// non-targeted spells, such as self spells and ring spells. - public void CastSpell(int spellId, int objectId) - { - myHooks.CastSpell(spellId, objectId); - } - - /// - /// Drop an item from the player's inventory onto the ground. - /// - /// The GUID of the item to drop. - public void DropItem(int objectId) - { - myHooks.DropItem(objectId); - } - - /// - /// Causes the player to turn to the specified heading. - /// - /// The desired heading (in degrees). - /// Unknown. - /// Always returns true. - public bool FaceHeading(double heading, bool bUnknown) - { - return myHooks.FaceHeading((float)heading, bUnknown); - } - - /// - /// Causes the player to turn to the specified heading. - /// - /// The desired heading (in radians). - /// Unknown - /// - public bool RadianFaceHeading(double heading, bool bUnknown) - { - if (heading < 0.0) - { - throw new ArgumentOutOfRangeException("heading"); - } - if (heading > Math.PI * 10.0) - { - throw new ArgumentOutOfRangeException("heading"); - } - double num = heading * 180.0 / Math.PI; - return myHooks.FaceHeading((float)num, bUnknown); - } - - /// - /// Recruit someone to your fellowship. - /// - /// The GUID of the character to recruit. - public void FellowshipRecruit(int lObjectID) - { - myHooks.FellowshipRecruit(lObjectID); - } - - /// - /// Give fellowship leadership to a player. - /// - /// The GUID of the character to become the leader. - public void FellowshipGrantLeader(int lObjectID) - { - myHooks.FellowshipGrantLeader(lObjectID); - } - - /// - /// Opens or closes the fellowship. - /// - /// True if the fellowship should be made open, false if it should be made closed. - public void FellowshipSetOpen(bool IsOpen) - { - myHooks.FellowshipSetOpen(IsOpen); - } - - /// - /// Quits the current fellowship. - /// - public void FellowshipQuit() - { - myHooks.FellowshipQuit(); - } - - /// - /// Disbands the current fellowship. - /// - public void FellowshipDisband() - { - myHooks.FellowshipDisband(); - } - - /// - /// Dismisses another player from the fellowship. - /// - /// The GUID of the character to remove from the fellowship. - public void FellowshipDismiss(int lObjectID) - { - myHooks.FellowshipDismiss(lObjectID); - } - - /// - /// Gives an object from the player's inventory to another player or - /// NPC. - /// - /// The GUID of the object to give. - /// The GUID of the player or NPC to receive - /// the object. - public void GiveItem(int lObject, int lDestination) - { - myHooks.GiveItem(lObject, lDestination); - } - - /// - /// Adds an identify-request to the end of the request queue. - /// - /// The GUID of the object to request an ID for. - public void RequestId(int objectId) - { - CoreManager.Current.IDQueue.AddToQueueForCaller(objectId, Assembly.GetCallingAssembly(), DateTime.MaxValue); - } - - /// - /// Sends text to AC's chat parser as if the user had typed the text - /// into the chat bar. This text will not be sent to other - /// plugins via the - /// event, so - /// this function cannot be used to send chat commands to other plugins. - /// - /// The text to send. - public void InvokeChatParser(string text) - { - myHooks.InvokeChatParser(text); - } - - /// - /// Checks if the AC client knows about an object GUID. The client - /// must know about an object for it to be used in other HooksWrapper - /// functions. - /// - /// The GUID of the object to check. - /// true if the client knows about an object, or - /// false if not. - public bool IsValidObject(int objectId) - { - return myHooks.IsValidObject(objectId); - } - - /// - /// Logs out the current character and returns to the character - /// selection screen. - /// - public void Logout() - { - myHooks.Logout(); - } - - /// - /// Moves an item to the specified pack in the player's inventory. - /// This command will fail if the player is busy moving an item, - /// casting a spell, etc. If you are moving multiple items, you must - /// wait until the previous action is complete before attempting to - /// move the next item. - /// - /// The GUID of the object to move. - /// The GUID of the destination container. - /// The slot within the pack, where 0 is the first - /// slot. If this number is greater than the number of items in the - /// pack, the object will be placed in the first unused slot in the - /// pack. - /// A flag indicating whether to add the object to - /// a stack in the pack, if one exists. - public void MoveItem(int objectId, int packId, int slot, bool stack) - { - myHooks.MoveItem(objectId, packId, slot, stack); - } - - /// - /// Moves an item to the front of the specified container. If the item - /// is not in the player's inventory, the destination must be the - /// player's main pack (the GUID of the player), or one of his side - /// packs. - /// This command will fail if the player is busy moving an item, - /// casting a spell, etc. If you are moving multiple items, you must - /// wait until the previous action is complete before attempting to - /// move the next item. - /// - /// The GUID of the item to move. - /// The GUID of the destination container. - public void MoveItem(int objectId, int destinationId) - { - myHooks.MoveItemEx(objectId, destinationId); - } - - /// - /// Moves an item to the specified container, with flags indicating - /// how the move should be performed. - /// This command will fail if the player is busy moving an item, - /// casting a spell, etc. If you are moving multiple items, you must - /// wait until the previous action is complete before attempting to - /// move the next item. - /// - /// The GUID of the object to move. - /// The GUID of the destination container. - /// Flags indicating how the move should be - /// performed. - public void MoveItem(int objectId, int destinationId, int moveFlags) - { - myHooks.MoveItemExRaw(objectId, destinationId, moveFlags); - } - - /// - /// Adds a salvagable item to the salvage panel. - /// The salvage panel does not need to be open for this command, - /// but it does need to be open for - /// , and opening the salvage panel - /// after adding items to it will clear the panel. - /// - /// The GUID of the object to add. - public void SalvagePanelAdd(int objectId) - { - myHooks.SalvagePanelAdd(objectId); - } - - /// - /// Salvages the items in the salvage panel. The salvage panel must - /// be open. - /// - public void SalvagePanelSalvage() - { - myHooks.SalvagePanelSalvage(); - } - - /// - /// Selects an item. - /// - /// The GUID of the object to select, or 0 to - /// clear the current selection. - public void SelectItem(int objectId) - { - myHooks.SelectItem(objectId); - } - - /// - /// Turns player's autorun on or off. - /// - /// true to turn on autorun; - /// false to turn it off. - public void SetAutorun(bool on) - { - myHooks.SetAutorun(on); - } - - /// - /// Attempts to put the player in the specified combat stance. The - /// player must be wielding the proper weapon type (melee, bow, - /// magic caster) for the given combat stance. - /// - /// The desired combat stance. - /// 1 is out of combat mode; - /// 2 is melee attack mode; - /// 4 is missile attack mode; - /// 8 is magic casting mode. - public void SetCombatMode(CombatState newMode) - { - myHooks.SetCombatMode((int)newMode); - } - - /// - /// Moves the mouse cursor to the given coordinates, relative to the - /// AC window. - /// - /// The X-coordinate. - /// The Y-coordinate. - public void SetCursorPosition(int x, int y) - { - myHooks.SetCursorPosition(x, y); - } - - /// - /// Sets the amount of time that the player can be idle (no mouse or - /// keyboard input) before AC automatically logs out. The default - /// value is 1200 seconds (20 minutes). - /// - /// The idle timeout (in seconds). - public void SetIdleTime(double timeout) - { - myHooks.SetIdleTime(timeout); - } - - /// - /// Adds a spell to the specified tab on the player's spell bar. The - /// spell must be in the player's spell book. Each spell tab can - /// contain only one copy of each spell. Putting a spell onto a tab - /// that already contains that spell will just move the spell to the - /// new index. - /// - /// - /// This function does not always work if you call it multiple times - /// in a loop. Consider putting the loop in the - /// event of a - /// , and then running the - /// timer for one tick. - /// - /// The zero-based tab index to add the spell. - /// The zero-based slot on the tab to add the spell. - /// If this index is greater than the number of spells on the tab, the - /// spell will be added to the first unused slot. - /// The ID of the spell to be added. - public void SpellTabAdd(int tab, int index, int spellId) - { - myHooks.SpellTabAdd(tab, index, spellId); - } - - /// - /// Removes a spell from the specified tab on the player's spell bar. - /// This function can safely be called multiple times in a row with no - /// time delay between calls. - /// - /// The tab from which to remove the spell. - /// The ID of the spell to be removed. - public void SpellTabDelete(int tab, int spellId) - { - myHooks.SpellTabDelete(tab, spellId); - } - - /// - /// Accepts a trade with another player. - /// - public void TradeAccept() - { - myHooks.TradeAccept(); - } - - /// - /// Adds an object to the trade window with another player. The object - /// must be in the player's inventory. - /// - /// The GUID of the object to add. - public void TradeAdd(int objectId) - { - myHooks.TradeAdd(objectId); - } - - /// - /// Gets a physics object. - /// - /// The ID of the physics object. - /// A pointer to a physics object. - public IntPtr PhysicsObject(int objectId) - { - return new IntPtr(myHooks.GetPhysicsObjectPtr(objectId)); - } - - /// - /// Gets a weenie object. - /// - /// The ID of the weenie object. - /// A pointer to the weenie object. - public IntPtr WeenieObject(int objectId) - { - return new IntPtr(myHooks.GetWeenieObjectPtr(objectId)); - } - - /// - /// Declines (un-accepts) a trade with another player. - /// - public void TradeDecline() - { - myHooks.TradeDecline(); - } - - /// - /// Clears the contents of the trade window. - /// - public void TradeReset() - { - myHooks.TradeReset(); - } - - /// - /// Ends the current trade, leaving the trade window open. - /// - public void TradeEnd() - { - myHooks.TradeEnd(); - } - - /// - /// Gets a UIElement instance. - /// - /// The TypeID of the UIElement instance. - /// A pointer to the UIElement instance. - public IntPtr UIElementLookup(UIElementType pUIElementType) - { - return new IntPtr(myHooks.UIElementLookup((int)pUIElementType)); - } - - /// - /// Sets the position of a UIElement region in the AC window. - /// - /// The TypeID of the UIElement instance. - /// The x-axis position the UIElement instance. - /// The y-axis position of the UIElement instance. - public void UIElementMove(UIElementType pUIElementType, int x, int y) - { - myHooks.UIElementMove((int)pUIElementType, x, y); - } - - /// - /// Sets the position of a UIElement region in the AC window. - /// - /// The TypeID of the UIElement instance. - /// The width of the UIElement instance. - /// The height of the UIElement instance. - public void UIElementResize(UIElementType pUIElementType, int width, int height) - { - myHooks.UIElementResize((int)pUIElementType, width, height); - } - - /// - /// Gets the bounding box of a UIElement region in the AC window. - /// - public Rectangle UIElementRegion(UIElementType pUIElementType) - { - tagRECT tagRECT = myHooks.UIElementRegionRect((int)pUIElementType); - return new Rectangle(tagRECT.left, tagRECT.top, 1 + tagRECT.right - tagRECT.left, 1 + tagRECT.bottom - tagRECT.top); - } - - /// - /// Uses an item, such as a potion, healing kit, etc. - /// - /// - /// This command will fail if the player is busy using an item, - /// casting a spell, etc. If you are using multiple items, you must - /// wait until the previous action is complete before attempting to - /// use the next item. - /// - /// The GUID of the item to use. - /// The purpose of this argument is not - /// entirely known. Valid values appear to be 0 and 1: 0 uses - /// an item by itself (like a potion); 1 uses an item on the current - /// selection. - public void UseItem(int objectId, int useState) - { - myHooks.UseItem(objectId, useState); - } - - /// - /// Uses an item, such as a potion, healing kit, casts the spell on a - /// wand/orb, etc. - /// - /// - /// This command will fail if the player is busy using an item, - /// casting a spell, etc. If you are using multiple items, you must - /// wait until the previous action is complete before attempting to - /// use the next item. - /// - /// The GUID of the item to use. - /// The purpose of this argument is not - /// entirely known. Valid values appear to be 0 and 1: 0 uses - /// an item by itself (like a potion); 1 uses an item on the current - /// selection. - /// The purpose of this argument is not - /// entirely known. It may be a target GUID for wand/orb spells, or - /// some other flag - public void UseItem(int objectId, int useState, int useMethod) - { - myHooks.UseItemRaw(objectId, useState, useMethod); - } - - /// - /// Buys all of the items in the buy-list. The player must have - /// enough pyreals and slots in the main pack to hold all of the items - /// being bought. - /// - public void VendorBuyAll() - { - myHooks.VendorBuyAll(); - } - - /// - /// Adds an item to the list of things to buy from a vendor. A vendor - /// window must be open to use this command. - /// - /// The GUID of the item template or item in - /// the vendor's inventory. Templates are the generic items sold by - /// vendors, such as spell components or trade notes. - /// The number of the specified item to add to the - /// buy-list. - public void VendorAddBuyList(int templateId, int count) - { - myHooks.VendorBuyListAdd(templateId, count); - } - - /// - /// Clears the buy-list. - /// - public void VendorClearBuyList() - { - myHooks.VendorBuyListClear(); - } - - /// - /// Sells all of the items in the sell-list. The player must have - /// enough slots in the main pack to hold all of the stacks of pyreals - /// obtained from the sale. - /// - public void VendorSellAll() - { - myHooks.VendorSellAll(); - } - - /// - /// Adds an item to the list of things to sell to a vendor. A vendor - /// window must be open, and the item must be in the player's inventory. - /// - /// The GUID of the item to add to the sell-list. - public void VendorAddSellList(int itemId) - { - myHooks.VendorSellListAdd(itemId); - } - - /// - /// Clears the sell-list. - /// - public void VendorClearSellList() - { - myHooks.VendorSellListClear(); - } - - /// - /// Spends experience points on a skill. - /// - /// The skill to raise. - /// The number of experience points to spend. - /// Cannot be more than the player's unspent experience. - /// - /// - public void AddSkillExperience(SkillType skill, int experience) - { - myHooks.AddSkillExp((eSkill)skill, experience); - } - - /// - /// Spends experience points on an attribute. - /// - /// The attribute to raise. - /// The number of experience points to spend. - /// Cannot be more than the player's unspent experience. - /// - /// - public void AddAttributeExperience(AttributeType attrib, int experience) - { - myHooks.AddAttributeExp((eAttribute)attrib, experience); - } - - /// - /// Spends experience points on a vital. - /// - /// The vital to raise. - /// The number of experience points to spend. - /// Cannot be more than the player's unspent experience. - /// - /// - public void AddVitalExperience(VitalType vital, int experience) - { - myHooks.AddVitalExp((eVital)vital, experience); - } - - int IIndexedValueProvider.GetIndexedObject(hookIndexType index, int item) - { - int result = 0; - switch (index) - { - case hookIndexType.Attribute: - result = myHooks.get_Attribute(item); - break; - case hookIndexType.AttributeClicks: - result = myHooks.get_AttributeClicks((eAttribute)item); - break; - case hookIndexType.AttributeStart: - result = myHooks.get_AttributeStart((eAttribute)item); - break; - case hookIndexType.AttributeTotalXP: - result = myHooks.get_AttributeTotalXP((eAttribute)item); - break; - case hookIndexType.Skill: - result = myHooks.get_Skill(item); - break; - case hookIndexType.SkillClicks: - result = myHooks.get_SkillClicks((eSkill)item); - break; - case hookIndexType.SkillFreePoints: - result = myHooks.get_SkillFreePoints((eSkill)item); - break; - case hookIndexType.SkillTotalXP: - result = myHooks.get_SkillTotalXP((eSkill)item); - break; - case hookIndexType.SkillTrainLevel: - result = (int)myHooks.get_SkillTrainLevel((eSkill)item); - break; - case hookIndexType.Vital: - result = myHooks.get_Vital(item); - break; - case hookIndexType.VitalClicks: - result = myHooks.get_VitalClicks((eVital)item); - break; - case hookIndexType.VitalTotalXP: - result = myHooks.get_VitalTotalXP((eVital)item); - break; - case hookIndexType.Misc: - result = myHooks.get_Misc(item); - break; - } - return result; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/HostBase.cs b/Unused/Decal.Adapter.Wrappers/HostBase.cs deleted file mode 100644 index 5ca64a3..0000000 --- a/Unused/Decal.Adapter.Wrappers/HostBase.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public abstract class HostBase : MarshalByRefObject, IDisposable -{ - private HooksWrapper myInternalHooks; - - private DecalWrapper myInternalDecal; - - private RenderServiceWrapper myInternalRender; - - private bool isDisposed; - - protected bool IsDisposed => isDisposed; - - protected DecalWrapper MyDecal - { - get - { - return myInternalDecal; - } - set - { - myInternalDecal = value; - } - } - - protected RenderServiceWrapper MyRender - { - get - { - return myInternalRender; - } - set - { - myInternalRender = value; - } - } - - ~HostBase() - { - Dispose(disposing: false); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!isDisposed && disposing) - { - if (myInternalHooks != null) - { - myInternalHooks.Dispose(); - } - if (myInternalDecal != null) - { - myInternalDecal.Dispose(); - } - if (myInternalRender != null) - { - myInternalRender.Dispose(); - } - } - myInternalHooks = null; - myInternalDecal = null; - myInternalRender = null; - isDisposed = true; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/HotkeyEventArgs.cs b/Unused/Decal.Adapter.Wrappers/HotkeyEventArgs.cs deleted file mode 100644 index 105db4f..0000000 --- a/Unused/Decal.Adapter.Wrappers/HotkeyEventArgs.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class HotkeyEventArgs : EventArgs -{ - private string myTitle; - - private bool myEat; - - public string Title => myTitle; - - public bool Eat - { - get - { - return myEat; - } - set - { - myEat = value; - } - } - - internal HotkeyEventArgs(string Title, bool Eat) - { - myTitle = Title; - myEat = Eat; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/HotkeySystem.cs b/Unused/Decal.Adapter.Wrappers/HotkeySystem.cs deleted file mode 100644 index 9652407..0000000 --- a/Unused/Decal.Adapter.Wrappers/HotkeySystem.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System; -using System.ComponentModel; -using System.Runtime.InteropServices; -using Decal.Interop.DHS; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class HotkeySystem : MarshalByRefObject, IDisposable -{ - private Decal.Interop.DHS.HotkeySystem myHKS; - - private bool isDisposed; - - private EventHandler mHotkey; - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public Decal.Interop.DHS.HotkeySystem Underlying => myHKS; - - public event EventHandler Hotkey - { - add - { - mHotkey = (EventHandler)Delegate.Combine(mHotkey, value); - } - remove - { - mHotkey = (EventHandler)Delegate.Remove(mHotkey, value); - } - } - - internal HotkeySystem(Decal.Interop.DHS.HotkeySystem hks) - { - myHKS = hks; - myHKS.HotkeyEvent += myHKS_HotkeyEvent; - } - - ~HotkeySystem() - { - Dispose(disposing: false); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!isDisposed && disposing && myHKS != null) - { - myHKS.HotkeyEvent -= myHKS_HotkeyEvent; - } - if (myHKS != null) - { - Marshal.ReleaseComObject(myHKS); - } - isDisposed = true; - } - - public void AddHotkey(string szPlugin, HotkeyWrapper hotkey) - { - if (hotkey == null) - { - throw new ArgumentNullException("hotkey"); - } - AddHotkey(szPlugin, hotkey.Underlying); - } - - public void AddHotkey(string szPlugin, string szTitle, string szDescription) - { - Hotkey hotkey = new HotkeyClass(); - hotkey.EventTitle = szTitle; - hotkey.EventDescription = szDescription; - AddHotkey(szPlugin, hotkey); - Marshal.ReleaseComObject(hotkey); - } - - public void AddHotkey(string plugin, string title, string description, int virtualKey, bool altState, bool controlState, bool shiftState) - { - Hotkey hotkey = new HotkeyClass(); - hotkey.EventTitle = title; - hotkey.EventDescription = description; - hotkey.VirtualKey = virtualKey; - hotkey.AltState = altState; - hotkey.ControlState = controlState; - hotkey.ShiftState = shiftState; - AddHotkey(plugin, hotkey); - Marshal.ReleaseComObject(hotkey); - } - - private void AddHotkey(string szPlugin, Hotkey hotkey) - { - if (hotkey == null) - { - throw new ArgumentNullException("hotkey"); - } - myHKS.AddHotkey(szPlugin, hotkey); - } - - public void DeleteHotkey(string plugin, string hotkeyName) - { - myHKS.DeleteHotkey(plugin, hotkeyName); - } - - public bool Exists(string hotkeyName) - { - return myHKS.QueryHotkey(hotkeyName); - } - - public HotkeyWrapper GetHotkey(string plugin, string hotkeyName) - { - Hotkey hotkey = myHKS.QueryHotkeyEx(plugin, hotkeyName); - HotkeyWrapper result = null; - if (hotkey != null) - { - result = new HotkeyWrapper(hotkey); - } - return result; - } - - private void myHKS_HotkeyEvent(string szTitle, ref bool Eat) - { - if (mHotkey != null) - { - HotkeyEventArgs e = new HotkeyEventArgs(szTitle, Eat); - mHotkey(this, e); - Eat = e.Eat; - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/HotkeyWrapper.cs b/Unused/Decal.Adapter.Wrappers/HotkeyWrapper.cs deleted file mode 100644 index 432b7d2..0000000 --- a/Unused/Decal.Adapter.Wrappers/HotkeyWrapper.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.ComponentModel; -using System.Runtime.InteropServices; -using Decal.Interop.DHS; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class HotkeyWrapper : MarshalByRefObject, IDisposable -{ - private Hotkey myHotkey; - - private bool isDisposed; - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public Hotkey Underlying => myHotkey; - - public bool AltState => myHotkey.AltState; - - public bool ControlState => myHotkey.ControlState; - - public bool ShiftState => myHotkey.ShiftState; - - public int VirtualKey => myHotkey.VirtualKey; - - public string Title => myHotkey.EventTitle; - - public string Description => myHotkey.EventDescription; - - internal HotkeyWrapper(Hotkey hotkey) - { - myHotkey = hotkey; - } - - public HotkeyWrapper(string title, string description) - : this(new HotkeyClass()) - { - myHotkey.EventTitle = title; - myHotkey.EventDescription = description; - } - - public HotkeyWrapper(string title, string description, int virtualKey, bool altState, bool controlState, bool shiftState) - : this(title, description) - { - myHotkey.VirtualKey = virtualKey; - myHotkey.AltState = altState; - myHotkey.ControlState = controlState; - myHotkey.ShiftState = shiftState; - } - - ~HotkeyWrapper() - { - Dispose(disposing: false); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!isDisposed) - { - } - if (myHotkey != null) - { - Marshal.ReleaseComObject(myHotkey); - } - isDisposed = true; - } - - protected void EnforceDisposedOnce() - { - if (isDisposed) - { - throw new ObjectDisposedException("HotkeyWrapper"); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/Hud.cs b/Unused/Decal.Adapter.Wrappers/Hud.cs deleted file mode 100644 index 1b39cb4..0000000 --- a/Unused/Decal.Adapter.Wrappers/Hud.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using Decal.Interop.Render; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class Hud : HudRenderScalable -{ - private HUDView internalView; - - internal HUDView Underlying => internalView; - - public bool Enabled - { - get - { - return internalView.Enabled; - } - set - { - internalView.Enabled = value; - } - } - - public int Id => internalView.ID; - - /// - /// Angle in Radians for rotation of the HUD - /// - public float Angle - { - get - { - return internalView.Angle; - } - set - { - internalView.Angle = value; - } - } - - /// - /// Alpha for entire hud - /// - public int Alpha - { - get - { - return internalView.Alpha; - } - set - { - internalView.Alpha = value; - } - } - - internal event EventHandler Disposing; - - internal Hud(HUDView view) - : base(view) - { - internalView = view; - } - - public void SetBackground(Background background) - { - if (background != null) - { - internalView.SetBackground(background.Underlying); - return; - } - throw new ArgumentNullException("background"); - } - - protected override void Dispose(bool disposing) - { - try - { - if (disposing && this.Disposing != null) - { - this.Disposing(this, new EventArgs()); - } - Marshal.ReleaseComObject(internalView); - internalView = null; - } - finally - { - base.Dispose(disposing); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/HudRenderScalable.cs b/Unused/Decal.Adapter.Wrappers/HudRenderScalable.cs deleted file mode 100644 index 32ba558..0000000 --- a/Unused/Decal.Adapter.Wrappers/HudRenderScalable.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Drawing; -using Decal.Adapter.Support; -using Decal.Interop.Core; -using Decal.Interop.Render; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class HudRenderScalable : HudRenderTarget -{ - private IRenderScalable myScalable; - - /// - /// Returns the Area scaling has caused the Hud to encompass - /// - public Rectangle ScaleRect => Util.toRectangle(myScalable.ScaleRect); - - /// - /// Scale the width and height of the Hud by the specified value keeping the current position. - /// This will not return 'good' values when using ScaleTo - /// - public float ScaleFactor - { - get - { - return myScalable.ScaleFactor; - } - set - { - myScalable.ScaleFactor = value; - } - } - - /// - /// Specifies whether or not Scaling is occuring (setting to false disables scaling) - /// - public bool Scaling - { - get - { - return myScalable.Scaling; - } - set - { - myScalable.Scaling = value; - } - } - - [CLSCompliant(false)] - protected HudRenderScalable(IRenderScalable newTarget) - : base(newTarget) - { - myScalable = newTarget; - } - - /// - /// Scales the Hud to fill the area specified - /// - /// Area for the Hud to encompass - public void ScaleTo(Rectangle rect) - { - tagRECT pArea = Util.toTagRECT(rect); - myScalable.ScaleTo(ref pArea); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/HudRenderTarget.cs b/Unused/Decal.Adapter.Wrappers/HudRenderTarget.cs deleted file mode 100644 index 1da9d47..0000000 --- a/Unused/Decal.Adapter.Wrappers/HudRenderTarget.cs +++ /dev/null @@ -1,429 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Runtime.InteropServices; -using Decal.Adapter.Support; -using Decal.Interop.Core; -using Decal.Interop.Render; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class HudRenderTarget : MarshalByRefObject, IDisposable -{ - private IRenderTarget myTarget; - - private bool isDisposed; - - private Rectangle areaRect; - - private bool inRender; - - private bool inText; - - public bool Lost => myTarget.Lost; - - [EditorBrowsable(EditorBrowsableState.Never)] - public Rectangle Constraint - { - get - { - Rectangle region = Region; - return new Rectangle(0, 0, region.Width, region.Height); - } - } - - public Rectangle Region - { - get - { - return Util.toRectangle(myTarget.Region); - } - set - { - tagRECT pVal = Util.toTagRECT(value); - myTarget.Region = ref pVal; - areaRect.Width = value.Width; - areaRect.Height = value.Height; - } - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public object UnsafeSurface => myTarget.GetSurface(); - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public tagRECT UnsafeRegion - { - get - { - return myTarget.Region; - } - set - { - myTarget.Region = ref value; - } - } - - protected bool IsDisposed => isDisposed; - - [CLSCompliant(false)] - protected HudRenderTarget(IRenderTarget newTarget) - { - if (newTarget == null) - { - throw new ArgumentNullException("newTarget"); - } - myTarget = newTarget; - tagRECT region = myTarget.Region; - areaRect = new Rectangle(0, 0, region.right - region.left, region.bottom - region.top); - } - - ~HudRenderTarget() - { - Dispose(disposing: false); - } - - /// - /// Begin rendering to this object, must be paired with EndRender - /// - public void BeginRender() - { - BeginRender(enableTextureFilter: false); - } - - /// - /// Begin rendering to this object, must be paired with EndRender - /// - /// True to enable texture filtering during rendering - public void BeginRender(bool enableTextureFilter) - { - if (!inRender) - { - myTarget.BeginRender(enableTextureFilter); - inRender = true; - return; - } - throw new RenderViolationException("Cannot call 'BeginRender' when already rendering"); - } - - /// - /// End rendering to this object, must be paired with BeginRender - /// - public void EndRender() - { - if (inRender) - { - myTarget.EndRender(); - inRender = false; - return; - } - throw new RenderViolationException("Cannot call 'EndRender' without a previous call to 'BeginRender'"); - } - - /// - /// Begin writing text - /// - /// Name of the font to use for writing text - /// Height in pixels to use when writing text - public void BeginText(string fontName, int pixelHeight) - { - BeginText(fontName, pixelHeight, FontWeight.Normal, italic: false); - } - - /// - /// Begin writing text - /// - /// Name of the font to use for writing text - /// Height in pixels to use when writing text - /// Bold, Strong, etc, indicator for text to be written - /// Write text in italics? - public void BeginText(string fontName, int pixelHeight, FontWeight weight, bool italic) - { - UnsafeBeginText(fontName, pixelHeight, (int)weight, italic); - } - - /// - /// Display text,using the full rectangle of the render target as the area. - /// This overload will draw the text in black. - /// - /// Text to display - public void WriteText(string text) - { - WriteText(text, Color.Black, WriteTextFormats.None, areaRect); - } - - /// - /// Display text,using the full rectangle of the render target as the area. - /// - /// Text to display - /// Color to use to display the text. (Including alpha channel) - public void WriteText(string text, Color color) - { - WriteText(text, color, WriteTextFormats.None, areaRect); - } - - /// - /// Display text,using the full rectangle of the render target as the area. - /// - /// Text to display - /// Color to use to display the text. (Including alpha channel) - /// Format specifiers, including centered, etc. - /// Rectangle relative to this object to use to bound the text - public void WriteText(string text, Color color, WriteTextFormats format, Rectangle region) - { - UnsafeWriteText(Util.toTagRECT(region), color.ToArgb(), (int)format, text); - } - - /// - /// Display text,using the full rectangle of the render target as the area. - /// - /// Text to display - /// Color to use to display the text. (Including alpha channel) - /// Format specifiers, including centered, etc. - /// Rectangle relative to this object to use to bound the text - public void WriteText(string text, int color, WriteTextFormats format, Rectangle region) - { - UnsafeWriteText(Util.toTagRECT(region), color, (int)format, text); - } - - /// - /// End drawing of text. - /// - public void EndText() - { - if (inRender && inText) - { - myTarget.EndText(); - inText = false; - return; - } - throw new RenderViolationException("Cannot call 'EndText' without a previous call to 'BeginText'"); - } - - public void Clear() - { - Clear(areaRect); - } - - public void Clear(Rectangle clearArea) - { - UnsafeClear(Util.toTagRECT(clearArea)); - } - - public void DrawPortalImage(int portalFile, Rectangle destinationArea) - { - UnsafeDrawPortalImage(portalFile, Util.toTagRECT(destinationArea)); - } - - public void DrawPortalImage(int portalFile, int alpha, Rectangle srcArea, Rectangle destinationArea) - { - UnsafeDrawPortalImage(portalFile, alpha, Util.toTagRECT(srcArea), Util.toTagRECT(destinationArea)); - } - - public void DrawPortalImage(int portalFile, Rectangle srcArea, Rectangle destinationArea) - { - UnsafeDrawPortalImage(portalFile, 255, Util.toTagRECT(srcArea), Util.toTagRECT(destinationArea)); - } - - public void TilePortalImage(int portalFile, Rectangle destinationArea) - { - UnsafeTilePortalImage(portalFile, Util.toTagRECT(destinationArea)); - } - - public void TilePortalImage(int portalFile, Rectangle srcArea, Rectangle destinationArea) - { - UnsafeTilePortalImage(portalFile, Util.toTagRECT(srcArea), Util.toTagRECT(destinationArea)); - } - - public void DrawImage(Image image, Rectangle destinationRegion) - { - DrawImage(image, destinationRegion, Color.Cyan.ToArgb()); - } - - public void DrawImage(Image image, Rectangle destinationRegion, Color colorKey) - { - DrawImage(image, destinationRegion, colorKey.ToArgb()); - } - - public void DrawImage(Image image, Rectangle destinationRegion, int colorKey) - { - if (image == null) - { - throw new ArgumentNullException("image"); - } - MemoryStream memoryStream = new MemoryStream(); - image.Save(memoryStream, ImageFormat.Bmp); - byte[] buffer = memoryStream.GetBuffer(); - IntPtr zero = IntPtr.Zero; - int num = buffer.Length; - zero = Marshal.AllocCoTaskMem(num); - try - { - Marshal.Copy(buffer, 0, zero, num); - if (zero != IntPtr.Zero) - { - UnsafeDrawImage(zero, num, Util.toTagRECT(destinationRegion), colorKey); - } - } - finally - { - Marshal.FreeCoTaskMem(zero); - memoryStream.Dispose(); - } - } - - public void Fill(Color color) - { - Fill(areaRect, color); - } - - public void Fill(Rectangle fillArea, Color color) - { - Fill(fillArea, color.ToArgb()); - } - - public void Fill(Rectangle fillArea, int color) - { - UnsafeFill(Util.toTagRECT(fillArea), color); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public void UnsafeBeginText(string fontName, int pixelHeight, int weight, bool italic) - { - if (inRender && !inText) - { - myTarget.BeginText(fontName, pixelHeight, weight, italic); - inText = true; - return; - } - if (inRender && inText) - { - throw new RenderViolationException("Cannot call 'BeginText' when already rendering text"); - } - throw new RenderViolationException("Cannot call 'BeginText' outside of a BeginRender/EndRender block"); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public void UnsafeWriteText(tagRECT region, int color, int format, string text) - { - if (inRender && inText) - { - myTarget.WriteText(ref region, color, format, text); - return; - } - throw new RenderViolationException("Cannot call 'WriteText' outside of a BeginText/EndText block"); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public void UnsafeClear(tagRECT clearArea) - { - if (!inRender) - { - myTarget.Clear(ref clearArea); - return; - } - throw new RenderViolationException("MUST call 'Clear' outside of a BeginRender/EndRender block"); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public void UnsafeDrawPortalImage(int portalFile, tagRECT destinationArea) - { - if (inRender) - { - myTarget.DrawPortalImage(portalFile, ref destinationArea); - return; - } - throw new RenderViolationException("Cannot call 'DrawPortalImage' outside of a BeginRender/EndRender block"); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public void UnsafeDrawPortalImage(int portalFile, int alpha, tagRECT srcArea, tagRECT destinationArea) - { - if (inRender) - { - myTarget.DrawPortalImageEx(portalFile, alpha, ref srcArea, ref destinationArea); - return; - } - throw new RenderViolationException("Cannot call 'DrawPortalImageEx' outside of a BeginRender/EndRender block"); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public void UnsafeTilePortalImage(int portalFile, tagRECT destinationArea) - { - if (inRender) - { - myTarget.TilePortalImage(portalFile, ref destinationArea); - return; - } - throw new RenderViolationException("Cannot call 'TilePortalImage' outside of a BeginRender/EndRender block"); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public void UnsafeTilePortalImage(int portalFile, tagRECT srcArea, tagRECT destinationArea) - { - if (inRender) - { - myTarget.TilePortalImageEx(portalFile, ref srcArea, ref destinationArea); - return; - } - throw new RenderViolationException("Cannot call 'TilePortalImageEx' outside of a BeginRender/EndRender block"); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public void UnsafeDrawImage(IntPtr buffer, int size, tagRECT destinationRegion, int colorKey) - { - if (inRender) - { - myTarget.DrawImage((int)buffer, size, ref destinationRegion, colorKey); - return; - } - throw new RenderViolationException("Cannot call 'DrawImage' outside of a BeginRender/EndRender block"); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public void UnsafeFill(tagRECT fillArea, int color) - { - if (!inRender) - { - myTarget.Fill(ref fillArea, color); - return; - } - throw new RenderViolationException("MUST call 'Fill' outside of a BeginRender/EndRender block"); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public void UnsafeSetSurface(object pSurface) - { - myTarget.SetSurface(pSurface); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!isDisposed) - { - } - if (myTarget != null) - { - Marshal.ReleaseComObject(myTarget); - } - myTarget = null; - isDisposed = true; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/IControlWrapper.cs b/Unused/Decal.Adapter.Wrappers/IControlWrapper.cs deleted file mode 100644 index 4f6f80a..0000000 --- a/Unused/Decal.Adapter.Wrappers/IControlWrapper.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.ComponentModel; - -namespace Decal.Adapter.Wrappers; - -public interface IControlWrapper -{ - [EditorBrowsable(EditorBrowsableState.Never)] - object Underlying { get; } - - int Id { get; } - - int ChildCount { get; } - - [EditorBrowsable(EditorBrowsableState.Never)] - void Initialize(object control); - - [EditorBrowsable(EditorBrowsableState.Never)] - object ChildById(int id); - - [EditorBrowsable(EditorBrowsableState.Never)] - object ChildByIndex(int index); -} diff --git a/Unused/Decal.Adapter.Wrappers/IIndexedProvider.cs b/Unused/Decal.Adapter.Wrappers/IIndexedProvider.cs deleted file mode 100644 index 1508b88..0000000 --- a/Unused/Decal.Adapter.Wrappers/IIndexedProvider.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections; - -namespace Decal.Adapter.Wrappers; - -public interface IIndexedProvider -{ - object GetIndexedObject(IndexType index, int item); - - IEnumerator GetEnumerator(IndexType index); - - int Count(IndexType index); -} diff --git a/Unused/Decal.Adapter.Wrappers/IIndexedValueProvider.cs b/Unused/Decal.Adapter.Wrappers/IIndexedValueProvider.cs deleted file mode 100644 index 3be3502..0000000 --- a/Unused/Decal.Adapter.Wrappers/IIndexedValueProvider.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -internal interface IIndexedValueProvider -{ - int GetIndexedObject(hookIndexType index, int item); -} diff --git a/Unused/Decal.Adapter.Wrappers/IViewHandler.cs b/Unused/Decal.Adapter.Wrappers/IViewHandler.cs deleted file mode 100644 index 946a986..0000000 --- a/Unused/Decal.Adapter.Wrappers/IViewHandler.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Reflection; - -namespace Decal.Adapter.Wrappers; - -public interface IViewHandler -{ - ViewWrapper DefaultView { get; } - - BindingFlags BindingFlags { get; } - - void LoadView(string name, string resource); - - ViewWrapper GetView(string name); -} diff --git a/Unused/Decal.Adapter.Wrappers/IndexedCollection.cs b/Unused/Decal.Adapter.Wrappers/IndexedCollection.cs deleted file mode 100644 index f2fc147..0000000 --- a/Unused/Decal.Adapter.Wrappers/IndexedCollection.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; - -namespace Decal.Adapter.Wrappers; - -public sealed class IndexedCollection : MarshalByRefObject, IEnumerable, IEnumerable where InternalIndexType : struct, IConvertible where IndexType : struct, IConvertible -{ - private InternalIndexType myDataType; - - private IIndexedProvider myWrap; - - public RType this[IndexType index] => (RType)myWrap.GetIndexedObject(myDataType, index.ToInt32(CultureInfo.InvariantCulture)); - - public int Count => myWrap.Count(myDataType); - - internal IndexedCollection(IIndexedProvider wrap, InternalIndexType data) - { - myDataType = data; - myWrap = wrap; - } - - IEnumerator IEnumerable.GetEnumerator() - { - return (IEnumerator)myWrap.GetEnumerator(myDataType); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return myWrap.GetEnumerator(myDataType); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ListColumn.cs b/Unused/Decal.Adapter.Wrappers/ListColumn.cs deleted file mode 100644 index 7938f4e..0000000 --- a/Unused/Decal.Adapter.Wrappers/ListColumn.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Drawing; -using Decal.Adapter.Support; - -namespace Decal.Adapter.Wrappers; - -public class ListColumn -{ - private ListWrapper myList; - - private int rowIndex; - - private int colIndex; - - public object this[int subVal] - { - get - { - return myList.get_Data(rowIndex, colIndex, subVal); - } - set - { - myList.set_Data(rowIndex, colIndex, subVal, ref value); - } - } - - public Color Color - { - get - { - return Util.ColorFromBGR(myList.get_Color(rowIndex, colIndex)); - } - set - { - myList.set_Color(rowIndex, colIndex, Util.ColorToBGR(value)); - } - } - - public int Width - { - get - { - return myList.get_ColWidth(colIndex); - } - set - { - myList.set_ColWidth(colIndex, value); - } - } - - internal ListColumn(ListWrapper list, int row, int col) - { - myList = list; - rowIndex = row; - colIndex = col; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ListRow.cs b/Unused/Decal.Adapter.Wrappers/ListRow.cs deleted file mode 100644 index ca0d118..0000000 --- a/Unused/Decal.Adapter.Wrappers/ListRow.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public class ListRow -{ - private ListWrapper myList; - - private int rowIndex; - - private int colCount; - - public ListColumn this[int column] - { - get - { - if (column >= 0 && column < colCount) - { - return new ListColumn(myList, rowIndex, column); - } - return null; - } - } - - internal ListRow(ListWrapper list, int row) - { - myList = list; - rowIndex = row; - colCount = myList.ColCount; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ListWrapper.cs b/Unused/Decal.Adapter.Wrappers/ListWrapper.cs deleted file mode 100644 index c93ad19..0000000 --- a/Unused/Decal.Adapter.Wrappers/ListWrapper.cs +++ /dev/null @@ -1,194 +0,0 @@ -using System; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public class ListWrapper : ControlWrapperBase -{ - private EventHandler evtDestroy; - - private EventHandler evtSelect; - - public ListRow this[int row] - { - get - { - if (row >= 0 && row < base.Control.Count) - { - return new ListRow(this, row); - } - return null; - } - } - - public bool AutoScroll - { - get - { - return base.Control.AutoScroll; - } - set - { - base.Control.AutoScroll = value; - } - } - - public int RowEstimate - { - set - { - base.Control.RowEstimate = value; - } - } - - public int ScrollPosition - { - get - { - return base.Control.ScrollPosition; - } - set - { - base.Control.ScrollPosition = value; - } - } - - public int RowCount => base.Control.Count; - - public int ColCount => base.Control.CountCols; - - public event EventHandler Destroy - { - add - { - if (evtDestroy == null) - { - base.Control.Destroy += DestroyEvent; - } - evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); - } - remove - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); - if (evtDestroy == null) - { - base.Control.Destroy -= DestroyEvent; - } - } - } - - public event EventHandler Selected - { - add - { - if (evtSelect == null) - { - base.Control.Change += SelectEvent; - } - evtSelect = (EventHandler)Delegate.Combine(evtSelect, value); - } - remove - { - evtSelect = (EventHandler)Delegate.Remove(evtSelect, value); - if (evtSelect == null) - { - base.Control.Change -= SelectEvent; - } - } - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (evtDestroy != null) - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); - base.Control.Destroy -= DestroyEvent; - } - if (evtSelect != null) - { - evtSelect = (EventHandler)Delegate.Remove(evtSelect, evtSelect); - base.Control.Change -= SelectEvent; - } - } - base.Dispose(disposing); - } - - internal int AddRow() - { - return base.Control.AddRow(); - } - - internal object get_Data(int row, int col, int subVal) - { - return base.Control.get_Data(col, row, subVal); - } - - internal void set_Data(int row, int col, int subVal, ref object val) - { - base.Control.set_Data(col, row, subVal, ref val); - } - - internal int get_Color(int row, int col) - { - return base.Control.get_Color(col, row); - } - - internal void set_Color(int row, int col, int color) - { - base.Control.set_Color(col, row, color); - } - - internal int get_ColWidth(int col) - { - return base.Control.get_ColumnWidth(col); - } - - internal void set_ColWidth(int col, int width) - { - base.Control.set_ColumnWidth(col, width); - } - - public ListRow Add() - { - return new ListRow(this, AddRow()); - } - - public ListRow Insert(int row) - { - base.Control.InsertRow(row); - return new ListRow(this, row); - } - - public void JumpToPosition(int row) - { - base.Control.JumpToPosition(row); - } - - public void Clear() - { - base.Control.Clear(); - } - - public void Delete(int index) - { - base.Control.DeleteRow(index); - } - - private void SelectEvent(int ID, int Col, int Row) - { - if (evtSelect != null) - { - evtSelect(new ListColumn(this, Row, Col), new ListSelectEventArgs(ID, Row, Col)); - } - } - - private void DestroyEvent(int ID) - { - if (evtDestroy != null) - { - evtDestroy(this, new ControlEventArgs(ID)); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/LoginEventArgs.cs b/Unused/Decal.Adapter.Wrappers/LoginEventArgs.cs deleted file mode 100644 index c8551e5..0000000 --- a/Unused/Decal.Adapter.Wrappers/LoginEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class LoginEventArgs : EventArgs -{ - private int myId; - - public int Id => myId; - - internal LoginEventArgs(int Id) - { - myId = Id; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/LogoffEventArgs.cs b/Unused/Decal.Adapter.Wrappers/LogoffEventArgs.cs deleted file mode 100644 index 9afd010..0000000 --- a/Unused/Decal.Adapter.Wrappers/LogoffEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class LogoffEventArgs : EventArgs -{ - private LogoffEventType myType; - - public LogoffEventType Type => myType; - - internal LogoffEventArgs(LogoffEventType type) - { - myType = type; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/LogoffEventType.cs b/Unused/Decal.Adapter.Wrappers/LogoffEventType.cs deleted file mode 100644 index b976453..0000000 --- a/Unused/Decal.Adapter.Wrappers/LogoffEventType.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum LogoffEventType -{ - Requested, - Authorized -} diff --git a/Unused/Decal.Adapter.Wrappers/LongValueKey.cs b/Unused/Decal.Adapter.Wrappers/LongValueKey.cs deleted file mode 100644 index 502fdca..0000000 --- a/Unused/Decal.Adapter.Wrappers/LongValueKey.cs +++ /dev/null @@ -1,108 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public enum LongValueKey -{ - Type = 218103808, - Icon = 218103809, - Container = 218103810, - Landblock = 218103811, - ItemSlots = 218103812, - PackSlots = 218103813, - StackCount = 218103814, - StackMax = 218103815, - AssociatedSpell = 218103816, - SlotLegacy = 218103817, - Wielder = 218103818, - WieldingSlot = 218103819, - Monarch = 218103820, - Coverage = 218103821, - EquipableSlots = 218103822, - EquipType = 218103823, - IconOutline = 218103824, - MissileType = 218103825, - UsageMask = 218103826, - HouseOwner = 218103827, - HookMask = 218103828, - HookType = 218103829, - Model = 218103830, - Flags = 218103831, - CreateFlags1 = 218103832, - CreateFlags2 = 218103833, - Category = 218103834, - Behavior = 218103835, - MagicDef = 218103836, - SpecialProps = 218103837, - SpellCount = 218103838, - WeapSpeed = 218103839, - EquipSkill = 218103840, - DamageType = 218103841, - MaxDamage = 218103842, - Unknown10 = 218103843, - Unknown100000 = 218103844, - Unknown800000 = 218103845, - Unknown8000000 = 218103846, - PhysicsDataFlags = 218103847, - ActiveSpellCount = 218103848, - IconOverlay = 218103849, - IconUnderlay = 218103850, - Species = 2, - Burden = 5, - EquippedSlots = 10, - RareId = 17, - Value = 19, - TotalValue = 20, - SkillCreditsAvail = 24, - CreatureLevel = 25, - RestrictedToToD = 26, - ArmorLevel = 28, - Rank = 30, - Bonded = 33, - NumberFollowers = 35, - Unenchantable = 36, - LockpickDifficulty = 38, - Deaths = 43, - WandElemDmgType = 45, - MinLevelRestrict = 86, - MaxLevelRestrict = 87, - LockpickSkillBonus = 88, - AffectsVitalId = 89, - AffectsVitalAmt = 90, - HealKitSkillBonus = 90, - UsesTotal = 91, - UsesRemaining = 92, - DateOfBirth = 98, - Workmanship = 105, - Spellcraft = 106, - CurrentMana = 107, - MaximumMana = 108, - LoreRequirement = 109, - RankRequirement = 110, - PortalRestrictions = 111, - Gender = 113, - Attuned = 114, - SkillLevelReq = 115, - ManaCost = 117, - Age = 125, - XPForVPReduction = 129, - Material = 131, - WieldReqType = 158, - WieldReqAttribute = 159, - WieldReqValue = 160, - SlayerSpecies = 166, - NumberItemsSalvagedFrom = 170, - NumberTimesTinkered = 171, - DescriptionFormat = 172, - PagesUsed = 174, - PagesTotal = 175, - ActivationReqSkillId = 176, - GemSettingQty = 177, - GemSettingType = 178, - Imbued = 179, - Heritage = 188, - FishingSkill = 192, - KeysHeld = 193, - ElementalDmgBonus = 204, - CleaveType = 263, - ArmorSet = 265, - Slot = 231735296 -} diff --git a/Unused/Decal.Adapter.Wrappers/MoveObjectEventArgs.cs b/Unused/Decal.Adapter.Wrappers/MoveObjectEventArgs.cs deleted file mode 100644 index 35ea2f3..0000000 --- a/Unused/Decal.Adapter.Wrappers/MoveObjectEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class MoveObjectEventArgs : EventArgs -{ - private WorldObject myMovedObject; - - public WorldObject Moved => myMovedObject; - - internal MoveObjectEventArgs(WorldObject movedObject) - { - myMovedObject = movedObject; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/NetServiceHost.cs b/Unused/Decal.Adapter.Wrappers/NetServiceHost.cs deleted file mode 100644 index ae3916a..0000000 --- a/Unused/Decal.Adapter.Wrappers/NetServiceHost.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.ComponentModel; -using Decal.Interop.Net; - -namespace Decal.Adapter.Wrappers; - -public sealed class NetServiceHost : HostBase -{ - private NetService myService; - - [EditorBrowsable(EditorBrowsableState.Never)] - public NetService Underlying => myService; - - public DecalWrapper Decal - { - get - { - if (base.MyDecal == null) - { - base.MyDecal = new DecalWrapper(myService.Decal); - } - return base.MyDecal; - } - } - - public HooksWrapper Actions => CoreManager.Current.Actions; - - internal NetServiceHost(NetService svc) - { - myService = svc; - base.MyDecal = new DecalWrapper(myService.Decal); - } - - public object GetComFilter(string progId) - { - return ((INetService)myService).get_FilterVB(progId); - } - - public object GetComFilter(Guid clsid, Guid riid) - { - return ((INetService)myService).get_Filter(ref clsid, ref riid); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/NotebookWrapper.cs b/Unused/Decal.Adapter.Wrappers/NotebookWrapper.cs deleted file mode 100644 index e507033..0000000 --- a/Unused/Decal.Adapter.Wrappers/NotebookWrapper.cs +++ /dev/null @@ -1,117 +0,0 @@ -using System; -using Decal.Interop.Controls; -using Decal.Interop.Inject; - -namespace Decal.Adapter.Wrappers; - -public class NotebookWrapper : ControlWrapperBase -{ - private EventHandler evtDestroy; - - private EventHandler evtChange; - - private PageTextIndexer myPageIndex; - - public int ActiveTab - { - get - { - return base.Control.ActiveTab; - } - set - { - base.Control.ActiveTab = value; - } - } - - public PageTextIndexer PageText => myPageIndex; - - public event EventHandler Destroy - { - add - { - if (evtDestroy == null) - { - base.Control.Destroy += DestroyEvent; - } - evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); - } - remove - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); - if (evtDestroy == null) - { - base.Control.Destroy -= DestroyEvent; - } - } - } - - public event EventHandler Change - { - add - { - if (evtChange == null) - { - base.Control.Change += ChangeEvent; - } - evtChange = (EventHandler)Delegate.Combine(evtChange, value); - } - remove - { - evtChange = (EventHandler)Delegate.Remove(evtChange, value); - if (evtChange == null) - { - base.Control.Change -= ChangeEvent; - } - } - } - - public override void Initialize(object control) - { - base.Initialize(control); - myPageIndex = new PageTextIndexer(base.Control); - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (evtDestroy != null) - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); - base.Control.Destroy -= DestroyEvent; - } - if (evtChange != null) - { - evtChange = (EventHandler)Delegate.Remove(evtChange, evtChange); - base.Control.Change -= ChangeEvent; - } - if (myPageIndex != null) - { - myPageIndex.Dispose(); - } - } - base.Dispose(disposing); - } - - public void AddPage(string text, IControl control) - { - base.Control.AddPage(text, control); - } - - private void ChangeEvent(int ID, int Index) - { - if (evtChange != null) - { - evtChange(this, new IndexChangeEventArgs(ID, Index)); - } - } - - private void DestroyEvent(int ID) - { - if (evtDestroy != null) - { - evtDestroy(this, new ControlEventArgs(ID)); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ObjectClass.cs b/Unused/Decal.Adapter.Wrappers/ObjectClass.cs deleted file mode 100644 index f87c6a4..0000000 --- a/Unused/Decal.Adapter.Wrappers/ObjectClass.cs +++ /dev/null @@ -1,49 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public enum ObjectClass -{ - Unknown, - MeleeWeapon, - Armor, - Clothing, - Jewelry, - Monster, - Food, - Money, - Misc, - MissileWeapon, - Container, - Gem, - SpellComponent, - Key, - Portal, - TradeNote, - ManaStone, - Plant, - BaseCooking, - BaseAlchemy, - BaseFletching, - CraftedCooking, - CraftedAlchemy, - CraftedFletching, - Player, - Vendor, - Door, - Corpse, - Lifestone, - HealingKit, - Lockpick, - WandStaffOrb, - Bundle, - Book, - Journal, - Sign, - Housing, - Npc, - Foci, - Salvage, - Ust, - Services, - Scroll, - NumObjectClasses -} diff --git a/Unused/Decal.Adapter.Wrappers/PageTextIndexer.cs b/Unused/Decal.Adapter.Wrappers/PageTextIndexer.cs deleted file mode 100644 index fef8159..0000000 --- a/Unused/Decal.Adapter.Wrappers/PageTextIndexer.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public sealed class PageTextIndexer : IDisposable -{ - private NotebookClass myControl; - - public string this[int index] - { - get - { - return myControl.get_PageText(index); - } - set - { - myControl.set_PageText(index, value); - } - } - - internal PageTextIndexer(NotebookClass control) - { - myControl = control; - } - - public void Dispose() - { - myControl = null; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/PlayerModifyEventType.cs b/Unused/Decal.Adapter.Wrappers/PlayerModifyEventType.cs deleted file mode 100644 index ff5eb5e..0000000 --- a/Unused/Decal.Adapter.Wrappers/PlayerModifyEventType.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum PlayerModifyEventType -{ - Skill, - Attribute, - Vital, - Statistic, - Allegiance, - Augmentation -} diff --git a/Unused/Decal.Adapter.Wrappers/PlayerXPEventType.cs b/Unused/Decal.Adapter.Wrappers/PlayerXPEventType.cs deleted file mode 100644 index 6418f1e..0000000 --- a/Unused/Decal.Adapter.Wrappers/PlayerXPEventType.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum PlayerXPEventType -{ - Total, - Unassigned -} diff --git a/Unused/Decal.Adapter.Wrappers/PluginHost.cs b/Unused/Decal.Adapter.Wrappers/PluginHost.cs deleted file mode 100644 index 82b8ca9..0000000 --- a/Unused/Decal.Adapter.Wrappers/PluginHost.cs +++ /dev/null @@ -1,202 +0,0 @@ -using System; -using System.ComponentModel; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Xml; -using Decal.Interop.Core; -using Decal.Interop.Inject; -using Decal.Interop.Render; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public sealed class PluginHost : HostBase -{ - private IPluginSite2 mySite; - - private IPluginSite myOldSite; - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public IPluginSite2 Underlying => mySite; - - /// - /// Wrapped Decal OM - /// - public DecalWrapper Decal - { - get - { - if (base.MyDecal == null) - { - base.MyDecal = new DecalWrapper(mySite.Decal); - } - return base.MyDecal; - } - } - - /// - /// Wrapped version of the ACHooks interface - /// - public HooksWrapper Actions => CoreManager.Current.Actions; - - /// - /// Wrapped version of the DecalRenderService - /// - public RenderServiceWrapper Render - { - get - { - if (base.MyRender == null) - { - base.MyRender = new RenderServiceWrapper((RenderService)GetObject("services\\DecalRender.RenderService")); - } - return base.MyRender; - } - } - - internal PluginHost(PluginSite2 pSite) - { - mySite = pSite; - base.MyDecal = new DecalWrapper(mySite.Decal); - myOldSite = (IPluginSite)mySite.PluginSite; - } - - protected override void Dispose(bool disposing) - { - try - { - _ = base.IsDisposed; - if (myOldSite != null) - { - Marshal.ReleaseComObject(myOldSite); - myOldSite = null; - } - if (mySite != null) - { - Marshal.ReleaseComObject(mySite); - mySite = null; - } - } - finally - { - base.Dispose(disposing); - } - } - - /// - /// Function to get a COM object by path from Decal. - /// - /// The decal services path to resolve the COM object - /// instance of the object requested - public object GetObject(string path) - { - return mySite.get_Object(path); - } - - /// - /// Get Mapped Keyboard Key - /// - /// Name to retrive mapping for. - /// Mapped Key - public int GetKeyboardMapping(string name) - { - return myOldSite.QueryKeyboardMap(name); - } - - /// - /// Initializes an already exisint viewhandler (plugins) - /// - /// the handler to init - internal static void LoadViewHandler(IViewHandler handler) - { - if (ViewWrapper.ScanViews(handler)) - { - ViewWrapper.ScanControls(handler); - ViewWrapper.ScanReferences(handler); - } - } - - /// - /// Load a view handler of the specified type - /// - /// type of handler to load - /// the new handler - public ViewHandler LoadViewHandler(Type handlerType) - { - ViewHandler obj = (ViewHandler)Activator.CreateInstance(handlerType, this); - LoadViewHandler(obj); - obj.LoadComplete(); - return obj; - } - - /// - /// Load a view in the current assembly using the specified resource - /// - /// path of the embedded view xml resource - /// the new view - public ViewWrapper LoadViewResource(string resourcePath) - { - Assembly callingAssembly = Assembly.GetCallingAssembly(); - return LoadViewResource(resourcePath, callingAssembly); - } - - /// - /// Load a view in the specified assembly using the specified resource - /// - /// path of the embedded view xml resource - /// assembly containing the resource - /// the new view - public ViewWrapper LoadViewResource(string resourcePath, Assembly resourceAssembly) - { - if (null == resourceAssembly) - { - throw new ArgumentNullException("resourceAssembly"); - } - Stream manifestResourceStream = resourceAssembly.GetManifestResourceStream(resourcePath); - XmlDocument xmlDocument = new XmlDocument(); - xmlDocument.Load(manifestResourceStream); - return LoadView(xmlDocument.OuterXml); - } - - /// - /// Load a view from the specified XML element - /// - /// XmlElement containing the view schema - /// the new view - public ViewWrapper LoadView(XmlElement viewSchema) - { - if (viewSchema == null) - { - throw new ArgumentNullException("viewSchema"); - } - return LoadView(viewSchema.OuterXml); - } - - /// - /// Load a view from the specified XML string - /// - /// string containing the view schema - /// the new view - public ViewWrapper LoadView(string viewSchema) - { - View view = myOldSite.LoadView(viewSchema); - if (view != null) - { - return new ViewWrapper(view); - } - return null; - } - - /// - /// Get a COM based filter object. - /// (Similar to GetObject, but requires only ProgID instead of full path) - /// - /// - /// - public object ComFilter(string progId) - { - return mySite.get_Object("services\\DecalNet.NetService\\" + progId); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/PortalEventType.cs b/Unused/Decal.Adapter.Wrappers/PortalEventType.cs deleted file mode 100644 index ded6cfe..0000000 --- a/Unused/Decal.Adapter.Wrappers/PortalEventType.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum PortalEventType -{ - EnterPortal, - ExitPortal -} diff --git a/Unused/Decal.Adapter.Wrappers/ProgressWrapper.cs b/Unused/Decal.Adapter.Wrappers/ProgressWrapper.cs deleted file mode 100644 index b7b7e44..0000000 --- a/Unused/Decal.Adapter.Wrappers/ProgressWrapper.cs +++ /dev/null @@ -1,211 +0,0 @@ -using System; -using System.Drawing; -using Decal.Adapter.Support; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public class ProgressWrapper : ControlWrapperBase -{ - private EventHandler evtDestroy; - - private string alignment; - - private Color borderColor; - - private int borderWidth; - - private bool drawText; - - private Color faceColor; - - private Color fillColor; - - private int maxValue; - - private string preText; - - private string postText; - - private Color textColor; - - public string Alignment - { - get - { - return alignment; - } - set - { - alignment = value; - base.Control.Alignment = value; - } - } - - public Color BorderColor - { - get - { - return borderColor; - } - set - { - borderColor = value; - base.Control.BorderColor = Util.ColorToBGR(value); - } - } - - public int BorderWidth - { - get - { - return borderWidth; - } - set - { - borderWidth = value; - base.Control.BorderWidth = value; - } - } - - public bool DrawText - { - get - { - return drawText; - } - set - { - drawText = value; - base.Control.DecalDrawText = value; - } - } - - public Color FaceColor - { - get - { - return faceColor; - } - set - { - faceColor = value; - base.Control.FaceColor = Util.ColorToBGR(value); - } - } - - public Color FillColor - { - get - { - return fillColor; - } - set - { - fillColor = value; - base.Control.FillColor = Util.ColorToBGR(value); - } - } - - public int MaxValue - { - get - { - return maxValue; - } - set - { - maxValue = value; - base.Control.MaxValue = value; - } - } - - public string PostText - { - get - { - return postText; - } - set - { - postText = value; - base.Control.PostText = value; - } - } - - public string PreText - { - get - { - return preText; - } - set - { - preText = value; - base.Control.PreText = value; - } - } - - public Color TextColor - { - get - { - return textColor; - } - set - { - textColor = value; - base.Control.TextColor = Util.ColorToBGR(value); - } - } - - public int Value - { - get - { - return base.Control.Value; - } - set - { - base.Control.Value = value; - } - } - - public event EventHandler Destroy - { - add - { - if (evtDestroy == null) - { - base.Control.Destroy += DestroyEvent; - } - evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); - } - remove - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); - if (evtDestroy == null) - { - base.Control.Destroy -= DestroyEvent; - } - } - } - - protected override void Dispose(bool disposing) - { - if (disposing && evtDestroy != null) - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); - base.Control.Destroy -= DestroyEvent; - } - base.Dispose(disposing); - } - - private void DestroyEvent(int ID) - { - if (evtDestroy != null) - { - evtDestroy(this, new ControlEventArgs(ID)); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/PushButtonWrapper.cs b/Unused/Decal.Adapter.Wrappers/PushButtonWrapper.cs deleted file mode 100644 index 04861c6..0000000 --- a/Unused/Decal.Adapter.Wrappers/PushButtonWrapper.cs +++ /dev/null @@ -1,228 +0,0 @@ -using System; -using System.Drawing; -using Decal.Adapter.Support; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public class PushButtonWrapper : ControlWrapperBase -{ - private EventHandler evtClick; - - private EventHandler evtCancel; - - private EventHandler evtDestroy; - - private EventHandler evtHit; - - private EventHandler evtUnhit; - - public Color FaceColor - { - get - { - return Util.ColorFromBGR(base.Control.FaceColor); - } - set - { - base.Control.FaceColor = Util.ColorToBGR(value); - } - } - - public Color TextColor - { - get - { - return Util.ColorFromBGR(base.Control.TextColor); - } - set - { - base.Control.TextColor = Util.ColorToBGR(value); - } - } - - public string Text - { - get - { - return base.Control.Text; - } - set - { - base.Control.Text = value; - } - } - - public event EventHandler Click - { - add - { - if (evtClick == null) - { - base.Control.Accepted += ClickEvent; - } - evtClick = (EventHandler)Delegate.Combine(evtClick, value); - } - remove - { - evtClick = (EventHandler)Delegate.Remove(evtClick, value); - if (evtClick == null) - { - base.Control.Accepted -= ClickEvent; - } - } - } - - public event EventHandler Canceled - { - add - { - if (evtCancel == null) - { - base.Control.Canceled += CanceledEvent; - } - evtCancel = (EventHandler)Delegate.Combine(evtCancel, value); - } - remove - { - evtCancel = (EventHandler)Delegate.Remove(evtCancel, value); - if (evtCancel == null) - { - base.Control.Canceled -= CanceledEvent; - } - } - } - - public event EventHandler Destroy - { - add - { - if (evtDestroy == null) - { - base.Control.Destroy += DestroyEvent; - } - evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); - } - remove - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); - if (evtDestroy == null) - { - base.Control.Destroy -= DestroyEvent; - } - } - } - - public event EventHandler Hit - { - add - { - if (evtHit == null) - { - base.Control.Hit += HitEvent; - } - evtHit = (EventHandler)Delegate.Combine(evtHit, value); - } - remove - { - evtHit = (EventHandler)Delegate.Remove(evtHit, value); - if (evtHit == null) - { - base.Control.Hit -= HitEvent; - } - } - } - - public event EventHandler Unhit - { - add - { - if (evtUnhit == null) - { - base.Control.Unhit += UnhitEvent; - } - evtUnhit = (EventHandler)Delegate.Combine(evtUnhit, value); - } - remove - { - evtUnhit = (EventHandler)Delegate.Remove(evtUnhit, value); - if (evtUnhit == null) - { - base.Control.Unhit -= UnhitEvent; - } - } - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (evtClick != null) - { - evtClick = (EventHandler)Delegate.Remove(evtClick, evtClick); - base.Control.Accepted -= ClickEvent; - } - if (evtCancel != null) - { - evtCancel = (EventHandler)Delegate.Remove(evtCancel, evtCancel); - base.Control.Canceled -= CanceledEvent; - } - if (evtDestroy != null) - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); - base.Control.Destroy -= DestroyEvent; - } - if (evtHit != null) - { - evtHit = (EventHandler)Delegate.Remove(evtHit, evtHit); - base.Control.Hit -= HitEvent; - } - if (evtUnhit != null) - { - evtUnhit = (EventHandler)Delegate.Remove(evtUnhit, evtUnhit); - base.Control.Unhit -= UnhitEvent; - } - } - base.Dispose(disposing); - } - - private void ClickEvent(int ID) - { - if (evtClick != null) - { - evtClick(this, new ControlEventArgs(ID)); - } - } - - private void UnhitEvent(int ID) - { - if (evtUnhit != null) - { - evtUnhit(this, new ControlEventArgs(ID)); - } - } - - private void HitEvent(int ID) - { - if (evtHit != null) - { - evtHit(this, new ControlEventArgs(ID)); - } - } - - private void DestroyEvent(int ID) - { - if (evtDestroy != null) - { - evtDestroy(this, new ControlEventArgs(ID)); - } - } - - private void CanceledEvent(int ID) - { - if (evtCancel != null) - { - evtCancel(this, new ControlEventArgs(ID)); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ReleaseObjectEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ReleaseObjectEventArgs.cs deleted file mode 100644 index ef9f8f9..0000000 --- a/Unused/Decal.Adapter.Wrappers/ReleaseObjectEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ReleaseObjectEventArgs : EventArgs -{ - private WorldObject mWO; - - public WorldObject Released => mWO; - - internal ReleaseObjectEventArgs(WorldObject releasedObject) - { - mWO = releasedObject; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/RenderServiceWrapper.cs b/Unused/Decal.Adapter.Wrappers/RenderServiceWrapper.cs deleted file mode 100644 index bf764c8..0000000 --- a/Unused/Decal.Adapter.Wrappers/RenderServiceWrapper.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Runtime.InteropServices; -using Decal.Adapter.Support; -using Decal.Interop.Core; -using Decal.Interop.Inject; -using Decal.Interop.Render; - -namespace Decal.Adapter.Wrappers; - -/// -/// RenderServiceWrapper is a wrapper for RenderService -/// -[CLSCompliant(true)] -public class RenderServiceWrapper : MarshalByRefObject, IDisposable -{ - private RenderService internalRender; - - private bool isDisposed; - - private EventHandler myDeviceLost; - - [EditorBrowsable(EditorBrowsableState.Never)] - public object UnsafeDevice => internalRender.Device; - - internal event EventHandler DeviceLost - { - add - { - myDeviceLost = (EventHandler)Delegate.Combine(myDeviceLost, value); - } - remove - { - myDeviceLost = (EventHandler)Delegate.Combine(myDeviceLost, value); - } - } - - internal RenderServiceWrapper(RenderService render) - { - internalRender = render; - internalRender.DeviceLost += internalRender_DeviceLost; - } - - ~RenderServiceWrapper() - { - Dispose(disposing: false); - } - - private void internalRender_DeviceLost() - { - if (myDeviceLost != null) - { - myDeviceLost(this, new EventArgs()); - } - } - - private void myHUD_Disposing(object sender, EventArgs e) - { - if (sender is Hud hud) - { - RemoveHud(hud); - hud.Disposing -= myHUD_Disposing; - } - } - - /// - /// Create a new Background object to be used as a background in HUDS - /// - /// The rectangle to use for the size of the background - /// Newly created and wrapped RenderService.HUDBackground - public Background CreateBackground(Rectangle region) - { - return UnsafeCreateBackground(Util.toTagRECT(region)); - } - - /// - /// Create a new HUD. New huds need to be made visible before they render. - /// - /// Size and location of where the HUD should be rendered - /// Newly created and wrapped RenderService.HUDView - public Hud CreateHud(Rectangle region) - { - return UnsafeCreateHud(Util.toTagRECT(region)); - } - - /// - /// Remove a HUD from the render pipeline - /// - /// HUD To remove - public void RemoveHud(Hud hud) - { - if (hud == null) - { - throw new ArgumentNullException("hud"); - } - internalRender.RemoveHUD(hud.Underlying); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public Background UnsafeCreateBackground(tagRECT pRegion) - { - return new Background(internalRender.CreateBackground(ref pRegion)); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public Hud UnsafeCreateHud(tagRECT pRegion) - { - Hud hud = new Hud(internalRender.CreateHUD(ref pRegion)); - hud.Disposing += myHUD_Disposing; - return hud; - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public Background EncapsulateBackground(tagPOINT coordinates, object surface) - { - return new Background(internalRender.EncapsulateBackground(ref coordinates, surface)); - } - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public Hud EncapsulateHud(tagPOINT coordinates, object surface) - { - return new Hud(internalRender.EncapsulateHUD(ref coordinates, surface)); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!isDisposed && disposing) - { - internalRender.DeviceLost -= internalRender_DeviceLost; - } - if (internalRender != null) - { - Marshal.ReleaseComObject(internalRender); - } - internalRender = null; - isDisposed = true; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ResetTradeEventArgs.cs b/Unused/Decal.Adapter.Wrappers/ResetTradeEventArgs.cs deleted file mode 100644 index 129f73b..0000000 --- a/Unused/Decal.Adapter.Wrappers/ResetTradeEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class ResetTradeEventArgs : EventArgs -{ - private int mTraderId; - - public int TraderId => mTraderId; - - internal ResetTradeEventArgs(int TraderId) - { - mTraderId = TraderId; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/SettingsEventArgs.cs b/Unused/Decal.Adapter.Wrappers/SettingsEventArgs.cs deleted file mode 100644 index 81b115c..0000000 --- a/Unused/Decal.Adapter.Wrappers/SettingsEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class SettingsEventArgs : EventArgs -{ - private int mySetting; - - public int Setting => mySetting; - - internal SettingsEventArgs(int Setting) - { - mySetting = Setting; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/SkillInfoWrapper.cs b/Unused/Decal.Adapter.Wrappers/SkillInfoWrapper.cs deleted file mode 100644 index b292a03..0000000 --- a/Unused/Decal.Adapter.Wrappers/SkillInfoWrapper.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class SkillInfoWrapper : MarshalByRefObject, IDisposable -{ - private SkillInfo mySkillInfo; - - private TrainingType myTraining; - - private bool isDisposed; - - public int Base => mySkillInfo.Base; - - public int Bonus => mySkillInfo.Bonus; - - public int Buffed => mySkillInfo.Buffed; - - public int Current => mySkillInfo.Current; - - public int XP => mySkillInfo.Exp; - - public string Formula => mySkillInfo.Formula; - - public int Increment => mySkillInfo.Increment; - - public bool Known => mySkillInfo.Known; - - public string Name => mySkillInfo.Name; - - public string ShortName => mySkillInfo.ShortName; - - public TrainingType Training => myTraining; - - internal SkillInfoWrapper(SkillInfo info) - { - mySkillInfo = info; - switch (info.Training) - { - case eTrainingType.eTrainUnusable: - myTraining = TrainingType.Unusable; - break; - case eTrainingType.eTrainUntrained: - myTraining = TrainingType.Untrained; - break; - case eTrainingType.eTrainTrained: - myTraining = TrainingType.Trained; - break; - case eTrainingType.eTrainSpecialized: - myTraining = TrainingType.Specialized; - break; - default: - myTraining = TrainingType.Unusable; - break; - } - } - - ~SkillInfoWrapper() - { - Dispose(disposing: false); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!isDisposed) - { - } - if (mySkillInfo != null) - { - Marshal.ReleaseComObject(mySkillInfo); - } - isDisposed = true; - } - - protected void EnforceDisposedOnce() - { - if (isDisposed) - { - throw new ObjectDisposedException("SkillInfoWrapper"); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/SkillType.cs b/Unused/Decal.Adapter.Wrappers/SkillType.cs deleted file mode 100644 index 820eeff..0000000 --- a/Unused/Decal.Adapter.Wrappers/SkillType.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum SkillType -{ - CurrentMeleeDefense = 6, - CurrentMissileDefense = 7, - CurrentArcaneLore = 14, - CurrentMagicDefense = 15, - CurrentManaConversion = 16, - CurrentItemTinkering = 18, - CurrentAssessPerson = 19, - CurrentDeception = 20, - CurrentHealing = 21, - CurrentJump = 22, - CurrentLockpick = 23, - CurrentRun = 24, - CurrentAssessCreature = 27, - CurrentWeaponTinkering = 28, - CurrentArmorTinkering = 29, - CurrentMagicItemTinkering = 30, - CurrentCreatureEnchantment = 31, - CurrentItemEnchantment = 32, - CurrentLifeMagic = 33, - CurrentWarMagic = 34, - CurrentLeadership = 35, - CurrentLoyalty = 36, - CurrentFletchingSkill = 37, - CurrentAlchemySkill = 38, - CurrentCookingSkill = 39, - CurrentSkillSalvaging = 40, - CurrentTwoHandedCombat = 41, - CurrentGearcraft = 42, - CurrentVoidMagic = 43, - CurrentHeavyWeapons = 44, - CurrentLightWeapons = 45, - CurrentFinesseWeapons = 46, - CurrentMissileWeapons = 47, - CurrentShield = 48, - CurrentDualWield = 49, - CurrentRecklessness = 50, - CurrentSneakAttack = 51, - CurrentDirtyFighting = 52, - CurrentSummoning = 54, - BaseMeleeDefense = 56, - BaseMissileDefense = 57, - BaseArcaneLore = 64, - BaseMagicDefense = 65, - BaseManaConversion = 66, - BaseItemTinkering = 68, - BaseAssessPerson = 69, - BaseDeception = 70, - BaseHealing = 71, - BaseJump = 72, - BaseLockpick = 73, - BaseRun = 74, - BaseAssessCreature = 77, - BaseWeaponTinkering = 78, - BaseArmorTinkering = 79, - BaseMagicItemTinkering = 80, - BaseCreatureEnchantment = 81, - BaseItemEnchantment = 82, - BaseLifeMagic = 83, - BaseWarMagic = 84, - BaseLeadership = 85, - BaseLoyalty = 86, - BaseFletchingSkill = 87, - BaseAlchemySkill = 88, - BaseCookingSkill = 89, - BaseSkillSalvaging = 90, - BaseTwoHandedCombat = 91, - BaseGearcraft = 92, - BaseVoidMagic = 93, - BaseHeavyWeapons = 94, - BaseLightWeapons = 95, - BaseFinesseWeapons = 96, - BaseMissileWeapons = 97, - BaseShield = 98, - BaseDualWield = 99, - BaseRecklessness = 100, - BaseSneakAttack = 101, - BaseDirtyFighting = 102, - BaseSummoning = 104 -} diff --git a/Unused/Decal.Adapter.Wrappers/SliderWrapper.cs b/Unused/Decal.Adapter.Wrappers/SliderWrapper.cs deleted file mode 100644 index 1c48f30..0000000 --- a/Unused/Decal.Adapter.Wrappers/SliderWrapper.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using Decal.Adapter.Support; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public class SliderWrapper : ControlWrapperBase -{ - private EventHandler evtDestroy; - - private EventHandler evtChange; - - public int Maximum - { - get - { - return base.Control.Maximum; - } - set - { - base.Control.Maximum = value; - } - } - - public int Minimum - { - get - { - return base.Control.Minimum; - } - set - { - base.Control.Minimum = value; - } - } - - [Obsolete("Use Position")] - [Browsable(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public int SliderPostition - { - get - { - return base.Control.SliderPosition; - } - set - { - base.Control.SliderPosition = value; - } - } - - public int Position - { - get - { - return base.Control.SliderPosition; - } - set - { - base.Control.SliderPosition = value; - } - } - - public Color TextColor - { - get - { - return Util.ColorFromBGR(base.Control.TextColor); - } - set - { - base.Control.TextColor = Util.ColorToBGR(value); - } - } - - public event EventHandler Destroy - { - add - { - if (evtDestroy == null) - { - base.Control.Destroy += DestroyEvent; - } - evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); - } - remove - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); - if (evtDestroy == null) - { - base.Control.Destroy -= DestroyEvent; - } - } - } - - public event EventHandler Change - { - add - { - if (evtChange == null) - { - base.Control.Change += ChangeEvent; - } - evtChange = (EventHandler)Delegate.Combine(evtChange, value); - } - remove - { - evtChange = (EventHandler)Delegate.Remove(evtChange, value); - if (evtChange == null) - { - base.Control.Change -= ChangeEvent; - } - } - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (evtDestroy != null) - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); - base.Control.Destroy -= DestroyEvent; - } - if (evtChange != null) - { - evtChange = (EventHandler)Delegate.Remove(evtChange, evtChange); - base.Control.Change -= ChangeEvent; - } - } - base.Dispose(disposing); - } - - private void DestroyEvent(int ID) - { - if (evtDestroy != null) - { - evtDestroy(this, new ControlEventArgs(ID)); - } - } - - private void ChangeEvent(int ID, int Index) - { - if (evtChange != null) - { - evtChange(this, new IndexChangeEventArgs(ID, Index)); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/SpellCastEventArgs.cs b/Unused/Decal.Adapter.Wrappers/SpellCastEventArgs.cs deleted file mode 100644 index 69eb040..0000000 --- a/Unused/Decal.Adapter.Wrappers/SpellCastEventArgs.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class SpellCastEventArgs : EventArgs -{ - private CastEventType mtype; - - private int mSpellId; - - private int mTargetId; - - public int SpellId => mSpellId; - - public int TargetId => mTargetId; - - public CastEventType EventType - { - get - { - return mtype; - } - set - { - mtype = value; - } - } - - internal SpellCastEventArgs(CastEventType type, int spellId, int targetId) - { - mtype = type; - mSpellId = spellId; - mTargetId = targetId; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/SpellbookEventArgs.cs b/Unused/Decal.Adapter.Wrappers/SpellbookEventArgs.cs deleted file mode 100644 index 25b9926..0000000 --- a/Unused/Decal.Adapter.Wrappers/SpellbookEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class SpellbookEventArgs : EventArgs -{ - private AddRemoveEventType myType; - - private int mySpell; - - public AddRemoveEventType Type => myType; - - public int Spell => mySpell; - - internal SpellbookEventArgs(AddRemoveEventType type, int spell) - { - myType = type; - mySpell = spell; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/StaticWrapper.cs b/Unused/Decal.Adapter.Wrappers/StaticWrapper.cs deleted file mode 100644 index 126df88..0000000 --- a/Unused/Decal.Adapter.Wrappers/StaticWrapper.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Drawing; -using Decal.Adapter.Support; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public class StaticWrapper : ControlWrapperBase -{ - private EventHandler evtDestroy; - - public string Text - { - get - { - return base.Control.Text; - } - set - { - base.Control.Text = value; - } - } - - public Color TextColor - { - get - { - return Util.ColorFromBGR(base.Control.TextColor); - } - set - { - base.Control.TextColor = Util.ColorToBGR(value); - } - } - - public event EventHandler Destroy - { - add - { - if (evtDestroy == null) - { - base.Control.Destroy += DestroyEvent; - } - evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); - } - remove - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); - if (evtDestroy == null) - { - base.Control.Destroy -= DestroyEvent; - } - } - } - - protected override void Dispose(bool disposing) - { - if (disposing && evtDestroy != null) - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); - base.Control.Destroy -= DestroyEvent; - } - base.Dispose(disposing); - } - - private void DestroyEvent(int ID) - { - if (evtDestroy != null) - { - evtDestroy(this, new ControlEventArgs(ID)); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/StatusMessageEventArgs.cs b/Unused/Decal.Adapter.Wrappers/StatusMessageEventArgs.cs deleted file mode 100644 index b3cd119..0000000 --- a/Unused/Decal.Adapter.Wrappers/StatusMessageEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -public class StatusMessageEventArgs : EventArgs -{ - private int myType; - - private string myText; - - public int Type => myType; - - public string Text => myText; - - internal StatusMessageEventArgs(int Type, string Text) - { - myType = Type; - myText = Text; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/StringValueKey.cs b/Unused/Decal.Adapter.Wrappers/StringValueKey.cs deleted file mode 100644 index 548e09e..0000000 --- a/Unused/Decal.Adapter.Wrappers/StringValueKey.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public enum StringValueKey -{ - SecondaryName = 184549376, - Name = 1, - Title = 5, - Inscription = 7, - InscribedBy = 8, - FellowshipName = 10, - UsageInstructions = 14, - SimpleDescription = 15, - FullDescription = 16, - MonarchName = 21, - OnlyActivatedBy = 25, - Patron = 35, - PortalDestination = 38, - LastTinkeredBy = 39, - ImbuedBy = 40, - DateBorn = 43, - MonarchyTitle = 47 -} diff --git a/Unused/Decal.Adapter.Wrappers/TextBoxWrapper.cs b/Unused/Decal.Adapter.Wrappers/TextBoxWrapper.cs deleted file mode 100644 index 9056799..0000000 --- a/Unused/Decal.Adapter.Wrappers/TextBoxWrapper.cs +++ /dev/null @@ -1,220 +0,0 @@ -using System; -using System.Drawing; -using Decal.Adapter.Support; -using Decal.Interop.Controls; - -namespace Decal.Adapter.Wrappers; - -public class TextBoxWrapper : ControlWrapperBase -{ - private EventHandler evtDestroy; - - private EventHandler evtBegin; - - private EventHandler evtChange; - - private EventHandler evtEnd; - - public int Caret - { - get - { - return base.Control.Caret; - } - set - { - base.Control.Caret = value; - } - } - - public string SelectedText - { - get - { - return base.Control.SelectedText; - } - set - { - base.Control.SelectedText = value; - } - } - - public string Text - { - get - { - return base.Control.Text; - } - set - { - base.Control.Text = value; - } - } - - public Color TextColor - { - get - { - return Util.ColorFromBGR(base.Control.TextColor); - } - set - { - base.Control.TextColor = Util.ColorToBGR(value); - } - } - - public event EventHandler Destroy - { - add - { - if (evtDestroy == null) - { - base.Control.Destroy += DestroyEvent; - } - evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); - } - remove - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); - if (evtDestroy == null) - { - base.Control.Destroy -= DestroyEvent; - } - } - } - - public event EventHandler Begin - { - add - { - if (evtBegin == null) - { - base.Control.Begin += BeginEvent; - } - evtBegin = (EventHandler)Delegate.Combine(evtBegin, value); - } - remove - { - evtBegin = (EventHandler)Delegate.Remove(evtBegin, value); - if (evtBegin == null) - { - base.Control.Begin -= BeginEvent; - } - } - } - - public event EventHandler Change - { - add - { - if (evtChange == null) - { - base.Control.Change += ChangeEvent; - } - evtChange = (EventHandler)Delegate.Combine(evtChange, value); - } - remove - { - evtChange = (EventHandler)Delegate.Remove(evtChange, value); - if (evtChange == null) - { - base.Control.Change -= ChangeEvent; - } - } - } - - public event EventHandler End - { - add - { - if (evtEnd == null) - { - base.Control.End += EndEvent; - } - evtEnd = (EventHandler)Delegate.Combine(evtEnd, value); - } - remove - { - evtEnd = (EventHandler)Delegate.Remove(evtEnd, value); - if (evtEnd == null) - { - base.Control.End -= EndEvent; - } - } - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (evtBegin != null) - { - evtBegin = (EventHandler)Delegate.Remove(evtBegin, evtBegin); - base.Control.Begin -= BeginEvent; - } - if (evtDestroy != null) - { - evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); - base.Control.Destroy -= DestroyEvent; - } - if (evtChange != null) - { - evtChange = (EventHandler)Delegate.Remove(evtChange, evtChange); - base.Control.Change -= ChangeEvent; - } - if (evtEnd != null) - { - evtEnd = (EventHandler)Delegate.Remove(evtEnd, evtEnd); - base.Control.End -= EndEvent; - } - } - base.Dispose(disposing); - } - - public void Capture() - { - base.Control.Capture(); - } - - public void Select(int start, int end) - { - base.Control.Select(start, end); - } - - public void SetMargins(int x, int y) - { - base.Control.SetMargins(x, y); - } - - private void DestroyEvent(int ID) - { - if (evtDestroy != null) - { - evtDestroy(this, new ControlEventArgs(ID)); - } - } - - private void BeginEvent(int ID) - { - if (evtBegin != null) - { - evtBegin(this, new ControlEventArgs(ID)); - } - } - - private void ChangeEvent(int ID, string text) - { - if (evtChange != null) - { - evtChange(this, new TextBoxChangeEventArgs(ID, text)); - } - } - - private void EndEvent(int ID, bool success) - { - if (evtEnd != null) - { - evtEnd(this, new TextBoxEndEventArgs(ID, success)); - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/TrainingType.cs b/Unused/Decal.Adapter.Wrappers/TrainingType.cs deleted file mode 100644 index 0cf9913..0000000 --- a/Unused/Decal.Adapter.Wrappers/TrainingType.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum TrainingType -{ - Unusable, - Untrained, - Trained, - Specialized -} diff --git a/Unused/Decal.Adapter.Wrappers/UIElementType.cs b/Unused/Decal.Adapter.Wrappers/UIElementType.cs deleted file mode 100644 index 16d0c2d..0000000 --- a/Unused/Decal.Adapter.Wrappers/UIElementType.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum UIElementType -{ - Smartbox = 268436634, - Chat = 268436993, - FloatChat1 = 268436741, - FloatChat2 = 268436750, - FloatChat3 = 268436751, - FloatChat4 = 268436752, - Examination = 268436983, - Vitals = 268436986, - EnvPack = 268436989, - Panels = 268436991, - TBar = 268436995, - Indicators = 268437009, - ProgressBar = 268437011, - Combat = 268437173, - Radar = 268437202 -} diff --git a/Unused/Decal.Adapter.Wrappers/Vector3Object.cs b/Unused/Decal.Adapter.Wrappers/Vector3Object.cs deleted file mode 100644 index cba34a9..0000000 --- a/Unused/Decal.Adapter.Wrappers/Vector3Object.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public class Vector3Object -{ - private double mX; - - private double mY; - - private double mZ; - - public double X => mX; - - public double Y => mY; - - public double Z => mZ; - - public Vector3Object(double x, double y, double z) - { - mX = x; - mY = y; - mZ = z; - } - - public override string ToString() - { - return "{X = " + mX + ", Y = " + mY + ", Z = " + mZ + "}"; - } - - public override bool Equals(object obj) - { - if (obj is Vector3Object) - { - Vector3Object vector3Object = (Vector3Object)obj; - if (mX == vector3Object.mX && mY == vector3Object.mY) - { - return mZ == vector3Object.mZ; - } - return false; - } - return false; - } - - public bool Equals(Vector3Object obj) - { - if (obj == null) - { - return false; - } - if (mX == obj.mX && mY == obj.mY) - { - return mZ == obj.mZ; - } - return false; - } - - public override int GetHashCode() - { - return mX.GetHashCode() ^ mY.GetHashCode() ^ mZ.GetHashCode(); - } - - public static bool operator ==(Vector3Object a, Vector3Object b) - { - if (object.Equals(a, null)) - { - return object.Equals(b, null); - } - return a.Equals(b); - } - - public static bool operator !=(Vector3Object a, Vector3Object b) - { - return !(a == b); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/Vector4Object.cs b/Unused/Decal.Adapter.Wrappers/Vector4Object.cs deleted file mode 100644 index bcc2b67..0000000 --- a/Unused/Decal.Adapter.Wrappers/Vector4Object.cs +++ /dev/null @@ -1,79 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public class Vector4Object -{ - private double mW; - - private double mX; - - private double mY; - - private double mZ; - - public double W => mW; - - public double X => mX; - - public double Y => mY; - - public double Z => mZ; - - public Vector4Object(double w, double x, double y, double z) - { - mW = w; - mX = x; - mY = y; - mZ = z; - } - - public override string ToString() - { - return "{W = " + mW + ", X = " + mX + ", Y = " + mY + ", Z = " + mZ + "}"; - } - - public override bool Equals(object obj) - { - if (obj is Vector4Object) - { - Vector4Object vector4Object = (Vector4Object)obj; - if (mW == vector4Object.mW && mX == vector4Object.mX && mY == vector4Object.mY) - { - return mZ == vector4Object.mZ; - } - return false; - } - return false; - } - - public bool Equals(Vector4Object obj) - { - if (obj == null) - { - return false; - } - if (mW == obj.mW && mX == obj.mX && mY == obj.mY) - { - return mZ == obj.mZ; - } - return false; - } - - public override int GetHashCode() - { - return mW.GetHashCode() ^ mX.GetHashCode() ^ mY.GetHashCode() ^ mZ.GetHashCode(); - } - - public static bool operator ==(Vector4Object a, Vector4Object b) - { - if (object.Equals(a, null)) - { - return object.Equals(b, null); - } - return a.Equals(b); - } - - public static bool operator !=(Vector4Object a, Vector4Object b) - { - return !(a == b); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/Vendor.cs b/Unused/Decal.Adapter.Wrappers/Vendor.cs deleted file mode 100644 index f8bf175..0000000 --- a/Unused/Decal.Adapter.Wrappers/Vendor.cs +++ /dev/null @@ -1,234 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -public class Vendor : GenericDisposableWrapper, IEnumerable, IEnumerable -{ - public class VendorEnumerator : IEnumerator, IDisposable, IEnumerator - { - private Vendor vendor; - - private WorldObject current; - - public WorldObject Current - { - get - { - if (current == null) - { - MoveNext(); - } - return current; - } - } - - object IEnumerator.Current - { - get - { - if (current == null) - { - MoveNext(); - } - return current; - } - } - - internal VendorEnumerator(Vendor vendor) - { - this.vendor = vendor; - } - - ~VendorEnumerator() - { - Dispose(userCalled: false); - } - - public void Dispose() - { - Dispose(userCalled: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool userCalled) - { - if (vendor != null) - { - Reset(); - vendor = null; - } - } - - public bool MoveNext() - { - Decal.Interop.Filters.WorldObject ppObject = null; - bool num = vendor.Wrapped.Next(ref ppObject); - if (num && ppObject != null) - { - current = vendor.GetCachedObject(ppObject); - } - return num; - } - - public void Reset() - { - vendor.Wrapped.Reset(); - } - } - - private WorldFilter wf; - - private DisposableObjectDictionary objectCache; - - private IEnumerator oldstyleenumerator; - - /// - /// The indentifier for this merchant - /// - public int MerchantId => base.Wrapped.MerchantID; - - /// - /// The maximum value of an item this vendor will purchase - /// - public int MaxValue => base.Wrapped.BuyValue; - - /// - /// The rate at which this vendor sells items - /// - public float SellRate => base.Wrapped.SellRate; - - /// - /// The rate at which this vendor buys items - /// - public float BuyRate => base.Wrapped.BuyRate; - - /// - /// The item categories that this vendor buys - /// - public int Categories => base.Wrapped.BuyCategories; - - /// - /// Returns the number of items in the collection - /// - public int Count => base.Wrapped.Count; - - /// - /// Returns the number of items represented by the collection, taking into account stacks of items. - /// - public int Quantity => base.Wrapped.Quantity; - - public WorldObject First - { - get - { - using IEnumerator enumerator = GetEnumerator(); - return enumerator.Current; - } - } - - [Obsolete("Use enumerators")] - [EditorBrowsable(EditorBrowsableState.Never)] - public WorldObject Current - { - get - { - if (oldstyleenumerator == null) - { - oldstyleenumerator = GetEnumerator(); - } - return oldstyleenumerator.Current; - } - } - - public WorldObject this[int id] - { - get - { - WorldObject value = null; - if (!objectCache.TryGetValue(id, out value)) - { - Decal.Interop.Filters.WorldObject byID = base.Wrapped.GetByID(id); - if (byID != null) - { - value = new WorldObject(byID); - objectCache.Add(value.Id, value); - } - } - return value; - } - } - - public Vendor(WorldFilter wf, Decal.Interop.Filters.Vendor obj) - : base(obj) - { - this.wf = wf; - objectCache = new DisposableObjectDictionary("Id"); - } - - protected override void Dispose(bool userCalled) - { - if (oldstyleenumerator != null) - { - oldstyleenumerator.Dispose(); - oldstyleenumerator = null; - } - objectCache.Clear(); - base.Dispose(userCalled); - } - - internal WorldObject GetCachedObject(Decal.Interop.Filters.WorldObject iwo) - { - WorldObject value = null; - if (!objectCache.TryGetValue(iwo.GUID, out value)) - { - value = new WorldObject(iwo); - objectCache.Add(value.Id, value); - } - return value; - } - - /// - /// Apply a filter to this collection to limit what it returns - /// - /// filter object - public void SetFilter(WorldObjectCollectionFilter filter) - { - filter?.ApplyFilter(base.Wrapped); - } - - [Obsolete("Use enumerators")] - [EditorBrowsable(EditorBrowsableState.Never)] - public bool MoveNext() - { - if (oldstyleenumerator == null) - { - oldstyleenumerator = GetEnumerator(); - } - return oldstyleenumerator.MoveNext(); - } - - [Obsolete("Use enumerators")] - [EditorBrowsable(EditorBrowsableState.Never)] - public void Reset() - { - if (oldstyleenumerator == null) - { - oldstyleenumerator = GetEnumerator(); - } - oldstyleenumerator.Reset(); - } - - public IEnumerator GetEnumerator() - { - return new VendorEnumerator(this); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return new VendorEnumerator(this); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ViewControls.cs b/Unused/Decal.Adapter.Wrappers/ViewControls.cs deleted file mode 100644 index 58965a4..0000000 --- a/Unused/Decal.Adapter.Wrappers/ViewControls.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using Decal.Interop.Inject; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class ViewControls : MarshalByRefObject, IDisposable -{ - private ViewWrapper myParent; - - private Dictionary myControls; - - private bool isDisposed; - - [CLSCompliant(false)] - public IControlWrapper this[string controlName] - { - get - { - if (myControls.ContainsKey(controlName)) - { - return myControls[controlName]; - } - IControlWrapper controlWrapper = ControlRegistry.CreateInstance(myParent[controlName]); - myControls.Add(controlName, controlWrapper); - return controlWrapper; - } - set - { - if (value == null) - { - throw new ArgumentNullException("value"); - } - myControls[controlName] = value; - myParent[controlName] = value.Underlying as IControl; - } - } - - internal ViewControls(ViewWrapper parent) - { - myParent = parent; - myControls = new Dictionary(); - } - - ~ViewControls() - { - Dispose(disposing: false); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool disposing) - { - if (!isDisposed && disposing && myParent != null) - { - foreach (IControlWrapper value in myControls.Values) - { - if (value is IDisposable disposable) - { - disposable.Dispose(); - } - } - myParent = null; - } - isDisposed = true; - } -} diff --git a/Unused/Decal.Adapter.Wrappers/ViewWrapper.cs b/Unused/Decal.Adapter.Wrappers/ViewWrapper.cs deleted file mode 100644 index 3be7c27..0000000 --- a/Unused/Decal.Adapter.Wrappers/ViewWrapper.cs +++ /dev/null @@ -1,279 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using Decal.Adapter.Support; -using Decal.Interop.Core; -using Decal.Interop.Inject; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public class ViewWrapper : MarshalByRefObject, IDisposable -{ - private View myView; - - private ViewControls myControls; - - private bool isDisposed; - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public View Underlying => myView; - - public bool Activated - { - get - { - return myView.Activated; - } - set - { - myView.Activated = value; - } - } - - public int Alpha - { - get - { - return myView.Alpha; - } - set - { - myView.Alpha = value; - } - } - - public string Title - { - get - { - return myView.Title; - } - set - { - myView.Title = value; - } - } - - public bool Transparent - { - get - { - return myView.Transparent; - } - set - { - myView.Transparent = value; - } - } - - [CLSCompliant(false)] - public IControl this[string controlName] - { - get - { - return ((IView)myView).get_Control(controlName); - } - set - { - ((IView)myView).set_Control(controlName, value); - } - } - - public ViewControls Controls => myControls; - - public Rectangle Position - { - get - { - return Util.toRectangle(myView.Position); - } - set - { - tagRECT pVal = Util.toTagRECT(value); - myView.Position = ref pVal; - } - } - - internal ViewWrapper(View vw) - { - myView = vw; - myControls = new ViewControls(this); - } - - ~ViewWrapper() - { - Dispose(disposing: false); - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool disposing) - { - if (!isDisposed) - { - } - if (myView != null) - { - myControls.Dispose(); - Marshal.ReleaseComObject(myView); - myView = null; - } - isDisposed = true; - } - - public void Activate() - { - myView.Activate(); - } - - public void Alert() - { - myView.Alert(); - } - - public void Deactivate() - { - myView.Deactivate(); - } - - [CLSCompliant(false)] - public int LoadControl(Layer parent, int id, object xmlSource) - { - return myView.LoadControl(parent, id, xmlSource); - } - - public void LoadSchema(string xmlSchema) - { - myView.LoadSchema(xmlSchema); - } - - public void SetIcon(int icon, object iconLibrary) - { - myView.SetIcon(icon, iconLibrary); - } - - /// - /// Reads the class's view attributes and loads the requested views - /// - /// handler to scan - /// True when views are created, False otherwise - internal static bool ScanViews(IViewHandler handler) - { - Type type = handler.GetType(); - bool result = false; - object[] customAttributes = type.GetCustomAttributes(typeof(ViewAttribute), inherit: false); - foreach (object obj in customAttributes) - { - try - { - ViewAttribute viewAttribute = (ViewAttribute)obj; - handler.LoadView(viewAttribute.ViewName, viewAttribute.Resource); - result = true; - } - catch (Exception ex) - { - Util.WriteLine("ScanViews Exception: " + ex.Message); - } - } - return result; - } - - /// - /// Reads the class for ControlEvents and hooks them up - /// - /// handler to scan - internal static void ScanControls(IViewHandler handler) - { - MethodInfo[] methods = handler.GetType().GetMethods(handler.BindingFlags); - foreach (MethodInfo methodInfo in methods) - { - object[] customAttributes = methodInfo.GetCustomAttributes(typeof(ControlEventAttribute), inherit: false); - foreach (object obj in customAttributes) - { - try - { - ControlEventAttribute controlEventAttribute = (ControlEventAttribute)obj; - IControlWrapper controlWrapper = handler.GetView(controlEventAttribute.ViewName).Controls[controlEventAttribute.Control]; - EventInfo eventInfo = controlWrapper.GetType().GetEvent(controlEventAttribute.EventName); - eventInfo.AddEventHandler(controlWrapper, Delegate.CreateDelegate(eventInfo.EventHandlerType, handler, methodInfo.Name)); - } - catch (Exception ex) - { - Util.WriteLine("ScanControls Exception: " + ex.Message); - } - } - } - } - - /// - /// Reads the class for ControlReferences and adds them - /// - /// handler to scan - internal static void ScanReferences(IViewHandler handler) - { - Type type = handler.GetType(); - Type typeFromHandle = typeof(AccessedThroughPropertyAttribute); - Type typeFromHandle2 = typeof(ControlReferenceAttribute); - Type typeFromHandle3 = typeof(ControlReferenceArrayAttribute); - FieldInfo[] fields = type.GetFields(handler.BindingFlags); - foreach (FieldInfo fieldInfo in fields) - { - try - { - IControlWrapper controlWrapper = null; - if (!fieldInfo.FieldType.IsArray && Attribute.IsDefined(fieldInfo, typeFromHandle2)) - { - ControlReferenceAttribute controlReferenceAttribute = (ControlReferenceAttribute)Attribute.GetCustomAttribute(fieldInfo, typeFromHandle2); - controlWrapper = handler.GetView(controlReferenceAttribute.ViewName).Controls[controlReferenceAttribute.Control]; - if (!(controlWrapper.GetType() != fieldInfo.FieldType)) - { - object value = Convert.ChangeType(controlWrapper, fieldInfo.FieldType); - if (Attribute.IsDefined(fieldInfo, typeFromHandle)) - { - AccessedThroughPropertyAttribute accessedThroughPropertyAttribute = (AccessedThroughPropertyAttribute)Attribute.GetCustomAttribute(fieldInfo, typeFromHandle); - type.GetProperty(accessedThroughPropertyAttribute.PropertyName, handler.BindingFlags).SetValue(handler, value, null); - } - else - { - fieldInfo.SetValue(handler, value); - } - } - } - else - { - if (!Attribute.IsDefined(fieldInfo, typeFromHandle3)) - { - continue; - } - ControlReferenceArrayAttribute controlReferenceArrayAttribute = (ControlReferenceArrayAttribute)Attribute.GetCustomAttribute(fieldInfo, typeFromHandle3); - ViewWrapper view = handler.GetView(controlReferenceArrayAttribute.ViewName); - Type elementType = fieldInfo.FieldType.GetElementType(); - Array array = Array.CreateInstance(elementType, controlReferenceArrayAttribute.Controls.Count); - for (int j = 0; j < controlReferenceArrayAttribute.Controls.Count; j++) - { - controlWrapper = view.Controls[controlReferenceArrayAttribute.Controls[j]]; - if (elementType.IsAssignableFrom(controlWrapper.GetType())) - { - array.SetValue(controlWrapper, j); - } - } - fieldInfo.SetValue(handler, array); - continue; - } - } - catch (Exception ex) - { - Util.WriteLine("ScanReferences Exception: " + ex.Message); - } - } - } -} diff --git a/Unused/Decal.Adapter.Wrappers/VitalType.cs b/Unused/Decal.Adapter.Wrappers/VitalType.cs deleted file mode 100644 index e80b5ff..0000000 --- a/Unused/Decal.Adapter.Wrappers/VitalType.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -[CLSCompliant(true)] -public enum VitalType -{ - MaximumHealth = 1, - CurrentHealth, - MaximumStamina, - CurrentStamina, - MaximumMana, - CurrentMana, - BaseHealth, - BaseStamina, - BaseMana -} diff --git a/Unused/Decal.Adapter.Wrappers/WorldChangeType.cs b/Unused/Decal.Adapter.Wrappers/WorldChangeType.cs deleted file mode 100644 index 0af486d..0000000 --- a/Unused/Decal.Adapter.Wrappers/WorldChangeType.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -public enum WorldChangeType -{ - SizeChange, - StorageChange, - IdentReceived, - VendorIdentReceived, - ManaChange -} diff --git a/Unused/Decal.Adapter.Wrappers/WorldFilter.cs b/Unused/Decal.Adapter.Wrappers/WorldFilter.cs deleted file mode 100644 index 2f62df7..0000000 --- a/Unused/Decal.Adapter.Wrappers/WorldFilter.cs +++ /dev/null @@ -1,531 +0,0 @@ -using System; -using Decal.Adapter.Support; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -public class WorldFilter : GenericDisposableWrapper -{ - private DisposableObjectDictionary worldObjectCache; - - private EventHandler mAcceptTrade; - - private EventHandler mAddTradeItem; - - private EventHandler mApproachVendor; - - private EventHandler mChangeObject; - - private EventHandler mCreateObject; - - private EventHandler mDeclineTrade; - - private EventHandler mEndTrade; - - private EventHandler mEnterTrade; - - private EventHandler mFailToAddTradeItem; - - private EventHandler mFailToCompleteTrade; - - private EventHandler mMoveObject; - - private EventHandler mReleaseDone; - - private EventHandler mReleaseObject; - - private EventHandler mResetTrade; - - public WorldObject this[int guid] => GetCachedWorldObject(guid); - - /// - /// Returns the currently open vendor object. You **MUST** dispose this object when finished with it. - /// - public Vendor OpenVendor - { - get - { - Decal.Interop.Filters.Vendor vendor = base.Wrapped.Vendor; - if (vendor != null) - { - return new Vendor(this, vendor); - } - return null; - } - } - - [CLSCompliant(false)] - public event EventHandler AcceptTrade - { - add - { - mAcceptTrade = (EventHandler)Delegate.Combine(mAcceptTrade, value); - } - remove - { - mAcceptTrade = (EventHandler)Delegate.Remove(mAcceptTrade, value); - } - } - - [CLSCompliant(false)] - public event EventHandler AddTradeItem - { - add - { - mAddTradeItem = (EventHandler)Delegate.Combine(mAddTradeItem, value); - } - remove - { - mAddTradeItem = (EventHandler)Delegate.Remove(mAddTradeItem, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ApproachVendor - { - add - { - mApproachVendor = (EventHandler)Delegate.Combine(mApproachVendor, value); - } - remove - { - mApproachVendor = (EventHandler)Delegate.Remove(mApproachVendor, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChangeObject - { - add - { - mChangeObject = (EventHandler)Delegate.Combine(mChangeObject, value); - } - remove - { - mChangeObject = (EventHandler)Delegate.Remove(mChangeObject, value); - } - } - - [CLSCompliant(false)] - public event EventHandler CreateObject - { - add - { - mCreateObject = (EventHandler)Delegate.Combine(mCreateObject, value); - } - remove - { - mCreateObject = (EventHandler)Delegate.Remove(mCreateObject, value); - } - } - - [CLSCompliant(false)] - public event EventHandler DeclineTrade - { - add - { - mDeclineTrade = (EventHandler)Delegate.Combine(mDeclineTrade, value); - } - remove - { - mDeclineTrade = (EventHandler)Delegate.Remove(mDeclineTrade, value); - } - } - - [CLSCompliant(false)] - public event EventHandler EndTrade - { - add - { - mEndTrade = (EventHandler)Delegate.Combine(mEndTrade, value); - } - remove - { - mEndTrade = (EventHandler)Delegate.Remove(mEndTrade, value); - } - } - - [CLSCompliant(false)] - public event EventHandler EnterTrade - { - add - { - mEnterTrade = (EventHandler)Delegate.Combine(mEnterTrade, value); - } - remove - { - mEnterTrade = (EventHandler)Delegate.Remove(mEnterTrade, value); - } - } - - [CLSCompliant(false)] - public event EventHandler FailToAddTradeItem - { - add - { - mFailToAddTradeItem = (EventHandler)Delegate.Combine(mFailToAddTradeItem, value); - } - remove - { - mFailToAddTradeItem = (EventHandler)Delegate.Remove(mFailToAddTradeItem, value); - } - } - - [CLSCompliant(false)] - public event EventHandler FailToCompleteTrade - { - add - { - mFailToCompleteTrade = (EventHandler)Delegate.Combine(mFailToCompleteTrade, value); - } - remove - { - mFailToCompleteTrade = (EventHandler)Delegate.Remove(mFailToCompleteTrade, value); - } - } - - [CLSCompliant(false)] - public event EventHandler MoveObject - { - add - { - mMoveObject = (EventHandler)Delegate.Combine(mMoveObject, value); - } - remove - { - mMoveObject = (EventHandler)Delegate.Remove(mMoveObject, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ReleaseDone - { - add - { - mReleaseDone = (EventHandler)Delegate.Combine(mReleaseDone, value); - } - remove - { - mReleaseDone = (EventHandler)Delegate.Remove(mReleaseDone, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ReleaseObject - { - add - { - mReleaseObject = (EventHandler)Delegate.Combine(mReleaseObject, value); - } - remove - { - mReleaseObject = (EventHandler)Delegate.Remove(mReleaseObject, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ResetTrade - { - add - { - mResetTrade = (EventHandler)Delegate.Combine(mResetTrade, value); - } - remove - { - mResetTrade = (EventHandler)Delegate.Remove(mResetTrade, value); - } - } - - public WorldFilter(World obj) - : base(obj) - { - worldObjectCache = new DisposableObjectDictionary("Id"); - base.Wrapped.AcceptTrade += myWF_AcceptTrade; - base.Wrapped.AddTradeItem += myWF_AddTradeItem; - base.Wrapped.ApproachVendor += myWF_ApproachVendor; - base.Wrapped.ChangeObject += myWF_ChangeObject; - base.Wrapped.CreateObject += myWF_CreateObject; - base.Wrapped.DeclineTrade += myWF_DeclineTrade; - base.Wrapped.EndTrade += myWF_EndTrade; - base.Wrapped.EnterTrade += myWF_EnterTrade; - base.Wrapped.FailToAddTradeItem += myWF_FailToAddTradeItem; - base.Wrapped.FailToCompleteTrade += myWF_FailToCompleteTrade; - base.Wrapped.MoveObject += myWF_MoveObject; - base.Wrapped.ReleaseDone += myWF_ReleaseDone; - base.Wrapped.ReleaseObject += myWF_ReleaseObject; - base.Wrapped.ResetTrade += myWF_ResetTrade; - CoreManager.Current.PluginTermComplete += corePluginTermComplete; - } - - protected override void Dispose(bool userCalled) - { - if (userCalled && base.Wrapped != null) - { - ClearCache(); - base.Wrapped.AcceptTrade -= myWF_AcceptTrade; - base.Wrapped.AddTradeItem -= myWF_AddTradeItem; - base.Wrapped.ApproachVendor -= myWF_ApproachVendor; - base.Wrapped.ChangeObject -= myWF_ChangeObject; - base.Wrapped.CreateObject -= myWF_CreateObject; - base.Wrapped.DeclineTrade -= myWF_DeclineTrade; - base.Wrapped.EndTrade -= myWF_EndTrade; - base.Wrapped.EnterTrade -= myWF_EnterTrade; - base.Wrapped.FailToAddTradeItem -= myWF_FailToAddTradeItem; - base.Wrapped.FailToCompleteTrade -= myWF_FailToCompleteTrade; - base.Wrapped.MoveObject -= myWF_MoveObject; - base.Wrapped.ReleaseDone -= myWF_ReleaseDone; - base.Wrapped.ReleaseObject -= myWF_ReleaseObject; - base.Wrapped.ResetTrade -= myWF_ResetTrade; - CoreManager.Current.PluginTermComplete -= corePluginTermComplete; - worldObjectCache.Dispose(); - } - base.Dispose(userCalled); - } - - private void ClearCache() - { - worldObjectCache.Clear(); - } - - private void corePluginTermComplete(object sender, EventArgs e) - { - ClearCache(); - } - - private void myWF_AcceptTrade(int TargetID) - { - Util.SafeFireEvent(this, mAcceptTrade, new AcceptTradeEventArgs(TargetID)); - } - - private void myWF_AddTradeItem(int ItemId, int SideId) - { - Util.SafeFireEvent(this, mAddTradeItem, new AddTradeItemEventArgs(ItemId, SideId)); - } - - private void myWF_ApproachVendor(int MerchantId) - { - Vendor openVendor = OpenVendor; - Util.SafeFireEvent(this, mApproachVendor, new ApproachVendorEventArgs(MerchantId, openVendor)); - openVendor.Dispose(); - } - - private void myWF_ChangeObject(Decal.Interop.Filters.WorldObject pObject, Decal.Interop.Filters.WorldChangeType Change) - { - WorldObject worldObject = null; - if (Change != Decal.Interop.Filters.WorldChangeType.wevtVendorIdentReceived) - { - worldObject = GetCachedWorldObject(pObject); - Util.SafeFireEvent(this, mChangeObject, new ChangeObjectEventArgs(worldObject, Change)); - return; - } - using Vendor vendor = OpenVendor; - worldObject = vendor.GetCachedObject(pObject); - Util.SafeFireEvent(this, mChangeObject, new ChangeObjectEventArgs(worldObject, Change)); - } - - private void myWF_CreateObject(Decal.Interop.Filters.WorldObject pObject) - { - WorldObject cachedWorldObject = GetCachedWorldObject(pObject); - Util.SafeFireEvent(this, mCreateObject, new CreateObjectEventArgs(cachedWorldObject)); - } - - private void myWF_DeclineTrade(int TraderId) - { - Util.SafeFireEvent(this, mDeclineTrade, new DeclineTradeEventArgs(TraderId)); - } - - private void myWF_EndTrade(int ReasonId) - { - Util.SafeFireEvent(this, mEndTrade, new EndTradeEventArgs(ReasonId)); - } - - private void myWF_EnterTrade(int TraderId, int TradeeId) - { - Util.SafeFireEvent(this, mEnterTrade, new EnterTradeEventArgs(TraderId, TradeeId)); - } - - private void myWF_FailToAddTradeItem(int ItemId, int ReasonId) - { - Util.SafeFireEvent(this, mFailToAddTradeItem, new FailToAddTradeItemEventArgs(ItemId, ReasonId)); - } - - private void myWF_FailToCompleteTrade() - { - Util.SafeFireEvent(this, mFailToCompleteTrade, new EventArgs()); - } - - private void myWF_MoveObject(Decal.Interop.Filters.WorldObject pObject) - { - WorldObject cachedWorldObject = GetCachedWorldObject(pObject); - Util.SafeFireEvent(this, mMoveObject, new MoveObjectEventArgs(cachedWorldObject)); - } - - private void myWF_ReleaseDone() - { - Util.SafeFireEvent(this, mReleaseDone, new EventArgs()); - } - - private void myWF_ReleaseObject(Decal.Interop.Filters.WorldObject pObject) - { - if (pObject != null) - { - WorldObject cachedWorldObject = GetCachedWorldObject(pObject); - Util.SafeFireEvent(this, mReleaseObject, new ReleaseObjectEventArgs(cachedWorldObject)); - cachedWorldObject.Dispose(); - } - } - - private void myWF_ResetTrade(int TraderId) - { - Util.SafeFireEvent(this, mResetTrade, new ResetTradeEventArgs(TraderId)); - } - - internal WorldObject GetCachedWorldObject(Decal.Interop.Filters.WorldObject iwo) - { - WorldObject value = null; - if (!worldObjectCache.TryGetValue(iwo.GUID, out value)) - { - value = new WorldObject(iwo); - worldObjectCache.Add(value.Id, value); - } - return value; - } - - internal WorldObject GetCachedWorldObject(int id) - { - WorldObject value = null; - if (!worldObjectCache.TryGetValue(id, out value)) - { - Decal.Interop.Filters.WorldObject worldObject = base.Wrapped[id]; - if (worldObject != null) - { - value = new WorldObject(worldObject); - worldObjectCache.Add(value.Id, value); - } - } - return value; - } - - /// - /// Returns the 2D distance between two items - /// - /// Id of the first item - /// Id of the second item - /// The distance between the items - public double Distance(int id1, int id2) - { - return Distance(id1, id2, use3d: false); - } - - /// - /// Returns the distance between two items - /// - /// Id of the first item - /// Id of the second item - /// Whether or not height is taken into account - /// The distance between the items - public double Distance(int id1, int id2, bool use3d) - { - if (use3d) - { - return base.Wrapped.Distance3D(id1, id2); - } - return base.Wrapped.Distance2D(id1, id2); - } - - private WorldObjectCollection wrapIterator(WorldIterator wi) - { - if (wi != null) - { - return new WorldObjectCollection(this, wi); - } - return null; - } - - /// - /// Gets all of the items in the player's inventory. - /// - /// WorldObjectCollection containing the items in the character's inventory - public WorldObjectCollection GetInventory() - { - return wrapIterator(base.Wrapped.Inventory); - } - - /// - /// Gets all of the items known to WorldFilter. - /// - /// WorldObjectCollection containing all of the items in the world - public WorldObjectCollection GetAll() - { - return wrapIterator(base.Wrapped.All); - } - - /// - /// Gets all of the items known to WorldFilter that don't have a container. - /// - /// WorldObjectCollection containing all of the items on the landscape - public WorldObjectCollection GetLandscape() - { - return wrapIterator(base.Wrapped.Landscape); - } - - /// - /// Gets all of the items in the given container. - /// - /// Id of the container - /// WorldObjectCollection containing the items in the container - public WorldObjectCollection GetByContainer(int container) - { - return wrapIterator(((IWorld)base.Wrapped).get_ByContainer(container)); - } - - /// - /// Gets all of the items with the specified category. - /// - /// Category - /// WorldObjectCollection containing the items in the category - public WorldObjectCollection GetByCategory(int category) - { - return wrapIterator(((IWorld)base.Wrapped).get_ByCategory(category)); - } - - /// - /// Gets all of the items that have the specified name. - /// - /// Name of the items - /// WorldObjectCollection containing the items with the name - public WorldObjectCollection GetByName(string name) - { - return wrapIterator(((IWorld)base.Wrapped).get_ByName(name)); - } - - /// - /// Gets all of the items with names that contain the specified string. - /// - /// Partial name of items - /// WorldObjectCollection containing the items with the name part - public WorldObjectCollection GetByNameSubstring(string name) - { - return wrapIterator(((IWorld)base.Wrapped).get_ByNameSubstring(name)); - } - - /// - /// Gets all of the items in the object class - /// - /// class of the objects - /// WorldObjectCollection containing the items in the class - public WorldObjectCollection GetByObjectClass(ObjectClass objClass) - { - return wrapIterator(((IWorld)base.Wrapped).get_ByObjectClass((eObjectClass)objClass)); - } - - /// - /// Gets the items owned by the specified character - /// - /// Id of the owning character - /// WorldObjectCollection containing the items owned by the character - public WorldObjectCollection GetByOwner(int owner) - { - return wrapIterator(((IWorld)base.Wrapped).get_ByOwner(owner)); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/WorldObject.cs b/Unused/Decal.Adapter.Wrappers/WorldObject.cs deleted file mode 100644 index c473215..0000000 --- a/Unused/Decal.Adapter.Wrappers/WorldObject.cs +++ /dev/null @@ -1,407 +0,0 @@ -using System.Collections.Generic; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines an object in the world -/// -public class WorldObject : GenericDisposableWrapper -{ - /// - /// Gets the number of active spells on this object. - /// - public int ActiveSpellCount => Values(LongValueKey.ActiveSpellCount); - - /// - /// Gets the number of spells that this object casts. - /// - public int SpellCount => Values(LongValueKey.SpellCount); - - public int Behavior => base.Wrapped.Behavior; - - public int Category => base.Wrapped.Category; - - public int Container => base.Wrapped.Container; - - public int GameDataFlags1 => base.Wrapped.GameDataFlags1; - - public int Id => base.Wrapped.GUID; - - public bool HasIdData => base.Wrapped.HasIdData; - - public int Icon => base.Wrapped.Icon; - - public int LastIdTime => base.Wrapped.LastIdTime; - - public string Name => base.Wrapped.Name; - - public ObjectClass ObjectClass => (ObjectClass)base.Wrapped.ObjectClass; - - public int PhysicsDataFlags => base.Wrapped.PhysicsDataFlags; - - public int Type => base.Wrapped.Type; - - public List BoolKeys - { - get - { - List list = new List(); - int num = 0; - for (int num2 = base.Wrapped.EnumBoolKey(0); num2 != -1; num2 = base.Wrapped.EnumBoolKey(num)) - { - list.Add(num2); - num++; - } - if (base.Wrapped.Bools((Decal.Interop.Filters.BoolValueKey)(-1))) - { - list.Add(-1); - } - return list; - } - } - - public List LongKeys - { - get - { - List list = new List(); - int num = 0; - for (int num2 = base.Wrapped.EnumLongKey(0); num2 != -1; num2 = base.Wrapped.EnumLongKey(num)) - { - list.Add(num2); - num++; - } - if (base.Wrapped.Longs((Decal.Interop.Filters.LongValueKey)(-1), -1) != -1) - { - list.Add(-1); - } - return list; - } - } - - public List DoubleKeys - { - get - { - List list = new List(); - int num = 0; - for (int num2 = base.Wrapped.EnumDoubleKey(0); num2 != -1; num2 = base.Wrapped.EnumDoubleKey(num)) - { - list.Add(num2); - num++; - } - if (base.Wrapped.Doubles((Decal.Interop.Filters.DoubleValueKey)(-1), -1.0) != -1.0) - { - list.Add(-1); - } - return list; - } - } - - public List StringKeys - { - get - { - List list = new List(); - int num = 0; - for (int num2 = base.Wrapped.EnumStringKey(0); num2 != -1; num2 = base.Wrapped.EnumStringKey(num)) - { - list.Add(num2); - num++; - } - if (!base.Wrapped.Strings((Decal.Interop.Filters.StringValueKey)(-1), "-1").Equals("-1")) - { - list.Add(-1); - } - return list; - } - } - - public WorldObject(Decal.Interop.Filters.WorldObject obj) - : base(obj) - { - } - - /// - /// Gets the spell ID of one of the active spells on this object. - /// - /// The index in the list of active spells. - /// The spell ID. - public int ActiveSpell(int index) - { - return base.Wrapped.ActiveSpell(index); - } - - /// - /// Determines whether this object has the specified property. - /// - /// The property to check. - /// true if this object has the specified property. - public bool Exists(BoolValueKey index) - { - bool pValue; - return base.Wrapped.BoolExists((Decal.Interop.Filters.BoolValueKey)index, out pValue); - } - - /// - /// Determines whether this object has the specified property. - /// - /// The property to check. - /// true if this object has the specified property. - public bool Exists(DoubleValueKey index) - { - double pValue; - return base.Wrapped.DoubleExists((Decal.Interop.Filters.DoubleValueKey)index, out pValue); - } - - /// - /// Determines whether this object has the specified property. - /// - /// The property to check. - /// true if this object has the specified property. - public bool Exists(LongValueKey index) - { - int pValue; - return base.Wrapped.LongExists((Decal.Interop.Filters.LongValueKey)index, out pValue); - } - - /// - /// Determines whether this object has the specified property. - /// - /// The property to check. - /// true if this object has the specified property. - public bool Exists(StringValueKey index) - { - string pValue; - return base.Wrapped.StringExists((Decal.Interop.Filters.StringValueKey)index, out pValue); - } - - /// - /// Gets the value of the specified property, if it exists. - /// - /// The property to get. - /// Set to the value of the property, if it exists. - /// true if this object has the specified property. - public bool Exists(BoolValueKey index, out bool pValue) - { - return base.Wrapped.BoolExists((Decal.Interop.Filters.BoolValueKey)index, out pValue); - } - - /// - /// Gets the value of the specified property, if it exists. - /// - /// The property to get. - /// Set to the value of the property, if it exists. - /// true if this object has the specified property. - public bool Exists(DoubleValueKey index, out double pValue) - { - return base.Wrapped.DoubleExists((Decal.Interop.Filters.DoubleValueKey)index, out pValue); - } - - /// - /// Gets the value of the specified property, if it exists. - /// - /// The property to get. - /// Set to the value of the property, if it exists. - /// true if this object has the specified property. - public bool Exists(LongValueKey index, out int pValue) - { - return base.Wrapped.LongExists((Decal.Interop.Filters.LongValueKey)index, out pValue); - } - - /// - /// Gets the value of the specified property, if it exists. - /// - /// The property to get. - /// Set to the value of the property, if it exists. - /// true if this object has the specified property. - public bool Exists(StringValueKey index, out string pValue) - { - return base.Wrapped.StringExists((Decal.Interop.Filters.StringValueKey)index, out pValue); - } - - /// - /// Gets the value of the specified property, or false if this - /// object doesn't have the property. - /// - /// The property to get. - /// The property's value. - public bool Values(BoolValueKey index) - { - return Values(index, defaultValue: false); - } - - /// - /// Gets the value of the specified property, or 0.0 if this - /// object doesn't have the property. - /// - /// The property to get. - /// The property's value. - public double Values(DoubleValueKey index) - { - return Values(index, 0.0); - } - - /// - /// Gets the value of the specified property, or 0 if this - /// object doesn't have the property. - /// - /// The property to get. - /// The property's value. - public int Values(LongValueKey index) - { - return index switch - { - LongValueKey.Slot => Values(index, -1), - LongValueKey.SlotLegacy => Values(index, 0), - _ => Values(index, 0), - }; - } - - /// - /// Gets the value of the specified property, or "" if this - /// object doesn't have the property. - /// - /// The property to get. - /// The property's value. - public string Values(StringValueKey index) - { - return Values(index, string.Empty); - } - - /// - /// Gets the value of the specified property, or defaultValue - /// if this object doesn't have the property. - /// - /// The property to get. - /// The value to return if this object - /// doesn't have the property. - /// The property's value. - public bool Values(BoolValueKey index, bool defaultValue) - { - return base.Wrapped.Bools((Decal.Interop.Filters.BoolValueKey)index, defaultValue); - } - - /// - /// Gets the value of the specified property, or defaultValue - /// if this object doesn't have the property. - /// - /// The property to get. - /// The value to return if this object - /// doesn't have the property. - /// The property's value. - public double Values(DoubleValueKey index, double defaultValue) - { - return base.Wrapped.Doubles((Decal.Interop.Filters.DoubleValueKey)index, defaultValue); - } - - /// - /// Gets the value of the specified property, or defaultValue - /// if this object doesn't have the property. - /// - /// The property to get. - /// The value to return if this object - /// doesn't have the property. - /// The property's value. - public int Values(LongValueKey index, int defaultValue) - { - return base.Wrapped.Longs((Decal.Interop.Filters.LongValueKey)index, defaultValue); - } - - /// - /// Gets the value of the specified property, or defaultValue - /// if this object doesn't have the property. - /// - /// The property to get. - /// The value to return if this object - /// doesn't have the property. - /// The property's value. - public string Values(StringValueKey index, string defaultValue) - { - return base.Wrapped.Strings((Decal.Interop.Filters.StringValueKey)index, defaultValue); - } - - /// - /// Gets the coordinates of this object, or null if this - /// object doesn't have coordinates (if it's in a container, etc.) - /// - /// The coordinates of this object, or null if this - /// object doesn't have coordinates. - public CoordsObject Coordinates() - { - double NorthSouth = 0.0; - double EastWest = 0.0; - if (base.Wrapped.Coordinates(ref NorthSouth, ref EastWest)) - { - return new CoordsObject(NorthSouth, EastWest); - } - return null; - } - - /// - /// Gets this object's current offset in its landblock, or null - /// if this object doesn't have an offset (if it's in a container, etc.) - /// - /// The offset of this object, or null if this object - /// doesn't have an offset. - public Vector3Object Offset() - { - double x = 0.0; - double y = 0.0; - double z = 0.0; - if (base.Wrapped.Offset(out x, out y, out z)) - { - return new Vector3Object(x, y, z); - } - return null; - } - - /// - /// Gets a quaternion representing the orientation of this object, or - /// null if this object doesn't have an orientation (if it's in - /// a container, etc.) - /// - /// The orientation of this object, or null if this - /// object doesn't have an orientation. - public Vector4Object Orientation() - { - double w = 0.0; - double x = 0.0; - double y = 0.0; - double z = 0.0; - if (base.Wrapped.Orientation(out w, out x, out y, out z)) - { - return new Vector4Object(w, x, y, z); - } - return null; - } - - /// - /// Gets the raw coordinates of this object, or null if this - /// object doesn't have coordinates (if it's in a container, etc.) - /// - /// The raw coordinates of this object, or null if this - /// object doesn't have coordinates. - public Vector3Object RawCoordinates() - { - double pX = 0.0; - double pY = 0.0; - double pZ = 0.0; - if (base.Wrapped.RawCoordinates(ref pX, ref pY, ref pZ)) - { - return new Vector3Object(pX, pY, pZ); - } - return null; - } - - /// - /// Gets the spell ID of one of the spells that this object casts. - /// - /// The index in the list of spells. - /// The spell ID. - public int Spell(int index) - { - return base.Wrapped.Spell(index); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/WorldObjectCollection.cs b/Unused/Decal.Adapter.Wrappers/WorldObjectCollection.cs deleted file mode 100644 index 7d45a69..0000000 --- a/Unused/Decal.Adapter.Wrappers/WorldObjectCollection.cs +++ /dev/null @@ -1,167 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -/// -/// Defines a collection of WorldObjects -/// -public class WorldObjectCollection : GenericDisposableWrapper, IEnumerable, IEnumerable -{ - public class Iterator : IEnumerator, IDisposable, IEnumerator - { - private WorldObjectCollection collection; - - private WorldObject current; - - public WorldObject Current - { - get - { - if (current == null) - { - MoveNext(); - } - return current; - } - } - - object IEnumerator.Current - { - get - { - if (current == null) - { - MoveNext(); - } - return current; - } - } - - internal Iterator(WorldObjectCollection collection) - { - this.collection = collection; - Reset(); - } - - public void Dispose() - { - collection = null; - } - - public bool MoveNext() - { - Decal.Interop.Filters.WorldObject ppObject = null; - bool num = collection.Wrapped.Next(ref ppObject); - if (num && ppObject != null) - { - current = collection.wf.GetCachedWorldObject(ppObject); - } - return num; - } - - public void Reset() - { - collection.Wrapped.Reset(); - } - } - - private WorldObject current; - - private WorldFilter wf; - - private IEnumerator myEnum; - - /// - /// Returns the number of items in the collection - /// - public int Count => base.Wrapped.Count; - - /// - /// Returns the number of items represented by the collection, taking into account stacks of items. - /// - public int Quantity => base.Wrapped.Quantity; - - public WorldObject First - { - get - { - using IEnumerator enumerator = GetEnumerator(); - return enumerator.Current; - } - } - - [Obsolete("Use Enumerators")] - [EditorBrowsable(EditorBrowsableState.Never)] - public WorldObject Current - { - get - { - if (myEnum == null) - { - myEnum = GetEnumerator(); - } - return myEnum.Current; - } - } - - internal WorldObjectCollection(WorldFilter wf, WorldIterator obj) - : base(obj) - { - this.wf = wf; - } - - /// - /// Apply a filter to this collection to limit what it returns - /// - /// filter object - public void SetFilter(WorldObjectCollectionFilter filter) - { - filter?.ApplyFilter(base.Wrapped); - } - - protected override void Dispose(bool userCalled) - { - if (myEnum != null) - { - myEnum.Dispose(); - myEnum = null; - } - base.Dispose(userCalled); - } - - [Obsolete("Use Enumerators")] - [EditorBrowsable(EditorBrowsableState.Never)] - public bool MoveNext() - { - if (myEnum == null) - { - myEnum = GetEnumerator(); - } - return myEnum.MoveNext(); - } - - [Obsolete("Use Enumerators")] - [EditorBrowsable(EditorBrowsableState.Never)] - public void Reset() - { - if (myEnum != null) - { - myEnum.Dispose(); - myEnum = null; - } - } - - public IEnumerator GetEnumerator() - { - return new Iterator(this); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return new Iterator(this); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/WorldObjectCollectionFilter.cs b/Unused/Decal.Adapter.Wrappers/WorldObjectCollectionFilter.cs deleted file mode 100644 index d95fef3..0000000 --- a/Unused/Decal.Adapter.Wrappers/WorldObjectCollectionFilter.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using Decal.Interop.Filters; - -namespace Decal.Adapter.Wrappers; - -public abstract class WorldObjectCollectionFilter -{ - internal abstract void ApplyFilter(WorldIterator wi); - - internal virtual void ApplyFilter(Decal.Interop.Filters.Vendor ven) - { - throw new NotImplementedException("This method has not beed implemented"); - } -} diff --git a/Unused/Decal.Adapter.Wrappers/WriteTextFormats.cs b/Unused/Decal.Adapter.Wrappers/WriteTextFormats.cs deleted file mode 100644 index 65ac219..0000000 --- a/Unused/Decal.Adapter.Wrappers/WriteTextFormats.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; - -namespace Decal.Adapter.Wrappers; - -/// -/// Formats to use when writing text to HUDs -/// -[Flags] -[CLSCompliant(true)] -public enum WriteTextFormats -{ - Bottom = 8, - Center = 1, - ExpandTabs = 0x40, - NoClip = 0x100, - /// - /// Implies Top and Left - /// - None = 0, - Right = 2, - RightToLeftReading = 0x20000, - SingleLine = 0x20, - VerticalCenter = 4, - WordBreak = 0x10 -} diff --git a/Unused/Decal.Adapter.Wrappers/hookIndexType.cs b/Unused/Decal.Adapter.Wrappers/hookIndexType.cs deleted file mode 100644 index 816e945..0000000 --- a/Unused/Decal.Adapter.Wrappers/hookIndexType.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Decal.Adapter.Wrappers; - -internal enum hookIndexType -{ - Attribute, - AttributeClicks, - AttributeStart, - AttributeTotalXP, - Skill, - SkillClicks, - SkillFreePoints, - SkillTotalXP, - SkillTrainLevel, - Vital, - VitalClicks, - VitalTotalXP, - Misc -} diff --git a/Unused/Decal.Adapter/BaseEventAttribute.cs b/Unused/Decal.Adapter/BaseEventAttribute.cs deleted file mode 100644 index 2df09ae..0000000 --- a/Unused/Decal.Adapter/BaseEventAttribute.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; - -namespace Decal.Adapter; - -[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] -public sealed class BaseEventAttribute : Attribute -{ - private string eventName; - - private string baseFilter; - - public string EventName => eventName; - - public string FilterName => baseFilter; - - public BaseEventAttribute(string eventName) - : this(eventName, string.Empty) - { - } - - public BaseEventAttribute(string eventName, string baseFilter) - { - this.eventName = eventName; - this.baseFilter = baseFilter; - } -} diff --git a/Unused/Decal.Adapter/COMHResultException.cs b/Unused/Decal.Adapter/COMHResultException.cs deleted file mode 100644 index 2e99428..0000000 --- a/Unused/Decal.Adapter/COMHResultException.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Adapter; - -internal class COMHResultException : COMException -{ - internal COMHResultException(HResults hResult) - { - base.HResult = (int)hResult; - } -} diff --git a/Unused/Decal.Adapter/ChatClickInterceptEventArgs.cs b/Unused/Decal.Adapter/ChatClickInterceptEventArgs.cs deleted file mode 100644 index 89a7c71..0000000 --- a/Unused/Decal.Adapter/ChatClickInterceptEventArgs.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Decal.Adapter; - -public class ChatClickInterceptEventArgs : EatableEventArgs -{ - private string myText; - - private int myId; - - public string Text => myText; - - public int Id => myId; - - internal ChatClickInterceptEventArgs(string text, int id, bool eat) - : base(eat) - { - myText = text; - myId = id; - } -} diff --git a/Unused/Decal.Adapter/ChatParserInterceptEventArgs.cs b/Unused/Decal.Adapter/ChatParserInterceptEventArgs.cs deleted file mode 100644 index a9cae2d..0000000 --- a/Unused/Decal.Adapter/ChatParserInterceptEventArgs.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Decal.Adapter; - -public class ChatParserInterceptEventArgs : EatableEventArgs -{ - private string myText; - - public string Text => myText; - - internal ChatParserInterceptEventArgs(string text, bool eat) - : base(eat) - { - myText = text; - } -} diff --git a/Unused/Decal.Adapter/ChatTextInterceptEventArgs.cs b/Unused/Decal.Adapter/ChatTextInterceptEventArgs.cs deleted file mode 100644 index 4fc66df..0000000 --- a/Unused/Decal.Adapter/ChatTextInterceptEventArgs.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Decal.Adapter; - -public class ChatTextInterceptEventArgs : EatableEventArgs -{ - private string myText; - - private int myColor; - - private int myTarget; - - public string Text => myText; - - public int Color => myColor; - - public int Target => myTarget; - - internal ChatTextInterceptEventArgs(string text, int color, int target, bool eat) - : base(eat) - { - myText = text; - myColor = color; - myTarget = target; - } -} diff --git a/Unused/Decal.Adapter/CheckBoxChangeEventArgs.cs b/Unused/Decal.Adapter/CheckBoxChangeEventArgs.cs deleted file mode 100644 index 5ade8ba..0000000 --- a/Unused/Decal.Adapter/CheckBoxChangeEventArgs.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Decal.Adapter; - -public class CheckBoxChangeEventArgs : ControlEventArgs -{ - private bool check; - - public bool Checked => check; - - internal CheckBoxChangeEventArgs(int ID, bool Check) - : base(ID) - { - check = Check; - } -} diff --git a/Unused/Decal.Adapter/ContainerOpenedEventArgs.cs b/Unused/Decal.Adapter/ContainerOpenedEventArgs.cs deleted file mode 100644 index aa6f8c7..0000000 --- a/Unused/Decal.Adapter/ContainerOpenedEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter; - -public class ContainerOpenedEventArgs : EventArgs -{ - private int myItemGUID; - - public int ItemGuid => myItemGUID; - - internal ContainerOpenedEventArgs(int itemGUID) - { - myItemGUID = itemGUID; - } -} diff --git a/Unused/Decal.Adapter/ControlEventArgs.cs b/Unused/Decal.Adapter/ControlEventArgs.cs deleted file mode 100644 index 8a0c816..0000000 --- a/Unused/Decal.Adapter/ControlEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter; - -public class ControlEventArgs : EventArgs -{ - private int id; - - public int Id => id; - - internal ControlEventArgs(int ID) - { - id = ID; - } -} diff --git a/Unused/Decal.Adapter/ControlEventAttribute.cs b/Unused/Decal.Adapter/ControlEventAttribute.cs deleted file mode 100644 index e99b2f5..0000000 --- a/Unused/Decal.Adapter/ControlEventAttribute.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; - -namespace Decal.Adapter; - -/// -/// ControlEvent AutoWireup -/// -[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] -public sealed class ControlEventAttribute : ViewBaseAttribute -{ - private string myControl; - - private string myEventName; - - /// - /// Control Name - /// - public string Control => myControl; - - /// - /// Event to Wire - /// - public string EventName => myEventName; - - /// - /// Constructs the ControlEvent - /// - /// Control Name - /// Event to Wire - public ControlEventAttribute(string control, string eventName) - { - myControl = control; - myEventName = eventName; - } -} diff --git a/Unused/Decal.Adapter/ControlReferenceArrayAttribute.cs b/Unused/Decal.Adapter/ControlReferenceArrayAttribute.cs deleted file mode 100644 index e13133c..0000000 --- a/Unused/Decal.Adapter/ControlReferenceArrayAttribute.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.ObjectModel; - -namespace Decal.Adapter; - -/// -/// ControlReferenceArray AutoWireup -/// -[AttributeUsage(AttributeTargets.Field)] -public sealed class ControlReferenceArrayAttribute : ViewBaseAttribute -{ - private Collection myControls; - - /// - /// Control collection - /// - public Collection Controls => myControls; - - /// - /// Constructs a new ControlReference array - /// - /// Names of the controls to put in the array - public ControlReferenceArrayAttribute(params string[] controls) - { - myControls = new Collection(controls); - } -} diff --git a/Unused/Decal.Adapter/ControlReferenceAttribute.cs b/Unused/Decal.Adapter/ControlReferenceAttribute.cs deleted file mode 100644 index 0edaff4..0000000 --- a/Unused/Decal.Adapter/ControlReferenceAttribute.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; - -namespace Decal.Adapter; - -/// -/// ControlReference AutoWireup -/// -[AttributeUsage(AttributeTargets.Field)] -public sealed class ControlReferenceAttribute : ViewBaseAttribute -{ - private string myControl; - - /// - /// The Control Name - /// - public string Control => myControl; - - /// - /// Construct a new ControlReference - /// - /// Control to reference - public ControlReferenceAttribute(string control) - { - myControl = control; - } -} diff --git a/Unused/Decal.Adapter/CoreManager.cs b/Unused/Decal.Adapter/CoreManager.cs deleted file mode 100644 index 9f49621..0000000 --- a/Unused/Decal.Adapter/CoreManager.cs +++ /dev/null @@ -1,987 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Threading; -using Decal.Adapter.IDQueue; -using Decal.Adapter.Messages; -using Decal.Adapter.Support; -using Decal.Adapter.Wrappers; -using Decal.Interop.Core; -using Decal.Interop.D3DService; -using Decal.Interop.DHS; -using Decal.Interop.Filters; -using Decal.Interop.Inject; -using Decal.Interop.Render; -using Microsoft.Win32; - -namespace Decal.Adapter; - -/// -/// Lifetime Service required for the .NET Surrogate to function. -/// -[CLSCompliant(true)] -public sealed class CoreManager : MarshalByRefObject -{ - private struct sAssemblyPreloadData - { - public string AssemblyName; - - public string Path; - } - - private static bool myServiceRunning; - - private static CoreManager myService; - - private DecalCoreClass myDecal; - - private ACHooksClass myHooks; - - private PluginSite mySitev1; - - private DecalWrapper myWrappedDecal; - - private HooksWrapper myWrappedHooks; - - private global::Decal.Adapter.Wrappers.HotkeySystem myDHS; - - private CharacterFilter myCharacterFilter; - - private WorldFilter myWorldFilter; - - private global::Decal.Adapter.Wrappers.EchoFilter2 myEchoFilter; - - private D3DService myD3DService; - - private RenderServiceWrapper myRenderService; - - private FairIDQueue myIDQueue; - - private Collection myPaths = new Collection(); - - private Dictionary> myAssemblies = new Dictionary>(); - - private int myAssemblyPreloadCounter = 1; - - private bool myAssemblyPreloadStarted; - - private Dictionary myFilters = new Dictionary(); - - private Dictionary myNamedFilters = new Dictionary(); - - private Dictionary myServices = new Dictionary(); - - private Dictionary myNamedServices = new Dictionary(); - - private Dictionary myPlugins = new Dictionary(); - - private EventHandler myItemSelected; - - private EventHandler myItemDestroyed; - - private EventHandler myChatParserIntercept; - - private EventHandler myRegionChange3D; - - private EventHandler myChatTextIntercept; - - private EventHandler myStatusTextIntercept; - - private EventHandler myMessageProcessed; - - private EventHandler myContainerOpened; - - private EventHandler myChatClickIntercept; - - private EventHandler myWindowMessage; - - private EventHandler myFilterInitComplete; - - private EventHandler myServiceInitComplete; - - private EventHandler myPluginInitComplete; - - private EventHandler myFilterTermComplete; - - private EventHandler myServiceTermComplete; - - private EventHandler myPluginTermComplete; - - private EventHandler myRender_PreUI; - - private EventHandler myExtensionMessage; - - private AppDomain myPluginDomain; - - private AppDomain myDomain; - - /// - /// Returns if the service was initialized by Decal. - /// - public static bool ServiceRunning => myServiceRunning; - - /// - /// Returns the Singleton instance of the Service - /// (Initializes if necessary) - /// - public static CoreManager Current - { - get - { - if (myService == null) - { - myService = new CoreManager(); - } - return myService; - } - } - - /// - /// Tracing level for Decal.Adapter, and all loaded plugins. - /// - public static int TracingLevel => Util.TraceLevel; - - /// - /// FileService (Decal.FileService) - /// - public FilterBase FileService => Filter("Decal.FileService"); - - /// - /// Decal Hotkey System - /// - public global::Decal.Adapter.Wrappers.HotkeySystem HotkeySystem => myDHS; - - /// - /// Character Filter - /// - [CLSCompliant(false)] - public CharacterFilter CharacterFilter => myCharacterFilter; - - [CLSCompliant(false)] - public WorldFilter WorldFilter => myWorldFilter; - - /// - /// Direct3D Service - /// - [CLSCompliant(false)] - public global::Decal.Adapter.Wrappers.EchoFilter2 EchoFilter => myEchoFilter; - - [CLSCompliant(false)] - public D3DService D3DService => myD3DService; - - [CLSCompliant(false)] - public HooksWrapper Actions => myWrappedHooks; - - [CLSCompliant(false)] - public DecalWrapper Decal => myWrappedDecal; - - public RenderServiceWrapper RenderService => myRenderService; - - public FairIDQueue IDQueue => myIDQueue; - - internal AppDomain PluginDomain => myDomain; - - [CLSCompliant(false)] - public event EventHandler ItemSelected - { - add - { - myItemSelected = (EventHandler)Delegate.Combine(myItemSelected, value); - } - remove - { - myItemSelected = (EventHandler)Delegate.Remove(myItemSelected, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ItemDestroyed - { - add - { - myItemDestroyed = (EventHandler)Delegate.Combine(myItemDestroyed, value); - } - remove - { - myItemDestroyed = (EventHandler)Delegate.Remove(myItemDestroyed, value); - } - } - - [CLSCompliant(false)] - public event EventHandler CommandLineText - { - add - { - myChatParserIntercept = (EventHandler)Delegate.Combine(myChatParserIntercept, value); - } - remove - { - myChatParserIntercept = (EventHandler)Delegate.Remove(myChatParserIntercept, value); - } - } - - [CLSCompliant(false)] - public event EventHandler StatusBoxMessage - { - add - { - myStatusTextIntercept = (EventHandler)Delegate.Combine(myStatusTextIntercept, value); - } - remove - { - myStatusTextIntercept = (EventHandler)Delegate.Remove(myStatusTextIntercept, value); - } - } - - [CLSCompliant(false)] - public event EventHandler RegionChange3D - { - add - { - myRegionChange3D = (EventHandler)Delegate.Combine(myRegionChange3D, value); - } - remove - { - myRegionChange3D = (EventHandler)Delegate.Remove(myRegionChange3D, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChatBoxMessage - { - add - { - myChatTextIntercept = (EventHandler)Delegate.Combine(myChatTextIntercept, value); - } - remove - { - myChatTextIntercept = (EventHandler)Delegate.Remove(myChatTextIntercept, value); - } - } - - [CLSCompliant(false)] - public event EventHandler MessageProcessed - { - add - { - myMessageProcessed = (EventHandler)Delegate.Combine(myMessageProcessed, value); - } - remove - { - myMessageProcessed = (EventHandler)Delegate.Remove(myMessageProcessed, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ContainerOpened - { - add - { - myContainerOpened = (EventHandler)Delegate.Combine(myContainerOpened, value); - } - remove - { - myContainerOpened = (EventHandler)Delegate.Remove(myContainerOpened, value); - } - } - - [CLSCompliant(false)] - public event EventHandler ChatNameClicked - { - add - { - myChatClickIntercept = (EventHandler)Delegate.Combine(myChatClickIntercept, value); - } - remove - { - myChatClickIntercept = (EventHandler)Delegate.Remove(myChatClickIntercept, value); - } - } - - public event EventHandler FilterInitComplete - { - add - { - myFilterInitComplete = (EventHandler)Delegate.Combine(myFilterInitComplete, value); - } - remove - { - myFilterInitComplete = (EventHandler)Delegate.Remove(myFilterInitComplete, value); - } - } - - public event EventHandler ServiceInitComplete - { - add - { - myServiceInitComplete = (EventHandler)Delegate.Combine(myServiceInitComplete, value); - } - remove - { - myServiceInitComplete = (EventHandler)Delegate.Remove(myServiceInitComplete, value); - } - } - - public event EventHandler PluginInitComplete - { - add - { - myPluginInitComplete = (EventHandler)Delegate.Combine(myPluginInitComplete, value); - } - remove - { - myPluginInitComplete = (EventHandler)Delegate.Remove(myPluginInitComplete, value); - } - } - - public event EventHandler FilterTermComplete - { - add - { - myFilterTermComplete = (EventHandler)Delegate.Combine(myFilterTermComplete, value); - } - remove - { - myFilterTermComplete = (EventHandler)Delegate.Remove(myFilterTermComplete, value); - } - } - - public event EventHandler ServiceTermComplete - { - add - { - myServiceTermComplete = (EventHandler)Delegate.Combine(myServiceTermComplete, value); - } - remove - { - myServiceTermComplete = (EventHandler)Delegate.Remove(myServiceTermComplete, value); - } - } - - public event EventHandler PluginTermComplete - { - add - { - myPluginTermComplete = (EventHandler)Delegate.Combine(myPluginTermComplete, value); - } - remove - { - myPluginTermComplete = (EventHandler)Delegate.Remove(myPluginTermComplete, value); - } - } - - public event EventHandler RenderFrame - { - add - { - myRender_PreUI = (EventHandler)Delegate.Combine(myRender_PreUI, value); - } - remove - { - myRender_PreUI = (EventHandler)Delegate.Remove(myRender_PreUI, value); - } - } - - [CLSCompliant(false)] - public event EventHandler WindowMessage - { - add - { - myWindowMessage = (EventHandler)Delegate.Combine(myWindowMessage, value); - } - remove - { - myWindowMessage = (EventHandler)Delegate.Remove(myWindowMessage, value); - } - } - - internal event EventHandler ExtensionMessage - { - add - { - myExtensionMessage = (EventHandler)Delegate.Combine(myExtensionMessage, value); - } - remove - { - myExtensionMessage = (EventHandler)Delegate.Remove(myExtensionMessage, value); - } - } - - private CoreManager() - { - AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; - string location = System.Reflection.Assembly.GetExecutingAssembly().Location; - AddAssemblyPath(Path.GetDirectoryName(location)); - myDomain = AppDomain.CurrentDomain; - Util.InitializeTracing("HKEY_LOCAL_MACHINE\\Software\\Decal\\Decal.Adapter", "Tracing", 0); - } - - private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) - { - AppDomain appDomain = (AppDomain)sender; - Assembly[] assemblies = appDomain.GetAssemblies(); - string text = appDomain.ApplyPolicy(args.Name); - if (string.IsNullOrEmpty(text)) - { - text = args.Name; - } - Assembly[] array = assemblies; - foreach (Assembly assembly in array) - { - if (assembly.FullName == text) - { - return assembly; - } - } - if (!appDomain.IsDefaultAppDomain()) - { - assemblies = myDomain.GetAssemblies(); - array = assemblies; - foreach (Assembly assembly2 in array) - { - if (assembly2.FullName == text) - { - AssemblyName name = assembly2.GetName(copiedName: false); - return appDomain.Load(name); - } - } - } - string text2 = ((text.IndexOf(",") <= 0) ? text : text.Substring(0, text.IndexOf(","))); - if (!string.IsNullOrEmpty(text2)) - { - text2 = text2.ToLowerInvariant(); - if (string.IsNullOrEmpty(Path.GetExtension(text2))) - { - text2 += ".dll"; - } - foreach (string myPath in myPaths) - { - if (File.Exists(Path.Combine(myPath, text2))) - { - AssemblyName assemblyName = new AssemblyName(); - assemblyName.CodeBase = Path.Combine(myPath, text2); - return appDomain.Load(assemblyName); - } - } - } - Util.WriteLine("Assembly resolve failed for assembly:" + args.Name); - return null; - } - - private void AddAssemblyPath(string path) - { - string item = path.ToLowerInvariant(); - if (!myPaths.Contains(item)) - { - myPaths.Add(item); - } - } - - private void myDecal_InitializeComplete(eDecalComponentType myComponent) - { - Util.WriteLine("InitializeComplete for: " + myComponent); - switch (myComponent) - { - case eDecalComponentType.eService: - Message.Initialize(Path.Combine((string)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Decal\\Agent", "AgentPath", ""), "messages.xml")); - if (myWrappedDecal != null) - { - try - { - if (myWrappedDecal.GetObject("services\\D3DService.Service") is CService obj) - { - myD3DService = new D3DService(obj); - } - if (myWrappedDecal.GetObject("services\\DecalRender.RenderService") is RenderService render) - { - myRenderService = new RenderServiceWrapper(render); - } - object obj2 = myWrappedDecal.GetObject("services\\DecalPlugins.InjectService\\site", DecalWrapper.IID_IUNKNOWN); - mySitev1 = obj2 as PluginSite; - } - catch (Exception ex) - { - Util.WriteLine("Unable to get service reference: " + ex.Message); - } - } - else - { - Util.WriteLine("Not getting services, we don't have a Decal object to call GetObject on."); - } - try - { - myIDQueue = new FairIDQueue(); - } - catch (Exception ex2) - { - Util.WriteLine("Service initialization exception: " + ex2.Message); - } - Util.SafeFireEvent(this, myServiceInitComplete, new EventArgs()); - break; - case eDecalComponentType.eNetworkFilter: - if (myWrappedDecal != null) - { - try - { - if (myWrappedDecal.GetObject("services\\DecalNet.NetService\\DecalFilters.World") is World obj3) - { - myWorldFilter = new WorldFilter(obj3); - } - if (myWrappedDecal.GetObject("services\\DecalNet.NetService\\DecalFilters.CharacterStats") is CharacterStats obj4) - { - myCharacterFilter = new CharacterFilter(obj4); - } - if (myWrappedDecal.GetObject("services\\DecalNet.NetService\\DecalFilters.EchoFilter2") is global::Decal.Interop.Filters.EchoFilter2 obj5) - { - myEchoFilter = new global::Decal.Adapter.Wrappers.EchoFilter2(obj5); - } - } - catch (Exception ex3) - { - Util.WriteLine("Unable to get filter reference: " + ex3.Message); - } - } - else - { - Util.WriteLine("Not getting filters, we don't have a Decal object to call GetObject on."); - } - Util.SafeFireEvent(this, myFilterInitComplete, new EventArgs()); - DecrementAssemblyPreloadLockCounter(); - break; - case eDecalComponentType.ePlugin: - if (myWrappedDecal.GetObject("plugins\\DHS.HotkeySystem") is global::Decal.Interop.DHS.HotkeySystem hks) - { - myDHS = new global::Decal.Adapter.Wrappers.HotkeySystem(hks); - } - myIDQueue.Start(); - Util.SafeFireEvent(this, myPluginInitComplete, new EventArgs()); - break; - } - } - - private void myDecal_TerminateComplete(eDecalComponentType myComponent) - { - Util.WriteLine("TerminateComplete for: " + myComponent); - switch (myComponent) - { - case eDecalComponentType.eService: - if (myD3DService != null) - { - myD3DService.Dispose(); - myD3DService = null; - } - if (myRenderService != null) - { - myRenderService.Dispose(); - myRenderService = null; - } - if (mySitev1 != null) - { - Marshal.ReleaseComObject(mySitev1); - } - myServices.Clear(); - myNamedServices.Clear(); - Util.SafeFireEvent(this, myServiceTermComplete, new EventArgs()); - break; - case eDecalComponentType.eNetworkFilter: - if (myWorldFilter != null) - { - myWorldFilter.Dispose(); - myWorldFilter = null; - } - if (myCharacterFilter != null) - { - myCharacterFilter.Dispose(); - myCharacterFilter = null; - } - if (myEchoFilter != null) - { - myEchoFilter.Dispose(); - myEchoFilter = null; - } - myFilters.Clear(); - myNamedFilters.Clear(); - Util.SafeFireEvent(this, myFilterTermComplete, new EventArgs()); - break; - case eDecalComponentType.ePlugin: - myIDQueue.Stop(); - if (myDHS != null) - { - myDHS.Dispose(); - myDHS = null; - } - myPlugins.Clear(); - if (myPluginDomain != null) - { - lock (myAssemblies) - { - if (myAssemblies.ContainsKey(myPluginDomain)) - { - myAssemblies[myPluginDomain].Clear(); - myAssemblies.Remove(myPluginDomain); - } - AppDomain.Unload(myPluginDomain); - myPluginDomain = null; - } - } - Util.SafeFireEvent(this, myPluginTermComplete, new EventArgs()); - break; - } - } - - private void myHooks_ObjectSelected(int lGUID) - { - Util.SafeFireEvent(this, myItemSelected, new ItemSelectedEventArgs(lGUID)); - } - - private void myHooks_ObjectDestroyed(int lGUID) - { - Util.SafeFireEvent(this, myItemDestroyed, new ItemDestroyedEventArgs(lGUID)); - } - - private void myHooks_AC3DRegionChanged(int left, int top, int right, int bottom) - { - Util.SafeFireEvent(this, myRegionChange3D, new RegionChange3DEventArgs(left, top, right, bottom)); - } - - private void myHooks_ChatParserIntercept(string bstrText, ref bool bEat) - { - Util.SafeFireEvent(this, myChatParserIntercept, new ChatParserInterceptEventArgs(bstrText, bEat), ref bEat); - } - - private void myHooks_StatusTextIntercept(string bstrText, ref bool bEat) - { - Util.SafeFireEvent(this, myStatusTextIntercept, new StatusTextInterceptEventArgs(bstrText, bEat), ref bEat); - } - - private void myHooks_ChatTextIntercept(string bstrText, int lColor, int target, ref bool bEat) - { - Util.SafeFireEvent(this, myChatTextIntercept, new ChatTextInterceptEventArgs(bstrText, lColor, target, bEat), ref bEat); - } - - private void myHooks_MessageProcessed(int pbData, int dwSize) - { - if (myMessageProcessed != null) - { - MessageProcessedEventArgs args = new MessageProcessedEventArgs(pbData, dwSize); - Util.SafeFireEvent(this, myMessageProcessed, args); - } - } - - private void myHooks_ContainerOpened(int lGUID) - { - Util.SafeFireEvent(this, myContainerOpened, new ContainerOpenedEventArgs(lGUID)); - } - - private void myHooks_ChatClickIntercept(string bstrText, int id, ref bool bEat) - { - Util.SafeFireEvent(this, myChatClickIntercept, new ChatClickInterceptEventArgs(bstrText, id, bEat), ref bEat); - } - - private void myHooks_RenderPreUI() - { - Util.SafeFireEvent(this, myRender_PreUI, new EventArgs()); - } - - internal bool FireWindowMessage(int HWND, short uMsg, int wParam, int lParam) - { - bool eaten = false; - WindowMessageEventArgs args = new WindowMessageEventArgs(HWND, uMsg, wParam, lParam); - Util.SafeFireEvent(this, myWindowMessage, args, ref eaten); - return eaten; - } - - internal void FireExtensionMessage(object sender, AdapterMessageEventArgs args) - { - args.CanAddHandlers = true; - Util.SafeFireEvent(this, myExtensionMessage, args); - args.CanAddHandlers = false; - } - - public FilterBase Filter(string filterName) - { - try - { - if (myNamedFilters.ContainsKey(filterName)) - { - return myNamedFilters[filterName]; - } - Type type = Type.GetType(filterName); - if (null != type && myFilters.ContainsKey(type)) - { - return myFilters[type]; - } - } - catch (Exception) - { - } - return null; - } - - public T Filter() where T : FilterBase - { - try - { - if (myFilters.ContainsKey(typeof(T))) - { - return (T)myFilters[typeof(T)]; - } - } - catch (Exception) - { - } - return null; - } - - public ServiceBase Service(string serviceName) - { - try - { - if (myNamedServices.ContainsKey(serviceName)) - { - return myNamedServices[serviceName]; - } - Type type = Type.GetType(serviceName); - if (null != type && myServices.ContainsKey(type)) - { - return myServices[type]; - } - } - catch (Exception) - { - } - return null; - } - - public T Service() where T : ServiceBase - { - try - { - if (myServices.ContainsKey(typeof(T))) - { - return (T)myServices[typeof(T)]; - } - } - catch (Exception) - { - } - return null; - } - - /// - /// Get Mapped Keyboard Key - /// - /// Name to retrive mapping for. - /// Mapped Key - public int QueryKeyBoardMap(string name) - { - int result = 0; - if (mySitev1 != null) - { - result = mySitev1.QueryKeyboardMap(name); - } - return result; - } - - internal void AddFilter(FilterBase newFilter) - { - AddFilter(newFilter.ReferenceName, newFilter); - } - - internal void AddFilter(string filterName, FilterBase newFilter) - { - myFilters.Add(newFilter.GetType(), newFilter); - myNamedFilters.Add(filterName, newFilter); - } - - internal void AddService(ServiceBase newService) - { - AddService(newService.ReferenceName, newService); - } - - internal void AddService(string serviceName, ServiceBase newService) - { - myServices.Add(newService.GetType(), newService); - myNamedServices.Add(serviceName, newService); - } - - internal void AddPlugin(PluginBase newPlugin) - { - AddPlugin(newPlugin.ReferenceName, newPlugin); - } - - internal void AddPlugin(string pluginName, PluginBase newPlugin) - { - myPlugins.Add(pluginName, newPlugin); - } - - /// - /// Load the Assembly requested, first checking our internal cache - /// - /// Assembly name to load - /// Path to the assembly - /// Loaded Assembly, from cache if already loaded - internal Assembly Assembly(string name, string path) - { - return Assembly(name, path, AppDomain.CurrentDomain); - } - - internal Assembly Assembly(string name, string path, AppDomain useDomain) - { - lock (myAssemblies) - { - string text = name.ToLowerInvariant(); - useDomain = myDomain; - Dictionary dictionary; - if (myAssemblies.ContainsKey(useDomain)) - { - dictionary = myAssemblies[useDomain]; - } - else - { - myAssemblies.Add(useDomain, new Dictionary()); - dictionary = myAssemblies[useDomain]; - } - if (dictionary.ContainsKey(text)) - { - return dictionary[text]; - } - AddAssemblyPath(path); - Assembly assembly = System.Reflection.Assembly.LoadFrom(Path.Combine(path, text)); - dictionary.Add(text, assembly); - return assembly; - } - } - - internal void Initialize(DecalCore pDecal) - { - Util.WriteLine("Decal.Adapter Lifetime-service Initialize Begun"); - myServiceRunning = true; - Util.Write("Get Decal.. "); - myDecal = (DecalCoreClass)pDecal; - myWrappedDecal = new DecalWrapper(myDecal); - Util.WriteLine("Sink Decal Events.. "); - myDecal.InitializeComplete += myDecal_InitializeComplete; - myDecal.TerminateComplete += myDecal_TerminateComplete; - Util.Write("Get Hooks.. "); - myHooks = (ACHooksClass)myDecal.Hooks; - myWrappedHooks = new HooksWrapper(myHooks); - Util.WriteLine("Sink Hooks Events.. "); - myHooks.ChatTextIntercept += myHooks_ChatTextIntercept; - myHooks.StatusTextIntercept += myHooks_StatusTextIntercept; - myHooks.ChatParserIntercept += myHooks_ChatParserIntercept; - myHooks.AC3DRegionChanged += myHooks_AC3DRegionChanged; - myHooks.ObjectSelected += myHooks_ObjectSelected; - myHooks.ObjectDestroyed += myHooks_ObjectDestroyed; - myHooks.MessageProcessed += myHooks_MessageProcessed; - myHooks.ContainerOpened += myHooks_ContainerOpened; - myHooks.ChatClickIntercept += myHooks_ChatClickIntercept; - myHooks.RenderPreUI += myHooks_RenderPreUI; - Util.WriteLine("Decal.Adapter Lifetime-service Initiliazed"); - } - - internal void Terminate() - { - myDecal.InitializeComplete -= myDecal_InitializeComplete; - myDecal.TerminateComplete -= myDecal_TerminateComplete; - myHooks.ChatTextIntercept -= myHooks_ChatTextIntercept; - myHooks.StatusTextIntercept -= myHooks_StatusTextIntercept; - myHooks.ChatParserIntercept -= myHooks_ChatParserIntercept; - myHooks.AC3DRegionChanged -= myHooks_AC3DRegionChanged; - myHooks.ObjectSelected -= myHooks_ObjectSelected; - myHooks.ObjectDestroyed -= myHooks_ObjectDestroyed; - myHooks.MessageProcessed -= myHooks_MessageProcessed; - myHooks.ContainerOpened -= myHooks_ContainerOpened; - myHooks.ChatClickIntercept -= myHooks_ChatClickIntercept; - myHooks.RenderPreUI -= myHooks_RenderPreUI; - myWrappedDecal.Dispose(); - myWrappedDecal = null; - Marshal.ReleaseComObject(myDecal); - myDecal = null; - myHooks = null; - myWrappedHooks.Dispose(); - myWrappedHooks = null; - myService = null; - myServiceRunning = false; - } - - public void IncrementAssemblyPreloadLockCounter() - { - myAssemblyPreloadCounter++; - } - - public void DecrementAssemblyPreloadLockCounter() - { - myAssemblyPreloadCounter--; - if (myAssemblyPreloadCounter < 0) - { - myAssemblyPreloadCounter = 0; - } - if (myAssemblyPreloadCounter != 0 || myAssemblyPreloadStarted) - { - return; - } - myAssemblyPreloadStarted = true; - List list = new List(); - Guid clsidAdvance = Guid.Empty; - Guid guid = new Guid("{71A69713-6593-47EC-0002-0000000DECA1}"); - DecalEnum decalEnum = ((IDecalCore)Decal.Underlying).get_Configuration("Plugins", ref clsidAdvance); - try - { - while (true) - { - decalEnum.Next(); - if (!decalEnum.Enabled || decalEnum.SurrogateClass != guid) - { - continue; - } - try - { - if (decalEnum.Restricted) - { - continue; - } - } - catch - { - continue; - } - list.Add(new sAssemblyPreloadData - { - AssemblyName = (string)((IDecalEnum)decalEnum).get_Property("Assembly"), - Path = (string)((IDecalEnum)decalEnum).get_Property("Path") - }); - } - } - catch - { - } - finally - { - Marshal.ReleaseComObject(decalEnum); - } - ThreadPool.QueueUserWorkItem(AssemblyPreloadThreadProc, list); - } - - internal void AssemblyPreloadThreadProc(object data) - { - if (!(data is List list)) - { - return; - } - foreach (sAssemblyPreloadData item in list) - { - try - { - Util.WriteLine("Preloading plugin assembly {0}, {1}", item.AssemblyName, item.Path); - Assembly(item.AssemblyName, item.Path, AppDomain.CurrentDomain); - } - catch - { - } - } - } -} diff --git a/Unused/Decal.Adapter/DecalExtensionType.cs b/Unused/Decal.Adapter/DecalExtensionType.cs deleted file mode 100644 index 77524bb..0000000 --- a/Unused/Decal.Adapter/DecalExtensionType.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace Decal.Adapter; - -/// -/// -/// -[CLSCompliant(true)] -public enum DecalExtensionType -{ - Surrogate, - Service, - InputAction, - FileFilter, - NetworkFilter, - Plugin -} diff --git a/Unused/Decal.Adapter/DirectoryProxy.cs b/Unused/Decal.Adapter/DirectoryProxy.cs deleted file mode 100644 index 2b78563..0000000 --- a/Unused/Decal.Adapter/DirectoryProxy.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using Decal.Interop.Core; - -namespace Decal.Adapter; - -public sealed class DirectoryProxy : MarshalByRefObject, IDecalDirectory -{ - public object Lookup(string strName) - { - throw new NotImplementedException("The method or operation is not implemented."); - } -} diff --git a/Unused/Decal.Adapter/DirectoryResolveEventArgs.cs b/Unused/Decal.Adapter/DirectoryResolveEventArgs.cs deleted file mode 100644 index b89759c..0000000 --- a/Unused/Decal.Adapter/DirectoryResolveEventArgs.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; - -namespace Decal.Adapter; - -public class DirectoryResolveEventArgs : EventArgs -{ - private string myPath; - - private object myResult; - - public string Path => myPath; - - public object Result - { - get - { - return myResult; - } - set - { - myResult = value; - } - } - - internal DirectoryResolveEventArgs(string path) - { - myPath = path; - } -} diff --git a/Unused/Decal.Adapter/DisposableByRefObject.cs b/Unused/Decal.Adapter/DisposableByRefObject.cs deleted file mode 100644 index f2a6434..0000000 --- a/Unused/Decal.Adapter/DisposableByRefObject.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; - -namespace Decal.Adapter; - -public class DisposableByRefObject : MarshalByRefObject, IDisposable -{ - private bool isDisposed; - - private EventHandler myDisposing; - - public event EventHandler Disposing - { - add - { - myDisposing = (EventHandler)Delegate.Combine(myDisposing, value); - } - remove - { - myDisposing = (EventHandler)Delegate.Remove(myDisposing, value); - } - } - - internal DisposableByRefObject() - { - } - - ~DisposableByRefObject() - { - Dispose(userCalled: false); - } - - public void Dispose() - { - Dispose(userCalled: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool userCalled) - { - if (!isDisposed && userCalled && myDisposing != null) - { - try - { - myDisposing(this, new EventArgs()); - } - catch - { - } - } - isDisposed = true; - } - - protected void EnforceDisposedOnce() - { - if (isDisposed) - { - throw new ObjectDisposedException(GetType().ToString()); - } - } -} diff --git a/Unused/Decal.Adapter/DisposableObjectDictionary.cs b/Unused/Decal.Adapter/DisposableObjectDictionary.cs deleted file mode 100644 index b4385e2..0000000 --- a/Unused/Decal.Adapter/DisposableObjectDictionary.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Reflection; -using Decal.Adapter.Support; - -namespace Decal.Adapter; - -public class DisposableObjectDictionary : DisposableByRefObject, IDictionary, ICollection>, IEnumerable>, IEnumerable where T : DisposableByRefObject -{ - private Dictionary items = new Dictionary(); - - private PropertyInfo keyProperty; - - public ICollection Keys => items.Keys; - - public ICollection Values => items.Values; - - public T this[K key] - { - get - { - return items[key]; - } - set - { - items[key] = value; - } - } - - public int Count => ((ICollection>)items).Count; - - public bool IsReadOnly => ((ICollection>)items).IsReadOnly; - - public DisposableObjectDictionary(string keyPropertyName) - { - keyProperty = typeof(T).GetProperty(keyPropertyName, BindingFlags.Instance | BindingFlags.Public); - } - - protected override void Dispose(bool userCalled) - { - if (userCalled) - { - Clear(); - } - base.Dispose(userCalled); - } - - private void value_Disposing(object sender, EventArgs e) - { - K key = (K)keyProperty.GetValue(sender, null); - ((T)sender).Disposing -= value_Disposing; - items.Remove(key); - } - - public void Add(K key, T value) - { - items.Add(key, value); - value.Disposing += value_Disposing; - } - - public bool ContainsKey(K key) - { - return items.ContainsKey(key); - } - - public bool Remove(K key) - { - return items.Remove(key); - } - - public bool TryGetValue(K key, out T value) - { - return items.TryGetValue(key, out value); - } - - public void Add(KeyValuePair item) - { - items.Add(item.Key, item.Value); - } - - public void Clear() - { - foreach (T value in items.Values) - { - try - { - value.Disposing -= value_Disposing; - value.Dispose(); - } - catch (Exception ex) - { - Util.WriteLine("GDW_Clear: Exception: {0}", ex.Message); - } - } - items.Clear(); - } - - public bool Contains(KeyValuePair item) - { - return ((ICollection>)items).Contains(item); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - ((ICollection>)items).CopyTo(array, arrayIndex); - } - - public bool Remove(KeyValuePair item) - { - return ((ICollection>)items).Remove(item); - } - - public IEnumerator> GetEnumerator() - { - return ((IEnumerable>)items).GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return ((IEnumerable)items).GetEnumerator(); - } -} diff --git a/Unused/Decal.Adapter/EatableEventArgs.cs b/Unused/Decal.Adapter/EatableEventArgs.cs deleted file mode 100644 index df50cca..0000000 --- a/Unused/Decal.Adapter/EatableEventArgs.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; - -namespace Decal.Adapter; - -public class EatableEventArgs : EventArgs -{ - private bool myEat; - - public bool Eat - { - get - { - return myEat; - } - set - { - myEat = value; - } - } - - internal EatableEventArgs(bool eat) - { - myEat = eat; - } -} diff --git a/Unused/Decal.Adapter/Extension.cs b/Unused/Decal.Adapter/Extension.cs deleted file mode 100644 index 259e4c9..0000000 --- a/Unused/Decal.Adapter/Extension.cs +++ /dev/null @@ -1,249 +0,0 @@ -using System; -using Decal.Adapter.Messages; - -namespace Decal.Adapter; - -/// -/// -/// -[CLSCompliant(true)] -public abstract class Extension : MarshalByRefObject -{ - private DecalExtensionType myExtensionType; - - private CoreManager myLifetime; - - private string myPath; - - private EventHandler directoryResolve; - - public DecalExtensionType ExtensionType => myExtensionType; - - public string Path - { - get - { - return myPath; - } - internal set - { - myPath = value; - } - } - - protected CoreManager Core - { - get - { - if (myLifetime == null) - { - myLifetime = CoreManager.Current; - } - return myLifetime; - } - } - - public virtual object ComOM => null; - - public virtual string ReferenceName => GetType().FullName; - - [CLSCompliant(false)] - protected event EventHandler DirectoryResolve - { - add - { - directoryResolve = (EventHandler)Delegate.Combine(directoryResolve, value); - } - remove - { - directoryResolve = (EventHandler)Delegate.Remove(directoryResolve, value); - } - } - - [CLSCompliant(false)] - protected event EventHandler WindowMessage - { - add - { - Core.WindowMessage += value; - } - remove - { - Core.WindowMessage -= value; - } - } - - [CLSCompliant(false)] - protected event EventHandler ChatNameClicked - { - add - { - Core.ChatNameClicked += value; - } - remove - { - Core.ChatNameClicked -= value; - } - } - - [CLSCompliant(false)] - protected event EventHandler MessageProcessed - { - add - { - Core.MessageProcessed += value; - } - remove - { - Core.MessageProcessed -= value; - } - } - - [CLSCompliant(false)] - protected event EventHandler RegionChange3D - { - add - { - Core.RegionChange3D += value; - } - remove - { - Core.RegionChange3D -= value; - } - } - - [CLSCompliant(false)] - protected event EventHandler ChatBoxMessage - { - add - { - Core.ChatBoxMessage += value; - } - remove - { - Core.ChatBoxMessage -= value; - } - } - - [CLSCompliant(false)] - protected event EventHandler ItemSelected - { - add - { - Core.ItemSelected += value; - } - remove - { - Core.ItemSelected -= value; - } - } - - [CLSCompliant(false)] - protected event EventHandler ItemDestroyed - { - add - { - Core.ItemDestroyed += value; - } - remove - { - Core.ItemDestroyed -= value; - } - } - - [CLSCompliant(false)] - protected event EventHandler CommandLineText - { - add - { - Core.CommandLineText += value; - } - remove - { - Core.CommandLineText -= value; - } - } - - [CLSCompliant(false)] - protected event EventHandler ContainerOpened - { - add - { - Core.ContainerOpened += value; - } - remove - { - Core.ContainerOpened -= value; - } - } - - protected event EventHandler AdapterMessage - { - add - { - Core.ExtensionMessage += value; - } - remove - { - Core.ExtensionMessage -= value; - } - } - - internal Extension(DecalExtensionType type) - { - myExtensionType = type; - } - - internal void standardEvent(ExtensionEvents evtToFire) - { - switch (evtToFire) - { - case ExtensionEvents.Startup: - Startup(); - break; - case ExtensionEvents.Shutdown: - Shutdown(); - break; - case ExtensionEvents.InternalWireup: - Wireup(); - break; - case ExtensionEvents.InternalUnwire: - UnWire(); - break; - } - } - - internal object ResolvePath(string path) - { - DirectoryResolveEventArgs e = new DirectoryResolveEventArgs(path); - if (directoryResolve != null) - { - try - { - directoryResolve(this, e); - return e.Result; - } - catch - { - } - } - return null; - } - - internal virtual void Wireup() - { - } - - internal virtual void UnWire() - { - } - - protected abstract void Startup(); - - protected abstract void Shutdown(); - - protected void SendAdapterMessage(AdapterMessageEventArgs args) - { - Core.FireExtensionMessage(this, args); - } -} diff --git a/Unused/Decal.Adapter/ExtensionEvents.cs b/Unused/Decal.Adapter/ExtensionEvents.cs deleted file mode 100644 index 0f1ba48..0000000 --- a/Unused/Decal.Adapter/ExtensionEvents.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Decal.Adapter; - -/// -/// Sorts of events to be fired by the PluginProxy -/// -internal enum ExtensionEvents -{ - InternalWireup, - InternalUnwire, - Startup, - Shutdown -} diff --git a/Unused/Decal.Adapter/FilterBase.cs b/Unused/Decal.Adapter/FilterBase.cs deleted file mode 100644 index 93f3ad1..0000000 --- a/Unused/Decal.Adapter/FilterBase.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using Decal.Adapter.Wrappers; - -namespace Decal.Adapter; - -[CLSCompliant(true)] -public abstract class FilterBase : Extension -{ - private NetServiceHost myHost; - - [CLSCompliant(false)] - protected NetServiceHost Host => myHost; - - [CLSCompliant(false)] - protected event EventHandler ServerDispatch; - - [CLSCompliant(false)] - protected event EventHandler ClientDispatch; - - protected FilterBase() - : base(DecalExtensionType.NetworkFilter) - { - } - - /// - /// Used for internal wiring up of base-class variables. - /// Called by FilterProxy - /// - /// Host (pluginsite) object - internal void SetHost(NetServiceHost newHost) - { - myHost = newHost; - } - - internal void fireNetwork(Message newMsg, bool Server) - { - if (Server && this.ServerDispatch != null) - { - this.ServerDispatch(this, new NetworkMessageEventArgs(newMsg)); - } - else if (!Server && this.ClientDispatch != null) - { - this.ClientDispatch(this, new NetworkMessageEventArgs(newMsg)); - } - } -} diff --git a/Unused/Decal.Adapter/FilterProxy.cs b/Unused/Decal.Adapter/FilterProxy.cs deleted file mode 100644 index d32b850..0000000 --- a/Unused/Decal.Adapter/FilterProxy.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Decal.Adapter.NetParser; -using Decal.Adapter.Wrappers; -using Decal.Interop.Core; -using Decal.Interop.Net; - -namespace Decal.Adapter; - -public sealed class FilterProxy : INetworkFilter2, IDecalDirectory -{ - private NetServiceHost myService; - - private FilterBase myFilter; - - internal FilterProxy(FilterBase toWrap) - { - myFilter = toWrap; - } - - void INetworkFilter2.DispatchClient(IMessage2 msg) - { - Message message = null; - message = ((!(msg is MessageWrapper messageWrapper)) ? new Message(msg, MessageDirection.Inbound) : messageWrapper.Wrapped); - myFilter.fireNetwork(message, Server: false); - } - - void INetworkFilter2.DispatchServer(IMessage2 msg) - { - Message message = null; - message = ((!(msg is MessageWrapper messageWrapper)) ? new Message(msg, MessageDirection.Inbound) : messageWrapper.Wrapped); - myFilter.fireNetwork(message, Server: true); - } - - void INetworkFilter2.Initialize(NetService pService) - { - myService = new NetServiceHost(pService); - myFilter.SetHost(myService); - myFilter.standardEvent(ExtensionEvents.InternalWireup); - myFilter.standardEvent(ExtensionEvents.Startup); - } - - void INetworkFilter2.Terminate() - { - myFilter.standardEvent(ExtensionEvents.Shutdown); - myService.Dispose(); - } - - object IDecalDirectory.Lookup(string strName) - { - return myFilter.ResolvePath(strName); - } -} diff --git a/Unused/Decal.Adapter/FriendlyNameAttribute.cs b/Unused/Decal.Adapter/FriendlyNameAttribute.cs deleted file mode 100644 index d9811f1..0000000 --- a/Unused/Decal.Adapter/FriendlyNameAttribute.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace Decal.Adapter; - -[AttributeUsage(AttributeTargets.Class)] -public sealed class FriendlyNameAttribute : Attribute -{ - private string myName; - - public string Name => myName; - - public FriendlyNameAttribute(string name) - { - myName = name; - } -} diff --git a/Unused/Decal.Adapter/GenericDisposableWrapper.cs b/Unused/Decal.Adapter/GenericDisposableWrapper.cs deleted file mode 100644 index 0d64f34..0000000 --- a/Unused/Decal.Adapter/GenericDisposableWrapper.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.ComponentModel; -using System.Runtime.InteropServices; - -namespace Decal.Adapter; - -public class GenericDisposableWrapper : DisposableByRefObject where T : class -{ - private T myObj; - - [CLSCompliant(false)] - [EditorBrowsable(EditorBrowsableState.Never)] - public T Underlying => myObj; - - [CLSCompliant(false)] - protected T Wrapped => myObj; - - internal GenericDisposableWrapper(T obj) - { - myObj = obj; - } - - protected override void Dispose(bool userCalled) - { - EnforceDisposedOnce(); - base.Dispose(userCalled); - if (myObj != null) - { - Marshal.ReleaseComObject(myObj); - } - } -} diff --git a/Unused/Decal.Adapter/HResults.cs b/Unused/Decal.Adapter/HResults.cs deleted file mode 100644 index 51c4e42..0000000 --- a/Unused/Decal.Adapter/HResults.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Decal.Adapter; - -internal enum HResults -{ - E_FAIL = -2147483640, - E_NOINTERFACE = -2147483644, - S_FAIL = -1, - S_OK = 0 -} diff --git a/Unused/Decal.Adapter/IAdapterSurrogate.cs b/Unused/Decal.Adapter/IAdapterSurrogate.cs deleted file mode 100644 index 514d28c..0000000 --- a/Unused/Decal.Adapter/IAdapterSurrogate.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using Decal.Interop.Core; - -namespace Decal.Adapter; - -[ComImport] -[InterfaceType(1)] -[Guid("DA98635C-A312-463B-A746-2CF62AF7413A")] -internal interface IAdapterSurrogate -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - IntPtr CreateInstance([MarshalAs(UnmanagedType.Interface)] DecalEnum pInitData, ref Guid riid); - - [DispId(1610678273)] - string Version - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void SetEnum([MarshalAs(UnmanagedType.Interface)] DecalEnum pInitData); - - [DispId(1610678275)] - bool FileExists - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [DispId(1610678276)] - string FilePath - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } -} diff --git a/Unused/Decal.Adapter/IndexChangeEventArgs.cs b/Unused/Decal.Adapter/IndexChangeEventArgs.cs deleted file mode 100644 index de27188..0000000 --- a/Unused/Decal.Adapter/IndexChangeEventArgs.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Decal.Adapter; - -public class IndexChangeEventArgs : ControlEventArgs -{ - private int index; - - public int Index => index; - - internal IndexChangeEventArgs(int ID, int Index) - : base(ID) - { - index = Index; - } -} diff --git a/Unused/Decal.Adapter/ItemDestroyedEventArgs.cs b/Unused/Decal.Adapter/ItemDestroyedEventArgs.cs deleted file mode 100644 index a71d844..0000000 --- a/Unused/Decal.Adapter/ItemDestroyedEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter; - -public class ItemDestroyedEventArgs : EventArgs -{ - private int myItemGUID; - - public int ItemGuid => myItemGUID; - - internal ItemDestroyedEventArgs(int itemGUID) - { - myItemGUID = itemGUID; - } -} diff --git a/Unused/Decal.Adapter/ItemSelectedEventArgs.cs b/Unused/Decal.Adapter/ItemSelectedEventArgs.cs deleted file mode 100644 index ce0fa4b..0000000 --- a/Unused/Decal.Adapter/ItemSelectedEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter; - -public class ItemSelectedEventArgs : EventArgs -{ - private int myItemGUID; - - public int ItemGuid => myItemGUID; - - internal ItemSelectedEventArgs(int itemGUID) - { - myItemGUID = itemGUID; - } -} diff --git a/Unused/Decal.Adapter/LifetimeProxy.cs b/Unused/Decal.Adapter/LifetimeProxy.cs deleted file mode 100644 index 4258eb2..0000000 --- a/Unused/Decal.Adapter/LifetimeProxy.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using Decal.Adapter.Support; -using Decal.Interop.Core; -using Microsoft.Win32; - -namespace Decal.Adapter; - -[ComVisible(true)] -[ComDefaultInterface(typeof(IDecalService))] -[ClassInterface(ClassInterfaceType.None)] -[ProgId("DecalAdapter.Lifetime")] -[Guid("71A69713-6593-47EC-0001-0000000DECA1")] -public sealed class LifetimeProxy : MarshalByRefObject, IDecalService, IDecalDirectory, IDecalWindowsMessageSink -{ - private CoreManager myLifetime; - - public LifetimeProxy() - { - Util.WriteLine("Lifetime Proxy retrieving Lifetime manager"); - myLifetime = CoreManager.Current; - Util.WriteLine("Lifetime Proxy ctor complete"); - } - - [ComRegisterFunction] - internal static void SelfRegister(Type t) - { - RegistryKey registryKey = Registry.LocalMachine.CreateSubKey("Software\\Decal\\Services").CreateSubKey("{71A69713-6593-47EC-0001-0000000DECA1}"); - registryKey.SetValue("", "Decal .NET Lifetime Service", RegistryValueKind.String); - registryKey.SetValue("Enabled", true, RegistryValueKind.DWord); - RegistryKey registryKey2 = Registry.LocalMachine.CreateSubKey("Software\\Decal\\Surrogates").CreateSubKey("{71A69713-6593-47EC-0002-0000000DECA1}"); - registryKey2.SetValue("", "Decal.Adapter Surrogate", RegistryValueKind.String); - registryKey2.SetValue("Enabled", true, RegistryValueKind.DWord); - } - - [ComUnregisterFunction] - internal static void UnRegister(Type t) - { - } - - void IDecalService.AfterPlugins() - { - } - - void IDecalService.BeforePlugins() - { - } - - void IDecalService.Initialize(DecalCore pDecal) - { - if (!RuntimePolicyHelper.LegacyV2RuntimeEnabledSuccessfully) - { - Util.WriteLine("Can't load v2 mixed-mode"); - } - myLifetime.Initialize(pDecal); - } - - void IDecalService.Terminate() - { - myLifetime.Terminate(); - } - - object IDecalDirectory.Lookup(string strName) - { - return null; - } - - bool IDecalWindowsMessageSink.WindowMessage(int HWND, short uMsg, int wParam, int lParam) - { - return myLifetime.FireWindowMessage(HWND, uMsg, wParam, lParam); - } -} diff --git a/Unused/Decal.Adapter/ListSelectEventArgs.cs b/Unused/Decal.Adapter/ListSelectEventArgs.cs deleted file mode 100644 index e37f477..0000000 --- a/Unused/Decal.Adapter/ListSelectEventArgs.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Decal.Adapter; - -public class ListSelectEventArgs : ControlEventArgs -{ - private int row; - - private int col; - - public int Row => row; - - public int Column => col; - - internal ListSelectEventArgs(int ID, int Row, int Column) - : base(ID) - { - row = Row; - col = Column; - } -} diff --git a/Unused/Decal.Adapter/Message.cs b/Unused/Decal.Adapter/Message.cs deleted file mode 100644 index 8b4bdfc..0000000 --- a/Unused/Decal.Adapter/Message.cs +++ /dev/null @@ -1,509 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Xml; -using Decal.Adapter.NetParser; -using Decal.Interop.Net; - -namespace Decal.Adapter; - -/// -/// Protocol Message Data -/// -public class Message : MessageStruct -{ - private static Dictionary mRecv; - - private static Dictionary mSend; - - private static Dictionary mTypes; - - private int mType; - - internal MessageStruct mStruct; - - /// - /// Message Type - /// - public int Type => mType; - - /// - /// Returns the number of fields (or vector length) - /// - public override int Count => mStruct.Count; - - /// - /// Returns the specified field data - /// - /// Field index - /// Field value - public override object this[int index] => mStruct[index]; - - /// - /// Returns the specified field data - /// - /// Field name - /// Field value - public override object this[string name] => mStruct[name]; - - /// - /// Returns the raw bytes for this field - /// - public override byte[] RawData => mStruct.RawData; - - /// - /// Returns the next object in the (parent) vector - /// - public override object Next => mStruct.Next; - - /// - /// Returns the parent field - /// - public override MessageStruct Parent => mStruct.Parent; - - internal Message() - { - } - - internal Message(IMessage2 msg, MessageDirection dir) - { - mType = BitConverter.ToInt32(msg.RawData, 0); - mStruct = new MessageStruct(msg.RawData, 4, GetParser(mType, dir)); - } - - internal Message(byte[] Data, MemberParser Parser) - { - mType = BitConverter.ToInt32(Data, 0); - mStruct = new MessageStruct(Data, 4, Parser); - } - - internal Message(Message Source) - { - mType = Source.mType; - mStruct = Source.mStruct; - } - - internal static MemberParser GetParser(int type, MessageDirection dir) - { - MemberParser result = null; - switch (dir) - { - case MessageDirection.Inbound: - if (mRecv.ContainsKey(type)) - { - result = mRecv[type]; - } - break; - case MessageDirection.Outbound: - if (mSend.ContainsKey(type)) - { - result = mSend[type]; - } - break; - } - return result; - } - - /// - /// Return the field name for the specified index - /// - /// Field index - /// Name of the field - public override string Name(int index) - { - return mStruct.Name(index); - } - - /// - /// Returns the passed in value? - /// - /// - /// - public override string Name(string memberName) - { - return mStruct.Name(memberName); - } - - /// - /// Returns the specified child structure - /// - /// Field index - /// MessageStruct for the specified field - public override MessageStruct Struct(int index) - { - return mStruct.Struct(index); - } - - /// - /// Returns the specified child structure - /// - /// Field name - /// MessageStruct for the specified field - public override MessageStruct Struct(string name) - { - return mStruct.Struct(name); - } - - /// - /// Returns the specified field value - /// - /// Type of the field - /// Field index - /// Field value cast to the specified FieldType - public override FieldType Value(int index) - { - return mStruct.Value(index); - } - - /// - /// Returns the specified field value - /// - /// Type of the field - /// Field name - /// Field value cast to the specified FieldType - public override FieldType Value(string name) - { - return mStruct.Value(name); - } - - /// - /// Returns the raw bytes of the specified field - /// - /// Field index - /// Raw field value - public override byte[] RawValue(int index) - { - return mStruct.RawValue(index); - } - - /// - /// Returns the raw bytes of the specified field - /// - /// Field name - /// Raw field value - public override byte[] RawValue(string name) - { - return mStruct.RawValue(name); - } - - internal static void Initialize(string xmlFile) - { - mRecv = new Dictionary(); - mSend = new Dictionary(); - mTypes = new Dictionary(); - XmlDocument xmlDocument = new XmlDocument(); - xmlDocument.Load(xmlFile); - foreach (XmlNode item in xmlDocument.SelectNodes("/schema/datatypes/type")) - { - ParseType(item, xmlDocument); - } - foreach (XmlNode item2 in xmlDocument.SelectNodes("/schema/messages/message")) - { - ParseMessage(item2, xmlDocument); - } - } - - private static void ParseType(XmlNode node, XmlDocument doc) - { - XmlAttribute xmlAttribute = node.Attributes["name"]; - if (xmlAttribute == null) - { - return; - } - string value = xmlAttribute.Value; - if (mTypes.ContainsKey(value)) - { - return; - } - MemberParser memberParser = new MemberParser(); - mTypes.Add(value, memberParser); - xmlAttribute = node.Attributes["primitive"]; - if (xmlAttribute != null && string.Compare(xmlAttribute.Value, "true", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - if (string.Compare(value, "BYTE", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser.MemberType = MemberParserType.BYTE; - } - else if (string.Compare(value, "WORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser.MemberType = MemberParserType.WORD; - } - else if (string.Compare(value, "PackedWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser.MemberType = MemberParserType.PackedWORD; - } - else if (string.Compare(value, "DWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser.MemberType = MemberParserType.DWORD; - } - else if (string.Compare(value, "PackedDWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser.MemberType = MemberParserType.PackedDWORD; - } - else if (string.Compare(value, "QWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser.MemberType = MemberParserType.QWORD; - } - else if (string.Compare(value, "float", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser.MemberType = MemberParserType.@float; - } - else if (string.Compare(value, "double", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser.MemberType = MemberParserType.@double; - } - else if (string.Compare(value, "String", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser.MemberType = MemberParserType.String; - } - else if (string.Compare(value, "WString", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser.MemberType = MemberParserType.WString; - } - } - else - { - memberParser.MemberType = MemberParserType.Struct; - memberParser.Child = ParseStruct(node.ChildNodes, doc); - } - } - - private static void ParseMessage(XmlNode node, XmlDocument doc) - { - XmlAttribute xmlAttribute = node.Attributes["type"]; - if (xmlAttribute == null) - { - return; - } - string text = xmlAttribute.Value; - if (text[0] == '0' && (text[1] == 'x' || text[1] == 'X')) - { - text = text.Substring(2); - } - int key = int.Parse(text, NumberStyles.HexNumber); - bool flag = true; - bool flag2 = false; - xmlAttribute = node.Attributes["direction"]; - if (xmlAttribute != null) - { - if (string.Compare(xmlAttribute.Value, "outbound", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - flag = false; - flag2 = true; - } - else if (string.Compare(xmlAttribute.Value, "both", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - flag2 = true; - } - } - if ((flag && !mRecv.ContainsKey(key)) || (flag2 && !mSend.ContainsKey(key))) - { - MemberParser value = ParseStruct(node.ChildNodes, doc); - if (flag && !mRecv.ContainsKey(key)) - { - mRecv.Add(key, value); - } - if (flag2 && !mSend.ContainsKey(key)) - { - mSend.Add(key, value); - } - } - } - - private static MemberParser ParseStruct(XmlNodeList nodes, XmlDocument doc) - { - MemberParser memberParser = new MemberParser(); - MemberParser memberParser2 = memberParser; - int count = nodes.Count; - for (int i = 0; i < count; i++) - { - XmlNode xmlNode = nodes[i]; - if (xmlNode.NodeType != XmlNodeType.Element) - { - continue; - } - string name = xmlNode.Name; - if (string.Compare(name, "field", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - XmlAttribute xmlAttribute = xmlNode.Attributes["type"]; - if (xmlAttribute != null) - { - string value = xmlAttribute.Value; - if (!mTypes.ContainsKey(value)) - { - ParseType(doc.SelectSingleNode("/schema/datatypes/type[@name='" + value + "']"), doc); - } - memberParser2.Next = new MemberParser(mTypes[value]); - memberParser2 = memberParser2.Next; - memberParser2.MemberName = xmlNode.Attributes["name"].Value; - } - } - else if (string.Compare(name, "maskmap", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - XmlAttribute xmlAttribute = xmlNode.Attributes["xor"]; - long conditionXor = 0L; - string value; - if (xmlAttribute != null) - { - value = xmlAttribute.Value; - if (value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) - { - value = value.Substring(2); - } - conditionXor = long.Parse(value, NumberStyles.HexNumber); - } - value = xmlNode.Attributes["name"].Value; - memberParser2.Next = ParseMaskMap(xmlNode.ChildNodes, doc); - while (memberParser2.Next != null) - { - memberParser2 = memberParser2.Next; - memberParser2.Condition = MemberParserCondition.NE; - memberParser2.ConditionResult = 0L; - memberParser2.ConditionField = value; - memberParser2.ConditionXor = conditionXor; - } - } - else if (string.Compare(name, "switch", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - string value = xmlNode.Attributes["name"].Value; - XmlAttribute xmlAttribute = xmlNode.Attributes["mask"]; - long conditionXor = -1L; - if (xmlAttribute != null) - { - value = xmlAttribute.Value; - if (value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) - { - value = value.Substring(2); - } - conditionXor = long.Parse(value, NumberStyles.HexNumber); - } - memberParser2.Next = ParseSwitch(xmlNode.ChildNodes, doc); - while (memberParser2.Next != null) - { - memberParser2 = memberParser2.Next; - memberParser2.Condition = MemberParserCondition.EQ; - memberParser2.ConditionField = value; - memberParser2.ConditionAnd = conditionXor; - } - } - else if (string.Compare(name, "vector", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser2.Next = new MemberParser(); - memberParser2 = memberParser2.Next; - memberParser2.MemberType = MemberParserType.Vector; - memberParser2.MemberName = xmlNode.Attributes["name"].Value; - memberParser2.LengthField = xmlNode.Attributes["length"].Value; - XmlAttribute xmlAttribute = xmlNode.Attributes["mask"]; - long conditionXor = -1L; - if (xmlAttribute != null) - { - string value = xmlAttribute.Value; - if (value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) - { - value = value.Substring(2); - } - conditionXor = long.Parse(value, NumberStyles.HexNumber); - } - memberParser2.LengthMask = conditionXor; - xmlAttribute = xmlNode.Attributes["skip"]; - int num = 0; - if (xmlAttribute != null) - { - string value = xmlAttribute.Value; - if (value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) - { - value = value.Substring(2); - } - num = int.Parse(value, NumberStyles.HexNumber); - } - memberParser2.LengthDelta = -num; - memberParser2.Child = ParseStruct(xmlNode.ChildNodes, doc); - } - else if (string.Compare(name, "align", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - string value = xmlNode.Attributes["type"].Value; - if (string.Compare(value, "WORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser2.PostAlignment = 2; - } - else if (string.Compare(value, "DWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser2.PostAlignment = 4; - } - else if (string.Compare(value, "QWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - memberParser2.PostAlignment = 8; - } - } - } - if (memberParser.PostAlignment != 0 && memberParser.Next != null) - { - memberParser.Next.PreAlignment = memberParser.PostAlignment; - } - return memberParser.Next; - } - - private static MemberParser ParseMaskMap(XmlNodeList nodes, XmlDocument doc) - { - MemberParser memberParser = new MemberParser(); - MemberParser memberParser2 = memberParser; - int count = nodes.Count; - for (int i = 0; i < count; i++) - { - XmlNode xmlNode = nodes[i]; - if (xmlNode.NodeType != XmlNodeType.Element || string.Compare(xmlNode.Name, "mask", ignoreCase: true, CultureInfo.InvariantCulture) != 0) - { - continue; - } - long conditionAnd = 0L; - XmlAttribute xmlAttribute = xmlNode.Attributes["value"]; - if (xmlAttribute != null) - { - string text = xmlAttribute.Value; - if (text[0] == '0' && (text[1] == 'x' || text[1] == 'X')) - { - text = text.Substring(2); - } - conditionAnd = long.Parse(text, NumberStyles.HexNumber); - } - memberParser2.Next = new MemberParser(); - memberParser2 = memberParser2.Next; - memberParser2.MemberType = MemberParserType.Case; - memberParser2.ConditionAnd = conditionAnd; - memberParser2.Child = ParseStruct(xmlNode.ChildNodes, doc); - } - return memberParser.Next; - } - - private static MemberParser ParseSwitch(XmlNodeList nodes, XmlDocument doc) - { - MemberParser memberParser = new MemberParser(); - MemberParser memberParser2 = memberParser; - int count = nodes.Count; - for (int i = 0; i < count; i++) - { - XmlNode xmlNode = nodes[i]; - if (xmlNode.NodeType != XmlNodeType.Element || string.Compare(xmlNode.Name, "case", ignoreCase: true, CultureInfo.InvariantCulture) != 0) - { - continue; - } - long conditionResult = 0L; - XmlAttribute xmlAttribute = xmlNode.Attributes["value"]; - if (xmlAttribute != null) - { - string text = xmlAttribute.Value; - if (text[0] == '0' && (text[1] == 'x' || text[1] == 'X')) - { - text = text.Substring(2); - } - conditionResult = long.Parse(text, NumberStyles.HexNumber); - } - memberParser2.Next = new MemberParser(); - memberParser2 = memberParser2.Next; - memberParser2.MemberType = MemberParserType.Case; - memberParser2.ConditionResult = conditionResult; - memberParser2.Child = ParseStruct(xmlNode.ChildNodes, doc); - } - return memberParser.Next; - } -} diff --git a/Unused/Decal.Adapter/MessageDirection.cs b/Unused/Decal.Adapter/MessageDirection.cs deleted file mode 100644 index e0f90fe..0000000 --- a/Unused/Decal.Adapter/MessageDirection.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Decal.Adapter; - -/// -/// Message Direction -/// -public enum MessageDirection -{ - /// - /// Server to Client message - /// - Inbound, - /// - /// Client to Server message - /// - Outbound -} diff --git a/Unused/Decal.Adapter/MessageProcessedEventArgs.cs b/Unused/Decal.Adapter/MessageProcessedEventArgs.cs deleted file mode 100644 index ffa1ad8..0000000 --- a/Unused/Decal.Adapter/MessageProcessedEventArgs.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace Decal.Adapter; - -public class MessageProcessedEventArgs : EventArgs -{ - private Message myMessage; - - private int myData; - - private int mySize; - - public Message Message => myMessage; - - public int Data => myData; - - public int Size => mySize; - - internal MessageProcessedEventArgs(int pbData, int dwSize) - { - if (pbData != 0 && dwSize != 0) - { - byte[] array = (byte[])Array.CreateInstance(typeof(byte), dwSize); - Marshal.Copy(new IntPtr(pbData), array, 0, dwSize); - myMessage = new Message(array, Message.GetParser(BitConverter.ToInt32(array, 0), MessageDirection.Inbound)); - } - myData = pbData; - mySize = dwSize; - } -} diff --git a/Unused/Decal.Adapter/MessageStruct.cs b/Unused/Decal.Adapter/MessageStruct.cs deleted file mode 100644 index cb844f2..0000000 --- a/Unused/Decal.Adapter/MessageStruct.cs +++ /dev/null @@ -1,676 +0,0 @@ -using System; -using System.Globalization; -using System.Text; -using Decal.Adapter.NetParser; -using Decal.Adapter.Support; - -namespace Decal.Adapter; - -/// -/// Represents Message data -/// -public class MessageStruct : MarshalByRefObject -{ - internal struct MessageField - { - internal string Name; - - internal MemberParserType Type; - - internal object Value; - - internal int Offset; - - internal int Length; - } - - internal byte[] mData; - - internal int mOffset; - - internal int mLength; - - internal MemberParser mParser; - - internal MessageStruct mParent; - - internal int mIndex; - - internal bool mParsed; - - internal int mCount; - - internal MessageField[] mFields; - - /// - /// Returns the number of fields (or vector length) - /// - public virtual int Count - { - get - { - if (!mParsed) - { - Parse(); - } - return mCount; - } - } - - /// - /// Returns the specified field data - /// - /// Field index - /// Field value - public virtual object this[int index] - { - get - { - if (!mParsed) - { - Parse(); - } - if (index >= 0 && index < mCount) - { - return mFields[index].Value; - } - return null; - } - } - - /// - /// Returns the specified field data - /// - /// Field name - /// Field value - public virtual object this[string name] - { - get - { - if (!mParsed) - { - Parse(); - } - int num = IndexFromName(name); - if (num >= 0 && num < mCount) - { - return mFields[num].Value; - } - return null; - } - } - - /// - /// Returns the raw bytes for this field - /// - public virtual byte[] RawData - { - get - { - if (mParent != null) - { - return mParent.RawValue(mIndex); - } - byte[] array = (byte[])Array.CreateInstance(typeof(byte), mData.Length); - Buffer.BlockCopy(mData, 0, array, 0, mData.Length); - return array; - } - } - - /// - /// Returns the next object in the (parent) vector - /// - public virtual object Next - { - get - { - if (mParent == null) - { - return null; - } - return mParent[mIndex + 1]; - } - } - - /// - /// Returns the parent field - /// - public virtual MessageStruct Parent => mParent; - - internal MessageStruct() - { - } - - internal MessageStruct(byte[] Data, int Offset, MemberParser Parser) - { - mData = (byte[])Array.CreateInstance(typeof(byte), Data.Length); - Buffer.BlockCopy(Data, 0, mData, 0, mData.Length); - mOffset = Offset; - mParser = Parser; - mCount = -1; - } - - internal MessageStruct(byte[] Data, int Offset, MemberParser Parser, MessageStruct Parent, int Index) - { - mData = Data; - mOffset = Offset; - mParser = Parser; - mParent = Parent; - mIndex = Index; - mCount = -1; - } - - internal MessageStruct(byte[] Data, int Offset, MemberParser Parser, int Length, MessageStruct Parent, int Index) - { - mData = Data; - mOffset = Offset; - mParser = Parser; - mParent = Parent; - mIndex = Index; - mCount = Length; - } - - internal int ObjectToIndex(object vIndex) - { - string text = vIndex as string; - int num = -1; - num = (string.IsNullOrEmpty(text) ? Util.UnboxTo(vIndex) : IndexFromName(text)); - if (num >= 0 && num < mCount) - { - return num; - } - return -1; - } - - /// - /// Return the field name for the specified index - /// - /// Field index - /// Name of the field - public virtual string Name(int index) - { - if (!mParsed) - { - Parse(); - } - if (index >= 0 && index < mCount) - { - return mFields[index].Name; - } - return null; - } - - /// - /// Returns the passed in value? - /// - /// - /// - public virtual string Name(string memberName) - { - if (!mParsed) - { - Parse(); - } - int num = IndexFromName(memberName); - if (num >= 0 && num < mCount) - { - return mFields[num].Name; - } - return null; - } - - /// - /// Returns the specified child structure - /// - /// Field index - /// MessageStruct for the specified field - public virtual MessageStruct Struct(int index) - { - if (!mParsed) - { - Parse(); - } - if (index >= 0 && index < mCount) - { - MemberParserType type = mFields[index].Type; - if (type == MemberParserType.Struct || type == MemberParserType.Vector) - { - return mFields[index].Value as MessageStruct; - } - } - return null; - } - - /// - /// Returns the specified child structure - /// - /// Field name - /// MessageStruct for the specified field - public virtual MessageStruct Struct(string name) - { - if (!mParsed) - { - Parse(); - } - int num = IndexFromName(name); - if (num >= 0 && num < mCount) - { - MemberParserType type = mFields[num].Type; - if (type == MemberParserType.Struct || type == MemberParserType.Vector) - { - return mFields[num].Value as MessageStruct; - } - } - return null; - } - - /// - /// Returns the specified field value - /// - /// Type of the field - /// Field index - /// Field value cast to the specified FieldType - public virtual FieldType Value(int index) - { - if (!mParsed) - { - Parse(); - } - if (index >= 0 && index < mCount) - { - return Util.UnboxTo(mFields[index].Value); - } - return default(FieldType); - } - - /// - /// Returns the specified field value - /// - /// Type of the field - /// Field name - /// Field value cast to the specified FieldType - public virtual FieldType Value(string name) - { - if (!mParsed) - { - Parse(); - } - int num = IndexFromName(name); - if (num >= 0 && num < mCount) - { - return Util.UnboxTo(mFields[num].Value); - } - return default(FieldType); - } - - /// - /// Returns the raw bytes of the specified field - /// - /// Field index - /// Raw field value - public virtual byte[] RawValue(int index) - { - if (!mParsed) - { - Parse(); - } - if (index >= 0 && index < mCount) - { - int length = mFields[index].Length; - byte[] array = (byte[])Array.CreateInstance(typeof(byte), length); - Buffer.BlockCopy(mData, mFields[index].Offset, array, 0, length); - return array; - } - return null; - } - - /// - /// Returns the raw bytes of the specified field - /// - /// Field name - /// Raw field value - public virtual byte[] RawValue(string name) - { - if (!mParsed) - { - Parse(); - } - int num = IndexFromName(name); - if (num >= 0 && num < mCount) - { - int length = mFields[num].Length; - byte[] array = (byte[])Array.CreateInstance(typeof(byte), length); - Buffer.BlockCopy(mData, mFields[num].Offset, array, 0, length); - return array; - } - return null; - } - - internal int IndexFromName(string Name) - { - int num = mCount; - for (int i = 0; i < num; i++) - { - if (string.Compare(Name, mFields[i].Name, ignoreCase: true, CultureInfo.InvariantCulture) == 0) - { - return i; - } - } - return -1; - } - - internal void Parse() - { - if (mCount == -1) - { - ParseStruct(); - } - else - { - ParseVector(); - } - } - - internal void ParseStruct() - { - int length = ParseCounter(mParser); - mFields = (MessageField[])Array.CreateInstance(typeof(MessageField), length); - mParsed = true; - int ByteIndex = mOffset; - mCount = 0; - ParseHelper(mParser, ref mCount, ref ByteIndex); - mLength = ByteIndex - mOffset; - MessageField[] sourceArray = mFields; - mFields = (MessageField[])Array.CreateInstance(typeof(MessageField), mCount); - Array.Copy(sourceArray, mFields, mCount); - } - - internal void ParseVector() - { - int num = mCount; - mFields = (MessageField[])Array.CreateInstance(typeof(MessageField), num); - mParsed = true; - int num2 = mOffset; - for (int i = 0; i < num; i++) - { - mFields[i].Name = i.ToString(); - mFields[i].Offset = num2; - mFields[i].Type = MemberParserType.Struct; - MessageStruct messageStruct = new MessageStruct(mData, num2, mParser, this, i); - messageStruct.ParseStruct(); - mFields[i].Value = messageStruct; - mFields[i].Length = messageStruct.mLength; - num2 += messageStruct.mLength; - } - mLength = num2 - mOffset; - } - - internal int ParseCounter(MemberParser Parser) - { - int num = 0; - while (Parser != null) - { - num = ((Parser.MemberType != MemberParserType.Case) ? (num + 1) : (num + ParseCounter(Parser.Child))); - Parser = Parser.Next; - } - return num; - } - - internal void ParseHelper(MemberParser Parser, ref int FieldIndex, ref int ByteIndex) - { - Encoding encoding = Encoding.GetEncoding(1252); - while (Parser != null) - { - if (Parser.PreAlignment != 0) - { - int num = ByteIndex % Parser.PreAlignment; - if (num != 0) - { - ByteIndex += Parser.PreAlignment - num; - } - } - bool flag = Parser.Condition == MemberParserCondition.None; - if (!flag) - { - MessageStruct messageStruct = this; - object obj; - do - { - obj = messageStruct[Parser.ConditionField]; - if (obj != null) - { - break; - } - messageStruct = messageStruct.mParent; - } - while (messageStruct != null); - if (obj != null) - { - long num2 = 0L; - Type type = obj.GetType(); - if (type.Equals(typeof(int))) - { - num2 = Convert.ToInt64(obj); - num2 &= 0xFFFFFFFFu; - } - else if (type.Equals(typeof(short))) - { - num2 = Convert.ToInt64(obj); - num2 &= 0xFFFF; - } - else if (type.Equals(typeof(byte))) - { - num2 = Convert.ToInt64(obj); - num2 &= 0xFF; - } - else if (type.Equals(typeof(long))) - { - num2 = Convert.ToInt64(obj); - } - num2 ^= Parser.ConditionXor; - num2 &= Parser.ConditionAnd; - switch (Parser.Condition) - { - case MemberParserCondition.EQ: - flag = num2 == Parser.ConditionResult; - break; - case MemberParserCondition.NE: - flag = num2 != Parser.ConditionResult; - break; - case MemberParserCondition.GE: - flag = num2 >= Parser.ConditionResult; - break; - case MemberParserCondition.GT: - flag = num2 > Parser.ConditionResult; - break; - case MemberParserCondition.LE: - flag = num2 <= Parser.ConditionResult; - break; - case MemberParserCondition.LT: - flag = num2 < Parser.ConditionResult; - break; - } - } - } - if (flag) - { - mFields[FieldIndex].Name = Parser.MemberName; - mFields[FieldIndex].Offset = ByteIndex; - mFields[FieldIndex].Type = Parser.MemberType; - switch (Parser.MemberType) - { - case MemberParserType.BYTE: - mFields[FieldIndex].Value = mData[ByteIndex++]; - break; - case MemberParserType.WORD: - mFields[FieldIndex].Value = BitConverter.ToInt16(mData, ByteIndex); - ByteIndex += 2; - break; - case MemberParserType.PackedWORD: - { - int num6 = mData[ByteIndex++]; - if ((num6 & 0x80) != 0) - { - num6 = ((num6 & 0x7F) << 8) | mData[ByteIndex++]; - } - mFields[FieldIndex].Value = num6; - break; - } - case MemberParserType.DWORD: - mFields[FieldIndex].Value = BitConverter.ToInt32(mData, ByteIndex); - ByteIndex += 4; - break; - case MemberParserType.PackedDWORD: - { - int num6 = BitConverter.ToInt16(mData, ByteIndex); - ByteIndex += 2; - if ((num6 & 0x8000) != 0) - { - num6 = ((num6 & 0x7FFF) << 16) | (BitConverter.ToInt16(mData, ByteIndex) & 0xFFFF); - ByteIndex += 2; - } - mFields[FieldIndex].Value = num6; - break; - } - case MemberParserType.QWORD: - mFields[FieldIndex].Value = BitConverter.ToInt64(mData, ByteIndex); - ByteIndex += 8; - break; - case MemberParserType.@float: - mFields[FieldIndex].Value = BitConverter.ToSingle(mData, ByteIndex); - ByteIndex += 4; - break; - case MemberParserType.@double: - mFields[FieldIndex].Value = BitConverter.ToDouble(mData, ByteIndex); - ByteIndex += 8; - break; - case MemberParserType.String: - { - int num6 = BitConverter.ToInt16(mData, ByteIndex); - ByteIndex += 2; - if (num6 == -1) - { - num6 = BitConverter.ToInt32(mData, ByteIndex); - ByteIndex += 4; - } - StringBuilder stringBuilder = new StringBuilder(num6); - for (int j = 0; j < num6; j++) - { - stringBuilder.Append(encoding.GetChars(mData, ByteIndex++, 1)); - } - mFields[FieldIndex].Value = stringBuilder.ToString(); - ByteIndex = (ByteIndex + 3) & -4; - break; - } - case MemberParserType.WString: - { - int num6 = mData[ByteIndex++]; - if ((num6 & 0x80) != 0) - { - num6 = ((num6 & 0x7F) << 8) | mData[ByteIndex++]; - } - StringBuilder stringBuilder = new StringBuilder(num6); - for (int i = 0; i < num6; i++) - { - stringBuilder.Append(BitConverter.ToChar(mData, ByteIndex)); - ByteIndex += 2; - } - mFields[FieldIndex].Value = stringBuilder.ToString(); - break; - } - case MemberParserType.Struct: - { - MessageStruct messageStruct = new MessageStruct(mData, ByteIndex, Parser.Child, this, FieldIndex); - messageStruct.ParseStruct(); - ByteIndex += messageStruct.mLength; - mFields[FieldIndex].Value = messageStruct; - break; - } - case MemberParserType.Vector: - { - MessageStruct messageStruct = this; - object obj; - do - { - obj = messageStruct[Parser.LengthField]; - if (obj != null) - { - break; - } - messageStruct = messageStruct.mParent; - } - while (messageStruct != null); - long num4 = 0L; - if (obj != null) - { - Type type2 = obj.GetType(); - if (type2.Equals(typeof(int))) - { - num4 = Convert.ToInt64(obj); - num4 &= 0xFFFFFFFFu; - } - else if (type2.Equals(typeof(short))) - { - num4 = Convert.ToInt64(obj); - num4 &= 0xFFFF; - } - else if (type2.Equals(typeof(byte))) - { - num4 = Convert.ToInt64(obj); - num4 &= 0xFF; - } - else if (type2.Equals(typeof(long))) - { - num4 = Convert.ToInt64(obj); - } - } - long num5 = Parser.LengthMask; - num4 &= num5; - if (num5 != 0L) - { - while ((num5 & 1) == 0L) - { - num4 >>= 1; - num5 >>= 1; - } - } - messageStruct = new MessageStruct(mData, ByteIndex, Parser.Child, (int)num4 + Parser.LengthDelta, this, FieldIndex); - messageStruct.ParseVector(); - ByteIndex += messageStruct.mLength; - mFields[FieldIndex].Value = messageStruct; - break; - } - case MemberParserType.Case: - { - int num3 = FieldIndex; - ParseHelper(Parser.Child, ref FieldIndex, ref ByteIndex); - if (FieldIndex > num3) - { - FieldIndex--; - } - break; - } - } - mFields[FieldIndex].Length = ByteIndex - mFields[FieldIndex].Offset; - } - if (Parser.PostAlignment != 0) - { - int num7 = ByteIndex % Parser.PostAlignment; - if (num7 != 0) - { - num7 = Parser.PostAlignment - num7; - ByteIndex += num7; - if (flag) - { - mFields[FieldIndex].Length += num7; - } - } - } - if (flag) - { - FieldIndex++; - } - Parser = Parser.Next; - } - } -} diff --git a/Unused/Decal.Adapter/NetworkMessageEventArgs.cs b/Unused/Decal.Adapter/NetworkMessageEventArgs.cs deleted file mode 100644 index 4a202c3..0000000 --- a/Unused/Decal.Adapter/NetworkMessageEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Decal.Adapter; - -public class NetworkMessageEventArgs : EventArgs -{ - private Message myMsg; - - public Message Message => myMsg; - - internal NetworkMessageEventArgs(Message msg) - { - myMsg = msg; - } -} diff --git a/Unused/Decal.Adapter/PluginBase.cs b/Unused/Decal.Adapter/PluginBase.cs deleted file mode 100644 index bdf5366..0000000 --- a/Unused/Decal.Adapter/PluginBase.cs +++ /dev/null @@ -1,226 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using Decal.Adapter.Wrappers; - -namespace Decal.Adapter; - -/// -/// Base class used to create Decal Plugins -/// -[CLSCompliant(true)] -public abstract class PluginBase : Extension, IViewHandler -{ - private PluginHost myHost; - - private EventHandler myGraphicsReset; - - private BindingFlags myBindingFlags; - - private Dictionary myViews; - - /// - /// Wrapper Object to the Host. - /// Similar to IPluginSite - /// - protected PluginHost Host => myHost; - - /// - /// The Default view - /// - public ViewWrapper DefaultView => myViews["Default"]; - - /// - /// BindingFlags for internal scanning - /// - public BindingFlags BindingFlags => myBindingFlags; - - [CLSCompliant(false)] - protected event EventHandler ServerDispatch - { - add - { - if (base.Core.EchoFilter != null) - { - base.Core.EchoFilter.ServerDispatch += value; - } - } - remove - { - if (base.Core.EchoFilter != null) - { - base.Core.EchoFilter.ServerDispatch -= value; - } - } - } - - [CLSCompliant(false)] - protected event EventHandler ClientDispatch - { - add - { - if (base.Core.EchoFilter != null) - { - base.Core.EchoFilter.ClientDispatch += value; - } - } - remove - { - if (base.Core.EchoFilter != null) - { - base.Core.EchoFilter.ClientDispatch -= value; - } - } - } - - protected event EventHandler GraphicsReset - { - add - { - myGraphicsReset = (EventHandler)Delegate.Combine(myGraphicsReset, value); - if (myHost != null) - { - myHost.Render.DeviceLost += value; - } - } - remove - { - myGraphicsReset = (EventHandler)Delegate.Remove(myGraphicsReset, value); - if (myHost != null) - { - myHost.Render.DeviceLost -= value; - } - } - } - - /// - /// Default Constructor for the Base class. Should be called by all decendants. - /// - protected PluginBase() - : base(DecalExtensionType.Plugin) - { - myBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - } - - /// - /// Called by the base class to Wire Up events. - /// - internal override void Wireup() - { - if (myGraphicsReset != null) - { - Host.Render.DeviceLost += myGraphicsReset; - } - scanBaseEvents(connect: true); - myViews = new Dictionary(); - PluginHost.LoadViewHandler(this); - } - - /// - /// Called by the base class to Unwire events - /// - internal override void UnWire() - { - if (myGraphicsReset != null) - { - Host.Render.DeviceLost -= myGraphicsReset; - } - scanBaseEvents(connect: false); - foreach (ViewWrapper value in myViews.Values) - { - value.Dispose(); - } - myViews.Clear(); - } - - /// - /// Used for internal wiring up of base-class variables. - /// Called by PluginProxy - /// - /// Host (pluginsite) object - internal void SetHost(PluginHost newHost) - { - myHost = newHost; - } - - private void scanBaseEvents(bool connect) - { - Type type = GetType(); - Type type2 = base.Core.GetType(); - if (!Attribute.IsDefined(type, typeof(WireUpBaseEventsAttribute))) - { - return; - } - MethodInfo[] methods = type.GetMethods(BindingFlags); - foreach (MethodInfo methodInfo in methods) - { - if (!Attribute.IsDefined(methodInfo, typeof(BaseEventAttribute))) - { - continue; - } - Attribute[] customAttributes = Attribute.GetCustomAttributes(methodInfo, typeof(BaseEventAttribute)); - for (int j = 0; j < customAttributes.Length; j++) - { - BaseEventAttribute baseEventAttribute = (BaseEventAttribute)customAttributes[j]; - object obj; - Type type3; - if (baseEventAttribute.FilterName == string.Empty) - { - obj = this; - type3 = type; - } - else - { - PropertyInfo property = type2.GetProperty(baseEventAttribute.FilterName, BindingFlags.Instance | BindingFlags.Public); - if (property == null) - { - continue; - } - obj = property.GetValue(base.Core, null); - type3 = obj.GetType(); - } - EventInfo eventInfo = null; - while ((eventInfo = type3.GetEvent(baseEventAttribute.EventName, BindingFlags)) == null && type3 == type) - { - type3 = type2; - obj = base.Core; - } - if (!(eventInfo == null)) - { - if (connect) - { - eventInfo.GetAddMethod(nonPublic: true).Invoke(obj, new object[1] { Delegate.CreateDelegate(eventInfo.EventHandlerType, this, methodInfo.Name) }); - } - else - { - eventInfo.GetRemoveMethod(nonPublic: true).Invoke(obj, new object[1] { Delegate.CreateDelegate(eventInfo.EventHandlerType, this, methodInfo.Name) }); - } - } - } - } - } - - /// - /// Loads a new view into the internal list (should only be called internally) - /// - /// view name - /// resource path - public void LoadView(string name, string resource) - { - myViews.Add(name, Host.LoadViewResource(resource, GetType().Assembly)); - } - - /// - /// Retrieves a view from the internal list - /// - /// view name - /// the specified view or null - public ViewWrapper GetView(string name) - { - if (myViews.TryGetValue(name, out var value)) - { - return value; - } - return null; - } -} diff --git a/Unused/Decal.Adapter/PluginProxy.cs b/Unused/Decal.Adapter/PluginProxy.cs deleted file mode 100644 index b0e79a4..0000000 --- a/Unused/Decal.Adapter/PluginProxy.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using Decal.Adapter.Support; -using Decal.Adapter.Wrappers; -using Decal.Interop.Core; - -namespace Decal.Adapter; - -/// -/// -/// -public sealed class PluginProxy : IPlugin2, IDecalDirectory -{ - private PluginHost mySite; - - private PluginBase myWrapped; - - internal PluginProxy(PluginBase toWrap) - { - myWrapped = toWrap; - } - - void IPlugin2.Initialize(PluginSite2 Site) - { - mySite = new PluginHost(Site); - myWrapped.SetHost(mySite); - try - { - myWrapped.standardEvent(ExtensionEvents.InternalWireup); - } - catch (Exception ex) - { - Util.WriteLine("InternalWireup Exception: " + ex.Message); - } - try - { - myWrapped.standardEvent(ExtensionEvents.Startup); - } - catch (Exception ex2) - { - Util.WriteLine("Startup Exception: " + ex2.Message); - } - } - - void IPlugin2.Terminate() - { - try - { - myWrapped.standardEvent(ExtensionEvents.Shutdown); - } - catch (Exception ex) - { - Util.WriteLine("Shutdown Exception: " + ex.Message); - } - try - { - myWrapped.standardEvent(ExtensionEvents.InternalUnwire); - } - catch (Exception ex2) - { - Util.WriteLine("InternalUnwire Exception: " + ex2.Message); - } - mySite.Dispose(); - mySite = null; - myWrapped = null; - } - - object IDecalDirectory.Lookup(string strName) - { - return myWrapped.ResolvePath(strName); - } -} diff --git a/Unused/Decal.Adapter/RegionChange3DEventArgs.cs b/Unused/Decal.Adapter/RegionChange3DEventArgs.cs deleted file mode 100644 index a3ff29a..0000000 --- a/Unused/Decal.Adapter/RegionChange3DEventArgs.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Drawing; - -namespace Decal.Adapter; - -public class RegionChange3DEventArgs : EventArgs -{ - private int myLeft; - - private int myRight; - - private int myTop; - - private int myBottom; - - public int Left => myLeft; - - public int Right => myRight; - - public int Top => myTop; - - public int Bottom => myBottom; - - public Rectangle Rect => new Rectangle(myLeft, myTop, myRight - myLeft, myBottom - myTop); - - internal RegionChange3DEventArgs(int left, int top, int right, int bottom) - { - myLeft = left; - myTop = top; - myRight = right; - myBottom = bottom; - } -} diff --git a/Unused/Decal.Adapter/RenderViolationException.cs b/Unused/Decal.Adapter/RenderViolationException.cs deleted file mode 100644 index d2fd6e8..0000000 --- a/Unused/Decal.Adapter/RenderViolationException.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Decal.Adapter; - -internal class RenderViolationException : Exception -{ - internal RenderViolationException(string message) - : base(message) - { - } -} diff --git a/Unused/Decal.Adapter/RuntimePolicyHelper.cs b/Unused/Decal.Adapter/RuntimePolicyHelper.cs deleted file mode 100644 index f38780c..0000000 --- a/Unused/Decal.Adapter/RuntimePolicyHelper.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace Decal.Adapter; - -internal static class RuntimePolicyHelper -{ - [ComImport] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - [Guid("BD39D1D2-BA2F-486A-89B0-B4B0CB466891")] - private interface ICLRRuntimeInfo - { - void xGetVersionString(); - - void xGetRuntimeDirectory(); - - void xIsLoaded(); - - void xIsLoadable(); - - void xLoadErrorString(); - - void xLoadLibrary(); - - void xGetProcAddress(); - - void xGetInterface(); - - void xSetDefaultStartupFlags(); - - void xGetDefaultStartupFlags(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void BindAsLegacyV2Runtime(); - } - - public static bool LegacyV2RuntimeEnabledSuccessfully { get; private set; } - - static RuntimePolicyHelper() - { - ICLRRuntimeInfo iCLRRuntimeInfo = (ICLRRuntimeInfo)RuntimeEnvironment.GetRuntimeInterfaceAsObject(Guid.Empty, typeof(ICLRRuntimeInfo).GUID); - try - { - iCLRRuntimeInfo.BindAsLegacyV2Runtime(); - LegacyV2RuntimeEnabledSuccessfully = true; - } - catch (COMException) - { - LegacyV2RuntimeEnabledSuccessfully = false; - } - } -} diff --git a/Unused/Decal.Adapter/ServiceBase.cs b/Unused/Decal.Adapter/ServiceBase.cs deleted file mode 100644 index 65c6f65..0000000 --- a/Unused/Decal.Adapter/ServiceBase.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace Decal.Adapter; - -public abstract class ServiceBase : Extension -{ - internal enum ServiceEventType - { - BeforePlugins, - AfterPluigins - } - - public ServiceBase() - : base(DecalExtensionType.Service) - { - } - - internal void ServiceEvent(ServiceEventType evt) - { - switch (evt) - { - case ServiceEventType.BeforePlugins: - OnBeforePlugins(); - break; - case ServiceEventType.AfterPluigins: - OnAfterPlugins(); - break; - } - } - - protected virtual void OnBeforePlugins() - { - } - - protected virtual void OnAfterPlugins() - { - } -} diff --git a/Unused/Decal.Adapter/ServiceProxy.cs b/Unused/Decal.Adapter/ServiceProxy.cs deleted file mode 100644 index 9cf7d0a..0000000 --- a/Unused/Decal.Adapter/ServiceProxy.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Decal.Interop.Core; - -namespace Decal.Adapter; - -public sealed class ServiceProxy : IDecalService, IDecalDirectory -{ - private ServiceBase wrapped; - - internal ServiceProxy(ServiceBase toWrap) - { - wrapped = toWrap; - } - - void IDecalService.AfterPlugins() - { - wrapped.ServiceEvent(ServiceBase.ServiceEventType.AfterPluigins); - } - - void IDecalService.BeforePlugins() - { - wrapped.ServiceEvent(ServiceBase.ServiceEventType.BeforePlugins); - } - - void IDecalService.Initialize(DecalCore pDecal) - { - wrapped.standardEvent(ExtensionEvents.Startup); - } - - void IDecalService.Terminate() - { - wrapped.standardEvent(ExtensionEvents.Shutdown); - } - - object IDecalDirectory.Lookup(string strName) - { - return wrapped.ResolvePath(strName); - } -} diff --git a/Unused/Decal.Adapter/StatusTextInterceptEventArgs.cs b/Unused/Decal.Adapter/StatusTextInterceptEventArgs.cs deleted file mode 100644 index 9265cbc..0000000 --- a/Unused/Decal.Adapter/StatusTextInterceptEventArgs.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Decal.Adapter; - -public class StatusTextInterceptEventArgs : EatableEventArgs -{ - public string Text { get; protected set; } - - internal StatusTextInterceptEventArgs(string text, bool eat) - : base(eat) - { - Text = text; - } -} diff --git a/Unused/Decal.Adapter/Surrogate.cs b/Unused/Decal.Adapter/Surrogate.cs deleted file mode 100644 index 63ab31d..0000000 --- a/Unused/Decal.Adapter/Surrogate.cs +++ /dev/null @@ -1,266 +0,0 @@ -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using Decal.Adapter.Support; -using Decal.Interop.Core; -using Decal.Interop.Net; -using Microsoft.Win32; - -namespace Decal.Adapter; - -/// -/// -/// -[ComVisible(true)] -[ClassInterface(ClassInterfaceType.None)] -[ComDefaultInterface(typeof(IAdapterSurrogate))] -[ProgId("DecalAdapter.Surrogate")] -[Guid("71A69713-6593-47EC-0002-0000000DECA1")] -public sealed class Surrogate : MarshalByRefObject, IAdapterSurrogate, IDecalFileSurrogate -{ - private string myAssemblyName; - - private string myPath; - - private string myTypeName; - - string IAdapterSurrogate.Version - { - get - { - CoreManager current = CoreManager.Current; - if (current == null) - { - current = CoreManager.Current; - } - if (File.Exists(Path.Combine(myPath, myAssemblyName))) - { - return FileVersionInfo.GetVersionInfo(Path.Combine(myPath, myAssemblyName)).FileVersion; - } - return ""; - } - } - - bool IAdapterSurrogate.FileExists => File.Exists(Path.Combine(myPath, myAssemblyName)); - - string IAdapterSurrogate.FilePath => Path.Combine(myPath, myAssemblyName); - - string IDecalFileSurrogate.Description => "Decal.Adapter Extension"; - - string IDecalFileSurrogate.Extension => "dll"; - - IntPtr IAdapterSurrogate.CreateInstance(DecalEnum pInitData, ref Guid riid) - { - if (CoreManager.ServiceRunning) - { - CoreManager current = CoreManager.Current; - try - { - myTypeName = (string)((IDecalEnum)pInitData).get_Property("Object"); - myAssemblyName = (string)((IDecalEnum)pInitData).get_Property("Assembly"); - myPath = (string)((IDecalEnum)pInitData).get_Property("Path"); - Assembly assembly = ((!(pInitData.Group == "Plugins")) ? current.Assembly(myAssemblyName, myPath) : current.Assembly(myAssemblyName, myPath, current.PluginDomain)); - Type type = assembly.GetType(myTypeName); - if (null == type) - { - throw new COMHResultException(HResults.E_FAIL); - } - IntPtr ppv; - if (type.IsSubclassOf(typeof(Extension))) - { - Extension extension = ((!type.IsSubclassOf(typeof(PluginBase))) ? ((Extension)Activator.CreateInstance(type, null)) : ((Extension)current.PluginDomain.CreateInstanceFromAndUnwrap(Path.Combine(myPath, myAssemblyName), myTypeName))); - extension.Path = myPath; - object obj = null; - switch (extension.ExtensionType) - { - case DecalExtensionType.Service: - if (extension is ServiceBase serviceBase) - { - current.AddService(serviceBase); - obj = new ServiceProxy(serviceBase); - } - break; - case DecalExtensionType.NetworkFilter: - if (extension is FilterBase filterBase) - { - current.AddFilter(filterBase); - obj = new FilterProxy(filterBase); - } - break; - case DecalExtensionType.Plugin: - if (extension is PluginBase pluginBase) - { - current.AddPlugin(pluginBase); - obj = new PluginProxy(pluginBase); - } - break; - } - IntPtr pUnk = ((obj == null) ? Marshal.GetIUnknownForObject(extension) : Marshal.GetIUnknownForObject(obj)); - int num = Marshal.QueryInterface(pUnk, ref riid, out ppv); - Marshal.Release(pUnk); - if (num < 0) - { - throw new Exception(); - } - return ppv; - } - object o = Activator.CreateInstance(type, null); - if (!type.IsSubclassOf(typeof(INetworkFilter))) - { - type.IsSubclassOf(typeof(INetworkFilter2)); - } - IntPtr iUnknownForObject = Marshal.GetIUnknownForObject(o); - Marshal.QueryInterface(iUnknownForObject, ref riid, out ppv); - Marshal.Release(iUnknownForObject); - return ppv; - } - catch - { - throw new COMHResultException(HResults.E_FAIL); - } - finally - { - Marshal.ReleaseComObject(pInitData); - } - } - Marshal.ReleaseComObject(pInitData); - throw new COMHResultException(HResults.E_FAIL); - } - - void IAdapterSurrogate.SetEnum(DecalEnum pInitData) - { - try - { - myTypeName = (string)((IDecalEnum)pInitData).get_Property("Object"); - myAssemblyName = (string)((IDecalEnum)pInitData).get_Property("Assembly"); - myPath = (string)((IDecalEnum)pInitData).get_Property("Path"); - Marshal.ReleaseComObject(pInitData); - } - catch (COMException) - { - } - } - - void IDecalFileSurrogate.Register(string Filename) - { - bool flag = false; - int num = 0; - int num2 = 0; - try - { - if (File.Exists(Filename)) - { - Assembly assembly = Assembly.LoadFile(Filename); - string text = ""; - if (Attribute.IsDefined(assembly, typeof(GuidAttribute))) - { - text = ((GuidAttribute)Attribute.GetCustomAttribute(assembly, typeof(GuidAttribute))).Value.ToUpper(CultureInfo.InvariantCulture); - } - Type[] types; - try - { - types = assembly.GetTypes(); - } - catch (ReflectionTypeLoadException ex) - { - types = ex.Types; - } - Type[] array = types; - foreach (Type type in array) - { - if (null == type || !type.IsPublic) - { - continue; - } - int num3 = 0; - if (!type.IsSubclassOf(typeof(Extension))) - { - continue; - } - string directoryName = Path.GetDirectoryName(Filename); - string fileName = Path.GetFileName(Filename); - string value = ""; - string value2 = "{71A69713-6593-47EC-0002-0000000DECA1}"; - string text2 = ""; - if (type.IsSubclassOf(typeof(PluginBase))) - { - text2 = "Plugins"; - num++; - num3 = num; - } - else - { - if (!type.IsSubclassOf(typeof(FilterBase))) - { - continue; - } - text2 = "NetworkFilters"; - num2++; - num3 = num2; - } - if (Attribute.IsDefined(type, typeof(FriendlyNameAttribute))) - { - value = ((FriendlyNameAttribute)Attribute.GetCustomAttribute(type, typeof(FriendlyNameAttribute))).Name; - } - string text3 = type.Namespace.ToString() + "." + type.Name.ToString(); - string text4 = ""; - if (Attribute.IsDefined(type, typeof(GuidAttribute))) - { - text4 = ((GuidAttribute)Attribute.GetCustomAttribute(type, typeof(GuidAttribute))).Value.ToString(); - } - else if (!string.IsNullOrEmpty(text) && num3 == 1) - { - text4 = text; - } - else if (!string.IsNullOrEmpty(text)) - { - byte[] array2 = new Guid(text).ToByteArray(); - array2[15] = (byte)(array2[15] ^ num3); - text4 = new Guid(array2).ToString(); - } - else - { - text4 = Guid.NewGuid().ToString(); - } - text4 = text4.ToUpper(CultureInfo.InvariantCulture); - string subkey = string.Format("SOFTWARE\\Decal\\{0}\\{1}", text2, "{" + text4 + "}"); - Util.WriteLine("Registering Decal.Adapter extension (Type:" + type.ToString() + ")"); - Util.WriteLine("Assembly Directory: " + directoryName); - Util.WriteLine("Assembly File: " + fileName); - Util.WriteLine("Assembly Object: " + text3); - Util.WriteLine("Extension Registry CLSID: " + text4); - RegistryKey registryKey = Registry.LocalMachine.CreateSubKey(subkey); - if (registryKey != null) - { - registryKey.SetValue("Enabled", 0, RegistryValueKind.DWord); - registryKey.SetValue("Assembly", fileName, RegistryValueKind.String); - registryKey.SetValue("Path", directoryName, RegistryValueKind.String); - registryKey.SetValue("Object", text3, RegistryValueKind.String); - registryKey.SetValue("Surrogate", value2, RegistryValueKind.String); - if (!string.IsNullOrEmpty(value)) - { - registryKey.SetValue("", value, RegistryValueKind.String); - } - else - { - registryKey.SetValue("", text3, RegistryValueKind.String); - } - flag = true; - } - } - } - } - catch (Exception ex2) - { - Util.WriteLine("Exception registering plugin: " + ex2.ToString()); - throw new COMHResultException(HResults.E_FAIL); - } - if (!flag) - { - throw new COMHResultException(HResults.E_FAIL); - } - } -} diff --git a/Unused/Decal.Adapter/TextBoxChangeEventArgs.cs b/Unused/Decal.Adapter/TextBoxChangeEventArgs.cs deleted file mode 100644 index d1c97b8..0000000 --- a/Unused/Decal.Adapter/TextBoxChangeEventArgs.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Decal.Adapter; - -public class TextBoxChangeEventArgs : ControlEventArgs -{ - private string text; - - public string Text => text; - - internal TextBoxChangeEventArgs(int ID, string text) - : base(ID) - { - this.text = text; - } -} diff --git a/Unused/Decal.Adapter/TextBoxEndEventArgs.cs b/Unused/Decal.Adapter/TextBoxEndEventArgs.cs deleted file mode 100644 index c4a6e72..0000000 --- a/Unused/Decal.Adapter/TextBoxEndEventArgs.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Decal.Adapter; - -public class TextBoxEndEventArgs : ControlEventArgs -{ - private bool success; - - public bool Success => success; - - internal TextBoxEndEventArgs(int ID, bool success) - : base(ID) - { - this.success = success; - } -} diff --git a/Unused/Decal.Adapter/ViewAttribute.cs b/Unused/Decal.Adapter/ViewAttribute.cs deleted file mode 100644 index 5c186ae..0000000 --- a/Unused/Decal.Adapter/ViewAttribute.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; - -namespace Decal.Adapter; - -/// -/// Defines a plugin view -/// -[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] -public sealed class ViewAttribute : ViewBaseAttribute -{ - private string myResource; - - /// - /// The resource to load - /// - public string Resource => myResource; - - /// - /// Constructs a new view from the specified resource - /// - /// Embedded resource path - public ViewAttribute(string resource) - { - myResource = resource; - } -} diff --git a/Unused/Decal.Adapter/ViewBaseAttribute.cs b/Unused/Decal.Adapter/ViewBaseAttribute.cs deleted file mode 100644 index 9696fe6..0000000 --- a/Unused/Decal.Adapter/ViewBaseAttribute.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace Decal.Adapter; - -public abstract class ViewBaseAttribute : Attribute -{ - private string myName; - - /// - /// Name named attribute - /// - public string ViewName - { - get - { - return myName; - } - set - { - myName = value; - } - } - - protected ViewBaseAttribute() - { - myName = "Default"; - } -} diff --git a/Unused/Decal.Adapter/ViewHandler.cs b/Unused/Decal.Adapter/ViewHandler.cs deleted file mode 100644 index 036cb26..0000000 --- a/Unused/Decal.Adapter/ViewHandler.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using Decal.Adapter.Wrappers; - -namespace Decal.Adapter; - -[CLSCompliant(true)] -public class ViewHandler : IViewHandler, IDisposable -{ - private Dictionary myViews; - - private BindingFlags myBindingFlags; - - private PluginHost myHost; - - private bool isDisposed; - - protected bool IsDisposed => isDisposed; - - protected PluginHost Host => myHost; - - public ViewWrapper DefaultView => myViews["Default"]; - - public BindingFlags BindingFlags => myBindingFlags; - - public ViewHandler(PluginHost host) - { - myBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - myViews = new Dictionary(); - myHost = host; - } - - public void Dispose() - { - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing && myViews != null) - { - foreach (ViewWrapper value in myViews.Values) - { - value.Dispose(); - } - myViews.Clear(); - myViews = null; - } - isDisposed = true; - } - - internal void LoadComplete() - { - OnLoad(); - } - - protected virtual void OnLoad() - { - } - - public void LoadView(string name, string resource) - { - myViews.Add(name, Host.LoadViewResource(resource, GetType().Assembly)); - } - - public ViewWrapper GetView(string name) - { - if (myViews.TryGetValue(name, out var value)) - { - return value; - } - return null; - } -} diff --git a/Unused/Decal.Adapter/WindowMessageEventArgs.cs b/Unused/Decal.Adapter/WindowMessageEventArgs.cs deleted file mode 100644 index 7a8112b..0000000 --- a/Unused/Decal.Adapter/WindowMessageEventArgs.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace Decal.Adapter; - -public class WindowMessageEventArgs : EatableEventArgs -{ - private int myHwnd; - - private short myMsg; - - private int mywParam; - - private int mylParam; - - public int Hwnd => myHwnd; - - public short Msg => myMsg; - - public int WParam => mywParam; - - public int LParam => mylParam; - - internal WindowMessageEventArgs(int hwnd, short uMsg, int wParam, int lParam) - : base(eat: false) - { - myHwnd = hwnd; - myMsg = uMsg; - mywParam = wParam; - mylParam = lParam; - } -} diff --git a/Unused/Decal.Adapter/WireUpBaseEventsAttribute.cs b/Unused/Decal.Adapter/WireUpBaseEventsAttribute.cs deleted file mode 100644 index 98151f4..0000000 --- a/Unused/Decal.Adapter/WireUpBaseEventsAttribute.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace Decal.Adapter; - -[AttributeUsage(AttributeTargets.Class)] -public sealed class WireUpBaseEventsAttribute : Attribute -{ -} diff --git a/Unused/Decal.Adapter/WireUpControlEventsAttribute.cs b/Unused/Decal.Adapter/WireUpControlEventsAttribute.cs deleted file mode 100644 index 49e954b..0000000 --- a/Unused/Decal.Adapter/WireUpControlEventsAttribute.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace Decal.Adapter; - -[AttributeUsage(AttributeTargets.Class)] -public sealed class WireUpControlEventsAttribute : Attribute -{ -} diff --git a/Unused/Decal.Interop.Core/ACHooks.cs b/Unused/Decal.Interop.Core/ACHooks.cs deleted file mode 100644 index f85556e..0000000 --- a/Unused/Decal.Interop.Core/ACHooks.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("93FD982E-D1CE-46C3-9428-532ACCDA06CE")] -[CoClass(typeof(ACHooksClass))] -public interface ACHooks : IACHooks, IACHooksEvents_Event -{ -} diff --git a/Unused/Decal.Interop.Core/ACHooksClass.cs b/Unused/Decal.Interop.Core/ACHooksClass.cs deleted file mode 100644 index b2cb9a7..0000000 --- a/Unused/Decal.Interop.Core/ACHooksClass.cs +++ /dev/null @@ -1,586 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("CB8875CD-ABC2-42AD-8175-8908706EED37")] -[ComSourceInterfaces("Decal.Interop.Core.IACHooksEvents\0\0")] -[TypeLibType(2)] -[SuppressUnmanagedCodeSecurity] -[ClassInterface(0)] -public class ACHooksClass : IACHooks, ACHooks, IACHooksEvents_Event -{ - [DispId(1610743810)] - public virtual extern int HooksAvail - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743810)] - get; - } - - [DispId(1610743811)] - public virtual extern bool HooksAvailEx - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743811)] - get; - } - - [DispId(1610743818)] - public virtual extern int CurrentSelection - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743818)] - get; - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743818)] - [param: In] - set; - } - - [DispId(1610743820)] - public virtual extern int PreviousSelection - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743820)] - get; - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743820)] - [param: In] - set; - } - - [DispId(1610743822)] - public virtual extern int SelectedStackCount - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743822)] - get; - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743822)] - [param: In] - set; - } - - [DispId(1610743824)] - public virtual extern int MaxSelectedStackCount - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743824)] - get; - } - - [DispId(1610743826)] - public virtual extern tagRECT AC3DRegionRect - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743826)] - get; - } - - [DispId(1610743827)] - public virtual extern IntPtr AC3DRegionRectPtr - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743827)] - get; - } - - [DispId(1610743828)] - public virtual extern tagRECT ACWindowRect - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743828)] - get; - } - - [DispId(1610743829)] - public virtual extern bool ChatState - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743829)] - get; - } - - [DispId(1610743830)] - public virtual extern int BusyState - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743830)] - get; - } - - [DispId(1610743831)] - public virtual extern int BusyStateID - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743831)] - get; - } - - [DispId(1610743832)] - public virtual extern int PointerState - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743832)] - get; - } - - [DispId(1610743833)] - public virtual extern int VendorID - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743833)] - get; - } - - [DispId(1610743840)] - public virtual extern int CombatMode - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743840)] - get; - } - - [DispId(1610743844)] - public virtual extern int CommandInterpreter - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743844)] - get; - } - - [DispId(1610743858)] - public virtual extern double HeadingDegrees - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743858)] - get; - } - - [DispId(1610743859)] - public virtual extern double HeadingRadians - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743859)] - get; - } - - [DispId(1610743860)] - public virtual extern int Landcell - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743860)] - get; - } - - [DispId(1610743861)] - public virtual extern double LocationX - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743861)] - get; - } - - [DispId(1610743862)] - public virtual extern double LocationY - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743862)] - get; - } - - [DispId(1610743863)] - public virtual extern double LocationZ - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743863)] - get; - } - - [DispId(1610743864)] - public virtual extern eTrainLevel SkillTrainLevel - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743864)] - get; - } - - [DispId(1610743865)] - public virtual extern int SkillTotalXP - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743865)] - get; - } - - [DispId(1610743866)] - public virtual extern int SkillFreePoints - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743866)] - get; - } - - [DispId(1610743867)] - public virtual extern int SkillClicks - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743867)] - get; - } - - [DispId(1610743868)] - public virtual extern int AttributeTotalXP - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743868)] - get; - } - - [DispId(1610743869)] - public virtual extern int AttributeClicks - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743869)] - get; - } - - [DispId(1610743870)] - public virtual extern int AttributeStart - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743870)] - get; - } - - [DispId(1610743871)] - public virtual extern int VitalTotalXP - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743871)] - get; - } - - [DispId(1610743872)] - public virtual extern int VitalClicks - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743872)] - get; - } - - [DispId(1610743873)] - public virtual extern int Vital - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743873)] - get; - } - - [DispId(1610743874)] - public virtual extern int Attribute - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743874)] - get; - } - - [DispId(1610743875)] - public virtual extern int Skill - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743875)] - get; - } - - [DispId(1610743876)] - public virtual extern int Misc - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743876)] - get; - } - - [DispId(1610743888)] - public virtual extern int OpenedContainer - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743888)] - get; - } - - [DispId(1610743894)] - public virtual extern int CallerRefInstanceInternal - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743894)] - [param: In] - set; - } - - public virtual extern event IACHooksEvents_ObjectDestroyedEventHandler ObjectDestroyed; - - public virtual extern event IACHooksEvents_ChatTextInterceptEventHandler ChatTextIntercept; - - public virtual extern event IACHooksEvents_ChatParserInterceptEventHandler ChatParserIntercept; - - public virtual extern event IACHooksEvents_StatusTextInterceptEventHandler StatusTextIntercept; - - public virtual extern event IACHooksEvents_ObjectSelectedEventHandler ObjectSelected; - - public virtual extern event IACHooksEvents_MessageProcessedEventHandler MessageProcessed; - - public virtual extern event IACHooksEvents_AC3DRegionChangedEventHandler AC3DRegionChanged; - - public virtual extern event IACHooksEvents_ContainerOpenedEventHandler ContainerOpened; - - public virtual extern event IACHooksEvents_ChatClickInterceptEventHandler ChatClickIntercept; - - public virtual extern event IACHooksEvents_RenderPreUIEventHandler RenderPreUI; - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743808)] - [TypeLibFunc(64)] - public virtual extern void SetIDFilter([In][MarshalAs(UnmanagedType.Interface)] IIdentifyFilter pIDFilter); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743809)] - [TypeLibFunc(64)] - public virtual extern void SetDecal([In][MarshalAs(UnmanagedType.IUnknown)] object pDecal); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743812)] - public virtual extern void AddChatText([In][MarshalAs(UnmanagedType.BStr)] string szText, int lColor, int lTarget); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743813)] - public virtual extern void AddChatTextRaw([In][MarshalAs(UnmanagedType.BStr)] string szText, int lColor, int lTarget); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743814)] - public virtual extern void AddStatusText([In][MarshalAs(UnmanagedType.BStr)] string Text); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743815)] - public virtual extern void InvokeChatParser([In][MarshalAs(UnmanagedType.BStr)] string Text); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743816)] - public virtual extern void SetIdleTime([In] double dIdleTimeout); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743817)] - public virtual extern void Logout(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743825)] - public virtual extern void SetCursorPosition([In] int lX, int lY); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743834)] - public virtual extern void VendorBuyListAdd([In] int lID, int lAmount); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743835)] - public virtual extern void VendorBuyListClear(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743836)] - public virtual extern void VendorBuyAll(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743837)] - public virtual extern void VendorSellListAdd([In] int lID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743838)] - public virtual extern void VendorSellListClear(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743839)] - public virtual extern void VendorSellAll(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743841)] - public virtual extern void SetCombatMode([In] int pVal); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743842)] - public virtual extern void SetAutorun([In] bool bOnOff); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743843)] - public virtual extern bool FaceHeading([In] float fHeading, [In] bool bUnknown); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743845)] - public virtual extern void SelectItem([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743846)] - public virtual extern void GiveItem([In] int lObject, int lDestination); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743847)] - public virtual extern void ApplyItem([In] int UseThis, int OnThis); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743848)] - public virtual extern void UseItem([In] int lObjectID, int lUseState); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743849)] - public virtual extern void UseItemRaw([In] int lObjectID, int lUseState, int lUseMethod); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743850)] - public virtual extern void MoveItem([In] int lObjectID, int lPackID, int lSlot, bool bStack); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743851)] - public virtual extern void MoveItemEx([In] int lObjectID, int lDestinationID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743852)] - public virtual extern void MoveItemExRaw([In] int lObject, int lDestination, int lMoveFlags); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743853)] - public virtual extern void DropItem([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743854)] - public virtual extern void CastSpell([In] int lSpellID, int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743855)] - public virtual extern bool IsValidObject([In] int lGUID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743856)] - public virtual extern int GetWeenieObjectPtr([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743857)] - public virtual extern int GetPhysicsObjectPtr([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743877)] - public virtual extern void RequestID([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743878)] - public virtual extern void IDQueueAdd([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743879)] - public virtual extern void SpellTabAdd([In] int lTab, int lIndex, int lSpellID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743880)] - public virtual extern void SpellTabDelete([In] int lTab, int lSpellID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743881)] - public virtual extern void TradeAdd([In] int ItemID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743882)] - public virtual extern void TradeAccept(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743883)] - public virtual extern void TradeDecline(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743884)] - public virtual extern void TradeReset(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743885)] - public virtual extern void TradeEnd(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743886)] - public virtual extern void SalvagePanelAdd([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743887)] - public virtual extern void SalvagePanelSalvage(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743889)] - public virtual extern void AddSkillExp([In] eSkill SkillID, int lExperience); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743890)] - public virtual extern void AddAttributeExp([In] eAttribute AttribID, int lExperience); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743891)] - public virtual extern void AddVitalExp([In] eVital VitalID, int lExperience); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743892)] - public virtual extern int SmartboxPtr(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743893)] - public virtual extern float ObjectHeight([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743895)] - public virtual extern void AutoWieldRaw([In] int lObjectID, int SlotID, int Explicit, int NotExplicit, int zeroVal1, int zeroVal2); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743896)] - public virtual extern void AutoWield([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743897)] - public virtual extern void AutoWieldEx([In] int lObjectID, int SlotID, int Explicit, int NotExplicit); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743898)] - public virtual extern void FellowshipRecruit([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743899)] - public virtual extern void FellowshipGrantLeader([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743900)] - public virtual extern void FellowshipSetOpen([In] bool IsOpen); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743901)] - public virtual extern void FellowshipQuit(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743902)] - public virtual extern void FellowshipDisband(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743903)] - public virtual extern void FellowshipDismiss([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743904)] - public virtual extern void UIElementMove([In] int lUIElementType, int X, int Y); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743905)] - public virtual extern void UIElementResize([In] int lUIElementType, int Width, int Height); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743906)] - public virtual extern int UIElementLookup([In] int lUIElementType); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743907)] - public virtual extern tagRECT UIElementRegionRect([In] int lUIElementType); -} diff --git a/Unused/Decal.Interop.Core/ActiveXSurrogate.cs b/Unused/Decal.Interop.Core/ActiveXSurrogate.cs deleted file mode 100644 index 01da5bf..0000000 --- a/Unused/Decal.Interop.Core/ActiveXSurrogate.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("E182005F-6A67-48B5-A50F-464340105330")] -[CoClass(typeof(ActiveXSurrogateClass))] -public interface ActiveXSurrogate : IDecalFileSurrogate -{ -} diff --git a/Unused/Decal.Interop.Core/ActiveXSurrogateClass.cs b/Unused/Decal.Interop.Core/ActiveXSurrogateClass.cs deleted file mode 100644 index d35772d..0000000 --- a/Unused/Decal.Interop.Core/ActiveXSurrogateClass.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[TypeLibType(2)] -[SuppressUnmanagedCodeSecurity] -[ClassInterface(0)] -[Guid("7559F22F-C56F-4621-AE08-9C354D799D4B")] -public class ActiveXSurrogateClass : IDecalFileSurrogate, ActiveXSurrogate, IDecalUninstall -{ - [DispId(1610678273)] - public virtual extern string Extension - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [DispId(1610678274)] - public virtual extern string Description - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void Register([MarshalAs(UnmanagedType.BStr)] string Filename); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void Prepare([MarshalAs(UnmanagedType.Interface)] DecalEnum pEnum); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void Uninstall(); -} diff --git a/Unused/Decal.Interop.Core/DecalCore.cs b/Unused/Decal.Interop.Core/DecalCore.cs deleted file mode 100644 index 76afbb0..0000000 --- a/Unused/Decal.Interop.Core/DecalCore.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComImport] -[CoClass(typeof(DecalCoreClass))] -[Guid("A38715BB-91E7-4C66-95F9-363096F29760")] -public interface DecalCore : IDecalCore, IDecalEvents_Event -{ -} diff --git a/Unused/Decal.Interop.Core/DecalCoreClass.cs b/Unused/Decal.Interop.Core/DecalCoreClass.cs deleted file mode 100644 index 6c3efba..0000000 --- a/Unused/Decal.Interop.Core/DecalCoreClass.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("4557D5A1-00DB-48F6-ACB3-4FEF30E2F358")] -[ComSourceInterfaces("Decal.Interop.Core.IDecalEvents\0\0")] -[TypeLibType(2)] -[SuppressUnmanagedCodeSecurity] -[ClassInterface(0)] -public class DecalCoreClass : IDecalCore, DecalCore, IDecalEvents_Event -{ - [DispId(1610678274)] - public virtual extern int HWND - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - set; - } - - [DispId(1610678276)] - public virtual extern bool Focus - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [DispId(1610678282)] - public virtual extern object Object - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - get; - } - - [DispId(1610678284)] - public virtual extern DecalEnum Configuration - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.Interface)] - get; - } - - [DispId(1610678286)] - public virtual extern object Plugin - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - get; - } - - [DispId(1610678287)] - public virtual extern object Service - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - get; - } - - [DispId(1610678292)] - public virtual extern ACHooks Hooks - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.Interface)] - get; - } - - [DispId(1610678297)] - public virtual extern bool PluginsRunning - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - public virtual extern event IDecalEvents_InitializeCompleteEventHandler InitializeComplete; - - public virtual extern event IDecalEvents_TerminateCompleteEventHandler TerminateComplete; - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void InitGraphics([MarshalAs(UnmanagedType.IUnknown)] object pD3DDevice); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - public virtual extern object GetD3DDevice(ref Guid riid); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void SendWM(int HWND, short uMsg, int wParam, int lParam, ref bool pbEat); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void GetScreenSize(out int pWidth, out int pHeight); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - public virtual extern string MapPath([MarshalAs(UnmanagedType.BStr)] string pPath); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void StartPlugins(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void StopPlugins(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void StartServices(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void StopServices(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void Render2D(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void Render3D(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void PreReset(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void PostReset(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void StartFilters(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void StopFilters(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern bool KillBitCheckByGUID([In][MarshalAs(UnmanagedType.BStr)] string bstrGuid, [MarshalAs(UnmanagedType.BStr)] string bstrVersion); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern bool KillBitCheckByProgID([In][MarshalAs(UnmanagedType.BStr)] string bstProgID, [MarshalAs(UnmanagedType.BStr)] string bstrVersion); -} diff --git a/Unused/Decal.Interop.Core/DecalEnum.cs b/Unused/Decal.Interop.Core/DecalEnum.cs deleted file mode 100644 index 35d85c1..0000000 --- a/Unused/Decal.Interop.Core/DecalEnum.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComImport] -[CoClass(typeof(DecalEnumClass))] -[Guid("FFA32A7A-EFAF-484A-B358-8802DBBAB0EC")] -public interface DecalEnum : IDecalEnum -{ -} diff --git a/Unused/Decal.Interop.Core/DecalEnumClass.cs b/Unused/Decal.Interop.Core/DecalEnumClass.cs deleted file mode 100644 index 389a125..0000000 --- a/Unused/Decal.Interop.Core/DecalEnumClass.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[ClassInterface(0)] -[Guid("6DE65A82-C451-46E6-A82D-92137BE851AD")] -[SuppressUnmanagedCodeSecurity] -public class DecalEnumClass : IDecalEnum, DecalEnum -{ - [DispId(1610678272)] - public virtual extern string FriendlyName - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [DispId(1610678273)] - public virtual extern Guid ComClass - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [DispId(1610678274)] - public virtual extern bool Enabled - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [param: In] - set; - } - - [DispId(1610678276)] - public virtual extern bool Restricted - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [DispId(1610678279)] - public virtual extern Guid SurrogateClass - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [DispId(1610678280)] - public virtual extern string ResourcePath - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [DispId(1610678281)] - public virtual extern object Property - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.Struct)] - get; - } - - [DispId(1610678282)] - public virtual extern string Group - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [DispId(1610678285)] - public virtual extern string Version - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [DispId(1610678286)] - public virtual extern bool FileExists - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [DispId(1610678287)] - public virtual extern string FilePath - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - public virtual extern object CreateInstance(ref Guid riid); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void Next(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void Skip([In] ref Guid clsid); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void MoveBefore(ref Guid clsidBefore); -} diff --git a/Unused/Decal.Interop.Core/DecalRes.cs b/Unused/Decal.Interop.Core/DecalRes.cs deleted file mode 100644 index f48f819..0000000 --- a/Unused/Decal.Interop.Core/DecalRes.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("A074F83A-32AB-46FC-9E4E-7E9DAFCD5D18")] -[CoClass(typeof(DecalResClass))] -public interface DecalRes : IDecalRes -{ -} diff --git a/Unused/Decal.Interop.Core/DecalResClass.cs b/Unused/Decal.Interop.Core/DecalResClass.cs deleted file mode 100644 index ba5ee7a..0000000 --- a/Unused/Decal.Interop.Core/DecalResClass.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[ClassInterface(0)] -[Guid("EA7BE91B-C98A-4138-8985-E22364BE8207")] -[SuppressUnmanagedCodeSecurity] -public class DecalResClass : IDecalRes, DecalRes -{ -} diff --git a/Unused/Decal.Interop.Core/IACHooks.cs b/Unused/Decal.Interop.Core/IACHooks.cs deleted file mode 100644 index 521c760..0000000 --- a/Unused/Decal.Interop.Core/IACHooks.cs +++ /dev/null @@ -1,565 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("93FD982E-D1CE-46C3-9428-532ACCDA06CE")] -[TypeLibType(4160)] -[SuppressUnmanagedCodeSecurity] -[ComConversionLoss] -public interface IACHooks -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [TypeLibFunc(64)] - [DispId(1610743808)] - void SetIDFilter([In][MarshalAs(UnmanagedType.Interface)] IIdentifyFilter pIDFilter); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743809)] - [TypeLibFunc(64)] - void SetDecal([In][MarshalAs(UnmanagedType.IUnknown)] object pDecal); - - [DispId(1610743810)] - int HooksAvail - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743810)] - get; - } - - [DispId(1610743811)] - bool HooksAvailEx - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743811)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743812)] - void AddChatText([In][MarshalAs(UnmanagedType.BStr)] string szText, int lColor, int lTarget); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743813)] - void AddChatTextRaw([In][MarshalAs(UnmanagedType.BStr)] string szText, int lColor, int lTarget); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743814)] - void AddStatusText([In][MarshalAs(UnmanagedType.BStr)] string Text); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743815)] - void InvokeChatParser([In][MarshalAs(UnmanagedType.BStr)] string Text); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743816)] - void SetIdleTime([In] double dIdleTimeout); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743817)] - void Logout(); - - [DispId(1610743818)] - int CurrentSelection - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743818)] - get; - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743818)] - [param: In] - set; - } - - [DispId(1610743820)] - int PreviousSelection - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743820)] - get; - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743820)] - [param: In] - set; - } - - [DispId(1610743822)] - int SelectedStackCount - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743822)] - get; - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743822)] - [param: In] - set; - } - - [DispId(1610743824)] - int MaxSelectedStackCount - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743824)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743825)] - void SetCursorPosition([In] int lX, int lY); - - [DispId(1610743826)] - tagRECT AC3DRegionRect - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743826)] - get; - } - - [DispId(1610743827)] - IntPtr AC3DRegionRectPtr - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743827)] - get; - } - - [DispId(1610743828)] - tagRECT ACWindowRect - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743828)] - get; - } - - [DispId(1610743829)] - bool ChatState - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743829)] - get; - } - - [DispId(1610743830)] - int BusyState - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743830)] - get; - } - - [DispId(1610743831)] - int BusyStateID - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743831)] - get; - } - - [DispId(1610743832)] - int PointerState - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743832)] - get; - } - - [DispId(1610743833)] - int VendorID - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743833)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743834)] - void VendorBuyListAdd([In] int lID, int lAmount); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743835)] - void VendorBuyListClear(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743836)] - void VendorBuyAll(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743837)] - void VendorSellListAdd([In] int lID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743838)] - void VendorSellListClear(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743839)] - void VendorSellAll(); - - [DispId(1610743840)] - int CombatMode - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743840)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743841)] - void SetCombatMode([In] int pVal); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743842)] - void SetAutorun([In] bool bOnOff); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743843)] - bool FaceHeading([In] float fHeading, [In] bool bUnknown); - - [DispId(1610743844)] - int CommandInterpreter - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743844)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743845)] - void SelectItem([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743846)] - void GiveItem([In] int lObject, int lDestination); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743847)] - void ApplyItem([In] int UseThis, int OnThis); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743848)] - void UseItem([In] int lObjectID, int lUseState); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743849)] - void UseItemRaw([In] int lObjectID, int lUseState, int lUseMethod); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743850)] - void MoveItem([In] int lObjectID, int lPackID, int lSlot, bool bStack); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743851)] - void MoveItemEx([In] int lObjectID, int lDestinationID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743852)] - void MoveItemExRaw([In] int lObject, int lDestination, int lMoveFlags); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743853)] - void DropItem([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743854)] - void CastSpell([In] int lSpellID, int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743855)] - bool IsValidObject([In] int lGUID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743856)] - int GetWeenieObjectPtr([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743857)] - int GetPhysicsObjectPtr([In] int lObjectID); - - [DispId(1610743858)] - double HeadingDegrees - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743858)] - get; - } - - [DispId(1610743859)] - double HeadingRadians - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743859)] - get; - } - - [DispId(1610743860)] - int Landcell - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743860)] - get; - } - - [DispId(1610743861)] - double LocationX - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743861)] - get; - } - - [DispId(1610743862)] - double LocationY - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743862)] - get; - } - - [DispId(1610743863)] - double LocationZ - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743863)] - get; - } - - [DispId(1610743864)] - eTrainLevel SkillTrainLevel - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743864)] - get; - } - - [DispId(1610743865)] - int SkillTotalXP - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743865)] - get; - } - - [DispId(1610743866)] - int SkillFreePoints - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743866)] - get; - } - - [DispId(1610743867)] - int SkillClicks - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743867)] - get; - } - - [DispId(1610743868)] - int AttributeTotalXP - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743868)] - get; - } - - [DispId(1610743869)] - int AttributeClicks - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743869)] - get; - } - - [DispId(1610743870)] - int AttributeStart - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743870)] - get; - } - - [DispId(1610743871)] - int VitalTotalXP - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743871)] - get; - } - - [DispId(1610743872)] - int VitalClicks - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743872)] - get; - } - - [DispId(1610743873)] - int Vital - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743873)] - get; - } - - [DispId(1610743874)] - int Attribute - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743874)] - get; - } - - [DispId(1610743875)] - int Skill - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743875)] - get; - } - - [DispId(1610743876)] - int Misc - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743876)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743877)] - void RequestID([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743878)] - void IDQueueAdd([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743879)] - void SpellTabAdd([In] int lTab, int lIndex, int lSpellID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743880)] - void SpellTabDelete([In] int lTab, int lSpellID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743881)] - void TradeAdd([In] int ItemID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743882)] - void TradeAccept(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743883)] - void TradeDecline(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743884)] - void TradeReset(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743885)] - void TradeEnd(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743886)] - void SalvagePanelAdd([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743887)] - void SalvagePanelSalvage(); - - [DispId(1610743888)] - int OpenedContainer - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743888)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743889)] - void AddSkillExp([In] eSkill SkillID, int lExperience); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743890)] - void AddAttributeExp([In] eAttribute AttribID, int lExperience); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743891)] - void AddVitalExp([In] eVital VitalID, int lExperience); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743892)] - int SmartboxPtr(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743893)] - float ObjectHeight([In] int lObjectID); - - [DispId(1610743894)] - int CallerRefInstanceInternal - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743894)] - [param: In] - set; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743895)] - void AutoWieldRaw([In] int lObjectID, int SlotID, int Explicit, int NotExplicit, int zeroVal1, int zeroVal2); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743896)] - void AutoWield([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743897)] - void AutoWieldEx([In] int lObjectID, int SlotID, int Explicit, int NotExplicit); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743898)] - void FellowshipRecruit([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743899)] - void FellowshipGrantLeader([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743900)] - void FellowshipSetOpen([In] bool IsOpen); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743901)] - void FellowshipQuit(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743902)] - void FellowshipDisband(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743903)] - void FellowshipDismiss([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743904)] - void UIElementMove([In] int lUIElementType, int X, int Y); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743905)] - void UIElementResize([In] int lUIElementType, int Width, int Height); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743906)] - int UIElementLookup([In] int lUIElementType); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1610743907)] - tagRECT UIElementRegionRect([In] int lUIElementType); -} diff --git a/Unused/Decal.Interop.Core/IACHooksEvents.cs b/Unused/Decal.Interop.Core/IACHooksEvents.cs deleted file mode 100644 index 1b5fea4..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[InterfaceType(2)] -[SuppressUnmanagedCodeSecurity] -[Guid("EB282FE5-7170-4A37-A26E-92AF36385D2C")] -[TypeLibType(4096)] -public interface IACHooksEvents -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1)] - void ObjectDestroyed([In] int lGUID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(2)] - void ChatTextIntercept([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In] int lColor, [In] int lTarget, [In][Out] ref bool bEat); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(3)] - void ChatParserIntercept([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In][Out] ref bool bEat); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(4)] - void StatusTextIntercept([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In][Out] ref bool bEat); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(5)] - void ObjectSelected([In] int lGUID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(6)] - void MessageProcessed([In] int pbData, [In] int dwSize); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(7)] - void AC3DRegionChanged([In] int left, [In] int top, int right, [In] int bottom); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(8)] - void ContainerOpened([In] int lGUID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(9)] - void ChatClickIntercept([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In] int lID, [In][Out] ref bool bEat); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(10)] - void RenderPreUI(); -} diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_AC3DRegionChangedEventHandler.cs b/Unused/Decal.Interop.Core/IACHooksEvents_AC3DRegionChangedEventHandler.cs deleted file mode 100644 index ab8a5da..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_AC3DRegionChangedEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[TypeLibType(16)] -[ComVisible(false)] -public delegate void IACHooksEvents_AC3DRegionChangedEventHandler([In] int left, [In] int top, int right, [In] int bottom); diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_ChatClickInterceptEventHandler.cs b/Unused/Decal.Interop.Core/IACHooksEvents_ChatClickInterceptEventHandler.cs deleted file mode 100644 index cf40e7a..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_ChatClickInterceptEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[TypeLibType(16)] -[ComVisible(false)] -public delegate void IACHooksEvents_ChatClickInterceptEventHandler([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In] int lID, [In][Out] ref bool bEat); diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_ChatParserInterceptEventHandler.cs b/Unused/Decal.Interop.Core/IACHooksEvents_ChatParserInterceptEventHandler.cs deleted file mode 100644 index 02aea65..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_ChatParserInterceptEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComVisible(false)] -[TypeLibType(16)] -public delegate void IACHooksEvents_ChatParserInterceptEventHandler([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In][Out] ref bool bEat); diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_ChatTextInterceptEventHandler.cs b/Unused/Decal.Interop.Core/IACHooksEvents_ChatTextInterceptEventHandler.cs deleted file mode 100644 index b2bb0dd..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_ChatTextInterceptEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComVisible(false)] -[TypeLibType(16)] -public delegate void IACHooksEvents_ChatTextInterceptEventHandler([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In] int lColor, [In] int lTarget, [In][Out] ref bool bEat); diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_ContainerOpenedEventHandler.cs b/Unused/Decal.Interop.Core/IACHooksEvents_ContainerOpenedEventHandler.cs deleted file mode 100644 index f8ade23..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_ContainerOpenedEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComVisible(false)] -[TypeLibType(16)] -public delegate void IACHooksEvents_ContainerOpenedEventHandler([In] int lGUID); diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_Event.cs b/Unused/Decal.Interop.Core/IACHooksEvents_Event.cs deleted file mode 100644 index ba37c71..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_Event.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[TypeLibType(16)] -[ComVisible(false)] -[ComEventInterface(typeof(IACHooksEvents_0000), typeof(IACHooksEvents_EventProvider_0000))] -public interface IACHooksEvents_Event -{ - event IACHooksEvents_ObjectDestroyedEventHandler ObjectDestroyed; - - event IACHooksEvents_ChatTextInterceptEventHandler ChatTextIntercept; - - event IACHooksEvents_ChatParserInterceptEventHandler ChatParserIntercept; - - event IACHooksEvents_StatusTextInterceptEventHandler StatusTextIntercept; - - event IACHooksEvents_ObjectSelectedEventHandler ObjectSelected; - - event IACHooksEvents_MessageProcessedEventHandler MessageProcessed; - - event IACHooksEvents_AC3DRegionChangedEventHandler AC3DRegionChanged; - - event IACHooksEvents_ContainerOpenedEventHandler ContainerOpened; - - event IACHooksEvents_ChatClickInterceptEventHandler ChatClickIntercept; - - event IACHooksEvents_RenderPreUIEventHandler RenderPreUI; -} diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_EventProvider.cs b/Unused/Decal.Interop.Core/IACHooksEvents_EventProvider.cs deleted file mode 100644 index 09cd650..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_EventProvider.cs +++ /dev/null @@ -1,778 +0,0 @@ -using System; -using System.Collections; -using System.Runtime.InteropServices; -using System.Runtime.InteropServices.ComTypes; -using System.Threading; - -namespace Decal.Interop.Core; - -internal sealed class IACHooksEvents_EventProvider : IACHooksEvents_Event, IDisposable -{ - private IConnectionPointContainer m_ConnectionPointContainer; - - private ArrayList m_aEventSinkHelpers; - - private IConnectionPoint m_ConnectionPoint; - - private void Init() - { - IConnectionPoint ppCP = null; - Guid riid = new Guid(new byte[16] - { - 229, 47, 40, 235, 112, 113, 55, 74, 162, 110, - 146, 175, 54, 56, 93, 44 - }); - m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); - m_ConnectionPoint = ppCP; - m_aEventSinkHelpers = new ArrayList(); - } - - public void add_ObjectDestroyed(IACHooksEvents_ObjectDestroyedEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); - iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; - iACHooksEvents_SinkHelper.m_ObjectDestroyedDelegate = P_0; - m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_ObjectDestroyed(IACHooksEvents_ObjectDestroyedEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (iACHooksEvents_SinkHelper.m_ObjectDestroyedDelegate != null && ((iACHooksEvents_SinkHelper.m_ObjectDestroyedDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void add_ChatTextIntercept(IACHooksEvents_ChatTextInterceptEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); - iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; - iACHooksEvents_SinkHelper.m_ChatTextInterceptDelegate = P_0; - m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_ChatTextIntercept(IACHooksEvents_ChatTextInterceptEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (iACHooksEvents_SinkHelper.m_ChatTextInterceptDelegate != null && ((iACHooksEvents_SinkHelper.m_ChatTextInterceptDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void add_ChatParserIntercept(IACHooksEvents_ChatParserInterceptEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); - iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; - iACHooksEvents_SinkHelper.m_ChatParserInterceptDelegate = P_0; - m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_ChatParserIntercept(IACHooksEvents_ChatParserInterceptEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (iACHooksEvents_SinkHelper.m_ChatParserInterceptDelegate != null && ((iACHooksEvents_SinkHelper.m_ChatParserInterceptDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void add_StatusTextIntercept(IACHooksEvents_StatusTextInterceptEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); - iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; - iACHooksEvents_SinkHelper.m_StatusTextInterceptDelegate = P_0; - m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_StatusTextIntercept(IACHooksEvents_StatusTextInterceptEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (iACHooksEvents_SinkHelper.m_StatusTextInterceptDelegate != null && ((iACHooksEvents_SinkHelper.m_StatusTextInterceptDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void add_ObjectSelected(IACHooksEvents_ObjectSelectedEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); - iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; - iACHooksEvents_SinkHelper.m_ObjectSelectedDelegate = P_0; - m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_ObjectSelected(IACHooksEvents_ObjectSelectedEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (iACHooksEvents_SinkHelper.m_ObjectSelectedDelegate != null && ((iACHooksEvents_SinkHelper.m_ObjectSelectedDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void add_MessageProcessed(IACHooksEvents_MessageProcessedEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); - iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; - iACHooksEvents_SinkHelper.m_MessageProcessedDelegate = P_0; - m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_MessageProcessed(IACHooksEvents_MessageProcessedEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (iACHooksEvents_SinkHelper.m_MessageProcessedDelegate != null && ((iACHooksEvents_SinkHelper.m_MessageProcessedDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void add_AC3DRegionChanged(IACHooksEvents_AC3DRegionChangedEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); - iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; - iACHooksEvents_SinkHelper.m_AC3DRegionChangedDelegate = P_0; - m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_AC3DRegionChanged(IACHooksEvents_AC3DRegionChangedEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (iACHooksEvents_SinkHelper.m_AC3DRegionChangedDelegate != null && ((iACHooksEvents_SinkHelper.m_AC3DRegionChangedDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void add_ContainerOpened(IACHooksEvents_ContainerOpenedEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); - iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; - iACHooksEvents_SinkHelper.m_ContainerOpenedDelegate = P_0; - m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_ContainerOpened(IACHooksEvents_ContainerOpenedEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (iACHooksEvents_SinkHelper.m_ContainerOpenedDelegate != null && ((iACHooksEvents_SinkHelper.m_ContainerOpenedDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void add_ChatClickIntercept(IACHooksEvents_ChatClickInterceptEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); - iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; - iACHooksEvents_SinkHelper.m_ChatClickInterceptDelegate = P_0; - m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_ChatClickIntercept(IACHooksEvents_ChatClickInterceptEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (iACHooksEvents_SinkHelper.m_ChatClickInterceptDelegate != null && ((iACHooksEvents_SinkHelper.m_ChatClickInterceptDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void add_RenderPreUI(IACHooksEvents_RenderPreUIEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); - iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; - iACHooksEvents_SinkHelper.m_RenderPreUIDelegate = P_0; - m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_RenderPreUI(IACHooksEvents_RenderPreUIEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (iACHooksEvents_SinkHelper.m_RenderPreUIDelegate != null && ((iACHooksEvents_SinkHelper.m_RenderPreUIDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public IACHooksEvents_EventProvider(object P_0) - { - //Error decoding local variables: Signature type sequence must have at least one element. - m_ConnectionPointContainer = (IConnectionPointContainer)P_0; - } - - public void Finalize() - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 < count) - { - do - { - IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; - m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); - num++; - } - while (num < count); - } - Marshal.ReleaseComObject(m_ConnectionPoint); - } - catch (Exception) - { - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void Dispose() - { - //Error decoding local variables: Signature type sequence must have at least one element. - Finalize(); - GC.SuppressFinalize(this); - } -} diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_MessageProcessedEventHandler.cs b/Unused/Decal.Interop.Core/IACHooksEvents_MessageProcessedEventHandler.cs deleted file mode 100644 index f86de75..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_MessageProcessedEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComVisible(false)] -[TypeLibType(16)] -public delegate void IACHooksEvents_MessageProcessedEventHandler([In] int pbData, [In] int dwSize); diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_ObjectDestroyedEventHandler.cs b/Unused/Decal.Interop.Core/IACHooksEvents_ObjectDestroyedEventHandler.cs deleted file mode 100644 index 6074c65..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_ObjectDestroyedEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[TypeLibType(16)] -[ComVisible(false)] -public delegate void IACHooksEvents_ObjectDestroyedEventHandler([In] int lGUID); diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_ObjectSelectedEventHandler.cs b/Unused/Decal.Interop.Core/IACHooksEvents_ObjectSelectedEventHandler.cs deleted file mode 100644 index b92dcc9..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_ObjectSelectedEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComVisible(false)] -[TypeLibType(16)] -public delegate void IACHooksEvents_ObjectSelectedEventHandler([In] int lGUID); diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_RenderPreUIEventHandler.cs b/Unused/Decal.Interop.Core/IACHooksEvents_RenderPreUIEventHandler.cs deleted file mode 100644 index 2358371..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_RenderPreUIEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[TypeLibType(16)] -[ComVisible(false)] -public delegate void IACHooksEvents_RenderPreUIEventHandler(); diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_SinkHelper.cs b/Unused/Decal.Interop.Core/IACHooksEvents_SinkHelper.cs deleted file mode 100644 index 0c978e8..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_SinkHelper.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[TypeLibType(TypeLibTypeFlags.FHidden)] -[ClassInterface(ClassInterfaceType.None)] -public sealed class IACHooksEvents_SinkHelper : IACHooksEvents -{ - public IACHooksEvents_ObjectDestroyedEventHandler m_ObjectDestroyedDelegate; - - public IACHooksEvents_ChatTextInterceptEventHandler m_ChatTextInterceptDelegate; - - public IACHooksEvents_ChatParserInterceptEventHandler m_ChatParserInterceptDelegate; - - public IACHooksEvents_StatusTextInterceptEventHandler m_StatusTextInterceptDelegate; - - public IACHooksEvents_ObjectSelectedEventHandler m_ObjectSelectedDelegate; - - public IACHooksEvents_MessageProcessedEventHandler m_MessageProcessedDelegate; - - public IACHooksEvents_AC3DRegionChangedEventHandler m_AC3DRegionChangedDelegate; - - public IACHooksEvents_ContainerOpenedEventHandler m_ContainerOpenedDelegate; - - public IACHooksEvents_ChatClickInterceptEventHandler m_ChatClickInterceptDelegate; - - public IACHooksEvents_RenderPreUIEventHandler m_RenderPreUIDelegate; - - public int m_dwCookie; - - public void ObjectDestroyed(int P_0) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_ObjectDestroyedDelegate != null) - { - m_ObjectDestroyedDelegate(P_0); - } - } - - public void ChatTextIntercept(string P_0, int P_1, int P_2, ref bool P_3) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_ChatTextInterceptDelegate != null) - { - m_ChatTextInterceptDelegate(P_0, P_1, P_2, ref P_3); - } - } - - public void ChatParserIntercept(string P_0, ref bool P_1) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_ChatParserInterceptDelegate != null) - { - m_ChatParserInterceptDelegate(P_0, ref P_1); - } - } - - public void StatusTextIntercept(string P_0, ref bool P_1) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_StatusTextInterceptDelegate != null) - { - m_StatusTextInterceptDelegate(P_0, ref P_1); - } - } - - public void ObjectSelected(int P_0) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_ObjectSelectedDelegate != null) - { - m_ObjectSelectedDelegate(P_0); - } - } - - public void MessageProcessed(int P_0, int P_1) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_MessageProcessedDelegate != null) - { - m_MessageProcessedDelegate(P_0, P_1); - } - } - - public void AC3DRegionChanged(int P_0, int P_1, int P_2, int P_3) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_AC3DRegionChangedDelegate != null) - { - m_AC3DRegionChangedDelegate(P_0, P_1, P_2, P_3); - } - } - - public void ContainerOpened(int P_0) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_ContainerOpenedDelegate != null) - { - m_ContainerOpenedDelegate(P_0); - } - } - - public void ChatClickIntercept(string P_0, int P_1, ref bool P_2) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_ChatClickInterceptDelegate != null) - { - m_ChatClickInterceptDelegate(P_0, P_1, ref P_2); - } - } - - public void RenderPreUI() - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_RenderPreUIDelegate != null) - { - m_RenderPreUIDelegate(); - } - } - - internal IACHooksEvents_SinkHelper() - { - //Error decoding local variables: Signature type sequence must have at least one element. - m_dwCookie = 0; - m_ObjectDestroyedDelegate = null; - m_ChatTextInterceptDelegate = null; - m_ChatParserInterceptDelegate = null; - m_StatusTextInterceptDelegate = null; - m_ObjectSelectedDelegate = null; - m_MessageProcessedDelegate = null; - m_AC3DRegionChangedDelegate = null; - m_ContainerOpenedDelegate = null; - m_ChatClickInterceptDelegate = null; - m_RenderPreUIDelegate = null; - } -} diff --git a/Unused/Decal.Interop.Core/IACHooksEvents_StatusTextInterceptEventHandler.cs b/Unused/Decal.Interop.Core/IACHooksEvents_StatusTextInterceptEventHandler.cs deleted file mode 100644 index b7892a7..0000000 --- a/Unused/Decal.Interop.Core/IACHooksEvents_StatusTextInterceptEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[TypeLibType(16)] -[ComVisible(false)] -public delegate void IACHooksEvents_StatusTextInterceptEventHandler([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In][Out] ref bool bEat); diff --git a/Unused/Decal.Interop.Core/IDecalCore.cs b/Unused/Decal.Interop.Core/IDecalCore.cs deleted file mode 100644 index 9119350..0000000 --- a/Unused/Decal.Interop.Core/IDecalCore.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[TypeLibType(256)] -[SuppressUnmanagedCodeSecurity] -[InterfaceType(1)] -[Guid("A38715BB-91E7-4C66-95F9-363096F29760")] -public interface IDecalCore -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void InitGraphics([MarshalAs(UnmanagedType.IUnknown)] object pD3DDevice); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - object GetD3DDevice(ref Guid riid); - - [DispId(1610678274)] - int HWND - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - set; - } - - [DispId(1610678276)] - bool Focus - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void SendWM(int HWND, short uMsg, int wParam, int lParam, ref bool pbEat); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void GetScreenSize(out int pWidth, out int pHeight); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - string MapPath([MarshalAs(UnmanagedType.BStr)] string pPath); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void StartPlugins(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void StopPlugins(); - - [DispId(1610678282)] - object Object - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void StartServices(); - - [DispId(1610678284)] - DecalEnum Configuration - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.Interface)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void StopServices(); - - [DispId(1610678286)] - object Plugin - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - get; - } - - [DispId(1610678287)] - object Service - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Render2D(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Render3D(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void PreReset(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void PostReset(); - - [DispId(1610678292)] - ACHooks Hooks - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.Interface)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void StartFilters(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void StopFilters(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - bool KillBitCheckByGUID([In][MarshalAs(UnmanagedType.BStr)] string bstrGuid, [MarshalAs(UnmanagedType.BStr)] string bstrVersion); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - bool KillBitCheckByProgID([In][MarshalAs(UnmanagedType.BStr)] string bstProgID, [MarshalAs(UnmanagedType.BStr)] string bstrVersion); - - [DispId(1610678297)] - bool PluginsRunning - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } -} diff --git a/Unused/Decal.Interop.Core/IDecalDirectory.cs b/Unused/Decal.Interop.Core/IDecalDirectory.cs deleted file mode 100644 index fe9d7fa..0000000 --- a/Unused/Decal.Interop.Core/IDecalDirectory.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("5DBD2180-4B88-440E-9706-E6159A39D014")] -[SuppressUnmanagedCodeSecurity] -[InterfaceType(1)] -public interface IDecalDirectory -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - object Lookup([MarshalAs(UnmanagedType.BStr)] string strName); -} diff --git a/Unused/Decal.Interop.Core/IDecalEnum.cs b/Unused/Decal.Interop.Core/IDecalEnum.cs deleted file mode 100644 index de2a310..0000000 --- a/Unused/Decal.Interop.Core/IDecalEnum.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("FFA32A7A-EFAF-484A-B358-8802DBBAB0EC")] -[SuppressUnmanagedCodeSecurity] -[InterfaceType(1)] -public interface IDecalEnum -{ - [DispId(1610678272)] - string FriendlyName - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [DispId(1610678273)] - Guid ComClass - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [DispId(1610678274)] - bool Enabled - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [param: In] - set; - } - - [DispId(1610678276)] - bool Restricted - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - object CreateInstance(ref Guid riid); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Next(); - - [DispId(1610678279)] - Guid SurrogateClass - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [DispId(1610678280)] - string ResourcePath - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [DispId(1610678281)] - object Property - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.Struct)] - get; - } - - [DispId(1610678282)] - string Group - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Skip([In] ref Guid clsid); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void MoveBefore(ref Guid clsidBefore); - - [DispId(1610678285)] - string Version - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [DispId(1610678286)] - bool FileExists - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [DispId(1610678287)] - string FilePath - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } -} diff --git a/Unused/Decal.Interop.Core/IDecalEvents.cs b/Unused/Decal.Interop.Core/IDecalEvents.cs deleted file mode 100644 index ab263b8..0000000 --- a/Unused/Decal.Interop.Core/IDecalEvents.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[TypeLibType(4096)] -[SuppressUnmanagedCodeSecurity] -[InterfaceType(2)] -[Guid("A362F526-8203-4A77-9E37-361130924D28")] -public interface IDecalEvents -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(1)] - void InitializeComplete([In] eDecalComponentType Type); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [DispId(2)] - void TerminateComplete([In] eDecalComponentType Type); -} diff --git a/Unused/Decal.Interop.Core/IDecalEvents_Event.cs b/Unused/Decal.Interop.Core/IDecalEvents_Event.cs deleted file mode 100644 index 7156957..0000000 --- a/Unused/Decal.Interop.Core/IDecalEvents_Event.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComVisible(false)] -[TypeLibType(16)] -[ComEventInterface(typeof(IDecalEvents_0000), typeof(IDecalEvents_EventProvider_0000))] -public interface IDecalEvents_Event -{ - event IDecalEvents_InitializeCompleteEventHandler InitializeComplete; - - event IDecalEvents_TerminateCompleteEventHandler TerminateComplete; -} diff --git a/Unused/Decal.Interop.Core/IDecalEvents_EventProvider.cs b/Unused/Decal.Interop.Core/IDecalEvents_EventProvider.cs deleted file mode 100644 index 10e71e9..0000000 --- a/Unused/Decal.Interop.Core/IDecalEvents_EventProvider.cs +++ /dev/null @@ -1,218 +0,0 @@ -using System; -using System.Collections; -using System.Runtime.InteropServices; -using System.Runtime.InteropServices.ComTypes; -using System.Threading; - -namespace Decal.Interop.Core; - -internal sealed class IDecalEvents_EventProvider : IDecalEvents_Event, IDisposable -{ - private IConnectionPointContainer m_ConnectionPointContainer; - - private ArrayList m_aEventSinkHelpers; - - private IConnectionPoint m_ConnectionPoint; - - private void Init() - { - IConnectionPoint ppCP = null; - Guid riid = new Guid(new byte[16] - { - 38, 245, 98, 163, 3, 130, 119, 74, 158, 55, - 54, 17, 48, 146, 77, 40 - }); - m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); - m_ConnectionPoint = ppCP; - m_aEventSinkHelpers = new ArrayList(); - } - - public void add_InitializeComplete(IDecalEvents_InitializeCompleteEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IDecalEvents_SinkHelper decalEvents_SinkHelper = new IDecalEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(decalEvents_SinkHelper, out pdwCookie); - decalEvents_SinkHelper.m_dwCookie = pdwCookie; - decalEvents_SinkHelper.m_InitializeCompleteDelegate = P_0; - m_aEventSinkHelpers.Add(decalEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_InitializeComplete(IDecalEvents_InitializeCompleteEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IDecalEvents_SinkHelper decalEvents_SinkHelper = (IDecalEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (decalEvents_SinkHelper.m_InitializeCompleteDelegate != null && ((decalEvents_SinkHelper.m_InitializeCompleteDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(decalEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void add_TerminateComplete(IDecalEvents_TerminateCompleteEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - Init(); - } - IDecalEvents_SinkHelper decalEvents_SinkHelper = new IDecalEvents_SinkHelper(); - int pdwCookie = 0; - m_ConnectionPoint.Advise(decalEvents_SinkHelper, out pdwCookie); - decalEvents_SinkHelper.m_dwCookie = pdwCookie; - decalEvents_SinkHelper.m_TerminateCompleteDelegate = P_0; - m_aEventSinkHelpers.Add(decalEvents_SinkHelper); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void remove_TerminateComplete(IDecalEvents_TerminateCompleteEventHandler P_0) - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_aEventSinkHelpers == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 >= count) - { - return; - } - do - { - IDecalEvents_SinkHelper decalEvents_SinkHelper = (IDecalEvents_SinkHelper)m_aEventSinkHelpers[num]; - if (decalEvents_SinkHelper.m_TerminateCompleteDelegate != null && ((decalEvents_SinkHelper.m_TerminateCompleteDelegate.Equals(P_0) ? 1u : 0u) & 0xFFu) != 0) - { - m_aEventSinkHelpers.RemoveAt(num); - m_ConnectionPoint.Unadvise(decalEvents_SinkHelper.m_dwCookie); - if (count <= 1) - { - Marshal.ReleaseComObject(m_ConnectionPoint); - m_ConnectionPoint = null; - m_aEventSinkHelpers = null; - } - break; - } - num++; - } - while (num < count); - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public IDecalEvents_EventProvider(object P_0) - { - //Error decoding local variables: Signature type sequence must have at least one element. - m_ConnectionPointContainer = (IConnectionPointContainer)P_0; - } - - public void Finalize() - { - bool lockTaken = default(bool); - try - { - Monitor.Enter(this, ref lockTaken); - if (m_ConnectionPoint == null) - { - return; - } - int count = m_aEventSinkHelpers.Count; - int num = 0; - if (0 < count) - { - do - { - IDecalEvents_SinkHelper decalEvents_SinkHelper = (IDecalEvents_SinkHelper)m_aEventSinkHelpers[num]; - m_ConnectionPoint.Unadvise(decalEvents_SinkHelper.m_dwCookie); - num++; - } - while (num < count); - } - Marshal.ReleaseComObject(m_ConnectionPoint); - } - catch (Exception) - { - } - finally - { - if (lockTaken) - { - Monitor.Exit(this); - } - } - } - - public void Dispose() - { - //Error decoding local variables: Signature type sequence must have at least one element. - Finalize(); - GC.SuppressFinalize(this); - } -} diff --git a/Unused/Decal.Interop.Core/IDecalEvents_InitializeCompleteEventHandler.cs b/Unused/Decal.Interop.Core/IDecalEvents_InitializeCompleteEventHandler.cs deleted file mode 100644 index 23b2d22..0000000 --- a/Unused/Decal.Interop.Core/IDecalEvents_InitializeCompleteEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[TypeLibType(16)] -[ComVisible(false)] -public delegate void IDecalEvents_InitializeCompleteEventHandler([In] eDecalComponentType Type); diff --git a/Unused/Decal.Interop.Core/IDecalEvents_SinkHelper.cs b/Unused/Decal.Interop.Core/IDecalEvents_SinkHelper.cs deleted file mode 100644 index 7005988..0000000 --- a/Unused/Decal.Interop.Core/IDecalEvents_SinkHelper.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[TypeLibType(TypeLibTypeFlags.FHidden)] -[ClassInterface(ClassInterfaceType.None)] -public sealed class IDecalEvents_SinkHelper : IDecalEvents -{ - public IDecalEvents_InitializeCompleteEventHandler m_InitializeCompleteDelegate; - - public IDecalEvents_TerminateCompleteEventHandler m_TerminateCompleteDelegate; - - public int m_dwCookie; - - public void InitializeComplete(eDecalComponentType P_0) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_InitializeCompleteDelegate != null) - { - m_InitializeCompleteDelegate(P_0); - } - } - - public void TerminateComplete(eDecalComponentType P_0) - { - //Error decoding local variables: Signature type sequence must have at least one element. - if (m_TerminateCompleteDelegate != null) - { - m_TerminateCompleteDelegate(P_0); - } - } - - internal IDecalEvents_SinkHelper() - { - //Error decoding local variables: Signature type sequence must have at least one element. - m_dwCookie = 0; - m_InitializeCompleteDelegate = null; - m_TerminateCompleteDelegate = null; - } -} diff --git a/Unused/Decal.Interop.Core/IDecalEvents_TerminateCompleteEventHandler.cs b/Unused/Decal.Interop.Core/IDecalEvents_TerminateCompleteEventHandler.cs deleted file mode 100644 index 96d54c5..0000000 --- a/Unused/Decal.Interop.Core/IDecalEvents_TerminateCompleteEventHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComVisible(false)] -[TypeLibType(16)] -public delegate void IDecalEvents_TerminateCompleteEventHandler([In] eDecalComponentType Type); diff --git a/Unused/Decal.Interop.Core/IDecalFileSurrogate.cs b/Unused/Decal.Interop.Core/IDecalFileSurrogate.cs deleted file mode 100644 index 1648756..0000000 --- a/Unused/Decal.Interop.Core/IDecalFileSurrogate.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[InterfaceType(1)] -[SuppressUnmanagedCodeSecurity] -[Guid("E182005F-6A67-48B5-A50F-464340105330")] -public interface IDecalFileSurrogate -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Register([MarshalAs(UnmanagedType.BStr)] string Filename); - - [DispId(1610678273)] - string Extension - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [DispId(1610678274)] - string Description - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } -} diff --git a/Unused/Decal.Interop.Core/IDecalRender.cs b/Unused/Decal.Interop.Core/IDecalRender.cs deleted file mode 100644 index 9fc4a86..0000000 --- a/Unused/Decal.Interop.Core/IDecalRender.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("B66985FA-8CB0-48E5-A2A9-7B232D609B9C")] -[InterfaceType(1)] -[SuppressUnmanagedCodeSecurity] -public interface IDecalRender -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Render2D(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Render3D(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void PreReset(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void PostReset(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void ChangeHWND(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void ChangeDirectX(); -} diff --git a/Unused/Decal.Interop.Core/IDecalRes.cs b/Unused/Decal.Interop.Core/IDecalRes.cs deleted file mode 100644 index b82a507..0000000 --- a/Unused/Decal.Interop.Core/IDecalRes.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("A074F83A-32AB-46FC-9E4E-7E9DAFCD5D18")] -[TypeLibType(4160)] -[SuppressUnmanagedCodeSecurity] -public interface IDecalRes -{ -} diff --git a/Unused/Decal.Interop.Core/IDecalService.cs b/Unused/Decal.Interop.Core/IDecalService.cs deleted file mode 100644 index 8646fbe..0000000 --- a/Unused/Decal.Interop.Core/IDecalService.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[SuppressUnmanagedCodeSecurity] -[Guid("0F95468D-5071-4E28-A223-D83FDFED99E2")] -[InterfaceType(1)] -public interface IDecalService -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Initialize([MarshalAs(UnmanagedType.Interface)] DecalCore pDecal); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void BeforePlugins(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void AfterPlugins(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Terminate(); -} diff --git a/Unused/Decal.Interop.Core/IDecalSurrogate.cs b/Unused/Decal.Interop.Core/IDecalSurrogate.cs deleted file mode 100644 index ae6424d..0000000 --- a/Unused/Decal.Interop.Core/IDecalSurrogate.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[SuppressUnmanagedCodeSecurity] -[Guid("DA98635C-A312-463B-A746-2CF62AF7413A")] -[InterfaceType(1)] -public interface IDecalSurrogate -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - object CreateInstance([MarshalAs(UnmanagedType.Interface)] DecalEnum pInitData, ref Guid riid); - - [DispId(1610678273)] - string Version - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void SetEnum([MarshalAs(UnmanagedType.Interface)] DecalEnum pInitData); - - [DispId(1610678275)] - bool FileExists - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - get; - } - - [DispId(1610678276)] - string FilePath - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.BStr)] - get; - } -} diff --git a/Unused/Decal.Interop.Core/IDecalUninstall.cs b/Unused/Decal.Interop.Core/IDecalUninstall.cs deleted file mode 100644 index 4e489e5..0000000 --- a/Unused/Decal.Interop.Core/IDecalUninstall.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[SuppressUnmanagedCodeSecurity] -[Guid("6A188D19-EC3D-409D-8190-7975FEEE2081")] -[InterfaceType(1)] -public interface IDecalUninstall -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Prepare([MarshalAs(UnmanagedType.Interface)] DecalEnum pEnum); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Uninstall(); -} diff --git a/Unused/Decal.Interop.Core/IDecalWindowsMessageSink.cs b/Unused/Decal.Interop.Core/IDecalWindowsMessageSink.cs deleted file mode 100644 index 947bc59..0000000 --- a/Unused/Decal.Interop.Core/IDecalWindowsMessageSink.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("49D496B1-A97B-4545-8968-C4DDEBE04526")] -[SuppressUnmanagedCodeSecurity] -[InterfaceType(1)] -public interface IDecalWindowsMessageSink -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - bool WindowMessage(int HWND, short uMsg, int wParam, int lParam); -} diff --git a/Unused/Decal.Interop.Core/IIdentifyFilter.cs b/Unused/Decal.Interop.Core/IIdentifyFilter.cs deleted file mode 100644 index 8da67c3..0000000 --- a/Unused/Decal.Interop.Core/IIdentifyFilter.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[SuppressUnmanagedCodeSecurity] -[InterfaceType(1)] -[Guid("256DF70B-0B87-45E4-96EE-043E2254CC95")] -public interface IIdentifyFilter -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void AddToQueue([In] int lObjectID); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void ShortcircuitID([In] int lObjectID); -} diff --git a/Unused/Decal.Interop.Core/IInjectService.cs b/Unused/Decal.Interop.Core/IInjectService.cs deleted file mode 100644 index 5a6aab2..0000000 --- a/Unused/Decal.Interop.Core/IInjectService.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("47761792-2520-4802-8548-5CA580697614")] -[SuppressUnmanagedCodeSecurity] -[InterfaceType(1)] -public interface IInjectService -{ - [DispId(1)] - object Site - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void InitPlugin([MarshalAs(UnmanagedType.IUnknown)] object pUnk); -} diff --git a/Unused/Decal.Interop.Core/IPlugin2.cs b/Unused/Decal.Interop.Core/IPlugin2.cs deleted file mode 100644 index 3f36555..0000000 --- a/Unused/Decal.Interop.Core/IPlugin2.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("DFFED96D-C0B3-45CC-9B19-A95AFEEDA612")] -[SuppressUnmanagedCodeSecurity] -[InterfaceType(1)] -public interface IPlugin2 -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Initialize([MarshalAs(UnmanagedType.Interface)] PluginSite2 Site); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Terminate(); -} diff --git a/Unused/Decal.Interop.Core/IPluginSite2.cs b/Unused/Decal.Interop.Core/IPluginSite2.cs deleted file mode 100644 index 9182e8b..0000000 --- a/Unused/Decal.Interop.Core/IPluginSite2.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[SuppressUnmanagedCodeSecurity] -[InterfaceType(1)] -[Guid("FF37AF34-3CAE-4235-9D85-6EE6976903D6")] -public interface IPluginSite2 -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void Unload(); - - [DispId(1610678273)] - object Object - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IDispatch)] - get; - } - - [DispId(1610678274)] - DecalCore Decal - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.Interface)] - get; - } - - [DispId(1610678275)] - ACHooks Hooks - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.Interface)] - get; - } - - [DispId(1610678276)] - object PluginSite - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - void RegisterSinks([In][MarshalAs(UnmanagedType.IUnknown)] object pPlugin); -} diff --git a/Unused/Decal.Interop.Core/PluginSite2.cs b/Unused/Decal.Interop.Core/PluginSite2.cs deleted file mode 100644 index 48f09ec..0000000 --- a/Unused/Decal.Interop.Core/PluginSite2.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("FF37AF34-3CAE-4235-9D85-6EE6976903D6")] -[CoClass(typeof(PluginSite2Class))] -public interface PluginSite2 : IPluginSite2 -{ -} diff --git a/Unused/Decal.Interop.Core/PluginSite2Class.cs b/Unused/Decal.Interop.Core/PluginSite2Class.cs deleted file mode 100644 index 2a2427c..0000000 --- a/Unused/Decal.Interop.Core/PluginSite2Class.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[SuppressUnmanagedCodeSecurity] -[ClassInterface(0)] -[Guid("E2284FC7-17E5-4846-ADAB-07953273C5FB")] -public class PluginSite2Class : IPluginSite2, PluginSite2 -{ - [DispId(1610678273)] - public virtual extern object Object - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IDispatch)] - get; - } - - [DispId(1610678274)] - public virtual extern DecalCore Decal - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.Interface)] - get; - } - - [DispId(1610678275)] - public virtual extern ACHooks Hooks - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.Interface)] - get; - } - - [DispId(1610678276)] - public virtual extern object PluginSite - { - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - [return: MarshalAs(UnmanagedType.IUnknown)] - get; - } - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void Unload(); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void RegisterSinks([In][MarshalAs(UnmanagedType.IUnknown)] object pPlugin); -} diff --git a/Unused/Decal.Interop.Core/SurrogateRemove.cs b/Unused/Decal.Interop.Core/SurrogateRemove.cs deleted file mode 100644 index 1b61854..0000000 --- a/Unused/Decal.Interop.Core/SurrogateRemove.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Decal.Interop.Core; - -[ComImport] -[CoClass(typeof(SurrogateRemoveClass))] -[Guid("6A188D19-EC3D-409D-8190-7975FEEE2081")] -public interface SurrogateRemove : IDecalUninstall -{ -} diff --git a/Unused/Decal.Interop.Core/SurrogateRemoveClass.cs b/Unused/Decal.Interop.Core/SurrogateRemoveClass.cs deleted file mode 100644 index 7a7dfe2..0000000 --- a/Unused/Decal.Interop.Core/SurrogateRemoveClass.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[ComImport] -[Guid("144FBF76-E7FB-4B41-AE19-6B5AB0E0A89B")] -[SuppressUnmanagedCodeSecurity] -[ClassInterface(0)] -[TypeLibType(2)] -public class SurrogateRemoveClass : IDecalUninstall, SurrogateRemove -{ - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void Prepare([MarshalAs(UnmanagedType.Interface)] DecalEnum pEnum); - - [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] - public virtual extern void Uninstall(); -} diff --git a/Unused/Decal.Interop.Core/eAttribute.cs b/Unused/Decal.Interop.Core/eAttribute.cs deleted file mode 100644 index 6e97e81..0000000 --- a/Unused/Decal.Interop.Core/eAttribute.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eAttribute -{ - eCurrentStrength = 1, - eCurrentEndurance = 2, - eCurrentQuickness = 3, - eCurrentCoordination = 4, - eCurrentFocus = 5, - eCurrentSelf = 6, - eBaseStrength = 7, - eBaseEndurance = 8, - eBaseQuickness = 9, - eBaseCoordination = 10, - eBaseFocus = 11, - eBaseSelf = 12, - eAttribute_DWORD = int.MaxValue -} diff --git a/Unused/Decal.Interop.Core/eAvailableHooks.cs b/Unused/Decal.Interop.Core/eAvailableHooks.cs deleted file mode 100644 index 10872ba..0000000 --- a/Unused/Decal.Interop.Core/eAvailableHooks.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eAvailableHooks -{ - ePrevSelect = 1, - eCurrentSelect = 2, - eCastSpell = 8, - eMoveItem = 16, - eSelectItem = 32, - eUseItem = 64, - eCombatMode = 128, - eChatState = 256, - eStackCount = 1024, - eMaxStackCount = 2048, - eVendorID = 4096, - eBusyState = 8192, - eBusyStateID = 16384, - ePointerState = 32768, - eMoveItemEx = 65536, - ePosition = 131072, - eFaceHeading = 262144, - eAC3DRegion = 524288, - eObjectDestroyed = 2097152, - eSendTell = 4194304, - eSetAutorun = 8388608, - eSetCombatMode = 33554432, - eGetMiscInt = 67108864, - eGetMiscInt64 = 134217728, - eGetAttribute = 268435456, - eGetSkill = 536870912, - eGetVital = 1073741824, - eHooksAvailEx = int.MinValue -} diff --git a/Unused/Decal.Interop.Core/eAvailableHooksEx.cs b/Unused/Decal.Interop.Core/eAvailableHooksEx.cs deleted file mode 100644 index 4b2d552..0000000 --- a/Unused/Decal.Interop.Core/eAvailableHooksEx.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eAvailableHooksEx -{ - eLogout = 0, - eColorEx = 1, - eSkillInfo = 2, - eAttributeInfo = 3, - eVitalInfo = 4, - eIsValidObject = 5, - eOnSelectItemEvent = 6, - eRequestID = 7, - eIDQueueAdd = 8, - eSendMessageByMask = 9, - eUseItemRaw = 10, - eSetIdleTime = 11, - eGiveItem = 12, - eMoveItemExRaw = 13, - eSpellTabAdd = 14, - eSpellTabDelete = 15, - eTradeAdd = 16, - eTradeAccept = 17, - eTradeDecline = 18, - eTradeReset = 19, - eTradeClose = 20, - eSalvagePanelAdd = 21, - eSalvagePanelSalvage = 22, - eAvailableHooksEx_DWORD = int.MaxValue -} diff --git a/Unused/Decal.Interop.Core/eChatColors.cs b/Unused/Decal.Interop.Core/eChatColors.cs deleted file mode 100644 index 16def6e..0000000 --- a/Unused/Decal.Interop.Core/eChatColors.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eChatColors -{ - SystemGreen, - Green, - White, - BrightYellow, - DullYellow, - Purple, - Red, - DarkBlue, - BrightPeach, - Peach, - BrightYellow2, - DullYellow2, - Grey, - Cyan, - LightBlue, - Red2, - Green2, - DarkBlue2, - Green3, - Green4, - Purple2, - Red3, - LightRed -} diff --git a/Unused/Decal.Interop.Core/eDecalComponentType.cs b/Unused/Decal.Interop.Core/eDecalComponentType.cs deleted file mode 100644 index cfd72b3..0000000 --- a/Unused/Decal.Interop.Core/eDecalComponentType.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eDecalComponentType -{ - ePlugin = 1, - eService = 2, - eNetworkFilter = 3, - eComponentType_DWORD = int.MaxValue -} diff --git a/Unused/Decal.Interop.Core/eInt64Types.cs b/Unused/Decal.Interop.Core/eInt64Types.cs deleted file mode 100644 index 0f2379c..0000000 --- a/Unused/Decal.Interop.Core/eInt64Types.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eInt64Types -{ - eTotalExperience = 1, - eUnassignedExperience = 2, - eInt64Types_DWORD = int.MaxValue -} diff --git a/Unused/Decal.Interop.Core/eIntTypes.cs b/Unused/Decal.Interop.Core/eIntTypes.cs deleted file mode 100644 index 5088183..0000000 --- a/Unused/Decal.Interop.Core/eIntTypes.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eIntTypes -{ - eIntTypes_DWORD = int.MaxValue -} diff --git a/Unused/Decal.Interop.Core/eSkill.cs b/Unused/Decal.Interop.Core/eSkill.cs deleted file mode 100644 index 69e4bc3..0000000 --- a/Unused/Decal.Interop.Core/eSkill.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eSkill -{ - eCurrentMeleeDefense = 6, - eCurrentMissileDefense = 7, - eCurrentArcaneLore = 14, - eCurrentMagicDefense = 15, - eCurrentManaConversion = 16, - eCurrentItemTinkering = 18, - eCurrentAssessPerson = 19, - eCurrentDeception = 20, - eCurrentHealing = 21, - eCurrentJump = 22, - eCurrentLockpick = 23, - eCurrentRun = 24, - eCurrentAssessCreature = 27, - eCurrentWeaponTinkering = 28, - eCurrentArmorTinkering = 29, - eCurrentMagicItemTinkering = 30, - eCurrentCreatureEnchantment = 31, - eCurrentItemEnchantment = 32, - eCurrentLifeMagic = 33, - eCurrentWarMagic = 34, - eCurrentLeadership = 35, - eCurrentLoyalty = 36, - eCurrentFletchingSkill = 37, - eCurrentAlchemySkill = 38, - eCurrentCookingSkill = 39, - eCurrentSkillSalvaging = 40, - eCurrentTwoHandedCombat = 41, - eCurrentGearcraft = 42, - eCurrentVoidMagic = 43, - eCurrentHeavyWeapons = 44, - eCurrentLightWeapons = 45, - eCurrentFinesseWeapons = 46, - eCurrentMissileWeapons = 47, - eCurrentShield = 48, - eCurrentDualWield = 49, - eCurrentRecklessness = 50, - eCurrentSneakAttack = 51, - eCurrentDirtyFighting = 52, - eCurrentSummoning = 54, - eBaseMeleeDefense = 56, - eBaseMissileDefense = 57, - eBaseArcaneLore = 64, - eBaseMagicDefense = 65, - eBaseManaConversion = 66, - eBaseItemTinkering = 68, - eBaseAssessPerson = 69, - eBaseDeception = 70, - eBaseHealing = 71, - eBaseJump = 72, - eBaseLockpick = 73, - eBaseRun = 74, - eBaseAssessCreature = 77, - eBaseWeaponTinkering = 78, - eBaseArmorTinkering = 79, - eBaseMagicItemTinkering = 80, - eBaseCreatureEnchantment = 81, - eBaseItemEnchantment = 82, - eBaseLifeMagic = 83, - eBaseWarMagic = 84, - eBaseLeadership = 85, - eBaseLoyalty = 86, - eBaseFletchingSkill = 87, - eBaseAlchemySkill = 88, - eBaseCookingSkill = 89, - eBaseSkillSalvaging = 90, - eBaseTwoHandedCombat = 91, - eBaseGearcraft = 92, - eBaseVoidMagic = 93, - eBaseHeavyWeapons = 94, - eBaseLightWeapons = 95, - eBaseFinesseWeapons = 96, - eBaseMissileWeapons = 97, - eBaseShield = 98, - eBaseDualWield = 99, - eBaseRecklessness = 100, - eBaseSneakAttack = 101, - eBaseDirtyFighting = 102, - eBaseSummoning = 104, - eSkill_DWORD = int.MaxValue -} diff --git a/Unused/Decal.Interop.Core/eTrainLevel.cs b/Unused/Decal.Interop.Core/eTrainLevel.cs deleted file mode 100644 index 603ce4f..0000000 --- a/Unused/Decal.Interop.Core/eTrainLevel.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eTrainLevel -{ - eUntrained = 1, - eTrained = 2, - eSpecialized = 3, - eTrainLevel_DWORD = int.MaxValue -} diff --git a/Unused/Decal.Interop.Core/eUIElementType.cs b/Unused/Decal.Interop.Core/eUIElementType.cs deleted file mode 100644 index c628c1e..0000000 --- a/Unused/Decal.Interop.Core/eUIElementType.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eUIElementType -{ - Smartbox = 268436634, - Chat = 268436993, - FloatChat1 = 268436741, - FloatChat2 = 268436750, - FloatChat3 = 268436751, - FloatChat4 = 268436752, - Examination = 268436983, - Vitals = 268436986, - EnvPack = 268436989, - Panels = 268436991, - TBar = 268436995, - Indicators = 268437009, - ProgressBar = 268437011, - Combat = 268437173, - Radar = 268437202, - SideBySideVitals = 268437205 -} diff --git a/Unused/Decal.Interop.Core/eVital.cs b/Unused/Decal.Interop.Core/eVital.cs deleted file mode 100644 index d83e63a..0000000 --- a/Unused/Decal.Interop.Core/eVital.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Security; - -namespace Decal.Interop.Core; - -[SuppressUnmanagedCodeSecurity] -public enum eVital -{ - eMaximumHealth = 1, - eCurrentHealth = 2, - eMaximumStamina = 3, - eCurrentStamina = 4, - eMaximumMana = 5, - eCurrentMana = 6, - eBaseHealth = 7, - eBaseStamina = 8, - eBaseMana = 9, - eVital_DWORD = int.MaxValue -} diff --git a/Unused/Decal.Interop.Core/tagRECT.cs b/Unused/Decal.Interop.Core/tagRECT.cs deleted file mode 100644 index 773c5e8..0000000 --- a/Unused/Decal.Interop.Core/tagRECT.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Runtime.InteropServices; -using System.Security; - -namespace Decal.Interop.Core; - -[StructLayout(LayoutKind.Sequential, Pack = 4)] -[SuppressUnmanagedCodeSecurity] -public struct tagRECT -{ - public int left; - - public int top; - - public int right; - - public int bottom; -} diff --git a/mossy.sln b/mossy.sln index 003115a..bb3ea64 100644 --- a/mossy.sln +++ b/mossy.sln @@ -5,10 +5,10 @@ VisualStudioVersion = 17.13.35919.96 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MosswartMassacre", "MosswartMassacre\MosswartMassacre.csproj", "{8C97E839-4D05-4A5F-B0C8-E8E778654322}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MosswartMassacre.Loader", "MosswartMassacre.Loader\MosswartMassacre.Loader.csproj", "{A1B2C3D4-E5F6-7890-1234-567890ABCDEF}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GearCycler", "GearCycler\GearCycler.csproj", "{1293560E-2A56-417F-8116-8CE0420DC97C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -19,10 +19,10 @@ Global {8C97E839-4D05-4A5F-B0C8-E8E778654322}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C97E839-4D05-4A5F-B0C8-E8E778654322}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C97E839-4D05-4A5F-B0C8-E8E778654322}.Release|Any CPU.Build.0 = Release|Any CPU - {A1B2C3D4-E5F6-7890-1234-567890ABCDEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A1B2C3D4-E5F6-7890-1234-567890ABCDEF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A1B2C3D4-E5F6-7890-1234-567890ABCDEF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A1B2C3D4-E5F6-7890-1234-567890ABCDEF}.Release|Any CPU.Build.0 = Release|Any CPU + {1293560E-2A56-417F-8116-8CE0420DC97C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1293560E-2A56-417F-8116-8CE0420DC97C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1293560E-2A56-417F-8116-8CE0420DC97C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1293560E-2A56-417F-8116-8CE0420DC97C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE