-- POL099 --
10-20-2017 DevGIB:
  Changed: Added assume_string flag to OS::OpenConnection() to allow you to force the connection script to run as AUXSVC_ASSUME_STRING script option before the script loads in case of fast responding connections.
10-11-2017 DevGIB:
  Changed: Added params to OS::OpenConnection() to allow you to pass parameters to the script that is run for the connection.
09-23-2017 Turley:
  Added:   array.sort(int sub_index:=0) the optional parameter specifies the index used for sorting in the case of an array of arrays
09-10-2017 Turley:
  Added:   poltool uncompressgump
           unpacks and prints content of a compressed gump
           only parameter is a filename, which needs to contain a single 0xDD packetlog
  Added:   item member no_drop 1/0 r/w (itemdesc NoDrop)
           if set no drop of this item is allowed
           container/npc member no_drop_exception 1/0 r/w
           (itemdesc/npctemplate NoDropException)
           if set this container/npc is a valid target even if no_drop is set for the item
08-03-2017 Nando:
  Fixed:   Shutdown crash when using character method scripts.
07-31-2017 Nando:
  Fixed:   Interactive commands could cause a crash when used inside a run-to-completion script
           (e.g., syshooks, scripts ran via OS::run_script_to_completion() and method scripts). The 
           interactive commands	will now return an error if the script can't be blocked. 
		   (Note: this does not apply to critical scripts, which *can* block).
		   
		   Affected commands: 
		   UO::Target(), UO::TargetCoordinates(), UO::TargetMultiPlacement(), UO::SelectMenuItem(),
		   UO::SendDialogGump(), UO::SendGumpMenu(), UO::SendTextEntryGump(), UO::SendInstaResDialog(),
		   UO::SelectColor(), UO::SendPopupMenu(), UO::RequestInput(), Unicode::RequestInputUC()		   

07-23-2017 DevGIB:
  Added:   _DEFAULT_TEXT_REQUIREDCMD := 0 to uo.em which allows to set a minimum cmd level that broadcasts will be sent to.

  Changed: Broadcast( text, font := _DEFAULT_TEXT_FONT, color := _DEFAULT_TEXT_COLOR, requiredcmdlevel := _DEFAULT_TEXT_REQUIREDCMD )
           adding requiredcmdlevel argument which allows you to set a minimum cmd level that the broadcast will be sent to.
  Changed: No longer require a PID for GetProcess( pid  := "" ), not selecting a PID will use the PID of the parent script.
07-17-2017 Kevin:
  Fixed:   PrintTextAbove*CL() now behaves similarly to PrintTextAbove*() functions, displaying the
           object's description instead of "System".
05-28-2017 Turley:
  Removed: pol.cfg entry to disable assertions. A crash will anyway happen, thus it makes no sense and only hides the real reason.
05-28-2017 Nando:
  Fixed:   Crash when using SplitWords() in a script that was compiled with outdated .em files.
05-01-2017 Turley:
  Fixed:   Item.house property gets now reset on component remove
11-29-2016 Boberski:
  Added:   Support for TOL (Time of Legends) expantion.
10-23-2016 Nando:
  Added:   Member character.carrying_capacity (read only)
           Returns the current carrying capacity of a character, defined as:
              (40 + 3.5*STR + chr.carrying_capacity_mod)*ssopt.carrying_capacity_mod
   Note:   Characters can go above their carrying_capacity, but they will spend
           much more stamina to move according to movecost.cfg. Don't treat this
           as max_weight.
08-28-2016 Turley:
  Fixed:   Calculation of NPC AOS resistance/damage values
  Added:   Member object.specific_name
           returns 1 if a custom name is set. if its still the original (eg itemdesc) returns 0
03-27-2016 Nando:
  Added:   Option "ThreadStacktracesWhenStuck" to pol.cfg. Useful to debug the core when
           no clock movement occurs for more than 30 seconds. Defaults to false.
03-25-2016 Nando:
  Fixed:   Crashes when receiving very big packets.
03-24-2016 Nando:
  Fixed:   Crashes after deleting a component (hold, tillerman, plank) of a boat
03-23-2016 Nando:
  Fixed:   Possible crashes when a script teminates while executing a SQL command.
03-21-2016 Nando:
  Fixed:   Possible crashes when handling a client's response to menus
           created with CreateMenu()
03-02-2016 Nando:
  Changed: POL will default to use multithreading (Multithread = 1 in pol.cfg).
     Note: Multithread=0 is deprecated and likely buggy. It's possible that it doesn't
           even work at the moment. Because every OS should support threading by now,
           we see no reason to maintain two separate systems. Singlethread support will
           be removed in the next version.
03-02-2016 Nando & Turley:
  Fixed:   Possible crashes when sending events to npcs whose event queues were full.
02-29-2016 Nando & Turley:
  Fixed:   Data races when dealing with clients. Some other not-reproducible crashes
           should also go away now.
02-15-2016 Nando:
  Changed: UO::SendQuestArrow(x := -1, y := -1, target := "")
           This function will now work for HSA clients (version > 7.0.9), which
           require a larger packet. Target is ignored for older clients, but is
           required (and must be a valid Item or Character reference) for HSA 
           clients.           
  Added:   UO::SingleClick(who, what)
           This function will emulate a single-click from the client, sending
           the character name, guild and tags or the item description. Note
           that the client may display the item description wherever it had
           clicked before. "what" can be either a serial, item or character.
01-31-2016 Bodom:
  Added:   CProp profiler: helps detecting unused CProps.
           It can be enabled by using the new pol.cfg option "ProfileCProps".
           For better results, should be enabled before startup.
           Impacts on performance very slightly, but consumes an average of
           300 bytes of extra RAM for every CProp used.
           New polsys.em function LogCPropProfile() can be called to dump
           the profiling information into cpprofile.log.
01-30-2016 Bodom & Nando:
  Fixed:   Spoofing prevention on packet 0xD7 (custom housing)
01-22-2016 Bodom:
  Fixed:   Minor bug in ecompile allowing Double literals in the form "2d4".
           These were incorrectly interpreted as "2e4", meaning 20000 and
           leading to confusion with dice rolls. The compiler now issues
           an error instead.
01-20-2016 Bodom:
  Added:   New Item.house property, returns a reference to the house if the
           item is a component of it (listed in House.components()).
           This is the intended replacement for the previously removed CProp
           "house_serial": use item.house.serial instead of
           GetObjProperty(item, "house_serial").
12-27-2015 Bodom & Nando:
  Fixed:   Linux crash on shutdown
12-26-2015 Bodom:
  Fixed:   Bug in String.format()
           String tags were not correctly processed.
           "{name} you hit level {level}".format(struct{name:="Jane Doe", level:=4})
           now correctly formats as "Jane Doe you hit level 4" instead of
           "Jane Doe you hit level <invalid index: #2>"
12-18-2015 Bodom:
  Added:   New eScript escape sequence in strings "\xAA". Allows to specify a
           single character by its binary value (\x01 to \xFF). The value must
           always be 2 digits long, in hex, case insensitive (eg. \xA is not
           valid).
12-05-2015 Bodom:
  Added:   Buff Bar support
           New Character's addBuff(), delBuff() and clearBuffs() methods,
           please see docs for details and explanation.
           0xDF packets are automatically sent when needed (eg. at relogin).
           Buff Bar status is not saved, maybe it will be in future.
11-28-2015 Bodom:
  Added:   New Client object properties last_packet_at and last_activity_at
11-01-2015 Bodom:
  Added:   mysql_query() now supports a third "parameters" (array) argument.
           It can be used to safely replace "?" placeholders inside the query
           with corresponding array entries.
10-27-2015 Bodom:
  Added:   New pol.cfg option AllowMultiClientsPerAccount (default: false)
           When true, allows multiple characters from the same account to be
           logged in at the same time
  Fixed:   Items' CProps were loaded again from itemdesc.cfg at startup when deleted
10-18-2015 Bodom:
  Fixed:   MoveItemToContainer could stack non-stackable items in some circumstances
10-07-2015 Bodom:
  Removed: "house_serial" CProp is no longer set by core for house components
  Fixed:   Exception when editing a custom house with components outside of the
           house
10-06-2015 Bodom:
  Fixed:   Fixed crash condition (stack overflow) when unequipping last armor
           piece weared by an NPC and then receiving an hit.
  Changed: Intrinsic armor now takes precedence over equipped armor (is was the
           opposite before). Anyway, using both of them could lead to unexpected
           behavior so it is not a good pratice.
10-02-2015 Bodom:
  Added:   Intrinsic Shield support, works just like intrinsic weapons
           New extobj.cfg entry "Shield" (defaults to 0x1F022)
           New item must be defined in itemdesc.cfg
           // Intrinsic Shield template - special pseudo Shield for NPCs
           Armor 0x1F022
           {
               Name            intrinsicshield
               Graphic         1
               MaxHP           1
               SaveOnExit      0
           }
09-30-2015 Bodom:
  Added:   MoveItemToContainer parameter add_to_existing_stack can now be 2 for "auto" behavior
           The function will try to add the item to an existing stack and just try move the
           item inside the container if no stack is found
09-29-2015 Bodom:
  Fixed:   When a robe is already equipped before resurrect, no longer destroy it to
           equip the death robe
  Fixed:   When HonorUnequipScriptOnDeath is on, item's unequip and unequiptest scripts
           were called twice on death and in the wrong order
09-27-2015 Bodom:
  Fixed:   Armor were not calculated correctly for NPCs wearing equip
  Fixed:   Allow changing graphic of equipped items again if the new graphic has the same layer
09-25-2015 Bodom:
  Added:   New uo.em function SendPopUpMenu( to, above, menu ).
  Added:   On pop-up menu request (single click) "misc/popupmenu.ecl" is called.
  Fixed:   When using MapDiff, tiles could disappear in some circumstances
09-24-2015 Bodom:
  Added:   New keyword AttackCProp on npcdesc.cfg allows defining CProps for
           intrinsic weapons.
  Fixed:   Hp/MaxHp updates to nearby clients were still using the real value
           instead of the 1000-based ratio when sending the 0xa1 packet.
  Fixed:   Hp/MaxHp updates were sent twice to the originating character.
09-12-2015 Bodom:
  Fixed:   Bug in loading POL098 and older data files: boats were rotated leaving
           dynamic elements like plank and tillerman on the old position.
09-08-2015 Bodom:
  Fixed:   Bug in LAN IP address identification (some IPs in 172.16.0.0/12 were skipped)
09-06-2015 Nando:
  Added:   Data integrity check will test if the item serial is valid (serial >= 0x40000000) when loading items.
  Fixed:   Items could be created with character serials if the wrong values were saved in data/pol.txt.
  Note:	   Character serials must be in the range 1 to 0x3FFFFFF (inclusive), while item serials must
		   be between 0x40000000 and 0x7FFFFFFF (inclusive).
09-06-2015 Bodom:
  Added:   New Item.process property
           Returns reference to the controlscript, if any running
  Changed: Script.attached_to now returns a reference to the Item when called on a ControlScript
  Added:   New servspecopt.cfg option DefaultCharacterHeight (1-32)
           This will be the default (and never changed so far) height of Characters
           and NPCs. Default value is 15. Back in the POL095 days is was 9, so consider
           9-15 as your "safe" play range. Anything outside that range could cause weird
           movement behavior. Even small changes will have a great impact on LOS
           calculations and, more in general, on the combat system.
           It is also used to calculate wether a Character can fit under a low
           passage (e.g. dungeon stairs).
           Keep in mind a Titan and a Slime will have the same height.
09-05-2015 Bodom:
  Changed: Process ids (pid) no longer start from 1 but from 0x01000000.
           This should have no practical effect.
  Added:   Allow specifying an arbitrary Gump id in SendDialogGump()
           Custom gump ids must be in the range 1-0xFFFFFF. If no gumpid is given,
           the old behavior of using the pid will still be used (so that this
           does not break backward compatibility).
           It is now possible to organize the gumpids in a constants file and have
           the same gump to always be sent with the same id. This way the client
           will recognize it and, if the player moved it last time, it will
           reposition it where the player liked it: this should be a nice
           interface improvement.
           It is now possible to implement the Virtues gump, since it needs a
           pre-defined gumpid of 0x01CD to work.
  Changed: CloseGump() now accepts a gumpid instead of a pid. For scripts not
           using custom gump ids, its behavior is the same as before.
09-03-2015 Bodom:
  Added:   Item insurance support, new Item.insured property (0/1)
           An insured item behaves on death like a newbie item, except that the insured flag gets reset back
           to 0 after every death. If the item for some reason (e.g. when backpack is full) will get dropped
           instead, the insured flag will be reset anyway. Insured items are not stackable with normal items
           but they can still be sold to vendors.
           Hint: this feature can also be used in conjunction with CanDie sys hook to determine via script which
           items a player will drop on death; since the CanDie hook is called exactly one moment before death you
           can use it to insure the items that you don't want to fall on the corpse.
  Added:   RepSys NameColor and HighLightColor hooks can now return -1 to let the core run the builtin code.
08-27-2015 Bodom:
  Added:   New eScript keyword: unused
           This keyword can now be added before a variable name in function or program block declarations.
           It has no effect on the resulting compiled code, but instructs the compiler not to issue a warning if
           the following variable will not be used. The compiler will instead fire a warning if the interested
           variable will then be used later in the code. Examples:
           program onremovescript( character, container, unused item, unused item_amount, movetype )
               // Here the variables item and item_amount are needed in the program declaration but will not be used,
               // the unused keyword prevents warnings to be triggered
           endprogram
           function myfunc( parameter1, unused parameter_for_future_use )
               // Same as above: parameter_for_future_use is not used and unused prevents the warning message
           endfunction
07-27-2015 Turley:
  Added:   array.cycle([count])
           will move array backwards or forwards in-place as it were a conveyor belt.
		   {1, 2, 3}.cycle()
		   Will make it:
           {3, 1, 2}
		   Accepts a negative value as a shift to move different direction
  Changed: string.format()
           Now actually faster than string concatenation in eScript
           Fixes a bug where {:d} formating could cause an arbitrary number shown instead of a real value
           tag errors are slightly more intuitive and compact.
  Note:    Patches submitted by andenixa

02-08-2015 Turley:
  Added:   PolCore().memory_usage member, returns current process usage in KB
  Changed: 0xF1 Freeshard list pkt is now allowed during login state,
           thus its possible to create eg a UOGateway pkthook for this pkt
  
01-31-2015 Turley:
  Added:   uo::ListMobilesInBox( x1,y1,z1, x2,y2,z2, realm := _DEFAULT_REALM )
           like ListObjectsInBox but returns only mobiles.
  Changed: uo::List*InBox functions accept as z parameters LIST_IGNORE_Z
           Thx @ andenixa
  Added:   uo::GetMidpointCircleCoords( xcenter, ycenter, radius )
           based on given center coordinates and radius returns array of x,y structs which represent a circle
           Thx @ andenixa 
           The array of coordinates is sorted, which means that its easily possible to only use every second point

09-12-2014 Nando:
  Fixed:    Client crash with clients older than 7.0.9.0 but newer than 7.0.0.0, because of wrong size in
              boat movement packets.
  
07-12-2014 Nando:
  Fixed:    Items were not disappearing from the character's backpack after being moved to the corpse.
  Fixed:    Items were disappearing from the corpse when an equippable item was moved/inserted into it.
  
11-13-2014 Nando:
  Added:    EnforceMountObjtype property in pol.cfg. Will enforce that only items with the mount
            objtype (as defined in extobj.cfg, default 0x1F021) can be mounted.
  Fixed:    Inconsistency when handling mount objects that would trigger an assertion for equipping
            items with the mount objtype but a bad graphic.
   Note:    To be equipped as a mount, the item must be in the mount tiles list of uoconvert.cfg. 
            This ensures that the item has layer 25 and the equippable flag, otherwise it won't
            be considered equippable.
            
11-05-2014 Nando:
  Added:    polsys::Realms() will now report how many offline mobiles and multis there are.
  Added:    "ShowRealmInfo" option in pol.cfg (default to false). Will report every once in a while 
            the number of items, mobiles and multis per realm. 
  Added:    uo::ListOfflineMobilesInRealm(realm) method to return the list of offline mobiles in a 
            specific realm. Useful for moving the offline mobiles out of a shadow realm before 
            deleting it.
  Fixed:    Crash bug when deleting shadow realms while an offline mobile or a multi were still in it.
  Fixed:    Top-level items were not properly counted when moved between realms.
 
10-29-2014 Nando:
  Fixed:    Crash bug when deleting item directly from a corpse.
  
10-19-2014 Turley:
  Added:    AnimXlate.cfg for newer clients
  Added:    example animxlate.cfg:
            defines which graphics support mount translation
            and per graphic type how to translate animation from older clients to newer (7.0.9.0)
            see cfg for description of possible entries.

09-23-2014 Nando:
  Changed:  Corpses will no longer send the full list of contents before being open. Only the equipped
            items will be shown. This should decrease slowdowns in areas with many corpses.

09-21-2014 Nando:
  Fixed:    Corpses will now equip items that are placed on them, even if they don't have an OnInsert script.
  Fixed:    Possible crash when items having layers larger than 25 were placed/removed from corpses.

06-07-2014 Tomi:
  Fixed:    using DestroyItem or SubtractAmount on an item 'gotten' it will now first release the item and then destroy it
  Fixed:    NPCs looks for players for enter/leftarea events when, these were only looking for npcs 
            - moved with MoveObjectToLocation function
            - on every move
            - unhide
            - npc creation
  Fixed:    Destroying an equipped item now calls unequip scripts
  Fixed:    Changing cmdlevel with chr.cmdlevel := or chr.SetCmdLevel() sends updates correctly to see concealed characters
  Old Commits:
     Changed: pol.cfg MinCmdLevel checked already during the first accountlogin, so now it doesnt let those connections go all the way to char creation anymore.
     Fixed: Crash during character creation where equipment realm was not updated and pol crashed when unequipping/equipping.
     Fixed: Setting Enter/Left area event listening for npcs on range 32 did never send the left area on distance 33

05-26-2014 Turley:
  Added:   character.last_textcolor readonly member returns last textcolor of the character. Values are between 2 and 1001. Returns 0 if not yet spoken.
           (will not be saved inside of the datafile)

05-06-2014 Tomi:
  Added:   Realm entry to startlocs.cfg, The earlier MapID still needed for the client to show the map correctly, but realm is needed for the server to put the character during creation in the correct realm, default value "britannia"

04-05-2014 Turley:
  Fixed:   multi.items returns now all toplevel items inside of the multi
  
03-15-2014 Turley:
  Changed: sql functions connect, select and query perform the communication part in background while script itself
           is stopped (like eg Target()). Which means that these time consuming functions do not block the complete shard.
		   Removed sql module from runecl, since it no more compatible.

03-01-2014 Nando:
    Added: Character.temporally_criminal is true when a criminal timer is running on the character. 
     Note: The old property chr.criminal stays the same: it is true when the character is temporally
           criminal or a murderer.

02-27-2014 Tomi:
    Fixed:    changing cmdlevel now updates correctly which concealed characters you see
    Fixed:    crashes when parent script is killed before child script returns
    Fixed:    crashes when reporting error in an armordesc entry defined in config\itemdesc.cfg

02-25-2014 Tomi:
    Added:    Boat Smooth move for clients which support it ( HSA+ )
    Added:    boat.em flags ( These flags are ignored for boat movements sent to old than HSA clients )
          const BOAT_SPEED_ONE_TILE 	:= 1;
          const BOAT_SPEED_SLOW		:= 2;
              const BOAT_SPEED_MEDIUM 		:= 3;
              const BOAT_SPEED_FAST 		:= 4;
    Changed:  boat.em functions
              MoveBoat( boat, facing ) to MoveBoat( boat, facing, speed := BOAT_SPEED_ONE_TILE ) 
              MoveBoatRelative( boat, direction ) to MoveBoatRelative( boat, direction, speed := BOAT_SPEED_ONE_TILE )
    Note:     The same functions are used to move boats for older and never clients, older clients ignore the speed parameter, but the speed paramter is required for smooth move.
              The clientversions are checked in core to determine what type of boat movement will be sent

02-01-2014 Tomi:
    Fixed: Customhousing exterior stairs delete is now working, commiting does not readd them anymore
    Fixed: Customhousing changing floor is now sending a full msg instead of short msg, so no more synch needed after changing floors until you can start working on it

01-20-2014 Nando:
	Added:  DisableNagle option in pol.cfg to disable Nagle's algorithm, default to 0. In theory, latency should improve if DisableNagle=1.

01-20-2014 Turley:
	Fixed:   Made the sql module atleast a bit script friendly. Removed the mysql_free_result function since the result objects automatically get destroyed on scope exit.
	         Passing the sql objects as function parameters is now also possible. mysql_close is now also senseless, but kept it for anyone who wants to directly close the connection.
			 Boolean check for the connection object performs now a ping and returns false if the connection is lost (eg. timeout)

12-31-2013 Turley:
    Added:   Print small backtrace on crash/passert failure, should help a bit without the need of the dump.
	         Works only under Windows 64bit
	Changed: optimized world object storage and usage. Should improve eg pkt sends and scales better.

11-03-2013 Tomi:
    Fixed:   Container Max Weight works now like it did earlier before _mod changes, all values <= 0 sets it as 0xFFFF max weight

10-25-2013 Turley:
    Fixed:   newbie flagged backpack caused endless loop on death

10-21-2013 Tomi:
    Added:   polsys::FormatItemDescription( desc, amount := 1, suffix := "" )
             This formats the desc using Pols built in Singular/Plular formatter

10-04-2013 Turley:
	Fixed:   \= operation
	
10-01-2013 Tomi:
    Fixed:   Container.locked works again

09-25-2013 Tomi:
    Added:   character.DisableSkillsFor( duration ) method to disable skills that are started with start_skill_script or by scritps defined in attributes.cfg for duration ( seconds )
             This method overrides the default Delay setting in attributes.cfg if used ( for example if on failing a skill you want no delay just set it to 0 )
             This can also be used to disable skills for example during an event or pvp
    Added:   item.name_suffix for adding crafter marks or such
             item.desc returns the formatted name and suffix added to it without formatting if it exists
             item.name does not include this suffix, so that can be used to get the item name without formatting and without suffix

09-21-2013 Tomi:
    Changed: Pol doesnt send "I am frozen" messages anymore when paralyzed, now it sends in all those cases "I am paralyzed" messages

09-20-2013 Tomi:
    Fixed:   Invul changes now sends the healthbar color correctly for UOKR and later clients
    Fixed:   All repsys changes now send the update correctly to yourself and all client around you
    Removed: support for murderer healthbars for UOKR clients.

09-18-2013 Tomi:
    Added:   cfgfile::GetConfigIntArray, works the same way as GetConfigStringArray but returns an array of ints instead of strings
    Changed: Item.name now returns itemdesc.Desc without singluar/plural formatting if no name is set and name from tiledata if no itemdesc entry found

09-17-2013 Tomi:
    Fixed: Item.SplitStackInto and Item.SplitStackAt methods for non stackable items ( now also works splitting non stackable items 1 by 1 from a stack force created )
    Fixed: Mountpieces will not be copied into corpses during character death anymore even if they are non movable

09-03-2013 Tomi:
    Changed: Equipment members .maxhp_mod .hp .maxhp and .quality moved to Item
           only Weapons and Armors need to have the MaxHP defined in itemdesc because core combat is using it, for all other items there is a default value 1
    Added: Weapon RW member .speed_mod ( -32,768 to 32,767 ) as an optional way to delay if you want to use the default speed math and just add to that
    Fixed: upper limits using the container members .max_items_mod .max_weight_mod and .max_slots_mod
           if max_items >= 3200 it will be set to 3200
           if max_weight >= 65535 it will be set to 65535
           if max_slots >= 255 it will be set to 255
    Note:  None of these members can go below zero

09-02-2013 Tomi:
    Added: Container RW members .max_items_mod( −32,768 to 32,767 ) .max_weight_mod( −32,768 to 32,767 ) and .max_slots_mod( −128 to 127 ) ( default values 0 )

08-31-2013 Turley
	Fixed: EScript memoryleak (eg myvar[blubb]:=othervar) 

08-28-2013 Tomi ( based on andenixas patch )
    Added: ssopt.MobilesBlockNpcMovement ( default true ) to determine if mobiles block the movement of npcs
    Note:  Tamed npcs with same master ( npc.master ) still blocks each others movement even with the flag false to not allow them run on top of each others when following the master

08-27-2013 Nando (patch by andenixa, text adapted from forum post):
    Added:    string.format( args ) - formats a string using the data from args
			  Accepts the following format:
				{:x} for hex representation
				{:o} for octal
				{:b} for binary
	
	          Add a # to get notation prefix:
	          E.g. "{:x}".format(10) -> "a"
			       "{:#x}".format(10) -> "0xa"
				   
			  Parameters can be simple:   
			  
				"You have {} gold coins".format(120) -> "You have 120 gold coins"
			
			  and are unpacked implicitly by their order:

				"{} hits {} for {} of damage".format("John", "Bob", 120) -> "John hits Bob for 120 of damage"
			
			  However you can specify parameters explicitly (first argument is at 1):
			    
				"You hit {2} for {1} damage".format(120, "John Doe") -> "You hit John Doe for 120 damage"
				
			  Format allows accessing object members:

     			"Spell {1.spell_name} requires reagents: {1.reagents}".format(struct{spell_name:="Fire Wrath", "Ba, Bm, Ga"}) 
				       -> "Spell Fire Wrath requires reagents: Ba, Bm, Ga"

			  Implicit members also work:

			    "{name} you hit level {level}".format(struct{name:="Jane Doe", level:=4}) 
						-> "Jane Doe you hit level 4"

			  Character or item members are accessed the same way:

			    "{1.name}, your shield {2.desc} has {2.hp} hp".format(who, who.shield)" 
						-> "Admin, your shield Buckler of Death has 150 hp"
07-27-2013 Tomi:
  Changed:    UO::TargetMultiPlacement( character, objtype, flags := 0, xoffset := 0, yoffset := 0, hue := 0 );
              New optional hue parameter to show hued multis which are supprted by clients >= 7.0.9 ( HSA )
              Older clients ignores this option

06-17-2013 Kevin:
  Fixed:      adding missing mysql_close() entry to sql.em
  Fixed:      OpenSellWindow() "Buyable" container wasn't actually restricting what entries showed. 
              Pass flag VENDOR_BUYABLE_CONTAINER_FILTER to enable this filter. 

05-25-2013 Kevin:
  Fixed:      bug in mysql_select_db() returning error on successful calls
  Fixed:      adding missing mysql_free_result() entry to sql.em

02-26-2013 Kevin:
  Fixed:      item.SplitStackInto(container,amount,add_to_existing_stack := 1) no longer requires three parameters and will default
              the add_to_existing_stack to 1/true if not present
  Fixed:	  item.SplitStackInto() with add_to_existing_stack == 1 will re-add the removed-portion of stack back to original item
              if it cannot add to the existing stack (ie, container's caninsert script returns false)
  Changed:    item.SplitStackInto() with add_to_existing_stack == 1 will first attempt to add to an existing stack if found, and otherwise 
              will create a new stack if no existing stack found. This is similar to how the existing CreateItemInContainer() works

02-20-2013 Tomi:
  Fixed:      When changing graphic of a lightsource item, it now changes correctly the facing too.
  Fixed:      Status bar now shows for weapon mindamage ( id.mindamage + dmg_mod ) and for maxdamage ( id.maxdamage + dmg_mod )

02-17-2013 Tomi:
  Fixed:      Changing invul status now updates it for the character itself too, not just all mobiles around

02-15-2013 Tomi:
  Fixed:      item.SplitStackInto method

01-04-2013 Tomi:
  Added:      Syshook CanTrade
	      parameters ( character, drop_on_chr, item )
  Note:       This syshook runs when dropping an item on a character or when trying to add an item to a tradewindow

12-15-2012 Tomi:
  Fixed:      Items now get their facing from tiledata flag if no itemdesc entry is found
              This fixes wrong lightsources for items such as lampposts

12-08-2012 Tomi:
  Fixed:      Typo in uo.em with new LISTEX flags
  Added:      const REALM_BRITANNIA_ALT to uo.em

12-05-2012 Tomi:
  Added:      Pol now send on invul/murderer status changed for >= KR Clients packet 0x17 to get Yellow or Red color health bars
  Changed:    UO:ListMobilesNearLocationEx added 2 new flags LISTEX_FLAG_PLAYERS_ONLY and LISTEX_FLAG_NPC_ONLY
  Changed:    combat.cfg option "SendAttackmsg" to "SendAttackMsg" to match cases of other options
  Fixed:      UO:MoveItemToContainer doesnt crash anymore when using add_to_exisitng stack parameter
  Fixed:      item methods .SplitStackAt and .SplitStackInto doesnt crash Pol anymore when using add_to_existing_stack parameter

11-16-2012 Turley:
  Added:      string methods:
			  str.length() : returns like len(str) the length of the string
			  str.upper() : returns like upper(str) the uppercase version and also modifies the str
			  str.lower() : returns like lower(str) the lowercase version and also modifies the str
			  str.find(Search,[Start]) : returns like Find(string, search, start) the index of the first occurance of 'search' after 'start' within str
			  but unlike the basic.em function the Start parameter is optional if not given it searches the whole string
			  str.join(array) : returns a string which is the concatenation of the array elements, seperated by str

11-14-2012 Turley:
  Changed:    SplitWords( str, delimiter := " ", max_split := -1 )
              it has now an additional parameter max_split, if given it limits the number of times that a string will be split
			  default: -1 no limit
			  (Patch submitted by andenixa)
  Added:      ecompile its now possible to override through the cmdline
			  GenerateDependencyInfo entry with "-D-"
              GenerateDebugInfo entry with "-x-"
			  
11-10-2012 Turley:
  Added:      uoclient.cfg Listener property "KeepClients" 1/0 default 0
			  if set to 1 clients keep this listener port even after different gameserver select
  Note:       actually 1 is the old behaviour and 0 the old behaviour of pol.cfg ListenPort
  Added:      pol.cfg "UseSingleThreadLogin" 1/0 default 0
              if set all prelogin clients are handled inside the listener thread and not inside an extra thread
			  this will reduce the amount of thread creates and destroys
			  
10-14-2012 Tomi:
  Added:      SystemHook "WarmodeChange" called when a character changes warmode status either by member .warmode or by clicking the warmode button on the paperdoll
              Params CharRef and new_warmode_status
              Return value is ignored

10-09-2012 Tomi:
  Fixed:      packet 0x17 ( poison health bar packet ) was sending 2 bytes with wrong endian when sending to nearby clients

10-08-2012 Turley:
  Fixed:      secured Shadowrealm delete, it will now iterate through all StorageArea Items and check if old shadowrealm property exists
  
10-06-2012 Tomi:
  Changed:    setting an equipped item on NPC to movable 0 will make it visible on the corpse but invisible in the corpse, same as hair and beard have worked until now.

10-05-2012 Turley:
  Added:      ecompile parameter -wP
  Added:      ecompile.cfg entry ParanoiaWarnings
  Note:       since "{}" is valid syntax, only complain about it if ParanoiaWarnings is enabled

09-29-2012 Turley:
  Added:      ecompile parameter -T
  Added:      ecompile.cfg entry ThreadedCompilation
  Note:       if set will use openmp for parallel compilation
  
09-25-2012 Kevin:
  Fixed:      Guild and alliance messages no longer send as regular speech messages. They are sent to all guild or alliance members online.
  Added:      servspecopt.cfg CoreGuildMessages=0/1 default 1 to determine if core should handle guild and alliance messages.

08-29-2012 Turley:
  Fixed:      Crash if a attached script kills the attached npc

08-27-2012 Tomi:
  Changed:    MoveItemToContainer( item, container, x := -1, y := -1 ); to MoveItemToContainer( item, container, x := -1, y := -1, add_to_existing_stack := 0 );
  Changed:    item.SplitStackInto( container, amount ) to item.SplitStackInto( container, amount, add_to_existing_stack := 0 )
  Note:       The optional add_to_existing_stack parameter defines if the items moved to the container will look for an existing stack and add to it or just add as a new item ( old behaviour )
              If add_to_existing_stack == 1 and there is no stack in the container, it will return Error "There is no existing stack", so its up to scripts to check this.
  Added:      item.HasExistingStack( container ) to allow scripts to check if there is an existing stack in a container or not, returns the ItemRef of the stack if it exists.           

08-26-2012 Nando:
  Removed:    Support for ListenPort in pol.cfg when Multithread is activated. Everyone should
              be using uoclients.cfg by now! 

08-01-2012 Kevin:
    Added:    R/W member carrying_capacity_mod for mobiles to modify carrying capacity on a 
              mobile-per-mobile basis. Is taken into account prior to global ssopt modifier.

08-01-2012 Kevin:
    Added:    osmod::Debugger() to put current script in debug state to be attached by external
              debugging application
    Added:    stacktrace debug command to print stacktrace. Displays:
 				<size of stack>
 				foreach stack element:
 					<program counter>
 					<file number>
 					<line number>
 					<number of local variables>
 					foreach local variable:
 						<variable name> <packed value>
 					
07-12-2012 Tomi:
    Added:    combat.cfg entry "SendAttackMsg" values 0/1 defaults to 1
              setting this to 0 stops the core repsys system sending "is attacking you" messages.

06-03-2012 Tomi:
    Added:     Readonly members .active_skill and .casting_spell for characters
              return values 0/1 if character has an active attached skill or spell script

05-01-2012 Tomi:
     Fixed:    On equipped items .resist_*_mod members did not update character status window when changed
              Patch submitted by Agata

04-15-2012 Tomi:
     Added:    R/W member editable 0/1 for maps

04-14-2012 Tomi:
     Added:    Support for new map message packet 0xF5 for clients 7.0.13+
              This packet supports the new facetXX.mul files and now can use every different realm for cartography maps and sea charts.
     Added:    r/w member .facetid for Maps
              This has actually nothing to do with realms, the value is the same as in FacetXX.mul file
04-06-2012 Tomi:
     Fixed:   Roof problem at 4th floor on a custom house. 
              Patch submitted by Agata
     Added:   Packet 0xD6 to be ignored for activity ( fixes inactivity logout for ML+ )
              Patch submitted by OWHorus
04-05-2012 Kevin:
     Added:   ecompile.cfg directive "ErrorOnWarning" and ecompile switch -y to treat warnings 
              on errors during ecompile. Default is 'false'
     Fixed:   various locations were showing warnings even without the -w switch provided.

03-26-2012 Tomi:
     Added:   character readonly member .lastcoord returns struct{.lastx, .lasty, .lastz}

03-09-2012 Tomi:
     Fixed:   uo::SendInstaResDialog() was sending wrong packet 

03-07-2012 Tomi:
     Added:   scripts/misc/dblclickitem.ecl to run a script on every double click on items.
              params are (mobile, item)
              usefull for removing meditation stuff and such in 1 place instead of every script.
     Note:    this script will not be attached to the mobile and will run before any usescript.

02-08-2012 Tomi:
     Added:   character readonly member .tradewindow
              return ContainerRef if the char has an active trade and error if no active trade

02-06-2012 MuadDib:
     Fixed:   Added orphan checks in Character::get_from_ground for both passed serial and items it itr through. Proper logging, returns, and 
	              continue used to keep from attempting movement of orphaned items after log report.

02-05-2012 Tomi:
     Changed: AR not required in ArmorDescs for Pol to start anymore, so now if Physical Resist used only no need to define AR 0 in the ArmorDesc.
     Changed: AR in ArmorDescs defaults to 0.

02-02-2012 Tomi:
     Added: Readonly member .multiid for boats and houses
     Fixed: Old boats didnt read the components correctly on server restart

01-21-2012 Tomi:
     Removed: Graphic from multis, no graphic entry needed for multis in itemdescs anymore, uoconvert doesnt add a graphic value to multis anymore.
     Added:   MultiID entry to boats.cfg instead of the ObjType.
     Changed: Multi itemdescs now require MultiID to be defined for each multi.
     Note:    Multi objtypes still need to be > MaxTileID from pol.cfg
     Example of a multi entry in itemdesc
              Boat 0x10000
              {
	          Name      SmallBoatN
	          MultiID   0x0
              }
     Added:   boats.cfg is now shipped with the core too with boats up to date with HSA so just remove what you dont use.
     Note:    Reconvert of multis.cfg with UOConvert needed
              Make sure you have a itemdesc entry for every boat direction

01-21-2012 Turley:
     Fixed: RequestInputUC() for eg russian chars

01-16-2012 Turley:
	Changed: SpeedUp for uoconvert

01-14-2012 Turley:
    Changed: UnicodespeechEvent additional Member "tokens" if speech has (speech.mul) Tokens, gives array of spoken TokenIDs
	  Added: servspecopt.cfg SeperateSpeechTokens=1/0 default 0 when set RegisterForSpeechEvents() and EnableEvents/DisableEvents behave different
	  Added: uo:RegisterForSpeechEvents Flags LISTENPT_HEAR_TOKENS,LISTENPT_NO_SPEECH
	  Added: SYSEVENT_TOKEN_SPEECH:=0x4000 and SYSEVENT_TOKEN_GHOST_SPEECH:=0x8000 for uo:EnableEvents/DisableEvents
	   Note: if SeperateSpeechTokens is set you can control which events you get,
	         for NPCs you only get speech with tokens if you set SYSEVENT_TOKEN_SPEECH/SYSEVENT_TOKEN_GHOST_SPEECH
			 and non Token speech with SYSEVENT_SPEECH,SYSEVENT_GHOST_SPEECH
			 for RegisterForSpeechEvents() you get speech with and without Tokens when setting LISTENPT_HEAR_TOKENS and no speech without Tokens
			 setting LISTENPT_NO_SPEECH
	   Note: Token and nonToken Eventtype is still the same (SYSEVENT_SPEECH)

01-03-2012 Turley:
    Changed: major rewrite of primitive operators +,-,*,/,...
             major speedup of +=,-=,...
      Added: finally support for +=,-=,*=,/=,%= with objectmembers, like who.resist_fire_mod+=1
       Note: if member would return UnInit or Error it does nothing
             so its like (only faster and atomic):
             var temp:=who.resist_fire_mod;
             if (!(TypeOfInt(temp) in {OT_UNINIT,OT_ERROR}))
                temp+=1;
                who.resist_fire_mod:=temp;
             endif

01-02-2012 Turley:
	  Added: XMLFile/XMLNode.removexmlnode(int value)
             removes node of given index
			 XMLFile/XMLNode.removexmlnode(XmlNode node)
			 removes given node
			 XmlNode.clonenode()
			 since all NodeObjects get destroyed when the corresponding XmlFileObject is destroyed, use this method to store a node for later use.

12-18-2011 Nando:
    Changed: internal handling of intrinsic weapons' unload.
    Removed: INTRINSIC property from Weapon template in itemdesc.cfg. An error occurs
             if it's set. Some shards might have forgot to set it, which would cause
             damage to intrinsic wrestling weapon. This is now handled automatically.
                                  
12-17-2011 Nando:
    Changed: boats.cfg entries are now "Name Graphic X Y <Z>", where Z is optional and
             defaults to zero.

12-17-2011 Tomi:
    Added:   Support for hued boats, use the normal .color r/w member to change the hue
             Patch Submitted by Agata

12-14-2011 Tomi:
    Changed: objtype vectors changed to maps to only reserve as much memory as there are
             itemdesc entries, not reserving memory for up to 4 billions of objtypes.
    Changed: boats.cfg entries changed from "Name Graphic X Y" to "Name Graphic X Y Z"
             because some of the new boat components requires different Z levels than the boat
			 itself.

12-13-2011 Austin:
    Added: Support for destroy scripts on multis.

12-13-2011 Tomi:
    Added: Support for HSA boats ( no smooth move yet, but now all boats are usable )
    Changed: boat.cfg to support new entries "Rope", "Wheel", "Hull", "Tiller", "Rudder", "Sails", "Storage", "Weaponslot"
             there can be more than 1 of each entry 
             the old entries "Tillerman", "Hold", "PortGangplankExtended", "PortGangplankRetracted", "StarboarGangplankExtended", "StarboardGangplankRetracted" support just 1 entry each or the boat members get broken
    Added: ReadOnly members for boats
           .components returns an array of ItemRefs of all the components on the boat
           .hull returns an array of ItemRefs of all the hull components on the boat, or empty array if none.
           .rope returns an array of ItemRefs of all the rope components on the boat, or empty array if none.
           .wheel returns an array of ItemRefs of all the wheel components on the boat, or empty array if none.
           .rudder returns an array of ItemRefs of all the rudder components on the boat, or empty array if none.
           .tiller returns an array of ItemRefs of all the tiller components on the boat, or empty array if none.
           .sails returns an array of ItemRefs of all the sails components on the boat, or empty array if none.
           .storage returns an array of ItemRefs of all the storage components on the boat, or empty array if none.
           .weaponslot returns an array of ItemRefs of all the weaponslot components on the boat, or empty array if none.
    Changed extobj.cfg to support new entries for all the new boat component types and changed the default value of all entries.
            extobj.cfg entries with default values:
                   Tillerman=0x1F010
                   Port_Plank=0x1F011
                   Starboard_Plank=0x1F012
                   Hold=0x1F013
                   Rope=0x1F014
                   Wheel=0x1F015
                   Hull=0x1F016
                   Tiller=0x1F017
                   Rudder=0x1F018
                   Sails=0x1F019
                   Storage=0x1F01A
                   Weaponslot=0x1F01B

                   Wrestling=0x1F020
                   Mount=0x1F021

                   Secure_Trade_Container=0x1FF01
                   Wornitems_Container=0x1FF02
    Note:   extobj entries just let you define the objtypes, all of these still have to be defined in itemdescs for boats to work correctly.
            extobj.cfg is now shipped with the core.

12-05-2011 Tomi:
    Fixed:  Door methods .open() and .close() were working opposite what they should.

12-04-2011 Tomi:
    Fixed:  EA broke the prof.txt with the latest clients adding "Evaluating Intelligence" and "Spirit Speak" with spaces that resulted into skillnumber 0xFF and skillvalue 0
    Added:  UO::UpdateItem( item );
            updates the item to every client in range, good to use for example after returning 1 in some packethook and the item get invisible.

12-01-2011 Nando:
    Fixed: Client hanging after having his connection refused on login. I recommend testing
           different ways of having a client disconnected, like acct.disable(), .ban() and others.

12-01-2011 MuadDib:
  Changed: UoClientGeneral.maxskills changed to unsigned short. Few places in loops with it changed to use same for the loop counter.

11-30-2011 Tomi:
    Fixed: Old style spellbooks.

11-29-2011 MuadDib:
    Fixed: Fixed a script breaker caused by inserting new TypeOfInt() constants in the middle of the Enum. Moved SQL Types to end of list.
    Added: Added SQL entries to the Basic.EM since were missing.

11-29-2011 Tomi:
  Added:   Opengraphic itemdesc entry for Doors ( optional parameter, no need to define if you dont want to use the built in methods )
  Changed: how built in .open() .close() and .toggle() methods works. The now read the graphic what to open to from itemdesc instead of just checking with & 0x1.
           this makes those methods works for new doors too and not only T2A era doors.
  Changed: basic::CChrz( intarray ) to basic::CChrz( intarray, break_at_first_null := 0 );
           if the break_at_first_null parameter is 0 it uses the old behaviour to just skip the nulls and still convert everything
           if the break_at_first_null parameter is set to 1 it stops the conversion to string at the first null it finds.
  Changed: All Write(ctBeu16( calls for graphics and colors to use WriteFlipped, this seems to have fixed the assertion errors that occured with removal of the color_ext and graphic_ext

11-28-2011 MuadDib:
  Removed: UObject->Color_Ext : Removed, and when used is replaced with ctBEu16() calls. This includes read/write of /data files.
  Removed: Last of any UOX references for imports. Most was all commented, a few empty refences was also left. All now removed completely.

11-27-2011 MuadDib:
  Removed: UObject->Graphic_Ext : Removed, and when used is replaced with ctBEu16() calls. This includes read/write of /data files.
     Note: UObject->Serial_Ext will not be removed as previously considered, due to the orphan system making primary use of this.

11-27-2011 Nando:
    Fixed: corrected memory leak in cfgfile::GetConfigStringDictionary(...)

11-26-2011 Tomi:
    Changed: CascZ( str ) to CascZ( str, nullterm := 0 )
         if nullterm 1 it adds the terminating 0 in the end of array.
    Note:	 Recompile of scripts needed.

11-24-2011 Tomi:
    Added:  Support for Mysticism and BardMasteries spell books
        Mysticism Spell ID's 678 -> 693 and BardMasteries spell ID's 701+

11-23-2011 Tomi:
    Added:  can_insert and on_insert scripts for Tradewindows

11-22-2011 Kevin:
    Added:	pol/sqlscrobj.cpp pol/sqlscrobj.h
  Changed:	pol/module/sqlmod.cpp pol/module/sqlmod.h
            Add preliminary MySQL database support.
            New eScript objects: BSQLConnection, BSQLResultSet, BSQLRow 
            Added several new sql module functions:
                mysql_connect(host,username,password);
                mysql_query(connection,query);
                mysql_fetch_row(result);
                mysql_affected_rows(result);
                mysql_num_fields(result);
                mysql_num_rows(result);
                mysql_select_db(connection,database);
                mysql_field_name(result,column_index);
                mysql_free_result(result);
                mysql_close(connection);
            In order to build with MySQL support, define the HAVE_MYSQL preprocessor directive in your build configuration.
            You must have the MySQL headers and libraries installed. 
            Only really tested with dynamically linking mysql libraries on Linux.
            
    Added:	pol/network/auxclient.h
  Changed:	pol/network/auxclient.cpp pol/module/osmod.cpp pol/module/osmod.h clib/socketsvc.cpp clib/socketsvc.h
            Moved AuxClient-related classes to its own header file (shared between auxclient.cpp and osmod.cpp)
            Implemented os::OpenConnection() to create outgoing TCP/IP connections. 
            
  Changed:	runecl/runecl.cpp
            Added the sql module to runecl to allow quick testing

  Changed:	pol/uoscrobj.cpp pol/mobile/charactr.cpp pol/mobile/character.h bscript/parser.cpp bscript/objmembers.h
            Added read/write property "mountedsteps" for mobiles. Represents number of steps taken while character was mounted.

  Changed:	bscript/parser.cpp
            Declaring an array only using "{}" will show a compiler warning; please explicitly state 'array', 'struct', or 'dictionary' 
  Changed:	pol/pol.cpp
            If using Linux, remove pol.pid on shutdown of pol.

  Changed:	pol/uoexec.h pol/scrsched.cpp
            Added script option "AUXSVC_ASSUME_STRING" which will allow aux service connections to send and receive non-packed strings.

  Changed:	ecompile/ecompile.cpp
            If using Linux, a slash ("/") cannot be used to define ecompile options to allow support for absolute filenames.

  Changed:	bscript/object.cpp bscript/bobject.h
            Implemented array operation MultiSubscript. Will return a splice of an array, eg:
                array{"a","b","c","d","e"}[2,4] will return array{"b","c","d"}
                 

11-12-2011 Tomi:
    Added:	 Pol/config/extobj.cfg
                 Values it accept now and default values are

                 Tillerman=0xF010
                 Port_Plank=0xF011
                 Starboard_Plank=0xF012
                 Hold=0xF013
                 Wrestling=0xF020
                 Mount=0xF021
                 Secure_Trade_Container=0xFF01
                 Wornitems_Container=0xFF02
    Note:	 These values HAVE TO BE > pol.cfg max_tile_id and the same as objtype for them in itemdescs
    Added:	 UOExpansion HSA server sends now 0x387DF

11-11-2011 Tomi:
    Changed:     Objtypes are now from 2 up to max_objtype from pol.cfg
    Note:	 if objtypes <= pol.cfg max_tile_id and no graphic defined in itemdesc Pol uses objtype as graphic.
                 Multis and custom items should all be moved to > pol.cfg max_tile_id
    Added:       support for new 0xA9 packet for clients >= 7.0.13.0
    Changed:     startlocs.cfg default values for MapID ( 0 ) and Cliloc ( 1075072 which is the Yew town information )
    Example:
                 StartingLocation Yew
                 {
                        City		Yew
                        Description	Town Center
                        Coordinate	535,992,0
                        MapID		0
                        Cliloc		1075072
                 }
    Note: 	 MapID is the same number as in mapX.mul files
                 Cliloc values are the description of the start locations
                 Newest clients has max stats during char creation 90 

11-06-2011 Tomi:
    Added:  pol.cfg setting MaxObjtype <default 0x20000>
    Note:   can be any value between 0x20000 and 0xFFFFFFFF

10-26-2011 Tomi:
    Added:	support for clients >= 7.0.16.0 ( 2D ) char create packet 0xF8
            Enchanced clients still use packet 0x8D

10-15-2011 Austin:
    Added: .doubleclickrange for items (read only).

09-03-2011 Turley:
     Added: DestroyMulti(house) returns error "House currently being customized."
     Added: house.cancelediting(chr, drop_changes) will stop editing mode.
            drop_changes 1/0 if true drops all non committed changes
            Errors: "House is not custom","House is currently not been edited","Character is not editing this house"
     Added: Syshook CloseCustomHouse(mobile, house)
            called after client quits editing, or when house.cancelediting() is called
            return value is ignored
     Added: servspecopt.cfg
            "SpeedHack_MountRunDelay"  default 80 ms
            "SpeedHack_MountWalkDelay" default 180 ms
            "SpeedHack_FootRunDelay"   default 180 ms
            "SpeedHack_FootWalkDelay"  default 380 ms
            Change them on your own risk

08-08-2011 Austin:
     Added: servspecopt.cfg flag "ScriptedMerchantHandlers" default is 0 which results in no change in behavior. 
           If enabled, the below change will come into effect:
     Changed: When a player buys something from a merchant the core will not longer handle taking gold from the player, and moving items to the players pack.
              When the event for EVID_MERCHANT_SOLD and EVID_MERCHANT_BOUGHT is sent it will be a struct containing the following struct:
              struct.type = EVID_MERCHANT_SOLD or EVID_MERCHANT_BOUGHT
              struct.source = player buying 
              struct.shoppinglist = array( struct.item, struct.amount )
              
              The shopping list items will still be items in the merchant's container.
              It is up to the script to split the items from the stacks there and move them to the player's pack.
              It is also up to the script to handle gold checks and consumption.
     
    Added: item.SplitStackInto(container, amount) 
              Will split the item into 2 stacks. Returns a reference to the new stack made from item. Places new stack into the container.
     Added: item.SplitStackAt(x, y, z, realm, amount)
              Will split the item into 2 stacks. Returns a reference to the new stack made from item. Places new stack at the coordinates.
     
05-19-2011 Turley:
     Added: CustomHousing Support (beta)
            officially added uo::SendHousingTool( who, house );
     Added: script call of "scripts/misc/customhousecommit.ecl" on commit (noncritical)
            params: ( who, house, houseelemarray )
            houseelem = struct{graphic,xoffset,yoffset,z}
            to get the real coords from an elem add house.x/y
            called after client presses the commit button
            to accept the changes call new method house.acceptcommit(chr,1) or house.acceptcommit(chr,0) to drop the commit 
            main purpose should be calculation of cost (with delta support for later changes),
            link establishing of houseteleporters (0x181D - 0x1828)
            and adding a signhanger/sign if you didnt added it during multifoundation buildup
            Doors and Teleporters are added to house components as normal items without any special treatment
            so dont forget to add scripts/itemdesc entries
     Added: member multi.house_parts
            returns array of structs{graphic,xoffset,yoffset,z} or error if not a custom house, or currently been edited
            to get the real coords from an elem add house.x/y
     Added: method multi.addhousepart(graphic,xoffset,yoffset,z) returns true or error
     Added: method multi.erasehousepart(graphic,xoffset,yoffset,z) returns true or error
     Added: members multi.house_editing / who.house_editing returns true if house is currently been edited / who is currently editing
      Note: house.setcustom(1) is needed before SendHousingTool() works
      Note: during editing chr is only allowed to walk inside the house
            all components which are not invisible get removed from component list during edit and added to design
            (not invisible to give the chance to eg protect a house sign from been removed from the editing char)
            any item inside the house will be invisible for the chr
            any other mobiles get moved outside the house
      Note: param houseelemarray in script call is the current list of houseparts, 
            multi.house_parts gives you the last stored list
      Note: until no house.acceptcommit() is called and start of commitscript no new SendHousingTool() for this house is allowed

05-04-2011 Turley:
     Fixed: Questarrow packet

04-30-2011 Turley:
     Fixed: enter/leave-events for NPCs (OWHorus)
     Fixed: diagonal moves in npc::CanMove() and uo::FindPath() (OWHorus)

04-03-2011 Turley:
     Added: uotool param checkmultis
            prints infos about used center item

03-12-2011 Turley:
     Fixed: npc:SayUC() sends SpeechEvent for do_event==SAY_DOEVENT_ENABLE
   Changed: removed warning "No handler for skill.." and changed sysmsg to "That skill cannot be used directly."
            since most of the time the behaviour is wanted
     Added: basic::TypeOfInt( expr ) + basic.em constants
            returns like TypeOf() the type of given parameter, but returns instead of a string an integer (see basic.em constants)
            since integer comparison are way faster then string comparison this function should always be used for comparisons

03-10-2011 Turley:
     Added: pol.cfg AccountDataSave (default -1)
            Values:
            -1 : old behaviour, saves accounts.txt immediately after an account change
             0 : saves only during worldsave (if needed)
            >0 : saves every X seconds and during worldsave (if needed)

02-15-2011 Turley:
   Changed: "in" keyword now returns the arrayindex or 0 if no match was found

02-05-2011 Turley:
     Fixed: no exception will be thrown if region enter/leavescript doesnt exist
     Fixed: windows trayicon

10-22-2010 Turley:
     Fixed: UOHSA packet changes
     Added: mobile.clienttype / client.clienttype HSA flag 0x200

09-06-2010 Turley:
     Added: TinyXML based xml reading/writing
     Added: file::OpenXMLFile(filename)
             opens given filename and returns XMLFile object
             fileaccess.cfg is checked
            file::CreateXMLFile()
             creates an empty XMLFile object
            XMLFile.setxmldeclaration(string version, string encoding, string standalone)
             sets xmldeclaration eg <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
            XMLFile.appendxmlnode(string value, struct{attributes})
             appends Node with name value and given attributes (key=name, value=value)
            XMLFile.appendxmlcomment(string value)
             appends Comment
            XMLFile.removexmlnode(string value)
             removes first node of given value
            XMLFile.savexml(string filename)
             saves to filename
             fileaccess.cfg is checked
            XMLFile.xmltostring([string indent])
             returns the xml file as String with given indent string {default "\t"}
            XMLFile[string] returns first node of given name
            XMLFile[integer] returns node of given index (1-based)
     Added: XMLNode object
            XMLNode.attributes
             returns XMLAttributes object
            XMLNode.type
             returns type string 
             (XMLComment, XMLDeclaration, XMLDocument, XMLElement, XMLText, XMLTypeCount, XMLUnknown)
            XMLNode.firstxmlchild([string value])
             returns first child or first child of given name
            XMLNode.nextxmlsibling([string value])
             returns next sibling, or next sibling of given name
            XMLNode.appendxmlnode(string value, struct{attributes})
             appends Node with name value and given attributes (key=name, value=value)
            XMLNode.appendxmlcomment(string value)
             appends Comment
            XMLNode.setxmlattribute(struct{attributes})
             sets attributes for node
            XMLNode.removexmlattribute(string key)
             removes attribute of given key
            XMLNode.removexmlnode(string value)
             removes first node of given value
            XMLNode.appendxmltext(string text)
             appends text to node
            XMLNode[string] returns first node of given name
            XMLNode[integer] returns node of given index (1-based)
     Added: XMLAttributes object
            XMLAttributes.propnames()
             returns Array of all attribute names
            XMLAttributes[string] returns value of given attribute name
     Added: foreach loop support:
            XMLFile, XMLNode: iterates over all child Nodes
            iterator is XMLNode object, "_iterator_iter" is integer index
            XMlAttributes: iterates over all attributes
            iterator is a struct with key=attributename, value=attributevalue
            "_iterator_iter" is integer index
      Note: small examples:
            one way to read an xml file:
            <?xml version="1.0" ?>
            <root>
             <Hello>World</Hello>
             <!--Comment-->
             <nodetwo i="1" />
            </root>
            var file:=OpenXMLFile("helloworld.xml");
            parsenode(file,"");
            function parsenode(node,i)
             foreach blubb in node
              syslog(i+cstr(blubb)+" ["+blubb.type+"] ("+cstr(_blubb_iter)+")");
              parseattrib(blubb,i+"-");
              parsenode(blubb,i+" ");
             endforeach
            endfunction

            function parseattrib(node,i)
             foreach ele in (node.attributes)
              syslog(i+cstr(ele)+" ("+_ele_iter+")");
             endforeach
            endfunction
            
            one way how to create such an file:
            var file:=CreateXMLFile();
            file.setxmldeclaration("1.0","","");
            file.appendxmlnode("root");
            file["root"].appendxmlnode("Hello");
            file["root"]["Hello"].appendxmltext("World");
            file["root"].appendxmlcomment("Comment");
            file["root"].appendxmlnode("nodetwo",struct{i:=1});
            file.savexml("helloworld.xml");
            
08-20-2010 Turley:
     Fixed: util:StrFormatTime() checks if format string is correct and if not returns "Invalid Format String." error
            instead of server crash

08-09-2010 Turley:
     Fixed: exported function calls a different exported function stops execution (eg repsys functions in same script)

06-22-2010 Turley:
     Fixed: uo::RestartScript() wakes up old script so it stops immediately

06-19-2010 Turley:
     Fixed: uo::SendDialogGump SENDDIALOGMENU_FORCE_OLD for 2d 7.x clients (UOKR & UOSA clients ignore the flag)

03-27-2010 Turley:
     Added: os::Start_Skill_Script( chr, attr_name, script_name := "", param := 0 )
            starts for given chr and attr_name definied script (overrideable with param script_name)
            param is any UObject given to skill script as second param (first is chr)
            performs the same checks like normal skillusage (death,frozen,skilldelay,...)
            (Tomi)
     
03-26-2010 Turley:
   Changed: uo::DisconnectClient() now accepts client or character object (Tomi)

03-24-2010 Turley:
     Added: ClientRef object
            pkt.sendpacket() & SendPacket() now accepts client or character
            r/o members:
            ip, acctname, clientversion, clientinfo, clienttype, clientver_detail, uo_expansion_client
            methods:
            compareversion()
            used as prelogin param for packethooks instead of old struct (so you can send packets)
     Added: character.client
            returns ClientRef object or error
     Note:  This or next release duplicate members/methods get deleted from chr (except acctname)
            
03-17-2010 Turley:
     Fixed: Trim: left&right doesnt return empty string if complete string has to be trimmed

03-12-2010 Turley:
     Fixed: uoconvert - default value of MaxTileID (0x3FFF)
     Added: uoconvert param {maxtileid=0x3FFF/0x7FFF} (if uodata= param is given pol.cfg never gets read)

02-20-2010 Turley:
   Changed: ListStaticsInBox,ListObjectsInBox,ListMultisInBox now swap x,y,z values if in wrong order
     Added: uo::DistanceEuclidean(obj1, obj2) & uo::CoordinateDistanceEuclidean(x1, y1, x2, y2)
            returns the Euclidean distance as double ( sqrt(pow(x1-x2,2)+pow(y1-y2,2)) )

02-18-2010 Turley:
     Added: (Tomi) Syshook UnHide(mobile)
            return values 0 stops the char from unhiding and 1 let the core process it.
     Added: (Tomi) "DisableCoreChecks" 0/1 (default 0) to each attribute entry in attribute.cfg
            if true the core will not check during skill_use ( from skillwindow ) for active skills, 
            active spells, frozen, paralyzed or delay
            if false core will check everything as it does now.
   Changed: Increased Maximum UO SkillID to 57 (default value of uoclient::MaxSkillID)

02-17-2010 Turley:
     Fixed: direct usage of struct/dictionary initializer in array/dictionary/struct definition
            eg: var dict:=dictionary; dict["blubb"]:=struct{a:=1};

02-16-2010 Turley:
     Fixed: StrReplace,SubStrReplace return "Invalid parameter type" instead of crashing if non string object
            is given as to_replace, replace_with
     Fixed: Several small memoryleaks

02-04-2010 Turley:
     Added: polcfg:DiscardOldEvents 1/0 {default 0}
            if set instead of discarding new event if queue is full it discards oldest event and adds the new event
   Changed: "Event queue is full.." only prints if polcfg.LogLevel >= 11

02-03-2010 Turley:
     Added: MethodScript support for mobiles
            NPC: npcdesc.cfg MethodScript entry
            Character: uoclient.cfg section "General" MethodScript entry

02-01-2010 Turley:
     Added: multi create additionally checks for valid realm coord of the corners
   Changed: uotool staticdefrag [britannia] (removed "realm=")
     Added: uotool formatdesc [desc] little helper prints singular & plural form of given desc
     
01-22-2010 Turley:
     Added: Speedhack Prevention System
     Added: ssopt::SpeedhackPrevention 0/1 (default 0)
     Added: chr priv "speedhack" disables Speedhack Prevention for chr

01-15-2010 Turley:
     Added: (Tomi) chr priv "runwhilestealth" you can run while you are in stealth for as many stealthsteps you have
     Added: (Tomi) new npcdesc entry "SaveOnExit" 0/1 ( defaults to 1 )
      Note: this also means that SaveOnExit can be definied in the override_properties struct
   Changed: vitals::ApplyDamage( mobile, damage, userepsys := DAMAGE_USE_REPSYS, send_damage := DAMAGE_USE_DEFAULT )
            vitals::ApplyRawDamage( character, hits, userepsys := DAMAGE_USE_REPSYS, send_damage := DAMAGE_USE_DEFAULT )
            const DAMAGE_NO_SHOW := 0;
            const DAMAGE_SHOW := 1;
            const DAMAGE_USE_DEFAULT := 2;
            DAMAGE_USE_DEFAULT uses the SendDamagePacket setting from combat.cfg (Tomi)
     Added: uo::SendOverallSeason( season_id, playsound := 1 )
            Used to send the Season packet 0xBC to all clients logged on.
            This function doesnt resend the lightlevel or weather after it sends season, that has to be done by scripts.
            chr.setseason( season_id, playsound )
            Used to send the Season packet 0xBC to a single character.
            This method doesnt resend the lightlevel or weather after it sends season, that has to be done by scripts.
            (Tomi)
   Changed: (Tomi) uo::SpeakPowerWords( who, spellid, font := _DEFAULT_TEXT_FONT, color := _DEFAULT_TEXT_COLOR) 
            font, color like every speech function

01-14-2010 Turley:
     Fixed: (Arkham) ip byteorder for gameserverlist if hostname is given
   Changed: (Tomi) gargoyle char create equips 0x1F03 robe
     Added: (Tomi) ssopt.NewbieStartingEquipment 1/0 (default 1) to determine if equipped items 
            created during the character creation should be newbied or not.
   Changed: misc/oncreate.src added third param profession 
            some clients doesnt send skillvalues if profession is given now core doesnt stop char creation, 
            based on third param you can set the skillvalues in oncreate
     Added: more errorchecks to char create, it now checks if hair/beard/face can be equipped (fixes crash with latest OSI
            tiledata where facial horn has the same layer as "normal" horn)
     Added: Combatcfg:AttackWhileFrozen 1/0 (default 1) if set to false attack checks if chr is frozen or paralyzed
     
01-12-2010 Turley:
     Added: on Profile opening and update request "scripts/misc/charprofile.ecl" is called
            params are character, of_who, mode,uctext
            if mode==0 (request) uctext is 0
            if mode==1 (update) uctext is new unicode array
            both modes ignore the return value
            - Tomi
     Added: uo::SendCharProfile( character, of_who, title, uneditable_text := CHARPROFILE_NO_UNEDITABLE_TEXT, editable_text := CHARPROFILE_NO_EDITABLE_TEXT )
            will send the serverside charprofile packet back to client and display it for the player.
            uneditable_text & editable_text are unicode arrays
            constants are:
            const CHARPROFILE_NO_UNEDITABLE_TEXT := array;
            const CHARPROFILE_NO_EDITABLE_TEXT := array;
            - Tomi
      Note: Only a script interface for making a fully working CharProfile without packethooks.
            Not a fully working charprofile system controlled by the core, ALL text strings still have to be 
            stored somewhere by scripts.
            
01-01-2010 Nando:
     Added: (Tomi) New itemdesc property "StackLimit", defines the maximum stack
            of that item (lower than 60k). If not defined, will default to 60000.
      Note: Happy new year. :) 

12-21-2009 Turley:
     Fixed: call of built-in method with ._methodname if overridden
     Added: Multis now support method script

12-18-2009 Turley:
     Added: file::CreateDirectory( dirname )
            returns 1 on success else error 
            ("Error in dirname descriptor","No parent path traversal please.",
            "Directory already exists.","Could not create directory.")
     Added: file::ListDirectory( dirname, extension := LISTDIR_ALL_FILES, listdirs := LISTDIR_DONT_LIST_DIRS )
            extension param can be extension without "." or file.em constant
            file.em constants:
            const LISTDIR_LIST_DIRS      := 0x1;
            const LISTDIR_DONT_LIST_DIRS := 0x0;
            const LISTDIR_NO_FILES       := "";
            const LISTDIR_ALL_FILES      := "*";
            returns array of strings or error
            ("Error in dirname descriptor","No parent path traversal please.","Directory not found.")
      Note: Both functions doesnt check file access rights

12-17-2009 Turley:
     Added: uo::CloseWindow( character, type, object ) - Tomi
            possible values for type
            const CLOSE_PAPERDOLL := 1;
            const CLOSE_STATUS    := 2;
            const CLOSE_PROFILE   := 8;
            const CLOSE_CONTAINER := 12;
      Note: if ( type == CLOSE_CONTAINER ) object has to be a ContainerRef, to close the open container gump.
            else object has to be a MobRef to close paperdoll, status or profile of the chosen mob.

12-16-2009 Turley:
     Added: Encrypted Client support - Tomi
   Changed: uoclient.cfg Listener::Encryption and pol.cfg ClientEncryptionVersion now support
            ignition = uorice = none, 2.0.0x and due to autocalculation major.minor.build (no patch)
            e.g. 7.0.4 for latest client 7.0.4.1
            default for both is "none"
      Note: Till OSI changes the encryption type pol now supports every encrypted client without 
            updating the core (last change was 2.0.4)

12-04-2009 Turley:
   Removed: deprecated pol.cfg entries "MasterKey1","MasterKey2","ClientVersion","KeyFile" - Tomi
     Added: Gargoyles count as mounted while flying

12-03-2009 Turley:
     Added: basic gargoyle flying support (new movemode "F")
     Fixed: poison status for newer clients
      Note: gargoyles can "fly" on tiles with tiledata flag HOVEROVER (MAPDATA_FLAG_OVERFLIGHT)
            rebuilding of all realms is required
            currently flymode can only be activated clientside (0xBF:0x32) and if race=RACE_GARGOYLE
            renamed uo:TILEDATA_FLAG_NODIAGONAL to uo:TILEDATA_FLAG_HOVEROVER

12-02-2009 Turley:
     Added: 0xF3 packet is send instead of 0x1A for clients >= 7 or UO:SA clients - Tomi
     Added: polcfg MaxTileID 0x3FFF / 0x7FFF (default 0x3FFF)
            since client 7.0.0.0 item graphic can be definied up to 0x7FFF - Tomi
     Added: "SA" for expansion type. This includes sending 0x187DF with packet 0xB9. - Tomi
     Added: support of new map TerMur - Tomi
      Note: uoconvert param: 
            realm=termur mapid=5 width=1280 height=4096
            uoconvert.cfg new stairs since SA:
            0x1de0 0x1de1 0x1de2 0x1de3 0x1de4 0x1de5 0x1de6 0x1de7 0x1de8 0x1de9 0x1dea 0x1deb
     Added: Gargoyle support (race = uo:RACE_GARGOYLE)
      Note: graphics are: 
            UOBJ_GARGOYLE_MALE         0x029A
            UOBJ_GARGOYLE_FEMALE       0x029B
            UOBJ_GARGOYLE_MALE_GHOST   0x02B6
            UOBJ_GARGOYLE_FEMALE_GHOST 0x02B7
     Added: support of UO:KR/SA char create packet 0x8D
     Added: new gargoyle hair & beard 0x4258-0x425F & 0x42AD-0x42B0
     Added: UO:KR/SA face support
     Added: ssopt.SupportFaces 0/1/2 (default 0)
            set it to 1 to support basic faces
            set it to 2 to support roleplay faces (sets 0x2000 flag in 0xB9 packet)
      Note: Faces are normal items (like hair/beard) with layer 15, objtype 0x3B44-0x3B57
            roleplay faces 0x3B4E-0x3B57

11-30-2009 Turley:
     Added: polsys::MD5Encrypt(str) returns MD5 hash string.
     Fixed: RecalcVitals function for vital changes doesnt check if maximum value changed

11-26-2009 Turley:
     Added: Syshook CanDie(mobile)
            Called when the mobile is about to die, return 0 to stop death.

11-24-2009 Turley:
     Fixed: missing realm check for ListenPoints

11-23-2009 Turley:
     Added: uotool param staticdefrag [realm=britannia] to defrag/remove duplicate statics (like fiddler does)

11-20-2009 Turley:
   Changed: RecalcVitals( character, calc_attribute := RECALC_INTRINSIC_MOD, calc_vital := RECALC_VITALS )
            const RECALC_INTRINSIC_MOD    := 1;
            const RECALC_NO_INTRINSIC_MOD := 0;
            const RECALC_VITALS           := 1;
            const RECALC_NO_VITALS        := 0;
            possible values for calc_attribute:
            RECALC_INTRINSIC_MOD - calls for every attribute the GetIntrinsicModFunction (old behaviour)
            RECALC_NO_INTRINSIC_MOD - skips the GetIntrinsicModFunction calls
            attribute name string - only calls the GetIntrinsicModFunction for given attribute
            possible values for calc_vital:
            RECALC_VITALS - calls for every vital the RegenRateFunction & MaximumFunction (old behaviour)
            RECALC_NO_VITALS - skips the RegenRateFunction & MaximumFunction calls
            vital name string - only calls the RegenRateFunction & MaximumFunction for given vital
            - based on Tomi
            
11-19-2009 Turley:
   Changed: chr.setlightlevel() now supports endless duration (-1) return is the new gameclock value - Tomi
     Added: [paralyzed] & [deafened] @ singleclick packet - Tomi
     Added: ServSpecOpt CoreSendsSeason 1/0 (default 1)
            Determines if the core should send season packet on char creation/logon/reconnect and realm 
            change based on the season entry in realm.cfg. - Tomi
   Removed: "You cannot insert that item into the container." sysmsg after container CanInsert script 
            returns 0 - Tomi
   Changed: uo::UpdateMobile(who, flags:=UPDATEMOBILE_UPDATE)
            const UPDATEMOBILE_RECREATE := 1;
            const UPDATEMOBILE_UPDATE   := 0;
            if flags is UPDATEMOBILE_UPDATE old behaviour it sends update Mobile packet 0x77, 
            if set to UPDATEMOBILE_RECREATE it sends recreate packet 0x78 - Tomi
     Added: ServSpecOpt CoreHandledTags (default 0xffff)
            bitfield to determine which tags are displayed on singleclick, current used bits are:
            0x1  [title_guild]
            0x2  [frozen]
            0x4  [paralyzed]
            0x8  [squelched]
            0x10 [deafened]

11-17-2009 Turley:
     Fixed: possible hang in party system
            remove object packet send when container is on a character
            several movement code bugs

11-16-2009 Turley:
     Added: NPCs receive EnteredArea event on char resurrect

11-11-2009 Turley:
   Changed: intern container MaxItems too highest possible value (packet size) its now 3200
   Changed: container "can add"-functions to only check weight recursive

10-22-2009 Turley:
     Added: Syshook Ouch(mobile,lastx,lasty,lastz)
            Called if mobile falls atleast 22 down (fixed Clientside value)
     Added: uo::CanWalk(movemode, x1, y1, z1, x2_or_dir, y2 := CANWALK_DIR, realm := _DEFAULT_REALM)
            const CANWALK_DIR := -1;
            movemode is mobile.movemode string
            if y2 is CANWALK_DIR x2 is considered as direction (0-7)
            if x2 and y2 is given it calculates the needed direction
            returns new z value or error
            
10-17-2009 Turley:
     Added: PrivUpdater for "invul","seeghosts","seehidden" and "seeinvisitems" updates/sends/removes objects
            in visual range on enable/disable - Tomi
   Changed: .startlog/.stoplog checks now if priv "plogany" is enabled instead of only given - Tomi
     Fixed: priv "all" now works as expected if enabled every other priv is also enabled

10-14-2009 MuadDib:
   Changed: Methods Char.Squelch() and Char.Deaf() return the gameclock value they are in effect until.
   
10-14-2009 Turley:
     Added: char privilege "canbeheardasghost"
            With this privilege everybody can hear you even as a ghost (no 'oO' replacement) - Tomi
     Added: pol.cfg TimestampEveryLine 1/0 (default 0) if set every line in pol.log gets timestamp
     Added: char.deaf(duration) - duration in seconds.  -1=forever, 0=off
     Added: char.deafened r/o

10-12-2009 Turley:
   Changed: Method/Syshook definitions now supports :pkg: format - Tomi
     Added: ServSpecOpt SpeechRange default 12
            ServSpecOpt WhisperRange default 2
            ServSpecOpt YellRange default 25
            - Tomi

10-10-2009 Turley:
     Added: new Spellbook methods
            book.removespell(id) removes given spellid returns 1/0
            book.addspell(id) adds given spellid returns 1/0

10-09-2009 Turley:
     Added: new Spellbook methods
            book.spells() returns Array of SpellIDs
            book.hasspell(id) checks if SpellID is inside the spellbook returns 1/0

10-07-2009 Turley:
     Fixed: DestroyItem call inside CanInsert scripts

10-03-2009 MuadDib:
     Added: SysHook::CanDecay(item). Return 0, core decay will ignore item and continue on the cycler. If it
            returns 1, core decay will handle the item as normal. - Patch submitted by Tomi
     Fixed: Useage of plural forms for more than 1 word in the itemdesc desc entry. - Patch by Tomi
            
09-22-2009 Turley:
     Added: Combatcfg:SendDamagePacket 1/0 default 0 if set sends packet 0xB (0xBF sub 0x22 for clients<4.0.7a)
            to attacker(ScriptController) and defender on ApplyDamage and ApplyRawDamage
     Added: new param to ApplyDamage & ApplyDamage they are now:
            ApplyDamage( mobile, damage, userepsys := DAMAGE_USE_REPSYS );
            ApplyRawDamage( character, hits, userepsys := DAMAGE_USE_REPSYS );
            const DAMAGE_USE_REPSYS := 1;
            const DAMAGE_NO_REPSYS := 0;
            If userepsys is set to DAMAGE_NO_REPSYS repsys system isnt called (on_attack & on_damage)
 
09-22-2009 MuadDib:
   Changed: NPC/Char ar/ar_mod internal handling rewrote.
     Fixed: NPC Elemental Resist/Damage storage issues.
     Fixed: Lightlevel resetting in client during Login.
     
09-20-2009 MuadDib:
   Changed: Spell casting no longer unhides. Be sure to update your scripts to unhide.
   Changed: SpeakPowerWords() will now check if mob is hidden. If so, it uses Private Say Above.
            
09-18-2009 MuadDib:
     Added: Multi Walk On Script support. Works for player and npc. Just add Walkon itemdesc entry to the house.
      Note: This is in early stages. While it is working, not all cases may register and deregister where a mob
            gets put onto or removed from a house. If you find cases that do, report to bugtracker.
   Removed: Storing scrolls inside spellbooks. Destroyed after insert is complete.
   Changed: Pre-AOS Clients still get the same packet they always did when opening a spellbook, built entirely
            off the bitflag system for newer spellbooks. So no more keeping scrolls inside of books. :D
      Note: As spellbooks are loaded for the first time with newer cores and as added to books, scrolls are
            marked SaveOnExit 0. Newly inserted scrolls from then on, are destroyed during insertion after spell
            contents are updated on the book.
            
09-16-2009 Turley:
   Removed: char.isUOKR
   Added:   char.ClientType r/o bitfield
   Note:    current Flags are:
            CLIENTTYPE_4000  = 0x1,  // 4.0.0a   (new spellbookcontent packet 0xbf:0x1b)
            CLIENTTYPE_4070  = 0x2,  // 4.0.7a   (new damage packet 0x0b instead of 0xbf:0x22)
            CLIENTTYPE_5000  = 0x4,  // 5.0.0a   (compressed gumps)
            CLIENTTYPE_5020  = 0x8,  // 5.0.2a   (Buff/Debuff 0xdf)
            CLIENTTYPE_6017  = 0x10, // 6.0.1.7  (Grid locs)
            CLIENTTYPE_60142 = 0x20, // 6.0.14.2 (feature enable 0xb9 size change)
            CLIENTTYPE_UOKR  = 0x40,
            CLIENTTYPE_7000  = 0x80, // 7.0.0.0  (Gargoyle race)
            CLIENTTYPE_UOSA  = 0x100
   Note:    Pol will be now compiled with flag /LARGEADDRESSAWARE (win only flag) pol should now be able to consume more memory

09-14-2009 MuadDib:
   Removed: All import abilities built in to core for UOX data files. O_O
      Note: The file "import.txt" will be loaded each time POL loads, when found in the world data directory. This file's
            format is the same as, for example, the ITEMS.TXT file POL saves. You can use this for example, to store all your
            doors, decorations, etc, to ensure they are reloaded after a wipe, or loaded every time POL starts. These items
            are added to the real world, and saved to items.txt. However, if on load the same objtype is found at the same
            x y z as the item in IMPORT.TXT, it destroys that item, and loads the import one.
            
09-10-2009 Turley:
    Added:  CompressedGump support packet 0xdd
    Added:  flag param to SendDialogGump() SENDDIALOGMENU_FORCE_OLD/0 default 0
    Note:   SendDialogGump sends compressed gump if (client.isUOKR || (!SENDDIALOGMENU_FORCE_OLD && clientversion >=5.0.0a)) else old uncompressed
    Note:   Patch submitted by Grin

09-09-2009 Turley:
    Added:  ServSpecOpt CarryingCapacityMod (double default 1.0) as * modifier for mobile max_weight
    Note:   Formula is (40 + strength * 7 / 2) * ssopt.CarryingCapacityMod
    Note:   Since ML max weight is send for statusgump
    Note:   Patch submitted by Tomi
    
09-05-2009 MuadDib:
    Added:  POL Linux builds will now create a PID file when loading. Patch submitted by Crazyman

09-05-2009 Turley: 
    Added:  struct .? and .- as shortcut for .exists() and .erase()

09-03-2009 MuadDib:
   Changed: CoreHitSounds, ScriptedAttackChecks, ResetSwingOnTurn, SendSwingPacket all moved from SSOPT to Combat CFG.
   
08-19-2009 Turley:
    Added:  r/o member character.uo_expansion_client client sends this flag at packet 0x5D charselect and 0x00 createchar
    Note:   values are:
            FLAG_T2A         = 0x00,
            FLAG_RENAISSANCE = 0x01,
            FLAG_THIRD_DAWN  = 0x02,
            FLAG_LBR         = 0x04,
            FLAG_AOS         = 0x08,
            FLAG_SE          = 0x10,
            FLAG_SA          = 0x20,
            FLAG_UO3D        = 0x40,  // ?
            FLAG_RESERVED    = 0x80,
            FLAG_3DCLIENT    = 0x100  // 3d Client
            
08-14-2009 Turley:
    Changed: Stopped spam of unknown packet for 0xBF.5 & 0xBF.C

08-09-2009 MuadDib:
      Fixed: Better handling of sending poison updated to UO:KR Clients.
    Changed: UpdateCharacterWeight() now sends correct packets instead of calling on RefreshAR() to
             notify client of new weight. Reduces overhead.
             
08-07-2009 MuadDib:
      Fixed: New system in core for handling layers on items and corpses. On mobile death, only items equipped
             will be given the Layer prop in the corpse.
    Changed: New system for corpses also is affected by insert/remove of items to the corpse by script and
             drop into by player. Dropping new items into a corpse will cause it to set the layer accordingly
             long as nothing else is already using that layer on the corpse.
    Changed: Very small optimization to equip item code for handling the setting of layer.
    
08-06-2009 MuadDib:
    Changed: PasswordOnlyHash removed from core. Now only ClearText and Hashed Passwords will be used.
             Default is now PasswordHash instead of ClearText.
       Note: Using ClearText is not recommended as it leaves all your account's passwords wide open if
             the accounts.txt file is comprimised. You have been warned.
    Removed: Account.PasswordHash - This was for the PasswordOnlyHash.
      Added: Item.getgottenby Member. Returns CharRef of Player holding item, Error if not being held.
      
08-06-2009 Turley:
  Added:     new Methods
             Character.setAggressorTo(chr)
             Character.setLawfullydamagedTo(chr)
             sets aggressor/lawfullydamaged for repsys.cfg:AggressorFlagTimeout seconds for given chr
             Character.clearAggressorTo(chr)
             Character.clearLawfullydamagedTo(chr)
             clears aggressor/lawfullydamaged entry for given chr
             
08-04-2009 MuadDib:
  Changed:   RecalcVitals() and other internal parts of core that share recalc_vital_stuff() will now check to see if
             each vital has changed, before resending it to client. Reduces overhead.
             
08-03-2009 MuadDib:
  Removed:   uopacket.cfg::is6017 has been removed.
    Added:   uopacket.cfg::Version (1 or 2) Default 1
             uopacket.cfg::Client (client version string) Default 1.25.25.0
             Read packethooks.txt for details.
             
07-31-2009 Turley:
    Added:   ServSpecOpts::ResetSwingOnTurn=true/false default false
             Should SwingTimer be reset with projectile weapon on facing change
    Added:   ServSpecOpts::SendSwingPacket=true/false default true
             Should packet 0x2F be send on swing.
             Client sends automatically move packet to face the opponent

07-25-2009 MuadDib:
    Fixed:   Bug blocking equipping when intrinsic weapon was marked as two handed.
    
07-17-2009 Turley:
    Added:   "ShadowRealms"
             polsys::AddRealm(realm_name,base_realm);
             returns 1 or error ("BaseRealm not found.","BaseRealm is a ShadowRealm.","Realmname already defined.")
             Creates a new Realm based on an other realm, uses same map and regions
             polsys::DeleteRealm(realm);
             returns 1 or error ("Realm not found.","Realm is not a ShadowRealm.","Mobiles in Realm.","Items in Realm.")
             Deletes a ShadowRealm, only if the realm is "clean"
    Note:    ShadowRealms get saved/loaded in pol.txt
    Note:    if ServerSpecOpt is set AddRealm/startup creates a Decaythread
    Changed: On realm change client gets RemovePacket for all objects inrange

07-16-2009 MuadDib:
    Added:   Removal of Grid Index to items when Container::remove is called within the core.
    Added:   ItemDesc::Container::MaxSlots = 1-255, default ServSpecOpts::MaxSlots
    Added:   ServSpecOpts::UseContainerSlots=true/false, default false.
    Added:   UseContainerSlots check to can add bulk code to ensure not going over max slot capacity of 255 and a container's max slot capacity.
  Changed:   DropItem packets now redone for Slot support. Better handling internally, and core will move an item to next available slot
             if one sent is not available. Before code is used, it checks if UseContainerSlots is true.
    Note*:   UseContainerSlots is not yet fully implemented. Will cause core to ignore all grid setting for core moved items.
             The purpose of this, is since Legacy 2D clients ignore this setting anyway, you can use this to ignore Max Slots
             and allow core to move items into a container regardless of MaxSlots settings (which is kinda like a secondary Max Items).
             With this enabled, it will enfore MaxSlots when core and player moves items to containers. If Max Items is not reached,
             it will check MaxSlots. If MaxSlots is not reached, allows moving the item into container.
             This is being added to allow to turn grid support on and off based on the client versions (and types) that you will be
             supporting on your shard.
    
07-04-2009 Turley:
    Added:   new Object Class BinaryFile
             File::OpenBinaryFile( filename, mode := OPENMODE_IN, endian := LITTLE_ENDIAN );
             like the other file functions it checks file access rights (fileaccess.cfg) (Read and/or Write)
             mode constants:
             const OPENMODE_IN    := 0x01; // (input) Allow input operations on the stream
             const OPENMODE_OUT   := 0x02; // (output) Allow output operations on the stream
             const OPENMODE_ATE   := 0x04; // (at end) Set the stream's position indicator to the end of the stream on opening
             const OPENMODE_APP   := 0x08; // (append) Set the stream's position indicator to the end of the stream before each output operation
             const OPENMODE_TRUNC := 0x10; // (truncate) Any current content is discarded, assuming a length of zero on opening
             endian constants:
             const LITTLE_ENDIAN := 0x00;
             const BIG_ENDIAN    := 0x01;
             returns BinaryFile Object or error
    Note:    implemented BinaryFile comparisons are
             true/false (!) checks if filestream is open
             == checks if filename is the same
    Added:   BinaryFile methods:
             .close() closes the underlying stream returns 1
             .size() returns the filesize or error
             .seek(int offset, int seekdir) sets position returns 1/0 or error
             seekdir constants:
             const SEEKDIR_BEG := 0x00; // beginning of sequence
             const SEEKDIR_CUR := 0x01; // current position within sequence
             const SEEKDIR_END := 0x02; // end of sequence
             .tell() gets current position returns int
             .peek() Reads and returns the next byte without extracting it (-1 if eof is reached)
             .flush() writes all unwritten chars from buffer to file
             .getInt32() gets unsigned 32-bit (4 byte) 1 or error
             .getInt16() gets unsigned 16-bit (2 byte) 1 or error
             .getInt8() gets unsigned 8-bit (1 byte) 1 or error
             .getSInt32() gets signed 32-bit (4 byte) 1 or error
             .getSInt16() gets signed 16-bit (2 byte) 1 or error
             .getSInt8() gets signed 8-bit (1 byte) 1 or error
             .getString(length) gets a string (1-byte characters) string or error
             .setInt32() sets unsigned 32-bit (4 byte) 1 or error
             .setInt16() sets unsigned 16-bit (2 byte) 1 or error
             .setInt8() sets unsigned 8-bit (1 byte) 1 or error
             .setSInt32() sets signed 32-bit (4 byte) 1 or error
             .setSInt16() sets signed 16-bit (2 byte) 1 or error
             .setSInt8() sets signed 8-bit (1 byte) 1 or error
             .setString(string string, int nullterminate) sets a string 
             set nullterminate to 1 to append a 0 terminator 1 or error
             
07-01-2009 Turley:
    Changed: UoConvert now also saves the color of static tiles
    Added:   ListStatics* return struct member "hue"
    Note:    Rebuild of all realms is required

06-29-2009 MuadDib:
    Added:   Additional check in internal grid checks on containers, to speed up handling for full containers.
    Added:   ServSpecOpt.cfg::MaxContainerSlots=unsigned integer.
                 This will allow setting the internal overall allowed item count for containers. This is introduced for future KR support.
                 KR client is only 125, but we are making this here so custom clients later can support more slots.
                 If you have containers with max item count over 125 and use ONLY 2D, and not KR, set this to your highest amount used!
                 
06-27-2009 Turley:
    Fixed:   Item creation with ItemDescriptor can now override .Desc

06-25-2009 Turley:
    Added:   new r/o Members (Array{Struct{"serial","ref","seconds"}})
             Mobile.aggressorto
             Mobile.lawfullydamaged
             as interface for core repsyssystem

06-20-2009 Turley:
    Added:   new r/w Members (Double) default 1.0
             Mobile.movecost_walk_mod 
             Mobile.movecost_run_mod
             Mobile.movecost_walk_mounted_mod
             Mobile.movecost_run_mounted_mod
             used as multiplier see movecost.cfg doc for exact calculation

06-17-2009 Turley:
    Added:   Method Array.randomentry() shortcut for var entry:=array[RandomInt(array.size())+1];
    Added:   uo::GetRegionLightLevelAtLocation(x,y,realm) returns the current region lightlevel

05-02-2009 Turley:
    Added:   new TargetCoordinates return member "multi" with multiref if coords are inside a multi

04-17-2009 Turley:
    Changed: SpeechMul SysHook has now an additional parameter with the complete message as string
    Added:   party hooks:
             OnLeaveParty(who,fromwho)
             OnAddToParty(who)
             OnPartyCreate(party)
             OnDecline(who)
             OnLootPermChange(who)
    Note:    OnLeaveParty fromwho==who if who removes himself
    Added:   party General options:
             RemoveMemberOnLogoff 1/0 (default 0)
             RejoinPartyOnLogon 1/0 (default 0)
    Note:    RejoinPartyOnLogon is only used if RemoveMemberOnLogoff is true, if partyleader logoffs 
             the next member becomes the leader

-- POL098.2 --
08-21-2009 Turley:
    Fixed:   Regions where limited to 128 due to intern (char)id, changed to ushort

07-31-2009 MuadDib:
    Fixed:   Cleanup crash in shutdown involving characters and combat. Now all clients and characters are disconnected by the
             core before any cleanup is intiated. This will begin the cleanup for client and character alike. 

07-20-2009 MuadDib:
    Fixed:   Item::Facing updates were no longer updating surrounding clients.
    Fixed:   Bug with stackables where graphic and crops may be different, still allowing to combine stack (of same objtype)

07-15-2009 Turley:
    Added:   Support for client 6.0.14.2 and latest UOKR (this change breaks every older UOKR)
             packet 0xB9 has now a length of 5

06-28-2009 MuadDib:
    Fixed:   Graphic/Layer bug when changing graphic and item is equipped. Now core will block this, returning a Error Struct to the script when attempting
             to change the graphic of an item with layer set.

06-27-2009 MuadDib:
    Fixed:   Layer bug with updating/sending equipped items

-- POL098.1 --
06-20-2009 MuadDib:
    Fixed:   Reset now occurs for tile_layer internal property when graphic is changed on item class.
    Fixed:   SetOpponent() for npcs will now once again correctly set the warmode.
    
05-20-2009 Turley:
    Fixed:   TypeOf() return of Error

05-14-2009 Turley:
    Fixed:   some Memoryleaks

04-29-2009 Turley:
    Fixed:   Exception on mobile.kill() if death/chrdeath.ecl does not exist

04-28-2009 MuadDib:
    Fixed:   Removal of items from containers not sending destroy object to nearby clients when object removed.
             This affects containers when was owned by a character.

04-21-2009 MuadDib:
    Fixed:   Crash at shutdown during character cleanup involving players that was in combat.

04-20-2009 Turley:
    Added:   Comparison check == for Boat,Multi,GuildRef

04-19-2009 MuadDib:
    Fixed:   Endian format for SendPartyMsg().
    
-- POL098 --
04-06-2009 MuadDib:
    Changed: When adding ally/enemy guilds, removing ally/enemy guilds, adding/removing members, core now
             updates online members and those around them correctly.
    Added:   If LogLevel in pol.cfg is higher than 1, new report added to console. If an account has AOS Expansion
             and uses a Spellbook, console now reports this if UOFeatureEnable does not contain 0x20 bitflag for
             new spellbook system in client. This is due to client issues with books using old methods when still
             recieving the AOS flag for an account.
                          
04-05-2009 MuadDib:
    Changed: Keys/Seeds for packets 0x8C sent by LoginServer. 6.0.1.7 to 6.0.4.0, I don't recommend using at all.
                 0xFEFEFEFC = UOKR Client
                 0XFEFEFEFD = 6050+ 2D Client
                 0xFEFEFEFE = Normal 2D client (pre-6.0.5.0 client)
    Note:    Change to keys is for passing these details from Loginserver to Gameserver during loginprocess.
             Clients disconnect from LoginServer and Connect to Gameserver. This is the easiest method for
             identifying the client type connecting to your game server since versions are handled to decide
             this on the loginserver connection.

04-04-2009 Nando:
    Fixed:   Removing an offline member from party was causing POL to crash.

04-04-2009 MuadDib:
    Fixed:   Issue with resistances and damages from npcdesc.cfg.
    Note:    NPC's eScript changing/quipping with Resistances/Damages will be rewritten in 099. We are
             putting this into 099 due to a Class Rewrite to NPCs that will resolve this issue and allow
             better expansions of the NPC class in the core.
             
04-02-2009 MuadDib:
    Fixed:   Crash in cleanup of character objects during Shutdown and deletion.
    Fixed:   Crash involving sending warmode information during disconnect/shutdown.
    
04-01-2009 Nando:
    Fixed:   When creating a new char, attributes' caps weren't being set to the default value and
             were just set to a random value.

03-30-2009 Nando:
    Fixed:   Sometimes when casting a spell, a race-condition would make POL end with a 
             passert( !start_attached || (script_ex == NULL) ) error in chrituse.cpp.
    Fixed:   Bug in Packet::GetString(offset, len) where it would return a string of 'len' ascii chars,
             regardless of having a null-byte in there. Will now limit to len or the first null-byte
             found, whichever comes first.

03-30-2009 MuadDib
    Fixed:   Equipment.quality will now convert plain integers to Double/Float for it when using
             item.quality:=2; instead of item.quality:=2.0;
 
03-28-2009 Turley:
    Fixed:   Resend party list if remove hooks dont allow it

03-27-2009 Turley:
    Fixed:   Crash in party speechhandler

03-27-2009 MuadDib:
    Fixed:   Crash in Basic::Trim(). Now checks explicitly for String as param 1. Errors out if not.
    Fixed:   Event LeftArea and EnteredArea both being able to be triggered when 1 is actually disabled.
    
03-25-2009 MuadDib:
    Changed: StrReplace() and SubStrReplace() will now accept Dict/Struct/Array/Error as param 1 and converts
             them to string format (like when using print() or syslog()) before comparing/converting.

03-24-2009 MuadDib:
    Fixed:   Crash with StrReplace() allowing to go past end of a string.
    Changed: StrReplace() will now allow the replace_with string to be empty, to remove the to_replace
             param from the string completely.
    Fixed:   Crash in onRemove system for removing objects on npc/offline mobiles.
                 
03-22-2009 Nando:
    Added:   New servspectopt::SendStatLocks (default false) to send the stat locks message.
             Beware that this message will only be sent to clients which have major version > 3
             (to avoid breaking older ones).
    Changed: Canceling of trade window will no longer trigger refreshing of AR/Resistances/Damages.
             It will only send the status bar packet to the client for weight updates.
    Changed: Updates so refreshing of AR/Resistances/Damages is not called when dropping items unless
             to equip them etc as should be.
             
03-22-2009 MuadDib:
    Fixed:  Bug with items that use the Resource entry in ItemDesc.Cfg causing crashes on shutdown.
    
03-20-2009 MuadDib:
    Added:  Storage system will now ignore all root containers with SaveOnExit set to 0.
    
03-19-2009 Nando:
    Added:  UO::PlayMusic( chr, music_id := 0 ), plays the music with music_id
            on client. You can find the music id's this uses at your UO FOLDER/Music/Digital/Config.txt

03-19-2009 Turley:
    Added:  on Chatbutton pressing "scripts/misc/chatbutton.ecl" is called
    Note:   only simple implementation no Chatsystem!
    
03-18-2009 MuadDib:
    Added:   Basic::Compare(str1, str2, pos1_start:=0, pos1_end:=0, pos2_start:=0, pos2_end:=0);
             Can be used in 3 overloaded ways. Returns 1 on compare success.
                 Compare(string1, string2)
                 Compare(string1, string2, string1_index, string1_length)
                 Compare(string1, string2, string1_index, string1_length, string2_index, string2_length)
             Index is a starting position to begin the compare in the string, and length is the length to
             compare from the index. When using the 3rd method, you can compare substrings in both strings
             instead of just the substring of string1 to entire string2.
    Fixed:   Bug with Player Color and their magic underwear in the Race Changer packet handling.             
             
03-18-2009 Nando:
    Added:   New ssopt option: CoreSendsCaps 0/1 (default 0), makes POL send
             attribute cap information in the Send Skills (0x3A) packet.

03-17-2009 Nando:
    Added:   New ssopt option: DefaultAttributeCap (default 1000), defines
             which value POL should use as cap for attributes.
    Added:   New attributes.cfg option: DefaultCap (default DefaultAttributeCap),
             to set the default for each attribute.
    Added:   GetAttributeCap(who, attr), SetAttributeCap(who, attr, capvalue) and
             GetAttributeDefaultCap(attr). The names should explain it all.
     Note:   Caps are defined in tenths (100.0 -> 1000, 55.2 -> 552), same as 
             base values.
    
03-17-2009 MuadDib:
    Added:   Concealed Updater now also run when changing command levels.
    Added:   Basic::Trim(string, type, set). Trims whitespaces from strings
                 String = String to trim from.
                 Type = TRIM_LEFT, TRIM_RIGHT, TRIM_BOTH. Directions to trim the whitespace from. Default is BOTH.
                 Set = Character set to trim as whitespace. Default is " ".
    Added:   Basic::StrReplace(string, to_replace, replace_with). Replace all instances of to_replace in the string
             with replace_with.
    Added:   Basic::SubStrReplace(string, replace_with, start, length:=0). Replace portion of string using replace_with,
             beginning at start for length. If length passed is 0 or lower, it replaces from start to end of string.
             Error Returns: "Index must not be negative", "Index out of range", "Length out of range", "Length must not
             be negative"
             
03-12-2009 Turley:
    Added:   repsys.cfg General section "PartyHelpFullCountsAsCriminal 1/0" default 0 if 0 OnHelp does not set
             mobile to criminal if helped char is criminal/murderer when they are in the same party
             
03-11-2009 Turley:
    Added:   new systemhook script 'OnCast'
             function OnCast(who, spellid)
             is called if who casts a spell (including macros) before all checks
             Return: 0 if you wish POL to perform the checks and casting, 1 if you want to handle it fully scriptside
    Note:    The two partystatusgump buttons send spellid 11(green) and 29(red) with clientside reserved next target answer
    Added:   on Paperdoll Guildbutton pressing "scripts/misc/guildbutton.ecl" is called
    Added:   on Paperdoll Questbutton pressing "scripts/misc/questbutton.ecl" is called
    Added:   on Paperdoll Virtuebutton (pentagram doubleclick) pressing "scripts/misc/virtuebutton.ecl" is called
    Removed: "Client tried to drop item to X,Y,Z  but server is putting it at Z=" logmsg
    
03-09-2009 MuadDib:
    Changed: Console will no longer spam about invalid speech color. Instead it adjusts the
             color back to the default 1001 color and goes on.
             
03-08-2009 Turley:
    Added:   Partysystem
             new savefile parties.txt
             new em Module party.em
             new cfg file config/party.cfg
             new Object Class Party
             savefile parties:
             saves Leader,Members and Cprops
             new Char members:
             who.party r/o returns PartyRef or Error
             who.candidate_of_party r/o returns PartyRef or Error
             who.partycanloot 1/0 r/o
             PartyRef members:
             party.members r/o returns Array of OfflineCharRefs
             party.candidates r/o returns Array of OfflineCharRefs
             party.leader r/o returns OfflineCharRef
             PartyRef methods:
             party.setleader(CharRef) sets new Leader returns 1/Error
             party.addmember(CharRef) adds new Member returns 1/Error
             party.addcandidate(CharRef) adds new Candidate returns 1/Error
             party.removemember(CharRef) removes Member returns 1/Error
             party.removecandidate(CharRef) removes Candidate returns 1/Error
             party.setprop/getprop/eraseprop/propnames for cprops
             Party.em:
             CreateParty( leader, firstmember ); Creates a Party returns 1 or Error
             DisbandParty( partyref ); Disbands a Party returns 1 or Error
             SendPartyMsg( party, character, uctext ); Sends PartyMsg with Sender=character returns 1/Error
             SendPrivatePartyMsg( party, character, tocharacter, uctext ); Sends PrivateMsg with Sender=character
             returns 1/Error
             party.cfg:
             General
             {
                 //How many chars are allowed in a Party (normal clients only have 10 slots)
                 [MaxPartyMembers int (default 10)]
                 //Newer Clients (>=3.0.6e) does not automatically change "/# " to private msg (they use "/t #")
                 //set to true any public msg will be checked for "# " (0-9 0=slot 10)
                 [TreatNoAsPrivate (1/0) (default 0)]
                 //How long is an invite valid befor automatic decline
                 //set to 0 disables the timeout
                 [DeclineTimeout int seconds (default 10)]
                 //Prefix for a private Msg (e.g. P:)
                 [PrivateMsgPrefix string (default "")]
             }
             HookList
             {
                 // CanAddToParty(leader,member) return check true/false
                 // called when a leader invites someone
                 CanAddToParty
                 // CanRemoveMember(leader,member) return check true/false
                 // called when leader wants to remove member
                 CanRemoveMember
                 // CanLeaveParty (member) return check true/false
                 // called when member wants to leafe the party
                 CanLeaveParty
                 // OnPublicChat(member,uctext) return check none
                 // called when a member sends a PartyMsg e.g. for logging
                 OnPublicChat
                 // OnPrivateChat(member,tomember,uctext) return check none
                 // called when a member sends a PrivateMsg e.g. for logging
                 OnPrivateChat
                 // OnDisband(partyref) return check none
                 // called when a Party is about to be disbanded
                 OnDisband
                 // ChangePublicChat(member,uctext) return new uctext/true/false
                 // called when a member sends a PartyMsg return value is the new uctextarray,
                 // or true for no change, or false to block the msg
                 ChangePublicChat
                 // ChangePrivateChat(member,tomember,uctext) return new uctext/true/false
                 // called when a member sends a PrivateMsg return value is the new uctextarray,
                 // or true for no change, or false to block the msg
                 ChangePrivateChat
             }
    Note:    implemented PartyRef comparisons are ! and ==
    Note:    Candidates are not saved
             A party with (candidates+members)<=1 gets disbanded
    Note:    All msgs send are cliloc's used cliloc numbers are:
             1005437, 1005439, 1005440, 1005441, 1005442, 1005444, 1005445, 1005446, 1005447, 1005448,
             1005449, 1005450, 1005451, 1005452, 1005453, 1005455, 1008087, 1008089, 1008090, 1008091,
             1008092, 1008094, 1008095, 3000211, 3000222, 3000223
            
03-08-2009 MuadDib:
    Fixed:   Spacing for all titles and name for mobs in Tooltips and Paperdoll. Also added the
             mob.title_guild in the Tooltips string for names of mobiles.

03-08-2009 Nando:
    Added:   New privilege "moveanydist", will allow moving items regardless of distance (by now,
             the only limit to this priv is the client.)

03-07-2009 MuadDib:
    Changed: Setting of title_prefix, title_suffix, title_race, title_guild will no trigger an
             obj cache to be sent to tooltip enabled clients for updates of tooltips client side.
             This does not affect paperdolls. Paperdolls not being updated until Double Clicking
             again is an issue client-side.
    Added:   AOS Extended Statbar members such as followers, followers_max, tithing, and luck will
             now cuase the Update packet to be sent to AOS enabled accounts when changed.
    Changed: Handling of packet 0x07 (Pick Up Item Request). On success, core now checks for if the
             item was equipped on yourself, and refreshes ar and sends stats. If was in a container
             not on your character, only refreshes stats. If item was on the ground, only stats. If
             on a mobile other than yourself, only stats. If item was inside your own worn items,
             it does nothing (since not worn, and no additional weight to send to client). The big
             Difference here, was client use to ALWAYS refresh the ar of character and statmsg. This
             will eliminate at the least, over 50 loops per pickup when it's not needed, and packets
             not being sent, when not needed.
             
03-06-2009 MuadDib:
    Added:   Elemental Damage properties added for items and mobiles. These follow the same
             rules as all the AOS Resistances. Same details for itemdesc, GetItemDescriptor(),
             etc.
             Mobile.damage_fire, damage_cold, damage_energy, damage_poison, damage_physical R/O
             Mobile.damage_fire_mod, etc. R/W
             Item.damage_fire, etc. R/O
             Item.damage_fire_mod, etc R/W
             Itemdesc.cfg: FireDamage, ColdDamage, EnergyDamage, PoisonDamage, PhysicalDamage
                 ItemDesc entries accept Dice Strings just like resistances.
             NPCDesc.Cfg: FireDamage, etc just like ItemDesc.cfg
             
03-05-2009 Nando:
  Changed:   Core will no longer spam "out-of-sequence gump command" when closing.
  Changed:   CloseGump(who, pid, response := 0) will now accept any object to be returned,
             and will send '0' as the buttonid in close gump packet.
    Added:   Statlock change (Extended Stats, 0xBF sub 0x1A) will be handled if
             CoreHandledLocks is enabled. It will now send statlock (Extended Stats,
             0xBF sub 0x19) on every status update.

03-04-2009 Nando:
    Added:   UO::CloseGump(who, pid, response := 0), closes gump by sending 0xBF's CLOSE_GUMP,
             and returns 'response' for the gump script. 'response' is a LONG. 'pid' is from
             the script that issued the SendGumpDialog() command.           

03-03-2009 MuadDib:
    Changed: Item and Character members for AOS Resistances now report the total of resist and
             resist_mod.
             
03-02-2009 MuadDib:
    Fixed:   eScript's Internal "move" command causing items to get misplaced in wrong realms
             on move failed MoveItem* Commands in eScript.
             
03-02-2009 Nando:
    Fixed:   When running out of memory, the creation of new threads is not possible. Core
             will now check if the thread was properly created to (probably) solve the symptom
             of zombie threads. The problem of not having enought memory to create thread is
             not solved, though. There will still be logs of this error.

03-01-2009 MuadDib:
    Fixed:   Issue with Mount Objtype 0xF021 and EquipItem() ignoring setting it's Layer.
    Added:   Complete packethook support with Clients 6.0.1.7 and higher. This is handled via
             the earlier added Is6017 uopacket.cfg entry. This will allow you to specify a 
             packethook to be triggered ONLY if the client involved is 6.0.1.7 and higher.
             It does not have to be a different packet size for this to work, only the client.
    Added:   "KR" for expansion type. This includes sending the 0x86DB with packet 0xB9.
    
02-28-2009 MuadDib:
    Changed: UO::DestroyItem(). Now sends a Destroy Item packet to the script controller for
             the item destroyed. This is in addition to sending in range of the item. Reason
             for this, is for Storage Containers across realms.
    Added:   New flag for uopacket.cfg of "Is6017 0/1". This is show the defined packet entry
             is explicity for a 6.0.1.7 and higher packet type. Will let you define packethooks
             for the same packet, that is different based on client version.
    Added:   Character.followers = int. This is for storage for the Followers byte in statmsg
             packet.
    Added:   ML Expansion statmsg packet support. If Expansion for account is ML or higher, 
             and client version is 5.0 or higher (or is KR), sends ML Info Flag and data.
    Added:   Special Verbose messages (with POL.CFG::Verbose=1) for 6.0.5.0+ crypt seed packets
             and the UOKR 0xFF Seed Packet.
             
02-27-2009 MuadDib:
    Fixed:   Clothing on corpses. COMPLETELY! This age old bug is now 100% fixed. If it was
             equipped at time of death, it will be on the corpse until the on remove script
             check for the corpse is triggered for taking the item out (on remove, not can)
    Added:   Base 6.0.1.7 and up Incoming Packet Handling ability to core.
    Changed: Packets 0x3C updated for supporting clients 6.0.1.7. and newer.
    Changed: Grid index support (KR and 6.0.1.7) for Drop item Packet and sending. Grid
             Index is still not set on Container Add by scripts and core yet (since this is
             only truly needed for KR support for slotted bags).
    Changed: Updated Secure Trade Drop Item packet to support 6.0.1.7 and newer clients.
    Changed: Updated sending of packet 0x25  to support 6.0.1.7 and newer clients.

02-26-2009 Nando:
    Fixed:   Bug where a player / npc moving in a diagonal direction 'd' wasn't blocked by
             items on direction 'd+1' and 'd-1'. (For example, moving in direction NE while
             having items blocking on N and E was allowed by core, while disallowed by client)

02-26-2009 Turley:
    Added:   uo::CheckLosBetween( x1, y1, z1, x2, y2, z2, realm := _DEFAULT_REALM )
             Same like uo::CheckLosAt and uo::CheckLineOfSight

02-25-2009 Nando:
    Added:   New attributes.em functions: SetAttributeLock(who, attrname, lockstate) and
             GetAttributeLock(who, attrname). With new constants: ATTRIBUTE_LOCK_UP,
             ATTRIBUTE_LOCK_DOWN, ATTRIBUTE_LOCK_LOCKED. This works for any attribute.

02-25-2009 MuadDib:
    Added:   Support for UOKR Poisoned Status bar updates. Core will now update UOKR clients correctly
             when poisoned set to true or false for a character.
          
02-24-2009 MuadDib:
    Changed: SendPacket() now returns an error if packet string passed is not valid size (Divisible
             by 2).
    Added:   SendPacket() buffer size now allows max packet size. No more need to worry bout length.
    Fixed:   Issue where equipped spellbooks would not open to the correct bookmarked page when opened.
    Added:   Support of 0x25 Packet (Send item in container) with Client version >= 6.0.1.7.
    Added:   Support for Grid Index with Trade Container Packet sending.
                              
02-22-2009 MuadDib:
    Changed: Updating of worn items will be handled by sending Delete Item packet to those
             in range, then sending the worn item packets. This is to address an issue with
             client not updating worn items on other players when graphics.color.etc are changed.
    Removed: Saving of base AOS Resistances to pcs.txt. This is not truly needed, as core will handle
             updating these live based on the armor etc. resist mods only thing needing saved now at
             this point. Just like AR. Same with Items.
             
02-22-2009 Nando:
    Added:   New servspecopt.cfg option: CoreHandledLocks, default to false. If enabled, core will
             handle the change of skill locks and stat locks from the client (setting the attribute
             locks).
    Added:   Every Attribute now have a lock state. Later, this lock state will be read/changed via
             eScripts methods.

02-21-2009 MuadDib:
    Added:   Ability to use Dice strings for AOS Resistances in itemdesc.cfg entries.
    Fixed:   Bug allowing two players to open trade window, walk away, and continue trading. If players
             get more than 4 tiles away, it will now cancel the trade upon walking to 5th tile away.
    Added:   ServSpecOpt::AllowMovingTrade=0/1(default 0). 0 = Disable moving more than 4 tiles with
             an open trade window. If you move more than 4 tiles from who trading with, cancels trade.
    Removed: UOClient::Listener::Statcap
    Added:   Character.statcap = Replaces the Listener::Statcap. Default 225 r/w
             Character.skillcap = This is for storage, of overall skillcap. Default 700 r/w
             Character.followers_max = Max followers for statmsg packet. Default 0 r/w
             Character.luck = Luck for statmsg packet. Default 0 r/w
             Character.tithing = Tithing for statmsg packet. Default 0 r/w
    Added:   Min/Max Damage added as per OSI Standards to Statmsg packet. This is done by the min and
             max of the dice roll for a weapon before any mods etc.
    Fixed:   Now cannot request stats for chars not visible to you, concealed from you, and over 20
             tiles away.
             
02-20-2009 MuadDib:
    Added:   Priv "plogany". Used with new startlog and stoplog commands to activate target cursor.
    Changed: Built-in textcommand .startlog and .stoplog for packet logging. If character has the
             plogany priv they get a target cursor to select who to set packet logging for.

02-18-2009 MuadDib:
    Fixed:   Fixed Physical Resist not showing correctly with AOS Resistances in Statbar in place of AR.
    
02-18-2009 Turley:
    Fixed:   ..Boat Fix Drunken Coder syndrome?
    
02-17-2009 MuadDib:
    Fixed:   Instances where core uses UO::ClearGottenItem() type code caused ghosted item on client
             cursor. Will require more feedback from users after publish for remaining instances
             where this still occurs (outside of ClearGottenItem()).
             
02-16-2009 Turley:
    Fixed:   Hold again part of boat multi
    
02-07-2009 Turley:
    Removed: SystemFindObjectBySerial() flag SYSFIND_SEARCH_STORAGE_AREAS (was obsolete since years)
    
02-05-2009 MuadDib:
    Added:   UOClient::Listener::AOSResistances 0/1. This flag aids in deciding which version
             of Armor to send in the StatMsg packets. With this enabled, a client who uses
             an account with AOS Expansion enabled will see their Physical Resist instead
             of AR member.
             
02-03-2009 MuadDib:
    Added:   Character.resist_fire_mod/resist_cold_mod/resist_energy_mod/resist_poison_mod
             /resist_physical_mod as R/W.
    Added:   Item.resist_fire_mod/resist_cold_mod/resist_energy_mod/resist_poison_mod
             /resist_physical_mod as R/W.
    Changed: GetItemDescriptor() Handles new AOS Resistance Entries.
    Added:   POL Debug Port has access to Mobile/Item resist members.
             
02-02-2009 MuadDib:
    Added:   Anytime AR will get refreshed (armor damaged, equip/unequip, etc), Resistances
             for Character will also get updated based on the items worn.
    Note:    UO::EquipItem() and UO::EquipItemFromTemplate() trigger the same Equip Code in
             core as dropping it on your paperdoll. So should be up to date with new resistance
             code in equipping also.
    Note:    AOS Physical Resist is NOT the same as AR. Keep that in mind, when writing syshooks
             for combat, equip scripts, spells, etc. Eventually Core Combat will differentiate
             between these based on Expansion (on which to use for a client or npc). But as of
             right now, they will always use AR for combat, etc.
             
02-01-2009 MuadDib:
    Added:   Character.resist_fire/resist_cold/resist_energy/resist_poison/resist_physical members
             as R/O. All these are for is storage. No core implementation for resists is present.
             These ARE sent with the Full Stat Msg packet also, based on Expansion. These are also
             stored to pcs.txt.
    Added:   Item.resist_fire/resist_cold/resist_energy/resist_poison/resist_physical members as R/O.
             This was added at item level, to cover armor, weapons, clothing, containers, etc for
             broad spectrum use on any item class that could be equipped. Such as Quivers and Totems
             in AOS.
    Added:   NPC.resist_fire/resist_cold/resist_energy/resist_poison/resist_physical members as R/O.
    Added:   NPCTemplate::FireResist/ColdResist/EnergyResist/PoisonResist/PhysicalResist. These work
             just like NPCTemplate::AR. You CAN use diceroll strings for these just like AR, or a set
             number for it's amount.
    Note:    These are only written to file if the amount is != 0.
    Added:   Itemdesc FireResist/ColdResist/EnergyResist/PoisonResist/PhysicalResist.
                 
01-29-2009 MuadDib:
    Added:   NPC.saveonexit 0/1. Same as for Items. When set to 0 (1 default), the NPC and all
             items contained within it's wornitems container are IGNORED during save.
    Fixed:   Parry will now only refresh the AR if a shield is equipped, as was intended.
    Removed: Some ... Drunken Coder syndromes. :)
             
01-28-2009 MuadDib:
    Changed: Rewrote ObjCache Building. Now constructs the packet for uokr/aos once when sending
             to a group (send to in range). Previous method built this packet per client requiring
             it. Should improve handling in populated areas.
    Fixed:   Client bug where AOS Expansion accounts could not see normal magery books without
             UOFeatureEnable 0x20 bit set. Although this IS a client bug, found a way to fix this
             VERY common bug server-side. As a feature of this fix, you can now have the AOS
             features that do NOT require 0x20 (tooltips etc), AND the magery books work without
             packet hooks.
             
01-28-2009 Turley:
    Changed: Optional parameter flags:=FACE_NORMAL/FACE_FORCE added to 
             TurnToward(),TurnAwayFrom(), TurnTowardLocation(), TurnAwayFromLocation()
    Fixed:   servspecopt option HiddenTurnsCount check readded in facing change
    Fixed:   Privilege "freemove" can now also be used for NPCs

01-27-2009 MuadDib:
    Changed: uoclient.cfg::General::Statcap is deprecated now. Please change to now use
             uoclient.cfg::Listener::Statcap. This is for the new upcoming Listener Seperate
             settings. This new step in POL will allow custom settings for clients based on the
             Listener (uoclient.cfg) they are connecting through. Upcoming changes (but not yet
             done) will include such things as UOFeatureEnable, TotalStatsAtCreation, ItemColorMask,
             and so on. This is to make it so you can configure different ports for different client
             configurations and expansions. One use of this, is to allow both 2.0.0 clients on your
             shard, AOS Clients with Tooltips, ML Clients without tooltips, and so on. The
             possibilities will be good, and really expand the support you can give with your
             scripts.
    Fixed:   Magery Books will now be viewable for AOS enabled accounts on servers that do NOT have
             the UOFeatureEnable 0x20 bitflag to enable AOS style books. This was implemented to fix
             a CLIENT BUG. But, since so many people do not seem to realize you MUST have 0x20 on for
             AOS style book handling on AOS activated accounts, we must do this. Boo to you :(
             
01-27-2009 Turley:
    Changed: math::Min/Max now accepts Array as first parameter, if given returns the biggest/lowest
             Integer/Double entry (second parameter is ignored).
             Errors: "Array empty"&"No Integer/Double elements"
             Second parameter has now default value of 0

01-25-2009 MuadDib:
    Changed: Rewrote entire core handling of config/bannedips.cfg
             This should address a small memory leak caused by the cfg system (leak still exists
             I just changed how it is done with this file). It also will increase POL speed for
             login/account verification. Remember, the larger your bannedips.cfg, the longer it takes
             for the loginserver to verify the client IP is not banned.
    Added:   ReloadConfiguration() will cause the bannedips.cfg to get reloaded. YAY.
    Added:   Item.saveonexit member. Does what it says. All items default to 1. If you set this
             to 0 the item and (if container, it's contents) will NOT be saved to datafile.
             
01-23 Nando:
    Changed: polcore().bytes_sent and polcore().bytes_received are now Doubles. This will fix some
                 problems with negative values after some time... (internally they are now 64 bit integers).
    Note:    Lots of small leaks fixed, and more to come. Too much to list here, but you will feel the
                 difference.
 
01-16 Turley
        Fixed:   Filled PolCore().iostats.received with sense

01-16 Nando
        Fixed:   UOConvert was always reading map0.mul when uomapid is 1. It will now try to read map1.mul,
                 and if not found read map0.mul. (The same for staidx1 and statics1)

01-07 MuadDib
        Added:   Due to Ecompile always breaking for single file and right click compile useage when
                 no absolute path is given in the ecompile.cfg, added redundant code to verify drive
                 letter path in Windows environments. (aka, if you use "scripts" for include directory
                 instead of "c:\pol\scripts"). This should help in most cases. (Win32 Cores only right now)
        Note:    This works by checking if the core simply looked for "ecompile.cfg" or if it used the
                 -C <path to config> and handled accordingly. If you pass -C <path> it uses that to append
                 to the beginning of the dir structure in the config. Otherwise it appens the structure
                 based on the location of ecompile.exe being executed (since it's looking there for the cfg).
        Note:    In case people never realized. If you set the Evironment Variable called ECOMPILE_CFG_PATH
                 to point directly to the path where ecompile.cfg is kept, Ecompile.exe will use this to
                 locate your config file (Read core-changes people :D )
        Added:   ECompile.exe Flag "-E<path to ecompile cfg>". Correct, no space between them just like the
                 -Ppath Option. This is for Windows machines. It sets/changes the ECOMPILE_CFG_PATH Environment
                 Variable via the commandline so no need to add/edit it via the System Properties of the machine.
                 Remember, you must be logged in with Admin rights to change Environment Variables and this won't
                 show in the System Properties until Reboot. But it IS accessible WITHOUT rebooting.
                 
01-03 MuadDib
        Added:   Ability to send two commands to the POL Service via SCM (Service Control Manager).
                 Command 1200 is a Beep (just for Nando), and 1201 will initial POL Shutdown just like
                 via Script or clicking on Stop on the POL System Tray Icon.
                 More to come later.
        Fixed:   Drunken coder syndrome in the AOS Tooltip handling and oldschool Tooltip code too.
        Removed: Logging/Reporting of empty Attack Request Packets. Useless information that is unreliable.
        Removed: References to unused portions of POL.cfg (things no longer supported that was still being
                 checked for).
        
01-02 Turley
        Changed: Scriptname & PC info in .setprop log entry "wtf, setprop w/ an error"

12-26 MuadDib
        Added:   Ecompile.exe flag -xt defined in /? output.
        Added:   Ecompile.exe flag -Au added. This is same as -A but to only compile Updated Src.
        Added:   Ecompile.exe flag -s to Display Summary if -q is not set.
        Added:   Ecompile.exe flag -D to create .dep files (Dependency information).
        
12-20 Turley:
        Added:   new char member .clientver_detail returns struct of ints {major;minor;rev;patch}
                 new char method .compareversion(string) returns 1 if clientversion is >= then given version string
                 else 0 or error "Not enough parameters"/"Invalid parameter type"/"No client attached"
        Added:   new ssopt "ForceNewObjCachePackets" default false
        Added:   support for new ObjectCacheInfos introduced in 5.0.0
                 old behavior: Server sends 0xBF Sub 0x10 per object ->Client response also with 0xBF Sub 0x10 per item
                 new behavior: Server sends 0xDC per object -> Client response with 0xD6 (there can be more then one serial up to ~16)
                 intern check is 
                 if ((ssopt.ForceNewObjCachePackets) || (isUOKR) || (clientversion.major>=5))
                 since the client sends his clientversion not instantly the first few ObjCacheInfos are sent
                 the old way (thats why the new ssopt is added)
                 Note: since client 6.0.5.0 the clientversion is instantly known (new seed packet)
        Added:   support of new seed packet (>=6.0.5.0)
                 Note: right now no new packet is implementend (some packetsizes have changed)
                 
12-19 Turley:
        Changed: Extended PerformAction() it is now:
                 PerformAction(character,action,framecount:=5,repeatcount:=1,
                               backward:=ACTION_DIR_FORWARD,repeatflag:=ACTION_NOREPEAT,delay:=1);
12-18 MuadDib:
        Changed: Aux Client now sends "Connection closed" to a client that attempts to connect
                 from an invalid IP according to IPMATCH settings before closing the socket.

12-18 Turley:
        Added:   Setting for servspecopt.cfg 'PrivacyPaperdoll' Default is disabled.
                 If enabled, Paperdoll gives only char name for others (See Luth 09-28)

12-17 MuadDib:
        Fixed :  Item.layer gets reset to 0 when unequipped.
        Fixed :  When loading Realms, POL will shutdown if it cannot find any realms
                 and say so.
        Added :  Item.tile_layer returns the Layer setting in the Tiles.cfg/Tiledata.
                 This was added to always give the layer it uses, while leaving the
                 internal handling both of Core and Scripts that utilize the fact of
                 "if layer is set, it's equipped". This is ALWAYS set from the tile info
                 at server load. So changing your tiledata, re-creating tiles.cfg will
                 auto update your items.
        Note  :  Item.layer gets internally reset on server load if it is equipped, via
                 tiles.cfg entry as well.

12-16 MuadDib:
        Added :  AuxSvc Configs now accept an IPMATCH entry identical to /config/servers.cfg.
                 This is only an additional security feature, and not required to be in the .CFG :)
                 The illegal ip will be treated by immediately closing the connection.

12-14 Nando:
        Fixed:   Characters/Starting Location packet wasn't sending the correct characters number. This
                 was causing problems when enabling the 6th & 7th slot (or limiting to 1 slot). Characters
                 number will now be set to Max(CharacterSlot, 5). The number of CharacterSlots shown will
                 depend on the acct expansion. (If it´s more than AOS, it'll send > 6, else 5).
        Added:   Flags in the Characters/Starting Location packet and the Enable Features (0xB9) are
                 now being set according to the CharacterSlots option in pol.cfg. It only works now 
                 with 1, 5, 6 and 7 slots, as this is a client limitation. You can hook the 0xB9 packet
                 to change this in the future.

12-10 Nando:
        Removed: POL's Windows-systray-icon beep when right-clicking is now gone.
        Changed: Region's internal tile zone is now 4x4 (was 32x32).

12-05 Luth:
        Fixed:   A bug in Run_Script caused when a Parent script ended before the child script.

10-29 Luth:
        Changed: PrintTextAbove*() now takes one more optional parameter, journal_print, with acceptible values:
                 JOURNAL_[UC_]PRINT_NAME:    In the journal, it prints the item's description / npc's name, colon, the message (POL standard)
                 JOURNAL_[UC_]PRINT_YOU_SEE: In the journal, it prints "You see: " followed by the message (UO standard)
                 This does not affect the text that is printed above the item, ONLY what is shown in the Journal.
        Fixed:   OnRemoveScript and OnInsertScript now called with all appropriate parameters
                   program onremovescript(character, container, item, item_amount, movetype)
                   program oninsertscript(character, container, movetype, inserttype, adding_item, existing_stack, amount_to_add)

10-28 Luth:
        Changed: Set_Script_Option() now returns the previous value that was set for that option
        
09-28 Luth:
        Added:   npc::Face( direction );
        Added:   mobile.SetFacing( direction, flags := FACE_NORMAL );
        Note:    mobile.facing := [0-7];  is the same as calling:  mobile.SetFacing( [0-7], FACE_NORMAL );
        Added:   MOVEITEM_IGNOREMOVABLE flag to move an object regardless of its .movable property
        Fixed:   Paperdolls now give all information for self, and less information for others

09-23 Turley:
        Added:   uo::PlaySoundEffectXYZ( x, y, z, effect, realm := _DEFAULT_REALM );

09-17 Turley:
        Added:   uo::CreateNPCFromTemplate param override_properties can now
                 contain .CProps Dictionary (key=cpropname value=cpropvalue)

09-08 Turley:
        Added:   uo::UpdateMobile(mob)
                 Sends to mobiles in visual range UpdatePlayer packet of mob, for example to
                 inform of notority changes
        Added:   Packet 0xC7 Functions:
                 uo::PlayMovingEffectEx( source, target, effect, speed, duration := 0, 
                                         hue := 0, render := 0, fixeddirection := 0, explode := 0, 
                                         effect3d := 0, effect3dexplode := 0, effect3dsound := 0 );
                 uo::PlayMovingEffectXYZEx( srcx, srcy, srcz, dstx, dsty, dstz, realm := _DEFAULT_REALM, 
                                            effect, speed, duration := 0, hue := 0, render := 0, 
                                            fixeddirection := 0, explode := 0, 
                                            effect3d := 0, effect3dexplode := 0, effect3dsound := 0 );
                 uo::PlayObjectCenteredEffectEx( center, effect, speed, duration := 0, hue := 0, 
                                                 render := 0, layer := 0, effect3d := 0 );
                 uo::PlayStationaryEffectEx( x, y, z, realm := _DEFAULT_REALM, effect, speed, 
                                             duration := 0, hue := 0, render := 0, 
                                             layer := 0, effect3d := 0 );
                 layer,effect3d,effect3dexplode,effect3dsound are only interpreted by the 3D client
                 (current known) render values are:
                 0 no change
                 1 It becomes dark
                 2 It becomes bright
                 3 Bright color is emphasized and dark color is converted transparently
                 4 The translucency (transparency is high)
                 5 The translucency (it is close to primary color)
                 6 Negative positive reversal
                 7 The background which is transparent negative positive reversal
                 layer values are:
                 0 Head
                 1 RightHand
                 2 LeftHand
                 3 Waist
                 4 LeftFoot
                 5 RightFoot
                 7 CenterFeet
                 effect3dexplode and effect3dsound are only interpreted if explode is set
                 effect3d and effect3dexplode values can be found in client/particles dir
                 Examples:
                 CastAnimation only seen by 3D clients:
                 PlayObjectCenteredEffectEx( chr, 0, 10, 5, 0, 0, 1, 9041 ); //firesparkle on right hand
                 PerformAction(chr,0xCB);  // moves with char
                 Fireball with explosion and sound:
                 PlayMovingEffectEx( chr,tar,0x36d4,7,0,0,0,0,1,9502,4019,0x160);
        Changed: StatRequest 0x34 checks if target is visible to char (e.g. Injection exploit)

08-29 Turley:
        Added:   uo::GetGlobalPropertyNames()
        Changed: uo::FindSubstance( container, objtype, amount, makeinuse := 0 );
                 to FindSubstance( container, objtype, amount, makeinuse := 0, flags := 0 );
                 flags are:
                 FINDSUBSTANCE_IGNORE_LOCKED : Find matches in locked containers
                 FINDSUBSTANCE_ROOT_ONLY     : Do not find matches in sub-containers
                 FINDSUBSTANCE_FIND_ALL      : Find all matches ignoring given amount
        Added:   new Char methods:
                 .attack_once([opp])
                 attacks once without modifing the swingtimer
                 if no opp is given attacks current attackable opponent, else attacks given opponent (and
                 but checks if opponent is attackable
                 .setswingtimer(time)
                 if opponent is set sets swingtimer to given ms time
                 .kill([killer])
                 kills character ignoring invul, if killer is set repsys:OnDamage is called
        Added:   new Char members:
                 .hitchance_mod +-int in thousandth
                 additive modificator of the hitchance from the attacker
                 .evasionchance_mod +-int in thousandth
                 subtractive modificator of the hitchance from the defender
        Added:   new privilages:
                 "firewhilemoving" : swingtimer will not be reset if char is moving with projectile weapon
                 "attackhidden"    : char can attack hidden opponents
                 "hiddenattack"    : char can attack while hidden
        Added:   new systemhook script 'HitMiss'
                 function HitMiss(attacker, defender)
                 is called if hitchance check fails no overriding of corefunctions or resultcheck

-- POL097.4 --
03-19-2009 MuadDib:
    Fixed:   Crash in reporting of leftover objects during Shutdown.
    
02-28-2009 VeNdOr:
    Fixed:   Crash involving Auxconnection.ip.
    Fixed:   NPC events ENTEREDAREA and LEFTAREA were both fired even when one of them was eanbled.

02-28-2009 MuadDib:
    Fixed:   NPC.ar bug where ar was not reading intrinsic ar correctly when using ar_mod for
             the NPC.

02-25-2009 Nando:
    Fixed:   Removed a stray '\n' that was being sent at the end of a binary transfer in browser, causing
             some images to be corrupted. (This will finally solve the problem with some 'blank' images)

02-22-2009 Nando:
    Fixed:   Internal webserver will now handle binary files correctly. This was causing sporadic fails
             when loading a webpage which had images, stylesheets or any other of those fancy things...

-- POL097.3 --
01-31-2009 MuadDib:
    Added:   POL.Cfg::MiniDumpType=variable. This is a new DMP file version. For now, I HIGHLY
             RECOMMEND USING THIS IF YOU EXPERIENCE A LOT OF CRASHES OR ONES YOU CAN'T FIGURE OUT!
             The reason for this, is it is a small dump PLUS it stores all variable information
             from internal core functions in relation to the crash. This is information that
             could be VERY crucial to us Core Developers when you send the DMP file to the forums.
             So please, try to start using this one (We know the large option can be horendous.
             This is an alternative to that).
    Fixed:   Null Package fix (Luth did this one a while back in 098)

01-14 Nando
        Changed: Highest allowed mobile graphic is now 0x800 (2048). Was 1024 since POL070.. wow... :)
                 
-- POL097.2 --
01-05 Turley
       Fixed  : URL percent decoding (like %2F= '/')

12-31 Nando:
       Fixed  : Internal webserver's threads weren't being reported in case there were threads
                hanging when shutting down. This might not solve the "zombie connections" bug,
                but will at least change it's name to "internal webserver bug", I'm hoping.

12-30 MuadDib:
       Added  : POL.Cfg::ReportMissingConfigs 0/1 (Default 1). Handles if Missing Config File
                reports are printed to the Debug.Log file. These are reports for example, when
                you use :*:npcdesc to open all npcdesc files in a script but not all packages
                of course will have this file.
       Changed: Weapons now have a Default Speed of 35 if no entry for Speed is in the itemdesc.cfg
                file if Delay is used. If no Delay, then will still throw an error and fail to load.
       Fixed  : Typo on spellbook reports.
                
12-17 MuadDib:
        Fixed : Possible memory leak with AOS Tooltips.
        
12-16 MuadDib:
        Fixed : Memory leak in Packet Class using .Setxxxx Methods on Variable Length Packets.
        Added : Error Struct "Offset value out of range on a fixed length packet" when trying
                to use packet.Setxxxx() whose value is out of range in a fixed length packet.
                
-- POL097.1 --
09-17 Turley:
        Changed : To simplify usage util::RandonIntMinMax() now accepts
                  negative Integers and if parameters in wrong order swaps them

09-12 Turley:
        Fixed : Memoryleak in PathFind
        Fixed : If only PacketHook SendFunction is defined on receive default handler is called if exists

09-09-2008 Austin: 
        Fixed : Usernames and passwords will accept all characters except control characters
        '\t','\f','\v','\n','\r' the characters '{' '}' and spaces.

-- POL097 --
08-28 Turley:
        Fixed : math::Min()/Max() now returns Integer/Double based on params

08-26 Turley:
        Fixed : AR recalc if parryskill changes, or if hp,maxhp_mod,ar_mod of equipt armor changes

08-23 Turley:
        Fixed : Event queue full error prints now event details

08-20 Turley:
        Fixed : server-side check if item is stackable on drop

08-19 Turley:
        Fixed : Character.clientversion string

08-19 Luth
        Added : Added Run_Script to OS.em.  Similar to Run_Script_To_Completion, but the script is not run in critical mode, and the                 calling script is put on hold until the run script returns.  Run_Script returns the value that the run script returned.

08-16 Turley:
        Changed : Character.connected startup value is 0
        Added :   Accountname string struct member "account" added to
                  pre-character selection Packets

08-15 Austin: 
        Added :   Setting for servspecopt.cfg 'ScriptedAttackChecks' Default is disabled.
                  If enabled, the combat hook must check distance, line of sight, visibility
                  and if both combatants are alive.

07-29 Mehdorn:
        Changed : uo::ReserveItem() will return
                    1 - Item has been reserved by me.
                    2 - Item was already reserved by me.
                    Error - Item is in use by someone else, or invalid Parameter.

07-08 Turley:
        Changed : Status of other player (e.g. WarMode) will be shown correctly.
        Added :   Character.MoveMode member. Returns the MoveMode like given in NPCDesc.
        Added :   Item.Stackable member. Returns 0/1 based on stackability of Item.
                  uo::IsStackable(). Returns 0/1 if both Items can be stacked together.
        Changed : Random Number Generator "lagged Fibonacci generator" will be used.
        Added :   util::RandomIntMinMax(). Return Random Value between...

07-26 VeNdOr:
                Added : ApplyDamage now returns the real damage applied to the mobile.
        
05-28 VeNdOr:
                Fixed : In some conditions, when the AuxScript exited, the AuxConnection didn't close. 

05-23 Austin:
        Fixed : If MinCmdlevelToLogin was used, characters could not be created.
                POL will now check the account's default command level.
        Added : servspecopt.cfg CoreHitSounds    default: disabled
                If disabled, scripts will handle sounds when a mobile is damaged.
                If enabled, will work as it did before - but for npcs will use a DamagedSound 
        property from its config file.

02-9  Shinigami:
        Fixed : Bug in Unpack() with zero length Strings.

02-8  Austin: 
        Added : CharacterSlots setting in pol.cfg. Defaults to 5. This is to set the maximum number
                of slots an account can hold - to support clients that support 6 slots.

02-5  Austin:
        Changed : The freemove privilege will also allow targetting to be done when frozen / paralyzed.

02-2  Madman:
        Changed : Trying to move when Paralyzed will no longer spam your screen with 
                  "You are frozen and cannot move."

12-9  Shinigami:
        Fixed : Bug in Unpack() with Strings in Arrays, Dictionaries etc. in case that
                the String is not the last element.

11-5  MuadDib
        Added : Character.Cursor member. Returns 0/1 based on if character has an active
                cursor.
                Character.Gump member. Returns 0/1 based on if character has any active
                gumps.
                Character.Prompt member. Returns 0/1 based on if character has any active
                unicode and/or normal text prompt gumps open.
                
10-20 MuadDib
      Removed : Basic::Left and Basic::Mid. These functions reported not working since
                095, and code was set to not use them anyway. Val[int, int] works anyway
                and does what these functions do.
        Added : Basic::SubStr(string, start, length). Replace for left/right/mid. Works
                same way as virtual SubStrings in eScript (val[int, int]). This is for
                those who like the func methods instead.
        Added : Math::Min and Math::Max functions.
                
10-11 MuadDib
        Fixed : Changing realms with Season info would reset light levels until next
                light update in that realm. Send Season in core now sends light level
                whenever season info is sent to the client (Client issue). Also fixes
                an issue with seasons and 1.x clients.
        Added : servspecopt.cfg::DefaultLightLevel=ushort. New default light level
                setting for regions with no light level defined in regions cfg files.
                Default is 10. Replaced arbitrary setting in core.
        Fixed : Exploit in Create Character system.
                
10-10 MuadDib
        Fixed : uo::CreateAccount() will no longer accept non-alphanumeric characters
                for account name, will return error stating such if one is used. Also
                now passwords can contain all characters except whitespace and control
                characters. Please test heavily. I tested for the commons via script
                already.

10-04 MuadDib
      Changed : NPC::IsLegalMove() will now explicitly check for a MOVE in the given
                direction, regardless of NPC's current Facing. Will stop AI's that
                have NPC's using Bounding Boxes that walk out of the box by checking
                legal move, turning, then moving 1 step. Please be sure to check
                your AI's that use bounding boxes, to see if you coded that way!
                This check is for step movement. Facing should only be blockable if
                frozen, paralyzed, or stamina affected (if server set to use stam).
        Fixed : Exploit in Unpack() with Arrays and Dictionaries. If an element within
                the pack returns an error when unpacked, Unpack() halts and returns an
                error. Still ignores Uninit stuff as before. Same reasoning for fix as
                with Strings on 10-02. Dictionary will continue on and insert the error
                returns in key/value entries.
                
10-02 MuadDib
        Fixed : Exploit in unpacking Strings with length definition. Affected manual 
                building of packed versions such as in use by Aux connections etc.
                New error returns: 
                "Unable to unpack string length. Invalid length!" = 0 or less Length
                "Unable to unpack string length. Bad format. Colon not found!" = Duh.
                "Unable to unpack string length. String length excessive." = Said it 3,
                    but length was actually less.
                "Unable to unpack string length. String length short." = Said it was 3,
                    but length was actually more.
         Note : The following is acceptable in packed data sets.
                's' = String data, no length defined. Ex: sHello World!
                'S': String With Length defined. Ex: S12:Hello World!
                'i': Integer follows. Ex: i12
                'r': Double Integer format. Ex: r12.9
                'u': Unitialized Object format.
                'a': Array follows. Ex: a2:S12:Hello World!S12:Hello World.
                'd': Dictionary.
                't': Struct
                'e': Escript Error
                'x': Unitialized Object
                
                If you ever question the format for something packed, then just use
                the Pack() function on your data, to see the end result. 
                
9-05 VeNdOr
        Fixed : equipped items become invisible on realms different from britannia
        
9-04 VeNdOr
        Added : auxconnection.ip -- returns remote ip of connection as string

8-20 Shinigami
        Fixed : Bug in config/movecost.cfg - "Walking_Mounted" section was ignored

8-19 Shinigami
        Fixed : Memory Leak in PacketHook functions

7-09 Shinigami
        Added : added UO:KR login process
        Added : player.isUOKR -- returns 1 if player uses an UO:KR client

6-17 Shinigami
        Added : Entry to pol.cfg 'WorldDataPath' to set a different path to the data files.
                Defaults to 'data/'

5-4 Shinigami
        Added : uo::GetRegionName( object )                - get name of [justice] region
                uo::GetRegionNameAtLocation( x, y, realm ) - get name of [justice] region

4-12 Austin
     Added: Projectile support for NPC intrinsic weapons.
                Property keys are AttackProjectile, AttackProjectileAnim, AttackProjectileType and AttackProjectileSound

4-8  MuadDib
        Fixed : Crash involving Realms() and passing non-string param or empty param to it.
      Changed : Sending of worn items to inrange pcs has been optimized. Should help
                reduce load a little bit for fully dressed mobs and full packs. Maybe
                reduce server load during bashes? Would require testing of course to make
                that statement :)
      Removed : CreateNPCFromTemplate() will now only accept Struct for override props.
                Arrays was removed due to core changes in array handling since this
                function was updated to use arrays.

4-4  MuadDib
        Added : WornItms Container checks that look for and handle container class
                objects like Quivers, etc, will ignore the following layers for the
                obvious and specific reasons:
                11 (hair), 15 (shhhh), 16 (beard), 21 (pack), 25 (mount)
      Changed : WornItems container checks when looking for accessible items. If an
                item inside the WornItems container is a container itself, it will
                now check inside that. This affects for example, quivers added in
                the ML Expansion. Lets you make new equippable containers to
                hand layers, etc, and be usable fully for adding items into it
                and removing while equipped. This is in effect for layers 1-25
                so be very carefull when creating these items!
      Changed : WornItems container is now checked for legal containers when drag-n-drop
                attempts to drop an item onto the equipped container class object (quiver).
                THe above layer ignoring is in place here also.
        Added : Projectile weapons will now check equipped containers for ammo if it
                cannot find any in the backpack first.
         NOTE : I very strongly recommend making equip scripts and all for these
                items. Since it IS a container, you need to make sure the layer
                the client is putting it on, is the correct layer. So just have the
                equip script make sure the correct layer is empty on the character
                equipping this. Remember, these are CONTAINERS, not armor/weapons.
                The client will allow equipping only if the item is set as armor
                or weapon, and uses layers client side. Never trust the client, thus
                the need for an equipscript for containers when they can possibly be
                equipped.

3-28 Shinigami
       Changed: Adjustment to increasing the revision state for Equipment loosing
                HPs while fighting.

1-15 MuadDib
        Fixed : PrintTextAboveCL() now checks for object instead of mobile class
                being passed to it.
      Changed : Default of uc_text in cliloc.em. Just smack me.

1-3 MuadDib
        Added : Packets that are pre-character selection will now report a struct to
                a packethook with the member "ip". So far this is the only member in
                the struct. Future members might be added, but don't hold me to it.
                Account references at this time, cannot be added.

1-2 MuadDib
        Added : Native handling of 2D and 3D "Allnames" macro that uses CTRL+SHIFT.
                Added due to the nature of client to spam a lot of these in crowded
                areas, which would cause server lag due to packet hooks to handle each
                request individually in critical mode per client using it.

12-27 MuadDib
        Fixed : Server IP is now sent in correct order in the 0xA8 packet.

12-05 Shinigami
        Fixed : fixed a Bug in Walking-on-Multi-Code. A Multi-Definition Door upstairs could block walking.

11-02 Austin
     Changed : POL no longer requires the presence of the following files in pol/config/ in order to start up:
               combat.cfg, movecost.cfg, watch.cfg, armrzone.cfg, circles.cfg, spells.cfg npcdesc.cfg
               and pol/regions/resource.cfg

10-30 Austin
     Fixed : Error in the internal webserver where it would sometimes only send the first part of a file.

10-25 Austin
     Added : Entry to pol.cfg 'RealmDataPath' to set a different path to the data created by uoconvert.
             Defaults to 'realm/'

10-20 Austin
     Fixed : array{array{}} was appending as a single array as a result of a 10-17 change.

10-17 Austin
     Fixed : array += array will work properly now by merging the arrays.
             array += xxx will place 'xxx' at the ending index of the array.

09-28 Austin
     Added : account.AddCharacter(index)
             * If Index is 0 (.AddCharacter(0)), it will find the next available slot on the account.
               (Otherwise pass 1-5)
             Will create a naked, uncolored, male character named "new character" at 1, 1, 1 on Britannia.
             Character setup will need to be done in the script that creates it.
             Does not start "scripts/misc/oncreate.ecl"

09-27 Austin
     Added : File::FileExists( filename ) - returns 1 if a file exists, 0 if not.

09-26 Austin
     Fixed : Bug in repsys hook where highlight and name color params were backwards for player-player.
     Fixed : move_offline_mobiles method for boats.

09-23 Shinigami
       Changed : Profiling counter Script_Cycle and Sleep_Cycle uses 64bit now

09-20 Austin
       Changed: polsys::Realms() to polsys::Realms(realm:="")
                 If a realm name is passed, it will provide a struct for that specific realm,
                 otherwise will work as it did before.

09-17 MuadDib
        Added: NPC::SayUC(). Same thing as Say(), cept unicode formatted.
      Changed: NPC::Say() and SayUC() now check distances for different text types.
         Note: DoEvent for SayUC() is currently disabled.

09-17 Shinigami
        Changed : uo::SendEvent() and Script.sendevent() will return error
                  "Event queue is full, discarding event"

09-16 Shinigami
        Added : some Packet functions, same as original one, but with flipping Byte Order
                Packet.GetUnicodeStringFlipped(offset, length)
                Packet.SetUnicodeStringFlipped(offset, unicode character array, nullterminate)

09-15 Austin
       Added: ENUMERATE_ROOT_ONLY for EnumerateItemsInContainer(container, flags)
              Will cause it to only list the contents in the container passed and not
              the contents of any sub-containers.

09-05 MuadDib
       Added: UOConvert now adds "season 1" to the realm.cfg file for each realm during
              conversion. Season will default to 1, if no season entry is given (aka
              you was to lazy to run the newest uoconvert for your maps!). Seasons
              are listed as follows:
              0 = Spring
              1 = Summer
              2 = Fall
              3 = Winter
              4 = Desolation (Felucca)
       Added: Realms() will now also return .season for each realm.
       Fixed: Core not sending season information correctly when logging in or
              changing realms if non-encrypted clients was set up in pol.cfg.

09-03 MuadDib
       Added: character.shield member. Returns an ObjRef of shield equipped.

09-02 MuadDib
       Added: Polsys::IncRevision(object). Used to increase the Revision number of an
              object (mobile or item). It then also runs a check for resending the
              tooltip data to client. This can be used in scripts when you change
              CProps or other items that normaly do not update the tooltips for
              custom tooltip hooks.
     Changed: Internal handling of UO.EM Function execution. Should not affect
              scripts. As always, be sure to recompile your scripts when you
              upgrade to a new core release.

09-01 MuadDib
       Fixed: Bug causing Pre-AOS status bars to freeze clients and/or generate core
              crashes.
     Changed: Adjustments to increasing the revision state for stacks, items, and
              mobiles. Rule of thumb, if you change a member like newbie, title_race,
              and so on via script, this is not automatically updated. Names, amounts,
              and so on that are more critical ARE increased. This is pre to a an
              upcoming ability to increase via scripts and force tooltips to be
              resynced with the client for custom tooltip hooks to be fired.

08-31 MuadDib
     Removed: All instances, calls, used and unused, code for the permitems.txt
              data file. This was never fully implemented, and as such, has been
              removed by decision of several developers.

08-26 Austin
       Fixed: POL will check to make sure the corpse and backpack items are setup
              in an itemdesc.cfg when loading.
              If EnableSecureTrading is enabled in pol.cfg it will also check to
              make sure its container is setup.

08-25 MuadDib
       Fixed: Padding involving stats.

08-22 Austin
       Added: npc.alignment : 0 - Neutral, 1 - Evil, 2 - Good

08-19 Austin
       Added: Three more hooks to repsys.cfg's HookList elem.
              OnAttack Run when a mobile attacks another.
                        - Target with the TGTOPT_HARMFUL flag set.
                        - Mobile goes into warmode and double clicks another.

              OnDamage Run when a mobile damages another.
                        - ApplyDamage() or ApplyRawDamage() is used.

              OnHelp   Run when a mobile helps another.
                        - Target with TGTOPT_HELPFUL is used.

08-17 Austin
       Added: repsys.cfg
              New elem called 'HookList' which will support syste hook scripts for the reputation system.
              Currently name (single click) and highlight (health bar) colors are hookable.
              Example:
              repsys.cfg
              HookList HookList
              {
                   NameColor :repsys:hookScript:NameColor
                   HighLightColor :repsys:hookScript:HighLightColor
              }
              :repsys:hookScript.src
              exported function NameColor(mobile, visible_to)
                   return CInt(GetObjProperty(mobile, "NameColor"));
              endfunction

              exported function HighLightColor(mobile, visible_to)
                   return CInt(GetObjProperty(mobile, "HighLightColor"));
              endfunction

              HighLightColor note: The client seems to only accept the following numbers
              0 - None, 1 - Innocent, 2 - Friend, 3 - Attackable,
              4 - Criminal, 5 - Enemy, 6 - Murderer, 7 - Invulnerable
              8 - Unknown (blue gump, pure black mobile)

08-14 MuadDib
       Added: uo.em command CancelTarget( of_whom). Can be used to kill an existing cursor
              if one exists, for a client.

08-12 Austin
       Changed: pol.cfg IgnoreLoadErrors=1 (enabled) changes
                  Instead of stopping the startup, the following will occur:
                * If an item belongs in a container or on a character and neither
                  are present, the item will be destroyed.
                * If an item has an undefined objtype greater than 0x3FFF, it will not be loaded.

08-11 Austin
       Added: Datafile::ListDataFiles()
              Returns an array of structs containing
              .pkg - name of the package the datafile belongs to
              .name - name of the file
              .descriptor - :pkg:name

07-24 MuadDib
       Changed: Handling of non-aos expansion accounts and status bars.

07-20 Austin
       Fixed : Spelling mistake for the method setcriminal
       Fixed : Guilds were not saving data.
       Changed: NPCs with the template set to 'Good' for alignment will now change highlight color
                if set to murderer or criminal.
06-29 Austin
       Added : Operator support for += -= *= /= and %=
               i += 5; would be the same as i := i+5;

06-23 Austin
        Added : PolSys::ListTextCommands() - Returns a dict of a dict of structs.
                Dict 1 - Package names Dict 2 - Command levels Struct - .dir .script
                Example:
                  foreach package in ( commands )
                     Print("Pkg:"+_package_iter);
                     foreach level in ( package )
                        Print(" CmdLvl:"+_level_iter);
                        foreach command in ( level )
                           Print("     "+command);
                           SleepMS(2);
                        endforeach
                        SleepMS(2);
                 endforeach
             SleepMS(2);
              endforeach

06-22 Austin
        Added : Attributes::GetAttributeName(alias) - Returns the real attribute name from an alias.
        Added : Vitals::GetVitalName(alias) - Returns the real vital name from an alias.
        Added : PolSys::GetCmdLvlName(alias/number) - Returns the real command level name from an alias.

06-21 MuadDib
        Added : Cliloc::PrintTextAboveCL() and PrintTextAbovePrivate().
        Added : Support for Talisman layer (layer 9) in core definitions.
        Hint : Quivers (added in ML) share layer 20 with cloaks. You can however
               on Origin equip cloaks AND quivers. Ewwww.

06-20 MuadDib
        Added : Cliloc.em added to the list of new EM Modules. Included in this is already
                the command SendSysMessageCL(). The new EM will have the commands
                commented for instruction of use. If you know about clilocs, you know
                they can be a pain and have additional arguments. Sending normal clilocs
                and ones with arguments are both supported in the single commands.
                Argument flag defaults to 0 in the EM for this.

06-20 Austin
        Changed : Moved guild functions to guilds.em

06-18 Austin
        Changed : Moved storage area functions to storage.em
        Changed : Moved vital functions, ApplyDamage, ApplyRawDamage and HealDamage
                  from uo.em to vitals.em

06-17 Austin
        Changed : Updated handling of object properties and methods. Should provide a slight
                  speed increase.
        Changed : Moved attribute functions from uo.em to a new attributes.em module.

06-16 MuadDib
        Changed : AddMenuItem() now has a color option. Default is 0.
        Hint : menus.cfg uses the color of the itemdesc entry of the objtype given,
               to get color. So if an item has no itemdesc entry, it defaults to 0.

06-16 Austin
        Removed: Skills.cfg is no longer used.
                 Instead skill IDs will be read from uoskills.cfg and redirected to
                 attributes.cfg. The attributes.cfg file now has support for the old entries.
                 skills.cfg entries supported now in attributes.cfg are:
                 DELAY, UNHIDES and SCRIPT

06-15 Austin
        Added : mobile.Privileges() - Returns a dictionary.
                The key is the privilege name. The value 0/1 is if it is enabled or not.
        Removed: Built-in text commands (you'll need to script them):
                 .eobjcount, .i_help, .log, .los, .objcount, .priv, .privs, .set, .turn,
                 .t_online, .unload, .unloadall, .wheretest

06-15 MuadDib
        Added : Function OpenURL(character, url_string) to OS.EM. Used to send Open Web
                Browser packet to client.

06-14 MuadDib
        Added : AOS style status bar is now generated correctly for AOS+ clients that ALSO
                have the UOExpansion set to AOS or higher. Only thing populated by core is
                the statcap entry. Rest can be done via packethooks.
        Added : UOClient.cfg entry "StatCap" in General. This is used with AOS era
                status bars to send the statcap in the packet. Default is 225. Can use
                packethooks to override this outgoing to client.

06-14 Austin
        Changed : All log files (pol.log, debug.log, start.log, etc.) will now be placed in pol/log/

06-13 Austin
        Changed : Config files in packages can now be in pkgname/config/cfgfile.cfg.
                  If it is not present there, it will look in the package root (pkgname/cfgfile.cfg)
                  pkg.cfg must still be at the root of the package.

06-13 MuadDib
        Changed : Handling of target request returns in core. Returns errors more efficiently
                  when client already has an active target cursor.

06-12 Austin
        Added : UO::CloseTradeWindow(mobile) - Will close the trade window for the mobile and the
                person it is trading with.

06-11 Austin
        Added : mobile.trading_with - Returns a mobile reference if a secure trade is taking place.
        Added : Util::StrFormatTime(format_string, time_stamp).
                Takes in the StrFTime() specifiers for the format string.
                (http://www.cppreference.com/stddate/strftime.html)
                If time_stamp is 0, it will use POLCore().systime.

06-11 MuadDib
        Changed : When a client already has a target cursor request, instead of core
                  just returning that to the new requesting call, now returns an error
                  code back to the calling cursor script.

06-10 MuadDib
        Cleanup : Removed last of stat advancement code. While this was depreciated
                  several versions ago, please remember stat advancement must be done
                  via the scripts.

06-09 MuadDib
        Cleanup : Cleaned out some old code.
        Removed : Removed depreciated UO.EM Function MoveCharacterToLocation(). Use
                  MoveObjectToLocation() now.
        Removed : Removed depreciated UO.EM Function MoveItemToLocation(). Use
                  MoveObjectToLocation() now.

-- POL096.7 --
4-23 MuadDib
        Added : Realm checks in transmitting of packets to clients "in range".

4-22 MuadDib
        Added : Changing of Invisible, Movable, and Newbie now reset the respective
                decay timer.
                               
-- POL096.6 --
3-30 MuadDib
        Notes : Due to questions involving this, here is a partial list of things passable
                through the override of CreateNPCFromTemplate that use different names:
                Common Properties:
                    TRUEOBJTYPE
                    TRUECOLOR
                    TITLEPREFIX
                    TITLESUFFIX
                    TITLEGUILD
                    TITLERACE
                These should work also from the override you usually use. Noting these
                due to being named differently than what you usually use and see.

3-29 MuadDib
        Added : 0x3e98 (Swamp Dragon) added to uoconvert.cfg.

1-9 MuadDib
        Fixed : Status Flag checks totally rewritten. PLEASE PAY ATTENTION! They are now
                dependant on the UOExpansion Setting for accounts! Older (2.x) clients
                did not use the CanAlterPaperdoll flag, and used 0x40 for the warmode,
                and so on. LBR era, introduced the CanAlterPaperdoll (or around there).
                AOS+ clients use even more different, using 0x1 for warmode! Paperdolls
                seem to only use the warmode, unlike all other resources say.

1-6 MuadDib
        Fixed : Height checks when walking down items with gradual flag (such as ladders
                ands steps).

1-4 MuadDib
        Fixed : Status flag in paperdoll packet.

-- POL096.5 --
1-2 MuadDib
        Fixed : Updating of self when notoriety changes in reputation system.
        Fixed : Some orphan checks within reputation system.

1-1 MuadDib
        Fixed : Few instances still using older Character Height of 9.

12-30 MuadDib
        Fixed : RaceChanger system now also sets TrueColor after a race change.

12-29 Shinigami
        Fixed : uo::SplitWords() will not hang server on queue of delimiter

-- POL096.4 --
11-25 Shinigami
        Fixed : Sometimes uo::GetWorldHeight() has returned error while using same input values.

10-28 Shinigami
        Changed : em-files moved to script\modules subfolder.
                  Please remove your old em-files and modify ModuleDirectory in ecompile.cfg !

10-27 Austin
        Fixed : MoveObjectToLocation() will return an error if a multi (other than a boat) is moved.

10-20 Austin
        Fixed : Items were being marked as in use permanently once picked up by a client.
                which prevented them from being destroyed.
        Fixed : DestroyItem() and SubtractAmount() will work on items reserved in the same script.

10-17 Austin
     Fixed : gotten items (items on a client's cursor) will save in items.txt
             at the position it is currently being carried at.

10-07 Shinigami
        Added : FreeBSD support

10-07 MuadDib
       Changed: Memory handling for FindPath().
       Changed: Core Decay now checks if item is in use. Also affects Gotten Items
                that are check for decay by the core while it's being picked up.
        Fixed : Bug that would keep an item marked in use if drop item failed.
        Fixed : Crash involving UO::DestroyItem being called on an item being held
                by a player. Now returns an error same as if item is in use and not
                reserved to that character.
         Note : ALWAYS remember, to keep bugs happening in your scripts that involve
                players picking up/moving items to keep them from being removed from
                containers or ground by scripts, or from being destroyed, ALWAYS use
                ReserveItem() to lock that item. If an item is reserved, you cannot
                pick it up, etc.

09-16 Shinigami
        Fixed : Memory Overwrite Bug in Unicode code (e.g. packet.SetUnicodeString())

-- POL096.3 --
09-07 MuadDib
       Fixed: Validation issues with xyz of realm coordinates within boat movement
              commands.

09-05 MuadDib
     Changed: PerformAction() value restriction removed to support new animation ids.
              Be warned. Know what ID you are sending to clients, as an Incorrect id
              could cause the client to have "issues"

09-02 MuadDib
       Fixed: Core now checks for changes in light level for a character whenever
              the MoveObjectToLocation() is used on a player.
       Fixed: Core now sends the remove object packet correctly for items within
              containers or equipped, when moved out of view/realm.
       Fixed: Bug where the coordinates for a realm would be checked on an item's
              current realm, instead of the realm it was being sent to.

09-01 MuadDib
       Added: Reduncancy check for node parents in FindPath().

-- POL096.2 --
08-29 Austin
       Changed: Gump errors will report client account name to the console when invalid messages
                and buffer-overflow attempts occur.

07-26 MuadDib
       Fixed  : Zero height items should no longer disappear under the floors of multis.

-- POL096.1 --
06-28-06 MuadDib
        Fixed : Crash issue involved in moving sub-containers from one realm directly
                to another (like a character's backpack from their realm, to another).

06-27-06 MuadDib
        Added : Realm property to return struct of TargetCoordinates() function. This
                is based off the targeter's realm. Never trust information returned
                by the client for stuff like this.

06-24-06 MuadDib
      Changed : Offline mobiles can once again be targeted without problems.

-- POL096 --
06-05 Shinigami
        Added : little bit more logging why Clients get disconnected on Logon by Core

06-01 MuadDib
        Hint : The pol.cfg setting "LogLevel" can be used to debug issues at startup of
               POL and various other places (unloadall for example). By setting this
               higher than 1, up to 11 (just sounds good), it will force printing of
               better information to help you find out problems during Loading and such.
               Setting it for example, above 0, core will start spitting out "Checkpoint"
               data during startup to say what it is about to load/process. Such as the
               configuration, load realms, load multis, etc etc.

05-31 MuadDib
        Fixed : Issue resolved with standard spellbook and no AOS+ Expansion enabled.
        Hint : Recognized scroll objects now are: Magic: 0x1F2D - 0x1F6C, Necro
               0x2260 - 0x226F, Paladin: 0x2270 - 0x227C, Bushido: 0x238D - 0x2392,
               Ninjitsu: 0x23A1 - 0x23A8, SpellWeaving: 0x2D51 - 0x2D60.
               Remember, this IS hardcoded! >:)
               For Bushido and Ninjitsu, there was never any scrolls made. So your
               items for those are the Icons for the moves. Try setting their graphic
               to a scroll and using it ;)

05-30 Shinigami
        Hint : UOConvert will convert Mondain's Legacy extended Britannia Map.
               Just set width to 7168 (e.g.):
                 uoconvert map realm=britannia mapid=0 usedif=0 width=7168 height=4096
                 uoconvert statics realm=britannia
                 uoconvert maptile realm=britannia
        Updated : uoconvert.txt (some comments and Mondain's Legacy hint)
        Fixed : Bug with detection of Gump-Cancel in uo::SendCharacterRaceChanger()
        Fixed : ShowRoofAndPlatformWarning has shown everything
        Fixed : smaller mistype in Log created via TextCMD .startlog/stoplog
        Fixed : set correct Time stamp in TextCMD .startlog/stoplog

05-30 MuadDib
        Added : Guild and Quest buttons added to the "known" list of subcommands in core.
                Should fix some crashes when recieving these. Especially when using hooks
                on packet 0xD7 (their parent packet ID).

05-29 MuadDib
        Added : Added "SpellType" entries for "Bushido", "Ninjitsu", & "SpellWeaving" for
                spellbook types in itemdesc.cfg. The list of spellids for
                spells.cfg is now as follows: Magery = 1+, Necro = 101+,
                Paladin = 201+, Bushido = 401+, Ninjitsu = 501+, SpellWeaving = 601+.
                Hopefully this more completes our addition of the other
                expansions for 096 where we lack in other areas.

05-27 MuadDib
        Update : Just FYI, as previously reported, SingleCombat does NOT use servspecopt.cfg
                 but rather combat.cfg. Sorry about the typo when it was introduced.

05-26 MuadDib
        Fixed : Crash on checking targetted players when target is not logged in.
        Fixed : ItemColorMask is now read properly during itemdesc load and during
                POL startup.

05-26 Shinigami
        Fixed : Crash on call of scripts/misc/dblclickother if another script is running.
        Fixed : removed an additional check for UOConvert's option ShowRoofAndPlatformWarning

05-24 Shinigami
        Added : uo::SendCharacterRaceChanger( character ) - to change Hair, Beard and Color

05-23 Shinigami
        Fixed : Crash inside Packet Hooks with SubCommands and without default Handler.

05-20 MuadDib
      Removed : Requiring, and support, for armrdesc.cfg. Armor within this file is to be
                moved to the itemdesc.cfg as intended. File has been obsolete for a while
                now.

05-19 MuadDib :
      Removed : Requirement for wepndesc.cfg in the /config folder. Any shards still
                using this obsolete file can use the itemdesc.cfg files for the weapons as
                intended. Core will no longer require this file to load either.

05-16 Shinigami
        Updated : Account.set_uo_expansion(string): recognized values: ML, SE, AOS, LBR, T2A (default), "".
                    This determines what flag is sent with packet 0xB9 during login (Nothing -> 0x0000 /
                      T2A -> 0x0001 / LBR -> 0x0002 / AOS -> 0x801b / SE -> 0x805b / ML -> 0x80db).
                    It's possible to hook 0xB9 but don't forget to set_uo_expansion anyway because core
                    uses this for internal flags (e.g. AoS Tooltips). Packet 0xB9 will be sent earlier
                    (before you choose a character) and after you've used set_uo_expansion.
        Updated : servspecopt.cfg property: UOFeatureEnable, used in the last dword of the 0xA9 login packet,
                  will block Bit 6 (support up to 6 Chars). To enable AoS stuff set Bit 5 (use 0x20),
                  to enable SE stuff set Bit 7 & 5 (use 0xa0) and to enable ML stuff set Bit 8, 7 & 5 (use 0x1a0).
        Added : mobile.race [r/w] - set/get the ML race (new constants in UO.EM: RACE_HUMAN, RACE_ELF)
                You have to set visual graphic by yourself if you change value.
                  (Human male/female = 0x190/0x191 / Elf male/female = 0x25d/0x25e)
                You can choose Race at Char creation if your UOExpansion and UOFeature settings fit.
                  WARNING: Don't forget to update your server side config/tiles.cfg using
                           UOConvert and Mondain's Legacy tiledata.mul! (Hint: "uoconvert tiles")
                Race Prop is available inside Interactive Debugger too.

05-13 MuadDib
        Added : Targeting will now also check the NoCombat zone for targeted players also,
                and not just who is doing the targeting.

05-10 MuadDib
        Fixed : Targeting should now check to make sure a mobile is visible to the targeter
                before processing. This checks hidden and concealment both.

05-10 Shinigami
        Fixed : small bug inside uo::ListMobilesNearLocationEx()

05-07 Shinigami
        Added : flag VENDOR_SEND_AOS_TOOLTIP in
                  uo::SendBuyWindow( character, container, vendor, items, flags := 0 )
                  uo::SendSellWindow( character, vendor, i1, i2, i3, flags := 0 )
                to send Item Description using AoS Tooltips in any case (this will correct problems
                with Item Descriptions in newer Clients, but maybe freeze ancient Clients...).

05-04 Austin
        Added : LISTEX_FLAG_CONCEALED support for ListMobilesNearLocationEX()

04-11 MuadDib
        Change: Starting Gold will no longer be newbied (blessed). Can still be set newbied if you choose in
                the create scripts for new characters.

04-09 Shinigami
        Added : uoconvert.cfg element option added, TileOptions, in the following form:
                TileOptions
                {
                    ShowRoofAndPlatformWarning 1
                }
                it's a flag and defaults to 1 (shows a Warning if you use both Flags in same Tile).

04-05 MuadDib
        Changed: Added combat.cfg flag SingleCombat. This is a 0/1 flag for allowing players to attack
                 themselves. 0 will disable it (default). Per request.
        Fixed: Crash involving invalid serial data sent with Target Cursor from client.
        Fixed: Bug blocking non-harmful targeting of Players in NoCombat zones.
        Fixed: Optimized NoCombat Target check.

03-19 MuadDib
        Fixed: Will now correctly send AOS Tooltips if features are combined with 0x20 in the
               UOFeatureEnable setting in servspecopt.cfg file.

03-18 MuadDib
        Added: Servspecopt.cfg entry StartingGold=#. This will default to 100 gold. However, it can be
               used to override the core's initial starting gold amount to this setting. Enjoy.

03-15 MuadDib
        Fixed: Attack Request will be automatically denied if Defender.serial == Attacker.serial.
        Changed: Packet Logs (using .startlog and .stoplog) format has changed. It has been updated
                 for easier reading and to match Packet Loggers format more (Such as UOLog and
                 Spy UO).

03-07 MuadDib
        Added: New Justice/Region config entry for Regions. NoCombat is a 0/1 Flag to set
               a region to be a No Combat region. No Combat regions will not allow the
               Clicking of a mobile to select as a new opponent if they are in this region.
               It will also reset opponent data for mob if one enters this region. This is
               a PvP specific addon. It does NOT check for npcs, this will have to be done
               via packethooks.

               When Entering a NoCombat region, while already in combat, if YOU are the
               attacker, it will reset your fight. If you are the one being attacked, it
               will reset the fight with the first "opponent" you have listed.

03-06 MuadDib
        Changed: Regen after being damaged delay was changed from 10 seconds to 2 seconds.
        Changed: Regen delay after changing warmode was changed from 5 seconds to 2 seconds.

03-03 MuadDib
        Changed: Optimized handling of mobile.connected in core.

03-02 MuadDib
        Fixed: Handling of 0x22 Move Resync with "Player Noto" handling to send
                 correct information.

03-01 MuadDib
        Changed: Handling of item's decayat property when moved.
        Fixed: Stack checking for decayat handling when moving items.
        Fixed: Newly created characters will now have the connected member set
               correctly.

01-18 Shinigami
        Changed : Prop script_process.attached_to will return NPC if it's his AI-Script.
                  (script_process comes from NPC.process or uo::GetProcess(pid))

01-09 MuadDib
        Changed: Added check for No Decay timer on items when resetting decay time.
        Fixed: AOS Tooltips will now correctly show the Reputation of mobiles. In order
               to see Invul correctly, InvulTag MUST be set to 2 due to the Reputation
               color being handled fully client-side (No way around this).

12-10 MuadDib
        Changed: Various changes involving item dropping and creation and setting of
                 decayat properties to help with instant decay.
        Fixed: Secure Trade Window now correctly updates client when items added. As a
               side effect, also fixes a small problem involving adding items to normal
               containers also when using tooltips.
        Note: For now, since Tooltips is an AOS feature, do NOT leave tooltips disabled
              and use UOExpansion set to AOS or this WILL cause client problems. The client
              was never designed for this to happen, and I do plan on putting in failsafes
              in the core to keep these problems from happening. Bear with me on this please.

12-09 MuadDib
        Changed: Repsys coloring for Invulnerable names will only occur when InvulTag is
                 set to 2. Will follow OSI standards more, and allow more flexibility to
                 shard admins per request.
        Fixed: ItemGiven Event will now return items if the script handler does nothing
               with the item.
        Fixed: Items will now move correctly across realms or to same realm again with
               MoveObjectToLocation().
        Fixed: Crash bug when deleting items after using MoveObjectToRealm().
        Added: New read-only member .uclang for players. Reports the Unicode Language string
               client sends during logon. Usefull for Unicode support based on language of
               individual clients/characters.

12-06 Shinigami
        Fixed : z<0 bug inside uo::MoveCharacterToLocation() and uo::MoveObjectToLocation()

12-05 MuadDib
        Added : Decay timer reset when Item is picked up/dragged by client (only on success).
                Should *help* with instant decay problems when dropping items
        Added : InvulTag=0/1/2 in ServSpecOpt.cfg. 0 Disables invul tags totally. 1 (default)
                keeps them as they are now, giving [Invul] tag when single clicked. 2 will
                work only on 3.x+ clients, and makes the mob's highlight color Yellow with
                no [Invul] tag when single clicked. Only recommend using 2 if your shard
                requires a 3.x or higher client!
        Added : Invulnerable entry in RepSys.cfg for coloring name of invuls.

11-29 MuadDib
        Added : Packet 0x9 will no longer cause POL to treat client as active.
        Fixed : Change to Secure trade window handling. Be sure to test thouroughly with all
                versions of clients and report back to pol-core-test with results. Hoping this
                helps with client issues reported.

11-29 Shinigami
        Fixed : uo::SplitWords() will now accept each type of to-split-value as same as in the past

11-26 MuadDib
        Fixed : Fixed Attack Denied method for client expectations.
        Fixed : Logon issues involving map visibility on >2 mapid.
        Fixed : Issues with weather and seasons on logon.

11-26 Austin
        Added : Support for bit shifting integers using << and >>

11-26 Shinigami
        Fixed : Compiler will work case insensitive now.
        Added : New Mounts to uoconvert.cfg
        Added : uoconvert.cfg to Linux Files
        Fixed : illegal Attack Requests (Packet 0x05) will not crash Pol

11-25 Shinigami
        Changed : Packet 0xBF Subcommand 0x24 will no longer cause POL to treat client as active.

11-25 MuadDib
        Fixed : AttackRequest now checks for distance < 20, realm, hidden, concealed higher, and dead characters.
        Fixed : Visibility checks now check for same realm.
        Added : Packet 0xBF Subcommand 0x24 no longer reports in unknown packets. Packet will still cause
                POL to treat client as active.

11-24 Austin
        Added : basic::Bin() - Convert 25 to 11001

11-23 Austin
        Fixed : account.Get_Member(member name) now works.
        Fixed : .Get_Member(member name) for script objects now works.

11-23 MuadDib
        Added : Added second optional param to SplitWords() function. Second param now defaults to space.
                Allows use of "bleh" "+" "," "_," "." etc. as the delimiter instead of just whitespace.
        Added : New combat.cfg setting "WarModeDelay". Setting is in Integer for Seconds delay between
                ability to toggle war mode status via client. Does not affect using SetWarMode method.

11-20 Austin
        Fixed : Attempt # 2 with *InBox() coordinate checks.
        Fixed : Region scripts (EnterScript / LeaveScript) no longer need an
                EnterText and LeaveText to work.

11-15 Austin
        Added : using "::regions/" in a config path will allow a config file from pol/regions/ to be read.
                Example ReadConfigFile("::regions/justice");
        Added : regions.cfg / justice.cfg support for EnterScript and LeaveScript.
                Scripts will be run when a player enters or leaves the region.
                Parameters passed to it are the mobile that entered/left and the region name.
                Please note these scripts run critical.
                Regions.cfg Example:
                Region Britain
                {
                    Range      1416 1500 1740 1790
                    Guarded    1
                    EnterText  You have entered britain
                    LeaveText  You have left britain
                    Midi       9

                    EnterScript   :coords:enterScript
                    LeaveScript   :coords:leaveScript
                }
                Example of enterScript.ecl
                ------
                use uo;
                program EnterRegionZone(mobile, region_name)
                     ApplyRawDamage(mobile, 10000);
                     SendSysMessage(mobile, "You just died because you entered an area that makes you dead!");
                     return 1;
                endprogram
                ------

11-14 Austin
        Fixed : uo::*InBox(x1, y1, z1, x2, y2, z2) functions will check the boundaries of the coordinates.
                If they are too low or too high, they will be adjusted to fit within the realm.
        Fixed : Using the .realm property on an intrinsic weapon caused a core crash.
        Added : weapon.intrinsic

11-10 Austin
        Fixed : Items moved to invalid locations will now go to the player's feet on the
                correct realm and not just to britannia.

11-03 Austin
        Added : uo::CoordinateDistance(x1, y1, x2, y2) - Returns the distance between two coordinates.

        The following two functions were originally scripted by Myrathi:
        Added : uo::GetCoordsInLine(x1, y1, x2, y2) - Returns an array of structs {.x, .y} for every coordinate
                between the two points.
        Added : uo::GetFacing(from_x, from_y, to_x, to_y) - Returns the facing number an object must have in order to
                face to_x and to_y from from_x and from_y.

10-31 Austin
        Fixed : Core crash with MoveCharacterToLocation() when a character was moved to the same realm.

10-30 Austin
        Changed : NPC.connected will now always return 1. Before it was 0.

10-29 Austin
        Added : polsys::GetCmdLevelName(number) - Will get a command level's name.
        Added : polsys::GetCmdLevelNumber(name) - Will get the numeric value of a command level.
        Added : polsys::GetPackageByName(name) - Will return a package reference.
        Added : account.SetDefaultCmdLevel(number) - Will set the account's default command level.
        Added : account.defaultcmdlevel - Will return a number for the accounts default command level.
        Changed : If npc.ar is used and the NPC has no armor equipped, it will give its intrinsic armor value
                  (NPCDESC.CFG AR entry). If it has armor equipped, it will work as it did before.
        Changed : Added some error checking and reporting when "(something in array)" is used in a script.
                  Hopefully this will fix the rare "in" crash or at the least, make it a little easier to find.

10-17 Austin
        Added : Added uo::MoveObjectToLocation( object, x, y, z, realm := _DEFAULT_REALM, flags := MOVEOBJECT_NORMAL );
                Function will replace MoveCharacterToLocation(), MoveItemToLocation(), and MoveObjectToRealm()
                Currently moves boats, mobiles, and items.

10-16 Shinigami
        Changed : added x- and y-Offset to uo::SendDialogGump( who, layout, textlines, x := 0, y := 0 );
                  (don't forget to recompile all your Scripts using new uo.em)

10-13 Shinigami
        Added : Linux: Core will check libc version and print Warning if libc is to old (< 2.3.2)

10-07 Austin
    Added : scripts/misc/dblclickother - Runs when a player double clicks another player or npc.
                Will not run if the npc has the double click event enabled.
                Program arguments are (who, mobile_clicked)
        Added : servspecopt.cfg - 'DoubleClickWait'. (Default is 0)
                Time in seconds that must pass before a player can double click something again.
        Added : mobile.GetCorpse() - Returns an item reference to the most recent corpse made.

10-03 Austin
        Added : corpse.ownerserial - Returns the serial of the npc / player that died.

10-02 Shinigami
        Added : Prop script_process.attached_to and script_process.controller.
                (script_process comes from NPC.process or uo::GetProcess(pid))

09-30 Shinigami
        Fixed : added Player Check to uo::SendStatus (crashed on NPCs)

09-25 Shinigami
        Fixed : eCompile - FileCheck for multiple include of same File
                e.g.: inside scripts\textcmd\test\textcmd.src:
                  Include "../../../pkg/std/housing/include/test";
                  Include ":housing:test";
                  Include ":housing:include/test";
                will be handled as same file now

09-23 Shinigami
        Added : uo::SendStatus( character ) - to send full Status Packet to support Extensions
                like Resistances, if you add'em via Packet Hook. Use SendStatus to update'em.

09-17 Shinigami
        Fixed : Crash if Name of Items or Mobiles was to long and you've clicked'em

09-16 Shinigami
        Added : pol.log will show last running Script and it's Program Counter
                (you can use eCompile LST-file (Switch: -l) to get the Source Line)
        Added : Linux: pol.log will show Backtrace (as same as STDERR)

09-15 Austin
        Added : mobile.connected - To determine if the character is actively connected to the game.
                Is set to 1 before logon/reconnect scripts are run and 0 right before logofftest is run.

09-14 Shinigami
        Added : vitals.cfg element option "RegenWhileDead" added (0/1 - defaults to 0)

09-13 Austin
        Fixed : When a player dies, it will send SYSEVENT_DISENGAGED to the opponent-npc, if one is set.

09-12 Shinigami
        Added : some Packet functions, same as original one, but with flipping Byte Order
                Packet.GetInt16Flipped(offset, value)
                Packet.GetInt32Flipped(offset, value)
                Packet.SetInt16Flipped(offset, value)
                Packet.SetInt32Flipped(offset, value)

09-11 Austin
    Added : Member for mobiles ".opponent". Returns a mobile reference if a combat opponent is selected.

09-10 Shinigami
        Added : math::Root - returns y Root of x (same as Pow(x,1.0/y))

09-08 Shinigami
        Changed : eCompile - BASIC style for loops (for i:= start to end) will warn again on -v5 (and above)
                  about the iteration variable being unused

09-08 Austin
    Added : polsys::Packages() now has a .npcdesc member. Will be 1 if the package has an npcdesc.cfg file.

09-07 Folko
        Changed: eCompile - BASIC style for loops (for i:= start to end) will no longer complain about the iteration variable being unused
        Changed: Fixed some endianess issues and improved the conversion performance

09-03 Shinigami
        Changed : uo::FindPath will redefine Param mobilesblock as flags (FP_IGNORE_*)
        Added   : uo::FindPath can ignore Doors (FP_IGNORE_DOORS)

09-03 Austin
        Fixed : cfgfile::GetConfigStringArray() lines that contain a property name but no value will not be placed in the array.
        Added : cfgfile::GetConfigStringDictionary( element, property_name ). Works similarly to
                GetConfigStringArray() but will take the first word on the line and use it for the key.
                Elem ElemName
                {
                       PropLine keyname this will be the text placed in it
                }

09-02 Shinigami
        Fixed : uo::Attach allowed you to attach more than one Script to a Character

08-29 Shinigami
        Changed : UseAAnTileFlags in SERVSPECOPT(.LOCAL).CFG renamed to UseTileFlagPrefix (check 03-05)
                  (compatibility with const TILEDATA_FLAG_* inside uo.em)
        Changed : player.spyonclient2 renamed to player.clientinfo (check 01-24)

08-29 Folko
        Added   : Support for custom MIME types in config/www.cfg. This allows you to
                  add new file types that the web server can handle, for example PNG images,
                  PDF files or favicon.ico. If you don't supply a www.cfg, old defaults are used.
        Hint    : Here's an example www.cfg:

                MIME gif
                {
                    Extension gif
                    MIME image/gif
                }

                MIME jpg
                {
                    Extension jpg
                    MIME image/jpeg
                }

                MIME jpeg
                {
                    Extension jpeg
                    MIME image/jpeg
                }

08-28 Austin
    Added : Ability to initialize error as you would a struct.
        Example return error{"errortext" := "This is the error message"};
    Added : Extended NPC.EM Say() function to allow for two additional parameters.
        Say( text, text_type:=SAY_TEXTTYPE_DEFAULT, do_event:=SAY_DOEVENT_DISABLE );
                Text type is a string "default", "yell", "whisper", constants are:
        SAY_TEXTTYPE_DEFAULT, SAY_TEXTTYPE_YELL, SAY_TEXTTYPE_WHISPER (added to npc.em)
        If do_event is enabled with SAY_DOEVENT_ENABLE, it will send a speech event to nearby npcs.

08-26 Austin
    Fixed : LEFTAREA event was not being sent to npcs in the old realm when a mobile was moved to a new realm.

08-25 Austin
    Fixed : LEFTAREA event was not being sent if a mobile was teleported 33 tiles or more away.

08-23 Austin
        Added : Logging out will now send a LEFTAREA event (after logout.ecl has finished).
        Added : New flag for servspecopt.cfg called "EventVisibilityCoreChecks" set to 0 (disabled) by default.
                Enabled - the core does visibility checks before sending events as it did before.
                Disabled - requires your scripts do visibility checking.

08-22 Shinigami
        Fixed : sometimes the Core crashed while destroying Items (e.g. via Control Scripts) on Boats

07-28 Shinigami
        Changed : eCompile - Assignment inside Condition Check will produce Warning on -v5 (and above) only

07-26 Shinigami
        Changed : TextCMDs can be specified in Packages; just make a commands/gm (new style) or
                  textcmd/gm (old style) etc directory. These are only scanned at startup,
                  so if the directory doesn't exist then, it won't be searched until restart.
        Changed : Support for packaged Includes - if you use 'Include ":blah:blubb";'
                  eCompile will search for ":blah:blubb.inc" and ":blah:include/blubb.inc".
                  It will use first file found. If both files exist eCompile will print a Warning.

07-25 Shinigami
        Added : MinDamage and MaxDamage in weapon.GetItemDescriptor() calculated from Damage-Dice
        Changed : usable Msg size of SendDialogGump doubled - now you can use larger Gumps

07-16 Shinigami
        Fixed : uoconvert will ignore illegal statics with graphic >= 0x4000
        Added : uoconvert.cfg element option extended by ShowIllegalGraphicWarning
                StaticOptions
                {
                    MaxStaticsPerBlock        1000
                    WarningStaticsPerBlock    1000
                    ShowIllegalGraphicWarning 1
                }
                it's a flag and defaults to 1 (for the other entries go to 07-05)

07-07 Shinigami
        Hint : uo::ListItems*Location, uo::ListMobile*Location and uo::ListStatics*Location
               will check for out-of-range coords now
               uo::ListObjectsInBox, uo::ListMultisInBox and uo::ListStaticsInBox
               will NOT check for out-of-range coords - a lot of scripter "love" this bug :o/

07-06 Shinigami
        Fixed : u'll get the correct string representation even if a numeric Config File
                Value will cause an overflow

07-05 Shinigami
        Added : Warning if no tiles or landtiles are loaded (maybe files missing...)
        Added : uoconvert.cfg element option added, StaticOptions, in the following form:
                StaticOptions
                {
                    MaxStaticsPerBlock     1000
                    WarningStaticsPerBlock 1000
                }
                max. Amount of Static Items per Block of 8x8x256 (or Warning Level)
                it is hard limited to 10000. default is 1000.

07-04 Shinigami
        Changed : uo::ListStaticItemsAtLocation to uo::ListStaticsAtLocation( x, y, z, flags, realm )
                  uo::ListStaticItemsNearLocation to uo::ListStaticsNearLocation( x, y, z, range, flags, realm )
                  IGNORE_* constants to ITEMS_IGNORE_* constants
        Added : Parameter Z in uo::ListStatics*Location
        Added : LIST_IGNORE_Z constant u can use for Z Parameter to list all Items ignoring Z-Value
                in uo::ListStatics*Location, uo::ListItems*Location and uo::ListMobilesNearLocation*
        Added : uo::ListStaticsInBox( x1,y1,z1, x2,y2,z2, flags, realm );
                creates an array of structures with Static and Multi Items in box.
                you can specify via flags which Items you want to get. check ITEMS_IGNORE_* constants.
        Added : realm-based coord check inside List*InBox and uo::ListMobilesNearLocation*

07-01 Shinigami
        Fixed : low-fragmentation Heap is linked dynamically, so Core will work on Win9x/NT again
        ReAdded: uo::GetAttributeIntrinsicMod( character, attrname )
                 You set intrinsic Mod via exported GetIntrinsicModFunction in attributes.cfg
        Fixed : Memory leak inside cfgfile::Read-/UnloadConfigFile(...)
                cfgfile::AppendConfigFile(...) will call cfgfile::UnloadConfigFile(...) immediately

06-15 Shinigami
        Added : npc::CanMove( direction ) - checks if an NPC can move in given direction
                (IsLegalMove works in a different way and is used for bounding boxes only)
        Added : UseWinLFH=0|1 in SERVSPECOPT(.LOCAL).CFG (default = 0)
                Use Windows XP/2003 low-fragmentation Heap?

06-06 Shinigami
        Fixed : FindPath will work again @ Linux-Core without crashing server in some cases.

06-01 Shinigami
        Fixed : Cancel of TradeWin will put items in correct Realm on ground if backpack full
        Added : movecost.cfg can have 'Walking_Mounted' and 'Running_Mounted' sections too.
                You've to declare one global 'MovementCost' section or 2 sections 'Walking' and
                'Running'. If you don't declare Mounted sections, Core will use unmounted values.
        Added : uo::Attach( character ) - attach a Script to a Character
        Fixed : moving intrinsic Weapon via MoveItemToLocation crashed Server
                WARNING: You should never touch intrinsic Weapons!
        Added : uo::ListStaticItemsAtLocation( x, y, flags, realm )
        Added : uo::ListStaticItemsNearLocation( x, y, range, flags, realm )
                creates an array of structures with Static and Multi Items at or around location.
                you can specify via flags which Items you want to get. check IGNORE_* constants.
                [Edit: changed... please check 07-04 above]
        Added : uo::GetStandingLayers( x, y, flags, realm )
                get an array of standing layers and blocking solids. check MAPDATA_FLAG_* constants.

05-31 Shinigami
        Added : flag LOG_DATETIME in file::LogToFile( filename, line, flags := 0 )
                to log Core-Style DateTimeStr in front of log entry

05-28 Shinigami
        Added : flag ENUMERATE_IGNORE_LOCKED in uo::EnumerateItemsInContainer( container, flags := 0 )
                to list content of locked container too
        Added : uo::SecureTradeWin( character, character2 ) - to init secure trade via script over long distances
        Added : uo::MoveItemToSecureTradeWin( item, character ) - to move item to secure trade window via script

05-25 Shinigami
        Added : Account.delete() - delete this empty account
        Added : Account.split( newacctname : string, index : 1..5 )
                create a new account and move character to it
        Added : Account.move_char( destacctname : string, index : 1..5 )
                move character from this account to destination account.
                you can use it to flip chars on same account too - it's not a bug, it's a feature ;oP

04-04 Shinigami
        Added : player.createdat - returns the PolClock when the character was created
        Added : Before character deletion, scripts/misc/candelete.ecl will be called.
                  program definition is:
                    - program can_delete( who, deleteby ); // return nonzero to allow deletion
                  new constants in UO.EM:
                    - DELETE_BY_PLAYER : Delete-Request by Player
                    - DELETE_BY_SCRIPT : Delete-Request by account.DeleteCharacter( index )
                Before character deletion, scripts/misc/ondelete.ecl and anypkg/ondelete.ecl will be called.
                  Their return values are ignored.
        Fixed : Call OnDelete script in account.DeleteCharacter( index ) too.
        Updated : Account.set_uo_expansion(string): recognized values: SE, AOS, LBR, T2A (default), "".
                    This determines what flag is sent with packet 0xB9 during login
                      (Nothing -> 0x0000 / T2A -> 0x0001 / LBR -> 0x0002 / AOS -> 0x801b / SE -> 0x805b).
                    It's possible to hook 0xB9 but don't forget to set_uo_expansion anyway because core
                    uses this for internal flags (e.g. AoS Tooltips). Packet 0xB9 will be sent earlier
                    (before you choose a character) and after you've used set_uo_expansion.
        Updated : servspecopt.cfg property: UOFeatureEnable, used in the last dword of the 0xA9 login packet,
                  will block Bit 6 (support up to 6 Chars).
                  To enable AoS stuff set Bit 5 (use 0x20), to enable SE stuff set Bit 7 & 5 (use 0xa0).

04-02 Shinigami
        Added : Additional realm-support
                  CreateItemCopyAtLocation(x, y, z, item, realm := _DEFAULT_REALM);
                  boat.move_offline_mobiles(int x, int y, int z[, string realm]);
                    (If realm is not set, Boat-realm is used.)
        Added : Some realm-constants to uo.em

03-09 Shinigami
        Added : WeaponTemplate Prop Delay [ms]
        Added : NPCDesc Prop AttackDelay [ms]
        Added : character.delay_mod [+-ms] for WeaponDelay
                If (Delay!=0) use Delay(+delay_mod) to calculate next weapon swing.

03-05 Shinigami
        Added : UseTileFlagPrefix=0|1 in SERVSPECOPT(.LOCAL).CFG (default = 1)
                Should Core prepend "a"/"an" according to tiles.cfg flags to formatted item names?
                (p.s.: in 08-29 renamed from UseAAnTileFlags to UseTileFlagPrefix)
        Fixed : Last but not least, remove Spell Delay usage from core.

03-03 Madman
        Fixed : My previous attempt to remove spellcasting from the core was incomplete. It should no
                  longer run a skillcheck before starting the spell script.

03-02 Shinigami
        Fixed : MoveObjectToRealm will handle any type of items (equipment etc.) and container with content too.
        Fixed : You can move item from container to different realm without crash.

03-01 Shinigami
        Fixed : Pol will support up to 5 Maps now (Britannia, Britannia_alt, Ilshenar, Malas, Tokuno)

02-23 Shinigami
        Added : DecayItems=0|1 in SERVSPECOPT(.LOCAL).CFG (default = 1)
                Disable (e.g. World Design Server) or enable (Live Shard Server) item decay.

02-14 Shinigami
        Fixed : AOS Spellbook entries in itemdesc.cfg will not crash linux build anymore.
        Fixed : Wrong handling of double clicking AoS style Spellbooks.

01-27 Shinigami
        Fixed : UOConvert will convert Samurai Empire Map Tokuno.
                Don't forget to use tiledata.mul shipped with SE.
                Don't forget to build new tiles.cfg and landtiles.cfg too.
                If not, your Tokuno Realm works and maybe looks funny ;o)
        Fixed : Small bug within UOConvert and Tiledata names with full length.

01-24 Shinigami
        Added : player.clientinfo -- returns a struct with a lot of usefull infomation about client PC
                Example :

                Function TestClientInfo(who)
                  Var info:=who.clientinfo;

                  If (info.unknown1) // in most/all cases 0x02
                    SysLog("ClientInfo '"+who.name+"' ["+who.acctname+"]");
                    SysLog("  Unknown1                 = "+Lower(Hex(info.unknown1)));
                    SysLog("  Unique Instance ID of UO = "+Lower(Hex(info.instance)));
                    SysLog("  OS Version               = "+info.os_major+"."+info.os_minor+"."+info.os_revision);
                    SysLog("  CPU Manufacturer         = "+info.cpu_manufacturer);
                    SysLog("  CPU Family               = "+info.cpu_family);
                    SysLog("  CPU Model                = "+info.cpu_model);
                    SysLog("  CPU Clock Speed          = "+info.cpu_clockspeed+" MHz");
                    SysLog("  CPU Quantity             = "+info.cpu_quantity);
                    SysLog("  Memory                   = "+info.memory+" MB");
                    SysLog("  Screen Resolution        = "+info.screen_width+" x "+info.screen_height+" x "+info.screen_depth+" Bit");
                    SysLog("  Direct X Version         = "+info.directx_major+"."+info.directx_minor);
                    SysLog("  Video Card Description   = "+CChrZ(info.video_description));
                    SysLog("  Video Card Vendor ID     = "+info.video_vendor);
                    SysLog("  Video Card Device ID     = "+info.video_device);
                    SysLog("  Video Card Memory        = "+info.video_memory+" MB");
                    SysLog("  Distribution             = "+info.distribution);
                    SysLog("  Clients Running          = "+info.clients_running);
                    SysLog("  Clients Installed        = "+info.clients_installed);
                    SysLog("  Partial Insstalled       = "+info.partial_installed);
                    SysLog("  Language Code            = "+CChrZ(info.langcode));
                    SysLog("  Unknown2                 = "+info.unknown2);
                  Else
                    SysLog("No ClientInfo '"+who.name+"' ["+who.acctname+"]");
                  EndIf
                EndFunction

                Limitations :
                  The client doesn't send this Packet every time,
                    if available you can use it first time in your misc/logon.src.
                  If your login server differs from play/shard server it doesn't work
                    (Packet will be send before you choose the server only).
                  This will work for Win release only, until now. Win and Linux core
                    handle server-choose- and play-connection in a different way.
                    Not sure why, must be something with OS-Socks implementation :o(

                Comment :
                  Seems to be very usefull to detect shadow accounts...
                  You love 1984? OSI too ;oP

                (p.s.: in 08-29 renamed from player.spyonclient2 to player.clientinfo)

01-24 Shinigami
        Linux : If you'll get something like this using Gentoo Release:

                  pol: ../sysdeps/generic/dl-tls.c:72: _dl_next_tls_modid:
                    Assertion `result <= _dl_tls_max_dtv_idx' failed.

                try following to run your Pol:

                  #!/bin/sh
                  export LD_ASSUME_KERNEL=2.4
                  ./pol

09-18 Birdy
        Fixed : Moved login complete packet send higher in login process to try to fix
                problems with logging into a weather region with weather where it would
                start to rain spell icons instead of rain or snow.

08-03 Birdy
        Added : AcctMatch lines in server entries in servers.cfg.  Example of format
                is below.  AcctMatch lines have one account name per line, and are
                those accounts to show the given server to on login to the
                'login server'(the server that is in the client's login.cfg).
                Example :

                GameServer
                {
                    Name      Test
                    IP        192.168.0.1
                    Port      5003
                    AcctMatch admin
                    AcctMatch staff
                }

                The above would only display that particular server(Test, located at
                192.168.0.1:5003) to someone logging into the login server with
                accounts admin or staff.

                IPMatch still works as well, and for an account to see the server it
                must fulfill both IPMatch and AcctMatch entries, if those exist to
                match up against.

08-03 Birdy
        Fixed : Good Aligned NPCs that attack innocents and go criminal will
                highlight grey now.
                Attacking criminal flagged Good NPCs will no longer flag others as
                criminal.

08-01 Birdy
        Fixed : Crash bug related to realm not being set in createitemincontainer soon
                enough for references to it in create scripts.

07-27 Birdy
        Added : New system event : SYSEVENT_GONE_CRIMINAL := 0x2000;
                You should add this to your sysevent.inc file or wherever you keep your
                system event constants.  This event is closely associated with the
                SYSEVENT_ENTERED_AREA event.  It uses the current range setting for
                the ENTERED_AREA event as it's own range, and this is for good reason.
                The GONE_CRIMINAL event lets the system tell the NPC when a mobile has
                become a criminal(from a previously non-criminal state) by firing this
                event and placing a character reference to the new criminal in the
                source field of the event. If used in conjunction with the ENTERED_AREA
                system event, then guards should be able to do their guarding work
                without needing to do polling scans of the area around them periodically.
                On ENTERED_AREA events, you check to see if the person entering the area
                is a criminal or not.  On GONE_CRIMINAL events, you know that the person
                who was already in the area has become a criminal from previously being
                innocent.

                This event will only fire if the criminal is visible to the NPC.  Though
                again, if you are using it in conjunction with the ENTERED_AREA event, then
                when the criminal comes out of hiding, an ENTERED_AREA event will be fired
                and you can handle the criminal there.

                This event will also only fire on transitions from innocent status to
                criminal status.  No events will fire on transition to innocent status
                again, and if the subject was already a criminal to begin with, then
                doing a criminal act again will not fire the event.  This is to keep the
                system from being overloaded with events since every hit on an innocent
                is a new criminal act.

                I will stress one last time, use this WITH the SYSEVENT_ENTERED_AREA
                system event, NOT on it's own!  Or you will be confused and bewildered.
                You have been warned!

07-18 Madman Across the Water
        Changed: Casting from the default spellbook:
               * It no longer checks if you are dead, says the words of power,
                 performs the animations, checks for free hands, performs a
                 skill check, or checks for or consumes mana or reagents. All
                 these things must now be handled in scripts. This, combined
                 with Myrathi's changes on 5-12, wherein spellid is now passed
                 to the cast spell, should allow greater flexibility and also
                 simplicity in spell systems and scripts.

06-17 Birdy
        Changed: Uncommented RandomFloat(...) in util.em to allow it to be used.

06-13 Birdy
        Fixed: Items dragged across realms and dropped will update properly.  This
               is necessary to allow storage containers to be able to have their items
               dragged out of them and dropped on the ground directly, even if the
               ground is not the default realm that storage containers are all in.
        Fixed: All worn items will now have their realm updated on character realm
               transfer instead of just the backpack.

06-09 Myrathi
        Removed: Deprecated UO.EM functions:
               * Damage()
               * GameStat()

06-08 Myrathi
        Fixed: CASE statements given a significant overhaul:
               * Error messages now correctly refer to them as a "CASE statement",
                 not a "SWITCH statement".
               * They now *require* their test-expression to be within parenthesis.
               * Empty CASE statements with no option clauses are now caught as
                 invalid.
               * A warning message will be displayed if the only thing defined is
                 a "default:" clause (i.e. no option clauses)
               * Missing option values are now caught and less cryptic error messages
                 shown (e.g. when using undefined constants)

06-06 Myrathi
        Added: New 'dowhile' keyword (to solve the "do/while()/endwhile/while()"
               bug). "do..dowhile()" now follows the more usual block syntax
               style (if..endif, while..endwhile, etc.).
               Syntax is as follows:

                   do
                     <statements>
                   dowhile ( <expression-is-true> );

06-05 Birdy
        Added: ItemColorMask ServerSpecOpt option.  This option defaults to the
               typical POL mask of 0xFFF.  It is a bitmask of what colors should
               be considered valid.  For example, with an ItemColorMask of
               0xFFF, any color from 0 to 4095 is considered a valid color.
               With an ItemColorMask of 0xFF, this would be reduced to a range
               from 0 to 255.  It was left a mask instead of given as a range
               in order to allow specifying certain bits to be on.  So, for
               instance, with the newer clients, a mask of 0x4FFF will allow
               the third bit (value 4) of the most significant nibble to
               be turned on, but no others in that nibble.  This allows for
               newer clients to use the "transparent animation" feature, which
               allows equipped mounts to be transparent(ie, ethereals).  Bear
               in mind, older clients may well crash if you set colors to be
               outside of the non-default mask of 0xFFF, so this is strictly at
               your own risk to use it.  But for those of you wishing ethereal
               beetles and other mount animations to be ethereal, you will have
               to set the mount piece to be color 0x4001 and then equip it.
               And in order to do that, you will need an ItemColorMask of
               0x4FFF.

06-03 Birdy
        Removed: GetAttributeIntrinsicMod(...) function interface in uo.em was
                 removed, since no Set for the function has existed since way
                 back in POL094 test cores and no plans to impliment a set
                 exist.  This will require a search of your scripts for this
                 function and removal of it(some distro code has it) and
                 a recompile of those scripts.

05-24 Birdy
        Fixed: FindSubstance should now (hopefully) auto-release items reserved by
               it on script termination.
        Fixed: Packet.SendAreaPacket(x,y,range,realm) now looks for 4 parameters
               as it should instead of 3.

05-17 Birdy
        Changed: concealed property is no longer compared to cmdlevel by core.  Any
                 scripts changing concealed should do validation against cmdlevel
                 itself.  Doing this now allows NPCs and others to be able to be
                 concealed at higher levels than their cmdlevel.  For this added
                 flexibility, all validation must now be done within scripts!

05-16 Myrathi
    Removed deprecated operators and tokens (as promised! :P'):
        - '=' has been removed; use '==' to test for equality.
          (appropriate suggestions will be made for '==' or ':=')
        - 'local', 'global' and 'dim' have been removed; use 'var' to declare variables.
        - 'begin' and 'end' have been removed:
            do..while() loops now work without them.
            repeat..until() loops never actually needed them: so no loss. :)

        ** Scripts containing any of the removed operators or tokens **
        **     WILL NOT COMPILE ANY MORE!! Update your scripts!!     **

05-12 Myrathi
    Fixed: Mobile 'mob.frozen' flag is now saved properly (NOTE: this includes PCs and
        will most likely require any existing scripted workarounds to be rewritten!)

    Added: Extra 'spell_id' parameter is now passed to spell scripts which relates to
        'SPELLID' in the spell's entry in '::spells.cfg'.

        Example:
            use uo;
            program spellscript( who, spell_id )
                SendSysMessage(who, "Casting SPELLID# " + CStr(spell_id));
                // "Clumsy" has spell_id = 1, "Create Food" = 2, etc..
            endprogram

05-01 Birdy
    Fixed: Number of Map/Static patches was reversed in the enable difs packet.

05-01 Racalac
    Fixed CProps "GivenBy", "GivenTo", and "GivenTime" set on items dropped on NPCs.

04-26 Birdy
    Added: New uo.em function created :
        FindSubstance( container, objtype, amount, makeinuse := 0 )
        This function will search the given container for items of objtype in an
        amount equal or greater than the amount given(stackables can return greater
        than #), if makeinuse is set to 1, then the items will be reserved.  If
        sufficient # of items have been found, those found(and possibly reserved)
        will be returned in an array as the return value.  If not enough of the
        given item were found, then an error with errortext = "Not enough of that
        substance in container" will be returned.

04-25 Racalac
    Added new house methods that allow write access to the house.components array.
        house.add_component(item ref)
        house.erase_component(item ref)
    Added multi member:
        multi.footprint
            returns a struct with "xmin", "xmax", "ymin", "ymax" of the world coordinates
            the house or boat occupies.
    Added GetMultiDimensions(graphic), returns struct with "xmin", "xmax", "ymin", "ymax"
        of _relative_ distances from center. xmin and ymin are _negative_.
    Changed TargetMultiPlacement. new optional parameters:
        TargetMultiPlacement( character, objtype, flags := 0, xoffset := 0, yoffset := 0 );
        xoffset and yoffset change the "ghost" target house. NOTE: the coordinates returned
        by this are the coordinates of the "target" cursor, not the center of the house!
        So if you want to have the front steps be under the cursor, you must transform the
        parameters to CreateMultiAtLocation to include your xoffset and yoffset. ANOTHER
        NOTE: positive offsets move the cursor left/down in relation to the ghost house.
        When transforming the coordinates for CreateMultiAtLocation, use the negative (i.e
        if yoffset is 4, subtract 4 from the y coordinate result of TargetMultiPlacement
        when passing the location to CreateMultiAtLocation.
        Example, using the front steps to target:
            var dims := GetMultiDimensions( 0x6071 );
            if(!dims) return; endif
            var loc := TargetMultiPlacement( who, 0x6071, 0, 0, dims.ymax );
            if(!loc) return; endif
            var house := CreateMultiAtLocation( loc.x, loc.y - dims.ymax, loc.z, 0x6071, 0, who.realm );


04-24 Racalac
    Armor Zone 0 errors hae a better message now.
    Half-created PCs shouldn't get into the world file now.
    Added house.custom() returns 1/0 (for upcoming custom house support)
    NPC move functions check the current realm's bounds
    CreateItemAtLocation correctly checks passed coordinates for validity for the realm
    Map methods (insertpin, etc) check the current realm's bounds. Not like there's art for
        the other realms anyway.
    Packet 0x1B changed to include correct map/server bounds

04-23 Birdy
    Changed: Mounts listed in uoconvert.cfg that are not found to have tiledata.mul
        entries will now be created regardless.  Should fix problems related to
        0x3ea2 mount(perhaps others too), which has no tiledata.mul entry, yet
        is a valid mount graphic.

04-20 Birdy
    Fixed: FindPath(...) should work again now.

04-17 Birdy
    Changed: Speech.mul -- Added in support for UTF-8 -> Unicode decoding in speech.mul
        packets.  Should work now (hopefully) for all languages.
    Fixed: Minor tweaks to movement.  Should fix some bounceback problems.

04-17 Racalac
    Multimap/Realm Support
    ----------------------
    POL now supports seperate maps, or "Realms", such as britannia, ilshenar,
    and malas. The uoconvert tool is the starting point for using realms on
    your shard. Run the updated instructions in the included uoconvert.txt
    help file. The names of the directories created in pol/realms by uoconvert
    are the realm names that are used by the core and your scripts. I
    recommend you keep them the same as what is in the uoconvert.txt file.
    Realm names are the key to using realms on your shard.

    The client's *.dif files should be used in the uoconvert process, as the
    client needs to know how many patches exist. Any time the .dif files
    change on the client side, re-run uoconvert with the new .dif files to
    stay in sync.


    Object Changes:
    UObject.realm: Read-only string. (This inherits to Item, Character, Multi, etc)

    Account.uo_expansion: Read-only string
    Account.set_uo_expansion(string): recognized values: AOS, LBR, T2A (default)
      This determines what flag is sent with packet 0xB9 during login. The
      servspecopt.cfg UOFeatureEnable is used with packet 0xA9 and is currently
      global to all clients.

    Packet.SendAreaPacket(x,y,range,realm), realm name string parameter added.

    Escript Module Changes:
    polsys.em:
        Added "Realms()": returns a dictionary of structs. example:
            "realm_name" -> "width"
                            "height"
                            "mapid"
                            "toplevel_item_count"
                            "mobile_count"

    uo.em (included with zip):
    The following functions were enhanced with a realm parameter (all realm
    parameters are a case-sensative string name of the realm). All other
    functions use some object's context for determining the realm.

    Tip for upgrading: all your scripts should works normall _in Britannia_.
    In any other realm they will fail. You must find all occurances of these
    functions on your shard and fill in the realm parameter with an appropriate
    value. For example, in the createnpc textcommand, the call to
    CreateNPCAtLocation should be made with 'who.realm' as the last parameter.
    Many script changes are easy like this, others are harder, like
    spawnregion and recall/gate spells. If something doesn't work, you can be
    fairly sure it's due to an incorrect realm parameter. The pol-distro
    sourceforge project has been updated with many of these changes if you
    wish to look.

    const _DEFAULT_REALM := "britannia";
    CreateItemAtLocation( x, y, z, objtype, amount := 1, realm := _DEFAULT_REALM );
    CreateMultiAtLocation( x, y, z, objtype, flags := 0, realm := _DEFAULT_REALM );
    CreateNpcFromTemplate( template, x, y, z, override_properties := 0, realm := _DEFAULT_REALM);
    FindPath( x1, y1, z1, x2, y2, z2, realm := _DEFAULT_REALM, mobilesblock := 0, searchskirt := 5 );
    GetHarvestDifficulty( resource, x, y, tiletype, realm := _DEFAULT_REALM );
    GetMapInfo( x, y, realm := _DEFAULT_REALM );
    GetRegionString( resource, x, y, propertyname, realm := _DEFAULT_REALM );
    GetStandingHeight( x, y, startz, realm := _DEFAULT_REALM );
    GetWorldHeight( x, y, realm := _DEFAULT_REALM );
    HarvestResource( resource, x, y, b, n, realm := _DEFAULT_REALM ); // returns b*a where 0 <= a <= n
    ListGhostsNearLocation( x, y, z, range, realm := _DEFAULT_REALM );
    ListItemsAtLocation( x, y, z, realm := _DEFAULT_REALM );
    ListItemsNearLocation( x, y, z, range, realm := _DEFAULT_REALM );
    ListItemsNearLocationOfType( x,y,z, range, objtype, realm := _DEFAULT_REALM );
    ListItemsNearLocationWithFlag( x,y,z, range, flags, realm := _DEFAULT_REALM );
    ListMobilesNearLocation( x, y, z, range, realm := _DEFAULT_REALM );
    ListMobilesNearLocationEx( x,y,z, range, flags, realm := _DEFAULT_REALM );
    ListObjectsInBox( x1,y1,z1, x2,y2,z2, realm := _DEFAULT_REALM );
    ListMultisInBox( x1,y1,z1, x2,y2,z2, realm := _DEFAULT_REALM );
    PlayMovingEffectXYZ( srcx, srcy, srcz, dstx, dsty, dstz, effect, speed, loop := 0, explode := 0, realm := _DEFAULT_REALM );
    PlayStationaryEffect( x, y, z, effect, speed, loop := 0, explode := 0, realm := _DEFAULT_REALM );

    Functions added:
    MoveObjectToRealm( object, realm, x, y, z, flags := 0 );
        --This is the only write interface to an object's realm. If you wish
        an object to reside on another realm, this is the only function
        available. Check obj.realm != destination_realm to avoid unnecessary
        same-realm transfers. flags is the normal MoveItem|CharacterToLocation
        flags. The passed x,y,z must be a standable location in the specified
        realm.

    Most of these functions will return the errors "Realm not found" and
        "Invalid Coordinates for realm".


    Regions:
    Added "Realm realmname" property

    poltool:
    added a 5th parameter for the 'mapdump' command, a realm name string as above

    uoconvert:
    number of map and static patches (from mapdif and stadif files) saved to
       /realm/[name]/realm.cfg
    Recommend to turn on mapdifs for all realms.


    Other Changes:
    AOS Spellbook packets are supported. For this, change you spellbook's
    itemdesc.cfg type from Container to Spellbook. Paladin and Necromancer
    spellbooks are supported by the new Spellbook itemdesc type property
    "SpellType" which is one of these strings: "Magic", "Paladin", "Necro".

    Recognized scroll objects are: Magic: 0x1F2D - 0x1F6C, Necro 0x2260 - 0x226F,
        Paladin: 0x2270 - 0x227C. Sorry this is hardcoded :P

    Simple support for AOS tooltips - old single click functionality is supported.

    Custom Houses - not yet sorry, that's next!


04-01 Birdy
    Added: 	MaxPathFindRange servspecopt[.local].cfg option added.  This will define the
            maximum distance between the start and destination points which pathfinding
            will be performed on.  If PathFind is called on points greater than this
            value, an error result will be returned with "Beyond Max Range." as the
            errortext.  Default value for this is 50.
    Added:	HiddenTurnsCount servspecopt[.local].cfg option added.  This will define
            whether or not turns made while hidden will count as a "move".  It defaults
            to 1, which is the way POL has always operated.  If set to zero, then if
            you are hidden and make a turn, it will not count against your stealth steps,
            nor will it unhide you if you are not stealthing.  If set to one, turns while
            hidden do count against stealthsteps, and will unhide you if you are not
            stealthing.
    Added:  New uo.em function added, UseItem(item, character);  This will allow the
            item specified's use script to be run by the character specified.  No checks
            are done for distance, or check for being a ghost, or anything else.
            Essentially, the script is just fired off on the character without checks, so
            the script calling this function should do those checks if desired.  This
            function can also be called with NPC's as the character, but any use script
            that requires interactivity with it's user that is called on an NPC may have
            unpredictable results(dependant on the script).
    Added:  UOConvert now will report the (x,y,z) of invalid tiles that cause it to
            abort map conversion instead of just aborting.

03-29 Birdy
    Fixed: Caves should now be able to be walked into.  Some problems along shores fixed too.
            Run UOconvert on your files for this fix to work.

03-24 Birdy
    Changed: Character height in all other aspects changed to 15 from 9 to better reflect height in
             game relative to items.
    Changed: Walking related to ladders modified to try to help in their traversal.
    Changed: The map now should block LOS.  Run UOconvert on all your files again! (see uoconvert.txt
             for instructions)
    Fixed: Speech.mul should now display speech with keywords even when on a non-ENU region computer.
    Changed: Boats now check height of blockables in relation to the boat before being
             blocked by them.  This should allow boats to travel under sufficiently high
             bridges and over statics that may be under the map.
    Added: Pathfinding function FindPath.  This is a very experimental function and has a minute
            chance of returning a "Path Corrupted" error.  If you use it and can find a distinct
            path from point A to point B which generates a "Path Corrupted" error, please send
            details to the dev team.

            Function prototype is found in uo.em and takes the form :

            FindPath( x1, y1, z1, x2, y2, z2, realm := _DEFAULT_REALM, mobilesblock := 0, searchskirt := 5 );

            (x1,y1,z1) = start of the path
            (x2,y2,z2) = destination
            mobilesblock = Whether or not to consider mobiles in the way as 'blocking' the path.
            searchskirt = The skirt around the square that is formed around the start of the path
                          to the destination which represents the searchable area.

            If it finds a path it will return an array of coordinates, representing each step
            along the path from the next step to take from the start of the path to the actual
            destination.  The coordinates are found in .x, .y, and .z.  Ex :

            myPath := FindPath(startx, starty, startz, endx, endy, endz);

            The first step to take from a standing position at (startx,starty,startz) would be
            at (myPath[1].x, myPath[1].y, myPath[1].z), the next at (myPath[2].x, myPath[2].y,
            myPath[2].z), etc.

            Keep in mind that if you want you can give as large a search area as you want, and
            it will try to find the area.  But the larger the search area(ie, the larger the
            distance from start to destination), the more memory and more time it will take to
            find a path.  Trying to search, for instance, for a path from Yew to Britain will
            almost certainly freeze your shard and gobble up all it's memory.  No restrictions
            were placed in core in order to allow for use of the function with future computers
            which may indeed one day be able to search for such a path in a split second.  But
            that leaves the responsibility on the scripter using the function to be certain to
            not try to search for outrageously large paths.  My experience is that paths of
            20 or less tiles are fairly quick and low impact on the server.

            Several errors can be returned instead, with the following errortext messages :

            "Failed to find a path."  --  The typical error returned when a path hasn't been found.
            "Out of memory."          --  This will only happen if there isn't sufficient memory to perform the search.
            "Solution Corrupted!"     --  This is an error that rarely seems to happen, but if you can get it to
                                          happen repeatedly along a static(non-changing) specific path, please
                                          report it to birdy@polserver.com
            "Pathfind Error."         --  A catch-all error for various other circumstances, assume no path could be found.

03-04 Birdy
    Changed: Character look height changed to 15 from 9 to better reflect height in game relative
            to items.
    Added: uoconvert.cfg element option added, LOSOptions, in the following form:
                LOSOptions
                {
                    UseNoShoot        1
                    LOSThroughWindows 1
                }
            UseNoShoot means uoconvert will determine whether or not something blocks LOS by use of
            the NoShoot tiledata flag instead of the Blocking tiledata flag.  A couple of special
            cases exist for secret door items and blocking items that are walls(in both cases, LOS
            will be hindered), but otherwise the NoShoot tiledata flag will be used.  This should
            make many blocking, yet not really LOS blocking items no longer block sight, such as
            candelabras, lamp posts, and such.
            LOSThroughWindows only matters if UseNoShoot is 1.  If LOSThroughWindows is 1, then
            items marked as windows in tiledata will not impede LOS.
            Both of these options default to false.  When UseNoShoot is false, the old method of
            determining sight blocking as being equivalent to ability to pass will be used for LOS.
    Added: uoconvert.cfg element option added, Mounts, in the following form:
                Mounts
                {
                    Tiles  0x3ea0 0x3ea1 0x3ea2 0x3ea3 0x3ea4 0x3ea5 0x3ea6 0x3ea8 0x3ea9 0x3eb0 0x3eb2 0x3eb3 0x3e9f
                }
            If this element exists, and if Tiles exist within it, then those tiles with the graphic IDs
            listed will be considered to be mounts by uoconvert and will set the layer to be the
            mount layer and it will set the tile to be equippable.

    Added: New System Hook : SpeechMul -- This hook will be activated when someone using a client with speech.mul
            in it says a speech.mul keyword(one or more).  The person who spoke is passed as the first parameter
            and an array containing each of the speech tokens they spoke is passed as the second parameter.
            This is a very experimental hook, so use at your own risk!  Though I would like to know if it works,
            particularly on non-english systems.  For ENU players/admins, whether you have a hook or not, these
            changes should make it such that you no longer "lose text" that has speech.mul tokens in it.

            If you wish to write a syshook script for speech.mul tokens, you will need a syshook.cfg file with
            the following in it.  This should be in a package of some sort too of course.

                SystemHookScript speechmulhook.ecl
                {
                    SpeechMul SpeechMul
                }

            The following is an example of a very simple hook called speechmulhook.src.  It is, of course, up to
            you to make something actually useful. :

                use uo;

                program SpeechMulHook()
                    return 1; //change to 1 to enable the hook
                endprogram

                exported function SpeechMul(who, speechtokens) //note passed ARRAY of speech.mul tokens

                    Print("Tokens : ");
                    foreach token in speechtokens
                        Print(CStr(token));
                    endforeach

                endfunction

12-27 Racalac
    Fixed invisible corpse clothing
    Fixed boat member access
    Fixed (maybe) first non-nodraw tile in multi definition flagged as static by uoconvert
    Changed core visibility function - characters now can always see themselves. Fix for
        equipping items while hidden not showing until unhiding.

12-06 Racalac
    Fixed: Invisible items in containers caused random items to become temporarily invisible
    Fixed: default doubleclick range for items without an itemdesc entry wasn't reading from servspecopt.cfg

11-16 Racalac
    Fixed: member access to account and script objects (and any dicts/structs with the same key names)
        Recompile your scripts! Keep testing, find my errors! :)
    Changed: logged-off players are now considered not visible for any/all systems that check visibility.

11-15 Racalac
    poltool: prints flag descriptions
    Fixed: height 1 "half-height" tiles no longer considered height 0.
    Fixed: crash by passing 0 to SystemFindBoatBySerial
    Fixed: account object method fall-through. d'oh!

11-10 Racalac
    Fixed member access to datastore, script, and guild objects. Keep testing!
    Changed: equipment.container returns an "offline" character reference when equipped.

11-09 Racalac
    Changed: invisible items in containers can't be seen by those without the seeinvisitems priv
    Major Changes: New ecompile version! Changed the way object methods and members are set and get.
        This should give a moderate to major speed enhancement to script execution. Please report
        any weirdness you encounter with respect to setting and getting object (and struct/dict)
        members, calling object methods, and methodscripts (that may or may not override core-defined
        methods).
        Temporary new ecompile/ecompile.cfg option: specifiy the -m command-line paramter to compile
            using the old way, or set "OptimizeObjectMembers" in ecompile.cfg to 0 (1 by default).
            This option will go away when I'm satisfied this new code works.

11-01 Racalac (not in 11-01 test core)
    Fixed: water statics above walkable map no longer blocks movement below
    Fixed: second equipped item in a layer no longer stored as "gotten" (fixes crash on save?)

10-31 Racalac
    Items with no defined itemdesc.cfg entry (walls, floors, etc) will use the
        servspecopt.cfg values for decay time and dblclickrange.
    Added character.cleargottenitem(). Returns "dragged" item to original
        location. There's an graphical glitch with the client that makes it
        look like the item is duplicated. The item that appears to remain on
        the cursor is not really there.
    uoconvert: changed map structure to allow building dynamic items and walking
        around on them. RECONVERT YOUR MAP!
    Allowed movement in places like T2A with dramatic Z changes in the map.
    Fixed: certain script parameters were being flagged wrongly as out-of-range
    Fixed: (maybe) If a layer is already equipped, trying to equip another item
        on that layer will return the item to its original location (3D client thing).
    Added Npcdesc.cfg property: AttackAnimation (default 0 (wrestling)), use this
         change the template's intrinsic weapon animation (i.e. for LBR npcs)

10-25 Racalac
    Added uoconvert.cfg for defining what multi IDs are what type (Boat, House, Stairs (AOS)). See included file for 'normal' values.
    Added for Packet Hooks: SubCommandLength property for 'parent' packets: 1, 2, or 4 byte lengths for subcommand fields.
        Example:
        Packet 0x12 //Macro/Spell/Action
        {
            Length variable
            SubCommandOffset 3
            SubCommandLength 1 //unlike cmd BF, the subcommand is 1 byte, not 2
        }
        SubPacket 0x12
        {
            SubCommandID 0xC7 //bow or salute
            ReceiveFunction command_12:HandleC7Action
        }

09-27 Racalac
    Fixed improper cleanup of accounts and player characters on exit, leftovers.txt should be reduced in size now.
    Maybe fixed a memory leak in the packet hook system.

09-08 Racalac
    Fixed a crash condition concerning multis and movement.
    Added error messages if missing realm files.

    uoconvert: handles a specific poorly formed staidx block

09-06 Racalac
    uotool reads pol.cfg from the same dir to find the MUL files.
    uotool & poltool usage statements updated
    Example to fix mounts, add en entry like this in tiles.cfg for each of your mount types (i.e. listed in tamed.src)
    Remember running "uoconvert tiles" will not save your manual changes.
    tile 0x3ea2
    {
        Desc mount
        UoFlags 0x04404000
        Layer 25
        Height 3
        Weight 0
        Equippable 1
        Movable 1
    }
    Changed UOConvert handling of blocking flags, probably fixing NPCs walking through fences, etc. Please re-run UOconvert.
    Syz changed uoconvert to be more friendly to tool-created map and statics MULs.

08-21 Racalac
    Turned off core sends of Packet oxB9 (UO expansion enable) for now, it will return!
    Fixed bug with CreatePacket with specified cmdtype with fixed-length.

08-20 Racalac
    Fixed a bug in multis walking code introduced in the 08-19 testcore.

08-16 Syzygy
    The 'Summon Water Elemental' spell must now be in the spellbook to be cast.

08-14 Syzygy
    Fixed a LOS issue when doubleclicking an item stored in an NPC's backpack

08-13 Syzygy
    corrected an error where a client could be redirected to the wrong server if servers.cfg specified 'IPMatch' directives.
    corrected an error which would not allow a mob to drop an item to a lower Z.
    at death, those added to your "reportable" list will no longer be marked aggressor to you.
    at death, those added to your "reportable" list will no longer be marked as having lawfully damaged you.
      (this is imperfect - all your aggressors, and lawful damagers, should be cleared at your death)

08-09 Syzygy
    pol.exe no longer uses .mul files.  See uoconvert.txt for notes (you will use uoconvert to generate pol data files)
      notable changes:
         a door will only be ignored if its itemdesc entry says it's a door
           (previously, used the tiledata.mul "door" flag to tell)
      I do not recommend editing multis.cfg, tiles.cfg, or landtiles.cfg by hand - as uoconvert is young, it's likely
      that you'll have to regenerate these files from the .mul files soon.

08-05 Syzygy
    Removed 'UseDynamicMapCache' pol.cfg option and related code

07-27 Syzygy
    CreateNpcFromTemplate will now accept a struct, or an array (with element names), specifying custom properties

07-26 Racalac
    Fixed creating armor items with GetItemDescriptor
    Added: Packet Hook Scripts. See packethooks.txt. Don't try to hook AOS packets or I'll cry.

06-20 Syzygy
    account.GetCharacter(index) will notice if you pass 0, which is bad.
        account.DeleteCharacter(index) - same

-- POL095 --
07-03 Syzygy
    Added length validation for the 0xBD (client version) packet.

07-01 Syzygy
    ecompile looks for ecompile.cfg in the current directory before looking where the binary is.
    ecompile now flags the following as errors:
        var s := "1234" + ;
        var a := +;
        var a := { 4, +, 6 };

06-30 Racalac
    account.SetName() takes an optional second parameter for new account password. If you have RetainCleartextPasswords=0,
        then you must pass a new account password, or you will get an error.
    default WeatherType for a region is now 255 (no weather), not 0 (rain).

06-30 Syzygy
    Corrected a crash exception on character creation if a control character was included in the name.
    Fixed a crash bug when displaying corpses in some circumstances.

06-25 Syzygy
    Items which specify "SaveOnExit 0" will have serials allocated from the same range as normal items.
      This also fixes a bug where duplicate serials could be allocated for nonsaved items.

06-24 Racalac
    Changed MD5 hashing flags to work on a broader range of windows installations.
    Instrinsic NPC weapons now are read-only for: hp, maxhp_mod, quality, dmg_mod.

06-20 Syzygy
    account.GetCharacter and account.DeleteCharacter will no longer accept an index of 0
    Fixed a problem with character creation that could result in characters being written
      with 'CharIdx -1' (these were all failed character creations)
    Character creation will refuse to create a character with control characters in the name (newline, for example)

06-19 Racalac
    Added a 2 minute timeout for closing sockets POL has not received any data on. The client normally sends keep-alive
        messages every 60 seconds. This may fix the "number of connections reported much higher than the number of clients"
        bug.

06-19 Syzygy
    Fixed an access violation if a negative X or negative Y value was passed to various functions

    canInsert / onInsert script rework, part 3: changing parameter order to make things more consistent:
        adding an amount to existing stack:
          canInsert( mob, container, movetype, INSERT_INCREASE_STACK, adding_item, existing_stack, amt_to_add )
          onInsert( mob, container, movetype, INSERT_INCREASE_STACK, uninit, existing_stack, amt_to_add )
          (NOTE: for canInsert, adding_item can be an uninit, if one of the CreateItem functions is merely adding to an existing stack.
           By the time onInsert is called, adding_item is gone.)
        adding new item:
          canInsert( mob, container, movetype, INSERT_ADD_ITEM, adding_item )
          onInsert( mob, container, movetype, INSERT_ADD_ITEM, adding_item )

    Fixed a race condition which could cause socket error 10038

06-18 Syzygy
    escript: array + array will return a concatenation of the arrays:
           { 3,2,6 } + {6,4}  returns {3,2,6,6,4}
    AddMenuItem will once again accept 0 as a valid objtype
    TargetMultiPlacement will once again accept objtype values between 0x4000 and 0x4fff

    **** A VERY SPECIAL NOTE ****
       It would be best if you defined all your your objtypes in the range 0x5000 to 0xEFFF.
       See notes under POL092-2000-12-11 for how to specify OldObjType in itemdesc.cfg to convert objtypes at load time.
    *** END VERY SPECIAL NOTE ***

06-16 Syzygy
    Fixed typo in RESURRECT_FORCELOCATION flag
    The main listen thread will no longer be started if ListenPort=0

    All intrinsic weapons and storage area root items are now always marked inuse
        - this way, DestroyItem, EquipItem, dragging etc won't work on these types of items
        (this was a cause of the dreaded 'itr != wc.items.end()' assertion failures)

    Fixed a memory leak in GetItemDescriptor()
    Added sanity checking in GetItemDescriptor use in case you set descriptor.CProps to other than a dictionary,
     or StackingIgnoresCProps to other than an array, to detect this rather than crash.

    canInsert / onInsert script rework, part 2:
      old:
        can/onInsert( owner, container, item, movetype )
        can/onInsert( owner, container, item, movetype, amtadded ) (sometimes)
      new:
        adding an amount to existing stack:
          canInsert( mob, container, movetype, INSERT_INCREASE_STACK, existing_item, amt_to_add, adding_item )
          onInsert( mob, container, movetype, INSERT_INCREASE_STACK, existing_item, amt_to_add )
          (NOTE: adding_item can be an uninit, if one of the CreateItem functions is merely adding to an existing stack.
           By the time onInsert is called, adding_item is gone.)
        adding new item:
          canInsert( mob, container, movetype, INSERT_ADD_ITEM, new_item )
          onInsert( mob, container, movetype, INSERT_ADD_ITEM, new_item )

      These are the times when canInsert / onInsert scripts are called:
        Client drag/drop
        vendor buy: when moving items to the player's backpack
        vendor sell: when putting gold in the player's backpack
        secure trade, when cancelling or confirming a trade
        MoveItemToContainer
        CreateItemInContainer
        CreateItemInInventory
        CreateItemInBackpack

    Since I didn't actually test the backtrace-on-assertion functionality under Linux, it didn't work.
      Now it does.

    console.cfg is now reloadable (ReloadConfiguration, or SIGHUP)

    Added file.em module:
        ReadFile( filename ): read a text file
            reads a text file
            returns contents as an array of strings
            removing newlines
        WriteFile( filename, contents ): write a text file
            contents is an array of strings.
            appends newlines.
            creates file if it does not exist.
            renames existing file to filename.bak
        AppendToFile( filename, morelines ): append to a text file
            morelines: an array of strings
            appends newlines.
            creates file if it does not exist.
        LogToFile( filename, textline ): append a single line to a text file
            appends newlines.
            creates file if it does not exist.
        By default, no package has any file access rights.
        config/fileaccess.cfg: reloadable config file, grants access.  Example:
            FileAccess
            {
                AllowRead 1
                AllowRemote 1
                Package testfileaccess
                Extension .cfg
                Extension .src
            }

            FileAccess
            {
                AllowWrite 1
                AllowRemote 0
                Package testfileaccess
                Extension .txt
            }

            FileAccess
            {
                AllowAppend 1
                Package *
                Extension .log
            }



06-15 Syzygy
    new pol.cfg option: AssertionFailureAction = abort/continue/shutdown/shutdown-nosave
        abort: (like old behavior) aborts immediately, without saving data.
        continue: allows execution to continue.
        shutdown: attempts graceful shutdown
        shutdown-nosave: attempts graceful shutdown, without saving data.

        If the assertion occurred during execution of a script, either 'shutdown', 'shutdown-nosave', or 'continue'
        will abort that script, displaying the script name and PC.

    Added uo.em function: ListMultisInBox(x1,y1,z1, x2,y2,z2) lists multis that have at least one static within the volume specified.
    Resurrect takes an optional parameter.  If you pass RESURRECT_FORCELOCATION, will not check for blocking objects.
        Be sure you know what you're doing if you pass this flag.

    Just a note: if you're using Listener entries in uoclient.cfg, you should set ListenPort=0 in pol.cfg

    ecompile: uses ECOMPILE_CFG_PATH environment variable to find ecompile.cfg, if present.
      (note that normally it tries to look where the executable is.  Some shells don't always pass this,
       particularly if you're using batch files or shell scripts - try putting the full path to ecompile in your batch file)
    Added a bewildering number of options to ecompile.cfg:
        DisplayWarnings = 0/1               (same as -w flag)
        CompileAspPages = 0/1               (same as -a flag)
        OnlyCompileUpdatedScripts = 0/1     (same as -u flag)
        GenerateDependencyInfo = 0/1        Generate .dep files whether or not updating
        DisplayUpToDateScripts = 0/1        Display the "xxx/script.ecl is up-to-date" message, or not.
        AutoCompileByDefault = 0/1          If set, and you don't pass any script names or -r or -A, will perform an auto compile.
        UpdateOnlyOnAutoCompile = 0/1       If set, autocompile will only update modified scripts.
        DisplaySummary = 0/1                Displays overall totals after compilation, unless compilation aborted due to a compile error.
      These are the settings I like:
        GenerateListing		    1
        GenerateDebugInfo	    1
        GenerateDebugTextInfo	1
        DisplayWarnings         1
        CompileAspPages         1
        AutoCompileByDefault    1
        UpdateOnlyOnAutoCompile 1
        OnlyCompileUpdatedScripts   1
        DisplaySummary          1
        GenerateDependencyInfo  1
        DisplayUpToDateScripts  0
        This way, if I'm editing scripts, I just type 'ecompile' and it compiles everything that's
        changed.  If I want to compile a particular file, I pass its .src name on the command line.


06-13 Syzygy
    mob.backpack.container now returns a mobileref to the owner.
    bugfix: buyprice was sometimes being incorrectly read as 2147483647, after being
            gratuitously written as 4294967295.  This value is now detected and ignored.
    Resurrect() will return an error if the mobile's location would be blocked if the mob were alive (ie by a door)
    LOS to an object is no longer blocked by the parts of other objects that share the same space with it.
        For example, this means:
            If two chests sit at the same place, neither blocks LOS to the other.
            If one chest is at Z=1, and the other at Z=2, LOS to the first can be blocked by the second, if looking from above.
            If a ghost is standing in a closed doorway, you can still have LOS to it. (but note the change to Resurrect above)
    Fixed: When sending mana level, sometimes the "current value" would be sent in place of the "maximum value", making it look like the mob had 100% mana.
    ondelete scripts are now passed an offline mobileref.
    Minor overhaul for onInsert scripts:
        MoveItemToContainer:
             now calls onInsert script _after_ putting the item in the container.
        CreateItemInContainer, CreateItemInInventory, CreateItemInBackpack:
             now call the onInsert script _after_ putting the item in the container.
             when adding to an existing stack, passes the "amount added" as noted in the POL092 changelog.
               (it was passing the size of the existing stack)
         !!
           I have just noticed that when any of these adds to an existing stack, the canInsert
           script is called with these parameters: canInsert( mobile, container, existing_stack_already_within_container, MOVETYPE_PLAYER )
           This is no good.  More thought required.
        When purchasing from a vendor:
            onInsert called _after_ putting the item in the PC's backpack.


06-12 Syzygy
    escript changes:
        Added (yet another) syntax for declaring initialized arrays:
            var x := array { 4, 3, 2 };
            this is more consistent with struct { x, y, z } initializer syntax.
            array(8,3,2) looks too much like it's creating a multi-dimensional array, so I don't like it anymore.
        Added syntax for declaring initialized dictionaries:
            var x := dictionary { "abx" -> 72, "xyz" -> 32 }; // direct
            var key := 5, value := "x";
            var x := dictionary { key -> value };       // indirect
            var x := dictionary { "abc", "cyz" }; // values start as uninit
            var pfx := "X";
            var v := 7;
            var x := dictionary { pfx+"abx" -> 72, pfx+"xyz" -> 32+v }; // with expressions
        These are the preferred forms for declarations (see how they match?)
            var x := array;
            var x := dictionary;
            var x := array { 53, 76, 32 };
            var x := struct { x, y, z };
            var x := dictionary { "ABC" -> 62 };

        Expressions like these will now be flagged as errors by the compiler:
            var x := { 2, 6, };
            var x := array { 2, 6, };
            var x := array( 2, 4, };
            var x := struct { a, y, };
            var x := 4 array;

        bitwise operations are now optimizable:
            int & int
            int | int
            int ^ int
            ~ int

    ecompile changes:
        new ecompile option: -C <config file path>
        new ecompile option: -A
            "Auto compile", I guess - compiles scripts in your PolScriptRoot and all enabled packages under your PackageRoot directories.
              (like -r, but knows where to go, using ecompile.cfg)

        Fixed two memory leaks.  ecompile is now much more svelte when it runs, especially on directory trees.



06-11 Syzygy
    structs will again allow the obj[ keyname ] syntax, but only for strings.
      if you pass a number, your script will abort.  If you pass another kind of object,
      an error will be returned.  This is meant to help you quickly find cases where a script
      pretends that a struct is an array, which is not the case.
    fixed a compiler bug where the following would compile:
        var a, b, c;
        a := b { c, b };
    AppendConfigElem will either accept an array of arrays, as it does now,
      or an array of struct { name, value }


06-10 Syzygy
    linux: SIGUSR2 will now display a stack backtrace to console, and continue execution.
    linux: properly set socket nonblocking options after accept()
      (learned, first from intense googling, then ironically enough from 'man accept', that
       linux can't be bothered to adhere to BSD norms in the "BSD sockets" interface, and
       instead discards socket options on accept()'ed connections)
       Note: there's a hole in the aux client interface obj.transmit() function, where it
             can still block, but it shouldn't be a problem if you're just using it to feed
             a local web server.

06-10 Syzygy
    It is once again possible to use mobrefs / itemrefs etc as keys to dictionaries.
    structs are now totally different objects than dictionaries.  They can only contain named members,
     and the [] operator no longer functions on them.
     Also, struct names are now case-insensitive
     For structs, you should use operations like this:
       var a := struct { x, y, z };
       a.x := 5;
       var b := struct;
       b.+g := 6;
     For dictionaries, you should use operations like this:
       var a := dictionary;
       a[57] := 4;
       a["XY"] := "Z";
       a.erase( "XY" );


06-09 Syzygy
    removed 'SellPrice 4294967295' and 'BuyPrice 4294967295' spam from items.txt etc.
    revised signal handling for linux.

06-08 Syzygy
    Added dirty flag to all mobiles/items.  This should be set when anything on the object changes, and cleared on world save.
    Fixed a crash bug when a container previously send with SendOpenSpecialContainer was deleted.
    Fixed a crash bug on shutdown having to do with the thread registry.
    SaveWorldState() now returns a structure on success:
        struct { CleanObjects, DirtyObjects, ElapsedMilliseconds };
    internal change: The following will now return a true 'struct', rather than an array bastardized with element names:
        (If you access these with obj.elemname you will have no trouble; if you use obj[1] etc you will have to make changes)
        object methods/properties:
            mobile.reportables
            polcore().script_profiles
            polcore().iostats
            polcore().queued_iostats
        uo.em:
            TargetCoordinates
            SelectMenuItem
            GetPosition
            GetMapInfo
            GetStandingHeight
        npc.em:
            Position()
        events (all):
            speech events
            unicode speech events
            damaged events
            engage events
            disengage events
            item-given events
    dictionary object methods now explictly check that key objects are either an integer, a real, or a string.

06-07 Racalac
    Major Addition: You may now specify properties for an item during creation. Here are the mechanics:
        polsys.em: GetItemDescriptor(objtype or name) returns a struct of all the itemdesc.cfg properties
        for the specified objtype. You can use this to print the contents:
            var ret := GetItemDescriptor(objtype);
            foreach thing in ret
                print(_thing_iter + ": " + thing);
            endforeach
        There are a couple special members. "CProps" is a dictionary of string->object pairs (object could be any
          packable type). "StackingIgnoresCProps" is an array of strings. You may edit the values in this dict
          but not all are assigned per-item (meaning it will do nothing). The item create functions accept this
          dictionary in place of the objtype / objtypename parameter.
    For example, to create a new item that will automatically stack with an existing stack with non-standard
          color and cprops, it would look like:
                var ret := GetItemDescriptor(objtype);
                ret.Color := 0x10;
                ret.CProps.insert("blah","1"); //assuming the existing stack have this color and cprop
                ret.StackingIgnoresCProps.append("blingbling");
                var item := CreateItemInBackpack(who,ret,10);

06-07 Syzygy
    SystemFindObjectBySerial now returns proper multirefs for multis
    fixed a place that switched cout to hex formatting without switching it back

06-06 Syzygy
    Added automatic lockup detection: thread status will automatically be displayed after 30 seconds.
    Fixed a potential corruption error during queued data mode.

06-05 Racalac
    Changed: pol.cfg EncryptPasswords to RetainCleartextPasswords (default 1). NOTE this is logically opposite
        to the old EncryptPasswords option. We now ALWAYS MD5 hash passwords and ALWAYS store them. Make this
        option 1 if you want to also retain normal passwords, 0 if you only want the hashed passwords stored.
    Added: PasswordOnlyHash is written to accounts.txt. If the cleartext password is missing, it will be
        empty until the account successfully logs in.
    Added: account.PasswordHash (password only hashed), and account.UsernamePasswordHash (username + password
        hashed). account here is an account script object, i.e. character.acct.
    Added: accounts.txt reading info, X elements in Y ms.

06-05 Syzygy
    The .NET build now uses STLport 4.5.3 instead of MS's crappy implementation.
      It seems to be a bit faster now.
      Some comparison sysload numbers, using Xandros' huge shard data:
        .NET old: 100(33018), 100(16326), 100(62705), 100(64700), 100(66679), 100(67030), 100(67030), 93(53725), 5(0), idle
        VC6 05-24: 98(33533), 100(18338), 25(1519), 0(0), idle
        .NET now: 35(19292), 6(1), idle
    win32: we now retrieve CPU time used from the OS.  This is reported as cputime, when sysload
      is reported.  cputime is read once a minute, and the value displayed is the number of microseconds used.
      So, if cpuload is 10,000,000 then 10 seconds of CPU time were used.
      It doesn't look possible to get this on linux without considerable teeth-pulling.
    pol.cfg: ListenPort is now optional.  If you don't set it, or set it to zero, it won't be used.
    Added to polsys.em: SetSysTrayPopupText( text )

06-04 Syzygy
    performance improvements:
        ListMobilesNearLocation
        ListMobilesNearLocationEx
        ListGhostsNearLocation
        Speech (sending events to NPCs)

06-03 Syzygy
    escript: fixed a bug where the compiler could emit corrupt code if an IF statement was optimized away
    equipment.quality is now stored as a double-precision float, so equality comparisons should work better now.
    Added itemdesc.cfg flags.  These apply to everything, even your own backpack.
        CanUseWhileFrozen = 0/1
        CanUseWhileParalyzed = 0/1
    Removed internal command: .t_setusescript
    Renamed internal ".props" command to ".t_props".  This script should replace it:
        use uo;

        program dot_props( who )
            var what := Target( who );
            if (what)
                var names := what.propnames();
                if (names.size() != 0)
                    foreach propname in names
                        SendSysMessage( who, propname + ": " + what.getprop( propname ) );
                    endforeach
                else
                    SendSysMessage( who, "No properties." );
                endif
            endif

        endprogram

06-02 Syzygy
    Modified i/o handling to better deal with unexpected signals (EINTR - socket error 4)
    escript: equality comparisons for floats will allow for small differences (0.00000001)
    win32 .NET build: changed some compiler settings to improve performance

05-31 Syzygy
    Backed out the 05/26 SetRegionWeatherLevel change which was causing a stack overflow
      (which then caused pol to exit without any message)
    Corrected music, justice, and weather zone switch handling.  They were broken
      (would do no processing if you moved either into or out of a location entirely outside the regions)
      Note: set the weather type to 255 to turn weather off.

05-29 Syzygy
    Target() will return a proper multiref if a multi is targetted (usable with DestroyMulti etc)
      This does not apply to floors, etc - only ship masts and so forth.
    Any function taking an objtype as a parameter will return an error if the objtype is not defined.
      Note that all objtypes in the 0x0000-0x3fff range are implicitly defined.
      (previous behavior was to throw an exception reporting that the objtype defined no graphic)

05-28 Syzygy
    New console command [threadstatus] will display thread status and checkpoints
    Thread status is now available on win32 as well as linux.

05-26 Racalac
    Fixed: SetRegionWeatherLevel should work now!
    Changed: Removed client 2.0.* weather packet disable. Let us know if there are still weather problems with
        2.0.* clients.

05-24 Syzygy
    Fixed: a crash when an NPC killed itself in its script
    Masked: crashes at shutdown due to leftover objects.  The objects will be leaked rather than attempt destruction.
      (if we can find out _why_ we have leftovers, we won't get these crashes at all - this crash in particular is a symptom)

05-23 Syzygy
    Fixed: NPC weapons will use the hitscript specified, not the wrestling hitscript
    Fixed: Display issue (1.26.4 clients only) when dragging an item to a mob that is too far away.
    Linux build: Added segfault handler - will dump a stack backtrace to stderr before aborting.
      please forward these (they'll just be a set of numbers) to PCT, if you're running the latest linux build.
    escript: added more convenient syntax for declaring structures:
      var t := struct { a, b, c };                                  // basic
      var t := struct { a := 4, b := "hey", m := foo(bar(4)) };     // initialized
      var t := struct { a := 4, b := struct { g,h,i }, c };         // with nested structures

05-22 Syzygy
    NPCs will be destroyed immediately when they die, rather than a little later.
    It should now be impossible to "kill" an NPC twice, ending up with multiple corpses.
       There may be cases where an NPC will be only partially killed.  We don't know why yet,
       but there will now be log information to help us find out why.  If you find an NPC that can't be
       killed, please check your logs for output containing: "Abnormal end after checkpoint" and post to PCT.
    NPCs will use their intrinsic weapon templates again.  They were using human wrestling.
    Log additions: character creation, deletion

05-20 Racalac
    Fixed: boat planks were not cleaned up correctly
    For debugging: leftovers.txt is written to the pol directory on shutdown, contains serial and name for
        objects that survived cleanup somehow.

05-17 Syzygy
    pol.log will now roll over every day.  Old logfiles will have names of the form: pol-YYYY-MM-DD.log

05-17 Racalac
    Added new pol.cfg option: EncryptPasswords=0/1 (default 0), if =1, the server will encrypt all passwords
        and all plaintext passwords will be lost! YOU CANNOT GO BACK AT THIS POINT WITHOUT RESETTING ALL THE
        PASSWORDS ON THE SERVER. So be careful about setting this option to 1! Don't make me have to repeat
        myself! I mean it!

05-17 Syzygy
    Fixed a crash caused when a script accessed container.container on something in a mob's backpack.

05-16 Syzygy
    item.setcolor( color ) will return an error if the specified color is > 0xFFF
      (it will still mask off the high bits and use what's left, though)
    Alt-Tab should no longer show a window called "Dialog" while POL is running.
    Fixed an assertion failure on load if a mobile or container failed to create completely.

05-15 Racalac
    Added: MD5 hashing of passwords. accounts.txt "Password" property is automatically converted, and saved
        back to "PasswordHash". No passwords are stored in plaintext on disk or in memory anymore, so full
        memory dumps should be safe from nosy people. MD5 strings cannot be reversed back to the original
        plaintext password.

05-15 Syzygy
    HitScript will be read from itemdesc.cfg entries for weapons, and used.
    OnHitScript will be read from itemdesc.cfg entries for armor, and used.
    AttackMinRange and AttackMaxRange will be read from npcdesc.cfg
    uoclient.cfg can now specify multiple ports to listen for clients on, and the encryption to use with each.
      Here is an example:
        Listener
        {
            Port 7011
            Encryption ignition
        }
        Listener
        {
            Port 7012
            Encryption 1.26.4
        }
      Note that the Port specified overrides the value from servers.cfg.


05-13 Syzygy
    Changing an item's graphic will also set its height accordingly.
    There's now a little system tray icon that will let you stop POL.  Maybe later it'll let
      you look at the console output or logs.  We're accepting fan art for the icon :-)
      You'll need to uninstall and reinstall the service (pol -u, then pol -i) for the tray icon
      to be able to appear.
    start.log will now be written properly when POL is run as a service.

05-11 Racalac
    Changed: With the CreateItemInContainer/Backpack functions, a new stackable item will not be added to
        an existing stack unless the existing item stack has color equal to its itemdesc.cfg color property
        AND has equal CProps as its itemdesc.cfg entry (not counting locally and globally ignored cprops)

05-11 Syzygy
    process.kill() will immediately kill sleeping scripts, as well as scripts being debugged.
      (previously, script process would not die until the script woke up, if it was sleeping.)
    Mobiles will now break off an attack when an opponent changes from non-Innocent to Innocent.
      (previously, this happened for PCs, but not for NPCs, particularly pets)

05-10 Racalac
    Fixed another 4.0.0e client hang issue.

05-09 Syzygy
    Undid my brain-dead repsys timer change which was causing lockups.

05-08 Syzygy
    POL can now run as a service:
        1. Put the executable in your POL directory (as always...)
        2. Run 'pol -i' to install.  'pol -u' will uninstall if needed.
        3. Recommended: Use the service manager to change the login from 'LocalSystem' to some account.
        4. Start the service

05-07 Racalac
    Added new pol.cfg option: "MiniDumpType", determines the type of crash dump created. "small" is the
        normal minidump (default), "large" is the full memory space for POL (creates large files, but much
        more useful to the developers). Case-sensative.

05-07 Syzygy
    Corrected possible crash bug in repsys handling
    Corrected repsys timeout logic (would sometimes timeout early, would sometimes never time out)
    Corrected possible crash bug related to client reconnections and interactive scripts

04-25 Racalac
    Fixed: CreateItemCopyAtLocation now copies cprops correctly.
    Fixed: Dead NPC taking damage somehow is now killed.
    Added: servspecopt.cfg property: UOFeatureEnable, used in the last dword of the 0xA9 login packet.
           Probably has no effect (and possibly ill effects) until client messages like 0xBF 0x13 are
           handled.

04-18 Racalac
    Fixed: Generic Gump textentry should work again for ANSI characters.
    Added: Linux console command support

04-13 Racalac
    Fixed: Input is rejected for SendTextEntryGump if the string contains a control character (newline, etc)
    Fixed: Generic Gump 'textentry' will strip out any control characters from user input.

04-10 Racalac
    Fixed: Moving a character during logout no longer throws an exception (introduced 3/27)

04-09 Racalac
    Fixed: MoveBoatXY did mot move items on deck properly.

04-06 Racalac
    Change: Call Attribute Intrinsic Modification exported functions before Vital Maximum and Regen.
    Note: clients 4.0.0e and newer do not like the uoclient.cfg setting EnableControlFlowPackets enabled,
        and causes login to fail. No way around this it seems.

03-27 Racalac
    Added: boat.em: MoveBoatXY(boatref,x,y)
    Fixed: MoveCharacterToLocation with an offline character could cause an exception.
    Fixed: who.multi was not returning a boat ref, when appropriate.

03-25 Racalac
    Fixed: 4.0.0e login issue (login tested with 4.0.0e (uorice), 4.0.0c (uorice), 3.0.8q (uorice),
           2.0.0b, and 1.26.4b. (2.0.0g still doesn't work, oh well..)

03-24 Racalac
    Fixed: Login (A9) packet was the wrong length (might fix 4.0.0e login issue)
    Fixed: Maps didn't work with set/get_member()
    Fixed: Multi.isa wasn't working

03-20 Myrathi
    Fixed: ECOMPILE will no longer compile files with .src/.hsr/.asp/.inc
        *anywhere* in the filename. These extensions must now be at the *end*
        of the filenames for them to be compiled! (fixes 'file.src.bak' bug)
    Found: Undocumented ECOMPILE option: -ri [dir]
        Same as '-r' except it recursively compiles .INC files! Useful for
        testing that your include files compile!
    Fixed: ECOMPILE options bug: -r [dir] / -ri [dir]
        These options will no longer 'eat up' options that follow them on the
        command line ("-r -u" would incorrectly 'eat' the "-u" option!). Such
        an option would be equivalent to "-r . -u" (recurse current folder).

    NOTE: If you need to compile files AS WELL AS recursing the current folder
          you MUST add the '.' (no quotes) so it doesn't treat the files as a
          folder (WRONG one would try to recurse the FOLDER 'myscript.src'!)

          This is WRONG:  ECOMPILE.EXE -u -r myscript.src
          This is RIGHT:  ECOMPILE.EXE -u -r . myscript.src   <-- note the '.'

03-19 Racalac
    Changed the order of calling the Vital Maximum and Regenerate functions via RecalcVitals().
        Order is: Maximum function, Regenerate function.
    Important CFG change: Set Weapon 0xF020 to SaveOnExit 0. This will force the intrinsic NPC
        wrestling weapon to a non-saved serial number.
    Fixed 03-18 npctemplate oversight.

03-19 Myrathi
    Added: extra 'movetype' parameter to Can/OnInsert and Can/OnRemove scripts.
        The values returned in this parameter are as follows (new constants in UO.EM)
        - MOVETYPE_PLAYER     : physically moved (dragged) by a player
        - MOVETYPE_COREMOVE   : moved by the core (eg, MoveItemToContainer().)
        And in the *Insert scripts only...
        - MOVETYPE_CORECREATE : created by core (eg, CreateItemInBackpack().)

    Example:
        use uo;
        program caninsertscript(character, container, item, movetype)
            if ( movetype != MOVETYPE_PLAYER )
                // allow any movement/creation by core functions
                return 1;
            endif
            // insertion by a player must be validated
            // ...extra code here...
        endprogram

03-18 Racalac
    Fixed: "npctemplate" was not initialized on start-up when the exported
        vital functions were called.
    Added: pol.cfg options:
        ReportRunToCompletionScripts=0/1 (default=1)
        ReportCriticalScripts=0/1 (default=1)
        - Set to 0 to remove the "Script X running..." (RTC) and
          "Critical Script X has run for X instructions..." console messages.

03-16 Myrathi
    Fixed RequestInputUC() input-validation issue (control-characters are now
        correctly identified).
        Returns:
        - 0 (zero) if input is cancelled.
        - a struct: 'uc_text' => Unicode Array, 'lang' => 3-char language code
        - an error, when appropriate (see .errortext)

03-16 Racalac
    Added error message for thread exceptions, AUX service.
    Fixed annoying garbled "Listening for HTTP requests on port" message.
    Fixed up RequestInputUC().

03-16 Myrathi
    Added: UNICODE.EM function RequestInputUC(): works the same as UO.EM's
        RequestInput() function except it takes 'unicode array' and 'language
        code' parameters in place of the 'prompt' parameter. The 'item'
        parameter is still simply a placeholder and a client cannot act upon
        one of these functions if the other has already been called (you'll
        get the "Another script has an active prompt" error).

03-15 Racalac
    Added uoclient.cfg property: MaxSkillID ("General" section,default 51 if not found). Use this depending on
        what client versions connect to your server. Newer clients can handle more skill IDs and older clients
        (which often crash being sent skillids above 48). You must have skills.cfg entires for each skillid up
        to MaxSkillID.

03-14 Racalac
    Added ClientEncryptionVersion "none" and "uorice" to help newbies. These are identical to "ignition".
    Linux Build:
        This is Rac's first linux build, and hopefully it's improved. Previously, linux builds were made
        using STLport and NO compiler optimizations. This build was made with libstdc++ 5.0.2, glibc 2.3.2
        (with linuxthreads 2.3.2), gcc 3.2.2, and kernel 2.4.20. Consider using the same version libs as these.
        Also, optimizations are turned on in this build (they were turned off because of inexplicable segfaults.
        Hopefully, new build lib versions help this).

03-13 Racalac
    Fixed linux ".unload" crash.
    Fixed exception with Character serial 0x1.

03-12 Myrathi
    Fixed: RadToDeg() and DegToRad() in MATH.EM. They now work the right way around. :)

03-10 Racalac
    Save character and item serial counter to pol.txt.
    Increased Maximum UO SkillID to 51 (skills.cfg requires an update).
    Fixed 03-08 bug: new multis not found with SFOBS.

03-08 Racalac
    Implimented Serial Recycling:
        When POL reaches the maximum serial for characters (0x3FFFFFFF) and items (0x7FFFFFFF), it will then
        search from the minimum serial (1 for characters, 0x40000000 for items) for an unused serial to give.
        Note, nothing is done about CProps which store serials referring to destroyed objects. Hopefully with
        this system of reusing the "oldest" unused serial will avoid most of these problems.
    Very Significant speed improvement for all SystemFindObjectBySerial calls (including internal ones)! Your
        start-up times (with CheckIntegrity enabled) should be vasty improved.
    Fixed build so minidumps should give more information.

02-18 Racalac
    Removed unecessary equip layer check (some items in client 4.0.0 were prevented from being equipped due to
        a client bug).

02-09 Racalac
    Added: new servspecopt.cfg options: DefaultContainerMaxItems (default 125) and DefaultContainerMaxWeight
        (default 250). These values will be used for containers that do not define "MaxItems" and "MaxWeight"
        in their itemdesc.cfg entries.
    Added: OS.EM function: is_critical(). Returns 1 if the calling script was set critical, else 0.
    Fixed: client version string was being limited to 10 characters.

02-09 Racalac
    Changed: CheckIntegrity=1 in pol.cfg now also checks storage areas and offline character for duplicate serial
        items (This extends start up times).

02-08 Syzygy
    Sort-of fix for shards with data files with very high serial numbers:
        if 0x4effffff <= serial <= 0x40000000, serial will be allocated as a normal serial
        if 0x7fffffff <= serial <= 0x4f000000, serial will be allocated as a "nonsaved" serial.
        The upper range for "saved" serials will not be raised at this time.

02-04 Racalac
    Changed: PushthroughHook array of obstructors now includes hidden mobiles.
    Changed: renaming a stackable item a specific name will now prepend the amount to the single-click description.
        i.e. rename 2 items 'sucky item', then stack will produce a desc of '2 sucky items'.
    Fixed: character.height was being assigned an incorrect value on start, causing LOS problems.

02-03 Racalac
    Fixed: offline boat travelers were not being processed correctly on startup, leaving them behind on the water.
    Added: POL now supports Minidumps on Windows. If you are running POL on Windows XP, you do not need to do
        anything to enable this. Before Windows XP, you need a new "dbghelp.dll" with version 5.1 or greater in your
        POL directory. I've uploaded a redistributable version on core-test, this will be available and/or included
    in the final 095 core package.

        What Minidumps do: When(/if!) POL crashes, you will no longer see the cryptic dump of registers and call
        stack. Instead, POL will log and print on console that it has created a ".dmp" file in your POL directory.
        This file is much much more useful to us for debugging a crash than the simple text dump as before. This
        File should be sent to the developers along with the usual "what I did to cause this crash" information.

        If you run Linux, everything should work as before.
    Added: Newly created NPCs send and receive SYSEVENT_ENTERED_AREA events with the NPCs around them.
    Fixed by Syz: While on a moving boat, mobile's names no longer flash, and it's much easier to talk on a moving
        boat. Only annoyance is now mobiles show the walk animation while the boat moves (but don't move anywhere)

02-02 Syzygy
    Added minidump support

02-01 Syzygy
    CoreRequired in pkg.cfg can now be a full version string (ie "POL095-2003-02-01" )
    (pkg)/uoclient.cfg can now contain a 'Protocol' element:
        Protocol
        {
            #
            # EnableFlowControlPackets: use the 0x33 (0x00 / 0x01) pause/restart packets.
            # Though OSI seems to no longer send these packets, they seem to help with smoothness,
            # particularly with boat movement.
            EnableFlowControlPackets    1
        }

01-30 Racalac
    Fixed: "TrueObjtype" was not read correctly on startup.
    Fixed: coordinate bounds checking for CreateNPCFromTemplate and CreateMultiAtLocation (still be careful with
        this latter one, if some part of the multi overlaps beyond the map edge, it will cause problems)
    Fixed: unequiptest and equiptest are now automatically reloaded after an .unload or .unloadall

01-28 Racalac
    Fixed a crash with destroying items in core-called run-to-completion scripts (like OnInsert) introduced 01-26

01-26 Syzygy
    foreach will no longer iterate over error objects

01-26 Racalac
    Added better stacking control over CProps: You can now specify specific CProp names that will be ignored when
        items are being stacked. There are two ways to do this:
        -Template level: new Itemdesc.cfg property: StackingIgnoresCProps, a space-delimited list of case-sensative
         cprop names to ignore only for stacking items of this objtype. i.e.:
             StackingIgnoresCProps    propname1 propname2 etc.
        -Global level: A new packagable config file stacking.cfg (can be in /config and/or any package) specifies
         lists of CProp names that are ignored for all stacking items (duplicate names ignored). Structure:
             Stacking
             {
                 IgnoreCprops  propname1 propname2 etc.
             }
    Fixed: movecost.cfg entries were being interpolated in the wrong order.
    Changed: MoveItemToLocation now calls UnEquipTest and UnEquip Scripts if the item was equipped on a char.
    Changed: OnRemove and OnInsert are now Run-To-Completion (i.e. CRITICAL) scripts.

01-24 Syzygy
    The compiler will now put correct function names in listfiles.

01-22 Syzygy
    Added ReadMillisecondClock() to polsys.em

01-22 Racalac
    Fixed moved some npc creation code around so now npc.npctemplate is initialized by the time the vital maximum
        and regen rate exported functions are called. (so grabbing the HITS property from the npcdesc element is
        successful)

01-20 Racalac
    Fixed resetting stealthsteps (broken 01-09)
    Added control character stripping from sysbook text entry.

01-18 Racalac
    Removed 01-06 LOS combat initiation check.
    Fixed weirdness with merchant sell window and the .buy/sellprice changes.
    Removed hardcoded death sounds for human characters.

01-15 Racalac
    Fixed: Errors on startup from corrupt items shouldn't crash the server. Also, file name & line numbers are
        printed for ease of debugging.
    Fixed: Buying stackable items from NPC merchants now call canInsert and onInsert for player's backpack.
    Fixed: Setting .buyprice and .sellprice to 0 means the item's price is 0, not itemdesc default. (setting the
        members to -1 will force them to default to itemdesc)
    Fixed: Entered/Left regions weren't firing since 12-23.

01-12 Syzygy
    Fixed an assertion failure when assigning to a non-integer element of an array
      test script: "var a := {}; var b; a[b] := 3;"

01-12 Racalac
    Fixed: Polsys::ReloadConfiguration() now really reloads npcdesc!
    Fixed: item.multi should now return the correct MultiRef (items on tables and other 'blocked' locations
        were not being processed correctly)
    Removed hack fix for bug noted in 01-08 changes. Caused problem with boats.

01-09 Racalac
    Fixed: polcore().clear_script_profile_counters() shouldn't complain if you pass 0 parameters (the correct amount)
    Fixed: PC Unhide generating ENTERED_AREA events shouldn't fire strange combat update functions anymore.

01-08 Racalac
    Hack fix for gold "dropping through" floors of multis. This would affect ant 0 height graphic.
        **Please let me know if there are any weird effects with multis, LOS around/in/through multis,
        **walking on multies, dropping items on multis, and so on!

01-07 Syzygy
    NPC Templates in packages will once again have ":packagename:" prepended to their template name
      (npc.npctemplate, as well as what's written to npcs.txt)

01-06 Racalac
    Fixed: You now need line-of-sight to initiate combat.

01-05 Racalac
    Fixed: run_speed and use_adjustments weren't written to the save file.

01-04 Racalac
    Added: obj.set_member(membername, value) and obj.get_member(membername) to replace the removed "." method.
        This sets/gets a built-in member on the object which is named "membername". Returns an error if the
        member was not found on that object (i.e. "dmg_mod" on a backpack).

01-03 Myrathi
    Implimented new encryption routines as the basis for making future encryption updates
    a LOT easier (and is the start of internal support for encryptions 2.0.3 upwards!)
    NO NEW ENCRYPTIONS ARE WORKING AT THIS TIME.

01-02 Racalac
    Added character and account name to "No handler for skill X" message.

(sometime in the past) Syzygy
    Deleting an element from the datastore will mark the associated file as dirty.

01-01 Syzygy
    Windows 95 is no longer supported.  Minimum (MS) OS required: Win98/NT4
    Added to polsys.em: ReloadConfiguration().  Loads npcdesc.cfg and pol.cfg
    Linux: HUP signal will cause ReloadConfiguration to be called.

01-01 Racalac
    Fixed: for real: EnumerateItemsInContainer crash (with "worn items container" who.backpack.container)

03-01-01 Myrathi
    Added: DefaultDecayTime=# in SERVSPECOPT(.LOCAL).CFG (default = 10) - unit: minutes
        NOTE: Only newly created or "refreshed" items will use any new setting! Existing
              items and items which remain "untouched" will retain the old value.
    Fixed: Picking up an item, failing to place it somewhere else and having the
        action "undone" (by the core) will no longer reset the decay timer if the
        "time until decay" is greater than the default interval.
    Fixed: CreateItemCopyAtLocation() now copies itemref.graphic to cloned item.

12-29 Syzygy
    accounts.txt will no longer be reloaded after a new version is written by pol itself
    Failure to bind the listening socket will now cause startup to fail on windows.
    New ecompile.cfg options:
        GenerateListing [0,1]
        GenerateDebugInfo [0,1]
        GenerateDebugTextInfo [0,1]
    Fix for ecompile under win32: use GetModuleFileName instead of argv[0] to determine
      path to ecompile.cfg

12-29 Myrathi
    Fixed: Shutdown no longer crashes when built with .NET (bonus points go to Syz!)
    Fixed: Deprecation warnings now give filename of the operator/token as well as line number.

12-28 Racalac
    Added: IP & Account logging information for unexpected and out-of-sequence messages.

12-28 Syzygy
    Fixed a crash bug on exit in the VS.NET build (having to do with Token destruction)
       (on the VS.NET build, some globals are destroyed in the opposite order.  We now manually clear
        one particular container)

12-27 Racalac
    ReFixed: Players cannot rename a mobile with an invalid string.
    MaybeFixed: Crash in EnumerateItemsInContainer. A long-shot fix, please test who ever was
        experiencing this bug!

12-25 Myrathi
    Added: CFGFILE.EM function ListConfigElemProps(element): returns an array of the
        element's property-names (as unique strings).

12-24 Racalac
    Fixed: Now updates the client correctly when another mobile's color changed.

12-24 Myrathi
    Fixed: unicode support problems under Linux (think I got 'em all)
    Fixed: various bugs in various unicode routines. :P
    Fixed: unicode spell invocation using: ~IN<spellid>
    Added: "INVOKE: <info>" console spam now restricted to [pol.cfg]LogLevel=6 or higher.

12-23 Myrathi
    Fixed: Stat messages should now normalize properly to 1000 max-hp (0x11 packet)

12-23 Racalac
    Fixed: Exception if no regions were defined.
    Fixed: CreateMultiAtLocation now returns a MultiRef, not an ItemRef ;)

12-22 Racalac
    Fixed: When combining two stacks of the same objtype (either dragging one stack onto the other, or
        onto the container containing the other stack), the CProp lists of each item must match EXACTLY
        in order to be stacked. So, if Stack A has cprop myprop i5 and Stack B has cprop myprop i6, they
        will not be stackable by dragging. Similarly, if either of the stacks are missing a cprop the
        other possesses, the items will not stack.
        **Needs testing please**

12-21 Racalac
    Fixed: when a player buys an item from a merchant NPC, canInsert and OnInsert scripts are called
        for his/her backpack.
    CRITICAL: You MUST add this to an itemdesc.cfg entry or you server will fail to start!
        Container 0xFF02
        {
            Name        WornItemsContainer
            graphic     0x1E5E
            Gump        0x003C
            MinX        0
            MaxX        66
            MinY        0
            MaxY        33
            Weight      0
            MaxItems    65535
            Maxweight   65535
        }
        Note the objtype is in the core-reserved range of 0xF000 - 0xFFFF. I hope no one has any
            items defined in that range.. :)
        Note this change just fixed a bug with backpack weight limits, and won't help "total"
            character weight (including equipped items).
    Fixed: using an item's x,y,z members in its own create script would throw an exception.
    Added: UO.EM function CreateItemCopyAtLocation(x, y, z, itemref): makes a clone of the item
        referenced with "itemref" at location x,y,z. Copies member variables and CProps. Does
        not work with Multi objects. Does not copy a container's contents.
        **Needs testing please**
    Fixed: Items split from a stack retain the CProps from the original stack.
    Fixed: character.setwarmode() now works with NPC characters (no longer throws an exception)
    Fixed: If the items sold TO an NPC merchant cost more than 60k gold, the core now creates seperate
        stacks of 60k gold instead of one greater than 60k (invalid for the client). So if you have any
        script code that handles this, you should probably remove it (or face creating twice the amount
        of gold you should!).
    Added: Unhiding AND Unconcealing generates a SYSEVENT_ENTEREDAREA event for nearby NPCs.

12-20 Racalac
    Fixed: A Mobile's lifebar will no longer disappear when you (for example), poison it.
    Fixed: An exploit that allowed players to drag items onto far away mobiles.

12-19 Racalac
    Fixed: a bug with system books where bad characters were written to the save files, causing errors
        like "Item has no SERIAL property".
    Fixed: If zero items were sold to an NPC, a gold coin was created in the player's pack with
        amount == 0.

12-17 Racalac
    Fixed: a nasty bug where items would not decay in certain areas (specifically, in a zone with
        a multi house). Also fixes the related "items don't decay near multis" bug.
    Fixed: If an item is defined as no decay on multis (the default), its destroy script was
        mistakenly called when the item was not decayed. This is fixed.

12-15 Syzygy
    Correct crash bug in CanRemove and OnRemove script execution when there's no owning mobile
    The originally defining package will be listed when multiple packages define an objtype
    "attack timer" spam outputs only when DebugLevel >= 20
    item.invisible will initialize based on itemdesc.cfg settings

12-10 Myrathi
    Added array.exists( index ) - returns 1 if index <= array.size(), otherwise 0.
    Added: sturdier parameter checking for object member-functions (no AV when too few params)
    Fixed: corrected the size of the 0xBB 'messenger' packet (no longer "eats up" extra bytes)
    Fixed: rename packet validation. Invalid content is truncated and a log message shown
        for admin use (including an output dump of the invalid data).
        Valid characters are spaces and upper- or lower-case letters (A-Z)
        e.g.
            Client #1 (account test) attempted an invalid rename (packet 0x75):
            0000: 48 61 63 6b 54 65 73 74  0d 0a 09 43 6f 6c 6f 72   HackTest ...Color
            0010: 20 30 78 34 38 30 0d 0a                             0x480.. ........

    Fixed: core now sends correct number-of-chars to client at login (this should fix the UOTD
        "can't create character" client issues)
    Fixed: array member-functions (.erase(), .size(), etc) now enforce parameter-passing:
        if you pass the wrong number of parameters (too few -or- too many) they'll return an
        appropriate error (until now, passing too few caused an Access Violation! Argh!!!)
    Fixed: arrays will no longer "resize" when you attempt to *retrieve* a value from an index
        that doesn't exist. Setting a value in a non-existant index still resizes, as always.
        Test array.size() or check array.exists(index) as appropriate.
    - Example:
          var arr := {1,2};          // create array with arr[1] and arr[2]
          arr[4] := "test";          // auto-enlarges to 4 indices (arr[3] is uninitialized)
          var foo := arr[23];        // arr.size() is still 4 and it returns:
                                     //    error{ errortext = "Array index out of bounds" }
          var bar := arr.exists(15); // bar holds 0 since arr[15] doesn't exist.
          var zim := arr.exists(3);  // zim holds 1. arr[3] exists, even though it's uninit!

    Removed: account.SetAcctName() member-function (deprecated since 089!)
        - use instead: account.SetName(name)

12-09 Myrathi
    Added new uo.em function: SendQuestArrow(to_whom, x := -1, y := -1)
    - 'to_whom' is the character the arrow shows to.
    - Passing 'x' and 'y' within map bounds will set the Quest Arrow to point at that location.
    - Passing -1 as 'x' and 'y' (ie. by just called SendQuestArrow(to_whom)) will remove it.

12-09 Myrathi
    Fixed: All UNICODE.EM commands now take arrays with integers the "right way round" (sorry!)
        Integers must now be "Big Endian" (0x1234) and not "Little Endian" (0x3412).
    Fixed: Text-commands typed by a unicode-enabled client are now "recognised" properly.

    Added: Text-command scripts now receive 2 extra parameters when activated by
        Unicode-enabled clients.
    - Program blocks should now look like this, to take advantage of them:

            program textcmd_mycmd( who, text, uc_text, langcode )

    - 'uc_text' is a "Unicode array" of 2-byte "Big Endian" integers (see above) and
                can be an empty array (uc_text.size() == 0).
    - 'langcode' is a 3-character, uppercase language code.
    - 'uc_text' will be an 'error' type if the Unicode input is "bad".
    - 'uc_text' and 'langcode' will be uninitialized if no Unicode text is available
                (ie, when a non-Unicode client types the command)

    -Note- Text-commands should still be in an "English readable" character set!!
           There is no guarantee that foreign character sets in script-names will work,
           never mind Unicode character-sets, as the 'filename' is still matched against
           the ASCII equivalent!

    Added: NPCs now receive 2 *extra* event-parameters when they "hear" Unicode speech:
    - 'uc_text' is a "Unicode array" of 2-byte "Big Endian" integers (as above)
    - 'langcode' is a 3-character, uppercase language code.
    - these 2 parameters do not exist when speech is received from a non-Unicode client.
    - Example:

        var ev := os::wait_for_event(120);
        if ( ev )
          case ( ev.type )
            SYSEVENT_SPEECH:
                PrintTextAbovePrivate(Self(), "You said...", ev.source);
                if ( ev.uc_text )
                    PrintTextAbovePrivateUC(Self(), ev.uc_text, ev.langcode, ev.source);
                    PrintTextAbovePrivate(Self(), "...in Unicode", ev.source);
                else
                    PrintTextAbovePrivate(Self(), ev.text, ev.source);
                    PrintTextAbovePrivate(Self(), "...in ASCII", ev.source);
                endif
          endcase
        endif

12-07 Syzygy
    Fixed: compiler bug w/ switch statement containing variable declarations
    Fixed: compiler bug allowing this  to compile:
                Broadcast( "ff";
    Fixed: itemdesc.cfg setting 'Invisible' not being used on item creation

12-05 Racalac
    Fixed a crash bug with cheaters sending an invalid packet.

12-04 Racalac
    Added Character Method: setwarmode( 0/1 ); Sets the internal warmode flag and sends the
        update to the player. Returns the new warmode value.
    Added: MoveItemToContainer and MoveItemToLocation both call the item's parent container's
        canRemove and onRemove scripts.
    Fixed: Text command scripts now have their controller properly set. (character reference in
        canInsert scripts where being passed as uninitialzed when the script was started via a
        textcommand)

12-02 Racalac
    Fixed: Characters with the "freemove" privilages can now move with 0 stamina, frozen,
        or paralyzed.
    Added: "You are too fatigued to move" message when trying to move with 0 stamina, or
        not enough stamina as defined in movecost.cfg. (Only if MovementUsesStamina=1 is
        enabled in servspecopt.cfg)
    Changed: MaximumClients in pol.cfg will be checked only after a character is selected to
        play. Clients connected are only counted if they have attached characters (so a client
        waiting to log in is not counted, and neither is a client that recently logged out).
    Added: MaximumClientsBypassCmdLevel (default 1). This integer value (from 0 (player
        cmdlevel) to 5 ("test") defines the minimum character command level to bypass the
        maximum clients check. So if the option =1, counselors and above staff can log in if
        the MaximumClients value is reached, but additional player cmdlevel characters cannot.

12-01 Racalac
    Improvements to pol.cfg MaximumClients: cmd_level>0 is checked, and clients without
        characters attached are not counted against the maximum.

12-01 Myrathi
    Fixed: Unicode ghost speech (no longer shows in chinese)
    Fixed: Various buffer overflow exploits in various uo.em functions (eg PrintTextAbove())

    New EModule: UNICODE.EM containing 2 new constants and 4 new functions.

        _DEFAULT_UCFONT, _DEFAULT_UCCOLOR
        BroadcastUC(), PrintTextAboveUC(), PrintTextAbovePrivateUC(), SendSysMessageUC()

    - These functions act identically to their UO.EM predecessors except for the parameters.
    - ** please note the "UC" function suffixes **
    - Unicode "strings" are actually EScript Arrays of 2-byte integers, where each integer
      is a unicode wide-character. (example uctest.src will be uploaded to CoreTest group)
      These "integer codes" are always clipped (internally) to 2 bytes (value & 0xFFFF) and
      a '0x0000' value will stop the end the string, regardless of the size of the array.
    - Passing a non-array variable or an array with a non-integer value in it, as the
      'uc_text' parameter, will throw an error. They MUST all be integers.
    - The 'uc_text' array cannot exceed the current 'maximum speech length' of 200.
    - LangCode's are 3-character identifiers for the language it's in: ENG, RUS, KOR, etc.
      Passing a langcode string that's not 3 characters will throw an error.

11-30 Myrathi
    ECompile now displays "deprecation" warnings for certain operators and tokens and
        although your scripts will still compile, these are now "last warnings":
        - '=' is deprecated; use '=='
        - 'local', 'global' and 'dim' are deprecated; use 'var'
        - 'begin' and 'end' are deprecated.

        ** Deprecated expressions will be removed from 096 **
        **     so make sure you update your scripts!!!     **

11-28 Racalac
    Improved: canInsert script will be called when a stack of item is placed into the
        backpack through the paperdoll icon
    Fixed: .hp, .maxhp_mod, for weapon and armor items should be writable again.
    Fixed: .buyprice and .sellprice were returning 0 if you didn't write to them first.
        Now if they are not written to first, they will return the itemdesc value for
        VendorBuysFor and VendorSellsFor.

11-27 Racalac
    Added for Secure Trade Window: if a trade is cancelled, canInsert and onInsert scripts
    will be called for the player's backpack. If the items cannot be inserted, they will fall
    to the player's feet.

11-25 Racalac
    Fixed a bug with character.concealed being misread on server start as a boolean (0/1), not
        an integer(0-255)
    Fixed a bug in SystemFindObjectBySerial where items in the secure trade container were not
        being found.
    Fixed a crash introduced in the 11-21 test core concerning core-destroyed stacks of items.
    Fixed a bug with the conceal system where if a character's concealed level was reduced to
        a value still greater than 0, other characters of the same new concealed level did not
        see the character.

11-24 Racalac
    Added new itemdesc.cfg property: UseRequiresLOS (defaults to 1 if not defined). If true,
        Line-of-sight is needed to double-click the item. If false, a player can use the item
        without LOS.
        * Note DoubleClickRange is still checked.
    Added new itemdesc.cfg property: GhostsCanUse (defaults to 0 if not defined). If true, dead
        (ghost) characters may double-click this item.
    Fixed a bug in SystemFindObjectBySerial where an item held on a character's cursor was not
        found.
    Added a new os.em function: set_event_queue_size(newsize) : Changes the maximum number of
        events the current script will keep in the queue (additional events will be discarded).
        If not called, the default size is 20 events. The function returns the old queue size.

11-21 Syzygy
    active trades will be cancelled on death
    Fixed a problem with listening points that would cause big problems after
        listener destruction (house doors, tillermen, wink wink, nudge nudge)
    Containers will default to limits: 150 items, 250 stones

11-20 Racalac
    Added a new object method: script_process.clear_event_queue(). (script_process comes from
    NPC.process or uo.em's getprocess(pid))

11-19 Racalac
    You will no longer be able to initiate a secure trade with a ghost (if either party is dead).

11-17 Racalac
    These Item creation/movement/deletion functions now properly will update character's weight on
        the status gump: ConsumeSubstance, DestroyItem, CreateItemInContainer, CreateItemInBackpack,
        MoveItemToContainer, MoveItemToLocation, SubtractAmount.

    CreateItemInContainer and -Backpack will call the container's canInsert and onInsert scripts.
        POL will attempt to find a character that owns this container. If one is not found (i.e.
        container is on the ground, the CharacterRef passed to the passed to the canInsert and
        onInsert scripts will be an uninitialized object (so, check to make sure it's valid before
        using it).

    Adding to a stack of items (manually and by a CreateItem script function) in a container will
        call the container's canInsert and onInsert scripts. Note if a script initiates this action
        (and the script has no character controller), the CharacterRef passed to the canInsert and
        onInsert scripts will be an uninitialized object (so, check to make sure it's valid before
        using it).

    The core will no longer play sounds effects for items being inserted into containers (thus, they
        aren't heard by everyone.). You can get the desired effects using the container's onInsert
        script. For example, to get the different gold drop sounds in addition to the default one,
        you might have in your container's onInsert:

        if(item.objtype == GetObjtypeByName("goldcoin"))
            if(item.amount >= 100)
                PlaySoundEffectPrivate( who, 0x38, who ); //lotsa gold
            elseif(item.amount >= 30)
                PlaySoundEffectPrivate( who, 0x37, who ); //some gold
            else
                PlaySoundEffectPrivate( who, 0x36, who ); //a few coins
            endif
        else
            PlaySoundEffectPrivate( who, 0x49, who ); //default sound
        endif

11-17 Myrathi
    Fixed Unicode speech (and a couple of possible buffer overflow bugs)
        - Text commands are now properly recognised and run
    TypeOf() (see basic.em) on Dictionary and Struct variables now returns
        "Dictionary" and "Struct", respectively.
    Added "unicode.em" with Unicode support functions (refer to file for names)
        - a Unicode "string" ('uc_text' param) is simply an Array of Integers.
        - each Integer corresponds to a 2-byte Unicode character.
        - each of the 4 functions must also be given a 3-character "language code"
            - examples are "ENU" (US English), "ENG" (UK English), "RUS" (Russian)

11-17 Syzygy
    Fixed the map Z-height algorithm to match the UO client for negative Z
        (for an example, see 1906,49)
    Fixed an assertion failure in SendOpenBook on Linux systems
    Fixed an ecompile error with substrings/multidimensional subscript access ( ex: tmp := Props[3,1] )

11-16 Racalac
    New member for the Text Event struct: "texttype". This will be a string with a value of "yell",
        "whisper", "emote", or "default" depending on the type of speech received.

    NPCs will only receive text events if the source is in range, depending on the texttype (this
        will be configurable in the future, for now, whisper is 2 tiles, normal is 12, and yell is
        25 tiles). So an NPC will not get a yell event from a source 30 tiles away, even if its
        speech event range is 40. Item text listeners will get all text in their range, regardless
        of texttype. (Need feedback for this)

    New os.em function: clear_event_queue(), empties current script's event queue.
        (Distro folks! - need to add this prototype to os.em)

    The npc.em movement functions (Wander(), Move(), WalkToward(), WalkAwayFrom(), RunToward(),
        RunAwayFrom(), TurnToward(), TurnAwayFrom(), WalkTowardLocation(),WalkAwayFromLocation(),
        RunTowardLocation(), RunAwayFromLocation(), TurnTowardLocation(), TurnAwayFromLocation())
        now return 1 is the move was successful, and 0 if the move failed. NOTE this will almost
        ALWAYS return 1, if UseAdjustments is true (see next item), because the "adjusted" move
        probably succeeded.

    New npcdesc.cfg member: UseAdjustments : If set to 1 all NPCs of this template will behave as
        normal when blocked by and object (pace back and forth if path is blocked). If set to 0, the
        NPC will not attempt to find a adjacent tile toward the target that is not blocked (defaults
        to 1 if not found in the npcdesc.cfg entry). Also, a new NPC member with the name
        ".use_adjustments" is read/write. These NPC changes are in preperation for a pathfinding
        system.

    New npcdesc.cfg member: RunSpeed . If present, (default to dexterity value) this value is used
        for time delay between NPC moves (maximum usable value is 250, which is pretty damn fast!
        Running NPCs move twice as fast as walking NPCs). Also, a new NPC member with the name
        ".run_speed" is read/write. Note that this member may become a Vital in the near future
        (before the 095 final release).

11-14 Racalac
    Fixed MoveItemToContainer bug (default container coords of -1 was being flagged
        as out of range). Reminder: any value of x or y outside the gump coordinate
        range as defined in the container's itemdesc.cfg will be interpreted as "random location"
    Added new uo.em function: ListItemsNearLocationWithFlag(x,y,z,range,flags). "flags" here are
        tiledata.mul flags for the item's graphic. A list of known flags is forthcoming
        (curious people can see Alazane's file format page at
        http://dkbush.cablenet-va.com/alazane/file_formats.html#3.19 )
    Fixed an additional MoveItemToContainer bug that was causing random location of items inside
        the container gump.

11-13 Myrathi
    Updated ECOMPILE and RUNECL banners to include better version info
        (number after the decimal point is the supported file version)

11-12 Syzygy
    Added support for ecompile.cfg and packaged includes
        see scripts/ecompile.cfg.example
        usage: include ":pkgname:filebase";
    npcdesc.cfg can once again hold non-"NpcTemplate" elements.
    xlate.cfg is no longer loaded and ignored, just ignored.

11-10 Syzygy
    item.color := (value) will once again set the color properly.

11-10 Myrathi
    Updated item.facing - valid range is now 0-127
    Updated TotalStatsAtCreation= option in SERVSPECOPT(.LOCAL).CFG
        Can now take comma-delimited lists of values and/or ranges (default = "65,80")
        Example:
               TotalStatsAtCreation=65,80,90-95,100-110
    Anti-exploit checks in uo::SelectColor()
          now validates values as 2 to 1001 to prevent client-side exploits:
          - returns the chosen color value
          - or an error ("Client selected an out-of-range color")
          An error situation will also display information on the console:
          e.g.
            Client #1 (account test) selected an out-of-range color 0x1

    Anti-exploit checks & updates in UNICODE-speech code
          squelch()'d mobiles cannot speak.
          Text-color is validated between 2 and 1001 to prevent client-side
            exploits. Invalid color prints a message to console:
            e.g.
              Client #1 (account test) speaking with out-of-range color 0x1

11-09 Syzygy
    Major changes to the script engine:

        ***   ALL SCRIPTS MUST BE RECOMPILED!!   ***

        All scripts should function as they do now, with two exceptions:
           .smember no longer works
           the hidden iterator variable in "foreach" is now called
                _(var)_iter instead of _(var)_counter
        Fixed two major script object leaks.
        Internal changes to the way member assignment and access works.
        Internal changes to the way script substrings are handled.
        Removed the 'Substring' object type.
        Fixed: len() on an error would return random values
           (now returns the number of elements in the error dictionary,
            which is probably unnecessary)


11-04 Syzygy
    Fixed a nasty compiler error.  Expressions like this:
        (!ev.source.isA(POLCLASS_NPC))
        will now work properly.
         The compiler used to consider that something like
             (!ev.("source".isA(POLCLASS_NPC) ) )


10-23 Syzygy
    foreach now operates over dictionaries:
        foreach v in dict
            print( _v_iter + " -> " + v );
        endforeach

10-17 Syzygy
    xlate.cfg is no longer used.
    spells.cfg no longer depends on xlate.cfg for reagent name lookup - will use itemdesc.cfg names.
    Preload 'equiptest' and 'unequiptest' scripts, to speed system load time.
       (however, equiptest/unequiptest scripts created after startup will not be noticed)
    Changed config file handling to speed load time.
       (menus.cfg entries might have their elements reordered, though)

    Sped up system load

10-13 Syzygy
    Sped up storage area lookups

09-14  merged changes from Racalac:
    -New property for itemdesc.cfg Map{} entries: Editable, which defaults to 0
        This determines if the user can plot points on the map gump. Note you can still edit the map
        via the script methods.

    -New script methods for map objects:
        GetPins(): returns an array of structs with .x and .y members for each pin point.
        InsertPin( index, x, y ): inserts a pin with the passed x,y before the passed index. Valid range 0 to n-1
        AppendPin( x, y ): appends a pin to the end of the course with the passed x,y
        ErasePin( index ): erases the pin at the passed index (valid 0 to n-1), and shifts pins down.
        isa(): returns true if the object is a map object

    -New pol.cfg option:
        MaximumClients=X
        Denies logon to clients if # of clients connected is at defined maximum

    -New syshook for walking through other players, i.e. define a package with syshook.cfg :
        SystemHookScript pushhook.ecl
        {
            Pushthrough Pushthrough
        }
        with pushhook.src with something like:

        use uo;

        program PushthroughHook()
            return 1;
        endprogram

        exported function Pushthrough(walker, obstructors) //note passed ARRAY of mobiles in destination tile

            foreach mob in obstructors
                print(mob.name);
            endforeach

            if(GetVital(walker,"Stamina") < GetVitalMaximumValue(walker,"Stamina"))
                return 0;
            else
                return ConsumeVital(walker,"Stamina",1000);
            endif

        endfunction

    -New player privilage: 'freemove' - ignore Pushthrough/stamina cost for movement
    -New character method: character.GetGottenItem() returns itemref to item on player's "cursor"

09-12
    Linux changes

=============================================================================
POL095-2002-09-11
=============================================================================
    Changes for linux build:
        Built with gcc 3.0, libstdc++2.10, on 2.4.18 kernel
        Use sigaction() instead of signal() in hopes of correcting SIGPIPE problems.

    The game clock will initialize before any objects are loaded from data files.
    RecalcVitals will not operate on offline mobiles
    Fixed an error related to multis which would cause decay to function sporadically
      near multis, and to use memory without bound if items existed on multis.

    Incorporated changes from Myrathi:
        * Fixed IP Banning via /config/bannedips.cfg (no longer stops at first element)
        * Warmode ghosts are no longer flagged criminal/aggressor for dbl-clicking on mobs/PCs

        * Frozen/Paralyzed ghosts are no longer able to move due to being dead.

        * HP/MaxHP update to nearby clients now uses a standard MaxHP ratio against 1000 hitpoints.
          This should stop people from being able to snoop a mobile's exact HPs via a packet sniffer.

        * item.facing can now be set from 0-101 (used to be 0-31)
        * Added: AllowSecureTradingInWarMode=0|1 in SERVSPECOPT(.LOCAL).CFG (default = 0)
        * Added: TotalStatsAtCreation=65|80 in SERVSPECOPT(.LOCAL).CFG (default = 65)

        * Added: account.CheckPassword( password ) -- for validating an account's password
          (returns 1 if the password is correct)

        * Added: player.clientversion -- returns the client version string or an empty string
          if the client has disconnected.

        * BUGFIX!!! --> find_supporting_multi()
            static MultiList mvec;
            vec.clear();
            mvec.clear();

        * Addition of packet structures (to stop incorrectly variant blocks skewing data):
          - 0x15 0x1E 0x1F 0x23 0x26 0x28-0x2B 0x2D 0x2F-0x32 0x35-0x39 0x3D-0x4D 0x50-0x52
          - 0x55 0x57-0x5C 0x5E-0x64
          - 0xC8

        * Update of packet structure information (just cuz):
          - 0x53
          - 0x65 (weather enumerates)

        * Version string update

        * Copyright date update (1993-2002)

        + Fixed legacy v1.xx-client 0x33 pause/restart packet padding.
          Still works for "mass item/multi update" though, to help with blackholing.

        + Fast-walk client-checking (packet 0xBF) -- stack-cycle & add-key
        + Cursor Hues (packet 0xBF) -- Felucca & Trammel

        + Sound effect support updated: repeat/single-use, volume and 'z' variables noted.

=============================================================================
POL094-2001-07-25
=============================================================================

    Fixed an error where some packets would be sent to all connected clients,
      no matter how far away the item was from the logged-in character

    Element types for maps need to be changed from Item to Map - their objtypes
      no longer have to fall within the range of 0x14EB toi 0x14EE

    Added ConsumeVital( mobile, vitalname, hundredths ) to uo.em

    Added GetAttributeIntrinsicMod declaration to uo.em
    Attribute updates will be sent to the client
    Life updates will be sent to nearby clients
    Added mobile.attached:
       returns process reference if a script is attached,
       or an error ("No script attached.")
    If the Attack system hook returns false, core will handle combat as normal.
    Vital regen rates will be limited to the range (-30,000 to +30,000)
    Vital maximum values (in hunredths) will be limited to the range (100 to 10,000,000)
       (1.00 to 100,000.00)
    SetVital will accept any value between 0 and 10,000,000
    Added SystemHook function Attack(attacker,defender)
      -- called when the attack timer times out.
      -- attacker must not be hidden
      -- defender is chosen by checking attacker's Opponent, then Hostiles, for one
         that meets the following criteria:
           1) Defender is alive
           2) Defender is in range of attacker's weapon
           3) Defender is not hidden
           4) Defender is not concealed from Attacker
           5) Line-of-sight exists between Attacker and Defender
    LOS will be checked when searching for an attackable mobile
    Removed SetAttributeIntrinsicMod
    GetIntrinsicModFunction added to attributes.cfg
    added AlterAttributeTemporaryMod
    Updated vitals will be sent to the client
     - this only works for your own character, you won't see changes to others' vitals
    Added GetAttributeIntrinsicMod and SetAttributeIntrinsicMod
    Removed SetVitalRegenRate since regen rates are specified by exported functions
    Added RecalcVitals(chr) which will recalculate regen rates and maximum values
      for all vitals on a mobile
    Corrected an error in the compiler having to do with optimization of if..elseif..endif statements
    Newly created NPCs will regenerate vitals and start with maximum vitals
    npcdesc.cfg entries can specify AttackAttribute instead of AttackSkillID
    removed mobile.hp_regen_rate
    removed mobile.mana_regen_rate
    removed mobile.stamina_regen_rate
    resmoved mobile.strength_mod
    removed mobile.intelligence_mod
    removed mobile.dexterity_mod
    removed mobile.hp, mobile.maxhp
    removed mobile.mana, mobile.maxmana
    removed mobile.stamina, mobile.maxstamina
    removed mobile.strength
    removed mobile.dexterity
    removed mobile.intelligence
    removed uo::GetStatus
    removed uo::GetStats
    removed mobile.setstr()
    removed mobile.setint()
    removed mobile.setdex()
    removed uo::GetRawSkill
    removed uo::SetRawSkill
    removed uo::GetSkill
    removed uo::AwardRawPoints
    removed internal attribute advancement due to combat (including parrying)
    Added system hook: ParryAdvancement( attacker, weapon, defender, shield )
    Weapon entries in itemdesc.cfg must have an 'Attribute' instead of a 'SkillID'
    data/pol.txt needs the following element: (core 93 doesn't create)
        System
        {
            CoreVersion 93
        }


=============================================================================
POL093-2001-02-10
=============================================================================
    SetAttributeBaseValue will only accept base values between 0 and 2200 (0.0 to 220.0)
    Added GetVitalMaximumValue(character, vitalname);

    Added functions for Vitals:
        GetVital(character, vitalname)
        SetVital(character, vitalname, value);
        GetVitalRegenRate( character, vitalname )
        SetVitalRegenRate( character, vitalname, rate )
        Regen rates are in "hundredths of points per minute."
        A current regen rate of 100 (1 point per 5 seconds) would therefore
        be 1200 (12 points per minute) under the new system.
        Valid Vitals are Life, Stamina, and Mana


    Added 'CombatAdvancement' system hook
      function CombatAdvancement( attacker, weapon, defender )
      The builtin functionality performs the following:
        For the Attacker:
           Award 30 raw skill points in the weapon skill
           Award stat gain as if the weapon skill were used successfully.
           Award 15 raw skill points in Tactics
           Award stat gain as if Tactics were used successfully.
        For the Defender:
           Award 15 raw skill points in Tactics
           Award stat gain as if Tactics were used successfully.
      This is called whether or not the attack was successful

      (I'm sure I'm not the only one that thinks combat needs an overhaul)



    Started the new Attribute System (Read this!)
    ---------------------------------------------
        The short story: these functions presently operate on the current
          skills and stats that you know and love.  Core 93 will not change
          the underlying skills and stats - GetSkill, SetRawSkill etc will
          continue to work.  Core 94 will no longer support these functions,
          so you have until then to convert your current usage to use these
          new functions.
          When this is complete, there'll be no more "Raw" skill/stat values,
          and all Attribute advancement will be handled by scripts.

        See core-docs.txt for a description of Attributes and how they work.
        In particular, the "conversion notes" at the end may be useful.

        Added uo.em functions:
            GetAttribute( character, attrname );
            GetAttributeBaseValue( character, attrname );
            GetAttributeTemporaryMod( character, attrname );
            SetAttributeBaseValue( character, attrname, basevalue );
            SetAttributeTemporaryMod( character, attrname, tempmod );

    config/pkgroots.cfg specifies additional root directories to search for packages.
        An example pkgroots.cfg:
            PackageRoot
            {
                dir d:\devpkg\
            }
        Do include the trailing slash.

    Assertions:
        Assertions are now present in the Win32 build as well as the Linux build.
        EnableAssertions is now 1 by default.
        DumpStackOnAssertionFailure=1 in pol.cfg will cause a stack backtrace
        to be generated when any assertion fails.
        In any case, an exception will be thrown on an assertion failure.
        I recommend running with EnableAssertions=1.  It is reloaded when pol.cfg is changed.

=============================================================================
POL092-2000-12-11
=============================================================================
    pkg.cfg directive added: "Replaces {pkg}".  Indicates this package should replace
      any version of {pkg} found under the /pol/pkg/ tree.


    objtypes.txt will be created on startup.  It lists all used and unused objtypes in numerical order.
    Fixed a bug where only the first element in movecost.cfg would be read.
    Added uo::SelectColor(chr,dyetub)
    Removed internal dye and dyetub functionality.  (replacement 'dyeitems' package uploaded to pol-core-test)
      - note this uses Zulu's 'dyecheck' script instead of the old internal functionality
        to determine if you can dye a particular item.
    Corrected a bug which caused BaseSkillToRawSkill (and therefore NPC creation) to take a
      long time to complete (even for base skill values above 160)
    Added support for the client's book interface:
      uo::SendOpenBook(chr,book) kicks it off
      The 'book' passed must have a Method Script, exporting the following functions:
        exported function IsWritable(book) // returns 0 or 1 for readonly/writable
        exported function GetNumLines(book) // returns maximum number of lines
        exported function GetTitle(book)
        exported function GetAuthor(book)
        exported function GetLine(book, line) // line is 1-based
      Writable books must provide the following functions:
        exported function SetAuthor(book,author)
        exported function SetTitle(book,title)
        exported function SetLine(book,line,text)
        exported function GetContents(book) // returns an array of all lines
      I've put together a sample 'sysbook' package to demonstrate this.

    Added the Data Store.
      The Data Store is a collection of files, stored under data/ds/, saved
        atomically with the rest of the world data.
      Only those Data Files actually modified are saved at system save time.
      A Data File is a collection of Data File Elements.  Data File Elements are
        accessed by key, which can either be a String (case insensitive match)
        or an Integer.
      A Data Element is a collection of Properties.  Each Property has a Property
        Name and a Property Value.  A Property Name is a string, and is, er,
        case-sensitive (doh), while a Property Value can be any "packable" script
        object.

      In other words, a Data File is like a Config File that you can modify and
        is stored under data/.  The Properties in a Data File Element are just 'cprops'
        except that when saved in the data store I don't prefix them all with 'cprop'

      scripts/datafile.em lists the functions that are complete and the methods provided
        by a DataFile and by a DataFileElement.

      Packages can have their own Data Files; these will be stored in
        data/ds/{pkgname}/.  Normal package filename resolution rules apply.

    Normal "Open Spellbook" handling will occur if the OpenSpellbook hook returns false.
      (The OpenSpellbook hook script should return 1 if it handled the event, 0 if it didnt)
    Any itemdesc entry can define zero or more 'OldObjtype' entries.  These are for
      objtype renumbering.
    Major rework of multi handling.  There must now be itemdesc.cfg entries for boats
      and houses, and the objtypes aren't tied to the MultiIDs.  Multis.cfg defines what to
      expect in multi.mul.
      CreateMultiAtLocation has more flags for boat creation
        (CRMULTI_FACING_NORTH, CRMULTI_FACING_EAST, etc)
      An example entry for pkg/std/boat/itemdesc.cfg:
        Boat 0x6041
        {
            Name smalldragonboat
            Graphic 0x4004      // base graphic
            MultiID 0x0004

            OldObjtype 0x4004
            OldObjtype 0x4005
            OldObjtype 0x4006
            OldObjtype 0x4007
        }
      An example entry for pkg/std/housing/itemdesc.cfg:
        House 0x6060
        {
            Name smallstoneandplasterhouse
            Graphic 0x4064
            MultiID 0x64

            OldObjtype 0x4064
        }
      See the latest pol-coresupp zip for config/multis.cfg


    Fixed an error where the server would fail to start if a container was overfilled
    RegisterForSpeechEvents takes an optional 'flags' parameter.  If LISTENPT_HEAR_GHOSTS is
      passed, this listening point will hear unfiltered ghost speech.
    Added scripts/include/sysevent.inc.  All system EVID_* constants have been copied here
      and renamed to SYSEVENT_*.
    Added SYSEVENT_GHOST_SPEECH (0x1000), to allow an NPC to hear unfiltered ghost speech.
      The NPC must still be able to _see_ the ghost in able to hear it.
    NPC event masks will now be checked for SYSEVENT_SPEECH being set.
    Added npc.eventmask, in part to help you find scripts that don't set SYSEVENT_SPEECH.
    Added npc.speech_color and npc.speech_font.  npc::say() will use these.
      These will be saved in npcs.txt as SpeechColor and SpeechFont (and can be specified in
      npcdesc.cfg)

    Added uo::AddAmount(item,amount)
      - only adds to stackables
      - only allows stacks up to 60,000
      - checks for container overfill
    Added an optional 'flags' parameter to CreateMultiAtLocation
      - uo.em contains constants to add together (CRMULTI_*)
      - this parameter only applies to houses, not boats
    Before character deletion, scripts/misc/ondelete.ecl and anypkg/ondelete.ecl will be called.
      Their return values are ignored.
    New system hook: OpenSpellbook( chr ), called when the Open Spellbook packet is received
     (not when a spellbook is doubleclicked).  This is called even if the character is dead!

    Added 'Method Scripts' for items:
      An itemdesc.cfg entry can specify a 'MethodScript'
      This is a script that (presumably) contains exported functions.
      Method calls on the item are forwarded to the exported functions in this script.
      Exported functions can have the same name as an existing object method.  In this case,
        the exported function will override the existing object method.
      An example that modifies door.open():

      pkg/.../door/itemdesc.cfg:
        Door 0x0675
        {
            xmod -1
            ymod +1
            script door
            doortype metal
            MethodScript cdoor.ecl
        }

      pkg/.../door/cdoor.src:
        exported function open( door )
            print( "cdoor::open(" + door.serial + ")" );
            return door._open();
        endfunction

        program install()
            print( "installing cdoor" );
            return 1;
        endprogram

      Note the mostly empty 'program' section.  It must return 1 in order for the
        method script to be installed.
      Script methods don't have to be the same as existing methods, and can take
        and number of parameters.  Pass-by-reference should be possible, as well.
      Method scripts can only be specified for items in packages; the server will
        probably blow chunks if you try it in pol/config/itemdesc.cfg.
    Preceding a method call with an underscore will directly call the "real" object method.


    escript changes:
        'int' is no longer a reserved word
        'exported' is now a reserved word
    logon scripts in packages will now be called on character creation
    Added the concept of a "System Hook":
      - Any package can contain a syshook.cfg file
      - Each entry is a SystemHookScript, which can provide one or more exported functions
      - the only function that can presently be hooked is 'CheckSkill'
      - A sample syshook.cfg:
            SystemHookScript hooktest.ecl
            {
                CheckSkill MyCheckSkill
            }
      - And hooktest.src to go with it:
            use uo;

            exported function MyCheckSkill(who,skillid,difficulty,points)
                print( "MyCheckSkill("+who.serial+","+skillid+","+difficulty+","+points+")" );

                // note you can call the "system" function normally
                return CheckSkill(who,skillid,difficulty,points);
            endfunction

            program hooktest()
                print( "hooktest prog" );
            endprogram
      - The 'program' section is executed once, at system startup.
        Thereafter, the exported function is called as needed.
      - A hooked 'CheckSkill' will override any script's call to CheckSkill, as
        well as the internal combat CheckSkill calls.
      - Each hooked function has a recursion guard, so the system function can
        be called from within the hook function (as in the example above)
      - there is currently no way to unload system hook functions

    Containers won't count their own weight against the weight they can hold
    Multiple scripts can have active gump dialogs on a particular client

    The 'SecureTradeContainer' itemdesc.cfg entry must specify "Weight 0"
    Here is the entry I use:
        Container 0xFF01
        {
            Name    SecureTradeContainer
            graphic 0x1E5E
            Gump    0x003C
            MinX    0
            MaxX    66
            MinY    0
            MaxY    33
            Weight  0
        }
    If "Weight 0" is not specified, mobiles who participate in secure trading
      will weight 255 stones more than they should.


    Container entries in itemdesc.cfg can specify MaxWeight and MaxItems
      - if zero (or not specified) there are no limits
      - if MaxItems is specified, it includes item counts for child containers
      - if MaxWeight is specified, it includes weights for child containers
      - there is still a limit of 150 items in the top-level of a container
          (so as not to flip out the client)
      - added item.item_count
      - container count and weight limits will not be enforced during startup
    Weight of a mobile will now include items being "dragged" as well as
      items in the secure trade window
    Added Container scripts (specify in itemdesc.cfg):
        Entries:
            CanInsertScript // called to see if an item can be inserted
            OnInsertScript  // started after an item is inserted
            CanRemoveScript // called to see if an item can be removed
            OnRemoveScript  // started after an item is removed
      - program definitions are:
      - program can_insert( who, container, item );
      - program on_insert( who, container, item );
      - program on_insert( who, container, item, amtadded ); // if an existing stack was added to

      - program can_remove( who, container, item ); // return nonzero to allow removal
      - program on_remove( who, container, item ); // when the item is dragged
            - note the item will always be "in use" when this script is called.
      - only started on "client drag" operations
    Packed variables containing 'x' characters (an empty array element) should unpack correctly
      (would have unpacked a huge error object instead of a nothing)

=============================================================================
POL091-2000-11-01
=============================================================================
    Added more guild support:
      All guild data is stored in data/guilds.txt.  Existing GuildId entries in
      pcs.txt will be migrated.
      Ally and Enemy status is always 2-way, and is not transitive, so any hierarchies
        will have to be implemented in script.

      - new uo.em functions:
        CreateGuild();          // returns a guildref
        FindGuild( guildid );   // returns a guildref or error
        ListGuilds();           // returns an array of guildrefs
        DestroyGuild( guild );   // destroys a guild with neither members, allies, nor enemies
      - Guild Object
        Properties:
         guild.guildid : integer, unique guild identifier
         guild.members : array of offline mobilerefs
         guild.allyguilds  : array of allied guilds
         guild.enemyguilds : array of enemy guilds

        Methods:
         guild.ismember( who )
         guild.isallyguild( otherguild )
         guild.isenemyguild( otherguild )

         guild.addmember( who )
         guild.addallyguild( otherguild )
         guild.addenemyguild( otherguild )

         guild.removemember( who )
         guild.removeallyguild( otherguild )
         guild.removeenemyguild( otherguild )

         guild.getprop( propname )
         guild.setprop( propname, propvalue )
         guild.eraseprop( propname )

    Added Auxilliary Client Interface
      - a package can contain 'auxsvc.cfg'
      - packed values are sent, newline-terminated.  These show up on the aux service
        script's event queue as an event with ev.type = "recv" and ev.value = the unpacked value
      - parameter to the aux control script is an AuxConnection
      - AuxConnection.transmit( val ) sends packed representation of val, newline terminated.
      - see 'pkgauxsvc.zip' for an example

    "CON", "AUX", "PRN", and "NUL" will be disallowed as text command names.
    NPC intrinsic weapons will be re-equipped after unequipping another weapon
      (instead of switching to the human wrestling weapon)
    Removed "Searching for" messages when looking for textcmds
    An "Unknown command" message will display if you mistype a textcmd
    NPCs will walk through mobiles they can't see (whether due to concealment or hiding).
    NPC AttackHitScript entries cause hit scripts to fire now.
    Ghosts will no longer impede NPC movement.
    minrange and maxrange can be specified in Weapon entries in itemdesc.cfg.
      Default for melee weapons: minrange 0, maxrange 1
      Default for projectile weapons: minrange 2, maxrange 20
        (same as previous code)
    NPCs in packages should retain their intrinsic weapon after a restart.
    npc.isa(t) and mobile.isa(t) now work
    mobile.setcriminal(0) now works
    PID will display for runaway scripts
    ReadConfigFile( ":*:foo" ) will load a combination of all foo.cfg files found in
      config/ and all package directories.  These can be unloaded.  This method is preferred
      over using "::itemdesc", "::spells", and "::skills", since reloading will be handled
      correctly.
    Added extra checking on item destruction in case a destroyscript is evil
    Added uo::SendViewContainer( chr, container ) - just sends the container contents
      (does not grant access like SendOpenSpecialContainer)
    mobile.truecolor and mobile.trueobjtype are r/w (though I think trueobjtype has no effect)
    Fixed a crash bug in some instances of item destruction, decay being one example.
    "AttackHitScript" can be specified in npcdesc.cfg entries for a per-npctemplate HitScript.
        For packaged npcdesc.cfg entries, this will need to have the package specified.
        Also note that AttackSpeed must be specified for any per-npctemplate Attack* properties to be used.
    added object.isa( polclass_type ) : boolean
      use constants POLCLASS_OBJECT, POLCLASS_ITEM, etc from uo.em
        example:
          door.isa( POLCLASS_DOOR ) will return true
          door.isa( POLCLASS_ITEM ) will return true
          door.isa( POLCLASS_MOBILE ) will return false
    Whisper range is 2, Yell range is 25
    Items in decaying locked containers will be destroyed with the container.
    movable=0 items in decaying containers will be destroyed.
      Note that in both cases, destroy scripts will not execute.
       (Destroy scripts execute only when DestroyItem is called, or when a toplevel
        item is checked for decay)
    '=' is assumed to be a command prefix (as well as '.')
    mob.setcriminal(0) will clear the criminal timer and send status update packets
    "destroy [desc] ..." messages will no longer display on item destruction.

POL090-2000-09-03
=================
SPECIAL NOTE:
  ALL SCRIPTS MUST BE RECOMPILED!  (all your scripts compile, right? :-)
  Old .ECL files will not load!

Titles
    - if present, "[title_guild]" will display above name on singleclick
    - if present, " (title_race)" will display after name on paperdoll
    - title_prefix, title_suffix, title_guild and title_race can contain leading
         and trailing spaces, embedded quotes, and embedded newlines.

Interactive Debugger
    - Added beginning of debugger interface.
         pol.cfg: DebugPort=port, DebugPassword=string, DebugLocalOnly=0/1
         Only enabled if DebugPort if specified as non-zero.
    - Added local variable information to .dbg files
    - Added stepinto debug command
         (see srcdoc/poldbg.txt for debug command list)
    - Added debugger commands:
         pidlist [str]             return list of PIDs with scriptnames matching *str*
         inslist [file] [line]     list instructions associated with File#/Line#
         globalvars                list global variable names (if available, compile
                                    with -z)
         getlocalpacked [N]        get local variable #N, in packed format
         setlocalpacked [N] [p]    set local variable #N, to packed value
         getglobalpacked [N]       get global variable #N, in packed format
         setglobalpacked [N] [p]   set global variable #N, to packed value
    - Added debugger command 'call'
         call [scriptname] [parameters:packed array]
         parameters must be a packed array.
         return value is returned packed.
         So, if 'misc/called.src' ends with 'return 5;' then;
         "call misc/called.ecl a3:i1i2i3"
         will call misc/called.src, with three parameters: 1, 2, 3
         Output will be:
           Results: 1
           Return value packed: i5
    - Added debugger command 'quit' - graceful exit.

eScript
    - Added 'runecl.exe' to the core distro.
        - only has access to 'basic', 'basicio', and 'math' execution modules
    - Added math.em execution module
    - Added Integer modulus operator '%'
    - Added bitwise operators, for Integers only
       & (bitwise and)
       | (bitwise or)
       ^ (bitwise xor)
       ~ (one's complement)
    - Added 'sysfind_flags' parameter to SystemFindObjectBySerial
       - flag values can be found in uo.em:
       - SYSFIND_SEARCH_OFFLINE_MOBILES - search for offline mobiles and equipment
          on offline mobiles
       - SYSFIND_SEARCH_STORAGE_AREAS   - search for items in all storage areas
    - SystemFindObjectBySerial will always return an 'offline mobileref' if
       SYSFIND_SEARCH_OFFLINE_MOBILES is specified.
    - Added the 'struct' type.  These can be persisted, unlike a struct created
      from an array.  Structs should be used rather than arrays when you want a
      structure.
      preferred forms:
          var a,b,c,d;
          a := array;      // make an empty array
          a[1] := 2;
          a[2] := 7;

          b := struct;
          b.+name := "YouThere";
          print( b.name );

          c := dictionary;
          c["hello"] := "foo";
          c["world"] := "bar";

          d := { 2, 5 };   // make an initialized array
    - The 'error' datatype is now persistable (internally it's a 'struct')
    - Added pids (process ids) and a scripting object for process control
       - os::getpid() gets your own pid
       - os::getprocess(pid) gets a scripting object for a process given its PID
    - Added polcore().skill_checks_per_min
    - Added polcore().combat_operations_per_min
    - The instares dialog gump packet will no longer be sent automatically on PC death
       - chrdeath.src will have to handle this
    - Added uo::SendInstaResDialog( chr );
    - Added AwardRawSkillPoints( mobile, skillid, rawpoints )
       - rawpoints must be positive at this time
    - "pol.lg2" has been renamed to "debug.log" and is enabled in
        pol.cfg:EnableDebugLog=0/1
    - Added process.sendevent( object );
    - Added process.kill();
    - start_script will now return a process scripting object
    - Added npc.process, returns a process scripting object
    - Global variable name information is now included in .dbg files
       '-z' option removed - only '-x' generates .dbg files
       .dbg.txt files no longer generated
    - Added GetObjPropertyNames(object) - returns array of all cprop names
    - Configfile string properties can be contained within quotes, and can contain
       leading and trailing spaces, embedded quotes (\"), and embedded newlines (\n)
    - SendSysMessage, Broadcast, PrintTextAbove, and PrintTextAbove all take
       optional parameters 'font' and 'color'
    - Added item.buyprice
       If nonzero, overrides the 'vendor_buys_for' value from itemdesc.cfg
       If negative, vendors will not buy this item.
    - 'invisible' in itemdesc.cfg will be honored as the default.

Compiler
    - Search rules for .inc and .em files changed:
       - First, the directory of the including file is searched
       - Next, either ECOMPILE_PATH_EM or ECOMPILE_PATH_INC (which default to
          the directory containing ecompile.exe) are searched
       - relative dir info from the included filename is always used.
       - pass '-v10' to the compiler to see what's going on, if it can't find
         your files.
       - This means that:
           D:\POL> ecompile -r .
           D:\POL\PKG\MYPKG> ecompile foo.src
           D:\POL\SCRIPTS> ecompile ..\pkg\mypkg\foo.src
          should all be equivalent now.
       - If you intend to use the debugger, compiling from your pol\ directory
           is best, (or specifying a full path) so that pol.exe will have the
           correct paths to all involved files.
       - I recommend "ecompile -u -b -l -x -a -r d:\pol"
    - It seems those of you using Win2k and Linux will need to have
       ECOMPILE_PATH_EM and ECOMPILE_PATH_INC variables.

Reputation System
    - See srcdoc/repsys.htm for current criminal/murderer flagging rules
    - Added mobile.SetParalyzed( isparalyzed := 1 );
       - mobile.paralyzed := 1/0 is deprecated and will become read-only
       - mobile.SetPoisoned sets repsys data
    - Added mobile.SetPoisoned( ispoisoned := 1 )
       - mobile.poisoned := 1/0 is deprecated for this use (it will become read-only)
       - mobile.SetPoisoned can set repsys data (aggressor, criminal flagging)
        mobile.poisoned assignment cannot.
       - mobile.SetPoisoned will no longer set the Murderer flag
    - Added mobile.SetCriminal( level := 1 ), level >= 1
    - Added mobile.SetMurderer( ismurderer := 1 )
    - Added mobile.murderer read-only flag
    - mobile.criminal will always return true for murderers.
    - Healing, Unpoisoning, and Unparalyzing will clear the ToBeReportable list if
       all are clear
    - A mobile's Reportables list is now persisted
       Added mobile.reportables (see srcdoc/uoscrobj.htm for details)
       Added mobile.RemoveReportable( serial, gameclock )
    - ".i_repdata" updated to display murderer flag, ToBeReportable list, and
       Reportable list
    - repsys.cfg: added a General section, with Criminal and Aggressor timeouts.

Client Issues
    - Added Ignition support
    - Weather packets are now disabled for all non-1.26.* clients (including Ignition)
    - pol.cfg: DisplayUnknownPackets=0/1 added
    - pol.cfg: ClientEncryptionVersion can be set to 1.26.4 , 2.0.0 , or ignition

Errors Resolved
    - Fixed a crash bug in SystemFindObjectBySerial when the object wasn't found
    - Possibly fixed the "skill window update" client crash bug
    - hair and beards created on corpses will be marked invisible and non-movable
    - Ghosts will no longer be able to pick up or equip items.
    - Dye tub cursors will no longer be sent if a script cursor is active
    - Script constructs of the following form will no longer alter chr.name:
       var n := chr.name;
       n := "hey";
       - this applies to all other read/write members
    - ECOMPILE_PATH_EM and ECOMPILE_PATH_INC env variables will no longer be necessary
       - (See compiler section above)
    - Corrected some problems with target cursors
    - Corrupt .ECL files should be handled better now
    - fixed a crash bug if global variables were used before declared

Miscellaneous
    - movecost.cfg can have separate 'Walking' and 'Running' sections, and can
       range from 0-200% of carrying capacity.
    - Packages with a higher version than another enabled package by the same name
       will automatically override the lower versioned package.
    - Misspelled dot-commands will no longer display, so no more embarrassment
       in mixed company when I leave an 'o' out of '.objcount'


05/23/2000 - POLC089
==========
    Script functions can be passed parameters by reference.
      put 'byref' in the function declaration before the parameter name.
      function foo( pa, byref pb, pc )
          pa := 5;
          pb := 6;
          pc := 7;
      endfunction
      var a := 12;
      var b := 13;
      var c := 14;
      foo(a,b,c);
      // at this point a and c are unchanged, b is 6
      Note - it's much more efficient to pass arrays by reference than
        by value, because pass-by-reference doesn't have to copy them
        (or destroy them when it's done)
    Mobilerefs and Itemrefs can be compared for equality directly
      - so you can write "if (me = you)" instead of "if (me.serial = you.serial)"
      - as a result, mobilerefs and itemrefs can be used as keys in dictionaries.
    Linux version - gump problems, text command, MT mode problems fixed
    Added mobile.title_prefix, mobile.title_suffix, mobile.title_guild, mobile.title_race
      - mobile.title_prefix is displayed before the name on the paperdoll
      - mobile.title_suffix is displayed after the name on the paperdoll
      - mobile.title_guild and mobile.title_race are not used (but are persisted)
    Added mobile.GuildId : just a numeric guild identifier
      (not sure if this is how it'll be done, but this lets me start on highlighting etc)
    config/repsys.cfg will be required by the core
    MoveMode can be specified in npcdesc.cfg.
      - This is per-NPC -- changing npcdesc.cfg will not affect existing NPCs
      - MoveMode is a string, containing one or more of the following:
        - "L" - Moves on Land (this is the default)
        - "S" - Moves on the Sea
        - "A" - Moves in the Air
      - Mobiles require MoveMode 'L' to move on land.
      - Mobiles require MoveMode 'S' to move on the sea.
      - MoveMode A doesn't have any effect yet.
      - There is no script interface to this yet.
      - an example - "MoveMode LS" would be appropriate on a Water Elemental.
      - PCs are all MoveMode L, unless you edit pcs.txt...
    Added combat.cfg:WarmodeInhibitsRegen (default false)
    Linux version: corrected an error in CreateAccount that would empty the account file (!)
    Corrected bug where Paperdoll would display warmode when you weren't
    'IP' entries in servers.cfg can be hostnames.  A DNS lookup will be performed each time
      a client connects to the loginserver.
    CInt(), CDbl(), and Hex() will all operate on Substrings
    Mobiles without MoveMode L might not be able to move on land.
    Added account.GetProp(propname)
    Added account.SetProp(propname,propval)
    Added 'DefaultPrivs' and 'DefaultCmdLevel' properties to entries in data/accounts.txt
      - there is no script interface.
      - these are assigned to new characters for the account.
    object method name searches are now case-insensitive
        - so now you can write array.size() or array.Size()
        - this is really so you can write account.GetProp etc
    object method names can be the same as system or user functions
    account.SetName should work now (account.SetAcctName has been renamed to this)
    Added some more log output when message handlers crash
    Added FindAccount( acctname )
    Added ListAccounts()
    Added account.GetCharacter( index : 1..5 ) -- for offline access to PCs
    Fixed the "server full" bug when --ip-- and --lan-- were used in servers.cfg
    ECOMPILE_PATH_EM and ECOMPILE_PATH_INC environment variables are now unnecessary
      if they would have referred to the directory where the 'ecompile' executable is.
    ecompile now creates '.dep' files so that changed .inc files will be searched for
      on '-u' (update) runs. ('ecompile -u -r .')
      If no .dep file exists for a .src file, no dependencies are assumed - so in order
      for this to work properly, run 'ecompile -b -r .' to recompile everything once.
    Added http::QueryIP(), returns IP address of connecting browser.
    PrintTextAbove and PrintTextAbovePrivate will use the correct description,
      rather than always using the text from tiledata.mul
    Added account.DeleteCharacter( index : 1..5 )
    Added account.EraseProp( propname : string )
    cfgfile::GetConfigStringKeys and cfgfile::GetConfigIntKeys should work now.
    Added CChr, CAsc, CChrZ, CAscZ
    ecompile will optimize IF statements with constant test expressions
    substring access with out-of-bound indices will return an error rather than aborting the script
    start_script will return an error rather than aborting the calling script.
    Fixed a problem involving dictionaries, persistence, and substrings.


04/08/2000 - POLC088
==========
    Fixed a crash bug when an item was destroyed while equipped on an offline mobile
    Fixed a crash bug when an error occurred reading properties for a new NPC
    Added mobile.hp_regen_rate, mobile.mana_regen_rate, and mobile.stamina_regen_rate.
      - a value of '100' adds one point every five seconds.
      - a value of '50' adds one half point every five seconds.
      - ...you see the pattern...
      - applied fixes for negative regen rates, and regen rates for new characters.
    Added the BASIC-style FOR-loop to escript.
      for i := 1 to 5
         print(i);
      endfor
      is the syntax.
    Added the 'dictionary' complex datatype for scripts.
        usage:
           var dict := dictionary;
           dict[ "green" ] := "blue";
           dict[ "red" ] := "orange";
           dict[ 12 ] := "yellow";
           print( dict[ "green" ] );
           print( dict[ "red" ] );
        methods:
           dictionary.size()        : number of elements
           dictionary.erase( key )  : erase an element
           dictionary.insert( key, value ) : insert an element
             (equivalent of dictionary[key] := value;)
           dictionary.exists( key ) : check for existence of a key
           dictionary.keys()        : return an array of all keys

        dictionaries can be persisted.
        keys can be integers, reals or strings.
        values can be anything.
    Added cfgfile::GetConfigStringKeys(config_file)
    Added cfgfile::GetConfigIntKeys(config_file)
    Packages can contain a 'www' directory.
      (use URLs like "http://127.0.0.1:8080/pkg/saver/")
    www directories and subdirectories will be searched for index.ecl, then
      index htm, if no page is specified.
    Added item.invisible; only applies to items in the ground, and the same
      deal with moving "out of range" after enabling the 'seeinvisitems' priv applies.
    run_script_to_completion will return the 'return value' of the script it runs
      (the return value is what the 'program' section returns)
      it will return an error if the script does not exist.
    Fixed bugs in gump handling
    Fixed bug in GetWorldHeight (kept dungeon teleporters from working)

03/05/2000 - POLC087
==========
    Removed annoying hit-script debug output
    Added logon scripts, logoff scripts, reconnect scripts.
    Added delayed logout (see docs/logonoff.txt)
     - at a minimum, you will need scripts/misc/logofftest.* for this
    Line-of-sight will succeed to items in your backpack.
    Added the 'losany' privilege for letting you ignore LOS.
    Multis will be checked in Line-of-Sight tests
    PCs can now walk through items they can move.  Hopefully this means if
      you're a GM and the client wants to let you walk through something,
      the server will let you.
    Added character.enabled( setting ) to allow scripts to check enabled settings
    Added the 'ignoredoors' privilege to let you walk through doors if your
      client files will allow it (requires a modified VERDATA.MUL)
    config/cmds.cfg added - specifies cmdlevel names and textcmd directories.
    character.setcmdlevel( cmdlevelname ) added - set cmdlevel by name
    character.cmdlevelstr added - text name of the cmdlevel
    textcmds can be specified in packages; just make a textcmd/gm etc directory
     - these are only scanned at startup, so if the directory doesn't exist then,
       it won't be searched until restart.
    character.poisoned added - just makes your health bar green or not.
     - this is not saved with world state.
    Added a console keypress interface - see config/console.cfg
    Fixed house-walking bug on restart
    Added os::unload_scripts(scriptname)  -- see os.em
    Added os::set_script_option(optnum,optval)  -- see os.em
    Added uo::Shutdown()
    Added character.ip (returns an empty string if no client connected)
    Added a facility for banning logins by IP.  You'll need config/bannedips.cfg
    MoveItemToLocation and MoveItemToContainer will check the 'moveany' setting of
      the script controller.
    EquipItem will check item movability
    Server should no longer crash if you hit Ctrl-C while packages are loading
    Added character.gold member
    Added character.spendgold( amount ) method - spends nothing and returns error if
      character doesn't have enough.  Does not recurse into locked containers.
    Added uo::ConsumeSubstance( container, objtype, amount ) - consumes nothing and
      returns error if container doesn't have enough. Does not recurse into locked containers.
    MoveItemToContainer will no longer allow a container to be moved into itself,
      or into a subcontainer in itself.
    Automatic skill advancement when skill is below 10 will only occur
      if you had some chance of success
    Fixed some movement errors; it should be possible to walk into caves now.
     - dropping things on the ground in caves probably doesn't work yet.
    character.gender is now read/write
    Items being dragged will be moved back into the backpack when a character dies
     (so they'll be moved to the corpse or kept based on newbie status etc)

02/01/2000 - POLC086
==========
    Inactivity timeout will not occur to those with cmdlevel > 0
    Inactivity timeout will not occur until a character is chosen or created
    "InactivityWarningTimeout" and "InactivityDisconnectTimeout" in pol.cfg configure
      the inactivity timeout in minutes.  Set either to 0 to disable.
    pol.cfg will be checked for changes every 30 seconds.  Settings that can be changed
      without restarting will be re-read.
    Added map checking to correct LOS issues in dungeons.  (pol.cfg:ExpLosChecksMap=1/0)
      - currently inhibits LOS across bodies of water, which may be bad.
    Packet formats changed to match latest client
      (skill locking stuff is ignored)
    uo::SendSkillWindow( towhom, forwhom ) added.  A script could send you skills for
      someone else, if it wanted; you'd get spurious "skill value changed" notifications,
      but that's your choice.
    scripts/misc/skillwin.ecl will be run on "Skill Window" (Alt-K) requests if present.
    MoveItemToLocation takes a 5th parameter, 'flags'
       - instead of adding MOVEITEM_FORCELOCATION to the z parameter, pass it here
       - pass MOVEITEM_NORMAL or 0 for normal z-corrected movement
       - for now, I'm making the 'flags' parameter mandatory, as all existing scripts
         need to be changed.  Later I'll make flags default to 0.
    Added EVID_DOUBLECLICKED event, sent when an NPC is doubleclicked
      This event must be explicitly enabled with EnableEvents().
    scripts/misc/skilladv.ecl will be run when a visible skill change happens
      - parameters are (who, skillid)
      - this is called for PCs and NPCs.
    default 'facing' prop added to itemdesc.cfg
    EquipTest scripts added - scripts/misc/equiptest and all package equiptest scripts
      will be called to determine if an item can be equipped.
    The 'mount' layer (25) can now be equipped.
      - lots of issues are left yet - combat effects, what happens when you die, and so on.
    pol.cfg:MinCmdlevelToLogin can specify the minimum cmdlevel allowed to log in.
        (So you can set your server to GM-only access temporarily or whatever)
    Objtype 0xF021 is now the 'mount' object type.
        Add the following entry to itemdesc.cfg:
            Item 0xF021
            {
                name    mount
                graphic 0x3EA2
            }
        Graphic 0x3EA2 is a horse.  0x3E9F to 0x3EA6 will use other mount types.
    Added uo::OpenPaperdoll( towhom, forwhom ).  Sends the paperdoll window.
    scripts/misc/dblclickself.ecl will be executed when you doubleclick yourself,
      if it exists.  The core will still handle "Open Paperdoll" macro requests
      internally.  The basic doubleclick-self script would look like this:
            use uo;

            program dblclickself( me )
                OpenPaperdoll( me, me );
            endprogram
    Weapons can specify MountedAnim in itemdesc.cfg.
    config/animxlate.cfg specifies animation translations for actions while on
      a mount.  Most weapons shouldn't need MountedAnim entries if this is
      populated correctly. (thanks to Myrathi for filling in animxlate.cfg)
    Removed messages when skillwin.ecl and skilladv.ecl don't exist
    Fixed a crash bug if you tried to spend gold with no backpack.
    The game clock will be paused during world save.  This should eliminate CPU
      usage spikes afterwards.
    Script compiler takes two new parameters:
        -b : keep building other scripts after errors are encountered
        -u : only compile updated scripts (.src newer than .ecl)
    Script compiler will warn for locals with same name as globals
      (only if -w 'enable warnings' option is passed)
    Crypto Keys updated for client 1.26.4
