13 May 2005 by DKAA
- Added optional param to Windows.List[...] to indicate column

11 May 2005 by Amadeus/DKAA
- Updated MQ2 to work with the 5/11/2005 patch
- Fixed Mapwindow structure
- Fixed Spellbuff structure
- Fixed Actorinfo structure
- Lots of other little fixes 

20 April 2005 by Amadeus
- Added some new offsets to eqgame.h including
  * pinstCGuildTributeMasterWnd
  * pinstCVoiceMacroWnd	
  * pinstCLFGuildWnd
  * pinstCGuildBankWnd
  * pinstCBarterWnd	
  * pinstCBarterMerchantWnd	
  * pinstCBarterSearchWnd
  * pinstCTicketWnd	
  * pinstCTicketCommentWnd]
  * pinstLargeDialogWnd	
  * pinstCTaskWnd
  * pinstCTaskSelectWnd	
  * pinstCPointMerchantWnd
  * pinstCPvpLeaderboardWnd	
  * pinstCTitleWnd	
  * pinstCPvpStatsWnd
  * pinstCMailWnd
  * pinstCMailCompositionWnd
  
4 May 2005 by Lax
- Fixed calculation bugs

17 April 2005 by Amadeus
- Added "Suffix" information to structs
- Added ${Me.Suffix} and ${Target.Suffix} 

8 March 2005 by Lax
- Blech 1.6.8 - fixes a crash

23 March 2005 by Lax
- Fixed this group member bug nonsense.  Now uses correct group structure.
- Fixed redundancy in GetSpawnType

11 March 2005 by Lax
- item.Spell fixed for scroll, proc, focus, and worn (previously did only clicky)

10 March 2005 by Lax
- CHARINFO update from htw, fixes the new Group stuff

9 March 2005 by dkaa
- refix the include file issue

8 March 2005 by Lax
- Fixed /itemslots
- Fixed problem with group.Leader when you are the leader and the group has members
- Added ISXEQ client templates to mkplugin

7 March 2005 by Lax
- Fixed the new group data types. Also added To String values:
  groupmember: Same as Name
  group: Same as Members

7 March 2005 by dkaa
- Fixed the Buff and Song ID members

6 March 2005 by Lax
- Added group datatype. members are as follows:
  * groupmember Member[n]: n is 1 to 5 (0 gives self)
  * int Member[name]: Gives the number, as used above
  * int Members: Total group members, excluding self
  * groupmember Leader: The leader of the group
- Added groupmember datatype. inherits spawn. members are as follows:
  * string Name: Name of the group member.  Should work regardless of whether they are in zone
  * spawn Spawn: Direct access to the group member's spawn type
  * bool Leader: Is this the group leader?
- Dropped GroupLeader TLO, now you should use Group.Leader
- Dropped GroupLeaderName TLO, now you should use Group.Leader.Name
- Group TLO now gives group datatype

3 March 2005 by Lax
- Fixed character.CurrentHPS, character.MaxHPS, character.PctHPS to use the "stable" versions..
- Added character members STR, STA, AGI, DEX, WIS, INT, CHA, svMagic, svFire, svCold, svPoison, 
  svDisease, CurrentWeight .. all of them ints
- Fixed buff slot counts

27 February 2005 by Lax
- Fixed INI bug in /mapnames
- Fixed bug in /mapfilter with "help"

26 February 2005 by Lax
- Optimized some stuff with the buff data type

25 February 2005 by Lax
- Removed bmpwad8.s3d file which was no longer being used, but was 33% of the size of the zip
- ISXEQ-related changes not affecting MQ2

23 February 2005 by Lax
- Cleaned up a bunch utility functions from MQ2Commands.cpp, they are now in MQ2Utilities.cpp

22 February 2005 by Lax
- Fix a Blech bug.

18 February 2005 by dkaa
- Update the ground interaction opcode

15 February 2005 by Amadeus
- Adjusted MQ2 to work properly with the new expansion
- Fixed some very small things

12 February 2005 by dkaa
- Fix an issue with /emote

11 February 2005 by Amadeus
- Added/Fixed some more spell slot information (item/spell display)
- Fixed the OnZoning callbacks in the Detour API
- Updated MAX_GUILDS (should fix guild name display problems)
- Updated MAX_ZONES in preparation for next expansion

8 February 2005 by Amadeus
- Fixed MQ2 to work with the latest patch
- Added spell information to the item display plugin
- There is now a file in the /release folder called "Changes-ISXEQ.txt", which will
  contain patch notes for the InnerSpace extension that is now included with MQ2.

31 January 2005 by Amadeus
- Fixed MQ2 to work with the latest patch
- The format of eqgame.h has CHANGED.  Be sure to get this zip. [SwiftyMuse]
- Browsing the wares of an adventure merchant still crashes EQ.  MQ2 is not to blame.

29 January 2005 by dkaa
- Fixed the map crash on /loadskin

29 January 2005 by Lax
- Split MQ2Main.h into a couple extra header files
- Added second project (ISXEQ.vcproj, no .dsp file at this time) to MQ2Main folder for 
  adaptation to Inner Space.  This project builds ISXEQ.dll and does NOT currently link (it
  compiles, then gives linker errors. some things need to be done before it will link)
  ISXEQ project needs separate implementations of each command, datatype, and top-level object.
- Added a lot of "#ifndef ISXEQ" to various files

26-28 January 2005 by Amadeus
- Once over, formatting/syntax check, re-package
- Fixed structs and offsets to be compatable with the new patch
- Fixed a variety of other small things to be compatable with the new patch
- Added a few little things from the boards as well as original work

4 January 2005 by Lax
- Updated copyright notices for 2005
- Updated Blech to 1.6.4, which fixed a tree traversal bug.  The bug prevented some 
  events from firing

31 December 2004 by Amadeus/DKAA 
- Fixed a line that was causing compile problems with VC++ 6.0 

30 December 2004 by Amadeus
-  Lots of little fixes
-  Fixed DOOR struct (which was causing some bugs with door related macro commands)
~  User Submitted Fixes (from message boards)
   * Added 'Me.FreeBuffSlots' to MQ2. [cr4zyb4rd]
   * Fixed Item "Stackable" flag [Valerian]
   * (Changed 'SpellReady' so SpellReady[] returns true when Gems are fading back 
     in from the disabled state. [Brettido]
   * Fixed 'MyCastTime' [cr4zyb4rd]
   * Added 'BuildDate' to the MacroQuest data members. [cr4zyb4rd]

19 December 2004 by Amadeus
- Cr4azyb4rd's code for the new item stuff, outlined in this thread:
  http://www.macroquest2.com/phpBB2/viewtopic.php?t=10270
- The Item Datatype 'Stackable' seems to be broken at the moment.  We will be looking
  into it over the next few days.
- Added "GuildFavor" to the ItemDisplay plugin (Ziggy)
- Added Ziggy's /mapshow patch
- Added Cronic's new Plugin API additions: OnBeginZone() and OnEndZone().  Folks may want
  to bookmark http://www.macroquest2.com/phpBB2/viewtopic.php?t=9959 as an example of how
  to add features to the plugin API.  (Hopefully this thread/example will make it in the 
  manual.)
- Added ${Me.EnduranceRegen} (submitted by Pooz).  It returns returns the amount of 
  endurance gained in the last tick. 

18 December 2004 by Amadeus
- Various structs/offsets taken from the boards to make MQ2 compatable
  with the latest patch
- Fixed keybinds
- Various small things from the boards over the past couple months
- Fixed spawninfo and actorinfo
** Note:  This is an initial zip release to get MQ up and running.  Expect another
          release in the next couple of days to resolve all remaining issues and
          to add code submitted on the boards. **

13 December 2004 by Lax
- Blech updated to version 1.6.3 which solves a new issue

8 December 2004 by Lax
- Blech updated to version 1.6.1 which solves remaining known Blech issues

22 November 2004 by Lax
- Blech updated to version 1.6 which solves parsing problems such as the one
  described here: http://www.macroquest2.com/phpBB2/viewtopic.php?p=75390#75390
- MQ2CustomBinds updated to solve a race condition issue, which also appears in
  older MQ2MoveUtils versions.  The race condition causes a crash when starting
  EQ via WinEQ 2.0
- The MQ2 initialization process now has a short delay to help alleviate the
  race condition issue for people who have not updated MQ2MoveUtils

25 October 2004 by Amadeus
- ${Me.AltAbility[]} is now back!   However, with one change.  Instead of 
  returning the 'rank', it now returns the total number of points you have
  spent in that ability.  Therefore, to determine if a player has bought an
  ability, all you have to do is check if the value is greater than zero.
- Added AALIST struct to eqdata.h and AA information to CHARINFO
- Fixed "/aa list xx" to stop showing multiple versions of the same AAs
- Fixed "/aa list timers" to only show AAs you have bought
- Added some new utility functions to the source (C++, NOT MACRO CODE)
  * bool PlayerHasAAAbility (PCHARINFO pChar, DWORD AAIndex);
  * PCHAR GetAANameByIndex(DWORD AAIndex)
  * DWORD GetAAIndexByName(PCHAR AAName)
  * DWORD GetAAIndexByID(DWORD ID)
~ User Submitted Fixes (from message boards)
  *  Add a "noauto" flag to your '/plugin' command to prevent 
     updating the macroquest.ini when a plugin is loaded/unloaded. 
  *  Added some more USERCOLOR_* definitions to eqdata.h
  *  Small fix to '/loadspells list'
  *  Added more spell information to the spell information display
  *  Added CastOnYou, CastOnAnother, and WearOff to the MQ2SpellType class
  *  Major upgrades to MQ2Irc plugin, see this thread for more information 
     http://www.macroquest2.com/phpBB2/viewtopic.php?p=73390#73390
     
14 October 2004 by Amadeus
- Removed the BuildData datatype for the moment.  The code, as it was originally 
  conceived was causing compile problems on Visual Studio 6.0.  Moreover, it was 
  determined that it was not reliable on all partition types.   It may be added
  again at some point in the future after rigorous testing across different
  partition types and both vs 6.0 and vs.net compilers.

13 October 2004 by Amadeus
- [*LAX*]  New Memcheck0 routine
- [*DKAA*] New Memcheck4 routine (the routine previously known as memcheck4 
           is now memchecks)
- New offsets/structs for latest patch
- Con Colors should be working properly to lvl 70
- spawn.CleanName should now return the name without the '#' symbol
- More work on mq2map ...it's still in heavy testing and needs more work though
- Added 'BuildDate' to the MacroQuest data members.  Returns an int representing
  the date in which the current MQ2Main.dll was built.
- Added a short message to warn you of a running macro when /camping.

23 September 2004 by Amadeus
- Fixed the MacroQuest2.exe to have correct links and added a few new links!
- Offsets fixed for recent patch
- Couple more spell gem 9 fixes

19 September 2004 by Amadeus
- Fixes related to the extra buff slots and extra spell gem for Omens of War.

17 September 2004 by Amadeus
- MQ2Map has issues and is being debugged in house.  I suggest turning it
  off until it officially fixed if you are having problems.
- Added ${xxx.Attuneable} for items ..returns TRUE if item is Attuneable, 
  FALSE if it is not.
- Added some code to MQ2MapApi.cpp in the debugging stage.  Most of it is
  redundant code hoping to cut down on problems.
- Miscellanous fixes throughout the source

14 September 2004 by Amadeus
- All the fixes needed to make MQ2 work with Omens of War
- The way that EQ handles the initial splash screen has changed dramatically.
  MQ's custom SplashScreen is disabled.
- Almost all structs were modified/fixed.
- Removed the offset CEverQuest__GetTitleDesc
- Added Title to spawninfo structure
- Added ${xxx.Title} ..it returns a string that is your title.  Please note that 
  ${xxx.AATitle} will return the same thing.  I'm leaving both in for backwards
  compatability of macros although "Title" should be used in the future since 
  Titles are no longer exclusively AA based.
- updated TOTAL_SPELL_COUNT 
- Added TOTAL_SPELLS_ALLOCATED
- EQ_Character__Max_Mana removed ...it's a virtual function now (This means that 
  the MaxMana and PctMana datatypes are disabled for now)

26 August 2004 by Amadeus 
- Fixed /filter name on/off to work correctly [Efudd]

20 August 2004 by Amadeus
- Removed ${Me.GroupMember[]} and ${Me.GroupLeader} since it is already in as 
  ${Group[n].Name} and ${GroupLeaderName}.  Even though the information is stored in
  two locations, it was causing confusion.
