using System; using System.Diagnostics; using System.Globalization; using LavishScriptAPI; using MRBot.IsxEq2.AbilityEffect; using MRBot.IsxEq2.CharacterActor; using MRBot.IsxEq2.InventoryConsignment; using MRBot.IsxEq2.UI; using MRBot.IsxEq2.Utility; namespace MRBot.IsxEq2 { /// /// This class is used to access all of the features of ISXEQ2. /// public static class Extension { #region Top Level Objects /// /// Allows interaction with Achievements. Accepts the arguments from EQ2_ExamineAchievment Event. /// /// achievement type /// achievement id /// Achievement public static Achievement Achievement(string type, int id) { Trace.WriteLine(String.Format("Extension:Achievement({0}, {1})", type, id.ToString(CultureInfo.InvariantCulture))); return new Achievement(LavishScript.Objects.GetObject("Achievement", type, id.ToString(CultureInfo.InvariantCulture))); } /// /// Retrieves the actor by id. /// /// actor id /// Actor public static Actor Actor(int id) { Trace.WriteLine(String.Format("Extension:Actor({0})", id.ToString(CultureInfo.InvariantCulture))); return new Actor(LavishScript.Objects.GetObject("Actor", id.ToString(CultureInfo.InvariantCulture))); } /// /// Retrieves the actor by search criteria. /// /// search criteria /// Actor /// /// /// Search Options: /// pc - nearest pc /// npc - nearest npc /// NamedNPC - nearest named npc /// guild, "guild" - nearest actor with that guild tag /// pet - nearest pet that is not your own /// mypet - your pet, or NULL /// tsunit - nearest trade skill unit /// resource - nearest resource node /// nokillnpc - nearest no kill npc /// special - nearest special actor /// corpse - nearest corpse /// me - me as actor /// chest - nearest chest /// door - nearest door /// level, # - nearest actor of that level /// levels, #, # - nearest actor between the two levels given /// id, # - returns the actor with the id given /// notid, # - excludes the actor with the id given /// class, "class" - nearest actor with class given /// race, "race" - nearest actor with race given /// radius, # - nearest actor within the radius given (you are the center) /// radiusr, #, # - nearest actor between the two radii (you are the center) /// xzrange, # - nearest actor within the 2 dimmensional range /// yrange, # - nearest actor within the supplied y range (vertical) /// nopcnear [, #] - nearest actor for which there is no PC within the given radius from it. If no argument is given, then it defaults to a range of 100 /// loc,#,# [,#] - actor at the location provided X, Z, or X, Z, Y if third parameter provided /// "string" - nearest actor with that string in their name /// public static Actor Actor(params string[] search) { Trace.WriteLine(String.Format("Extension:Actor({0})", String.Join(", ", search))); return new Actor(LavishScript.Objects.GetObject("Actor", search)); } /// /// Retrieves a choice window object from the game world. This TLO returns the last choice window opened /// or the only one, if you only have one choice window up. /// (If you have no choice windows up, then it returns NULL) /// public static ChoiceWindow ChoiceWindow { get { Trace.WriteLine(String.Format("Extension:ChoiceWindow")); return new ChoiceWindow(LavishScript.Objects.GetObject("ChoiceWindow")); } } /// /// Retrieves the actor from the CustomActorArray by id. /// /// actor id /// Actor public static Actor CustomActor(int id) { Trace.WriteLine(String.Format("Extension:CustomActor({0})", id.ToString(CultureInfo.InvariantCulture))); return new Actor(LavishScript.Objects.GetObject("CustomActor", id.ToString(CultureInfo.InvariantCulture))); } /// /// Retrieves the actor from the CustomActorArray by search criteria. /// /// search criteria /// Actor /// /// /// Search Options: /// pc - nearest pc /// npc - nearest npc /// NamedNPC - nearest named npc /// guild, "guild" - nearest actor with that guild tag /// pet - nearest pet that is not your own /// mypet - your pet, or NULL /// tsunit - nearest trade skill unit /// resource - nearest resource node /// nokillnpc - nearest no kill npc /// special - nearest special actor /// corpse - nearest corpse /// me - me as actor /// chest - nearest chest /// door - nearest door /// level, # - nearest actor of that level /// levels, #, # - nearest actor between the two levels given /// id, # - returns the actor with the id given /// notid, # - excludes the actor with the id given /// class, "class" - nearest actor with class given /// race, "race" - nearest actor with race given /// radius, # - nearest actor within the radius given (you are the center) /// radiusr, #, # - nearest actor between the two radii (you are the center) /// xzrange, # - nearest actor within the 2 dimmensional range /// yrange, # - nearest actor within the supplied y range (vertical) /// nopcnear [, #] - nearest actor for which there is no PC within the given radius from it. If no argument is given, then it defaults to a range of 100 /// loc,#,# [,#] - actor at the location provided X, Z, or X, Z, Y if third parameter provided /// "string" - nearest actor with that string in their name /// public static Actor CustomActor(params string[] search) { Trace.WriteLine(String.Format("Extension:CustomActor({0})", String.Join(", ", search))); return new Actor(LavishScript.Objects.GetObject("CustomActor", search)); } /// /// Retrieves information that does not fit into any other datatype. /// public static Utility.EQ2 EQ2 { get { Trace.WriteLine(String.Format("Extension:EQ2")); return new Utility.EQ2(LavishScript.Objects.GetObject("EQ2")); } } /// /// Returns an EQ2UIElement of type DataSourceContainer from the xml file named. /// /// top level parent of xml file public static EQ2Widget EQ2DataSourceContainer(string parent) { Trace.WriteLine(String.Format("Extension:EQ2DataSourceContainer({0})", parent)); return new EQ2Widget(LavishScript.Objects.GetObject("EQ2DataSourceContainer", parent)); } /// /// Returns the EQ2Location from the saved list of locations at the specified index /// in the current zone (1 to ISXEQ2.EQ2LocsCount()) or all zones (1 to ISXEQ2.EQ2LocsCount(true)). /// /// index /// include all zones public static EQ2Location EQ2Loc(int index, bool allZones = false) { Trace.WriteLine(String.Format("Extension:EQ2Location({0}, {1})", index.ToString(CultureInfo.InvariantCulture), allZones.ToString())); return !allZones ? new EQ2Location(LavishScript.Objects.GetObject("EQ2Loc", index.ToString(CultureInfo.InvariantCulture))) : new EQ2Location(LavishScript.Objects.GetObject("EQ2Loc", index.ToString(CultureInfo.InvariantCulture), "AllZones")); } /// /// Returns the EQ2Location that matches the supplied label in the current zone or all zones. /// /// label /// include all zones public static EQ2Location EQLoc(string label, bool allZones = false) { Trace.WriteLine(String.Format("Extension:EQ2Location({0}, {1})", label, allZones.ToString())); return !allZones ? new EQ2Location(LavishScript.Objects.GetObject("EQ2Loc",label)) : new EQ2Location(LavishScript.Objects.GetObject("EQ2Loc", label, "AllZones")); } /// /// Returns the email at the specified index. (1 to EQ2.InboxMailCount) /// Allows interaction with the mail subsystem in EverQuest2. /// For this TLO to function, you must be in a 'mail transaction' at a post office/box. /// /// index public static EQ2Mail EQ2Mail(int index) { Trace.WriteLine(String.Format("Extension:EQ2Mail({0})", index.ToString(CultureInfo.InvariantCulture))); return new EQ2Mail(LavishScript.Objects.GetObject("EQ2Mail", index.ToString(CultureInfo.InvariantCulture))); } /// /// Returns the EQ2Mail object of the specified status (Opened or Composing) /// Allows interaction with the mail subsystem in EverQuest2. /// For this TLO to function, you must be in a 'mail transaction' at a post office/box. /// /// mail status public static EQ2Mail EQ2Mail(EQ2MailStatus status) { Trace.WriteLine(String.Format("Extension:EQ2Mail({0})", status)); return new EQ2Mail(LavishScript.Objects.GetObject("EQ2Mail", status.ToString().ToLower())); } /// /// Returns the EQ2Window that matches the parent and page names provided. /// /// parent name /// page name /// /// This data member takes two arguments. The first argument is the top level /// parent 'page' name from the xml file to which the UIPage's configuration /// is saved (this is usually the second part of the xml filename..see below for /// explanation). The second argument could be any of the top level 'Page' names /// found embedded under the first argument 'page' name. I know that sounds /// complicated, but see below for a couple of examples that should make this /// more clear to you. /// First of all, all of the information you need is located in your EQ2 UI /// subdirectory and contains the extension .xml. (ie, eq2ui_inventory_market.xml). /// All of the files that correspond to this TLO begin with the phrase 'eq2ui_'. /// Then, the second word in the file name will always be the ParentPageName /// (in this case, 'inventory'), and then the third word in the file name will /// typically be your second argument (or PageName. If a file only has two parts /// (ie, eq2ui_proxyactor.xml). Then "ProxyActor" would be your ParentPageName /// and then you would need to look inside the file to find your second argument. public static EQ2Window EQ2UIPage(string parent, string page) { Trace.WriteLine(String.Format("Extension:EQ2UIPage({0}, {1})", parent, page)); return new EQ2Window(LavishScript.Objects.GetObject("EQ2UIPage", parent, page)); } /// /// Returns information about the examine item window with the specified ID /// (retrieved via the EQ2_ExamineItemWindowAppeared event) /// /// Window ID public static ExamineItemWindow ExamineItemWindow(int windowID) { Trace.WriteLine(String.Format("Extension:ExamineItemWindow({0})", windowID.ToString(CultureInfo.InvariantCulture))); return new ExamineItemWindow(LavishScript.Objects.GetObject("ExamineItemWindow", windowID.ToString(CultureInfo.InvariantCulture))); } /// /// Retrieves information about ISXEQ2 /// public static Utility.ISXEQ2 ISXEQ2 { get { Trace.WriteLine(String.Format("Extension:ISXEQ2")); return new Utility.ISXEQ2(LavishScript.Objects.GetObject("ISXEQ2")); } } /// /// Returns the last loot window opened (or the only one, if you only have one loot window up), /// or the loot window that corresponds with a specific ID as supplied by the EQ2_onLootWindowAppeared event. /// (If you have no loot windows up, then it returns NULL) /// /// window id public static LootWindow LootWindow(int windowID = 0) { Trace.WriteLine((windowID == 0) ? String.Format("Extension:LootWindow()") : String.Format("Extension:LootWindow({0})", windowID.ToString(CultureInfo.InvariantCulture))); return windowID == 0 ? new LootWindow(LavishScript.Objects.GetObject("LootWindow")) : new LootWindow(LavishScript.Objects.GetObject("LootWindow", windowID.ToString(CultureInfo.InvariantCulture))); } /// /// Retrieves the player character /// public static Character Me { get { Trace.WriteLine(String.Format("Extension:Me")); return new Character(LavishScript.Objects.GetObject("Me")); } } /// /// Retrieves the radar at the specified index. If no index is provided, it returns the first/only /// radar in the array. /// /// index public static Radar Radar(int index = 0) { Trace.WriteLine((index == 0) ? String.Format("Extension:Radar()") : String.Format("Extension:Radar({0})", index.ToString(CultureInfo.InvariantCulture))); return index == 0 ? new Radar(LavishScript.Objects.GetObject("Radar")) : new Radar(LavishScript.Objects.GetObject("Radar", index.ToString(CultureInfo.InvariantCulture))); } /// /// Retrieves the radar that matches the supplied name. /// /// name public static Radar Radar(string name) { Trace.WriteLine(String.Format("Extension:Radar({0}", name)); return new Radar(LavishScript.Objects.GetObject("Radar", name)); } /// /// Retrieves the ReplyDialog with the supplied ID (from EQ2_ReplyDialogAppeared) or /// the last ReplyDialog if not ID is provided. /// /// window ID public static ReplyDialog ReplyDialog(int windowID = 0) { Trace.WriteLine((windowID == 0) ? String.Format("Extension:ReplyDialog()") : String.Format("Extension:ReplyDialog({0})", windowID.ToString(CultureInfo.InvariantCulture))); return windowID == 0 ? new ReplyDialog(LavishScript.Objects.GetObject("ReplyDialog")) : new ReplyDialog(LavishScript.Objects.GetObject("ReplyDialog", windowID.ToString(CultureInfo.InvariantCulture))); } /// /// Returns a rewardwindow datatype object representing any reward window that may be open. /// /// /// NOTES: /// if ${RewardWindow} is NULL, then you do not have a pending quest reward. /// Using any other button besides 'Receive' when you have a reward item waiting, is not advised. /// At the moment, this supports only receiving rewards when there is no 'choice' to be made. That may be added in the future. /// public static RewardWindow RewardWindow { get { Trace.WriteLine(String.Format("Extension:RewardWindow")); return new RewardWindow(LavishScript.Objects.GetObject("RewardWindow")); } } /// /// Strips the EQ2 hyperlink-type tags from a string. /// /// text public static string StripTags(string rawText) { Trace.WriteLine(String.Format("Extension:StripTags({0})", rawText)); return LavishScript.Objects.GetObject("StripTags", rawText); } /// /// Retrieves the active target object /// public static Actor Target() { Trace.WriteLine(String.Format("Extension:Target")); return new Actor(LavishScript.Objects.GetObject("Target")); } /// /// Retrieves a vendor object from the game world. For the /// purposes of ISXEQ2, a vendor is defined as any NPC or /// PC that can buy or sell items. This includes brokers. /// For this TLO to function, you must have the vendor /// targetted and the merchant or broker window open and /// populated. /// public static Vendor Vendor { get { Trace.WriteLine(String.Format("Extension:Vendor")); return new Vendor(LavishScript.Objects.GetObject("Vendor")); } } /// /// Retrieves information about the current zone. /// public static Zone Zone { get { Trace.WriteLine(String.Format("Extension:Zone")); return new Zone(LavishScript.Objects.GetObject("Zone")); } } #endregion #region Commands /// TODO: Implement Craft /// TODO: Implement Dump /// TODO: Implement EQ2Ignore /// TODO: Implement InitCommands /// TODO: Implement ShowStats /// TODO: Implement Where /// /// Activates an item that is currently equipped. (The command /// activates an item in the same way as if you placed the item /// in your hotbar and clicked on it, or, if you right-click on /// an item and select 'use'.) /// /// equipment slot public static int Activate(EquipSlot slot) { Trace.WriteLine(String.Format("Extension:Activate({0})", slot)); return LavishScript.ExecuteCommand(String.Format("Activate {0}", slot.ToString().ToLower())); } /// /// Performs a broker search because ISXEQ is stupid AF /// /// Name of broker public static int Broker(string name) { Trace.WriteLine(String.Format("Extension:Broker({0})", name)); return LavishScript.ExecuteCommandEx("broker","name", name); } /// /// Echoes a message directly to your chat window(s). /// /// message /// chat type /// public static int EQ2Echo(string message, ChatType type = ChatType.None) { Trace.WriteLine((type != ChatType.None) ? String.Format("Extension:EQ2Echo({0}, {1})", message, type) : String.Format("Extension:EQ2Echo({0})", message)); return LavishScript.ExecuteCommand((type != ChatType.None) ? String.Format("EQ2Echo {0} -chattype {1}", message, type.ToString().ToLower()) : String.Format("EQ2Echo {0}", message)); } /// /// Executes an EQ2 command directly. /// /// command public static int EQ2Execute(params string[] command) { Trace.WriteLine(String.Format("Extension:EQ2Execute({0})", String.Join(", ", command))); return LavishScript.ExecuteCommand(String.Format("EQ2Execute {0}", String.Join(" ", command))); } /// /// Performs the desired keypress. /// Parameters: -hold, -release /// The benefit of "EQ2Press" versus "Press" (InnerSpace command) /// is that it will work even when the EQ2 session in question is /// not the one in focus. /// Verify keypress is valid with ISXEQ2.IsValidEQ2PressKey(). /// /// parameters and keypress public static int EQ2Press(string args) { Trace.WriteLine(String.Format("Extension:EQ2Press({0})", args)); return LavishScript.ExecuteCommand(String.Format("EQ2Press {0}", args)); } /// /// This command allows you to specify particular key phrases that will cause /// isxeq2 to ignore an incoming chat channel text. If the given phrase will /// trigger an ignore if it is found in the chat text, sender name, target name, /// or customchannel name. You may also use the 'eq2ignore all' toggle to ignore /// ALL incoming chat text (e.g. if you need complete silence.) Use the /// 'eq2ignore all' command again to toggle things back to normal, which will /// again use the ignores you already had set up. /// /// parameters /// public static int EQ2Ignore(string args) { Trace.WriteLine(String.Format("Extension:EQ2Ignore({0})", args)); return LavishScript.ExecuteCommand(String.Format("EQ2Ignore {0}", args)); } /// /// Faces your current target. /// public static int Face() { Trace.WriteLine(String.Format("Extension:Face()")); return LavishScript.ExecuteCommand("Face"); } /// /// Faces the nearest actor of the specified type. /// /// actor type public static int Face(ActorType type) { Trace.WriteLine(String.Format("Extension:Face({0})", type)); return LavishScript.ExecuteCommand(String.Format("Face {0}", type)); } /// /// Faces the specified heading (0 to 360.0) /// /// heading public static int Face(float heading) { Trace.WriteLine(String.Format("Extension:Face({0})", heading.ToString(CultureInfo.InvariantCulture))); return LavishScript.ExecuteCommand(String.Format("Face {0}", heading.ToString(CultureInfo.InvariantCulture))); } /// /// Faces the supplied location on the XZ plane /// /// x-coordinate /// z-coordinate public static int Face(float x, float z) { Trace.WriteLine(String.Format("Extension:Face({0}, {1})", x.ToString(CultureInfo.InvariantCulture), z.ToString(CultureInfo.InvariantCulture))); return LavishScript.ExecuteCommand(String.Format("Face {0} {1}", x.ToString(CultureInfo.InvariantCulture), z.ToString(CultureInfo.InvariantCulture))); } /// /// Faces the supplied location in the XZY plane. /// /// x-coordinate /// y-coordinate /// z-coordinate public static int Face(float x, float y, float z) { Trace.WriteLine(String.Format("Extension:Face({0}, {1}, {2})", x.ToString(CultureInfo.InvariantCulture), y.ToString(CultureInfo.InvariantCulture), z.ToString(CultureInfo.InvariantCulture))); return LavishScript.ExecuteCommand(String.Format("Face {0} {1} {2}", x.ToString(CultureInfo.InvariantCulture), y.ToString(CultureInfo.InvariantCulture), z.ToString(CultureInfo.InvariantCulture))); } /// /// Faces the nearest actor that has a name that is either a full or partial match. /// Supplting the name "nocamera" allows you to decide if you want the camera to /// adjust its heading or not when you are in 3rd person. By default, your camera /// will adjust when you adjust your player's heading with /face. However, if you /// type "/face nocamera", then your player will change heading, but the camera /// will remain where it was. '/face nocamera' will toggle it again if you change /// your mind. /// /// name public static int Face(string name) { Trace.WriteLine(String.Format("Extension:Face({0})", name)); return LavishScript.ExecuteCommand(String.Format("Face {0}", name)); } /// /// Used to issue commands to the Radar. Custom radar name is /// not used for on and off and is optional for zoomin and zoomout /// /// command /// custom radar name public static int Radar(RadarCommand command, string name = null) { Trace.WriteLine((name == null) ? String.Format("Extension:Radar({0})", command.ToString().ToLower()) : String.Format("Extension:Radar({0}, {1})", command, name)); return LavishScript.ExecuteCommand((name == null) ? String.Format("Radar {0}", command.ToString().ToLower()) : String.Format("Radar {0} {1}", name, command.ToString().ToLower())); } /// /// Targets the nearest actor of the supplied type /// /// target type public static int Target(TargetType type) { Trace.WriteLine(String.Format("Extension:Target({0})", type)); return LavishScript.ExecuteCommand(String.Format("Target {0}", type.ToString().ToLower())); } /// /// Targets the entity with the matching ID. /// /// ID public static int Target(int id) { Trace.WriteLine(String.Format("Extension:Target({0})", id.ToString(CultureInfo.InvariantCulture))); return LavishScript.ExecuteCommand(String.Format("Target {0}", id.ToString(CultureInfo.InvariantCulture))); } /// /// Targets the nearest entity that is a partial or full match with the name. /// /// name public static int Target(string name) { Trace.WriteLine(String.Format("Extension:Target({0})", name)); return LavishScript.ExecuteCommand(String.Format("Target {0}", name)); } /// /// Makes an in game announcement for the provided time with the specified sound. (NOT WORKING CORRECTLY) /// /// announcment /// time to remain on screen /// sound to play public static int EQ2Announce(string announcement, float timer, AnnouncementSound sound = AnnouncementSound.QuestComplete) { return LavishScript.ExecuteCommand(String.Format("EQ2Announce {0} {1} {2}", announcement, timer.ToString(CultureInfo.InvariantCulture), ((int)sound).ToString(CultureInfo.InvariantCulture) )); } #endregion #region Enums /// /// Actor Types /// public enum ActorType { /// /// Player Character /// PC, /// /// Non Player Character /// NPC, /// /// Named Non Player Character /// NamedNPC, /// /// No Kill Non Player Character /// NoKillNPC, /// /// Special /// Special, /// /// Resource /// Resource, /// /// Trade Skill Unit /// TSUnit, /// /// Corpse /// Corpse } /// /// Announcement Sounds /// public enum AnnouncementSound { /// /// Skill Up Sound /// SkillUp = 1, /// /// Quest Update Sound /// QuestUpdate, /// /// Level Ding Sound /// LevelDing, /// /// Call For Help Sound /// CallForHelp, /// /// Rare Harvest Sound /// HarvestRare, /// /// Quest Complete Sound /// QuestComplete, /// /// Location Discovery Sound /// LocationDiscovery, /// /// Send Mail Failed Sound /// SendMailFailed, /// /// Send Mail Success Sound /// SendMailSuccess } /// /// Chat Types /// public enum ChatType { /// /// Default Chat Type /// Default, /// /// Status Chat Type /// Status, /// /// System Chat Type /// System, /// /// Error Chat Type /// Error, /// /// Command Chat Type /// Cmd, /// /// Customer Service Tell Chat Type /// CSTell, /// /// Message of the Day Chat Type /// Motd, /// /// Guild Message of the Day Chat Type /// GMotd, /// /// Guild Chat Type /// Gu, /// /// Guild Officer Chat Type /// GOfficerChat, /// /// Guild Online Chat Type /// GOnline, /// /// Group Chat Type /// GSay, /// /// Raid Chat Type /// RSay, /// /// Say Chat Type /// Say, /// /// Emote Chat Type /// Emote, /// /// Tell Chat Type /// Tell, /// /// Yell For Help Chat Type /// YellForHelp, /// /// Death Chat Type /// Death, /// /// Who Chat Type /// Who, /// /// Out of Character Chat Type /// OOC, /// /// Auction Chat Type /// Auction, /// /// Shout Chat Type /// Shout, /// /// Narrative Chat Type /// Narrative, /// /// Non PC Tell Chat Type /// NonPCTell, /// /// Merchant Chat Type /// Merchant, /// /// Reward Chat Type /// Reward, /// /// Pet Chat Type /// PetChat, /// /// Spell Chat Type /// Spell, /// /// Spell Fail Chat Type /// SpellFail, /// /// Spell Fail to Cast Chat Type /// SpellFCast, /// /// Spell H Cast Chat Type /// SpellHCast, /// /// Spell Worn Off Chat Type /// SpellWOff, /// /// Spell Other Chat Type /// SpellOther, /// /// Skill Chat Type /// Skill, /// /// Damage Chat Type /// Dmg, /// /// Damage Shield /// DS, /// /// Melee Warning Chat Type /// MeleeWarning, /// /// Melee Hit Chat Type /// MeleeHit, /// /// Melee Hits Me Chat Type /// MeleeHitsMe, /// /// No Chat Type /// None } /// /// EQ2Mail Status /// public enum EQ2MailStatus { /// /// EQ2Mail Status Opened /// Opened, /// /// EQ2Mail Status Composing /// Composing } /// /// Equipment Slots /// public enum EquipSlot { /// /// Primary Slot /// Primary, /// /// Secondary Slot /// Secondary, /// /// Head Slot /// Head, /// /// Chest Slot /// Chest, /// /// Shoulders Slot /// Shoulders, /// /// Forearms Slot /// Forearms, /// /// Hands Slot /// Hands, /// /// Legs Slot /// Legs, /// /// Feet Slot /// Feet, /// /// Left Ring Slot /// Left_Ring, /// /// Right Ring Slot /// Right_Ring, /// /// Ears Slot /// Ears, /// /// Neck Slot /// Neck, /// /// Left Wrist Slot /// Left_Wrist, /// /// Right Wrist Slot /// Right_Wrist, /// /// Ranged Slot /// Ranged, /// /// Ammo Slot /// Ammo, /// /// Waist Slot /// Waist, /// /// Charm Slot 1 /// Activate1, /// /// Charm Slot 2 /// Activate2 } /// /// Radar Commands /// public enum RadarCommand { /// /// On /// On, /// /// Off /// Off, /// /// ZoomIn /// ZoomIn, /// /// ZoomOut /// ZoomOut } /// /// Target Types /// public enum TargetType { /// /// Me /// Me, /// /// Player Character /// PC, /// /// Non Player Character /// NPC, /// /// No Kill Non Player Character /// NoKillNPC, /// /// Resource /// Resource, /// /// Trade Skill Unit /// TradeSkillUnit, /// /// Special /// Special } #endregion } }