- Tweaked ${Me.Grouped} some more ...I think I have it fixed now.

19 August 2004 by Amadeus
- Fixed ${Me.AltAbilityReady[]}
- Fixed ${Me.AltAbilityTimer[]}
- Added ${AltAbility[].MyReuseTime}  (proper reuse time if you hastened AA abilties)
- Added NEW COMMAND:  /aa
*** Syntax ***
/aa list all            -- lists all of your AA abilities in format [ID : name]
/aa list timers         -- lists just the AA you have that have timers
/aa info [ability name] -- gives information about a particular AA ability
/aa act [ability name]  -- works like "/alt act ##", but takes the name instead of ##
   (note:  You will notice a fraction of a second delay using this method vs.
           the /alt act ## method.)
***
(Note:  Yes, they do not list in any particular order (No, I don't know why).  No, 
I do not know why some abilities are duplicated.  Yes, it may have bugs 
that need testing.)
- Slight tweak to code to make it compile on Vc++ 6.0 cleanly
- Fixed GetSpellDuration (per corrections posted on the messageboard)
- Added an offset to eqgame.h and removed one from eqgame.h (Those that help find
  offsets..please note this change!)

18 August 2004 by Amadeus
- Fixed EQRAIDWINDOW and EQRAID structs
- Some tweaking to attempt to make ${xxx.Grouped} more consistant
- Added:  ${Me.GroupMember[n]}  (1-5) ...returns string
- Added:  ${Me.AmIGroupLeader}  ...return TRUE or FALSE
- Added:  ${Me.GroupList} ..simply returns a string of your group members (excluding you)
- Fixed ${xxx.Lore} for items
- Fixed {AltAbility[ability].xxx} ...all of these are now working
- Fixed All the AltAbility structs
(Note:  ${Me.AltAbilityReady.xxX}, ${Me.AltAbilityTimer.xxx} and ${Me.AltAbility[]} are 
        still BROKEN)
-----------
** SOE Coding Change (technical folks only)**  
EQ no longer stores information for ALL AA abilities in your memory space as it once did.
It allocates the space for all of the abilities;however, if your character is incapable of
using the ability, the pointer location for that ability is now 00000000.
-----------

14 August 2004 by Amadeus
- Fixed offsets to work with 8/13 "emergency" patch
- Updated TOTAL_SPELL_COUNT and MAX_ZONES
- Added dman's ${Target.HeadingToLoc[Y,X]} and ${Me.HeadingToLoc[Y,X].Degrees} routines

12 August 2004 by Amadeus
- Various fixes (including ${Me.Casting}, etc.)

11 Auguest 2004 by Amadeus
- Fixed to work with the 8/11 patch

27 July 2004 by DKAA
- Fixed ${Plugin}

23 July 2004 by Amadeus
- Lots of struct updates from the boards
- Added the following variables:  ${Me.EnduranceBonus}, ${Me.CombatEffectsBonus},
  ${Me.ShieldingBonus}, ${Me.SpellShieldBonus}, ${Me.AvoidanceBonus}, ${Me.AccuracyBonus},
  ${Me.StunResistBonus}, ${Me.StrikeThroughBonus}, ${Me.AttackBonus}, 
  ${Me.HPRegenBonus}, ${Me.ManaRegenBonus}, ${Me.DamageShieldBonus},
  ${Me.AttackSpeed}, ${Me.DoTShieldBonus}
- Added showbonuses.mac to the release/macros directory.  It will display your current
  stat bonuses as added by your gear.
- Added ${Me.LanguageSkill[languagename]} (ie, ${Me.LanguageSkill[Dark Speech]}.  You can
  also use a number (as given with /lang help) in place of the languagename parameter.

21 July 2004 by DKAA
- Fixed the macro not found error message.

18 July 2004 by Lax
- EQPlayNice 1.11+ compatibility

17 July 2004 by Amadeus
- Updated source to be compatable with the July 16 patch
- ${Me.AltAbilityTimer...} and ${Me.AltAbilityReady...} datatypes are broken atm and 
  have been disabled.

12 July 2004 by DKAA
- slot hand is now hands to be consistent
- updated some of the distributed macros

9 July 2004 by Lax:
- Newest version of the readme.chm from Wassup
- Added/changed MQ2Data type members
  int item.Tribute: Tribute value

3 July 2004 by DKAA
- added /who noguild

3 July 2004 by Amadeus:
- Added new command:  /substitute 
  ** Syntax: 
  **        - /substitute list
  **        - /substitute <orig> delete
  **        - /substitute <orig> <substitution>   (see examples below)
  ** This new command allows you to create custom midline substitutions that will work
  ** anywhere in a command.  It works VERY similarly to aliases in some respects, esp.
  ** in how it is saved in the .ini file and how the commandline syntax is structured. 
  ** Substitutes are called from any alias or commandline by using the percent sign (%)
  ** followed by your orig. text.
  **
  ** Examples:  "/substitute mom Mother"
  **            "/substitute omg Oh my god!"
  **            "/substitute k %omg, kill %t before I tell your %mom"
  **
  ** The final example if you typed "/say %k" would produce:  "/say Oh my god!, kill
  ** TARGET before I tell your Mother"
  **
  ** Please note the following rules/reminders:
  ** 
  ** 1.  You don't use the percent signs when creating the substitutions or editing your
  **     config file.
  ** 2.  You can use MQ's subsitutions without spaces around them (unlike EQs!) (ie: 
  **     "/echo %omg%mom" would return "/echo Oh my god!Mother"
  ** 3.  Substitutions do not currently work in macros.
  ** 4.  "/sub" is currently a valid shorthand for "/subsitute"
  ** 5.  You can use EQ's wildcards (ie: %t) within your substitutions; however, you 
  **     have to leave spaces around them (yes, they suck)
  ** 6.  You cannot CURRENTLY replace EQ wildcards with MQ substitutions (ie, you can't
  **     make a replacement for %m (This may be supported in the future.)
  **
- Fixed CONTENTS struct (thanks ieatacid)
- Fixed routines.mac, arrows.mac, and arraytest.mac (Dont_know_at_all)

2 July 2004 by Amadeus:
- Fixed "/who guild <guildname>" on some servers (It seems that on some servers, SOE
  removed guilds but left the entry giving bogus guild entries in the list where the
  'name' was blank, thus ending the search loop prematurely.)
- Added "/who knight"  (returns Paladins and Shadowknights in the zone)
- Added "/who tank"    (returns paladins, shadowknights, and warriors in the zone)
- Added "/who healer"  (returns druids and clerics in the zone)
- Added "/who dps"     (returns wizards, rangers, and rogues in the zone)
- Added "/who slower"  (returns shamans, enchanters, and beastlords in the zone)

30 June 2004 by Amadeus:
- Refined "/who npc named" to work a bit better
- Added "/who npc merchant"
- Added "/who npc tribute" (returns tribute masters)
- Added "/who npc gm" (returns GUILDmasters)
- Removed the Old SPAWNINFO struct

28 June 2004 by Lax:
- Added MQ2Data Top Level Object:
  bool LineOfSight[y,x,z:y,x,z]: Determines Line of Sight in 1, 2 or 3 dimensions.  Any not given will default to your character's current x y or z.
- Added MQ2Data type members:
  bool spawn.LineOfSight: Determines if your character has Line of Sight to this spawn
  bool switch.LineOfSight: Determines if your character has Line of Sight to this switch
  bool ground.LineOfSight: Determines if your character has Line of Sight to this ground item
- API now has static inline BOOL LineOfSight(PSPAWNINFO Origin, PSPAWNINFO CanISeeThis)

27 June 2004 by Amadeus:
- Added 'named' flag to the superwho filters.  It simply checks to 
  see if the spawn's name begins with a capital letter or with a
  pound (#) sign.  (examples:  '/who npc named', '/who npc named 65')
  ** This works best in places like the Plane of Hate.

23 June 2004 by Amadeus:
- ieatacid's CHARINFO update (primarily just offset locations updated)
- ieatacid's update to EQRAIDWINDOW struct
- Removed OLDCHARINFO struct

23 June 2004 by Lax:
- Fixed Bank stuff in CHARINFO
- "listselect" notify now works in combo boxes
- Fixed minor problem with operator precedence in Calculate (1-1-1 previously evaluated to
  positive 1, now it correctly evaluates to negative 1)
- Changed/Added MQ2Data members:
  int window.Items: Number of items in a list or combo box
  int window.List[text]: Find an item in a list or combo box by partial match (use window.List[=text] for exact)  Example: ${Window[TradeskillWnd].Child[RecipeList].List[=Inky Shadow Silk]}

21 june 2004 by DKAA:
- Fixed a crash in echo when the lines are longer than 2043

21 june 2004 by DKAA:
- Fixed the EQMERCHWND alignment and renumbered the CSIDLWND struct.

19 June 2004 by Lax:
- Fixed FastCalculate and EvaluateRPN functions.  Calculate works fine now, stfu rtfm etc ;)
- DKAA fixed some struct stuff
- Amadeus fixed some struct stuff

14 June 2004 by Lax:
- Replaced Calculate function with a much faster version. Also added an operator or two.
  I'll make sure they get added to the manual. How much faster? The existing calculate
  ran on my system 4,200 times in a short amount of time and took one full second of CPU
  time to do so. The same calculations ran with the new calculate 77,000 times and took 
  only 620ms. Extrapolating the data it would have taken about 124,000 times calling 
  calculate to match the old 4,200... or about 29.5 times faster (that's a lot).
- Added sub lookup map from Gus to speed up macros a little bit
- Undid MQ2EQBugFix, which was currently creating a bug (note to self: in future bug fixes,
  make sure it's only going to try to fix it for the correct version)
- Fixed an offset
- Standard search spawn now allows multi-word names.
- /mqlog no longer adds an extra line

3 June 2004 by Lax:
- Fixed string.Arg, string.Token, NearestSpawn, spawn.NearestSpawn, LastSpawn

2 June 2004 by Lax:
- Fixed some stuff, yadda yadda.  I forget now.
- Bodytype 10 has been identified as Dain, thank you for the reports

29 May 2004 by EqMule:
- Fixed EQ_INTERACTGROUNDITEM so click left item works again...
- Updated zipit.lst (personal reminder: dir * /s /N /A-D /B > zipit.lst)

28 May 2004 by DKAA:
- Fixed the message ID for mq2bzsrch.

27 May 2004 by Lax (more):
- Fixed stack overflow bug in one of the functions that handles window names.  I fixed it in one
  before putting up the update but didn't in an exact copy of it above it.  Lax truly lacks. ;)
- Added pet weapon procced pet body type to the list of known body types.
- Fixed captioncolors not working correctly
- /who <level> will work properly, as you would have expected previously.  e.g. /who 65.
  Coincidentally this now works with the other spawn searches, /who /target /highlight /mapshow
  /maphide, ${Spawn[search]} etc.

27 May 2004 by Lax:
- Added "chest" to the standard spawn searches used by /who, /target, /highlight, /mapshow, 
  /maphide, etc
- Fixed some problems with the window suff introduced in the May 16 zip
- Added/changed MQ2Data members:
  string spawn.Type: PC NPC Untargetable Mount Pet Corpse Chest Trigger Trap Timer Item 
- New MQ2Data Top-Level Object:
  int SpawnCount: Total number of spawns in current zone
  int SpawnCount[search]: Total number of spawns in current zone matching the search

24 May 2004 by DKAA:
-Fixed a couple problems with the makefiles (mq2chat wasn't building)
-A special update for mq2safe users

16 May 2004 by Lax:
- UI subsystem of MQ2 is now smarter.  All window and control names are now case insensitive,
  and controls can be used by ScreenID *or* Piece name.  /windows <windowname> now shows, for 
  each child of the given window, ScreenID, Piece name, and the TYPE of control (e.g. label,
  button, invslot, spellgem, etc).
- window.List now only works on list boxes (will not crash on other types, just give NULL)
- Added/changed MQ2Data members:
  string window.Name: Name of window piece (e.g. "ChatWindow" for top level windows, or the Piece name (NOTE: CUSTOM UI DEPENDANT) for child windows)
  string window.ScreenID: ScreenID of window piece (ScreenID is NOT custom ui dependant, this *must be* the same on ALL UIs)
  string window.Type: Type of window piece (Screen for top level windows, or Listbox, Button, Gauge, Label, Editbox, Slider, etc)
- Fixed /target next, as well as targeting the origin of the search (e.g. you, or the spawn
  already targeted)
- Fixed turbo problem with using /macro from within a macro

16 May 2004 by DKAA:
- Fixed a where using loc and radius in spawn searches would return spawns further than the radius

15 May 2004 by Lax:
- Fixed bug in /who that made it show no spawns for some people, even though there were spawns...
- Standard search spawns will accept class names or short names without using the "class" keyword.
  Shadowknight is used without a space, and short names are all 3 letters ("shd", not "sk").  
  Note that cleric's short name is "clr" not "cle".
- Bug with MQ2Chat plugin that caused events to be processed twice has been fixed
- MQ2IRC will now process all lines as custom events.  Note that it does not process them as 
  #chat events.
- Turned off the PCClass captioncolor option, PC caption colors will default to EQ's settings.
  It was left on by mistake after testing a bug fix.  You can turn them back on if you wish by
  using the /captioncolor command like so: /captioncolor pcclass on

14 May 2004 by Lax:
- MQ2ChatWnd (the MQ2 Chat Window support) got some upgrades.  First of all the window was not
  limiting the size of its scrollback, so after so much went on in the MQ2 window, your framerate
  would drop like a rock.  To achieve proper scrollback limiting without lagging you too much,
  I put in a system to make it buffer the chat that goes to it, and only display so many lines
  per frame.  The MQ2ChatWnd font size option now works somewhat...  The font sizes are not the
  same as EQ's chat window sizes yet, so be aware of that.  I'll work on it ;)  You will probably
  want somewhere from -3 to 2.  /mqfont <#>
- MQ2Map filters added: untargetable, trap, timer
- /who has been changed a little bit.  When a TRIGGER, TRAP, TIMER, or UNTARGETABLE is listed,
  that will be noted at the end of the line in red (very helpful).  The routine has also been
  updated for efficiency, so there is less lag with large /who result sets.
- Standard spawn searches (This includes /who, /target, ${Spawn[search]}, etc) have been 
  slightly modified.  "invis" is NO LONGER A VALID KEYWORD.  If you have this in macros, etc 
  you will need to change it.  The updated spawn types ARE valid keywords (trigger, trap, 
  timer, untargetable). If your search is for type "npc" you WILL get untargetable types in
  your search results (particularly helpful for /who).
- Added/changed MQ2Data members:
  string spawn.Type: PC NPC Untargetable Mount Pet Corpse Trigger Trap Timer Item 
  string string.Token[n,separator]: Retrieve a token from the string using a custom separator.  Unlike Arg, this will not skip empty values
  spell item.Spell: Spell effect
  float item.CastTime: Spell effect's cast time
  string item.EffectType: Spell effect type
  ticks character.AltAbilityTimer[n]: Alt ability reuse time left, by number
  ticks character.AltAbilityTimer[name]: Alt ability reuse time left, by name
- spawn.Hunger and spawn.Thirst have returned to active duty
- You can now list child windows from in-game with the /windows command, like so:
  /windows <name>
  e.g.: /windows InventoryWindow
- /itemnotify in <pack> <#> <notification>  now works with sharedbank slots.

13 May 2004 by Lax:
- Fixed "by class" caption colors
- Fixed some bodytypes being identified as triggers (note that untargetable NPCs *are* 
  triggers)
- Fixed target caption leakage (would stay drawn after switching targets)
- /who will show "invis" spawns if any parameters are given.  Spawn search functions,
  including /who and /target, will probably get updated soon.	
- Fixed problem with leading spaces in sub parameter declarations
- MQ2HUD now allows for different HUDs.  Each different HUD is stored in MQ2HUD.ini, but
  in different sections.  The default HUD is "Elements" because that's what it originally
  used.  To load a different HUD, the command is "/loadhud <name>" like "/loadhud bard".
  In this case, the [bard] section (not case sensitive, so it could also be [BARD]) of
  MQ2HUD.ini will be used.  To load the default HUD specifically, the command is 
  "/defaulthud".  MQ2HUD also now adds the following MQ2Data Top-Level Object:
  string HUD: Name of currently loaded HUD.
- MQ2FPS now fixes the bug where CTRL ALT and SHIFT keys stick when you switch windows.
  This is a bug in EQ that happens because the release of the key is not captured by EQ after
  it has been swapped to the background.  MQ2FPS now releases the keys as soon as EQ goes
  to the background, so this will no longer be an issue.
- New command to complement the /ctrlkey /altkey /shiftkey commands:
  Usage: /nomodkey <command>
  This command will release all ctrl/alt/shift keys for the duration of executing the 
  given command.
- Added/changed MQ2Data members:
  bool spawn.Anonymous: Anonymous?
  bool spawn.Roleplaying: Roleplaying?
  string string.Token[n,separators]: Retrieve a token from the string

12 May 2004 by Lax:
- Fixed the mysteriously disappearing #event handling in macros ;)

11 May 2004 by Lax:
- Added nifty changes.txt reader to character select screen.  Now you have no excuse!
- Fixed problem with events mysteriously having parameters disappear
- Updated Blech to fix a bug with some #events disappearing (and not firing)
- Your target's caption will now always be drawn
- Added LDoN Recruiters and Merchants to the list of full class names.
- Added /captioncolor command, which allows a lot of custom spawn caption coloring.  For example,
  the caption of marked NPCs or assist NPCs can be a specific color.. the caption of bankers and
  merchants can be a set color.  NPCs can be done by con color.  All spawns can be done by
  CLASS color (using the raid settings).  Note that you can only set the raid class colors right
  now through the raid options window.  You can open this window by typing
  /windowstate raidoptionswindow show
  Usage: /captioncolor <list|<name off|on|#>>
  Examples:
  /captioncolor list
  /captioncolor pcclass on
  /captioncolor pctrader on
  /captioncolor pctrader 255 128 0
- Changed /windowstate command to use the window mapping used by ${Window[name]}, /windows, etc.
- Fixed issues with "charm" and the invslot type
- raidmember MQ2Data type now inherits "spawn" (when they are in zone)
- Added/changed MQ2Data members:
  class raidmember.Class: Raid member's class (works without being in zone)
  int raidmember.Level: Raid member's level (works without being in zone)
  int item.WornSlots: The number of invslots this item can be worn in (fingers/ears count as 2 slots)
  invslot item.WornSlot[n]: The nth invslot this item can be worn in (fingers/ears count as 2 slots)
  bool item.WornSlot[name]: Can item be worn in invslot with this name? (worn slots only..)

10 May 2004 by Lax (more):
- Fixed once and for all the crash bugs relating to spawn captions (WHICH ARE *NOT* THE HUD)

10 May 2004 by Lax:
- Fixed problem relating to false negatives determining if a spawn is a TRIGGER (e.g. flavor
  text, trap, etc).  This solves crash issues in the latest zip with the custom caption
  system.  This also solves non-crash issues identifying "invisible spawns" in spawn searches,
  as well as spawns that were previously identified as NPCs in MQ2Map.

09 May 2004 by Lax (more):
- Fixed VS6 compile errors in Blech
- Fixed reported crash bug
- Fixed possible crash with HUDs
- Added MQ2HUD "type" 8, for character select screen.  This should fix some potential
  crashes when using custom HUDs and entering char select.

09 May 2004 by Lax:
- Removed remnants of MQ2Parms system.  Rest in peace.  Phase 4.
- Cleaned up a lot of old code that was being kept in comments
- Removed mount captions, they just crash the client
- Added optional parameter to /delay.
  Usage: /delay <time> [condition to end early]
  This lets you use a delay that has a possibility to end early.  For example...
  /keypress forward hold
  /delay 1s ${Spawn[1234].Distance}<${Spawn[1234].MaxMeleeTo}
  /keypress forward
- New command /noparse
  Usage: /noparse <command>
  Prevents a command from being parsed for MQ2Data.  For example..
  /noparse /ini blah blah blah ${stuff}
  Will actually write the ${stuff} literally instead of changing it to the current value
  of stuff.
- Added/changed MQ2Data members:
  int macroquest.MouseX: Mouse's x location
  int macroquest.MouseY: Mouse's y location
  string ticks.Time: Time in the form mm:ss
  string ticks.TimeHMS: Time in the form hh:mm:ss (if there are no hours, the form will be mm:ss)
  int character.CountBuffs: Total number of buffs (not including short duration buffs)

07 May 2004 by Lax:
- Added "Lax/Blech" support to custom events.  The Blech system allows much easier parsing of
  incoming chat.  Custom events will now support more parameters that are automatically
  parsed based on the match text.
- Fixed up EQ's handling of spawn captions (name above their head). Only the nearest 35 spawn
  captions will be updated by default (and even then, only those close enough that you'd see 
  their name).  EQ itself constantly updates the name of every spawn in the zone, even though 
  only a small portion of those are displayed.
- Added an option to /caption command
  Usage: /caption <list|type <value>|update #>
  "/caption update #" will set the number of nearest spawns for MQ2 to update the name of
  each pass.  By default, this is 35.  If you have performance issues after this update,
  please post about it on the forums.  Find a happy update number and let us know.
- Added marked NPC and assist target leadership stuff to default captions, also put guilds on
  the line below the name.  The defaults should mostly look like EQ's now.
- Fixed macro.Params
- Fixed invslot names
- Added/Changed MQ2Data Members:
	spawn character.TargetOfTarget: Target of target   (moved to character type)
	bool spawn.Assist: Current Raid or Group assist target?
	int spawn.Mark: Current Raid or Group marked npc mark number (raid first)
	spawn character.RaidAssistTarget[n]: Current raid assist target (1-3)
	spawn character.GroupAssistTarget: Current group assist target
	spawn character.RaidMarkNPC[n]: Current raid marked NPC (1-3)
	spawn character.GroupMarkNPC[n]: Current group marked NPC (1-3)

05 May 2004 by Lax (even more):
- Plenty of positive feedback on the custom spawn captioning.  Plenty also asking why shownames
  was not working properly.  There are now 4 levels of captions for Players, according to the
  shownames level, to solve this issue.  Therefore the ini options are now Player1, Player2, 
  Player3, Player4 rather than just Player.  Also, the guild status indicator now 
  capitalizes Leader and Officer, and added a "LDR" tag to your group leader.
- Added /caption command to set the custom captions from in-game.
  Usage: /caption <list|type <value>>
  To clear the specific setting, just do /caption <type> like so:
  /caption player1
- DKAA fixed the bzsrch problems
- Added MQ2Data member:
  bool spawn.GroupLeader: Is this your group's leader?
- Fixed CHARINFO struct.  Some Stuff appeared slightly wrong, like leadership exp and bank
  stuff.

05 May 2004 by Lax (more):
- Fixed crash on zoning relating to the new HUD functionality. Dont ask.

05 Max 2004 by Lax:
- Updated for patch and added README.CHM.  Keep an eye out, we should have the manual
  available in more formats (including printable) soon

04 May 2004 by Lax:
- New command
  Usage: /hud <normal|underui|always>
  * "Normal" will make the HUD display as it would normally on top of UI, not at char select
     or in "f10 mode"
  * "UnderUI" will make the HUD display as it would normally except UNDER the UI, and not at
     char select or in "f10 mode"
  * "Always" will make the HUD display under the UI, at char select, and in "f10 mode"
- New Plugin MQ2HUD.  Edit MQ2HUD.INI to add custom elements to your HUD.  You pick the spot
  on the screen, the color, and what gets displayed.  Every element gets parsed for MQ2Data
  each time it is displayed.
  Example MQ2HUD.INI:
    [Elements]
		TargetInfo=3,5,35,255,255,255,${Target}
		GMIndicator=3,5,45,0,0,255,${Spawn[gm]}
		CursorItemName=7,-15,-15,255,255,255,${If[${Cursor.ID},${Cursor},]}
		ClickMeForFun=6,-25,-25,255,255,255,${If[!${Cursor.ID},click me,]}
  The order is TYPE,X,Y,RED,GREEN,BLUE,TEXT.
  Type is currently any combination of the following:
    1 - Display in non-full screen mode
    2 - Display in full screen mode ("f10 mode")
    4 - X,Y is based on cursor location
  e.g. 1+2+4=7.  7 means all 3 of the above. 6 means 2 and 4. 3 means 1 and 2. Just add them
    together.  There is no way to end up with a number that could mean two different 
     combinations.
  Red, Green and Blue are each from 0 to 255. 255,255,255 is white, 0,0,0 is black.
  ** There is currently not a command to add or remove these from inside the game.  One will
     probably be added soon.  The plugin will automatically re-load the list from the .ini
     when you modify and save the .ini.
- Seeing as how the mouse functions perfectly fine in full screen mode, I've forced the cursor
  to display the same as it would in UI-visible mode.  The only difference is the item is not
  displayed on your cursor.  With MQ2HUD and the "CursorItemName" example, you could have it
  show the name of the item attached to your cursor in full screen mode (use type 6 if you
  want it to follow your cursor in full screen mode only).
- Added custom spawn captioning.  Set them in MacroQuest.ini [Captions].  Empty the setting 
  to make it use EQ's default.  By default our player caption is slightly different -  
  it shows their guild status if they are officer or leader of a guild.  Pet captions are a
  little different also - it will display the name of its master if it is a player's pet.
  Use "\n" to mean a new line when setting captions.
- Added MQ2Data Top-Level Object:
  spawn NamingSpawn: Spawn currently being captioned.  NULL when not captioning.
- Added/changed MQ2Data members:
  bool spawn.LFG: LFG?
  bool spawn.Linkdead: Linkdead?
  bool spawn.Trader: Trader?
  bool spawn.AFK: AFK?
  string spawn.AATitle: Actual AA title (e.g. Sage, Impresario, etc)
- MQ2Map adds Top-Level Object: spawn MapSpawn: If your cursor is on a spawn on the map, this is it
- Fixed ticks.Time

02 May 2004 by Lax:
- Added a popup box to the crash detected hook, explaining that the user should visit the
  MQ2::Bug Reports forum.
- Removed EasyDetour and EasyClassDetour.  There is a single replacement for the both of them
  called EzDetour.  EzDetour(offset,detour,trampoline).  Examples (which are all over in MQ2Main
  and plugins):
  EzDetour(ProcessGameEvents,Detour_ProcessGameEvents,Trampoline_ProcessGameEvents);
  EzDetour(CEverQuest__EnterZone,CEverQuestHook::EnterZone_Detour,CEverQuestHook::EnterZone_Trampoline);
- Renamed the REVERSE_DETOUR functions to reduce confusion.  These really had nothing to do
  with detours.  What it really does is lets you call a function at a given offset.  
  So, they are now:
  FUNCTION_AT_ADDRESS(function,offset)
  FUNCTION_AT_VARIABLE_ADDRESS(function,variable)
  FUNCTION_AT_VIRTUAL_ADDRESS(function,offset)
- Fixed small issue in MQ2Data parser
- Fixed /memspell not finding some spells correctly (Heroic Bond for example)
- MQ2 will now fix the string table by removing extraneous spaces from the end of strings,
  since EQ isnt smart enough to do it itself.  This fixes issues such as finding the AA
  "Bestial Alignment", which has two spaces after it in eqstr_us.txt.  
  ${AltAbility[Bestial Alignment]} previously did not work because of this issue.  It works
  now because of this fix.
- Added MQ2Data types
  raid, raidmember   (see reference for members)
- Added MQ2Data Top-Level Objects
  raid Raid: Raid you're in...
- Added/changed MQ2Data members
  string ticks.Time: Time in the form hh:mm:ss (if there are no hours, the form will be mm:ss)
  int skill.MinLevel: Minimum level for your class
  int skill.StartingSkill: Base skill level for your class
  int skill.SkillCapPre50: Skill cap pre-50 for your class
  int skill.SkillCapPost50: Skill cap post-50 for your class
  int character.FreeInventory: Count of free inventory spaces
  int character.FreeInventory[n]: Count of free inventory spaces of at least this size (giant=4)
  int character.LargestFreeInventory: Size of largest free inventory space
- LaxColor is now defaulted to off since most people now realize that it exists.  If you wish
  to turn it back on, LaxColor=1 in MacroQuest.ini.
- Fixed spawn.NearestSpawn issues
- Fixed ${Ini} absolute path issues
- Fixed some other issues that were brought up on the boards

30 Apr 2004 by Lax:
- Added MQ2Data members
  int macro.Params: Number of parameters to current sub

29 Apr 2004 by Lax (even more):
- Added option so that MQ2Data errors and normal errors (but not syntax errors that show
  /usage etc) will dump the macro stack.  This is ON by default.  To turn it off, set
  AllErrorsDumpStack=0 in MAcroQuest.ini section [MacroQuest]
- Added option so that the above errors will end the macro, aka makes them "fatal".  This is
  OFF by default. To set this, set AllErrorsFatal=1 in MacroQuest.ini section [MacroQuest]
- If for some reason you need to clear all GLOBAL SCOPE variables,
  /deletevar * global
  will do the trick.  For example, after you try to run an old macro and then realize the
  global scope changed and /zapvars no longer exists, but you can't make the variables outer
  scope because theyre already in global scope and you dont want to delete them all one by
  one....
- Perfected Multi-dimensional arrays

29 Apr 2004 by Lax (more):
- Fixed Multi-dimensional arrays

29 Apr 2004 by Lax:
- Fixed SPAWNINFO structure.
- NOTICE: Some MQ2Data members are currently MIA.  They may come back soon.  These include:
  character.Hunger
  character.Thirst
  character.GukEarned
  character.MMEarned
  character.RujEarned
  character.TakEarned
  character.MirEarned
  character.LDoNPoints

27 Apr 2004 by Lax (more):
- MQ2DataVars is now default.  Share and enjoy, share and enjoy!
- Fixed timer type member availability
- Added MQ2Data type: altability
- Added MQ2Data Top-Level Objects:
  altability AltAbility[n]: Alt ability by number
  altability AltAbility[name]: Alt ability by name
- Changed/Added MQ2Data Members:
  float spawn.MaxRange: Max distance from this spawn for it to hit you
  float spawn.MaxRangeTo: Max distance from this spawn for you to hit it
  int character.AltAbility[n]: Alt ability rank by number
  int character.AltAbility[name]: Alt ability rank by name
  bool character.AltAbilityReady[n]: Alt ability readiness by number
  bool character.AltAbilityReady[name]: Alt ability readiness by name
  int character.AltAbilityTimer[n]: Alt ability reuse time (seconds) left by number
  int character.AltAbilityTimer[name]: Alt ability reuse time (seconds) left by name
  spell character.CombatAbility[n]: Combat ability by number in your list (not same as others lists!)
  int character.CombatAbility[name]: Combat ability number in your list by name (not same as others lists!)
- Added an option to MQ2Map:  The "TargetMelee" mapfilter when set to 1 will draw a circle 
  representing how close to this spawn you must be to hit it.  Set to anything but 0 or 1 
  will draw a circle representing how close to this spawn you must be for it to hit you.
- Added some flavor for error messages.  Set LaxColor=0 in MacroQuest.ini [MacroQuest] to
  disable.  It's on by default or it wouldn't be as fun.

27 Apr 2004 by Lax:
- spawn.MaxRange now uses the proper melee range algorithm
- Fixed a crash bug in the Ini TLO
- Added proper relative/absolute path detection to /ini
- Fixed window.Checked
- Added MQ2Data members:
  int window.Style: Window style code
  bool window.Enabled: Enabled?
  bool window.Highlighted: Highlighted/mouse over?

26 Apr 2004 by Lax:
- Various error messages have been updated to be more specific.
- Fixed "outer" scope not being cleared by /endmacro.  Removed /zapvars in MQ2DataVars 
  since all it did was clear the outer scope.  It's no longer needed because the old global
  scope is separated into two scopes in MQ2DataVars.
- Fixed FindInvSlotForContents function (used in item.InvSlot.  item.InvSlot will no longer
  give NULL for valid items in your inventory/bank)
- Sub parameters (including those for events) are now allowed to have a type other than 
  string, when MQ2DataVars is enabled, like so:
  Sub MySub(int A, string B, float C)
- Fixed out-of-bounds by 1 crash in MQ2DataVar arrays
- MQ2FPS now allows you to disable the framerate display with /fps off (/fps on to enable again)
- MQ2EQIM feature set adjusted.  Now keeps your list of buddies (per character) and the last
  time they were seen online or on eqim (by any character).  Your friends list is automatically
  added as buddies.  A member was also added to the "buddy" type EQIM adds, time buddy.LastSeen.
- ${Ini} will allow either relative or absolute paths.  Also slightly modified what it gives
  you when you try to get a list of keys and supply a default (previously it would ignore
  the default and give NULL if there was no list).
- Improved parsing of " and ] within MQ2Data indexing.
  ${String["hi"]}: hi
  ${String["hi","hi"]}: hi,hi
  ${String[""hi""]}: "hi"
  ${String[hi"hi"hi]}: hi"hi"hi
  ${String[[MQ2] - Hi]}: [MQ2] - Hi
  ${String["""]}: "
- MQ2BzSrch plugin is now updated for MQ2Data.
  MQ2Data reference for MQ2BzSrch (because it's a plugin, not in main reference)
  -------
  Types added- bazaar, bazaaritem
  TLO's added- bazaar Bazaar: Bazaar search info
  ---
  bazaar 
  Members:
  ...bool Done: Search complete?
  ...int Count: Result count
  ...bazaaritem Item[n]: Result info by index (1-based)
  To String: Same as Done
  ---
  bazaaritem 
  Members:
  ...string Name: Item name
  ...spawn Trader: The guy selling it
  ...int Price: Price the guy is selling it for
  ...int Quantity: Number of this item this guy has
  ...int ItemID: The item's ID number
  ...int Value: Value of the item?
  To String: Same as Name
  -------
  
25 Apr 2004 by Lax (revision C changes):
- Fixed merchant.Item[=name] and corpse.Item[=name]
- Fixed character.PctEndurance
- Fixed problems with tabs in macros, and also with leading and trailing whitespace
- MQ2DataVars is READY.  Keep an eye out for important announcements about this!
- Added MQ2Data types for MQ2DataVars: array, timer

25 Apr 2004 by Lax (even more):
- Hopefully fixed crash caused by fixing the "LastCommand" stuff...
- Added MQ2Data Members:
  int character.MaxEndurance: Max endurance
  int character.PctEndurance: Percent endurance

25 Apr 2004 by Lax (more):
- Fixed spawn.NearestSpawn
- Changed buff.ID so that it gives the song # or buff # instead of the spell's ID

25 Apr 2004 by Lax:
- Fixed once and for all the /itemnotify and /notify crashes
- Fixed the rendering rate defaults (will no longer flicker like a strobe light ;)

23 Apr 2004 by Lax (more):
- Added MQ2Data Type:
  skill (see reference for members)
- Added MQ2Data Top-Level Objects:
  string GroupLeaderName: group leader's name (works even if they are out of zone)
  spawn GroupLeader: group leader (only works if they are in zone)
  skill Skill[n]: Skill by number
  skill Skill[name]: Skill by name
- Added/Changed MQ2Data Members:
  spawn spawn.NearestSpawn[search]: Find the nearest spawn matching this search, to this spawn (most efficient on yourself)
  spawn spawn.NearestSpawn[n,search]: Find the nth nearest spawn matching this search, to this spawn (most efficient on yourself)
  string window.List[n]: Get the first-column text for the nth item in a list box.  Example: ${Window[TradeskillWnd].Child[RecipeList].List[1]}
  int window.List[text]: Find an item in a list box by partial match (use window.List[=text] for exact)  Example: ${Window[TradeskillWnd].Child[RecipeList].List[=Inky Shadow Silk]}
  int string.Count[char]: Count the number of occurrences of a particular character in the string
  bool window.Checked: Checked? (useful for buttons)
  string string.Left[-length]: The left ("all but" length) of the string.. Left[-1] of "Left" will be "Lef"
  string string.Right[-length]: The right ("all but" length) of the string.. Right[-1] of "Left" will be "eft"
  bool character.RangedReady: Ranged attack ready?
  bool character.AltTimerReady: Alternate timer ready? (Bash/Slam/Frenzy/Backstab.  Note that AbilityReady works fine with most of these)
  int macroquest.Running: Running time of current MQ2 session, in milliseconds
- Fixed AbilityReady for the alternate timer abilities (Bash, Slam, Frenzy, Backstab, possibly others)
- Fixed /ctrlkey /shiftkey and /altkey.  They would sometimes "stick" the key down.
- Added a notification to /notify "listselect", used to select the nth item in a list box.
  Example: /notify TradeskillWnd RecipeList listselect 1
  Use 0 to clear your selection.
- ${Group[0]} is now the same as ${Me}.  Group members are still 1-5.
- Added command to MQ2FPS:
  /render <fg|bg> <#|~#>
  Sets the foreground or background rendering rate.  This is how many out of n frames MQ2FPS
  will allow to be drawn.  You keep moving full speed, the client responds to mouse or keys,
  the UI is still drawn... but, the world itself will not be drawn as often.
  Use with ~ to draw n-1 out of n frames, or without to draw 1 out of n frames.
  e.g. /render bg ~3 will draw 2 out of 3 frames.  /render bg 3 will draw 1 out of 3 frames.

23 Apr 2004 by Lax:
- Changed top #turbo to 40, still defaults to 20
- Fixed Ini Top-Level Object again
- Fixed "enviro" slots so that they work for enviro1-10 not just 1-8

22 Apr 2004 by Lax:
- Readme.html has been removed from the zip by request of its author.  It is being worked on
  and will return.
- /selectitem GONE
- /finditem GONE
- /click functionality has been SEVERELY reduced.  It will now function given an x,y,
  and on an item or spawn (target).  Upgrade to /notify for UI interaction.
  /notify <window> <button screen id> <notification>
  example:
  /notify LootWnd DoneButton leftmouseup
  Window names and control ScreenID's are found in the XML files, and are NOT screwed up
  by custom interfaces (unless your UI does not have the button)
- Fixed item slot name discrepancies.  What was previously "primary" and "secondary" is
  "mainhand" and "offhand".  It was one thing in some places, but not in others.  Should
  be all the same now.
- Underscores(_) are again valid in variable names
- Added "STUN" to spawn.State
- Fixed Ini Top-Level Object
- ** Added/changed MQ2Data type members
  string macroquest.Error: Last normal error message (replaces $getlasterror but will NOT have the old values!)
  string macroquest.SyntaxError: Last syntax error message (usage: /blahblah)
  string macroquest.MQ2DataError: Last MQ2Data parsing error message
  spawn spawn.TargetOfTarget: Target of target (May only work in "Me": ${Me.TargetOfTarget.PctHps}, etc)
  int item.BuyPrice: Price to buy this item at this merchant
  int item.SellPrice: Price to sell this item at this merchant
  item merchant.Item[name]: Finds an item by partial name at this merchant (use merchant.Item[=name] for exact)
  item corpse.Item[name]: Finds an item by partial name in this corpse (use corpse.Item[=name] for exact)
  float character.PctGroupLeaderExp: Group leadership exp as a %
  float character.PctRaidLeaderExp: Raid leadership exp as a %- bool character.Stunned: Stunned?
  bool spawn.Sitting: Sitting?
  bool spawn.Standing: Standing?
  bool spawn.Ducking: Ducking?
  bool spawn.Binding: Binding wounds?
  bool spawn.Feigning: Feigning?
  bool spawn.Invited: Invited to group?
  bool class.PetClass: Pet class? (shaman, necromancer, mage, beastlord)
  bool class.PureCaster: Pure caster? (can gate!)
  bool class.CanCast: Can usually cast? (not melee only)
  bool class.DruidType: Druid/Ranger?
  bool class.ShamanType: Shaman/Beastlord?
  bool class.NecromancerType: Necromancer/Shadowknight?
  bool class.ClericType: Cleric/Paladin?
  float math.Sqrt[formula]: The square root of formula
- New MQ2Data type "plugin"
- New TLOs
  plugin Plugin[name]: Finds plugin by name
  plugin Plugin[n]: Plugin by number, starting with 1 and stopping whenever the list runs out of plugins.
- Fixed LastSpawn[n] and LastSpawn[-n], also added them to reference.
- New command: /combine <pack> - hits combine on this container
- New command: /drop - drops item on cursor
- New command: /clearerrors - clears each of the "last errors"

21 Apr 2004 by Lax:
- Fixed if/newif

20 Apr 2004 by Lax:
- /if is now GONE.  /if is now the same as what /newif was.  /newif is aliased to /if.
- /sendkey and /press are now GONE.  Please update to /keypress, which as of 15 Apr 2004 allows
  pressing key combinations as well as the actual command.  Example:  /keypress alt+f
- /filter macros will now hide the output of /endmacro (if successful) and /zapvars (always)
- MQ2Labels updated for MQ2Data
- Fixed time.Year and time.Date
- Fixed charm invslot (number 0)
- Fixed ${If[]} handling of conditions
- Fixed FindItemCount to give the number of individual items rather than stacks
- MQ2EQIM plugin (which notifies you when someone on your EQIM buddy list changes) now keeps
  track of your buddy list and adds a MQ2Data type and Top-Level Objects:
  ** buddy type
  Members:
  ...string Name: Buddy's name (may be fennin.Name or just Name, depending on how you added them)
  ...string Status: "Removed from list",  	"Offline",	"EQIM",	"EQIM (AFK)",	"Unknown Status(4)",	"Playing",	"Playing (AFK)"
  ...int StatusID: Numeric representation of the above (0,1,2,3,4,5,6)
  To String: Same as Name
  ** Top-Level Objects
  buddy Buddy[name]: Info on buddy with this name
  buddy Buddy[n]: Buddy with this index number in the system
  int Buddies: Size of the buddy index (will not necessarily be equal to the number of buddies, but n in Buddy[n] will never exceed this number)
- Added Top-Level Object:
  int FindItemBankCount[name]: Count of items in bank by partial name match.  FindItemBankCount[=name] will find exact
- Changed "character" member "PlatShared" to "PlatinumShared"

19 Apr 2004 by Lax:
- ** MQ2DATA PHASE TWO ** If something is missing from MQ2Data it's because you never opened
  your damn mouth.  If you need something in MQ2Data whether it was previously available or
  not, speak up.  You're on your own if you want to figure out how to enable MQ2Parm at this
  point, good luck (I'm making it difficult on you so you will get your ass in gear)!  The
  readme is not yet updated.
- Fixed alerts being missing from SpawnMatchesSearch.  They worked in some spawn searches but
  not others.
- character.Inventory now uses the same numbering as InvSlot
- Added/changed MQ2Data members
  invslot invslot.Pack: Container that must be opened to access the slot with /itemnotify
  int invslot.Slot: Slot # inside that pack
  string invslot.Name: For inventory slots not inside packs, the slot name
  string spawn.ConColor: GREEN, LIGHT BLUE, BLUE, WHITE, YELLOW, RED
  int character.PetBuff[name]: Finds slot with this spell name
  spell character.PetBuff[n]: The spell in this slot (1-29)
  int character.GroupLeaderExp: Group leadership exp
  int character.GroupLeaderPoints: Group leadership points
  int character.RaidLeaderExp: Raid leadership exp
  int character.RaidLeaderPoints: Raid leadership points
  int character.Platinum: Platinum
  int character.Gold: Gold
  int character.Silver: Silver
  int character.Copper: Copper
  int character.PlatinumBank: Platinum in bank
  int character.GoldBank: Gold in bank
  int character.SilverBank: Silver in bank
  int character.CopperBank: Copper in bank
- New MQ2Data Top-Level Objects
  int FindItemCount[name]: Count of items on character by partial name match.  FindItemCount[=name] will find exact
- MQ2FPS plugin now adds these Top-Level Objects (these are NOT in the reference because they
  are from a plugin not built in):
  float FPS - Current frames per second
  int MaxFPS - Current max frames per second
  bool Foreground - Is this session in the foreground?

17 Apr 2004 by Lax:
- Fixed "window" data type's "To String"
- Fixed all VC6 project files so PDB/MAP files are produced for debugging
- New MQ2Data type
  invslot - Inventory slot (not necessarily "in your inventory", this may be in merchant window, bank, etc)
  see reference for current list of members.
- Added/changed MQ2Data members
  invslot item.InvSlot: Inventory slot for this item
- New MQ2Data Top-Level Objects
  invslot InvSlot[name]: Inventory slot by name
  invslot InvSlot[#]: Inventory slot by number
  item FindItem[name]: Find item on character by partial name match.  FindItem[=name] will find exact
  item FindItemBank[name]: Find item in bank by partial name match.  FindItemBank[=name] will find exact
  item SelectedItem: When using a merchant, etc. this is the selected item
  
15 Apr 2004 by Lax:
- Fixed /destroy crash
- Fixed "random" crash on zoning with MQ2Map loaded, due to a bug in the recently revised ConColor
- Fixed /cast issue casting "Bane" instead of "Bane of Nife" etc
- Fixed spell manager structure
- Fixed /doortarget id #, which would invariably crash
- Fixed and changed /keypress so that it also accepts key combinations, and will not crash no matter how hard you try.
  /keypress with key combinations will have the same effect as /keypress using the command name, it will not
  type the key into the chat window.  If you need to type into a window specifically (chat windows, social edit, etc)
  /keypress <key> chat
  example: /keypress e chat
  Note that you cannot use both hold and chat, and chat is only valid for the key not a command name.
  ** /sendkey and /press will give a warning the first time per session they are used that they are
     now completely obsolete and you should switch to /keypress.  they will be removed soon.
- Fixed and tested "heading" type's "To String"
- /newif will no longer quietly execute the "false" branch when it fails to parse the conditions.  The conditions
  after parsing MQ2Data/MQ2Parm will be displayed in an error message, and the macro will end.
- Other minor issues fixed

14 Apr 2004 by Lax:
- Fixed MQ2KeyBinds
- Fixed MQ2ChatWnd.ini

13 Apr 2004 by Lax:
- Fixed ! in Calculate (worked most of the time, but not in some special cases)
- Fixed heading's "To String" to give the correct heading.  heading.Name/heading.ShortName were fine
- Fixed time.Time12 to be 12 hour (oops)

9 Apr 2004 by Lax:
- Fixed != in Calculate (and therefore in /newif, math.Calc, etc), and implemented ! as
  the unary NOT operator.  This gives 0 if your calculation is non-zero, or 1 if your
  calculation is zero.
- MQ2Data changes:
  -- Swapped Y and X back to being backwards-backwards or backwards-forwards, or whatever they
     originally were
  -- Added "NWU" coordinates (North/West/Up), the three positively oriented directions in EQ.  
     Spawns also have a shortcut for SED (South/East/Down).  All type member names involving 
     XYZ have a NWU complement (none necessary for the "index" bracketed part, of Heading[y,x] 
     for example)
  -- Fixed character.AbilityReady
  -- Fixed item (TO STRING)
  Top Level Objects
  * spawn LastSpawn: The last spawn chronologically.
  * spawn LastSpawn[n]: The nth from last spawn.. LastSpawn[1] is the LastSpawn.. LastSpawn[2] is 2nd from last, LastSpawn[3] is 3rd from last, and so on
  * spawn LastSpawn[-n]: The nth from FIRST spawn.. LastSpawn[-1] is you, LastSpawn[-2] is the second spawn, LastSpawn[-3] is the third spawn, and so on
  Additions/Changes to existing types:
  * heading Heading[y,x]: Heading from player's current position to y,x
  * float math.Distance[y,x,z:y,x,z]: Performs distance calculations in 1, 2 or 3 dimensions.
    Any not given will default to your character's current x y or z.
  * bool item.Stackable: Stackable?
  * bool merchant.Open: Merchant open?
  * float merchant.Markup: The amount used to calculate item values on this merchant 
    (Markup is what your charisma, faction, etc change).  Markup*Cost=Merchant's sell price.
    Cost*(1/Markup)=Your sell price. Markup of 1.05 is highest no matter what, so there might
    not be any actual cap based on charisma.
  * int merchant.Items: Item count on the merchant
  * item merchant.Item[n]: nth item on the merchant  
  * bool corpse.Open: Corpse open?
  * int corpse.Items: Item count on the corpse
  * item corpse.Item[n]: nth item on the corpse
  * item character.Inventory[slotname]: Item in this slot (inventory slots only, but 
    same names as /itemnotify)
  * bool character.SpellReady[name]: Gem with this spell name ready for cast?
  * bool character.SpellReady[slot]: Spell in this gem ready for cast?

8 Apr 2004 by Lax (more)
- MQ2Data changes:
  Top level objects:
  * heading Heading[x,y]: Heading from player's current position to x,y
  Additions/Changes to existing types:
  * int item.Container: The number of slots, if this is a container
  * int item.Items: The number of contained items, if this is a container
  * item item.Item[n]: The item in this slot, if this is a container
- Item links were apparently not working in the MQ2ChatWnd, nobody reported this until now.
  Thanks people who noticed it and never reported it!  Anyway, item links in MQ2ChatWnd are
  simply stripped until I figure out the issue.  Item links in MQ2Chat still work fine.

8 Apr 2004 by Lax
- MQ2Data changes:
  - macro.Defined is now a top level object instead
    bool Defined[name]
  - Fixed all variable parsing when MQ2Parms is not on
- Fixed a major problem with /newif, should now "work as intended"
- Fixed (I think) problem with /face which let the macro continue before facing the target
  completed

7 Apr 2004 by Lax
- Changes to MQ2Data system:
  *** NOTICE: All X and Y coordinates used by the MQ2Data system have been REVERSED.
      Internally, MQ2 stays the same as it has been forever.  However, you will now
      notice that "/echo ${Me.X}, ${Me.Y}, ${Me.Z}" will give the same order as seen
      by typing /loc
  Top level objects:
  * currentzone Zone: Zone information about current zone
  * zone Zone[id]: Zone information for zone with this id
  * zone Zone[shortname]: Zone information for zone with this name
  * time Time: Your local time in real life
  * time GameTime: Game time
  * type Type[name]: Info about the type with this name
  * heading Heading[degrees]: Forms a heading type in the given direction in degrees
  * string Ini[filename,section,key,default]: Reads from an ini file.  section, key, 
    and default do not need to be given.  section and key may be set to -1 to skip them 
    and give a new value.  If section or key are not given, multiple values are read...
  Additions/Changes to existing types:
  * bool string.Equal[text]: Strings equal? Case does not count...
  * bool string.NotEqual[text]: Strings not equal? Case does not count...
  * bool string.EqualCS[text]: Strings equal? Case counts!
  * bool string.NotEqualCS[text]: Strings not equal? Case counts!
  * string string.Arg[n,separator]: Gets nth argument using separator as the separator (single character). If separator is not given, defaults to space
  * zone character.Bound: The zone you are bound in
  * int character.Skill[name]: Skill level of skill with this name
  * int character.Skill[n]: Skill level of skill with this index
  * int character.Ability[name]: Doability button number this skill name is on
  * string character.Ability[slot]: Skill name assigned to this doability button
  * bool character.AbilityReady[name]: Ability with this name ready?
  * bool character.AbilityReady[slot]: Ability on this button ready?
  * spell character.Book[slot]: Spell assigned to this slot in your spellbook
  * int character.Book[name]: Spell slot the spell with this name is assigned to in your spellbook
  * float (TOSTRING): Changed to ###.## instead of .###
  * heading spawn.Heading: (changed to "heading" type)
  * heading spawn.HeadingTo: (changed to "heading" type)
  * heading switch.Heading: (changed to "heading" type)
  * heading switch.DefaultHeading: (changed to "heading" type)
  * heading switch.HeadingTo: (changed to "heading" type)
  * heading ground.Heading: (changed to "heading" type)
  * heading ground.HeadingTo: (changed to "heading" type)
  New types:
  * currentzone
  * time
  * heading
  * type
  *** Special handling is used for casting to "type", such that the new data is equal 
      to the old type, and the new type is "type".
  -- Fixed type casting so that members of the new type may be accessed as expected (this
     was incorrectly ending the parsing at the type cast until now)
- ConColor changed to take 1 parameter
- FindMount tweaked/inlined
- Changed the "RunNextCommand" to remain to TRUE until set to FALSE, so only cases where
  the next command should not be run need to be explicitly set (this should increase
  macro performance in most cases, but some commands may need to be correctly updated)
- /declare will no longer spam you if the variable previously existed.  If the variable
  previously existed, it will be quietly deleted and replaced by the new one.  This might
  cause some people problems but they will learn quickly ;)
- New command /deletevar <name> - Deletes an existing variable.  Gives a message if the
  variable did not exist, but no message if the variable did exist.
- /notify modified to work for clicking off buffs and other things it would not previously
  work for.  However, items must still be clicked using /itemnotify.  /notify now accepts
  all of the same clicks as /itemnotify (leftmouse,leftmouseup,leftmouseheld,etc)

31 Mar 2004 by Lax (more)
- Fixed character member PctExp
- Added character members:
  float PctAAExp: % AA exp..
  bool Moving: Moving? (includes the mount hack so you're not constantly "moving" when sitting on a mount)
- Added spawn members:
  bool Swimming: Swimming?
  bool Underwater: Underwater?
  bool FeetWet: Feet at least wet?
  int Animation: Animation id
  int Holding: Holding id
  float Look: Look angle
- Added "gm" to standard searchspawn, works with anything that uses that including MQ2Map commands,
  /target, ${Spawn[search]}, etc
- Modified the if block parsing in FailIf so that it only looks for } and { as the first and last characters on a line

31 Mar 2004 by Lax
- Fixed /newif so variables/parms/data get parsed
- string.Mid and string.Find are now 1-based instead of 0-based
- Calculate (and stuff that uses it) now supports parentheses, and will treat 
  "NULL" and "FALSE" as 0, and "TRUE" as 1
- Added float math.Distance[x,y,z:x,y,z]: Performs distance calculations in 1, 2 or 3 dimensions.  Any not given will default to your character's current x y or z.

30 Mar 2004 by Lax
- Added a distance-sorted spawn list in MQ2Main
- Added MQ2Data top-level object:
  * spawn NearestSpawn[n]: The nth nearest spawn
  * spawn NearestSpawn[search]: The nearest spawn matching this search (same as Spawn[search])
  * spawn NearestSpawn[n,search]: The nth nearest spawn matching this search

29 Mar 2004 by Lax (even more)
- Added /ctrl /alt and /shift commands:
  /ctrl <command>
  /alt <command>
  /shift <command>
  These execute a command while telling the window manager that a key is pressed.  This can
  be used in conjunction with /itemnotify to pick up a stack or a single item... example:
  pick up a single item from a stack: /ctrl /itemnotify pack1 leftmouseup
  pick up an entire stack: /shift /itemnotify pack1 leftmouseup
  Because they execute a command, they can also be used together, as in 
  /ctrl /alt /shift <command>...
- Fixed character.Buff[slot]
- Fixed character.Gem[name]
- Fixed If top level object crashing on false
- Added MQ2CHAT bind to start typing in the MQ2 Chat Window, also added MQ2CSCHAT bind which
  gets forced to bind as "/" at character select, and does not exist while in game.
- Added /timed command, which executes a command after a specified duration (in deciseconds like pause)
  /timed <deciseconds> <command>
  Example: /timed 10 /echo 1 second has passed
  Note: This does NOT "pause" successive commands.
- Added /newif command, which ONLY does numeric compares -- use MQ2Data string comparison to 
  turn string compares into numeric compares -- and note that this means you do NOT use the "n"
  stuff.  This will replace the current /if command in MQ2Data phase 3.  Until then, you may 
  "/alias /if /newif" if you wish to use newif exclusively.
  /newif <calculations> <command>
  <calculations> gets evaluated down to a single term from however many terms there are (You
  may use && and || freely.) *BE WARNED* that in calculations parentheses are still not
  officially supported.. that's on my TODO list.
  

29 Mar 2004 by Lax (more)
- Added < <= == >= > && & || | to the Calculate function (someone rewrite if please... 
  fail if zero, fall through if non-zero)
- MQ2Data updates:
  * Added top level object: string If[conditions,whentrue,whenfalse]
  * Added type corpse, top level object: corpse Corpse
  * Added top level object: item Cursor
  * Added string members:
    - int Compare[text]: -1 if the string is alphabetically before text, 0 if equal, 1 if after. Case does not count.
    - int CompareCS[text]: -1 if the string is alphabetically before text, 0 if equal, 1 if after. Case counts.
  * Lots of others...
- Fixed MQ2Parm slowness from debug spew if MQ2Data is also in use
 
29 Mar 2004 by Lax
- Phase 1 of MQ2Data system rollout begins! Please start updating macros, custom uis, plugins,  
  etc to use this sytem.
  To use MQ2Data modify these MQ2Main lines
   #define USEMQ2PARMS
   //#define USEMQ2DATATYPES  
  Uncomment the USEMQ2DATATYPES #define to allow MQ2Data parsing.  If you wish to disable
  MQ2Parms parsing, comment the USEMQ2PARMS #define.  You may use both or just one.
  See this thread to see how MQ2Parms will be phased out 
      http://macroquest.sourceforge.net/phpBB2/viewtopic.php?t=6008
  See this thread to see how to use MQ2Data instead 
      http://macroquest.sourceforge.net/phpBB2/viewtopic.php?t=6022
  Specific information for plugins to add types and Top Level Objects will be available soon
- Moved a few functions to MQ2Inlines.h
- Fixed a performance issue in GetSpellByName
- Trying to detour an already detoured address will now fail instead of crashing
- Added some offsets to eqgame.h (mostly CListWnd), removed some offsets that were virtual
  functions and probably not used anyway.  If you are adding basic UI offsets to your plugins
  ask to have them in eqgame.h please (people were doing this with CListWnd offsets).

23 Mar 2004 by Amadeus
- Removed DisplayZem function and calls and $zone(ZEM)  ...rest in peace.

20 Mar 2004 by Lax
** eqgame.ini is no longer used/needed by MQ2!  All offsets have been integrated 
   into eqgame.h.  The client DATE/TIME are in eqgame.h also.
- Fixed /itemnotify
- Renamed the "SpawnListTail" stuff to "LocalPlayer", added "ControlledPlayer".  These are
  both EQPlayer and correspond to .. you.  If you're on a mount, the one thats moving is
  ControlledPlayer. ** Things that use PCHARINFO to get your spawn should be phased out.
- Added /docommand
- Added /dosocial
- Made some minor improvements in MQ2UserVars

16 Mar 2004 by Lax (after patch)
- Changed exe date/time checking to use the date/time strings compiled into the exe

16 Mar 2004 by Amadeus
- Updated the Spell Information Window with code provided by Koad in his Spell Search
  Plugin.

16 Mar 2004 by Lax
- Fixed remaining issues with binds and custom binds

15 Mar 2004 by Lax (more)
- Added remaining, un-named EQ binds to the MQ2 bind system.  Some are still unknown, and
  some I'm surprised exist enabled in the client in the first place, and you should be 
  careful with those...
- Added /dumpbinds command.  Example: "/dumpbinds bill" will dump all current binds to
  Configs\bill.cfg to be loaded later.
- Added "/filter mq [on|off]", which prevents anything at all from being displayed by MQ2
- Added "/squelch <command>", which does the following:
  * Step 1: turns mq filter off
  * Step 2: executes the command
  * Step 3: turns mq filter back to the state it was in before step 1
  In other words, executes a command and prevents any output from the command
  
  ** It is recommended that you do this in your .CFG files that you dont want to see output from
  /squelch /filter mq on
  < do your stuff here>
  /squelch /filter mq off
- I promise this is my last update for a few days at least!

15 Mar 2004 by Lax
- Fixed some bugs with binds and the MQ2CustomBinds plugin
- Modified bind system so that the same key can be bound to an MQ2 bind and an EQ bind and
  both will work
- Added a system to run .CFG files, similar to quake .cfg files I suppose.  The file must
  contain commands the same as you would use them normally.  Each command will be executed
  in order, there are NO macro blocks, events, etc, in a cfg file.
  * CFG files may be present in <release>\Configs\, in <release>\, or potentially in the
    EverQuest directory.  Note that <release> would be the same as wherever your Macroquest.ini is.
  * Added /loadcfg <filename> command.
  * Plugins can use LoadCfgFile(filename)
  * Configs that are automatically loaded:
		AutoExec.CFG - Executed on the first pulse
		CharSelect.CFG - Executed when you are put at character select
		<server>_<character>.CFG - Executed when this character enters the world
		<mapshortname>.CFG - Executed when you zone into this zone
		<pluginname>-AutoExec.CFG - Executed when this plugin is loaded (after its initialization is complete)

		Examples of file names:
		tallon_lordsoth.cfg - character
		oot.cfg, soldungb.cfg, soldunga.cfg, take.cfg - maps
		MQ2Map-AutoExec.CFG, MQ2ChatWnd-AutoExec.CFG - plugins 

14 Mar 2004 by Lax
- Added /ranged [#] command.  Run with no parameters to do a ranged attack on your current
  target, or with a spawn ID to do a ranged attack on that spawn.
- Modified MQ2Spawns, hopefully this will solve the remaining stack corruption problems...
- Introduction of the new MQ2 key binding system
  * New command /bind <list|eqlist|[~]name <combo|clear>>
  * "/bind list" will list all MQ2 binds
  * "/bind eqlist" will list all non-MQ2 binds
  * The following work on both MQ2 and EQ binds the same way
  * "/bind <name> <combo>" will set a bind's normal key combo (example: "/bind forward e")
  * "/bind ~<name> <combo>" will set a bind's alternate key combo (example: "/bind ~forward up")
  * Combos use any combination of "alt", "shift" and "ctrl" plus a key.  Specific keys follow the 
    same rules as the /sendkey and /press 
    Example combos:
    shift+n
    alt+shift+f1
    -- Always separate with +'s or spaces.
  * Note that "clear" combo is to clear the bind, and also note that changing EQ binds will not
    immediately update the display in the options window.  Change the bind list selection in the
    options window to see the updated keys.
  * /keypress works the same way with all MQ2 and non-MQ2 binds
  * API additions include:
     BOOL AddMQ2KeyBind(PCHAR name, fMQExecuteCmd Function);
     BOOL SetMQ2KeyBind(PCHAR name, BOOL Alternate, KeyCombo &Combo);
     BOOL RemoveMQ2KeyBind(PCHAR name);
     BOOL ParseKeyCombo(PCHAR text, KeyCombo &Dest);
     PCHAR DescribeKeyCombo(KeyCombo &Combo, PCHAR szDest);

     typedef VOID    (__cdecl *fMQExecuteCmd)(PCHAR Name,BOOL Down);
     -- Note: This function will be called when the key goes down as well as up.  If you create a
        MQ2 bind function make sure to account for this.  The "Name" parameter is the name of the
        bind
  * /hotkey command is now removed, the new bind system will take over
- MQ2CustomBinds plugin is now live.  This plugin allows you to specify custom commands to execute
  on a key combination.  There may be a command for the keys being pressed (down), and another for them
  being released (up).
  * /custombind <list|add <name>|delete <name>|clear <name><-down|-up>|set <name><-down|-up> <command>>
  * "/custombind list" will list all of your custom binds names and commands (the key combinations must be set using /bind)
  * "/custombind add <name>" will add a new bind name for use here, with /keypress, /bind, etc.
  * "/custombind delete <name>" will remove a custom bind
  * "/custombind clear <name><-down|-up>" will clear a specific command for a custom bind.  If up or down is not specified, defaults to down.
  * "/custombind set <name><-down|up> <command>" will set a specific command for a custom bind.  If up or down is not specified, defaults to down.
  * Example usage (NOTE: MQ2's very first bind command is "RANGED" so you do not need to do this, but for example...)
    /custombind add mybind
    /custombind set mybind /ranged
    /bind bind n
    -- To set the real RANGED bind, do "/bind ranged <key>"
   
13 Mar 2004 by Lax
- Added /multiline <delimiter> <command[delimiter[command[delimiter[...]]]]>
  Executes all commands.  Example: /multiline ; /stand;/rude;/sit
- Wave 3 of MQ2Map updates:
  * Added /maphide command to hide spawns on the map given a search string.  Hidden spawns
    only take effect until the mapped spawns are re-generated (such as changing some map
    filters)
    "/maphide reset" will re-generate the spawn list.
  * Added /mapshow command, to explicitly show spawns on the map given a search string.
    These will only take effect until the mapped spawns are re-generated (same as maphide).
    "/mapshow reset" will re-generate the spawn list.
  * Added /mapclick command and special right click commands (hold a combination of
    shift, control, left alt, right alt to execute a special command when right clicking
    on a spawn).  Defaults include left-alt right-click to highlight and control r-click to
    hide.
  * Added Group filter (requires PC) and NormalLabels filter (shows/hides non-MQ2 labels)  
- Added notice when a new XML file is added to the list while in game.  The notice
  says which file was added and that the user must reload the ui for it to take effect.
- Fixed crash when adding a custom XML file that doesnt exist in the default UI directory
- Fixed $macro crash

12 Mar 2004 by Lax
- MQ2Map overhaul completed
- Fixed /keypress crash bug when you're an idiot and type an invalid command name :)
- Fixed client override problem

11 Mar 2004 by Lax 
- I forgot to update the changes.txt file, so Amadeus is putting this here
  so the masses will know I added/fixed/updated a bunch of shit.

11 Mar 2004 by Amadeus
- Updated tons of shit too
- MQ2 should be fully functional now with the 3/10 patch

11 Mar 2004 by Plazmic
- Complete rewrite of the way Guild ID tags are handled
- __Guild offset now points to the GUILD structure instead of the random offset
  that shows the beginning of the list
- GUILD structure added to eqgame.h
- EQADDR_GUILDLIST should now be pGuildList always
- Added EQSWITCH structure
- Updated DOOR & GROUNDITEM structs to reflect the new EQSWITCH struct

08 Mar 2004 by Lax
- Wave 2 of MQ2Map upgrades:
  /mapnames command added to change the naming scheme used for spawns on the map
  Map filters/options system updated, each option can now have a "requirement"
  When listing filters with /mapfilters, only options that have requirements are displayed
  Concolor filter is now PCConColor and NPCConColor
  Target filter now has 3 separate options - Target, TargetLine, TargetRadius

05 Mar 2004 by Amadeus
- Put in new CXWnd offsets [vzmule]
- Added structs in EQUIStruct.h for the Guildwindow and RaidWindow (work in progress)

05 Mar 2004 by Lax
- MQ2Map upgrade is now live.  It uses the new OnAddSpawn/OnRemoveSpawn API to increase efficiency.
  /highlight <spawn search string> will temporarily highlight these spawns
  /highlight color <#> <#> <#> will set the highlight color
  /highlight reset to reset the currently highlighted spawns
  Right clicking on spawns on the map now targets them
- /keypress command is now live. /keypress <name> <hold> like so:
  /keypress clear_target
  /keypress forward hold
  To release the key after holding, simply use the command again without the hold keyword.
- /itemnotify command is now live.  /itemnotify <slot> <notification>, or /itemnotify in <bag slot> <#> <notification>
  Bag slots are pack1-8, bank1-16 (and sharedbank1-2 and trade1-8 but these are not yet implemented in /itemnotify)
- Added OnAddGroundSpawn/OnRemoveGroundSpawn to plugin callbacks
- Fixed random crash on exit dealing with breakpoints

01 Mar 2004 by Zaphod
- Another bugfix in MQ2DetourAPI.cpp. 

29 Feb 2004 by Zaphod
- More optimization of ParseMacroParameter() and some of the parameter routines it calls.
- Minor bugfix in MQ2DetourAPI.cpp. 

28 Feb 2004 by Lax
- Added API to automatically maintain a list of all initialized windows 
  This will only have the most recent one initialized for each "screen item" name
  Functions are in place to add/remove windows to the list with different names, etc.
- Added /notify and /windows commands
- eSpawnType enum (NONE,PC,MOUNT,PET,NPC,CORPSE,TRIGGER,ITEM) and GetSpawnType function 

28 Feb 2004 by Zaphod
- Major optimization/cleanup of ParseMacroParameter().

22 Feb 2004 by Amadeus
- Updated readme.html [thanks Wassup!]

22 Feb 2004 by Lax
- Updated license notice in each source file for 2004 and made sure each had one
- Added MQ2Spawns.cpp, which gives us hooks when a spawn is added to or removed from a zone.
  This could be used, for example, to increase the efficiency of MQ2Map.
  PLUGIN_API VOID OnAddSpawn(PSPAWNINFO pNewSpawn)
  PLUGIN_API VOID OnRemoveSpawn(PSPAWNINFO pSpawn)
  
19 Feb 2004 by Amadeus
- General Cleanup and offset updates for 02/18/2004 patch
- Added Endurance to CHARINFO and $char(endurance,cur)  [Teh_ish]

17 Feb 2004 by Amadeus
- Added initial EQTRADESKILLWINDOW & EQTRADESKILLRECIPE struct
- Added pet window to the /windowstate command (ie:  /windowstate pet open/close)
- Added initial EQPETINFOWINDOW struct 
- Updated the mq2irc plugin to have the new irc server information
- Added a bunch of new parameters:
  * $pet(buff,"<spellname>")   [returns buff slot number]
  * $pet(buff,#,id)            [returns the spellID for the buff slot # given]
  * $pet(buff,#,name)          [returns the name for the buff slot # given]
  * $pet(level)
  * $pet(id)
  * $pet(x)
  * $pet(y)
  * $pet(z)
  * $pet(name)
  * $pet(class)
  * $pet(race)

16 Feb 2004 by Amadeus
- Fixed EQ_CONTAINERWND_MANAGER  (which fixes $envopen )
- Added "Frenzy" to skills.h [daerck]
- Fixed EQLOOTWINDOW struct (which fixes $corpse(empty) and $corpse(has,xxx)

15 Feb 2004 by Amadeus
- 'Grouped' location fixed in CHARINFO (thereby fixing $char(grouped))
- Fixed WhoFollowing in Actorinfo (thereby fixing $char(following)
- Added IsABoat to Spawninfo
- Went ahead and added the dx9.0 dinput.h to the cvs to be ready for next patch
  * As far as I can tell, the changes between 8.1 and 9.0 for dinput.h are VERY
    minimal.

14 Feb 2004 by Amadeus
- Fixed a LOT of wrong offsets in eqgame.h
- Added four offsets to eqgame.h:
  * pinstTextMessageWnd 
  * pinstCDynamicZoneWnd 
  * pinstCTargetOfTargetWnd
  * pinstCTradeskillWnd 

13 Feb 2004 by Amadeus
- Added CareerFavor and CurrFavor to CharInfo [Macrofiend]
- Added $char(favor,cur) & $char(favor,career) [Macrofiend]

12 Feb 2004 by Amadeus
- ACTORINFO struct fixes :: fixed $char(pet)
- Added a bunch of code by ml2517
   * $char(height), $spawn(#,height), $target(height)
   * $target(maxrange), $spawn(#,maxrange)
   * $distance(y,x[,z][:y,x[,z]])

11 Feb 2004 by Amadeus
- Fixed Attacks offset in eqgame.ini
- Added an emergency placeholder in the ACTORINFO struct to fix $char(casting)
  (This structure will be fixed soon.)

11 Feb 2004 by Zaphod (dohpaZ)
- Added Beserker to the classes and Gates of Discord to the expansions.
- Fixed my name in the readme.html

10 Feb 2004 by Amadeus
- Updated structs and offsets
- Added 'favor' (Tribute Value) to ITEMINFO
- Added code to MQ2ITemDisplay to show item tribute value

09 Feb 2004 by Amadeus
- UPDATED SOURCEFORGE CVS!
- Small additions to the structs from suggestions on the message boards and
  a couple new things to the ItemDisplay plugin.

20 Jan 2004 by dkaa
    According to Pragma:
        1 bug: in the code for $rand(), there needs to be a srand(time(0));
        2 bug: in the code for $gamestate, $servername, and $loginname, the 
            value returned is 1 too high. You need to return length-1, which 
            is 8 for loginname and gamestate, and 9 for servername, this will 
            fix parsing issues.

18 Jan 2004 by Amadeus
- SpellID in _SPELLBUFF is now a DWORD vs. WORD 
- Updated SpellInfo formulas used in the itemdisplay mod
- Added Instrument mod information to the itemdisplay mod (thanks TheColonel)

17 Jan 2004 by Valerian
- Fixed _ITEMINFO struct -- minor correction to the size of one of the unknowns to realign.

11 Jan 2004 by DKAA
- Fixed the $combat to reflect the status of autoattack (Thanks Sharp of Fairlight)

7 Jan 2004 by EqMUle
- added Readme.html updated by Wassup

5 Jan 2004 by EqMUle
- Added [bzrtrader_start] and [pc_trade_yes] to locations.txt. Thanks to Zacaria for theese.

1 Jan 2004 by Lax
- Chat hook is no longer responsible for when zoning is finished or game is entered
- Added $merchant(markup)

31 Dec 2003 by Lax
- ESC no longer hides the MQ2ChatWnd or MQ2IRC windows and they are no longer closable
- Fixed STMLToPlainText
- Made MQ2Labels use STMLToPlainText to convert the tooltip tags (this means you can
  use < and > by using "&lt;" and "&gt;", respectively)

31 Dec 2003 by Amadeus
- Added $spell(xx,spelltype),$spell(xx,targettype),$spell(xx,name),$spell(xx,aerange),
  $spell(xx,pushback),$spell(xx,resisttype),$spell(xx,resistadj),$spell(xx,fizzletime)
- Removed $spawn(#,castingspellid) & $target(castingspellid)  
  [http://macroquest.sourceforge.net/phpBB2/viewtopic.php?p=33124#33124]
- Added Uninterruptable and Autocast to SPELL along with other fixes (thanks SoF & Koad)
- Added more functionality to the Spell Inspect Window.  You will now see the Effect of the 
  spell and the classes that can use it.  You might really find it interesting to 
  Alt-LeftClick on some of your buffs and find out exactly what they are doing to you!  It's
  almost like having an ingame Lucy connection -- and we owe a great deal of this functionality
  to Koad and borrowed code from his spellsearch plugin.
  
  **NOTE:  The formulas for this are still being tweaked.  If you wish to help iron these
           out, please post under Koad's thread on MQ2:Plugins board.  He is the keeper of 
           of the spell effects/slots formula. **


30 Dec 2003 by Lax
- Updated version number since it's not Christmas anymore..
- Fixed commands that werent supposed to be working at char select so they dont crash
- Removed some extraneous offsets from eqgame.h
- Fixed RemoveOurDetours() so it doesnt hang
- Add something very special that everyone will love!
- Fixed a bunch of $target(xxx) crashes when no target

30 DEC 2003 by EqMule
- fixed a couple unsigned/signed warnings when compiling in VC6

29 Dec 2003 by Amadeus
- Added Levitating and Sneaking; Fixed AARank and Linkdead in SPAWNINFO (thanks source)
- Added $char(levitating), $target(levitating), $spawn(#,levitating) -- returns TRUE or FALSE
- Added $char(sneaking), $target(sneaking), $spawn(#,sneaking) -- returns TRUE or FALSE
- Went through all macro routines and made sure that everything uses lower case 
  ie, $target(castingspellid) rather than $target(CastingSpellID).
- Added <Sneak> to the superwho (thanks vzmule/source)

29 Dec 2003 by Lax
- MQ2Auth modified.
    * MQ2Auth now produces MQ2Auth0.h instead of MQ2Auth1.h and MQ2Auth2.h
    * MQ2Auth will import existing MQ2Auth2.h into MQ2Auth0.h if MQ2Auth0.h does not
      already exist but MQ2Auth2.h (in other words, it will import your "keyring" to
      MQ2Auth0.h)
    * MQ2Auth now accepts a command line parameter telling it the path to use
- Merged BOOK, COMMON, CONTAINER structs into ITEMINFO (the individual structs no
  longer exist!)

29 DEC 2003 by EqMule
- fixed /click left item

28 Dec 2003 by Amadeus
- Added PushBack and ResistAdj to Spell struct
- Added functionality to the ItemDisplay Plugin that shows the following information
  about spells when you "examine" a spell from a gem or your spellbook: ID, Duration, 
  RecoveryTime, RecastTime, Range, AERange, PushBack, Resist Type and Resist Adjust.  
  You will notice that if a spell doesn't have any of these values, then that field 
  will not be shown at all.  (**More functionality to come later**)
- Added MQ2Bzrsearch to the VS.net solution file.

27 Dec 2003 by Lax
- Changed around plenty of stuff
- EQUIPMENT struct no longer uses names for its union members...
- SPELLLIST changed to SPELL, SPELLPOINTER changed to SPELLMGR
- Added O(1) access to GetSpawnByID
- Added O(1) access to GetSpellByID
- Most window base classes set up correctly
- MQ2ChatWnd updated to use a custom window, and allows typing in edit box.  Also shows up at char select to annoy you all.
- MQ2IRC updated to allow typing in edit box (goes to channel...)
- Tons of function offsets added for UI stuff, have fun with that
- Added functionality so commands can be set to work in-game only (will be ignored outside of game, at char select for example)

26 Dec 2003 by Amadeus
* Added szBaneDmgType (thanks to TheColonel)
* _CONTENTS tweak (thanks to TheColonel)
* "Price" added to _CONTENTS (thanks to Pragma)
* SPELLLIST update (thanks to Sharp of Fairlight)
* Updated MQ2Ext
* Added $spell(id,xxx) -- **$spell() will now accept either ID# or Name as first parameter**

25 Dec 2003 by Amadeus
* Added CastingSpellID to Actorinfo struct (thanks to Sharp of Fairlight)
* Reworked $char(casting) to use more efficient CastingSpellID
* Added $char(castingspellid), $spawn(#,castingspellid), $target(castingspellid)  
* Fixed $char(held,left), $char(held,right), $char(held,shield)
* Added $char(held,primary), $char(held,offhand) 
* Fixed $target(held,left), $target(held,right), $target(held,shield)
* Added $target(held,primary), $target(held,offhand) 
* Fixed $spawn(#,held,right), $spawn(#,held,left), $spawn(#,held,shield)
* Added $spawn(#,held,primary), $spawn(#,held,offhand)
* Added AERange to SPELLLIST struct (thanks to Sharp of Fairlight)
* More changes to ActorInfo (Timestamp stuff) thanks to Sharp of Fairlight

25 Dec 2003 by EqMule
- fixed /banklist crash
- fixed $char(ismoving) - thanks to ml2517
- added makezip.bat to make zip file creation easier...

24 Dec 2003 by Lax
- Updated offsets with correct ones
- Replaced remaining calls to AddDetour with EasyDetour and EasyClassDetour
- Updated EasyDetour/EasyClassDetour defines to explicitly cast the offset to DWORD
- Updated MQ2IRC with current version from forum
- Modified CHARINFO struct to use Inventory and InventoryArray for inventory member names.
- Fixed $lastcommand
- Fixed $char(hp,cur), $char(hp,max), $char(hp,pct)

24 Dec 2003 by Amadeus
- Fixed CHARINFO (thanks to TheColonel for new stuff)
    * CHARINFO now has:
  	+ HPBonus
	+ ManaBonus
	+ PercentEXPtoAA
	+ GukEarned
	+ MMEarned
 	+ RujEarned
	+ TakEarned
	+ LDoNPoints
- Removed Stamina from all references in parser and struct
+ Added $char(HPBonus), $char(ManaBonus), $char(PercentEXPtoAA), $char(GukEarned),
  $char(MMEarned), $char(RujEarned), $char(TakEarned), $char(LDoNPoints)
+ Updated _COMMON (thanks again to TheColonel)
   	* Added BaneDMG;
   	* Added Lore
   	* Added BaneDMGType
   	* Added InstrumentType
   	* Added InstrumentMod
   	* Added DmgBonusType
   	* Added DmgBonusVal
   	* Fixed Range
+ Added szTheme[]
+ Added szDmgBonusType[]
+ Updated ItemDisplay Plugin to include LDoN stuff (TheColonel)
+ Updated itemtypes.h with "All Instruments" as type 51 (thanks TheColonel)
+ Removed $item(lore) & $cursor(lore)
+ Added $item(LDTheme) & $cursor(LDTheme)
+ Added $item(DmgBonusType) & cursor(DmgBonusType)
+ Fixed $char(Mounted)


21 Dec 2003
+ Added MQ2Mouse2.cpp.  Don't need to compile this, it's the new mouse code.  Incomplete and inop.

21 Dec 2003 by Amadeus
- Fix for MQ2Ext

19 Dec 2003 by EqMule
+updated offsets, structs for todays patch...

15 Dec 2003 by Amadeus
- Fix for $target(sclass)
- Fix for FullClassToShort
* Thanks to Schark for these*

13 Dec 2003 by Amadeus
- Added MQ2Ext to the project

06 Dec 2003 by Lax
- Added benchmark system.
- Modified pulse behavior so that executing macro commands is separate from other pulse stuff
- Modified MQ2FPS to take the above into account (it no longer needs to know about macros)
- Updated MQ2IRC to be current with the version posted in forums
- Added /bench command which with no parameters outputs currently active benchmark stats to chat
  When used with parameters, /bench will benchmark a command.  /bench [command]
  Example: /bench /who all friends

05 Dec 2003 by Mckorr
+Fix for CTD when using /click left|right target when nothing was targetted (motd2k)

05 Dec 2003 by EqMule
+Fixed $searchspawn(pc,loc:x:y,radius:100) using Ohmz code. see
http://macroquest.sourceforge.net/phpBB2/viewtopic.php?t=3394&highlight=searchspawn+loc
for more info
+Fixed /selectitem to look in all 80 merchantslots, previously it would stop at 79
+misc small fixes

03 Dec 2003 by Lax
- Added custom windows system:
** CCustomWnd base class for your windows
** AddXMLFile, RemoveXMLFile to manage custom xml files
** More info / example coming
- Added MQ2IRC plugin to CVS with some changes
- Added MQ2EQIM plugin, which handles buddy list info (custom window soon, also auto loading buddy list)
- Updated MQ2EQBugFix plugin to solve current journal npc window crash (and it shouldnt make it not show anything this time)
- Added OnReloadUI callback, called after /loadskin command is used
- Fixed hangups compiling with VC6
- Added EasyDetour and EasyClassDetour to ease the pain of hooking functions

02 Dec 2003 by Mckorr
- Fixed SHA in short classes, is now SHM.  Added Rogue/ROG (I missed that one before)
- Added $spawn(#,sclass)

27 Nov 2003 by Lax
- / command correctly does EQ /who by default
- MQ2Telnet redone.
- Plugins using DoCommand() will execute it on the next pulse instead of immediately (corrects problems unloading the plugin)
- MQ2FPS shouldn't cause major problems when switching from absolute to calculate mode
- MQ2Template removed from VS6 workspace and .NET solution

25 Nov 2003 by Lax
- MQ2FPS now has a /fps command that can change some other settings.  Selecting "absolute" mode will switch to "cpu limiter" style, while "calculate" mode will switch to "fps limiter" style.  FPS limiter is default.  The same command will allow you to reposition the FPS indicator display.
- MQ2FPS display now shows a * if using absolute mode, and will show /MACRO if a macro is being executed that causes the limiting to be minimal
- Added aliases /g and /gu to the default list
- Macroquest2.exe now pops up a message box if the system failed to load MQ2Main.dll

20 Nov 2003 by EqMule
fix for $merchant(name)

20 Nov 2003 by Lax
*** MacroQuest2.exe is now pre-compiled, you no longer compile this yourself.  MQ2Auth implemented.  Run it before compiling on each machine.

- MacroQuest program will no longer use loadlibrary, it loads our library directly.
- The version number is now stored in MQ2Main.h as the top line, and not in macroquest.ini.  When compiled it becomes a global variable.  Comparing the global variable gszVersion with the #define in MQ2Main.h will cause the tray icon tooltip to suggest recompiling if necessary.
- Removed EQADDR_SLOTLIST, which is now ppInvSlotMgr/pInvSlotMgr
- Fixed MQ2Telnet crashes (for real)
- Added DebugSpewNoFile which does not write to file even if debugspewtofile=1.  This is useful for when we can't put up with the file access times.  All Macro commands and parser api debug spew has been changed to this form.  Note that this debug spew is still useful for when you attach a debugger.

19 Nov 2003 by EqMule
+Added new command /destroy
will destroy whatever you have on your cursor. Use with care.
example: /if "$cursor(name)"~~"rusty" /destroy
In order to get that to work I had to declare EQ_PC (MQ2Globals.h(250):EQLIB_VAR EQ_PC **ppPCData;)

19 Nov 2003 by Lax
- Fixed MQ2Telnet to not crash on unload (probably).  Critical sections were getting deleted twice.
- Fixed aliases to work when given parameters

18 Nov 2003 by EqMule
+fix: mouseto and click by changing ScreenX and ScreenY to ScrX and ScrY)
+Added  EQLIB_API VOID AddParm(PCHAR Name, fMQParm Function);
    EQLIB_API VOID RemoveParm(PCHAR Name);
to MQ2Main.h so that custom plugins will find them...
+updated $merchant(has,xxx) with HanzO's code for it, thank you.
+Updated $selecteditem() with new (count) for easier usage of /sellitem and /buyitem
example: /sellitem $selecteditem(count) self
+misc fixes...

