polserver/docs/docs.polserver.com/pol100/corechanges.xml
Jonathan Morland-Barrett 8df2f6515e
Added dynaprops for min and max attack range increase. (#511)
* Initial commit of min and max range increase dynaprops.

* Fixed documentation and reported style issues.

* More style check fixes.

* Update missing uobject and script objects for new props.

* Rectify missing code from uoscrobj which prevented assignment on mobiles.
Changed range logic from weapons to include some sanity checks.

* Add a simple test

---------

Co-authored-by: Jonathan Morland-Barrett <jonathan@veridiandynamics.com.au>
Co-authored-by: Kevin Eady <8634912+KevinEady@users.noreply.github.com>
2024-11-02 15:46:50 +01:00

9116 lines
460 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" ?>
<ESCRIPT>
<header>
<topic>Latest Core Changes</topic>
<datemodified>11-02-2024</datemodified>
</header>
<version name="POL100.2.0">
<entry>
<date>11-02-2024</date>
<author>DevGIB:</author>
<change type="Added">MinAttackRangeIncrease(min_attack_range_increase) and MinAttackRangeIncreaseMod(min_attack_range_increase_mod) to Mobiles and Items allowing people to have a dynamic modifier to the adjust a mobiles minimum attack range.&lt;br/&gt;<br/>
Min Attack Range Increase is used as a numeric modifier to the minimum range of a weapon, e.g. Base min Weapon range of 1 + attack range increase of 1 would make the minimum attack range 2.</change>
<change type="Added">MaxAttackRangeIncrease(max_attack_range_increase) and MaxAttackRangeIncreaseMod(max_attack_range_increase_mod) to Mobiles and Items allowing people to have a dynamic modifier to the adjust a mobiles maximum attack range.&lt;br/&gt;<br/>
Max Attack Range Increase is used as a numeric modifier to the maximum range of a weapon, e.g. Base max Weapon range of 3 + attack range increase of 2 would make the maximum attack range 5.</change>
</entry>
<entry>
<date>11-01-2024</date>
<author>Turley:</author>
<change type="Added">servspecopt.cfg AllowVisualRangeModification 0/1 default 0<br/>
MinimumVisualRange default 5<br/>
MaximumVisualRange default 24<br/>
if AllowVisualRangeModification is active client can define its update range</change>
<change type="Added">client.visual_range member r/w<br/>
returns the client setting of visual range, or overwrites the current range.<br/>
If set to 0 the client given range will be used.<br/>
As long as the visual range is set via script the client can no longer modify the range.<br/>
VisualRangeMin/Max limit is not taken into account.</change>
</entry>
<entry>
<date>10-27-2024</date>
<author>Kevin:</author>
<change type="Fixed">Correctly load packages when running ecompile in non-autocompile mode.</change>
</entry>
<entry>
<date>10-24-2024</date>
<author>Kevin:</author>
<change type="Fixed">Correctly link method calls to base classes when using `super::`-scoped function calls.</change>
</entry>
<entry>
<date>10-20-2024</date>
<author>Kukkino:</author>
<change type="Added">Added moved_at and position_changed_at members to characters. Values signify when was the last time character<br/>
walked or changed position (for example with walking or MoveObjectToLocation)</change>
</entry>
<entry>
<date>10-20-2024</date>
<author>Kevin:</author>
<change type="Fixed">Correct behavior with classes when using a class-scoped variable as a function callee.</change>
</entry>
<entry>
<date>10-19-2024</date>
<author>Kukkino:</author>
<change type="Added">DefaultVisualRange setting to servspecopt.cfg. This setting declares how far clients can see by default.<br/>
Note that the same value needs to be set on both server and in client (usually 18 or 21).</change>
</entry>
<entry>
<date>10-18-2024</date>
<author>Kevin:</author>
<change type="Fixed">Correctly declare parameters in generated super() function as used.</change>
<change type="Fixed">Correctly handle case insensitivity with classes.</change>
</entry>
<entry>
<date>10-17-2024</date>
<author>Turley:</author>
<change type="Fixed">Fixed crash when too many items exists an a boat.</change>
</entry>
<entry>
<date>10-16-2024</date>
<author>Turley:</author>
<change type="Fixed">os::OpenConnection with keep_connection did not stop correctly if the socket was closed from the other side</change>
<change type="Changed">pol.cfg UseSingleThreadLogin is by default now active<br/>
in the general case it improves the performance and stability<br/>
pol.cfg renamed SelectTimeout to LoginServerSelectTimeout,<br/>
since its only used in this case.<br/>
The unit is now millisec and the new default is the former effective minimum value.</change>
</entry>
<entry>
<date>10-14-2024</date>
<author>Turley:</author>
<change type="Added">pol.cfg LoginServerDisconnectUnknownPkts<br/>
during login process disconnect connection if unknown/non-allowed pkt is received</change>
<change type="Fixed">improved performance when non allowed pkts arrive</change>
</entry>
<entry>
<date>10-09-2024</date>
<author>Kevin:</author>
<change type="Added">Escript now supports classes! Classes are a way to bundle attributes (members) and functionality (methods) together:<br/>
class Fighter()<br/>
function Fighter( this, name )<br/>
this.name := name;<br/>
endfunction<br/>
function Attack( this, what )<br/>
print( $&quot;{this.name} attacks {what}!&quot; );<br/>
endfunction<br/>
endclass<br/>
var person = Fighter( &quot;Alice&quot; );<br/>
person.Attack( &quot;Bob&quot; );<br/>
See the Racalac Escript Guide for additional details.</change>
</entry>
<entry>
<date>09-27-2024</date>
<author>Turley:</author>
<change type="Fixed">EScript formatter missing spaces while packing function refs, better packing of function calls in eg structs</change>
</entry>
<entry>
<date>09-12-2024</date>
<author>Turley:</author>
<change type="Fixed">multiple problems with the EScript formatter</change>
<change type="Added">more ecompile.cfg options for the formatter, see ecompile.cfg.example for details<br/>
FormatterBracketAttachToType, FormatterFormatInsideComments, FormatterAlignTrailingComments,<br/>
FormatterAllowShortCaseLabelsOnASingleLine, FormatterAllowShortFuncRefsOnASingleLine, FormatterAlignConsecutiveShortCaseStatements</change>
<change type="Note">should be now &quot;production&quot; ready, default settings are just our personal preferences</change>
</entry>
<entry>
<date>08-30-2024</date>
<author>Kevin:</author>
<change type="Added">Performance improvements to the compiler</change>
</entry>
<entry>
<date>08-27-2024</date>
<author>Reloecc:</author>
<change type="Changed">ssopt.MobilesBlockNpcMovement now accepts values 0/1/2. Earlier 0 = false, 1 = true.<br/>
2 = new behavior, where npcs of the same master are allowed to walk on top of each other. Backward compatible.</change>
</entry>
<entry>
<date>08-24-2024</date>
<author>Kevin:</author>
<change type="Fixed">Resolved an issue where the Z coordinate of objects on a boat was incorrectly<br/>
calculated during turns (introduced in the 07-08-2024 nightly build).</change>
</entry>
<entry>
<date>08-11-2024</date>
<author>Turley:</author>
<change type="Changed">EScript Formatter<br/>
variable declaration list if it doesnt fit to the line, split on the commas.<br/>
if a newline happens while a parenthesis is open align the following line with this parenthesis.</change>
</entry>
<entry>
<date>08-08-2024</date>
<author>Kevin:</author>
<change type="Added">Function Objects can now be called across different scripts.<br/>
For example, an item use script can pass to pass an &quot;initializer&quot;<br/>
function to another script that provides a new color for the item as<br/>
a parameter:<br/>
program item_usescript( who, item )<br/>
// Find the color changer process.<br/>
var color_changer := GetProcess( ... );<br/>
// Send it an event, containing the item and the initializer function.<br/>
color_changer.SendEvent( struct{<br/>
type := &quot;new&quot;,<br/>
item := item,<br/>
initializer := @SetupItem<br/>
} );<br/>
// Wait for the script to send us a result.<br/>
do<br/>
if ( Wait_For_Event( 1 ) )<br/>
break;<br/>
endif<br/>
while ( true );<br/>
SendSysMessage( who, $&quot;Item color changed: {item.color}&quot; );<br/>
endprogram<br/>
function SetupItem( item, color )<br/>
Print( $&quot;Changing color: {item.color} -&gt; {color}&quot; );<br/>
item.color := color;<br/>
endfunction</change>
</entry>
<entry>
<date>08-06-2024</date>
<author>Kevin:</author>
<change type="Changed">Performance improvements handling function references in the executor during runtime.<br/>
These changes increases the Escript version, therefore a recompilation of all scripts is required.</change>
</entry>
<entry>
<date>08-05-2024</date>
<author>Kevin:</author>
<change type="Added">Support for spread operator -- used to expand an array's elements into arguments of<br/>
a function call or elements of a new array.<br/>
For example, to pass an array's elements as arguments to a function call:<br/>
function SendMessageToPlayers( message, players... )<br/>
foreach player in players<br/>
SendSysMessage( player, $&quot;[Server] {message}&quot; );<br/>
endforeach<br/>
endfunction<br/>
var players := array{};<br/>
if (condition1)<br/>
// Add a single player to the array<br/>
players.append( player1 );<br/>
endif<br/>
if (condition2)<br/>
// Get an array of players from somewhere else<br/>
var more_players := GetMorePlayers();<br/>
// Set `players` to a new array of the elements from both `players` and `more_players`<br/>
players := { players..., more_players... };<br/>
endif<br/>
// Pass all the elements of `players` as arguments<br/>
SendMessageToPlayers( &quot;Hello!&quot;, players... );<br/>
See the Racalac Escript Guide for additional details.</change>
</entry>
<entry>
<date>08-04-2024</date>
<author>Kevin:</author>
<change type="Added">Support for variadic user functions -- user functions that accept any number of arguments.<br/>
For example, to define a function that sends a message to any number of players:<br/>
function SendMessageToPlayers( message, players... )<br/>
foreach player in players<br/>
SendSysMessage( player, $&quot;[Server] {message}&quot; );<br/>
endforeach<br/>
endfunction<br/>
SendMessageToPlayers( &quot;Hello!&quot;, player1, player2, player3 );<br/>
See the Racalac Escript Guide for additional details.</change>
</entry>
<entry>
<date>08-03-2024</date>
<author>Kevin:</author>
<change type="Added">House script method `set_multiid( int multiid | string name )`</change>
</entry>
<entry>
<date>08-02-2024</date>
<author>Kevin:</author>
<change type="Added">Array script method `find(FunctionObject testFn)`.</change>
<change type="Added">Array script method `findIndex(FunctionObject testFn)`.</change>
<change type="Added">Array script method `map(FunctionObject mapFn)`.</change>
<change type="Added">Array script method `reduce(FunctionObject testFn, [initialValue])`.</change>
</entry>
<entry>
<date>08-01-2024</date>
<author>Kevin:</author>
<change type="Fixed">Resolved an issue where function expression assignments to locals and captures was mis-targetted.</change>
<change type="Fixed">Resolved an issue where function expression captures were not being captured by reference.</change>
</entry>
<entry>
<date>07-31-2024</date>
<author>Turley:</author>
<change type="Improved">EScript ECompile Formatter: formatting of if statements and function parameters</change>
</entry>
<entry>
<date>07-29-2024</date>
<author>Kevin:</author>
<change type="Added">Compiler support for function expressions via syntax `@(param1, param2, ..., paramN) { ... }`.<br/>
For example, to get all hidden online players:<br/>
var all_hidden := EnumerateOnlinePlayers()<br/>
.filter( @( player ) {<br/>
return player.hidden;<br/>
});<br/>
See the Racalac Escript Guide for additional details.</change>
</entry>
<entry>
<date>07-28-2024</date>
<author>Kevin:</author>
<change type="Added">Array script method `filter(FunctionObject testFn)`.</change>
<change type="Added">The compiler now supports any expression as the callee for a function call,</change>
<change type="eg">`var func := @FunctionObject; func( 1, 2, 3 )` or `func( 1 )( 2 )( 3 )`.<br/>
For now, only function references (ie. a variable that holds or a function<br/>
that returns a `@FunctionObject`) can be called in this manner.</change>
</entry>
<entry>
<date>07-21-2024</date>
<author>Kukkino:</author>
<change type="Fixed">Changing realm will now send full status to player to prevent showing scaled hp/maxhp.</change>
</entry>
<entry>
<date>07-16-2024</date>
<author>Kevin:</author>
<change type="Added">When using the debugger, an attached script's `Print()` calls will now show in the Debug Console.<br/>
The log message includes the source location of the `Print()` call.</change>
</entry>
<entry>
<date>07-14-2024</date>
<author>Turley:</author>
<change type="Removed">pol.cfg SingleThreadDecay setting</change>
<change type="Changed">syshook CanDecay: returning 2 skips further core checks.<br/>
Currently meaning that the item will decay even if inside of a multi and decayonmulti is false.<br/>
Returning true/false or 1/0 still have the same meaning.</change>
</entry>
<entry>
<date>07-13-2024</date>
<author>Kevin:</author>
<change type="Fixed">An attacking character will now attack immediately when their opponent unhides.</change>
</entry>
<entry>
<date>07-11-2024</date>
<author>Kevin:</author>
<change type="Fixed">A hidden, attacking character will now attack immediately when unhidden.</change>
</entry>
<entry>
<date>07-10-2024</date>
<author>Turley:</author>
<change type="Fixed">Boat movement to the edge of a realm no more crashes</change>
<change type="Fixed">Moving a Boat via MoveObjectToLocation checks realms boundary and returns an error if it doesnt fit.</change>
</entry>
<entry>
<date>06-14-2024</date>
<author>Kukkino:</author>
<change type="Fixed">Performance of containers held weight computations in deeply nested scenarios</change>
</entry>
<entry>
<date>05-16-2024</date>
<author>Kevin:</author>
<change type="Fixed">When removing a partial stack from a container, the `item` parameter in the container's<br/>
OnRemoveScript will now be the partial stack itself (instead of the pre-split stack).</change>
<change type="Added">Parameter `split_from` to container OnRemoveScript</change>
<change type="Added">Parameter `amount` to container CanRemoveScript</change>
</entry>
<entry>
<date>05-15-2024</date>
<author>Kevin:</author>
<change type="Fixed">Client is now properly updated when adding a stack to a container which contains a matching<br/>
stack (a regression introduced in previous core change)</change>
</entry>
<entry>
<date>05-13-2024</date>
<author>Kevin:</author>
<change type="Added">container.held_weight_multiplier, item descriptor HeldWeightMultiplier to dynamically<br/>
modify a container's held weight. For example, on a backpack (having weight 3 stones) that<br/>
contains items totalling a weight of 100 stone, setting this property to 0.5 would have the<br/>
backpack weigh 53 (3 + 100 * 0.5) stone. Similarly, setting this property to 2 would have<br/>
the backpack weigh 203 stone.</change>
<change type="Fixed">Tooltip updates to client are now correctly triggered for some previously missing scenarios<br/>
(eg. dragging an item from a container).</change>
</entry>
<entry>
<date>04-24-2024</date>
<author>Reloecc:</author>
<change type="Added">`NpcMinimumMovementDelay` parameter to `servspecopt.cfg`. It controls maximum movement speed of NPCs.</change>
</entry>
<entry>
<date>04-14-2024</date>
<author>Kevin:</author>
<change type="Changed">Boat sails will now by default not collide with other objects in the<br/>
world. For example, large orc galleon ships &quot;dock&quot; properly at the coastline<br/>
with the ship's sails floating above the ground, and sails from multiple<br/>
boats can occupy the same space in the world.</change>
<change type="Added">ServSpecOpt &quot;BoatSailsCollide&quot; 1/0 default 0.<br/>
This setting adjusts the behavior of boat sails' collision:</change>
</entry>
<entry>
<date>04-12-2024</date>
<author>Kevin:</author>
<change type="Changed">For thread-safety, the debug password in pol.cfg may no longer be changed<br/>
when the server is running.</change>
</entry>
<entry>
<date>03-24-2024</date>
<author>Kevin:</author>
<change type="Added">`lastrealm` parameter to WalkOnScript.</change>
<change type="Added">Boat WalkOnScript now triggers in the same manner as other Multis and Items.</change>
</entry>
<entry>
<date>03-22-2024</date>
<author>Kevin:</author>
<change type="Changed">Equipment shown on a human corpses will now only show what was equipped<br/>
at the time of the character's death. Previously, any equippable item<br/>
on the corpse would show as equipped.</change>
<change type="Fixed">Hair items equipped on a corpse will no longer disappear when opening<br/>
the corpse.</change>
<change type="Fixed">Containers with MaxItems 0 (default if unspecified) will correctly support<br/>
the maximum allowed items (3200.)</change>
</entry>
<entry>
<date>03-18-2024</date>
<author>Kevin:</author>
<change type="Fixed">Crash when going to certain map edge locations in Tokuno.</change>
<change type="Note">This change requires recreating realms via uoconvert.</change>
</entry>
<entry>
<date>03-16-2024</date>
<author>Kevin:</author>
<change type="Added">item.weight_multiplier_mod to dynamically modify an item's weight.<br/>
For example, on an item that weighs 100 stone, setting this property<br/>
to 0.5 would have the item weigh 50 stone. Similarly, setting this<br/>
property to 2 would have the item weigh 200 stone.</change>
</entry>
<entry>
<date>03-14-2024</date>
<author>Kevin:</author>
<change type="Added">ecompile option -W (watch mode) / ecompile.cfg option WatchModeByDefault<br/>
Ecompile now includes a daemon watch mode! When using this mode,<br/>
ecompile will stay running and watch for file system changes,<br/>
recompiling scripts if they (or their dependent includes or modules)<br/>
are changed. This works in conjunction with other options, such as -A<br/>
for watching all scripts in the distro, or -r for watching all<br/>
scripts in a specific folder.</change>
<change type="Note">When using watch mode, threaded-compilation is disabled.</change>
</entry>
<entry>
<date>03-10-2024</date>
<author>Turley:</author>
<change type="Added">mysql_connect now also accepts port param for non standard ports</change>
<change type="Added">mysql_escape_string escapes given string</change>
</entry>
<entry>
<date>03-03-2024</date>
<author>Turley:</author>
<change type="Fixed">unknown realm in startloc.cfg now stops starting the core</change>
</entry>
<entry>
<date>02-26-2024</date>
<author>Turley:</author>
<change type="Added">ecompile option -F and -Fi<br/>
EScript formatter for .src and .inc (, .em) files, can be combined with -r and -A<br/>
-F prints the formatted source without touching thr original files<br/>
-Fi (inplace) formatting, rewrites the source file(s)<br/>
ecompile.cfg.example in the distribution contains all the options currently available (or online configuration files docs)<br/>
comments containing &quot;format-off&quot; disables the formatting until a comment containing &quot;format-on&quot; is found (or eof is reached)<br/>
this is a very early stage of the formatter, so dont expect perfect results</change>
</entry>
<entry>
<date>02-08-2024</date>
<author>Kukkino:</author>
<change type="Added">POL now accepts proxy protocol v2 if configured to in Listener in `uoclient.cfg` listener.</change>
<change type="Added">Gameservers in `servers.cfg` can now be filtered using `ProxyMatch` similar to `IPMatch` except for used proxy.</change>
<change type="Fixed">Gameservers `AcctMatch` and `IPMatch` can now be used at both at once (both conditions need to match).</change>
</entry>
<entry>
<date>02-06-2024</date>
<author>Kevin:</author>
<change type="Fixed">Compiler error with escaping `}` inside interpolated strings.</change>
</entry>
<entry>
<date>02-04-2024</date>
<author>Kevin:</author>
<change type="Fixed">Compiler crash on handling error member initializers with no expression initializer, eg. `error{ errortext }`.</change>
</entry>
<entry>
<date>01-27-2024</date>
<author>Kevin:</author>
<change type="Added">POL now exposes a Debug Adapter Protocol (DAP) server to provide debugging support. Any IDE or tooling that implements DAP, such as the vscode-escript extension (https://github.com/polserver/vscode-escript), can utilize this new debugging server. See pol.cfg setting DAPDebugPort.</change>
</entry>
<entry>
<date>01-23-2024</date>
<author>Turley:</author>
<change type="Fixed">faster_cast_recovery/faster_cast_recovery_mod item member returned wrong value</change>
<change type="Fixed">attribute cap tenth value storing</change>
<change type="Fixed">reportables of mobiles should now load correctly</change>
</entry>
<entry>
<date>01-18-2024</date>
<author>Kevin:</author>
<change type="Added">Escript keyword `uninit` to represent the uninitialized value.</change>
<change type="Added">Escript keywords `true` and `false`, equivalent to `Boolean(1)` and `Boolean(0)` respectively.</change>
<change type="Note">These keywords can be used anywhere a &quot;simple value&quot; is used, eg. expressions, constants, user function default parameters, etc. Additionally, these changes increases the Escript version, therefore a recompilation of all scripts is required.</change>
</entry>
</version>
<version name="POL100.1.0">
<entry>
<date>01-18-2024</date>
<author>Kevin:</author>
<change type="Note">POL 100.1.0 is now officially released.</change>
</entry>
<entry>
<date>01-18-2024</date>
<author>Kukkino:</author>
<change type="Changed">A player that single-clicks a hidden mobile will no longer receive a &quot;You see&quot; message for that mobile.</change>
</entry>
<entry>
<date>01-12-2024</date>
<author>Turley:</author>
<change type="Added">chr.buffs member. Returns the current active buffs added via addBuff as dictionary.<br/>
Key is the iconid and value a struct struct{name_cliloc, desc_cliloc, end_time, name_args, desc_args}</change>
<change type="Changed">addBuff(int icon_id, int duration, int cliloc_name, int cliloc_descr, string arguments_desc, [string arguments_name]) new optional argument arguments_name.<br/>
Needs a client higher then 5.x and modifies the cliloc_name like argument_desc does for cliloc_descr.</change>
</entry>
<entry>
<date>01-10-2024</date>
<author>Kevin:</author>
<change type="Added">Boat item descriptor `AlternateMultiID` and boat method `boat.set_alternate_multiid(position)` to facilitate changing a boat's graphic, for example switching a boat from a &quot;normal&quot; to a &quot;damaged&quot; graphic.</change>
</entry>
<entry>
<date>01-07-2024</date>
<author>Kevin:</author>
<change type="Added">Boat control script can be specified via the `ControlScript` item descriptor. If none specified, defaults to existing `scripts/misc/boat.ecl`.</change>
<change type="Fixed">Shard no longer crashes if boat control script does not exist.</change>
</entry>
<entry>
<date>01-06-2024</date>
<author>Kevin:</author>
<change type="Added">Boat script is now properly considered as a control script for the boat.</change>
<change type="Added">Boat piloting via mouse movements. Set pilot of a boat via `boat.set_pilot(who)`, clear via `boat.set_pilot(0)`, and retrieved via `boat.pilot`. See boat method `set_pilot` and member `pilot` for more details.</change>
<change type="Added">Boat piloting events are sent to the boat's control script. See `SYSEVENT_BOAT_MOVEMENT` for more details.</change>
</entry>
<entry>
<date>12-31-2023</date>
<author>Vitor:</author>
<change type="Added">MaxAnimID to pol.cfg to extend animation limit for characters. (default: 2048)</change>
</entry>
<entry>
<date>12-29-2023</date>
<author>Turley:</author>
<change type="Fixed">os::OpenConnection when sending multiple messages there was a (very low) chance that the messages where send in the wrong order.</change>
</entry>
<entry>
<date>12-22-2023</date>
<author>Turley:</author>
<change type="Fixed">Multis get now send/removed based on their footprint. Especially big multis had the problem (bigger then 32x32)</change>
<change type="Fixed">login near 0,0 did not send items/mobiles nearby</change>
</entry>
<entry>
<date>12-20-2023</date>
<author>Turley:</author>
<change type="Fixed">storing of doubles, before the precision was fixed to 6 now its possible to store in e.g. CProps 12345678.12345678</change>
</entry>
<entry>
<date>12-16-2023</date>
<author>Kukkino:</author>
<change type="Changed">PerformAction( character, action, framecount := 5, repeatcount := 1, backward := ACTION_DIR_FORWARD, repeatflag := ACTION_NOREPEAT, delay := 1 ):<br/>
Now validates 'action' parameter against UACTION</change>
</entry>
<entry>
<date>12-10-2023</date>
<author>Turley:</author>
<change type="Fixed">https support on windows for HttpRequest (broken since august)</change>
<change type="Fixed">unpack of big double values on windows when it used e notation. (broken since...)</change>
</entry>
<entry>
<date>12-06-2023</date>
<author>Brndd:</author>
<change type="Fixed">crash due to character.clearBuffs()</change>
</entry>
<entry>
<date>12-03-2023</date>
<author>Brndd:</author>
<change type="Added">GetStandingLayers() now has a &quot;includeitems&quot; parameter which allows including or excluding items from the search (default: enabled).</change>
<change type="Fixed">GetStandingLayers() now returns the height of results correctly.</change>
<change type="Added">GetStandingCoordinates( x, y, radius := 0, minz := -128, maxz := 127, realm := _DEFAULT_REALM, movemode := &quot;L&quot;, doors_block := 0 ):<br/>
This is a new EScript function that returns an Array of coordinates that are valid locations for a creature to stand on in a given radius around the given coordinates. One example use-case is finding valid spawning locations for NPCs within an area.</change>
</entry>
<entry>
<date>11-19-2023</date>
<author>Turley:</author>
<change type="Fixed">possible deadlock in packethooks</change>
</entry>
<entry>
<date>11-16-2023</date>
<author>Nando:</author>
<change type="Added">UoConvert smartness:<br/>
- MaxTileID is now detected from tiledata.mul (uoconvert) and tiles.cfg (POL).<br/>
- Default width/height for each map id<br/>
- map0 and map1 width can be estimated automatically based on a height of 4096<br/>
- better error handling</change>
<change type="Changed">usedif=1 is now the default in uoconvert</change>
<change type="Removed">UseNewHSAFormat in uoconvert.cfg. This will be detected automatically from<br/>
tiledata.mul size.</change>
</entry>
<entry>
<date>11-12-2023</date>
<author>Kevin:</author>
<change type="Fixed">crash when control scripts end for a destroyed item</change>
</entry>
<entry>
<date>11-08-2023</date>
<author>Turley:</author>
<change type="Fixed">crash due to NPCs after calling ReloadConfiguration</change>
</entry>
<entry>
<date>11-01-2023</date>
<author>Kevin:</author>
<change type="Added">RestartScript() now can restart item control scripts. Similar to NPC scripts, the existing Item control script will terminate and a new one started.</change>
</entry>
<entry>
<date>10-28-2023</date>
<author>Ins:</author>
<change type="Added">ServSpecOpt &quot;UndoGetItemEnableRangeCheck&quot; 1/0 default 0.<br/>
If enabled - on fail to equip item back on character (if it has been taken from character layer)<br/>
and on fail to put item back to backpack will check if item has been taken from position/container that is in default_accessible_range.<br/>
If origin position/container is not in default_accessible_range will skip try to put item to origin position/container (unless item is no_drop)<br/>
and as last resort will drop item at character position (feet). UndoGetItemDropHere executed before UndoGetItemEnableRangeCheck if both are set.</change>
<change type="Added">ServSpecOpt &quot;UndoGetItemDropHere&quot; 1/0 default 0.<br/>
If enabled - on fail to equip item back on character (if it has been taken from character layer)<br/>
and on fail to put item back to backpack drops item at character position (feet), except no_drop items. Attempt to return item in<br/>
origin container will be skipped.</change>
<change type="Fixed">Leftover items in corpse on client side.</change>
<change type="Changed">Added ServerSpecOpt reload to ReloadConfiguration.</change>
</entry>
<entry>
<date>10-23-2023</date>
<author>Turley:</author>
<change type="Changed">added movemode parameter to uo:FindPath, defaults to &quot;L&quot;. Before the move mode was fixed to land, now its possible to use the FindPath functionality also for eg sea monsters</change>
</entry>
<entry>
<date>10-18-2023</date>
<author>Turley:</author>
<change type="Added">print/syslog console_color parameter. When used with one of the basicio.em CONSOLE_COLOR constants, or a custom xterm formatting string the output to the console is formatted accordingly. Resets the formatting at the end. Xterm formatting is supported on Linux and Windows11. For syslog only the output to the console is modified not the logfile entry.</change>
<change type="Added">pol.cfg EnableColoredOutput 1/0 to disable formatted output. Default is 1.</change>
</entry>
<entry>
<date>10-15-2023</date>
<author>Kevin:</author>
<change type="Fixed">Changed return values and parameters used by storage module functions to match documentation.</change>
</entry>
<entry>
<date>09-03-2023</date>
<author>Ins:</author>
<change type="Added">repsys.cfg General section &quot;PartyHarmFullCountsAsCriminal 1/0&quot; default 1.<br/>
If 0 OnHarm does not set mobile to criminal when they are in the same party.</change>
</entry>
<entry>
<date>08-30-2023</date>
<author>Kevin:</author>
<change type="Fixed">Client character no longer stutters while moving the character and changing the 'poison' property.</change>
</entry>
<entry>
<date>08-29-2023</date>
<author>Kevin:</author>
<change type="Fixed">Corrected implementation of previous OpenConnection race condition fix.</change>
</entry>
<entry>
<date>08-28-2023</date>
<author>Kevin:</author>
<change type="Fixed">Fixed race condition causing random crashes with OpenConnection.</change>
</entry>
<entry>
<date>06-11-2023</date>
<author>Ins:</author>
<change type="Added">New Character member .parrychance_mod +-int in thousandth. Additive modificator of the parry_chance from the defender when it has shield equipped.</change>
</entry>
<entry>
<date>05-24-2023</date>
<author>Kevin:</author>
<change type="Fixed">Fixed crash when using mysql_fetch_row with a query that does not return any result (eg. UPDATE).</change>
</entry>
<entry>
<date>05-23-2023</date>
<author>Turley / Kevin:</author>
<change type="Fixed">Corrected behavior of dropping items with NoDrop: An attempt from a character to move a no-drop item between regular containers (ie, both containers are not &quot;no-drop exception&quot;) will now correctly place the item back into the original container (instead of the player's backpack).</change>
</entry>
<entry>
<date>05-15-2023</date>
<author>Kevin:</author>
<change type="Fixed">Fixed an issue with GetConfigString behavior on large numeric property values.</change>
</entry>
<entry>
<date>05-13-2023</date>
<author>Kevin:</author>
<change type="Changed">Modified functionality of combat.cfg setting WarmodeInhibitsRegen (backwards-compatible). Instead of a boolean 0/1, it is now an enumeration 0-4: none = 0 (default), both = 1, players only = 2, NPCs only = 3.</change>
</entry>
<entry>
<date>04-04-2023</date>
<author>Turley:</author>
<change type="Fixed">Crash when EventQueue is full due to SpeechEvents</change>
</entry>
<entry>
<date>04-23-2023</date>
<author>Kevin:</author>
<change type="Added">PackJSON() now accepts an option for `prettify`. If true, the output string will be indented with new lines.</change>
</entry>
<entry>
<date>03-19-2023</date>
<author>Kevin:</author>
<change type="Added">OpenConnection() now accepts an option for ignore_line_breaks. If set to 1, the connection script will receive events for all incoming socket data and not be restricted to data ending in line breaks, with CRLFs included in the event's value. The connection's transmit method will also not append a CRLF to the message.</change>
</entry>
<entry>
<date>02-28-2023</date>
<author>Kevin:</author>
<change type="Fixed">MultiRef.items now correctly includes items on the exterior stairs of custom houses.</change>
</entry>
<entry>
<date>02-27-2023</date>
<author>Kevin:</author>
<change type="Fixed">DestroyItem(item) will now throw an error if item is a multi.</change>
</entry>
<entry>
<date>02-06-2023</date>
<author>Kevin:</author>
<change type="Added">HTTPRequest() now accepts a flags parameter. If HTTPREQUEST_EXTENDED_RESPONSE is passed as flags, returns a Dictionary with members: 'status', the numeric HTTP status code; 'statusText', the reason phrase; 'headers', a Dictionary of key-values for each header; 'body', the response text body.</change>
<change type="Added">http::WriteStatus(code, reason := &quot;&quot;) to change the status of an HTTP response from the web server. If no reason is provided, one will be calculated from the code (if possible). This can only used once before WriteHeader(), WriteHtml(), and WriteHtmlRaw().</change>
<change type="Added">http::WriteHeader(name, value) to write a header to an HTTP response from the web server. This function can be used to change the response's Content-Type from the default &quot;text/html&quot;. This can only be used before WriteHtml() and WriteHtmlRaw().</change>
</entry>
<entry>
<date>02-05-2023</date>
<author>Kevin:</author>
<change type="Fixed">Creating an item via item descriptor whose SaveOnExit property has been set to 0 will now properly not save the item during a world save.</change>
</entry>
<entry>
<date>01-11-2023</date>
<author>Turley:</author>
<change type="Fixed">Placing items into a container failed since nightly of 01-05-2023</change>
</entry>
<entry>
<date>01-02-2023</date>
<author>Kevin:</author>
<change type="Added">Target() option TGTOPT_ALLOW_NONLOCAL to allow targeting items owned by other characters (eg. in a snooped backpack).</change>
<change type="Added">Member item.character_owner, returns the Character that owns the item, ie. the character whose backpack or equipped items contains the item.</change>
<change type="Fixed">SnoopScript is properly persisted across saves when changed via item member item.snoopscript.</change>
</entry>
<entry>
<date>01-02-2023</date>
<author>Kevin:</author>
<change type="Fixed">Custom Boat method scripts now properly execute.</change>
</entry>
<entry>
<date>12-19-2022</date>
<author>Kevin:</author>
<change type="Added">SnoopScript to itemdesc.cfg Item descriptors which runs when a character double-clicks an item that is owned by a different character, eg. another character's backpack or an item within that backpack. This can be used to implement the Snooping skill.</change>
</entry>
<entry>
<date>12-17-2022</date>
<author>Turley:</author>
<change type="Fixed">potential crash in client login phase</change>
</entry>
<entry>
<date>12-13-2022</date>
<author>Kevin:</author>
<change type="Added">CreateItemInBackpack, CreateItemInContainer, and CreateItemInInventory now have an x and y optional parameter to specify location in container gump of where to create the item.</change>
</entry>
<entry>
<date>10-24-2022</date>
<author>Crowen(che666):</author>
<change type="Fixed">uo.em Broadcast and unicode.em BroadcastUC renamed requiredcmdLevel parameter to required_cmdlevel to be consistent.</change>
</entry>
<entry>
<date>10-15-2022</date>
<author>Turley:</author>
<change type="Fixed">crash when calling another method inside of a methodscript</change>
</entry>
<entry>
<date>09-27-2022</date>
<author>Brndd:</author>
<change type="Added">CreateNPCFromTemplate() now has a &quot;forcelocation&quot; parameter, which allows creating NPCs even in invalid locations.</change>
</entry>
<entry>
<date>09-21-2022</date>
<author>Kevin:</author>
<change type="Added">POLCore() member &quot;poldir&quot;, returning the directory of the POL executable.</change>
</entry>
<entry>
<date>08-25-2022</date>
<author>Yukiko:</author>
<change type="Added">uoconvert now surfaces the partial hue flag in tiles.cfg for tiles that have that flag set in tiledata,<br/>
eg. PartialHue 1</change>
</entry>
<entry>
<date>08-21-2022</date>
<author>Turley:</author>
<change type="Fixed">PopupMenu request did not work when client canceled a request and sends a new one.</change>
</entry>
<entry>
<date>08-14-2022</date>
<author>Turley:</author>
<change type="Changed">SendPopUpMenu supports now the new pkt format added with 6.x client, it will be automatically used if needed.<br/>
The new format does not support color, but removes the limitation of valid cliloc numbers.</change>
<change type="Fixed">insurance reset performed after death didnt increase the revision.</change>
</entry>
<entry>
<date>07-01-2022</date>
<author>Kevin:</author>
<change type="Added">Boolean property `item.cursed` and corresponding itemdesc.cfg `Cursed` property. There is no special core handling of cursed items, eg. gold coin objtype 0x0EED that is cursed can still be used for vendor transactions.</change>
</entry>
<entry>
<date>06-21-2022</date>
<author>Turley:</author>
<change type="Changed">OpenXMLFile(file) returns Error if file does not exists, or any parsing error occurs.<br/>
Before it returned XMLRef in an error state, so 'if (!xml)' was and is a way to check for success.</change>
</entry>
<entry>
<date>06-16-2022</date>
<author>Kevin:</author>
<change type="Fixed">Corrected objref documentation on Character.acct, Character.acctname, and Client.acctname.</change>
<change type="Added">client.acct member to return Account object</change>
<change type="Fixed">Accessing properties on a Client that do not exist no longer results in a shard crash.</change>
</entry>
<entry>
<date>04-29-2022</date>
<author>Kevin:</author>
<change type="Fixed">`SendOverallSeason` now checks that connected clients have a character.</change>
</entry>
<entry>
<date>04-12-2022</date>
<author>Kevin:</author>
<change type="Added">Boolean property `client.disable_inactivity_timeout`.<br/>
If true, the client will not be disconnected due to inactivity.</change>
</entry>
<entry>
<date>11-08-2021</date>
<author>Brndd:</author>
<change type="Fixed">Outgoing packets with text field now correctly encode the text as CP-1252.</change>
</entry>
<entry>
<date>11-02-2021</date>
<author>Brndd:</author>
<change type="Changed">SetString packet hook method will now write CP-1252 (extended ASCII) encoded text. This is what is used for the majority of packet fields that are not UTF-16.</change>
<change type="Added">Added a new SetUtf8String packet hook method which will write UTF-8 encoded text.</change>
</entry>
<entry>
<date>09-11-2021</date>
<author>Kevin:</author>
<change type="Fixed">party.AddMember(character) will no longer error if the character is a candidate of the party.</change>
<change type="Changed">party.AddMember(character) will now error if passed an NPC.</change>
</entry>
<entry>
<date>08-30-2021</date>
<author>Nando:</author>
<change type="Fixed">Possible infinite recursion of the attack hook if a character was moved by the attack hook</change>
</entry>
<entry>
<date>08-14-2021</date>
<author>Kevin:</author>
<change type="Fixed">The remaining drop errors (too far away; location blocked) can now be disabled via the ShowWarningItem option.</change>
</entry>
<entry>
<date>08-11-2021</date>
<author>Kevin:</author>
<change type="Fixed">User Functions that conflict with the same name as Module Functions will now result in a compilation error.</change>
</entry>
<entry>
<date>08-03-2021</date>
<author>Turley:</author>
<change type="Fixed">loading of npcdesc AttackCProp and ShieldCProp</change>
<change type="Fixed">loading of itemdesc NoDrop and NoDropException</change>
<change type="Changed">either AttackSpeed or AttackDelay npcdesc entry need to exist for npc weapon creation.<br/>
Before only AttackSpeed lead to an creation.</change>
</entry>
<entry>
<date>07-22-2021</date>
<author>Turley:</author>
<change type="Fixed">Fixed crash when too many items exists an a boat.</change>
</entry>
<entry>
<date>07-21-2021</date>
<author>Kevin:</author>
<change type="Fixed">Fixed bug where a target couldn't be cancelled in some clients.</change>
</entry>
<entry>
<date>06-21-2021</date>
<author>Turley:</author>
<change type="Fixed">HSA boat movement packets (0xF7 and 0xF6) overflow logic. It sends now the correct truncated object count and checks visibility of the objects it sends.</change>
</entry>
<entry>
<date>04-10-2021</date>
<author>AsYlum:</author>
<change type="Fixed">Duplicated internal value for &quot;speedhack&quot; and &quot;losany&quot; privileges. When enabling &quot;speedhack&quot; privilege it also worked as &quot;losany&quot;<br/>
so LoS checks always returned true.</change>
</entry>
<entry>
<date>03-24-2021</date>
<author>Turley:</author>
<change type="Added">os:OpenConnection argument keep_connection<br/>
defaults to 0, if set to 1 the connection is kept active on read timeout.<br/>
By default (old behaviour) the connection is closed when for 5 seconds no pkt was received (old behaviour).</change>
</entry>
<entry>
<date>03-14-2021</date>
<author>Kevin:</author>
<change type="Added">Conditional operator: condition ? exprIfTrue : exprIfFalse<br/>
This new syntax allows you to efficiently return the result of one of the two expressions, depending on whether the conditon<br/>
expression evaluates to true or false.</change>
</entry>
<entry>
<date>03-11-2021</date>
<author>Kevin:</author>
<change type="Added">Interpolated string expression: $&quot;...&quot;<br/>
This new expression syntax allows you to join multiple components into a string. Within the ..., you may specify zero or more:<br/>
- normal strings<br/>
- escaped characters, eg. \n<br/>
- {expression [: format]}, eg. {who.name} or {who.graphic : #x}<br/>
- {{ for a { character, and }} for a } character<br/>
A complete example:<br/>
$&quot;Hello, {who.name}! You are player #{who in EnumerateOnlineCharacters()} online. Your graphic is {who.graphic : #x}.&quot;<br/>
... can replace an expression like ...<br/>
&quot;Hello &quot; + who.name + &quot;! You are player #&quot; + (who in EnumerateOnlineCharacters()) + &quot; online. Your graphic is &quot; + Hex(who.graphic)<br/>
... or ...<br/>
&quot;Hello {1}! You are player #{2} online. Your graphic is {3:#x}&quot;.format(who.name, who in EnumerateOnlineCharacters(), who.graphic)<br/>
Since this change introduces new instructions, you **MUST** recompile all your scripts!</change>
</entry>
<entry>
<date>03-07-2021</date>
<author>Nando:</author>
<change type="Added">RefreshDecayAfterBoatMoves in servspecopt.cfg. Defaults to true to maintain the old behavior. If this setting is true,<br/>
the items on deck will be refreshed after each movement or turn. You might want to disable this to implement item decay<br/>
on boats. Note that POL doesn't yet handle item decay on boats.</change>
<change type="Fixed">HSA boat movement packets (0xF7 and 0xF6) will no longer overflow when too many items are on deck. Note that the packet<br/>
will be truncated and might be misinterpreted by the client or leave ghost items behind.</change>
</entry>
<entry>
<date>03-05-2021</date>
<author>Kevin:</author>
<change type="Removed">The ability to generate the Escript wordlist via the -W argument to ecompile.exe has been removed. The Escript grammar can be<br/>
described by the ANTLR .g4 files in the repository.</change>
</entry>
<entry>
<date>03-04-2021</date>
<author>Kevin:</author>
<change type="Removed">The old compiler has been removed from ecompile in favor of the ANTLR-driven 2020 compiler. This removes the ecompile.cfg<br/>
setting UseCompiler2020 as well as the ecompile.exe switches -g and -G. Any value of UseCompiler2020 in ecompile.cfg will be<br/>
ignored without warning.</change>
</entry>
</version>
<version name="POL100.0.0">
<entry>
<date>02-28-2021</date>
<author>Nando:</author>
<change type="Note">POL 100.0.0 is now officially released. This release marks the beginning of more frequent, rolling releases.<br/>
The next release will remove support for the old compiler. This is the *last chance* to test<br/>
if your scripts change when compiled with the new compiler. (See entry on 09-15-2020)</change>
</entry>
<entry>
<date>02-27-2021</date>
<author>Nando:</author>
<change type="Added">Parameter &quot;evmask&quot; to EnableEvents(ev, range := -1, evmask := EVMASK_ALL).<br/>
The allowed values are EVMASK_ONLY_PC, EVMASK_ONLY_NPC, or EVMASK_ALL.<br/>
When set, an NPC or Item will only receive entered/leftarea events caused by a PC, NPC or all mobiles (the default behavior).<br/>
This parameter is useful, for example, to decrease the load when there are too many NPCs in the same area.</change>
<change type="Added">Default mimetypes for .png, .js and .ico in the internal webserver</change>
<change type="Added">Allow URLs/filenames with a hyphen (-) in the internal webserver</change>
<change type="Fixed">Crash in SendPacket(), packet.SendPacket() and DisconnectClient() when the client was not yet logged in. Mostly affects packet hooks.</change>
</entry>
<entry>
<date>02-27-2021</date>
<author>Turley, Kevin:</author>
<change type="Added">os::GetEnvironmentVariable(name:=&quot;&quot;)<br/>
Returns String value of given environment variable name. If name is empty, returns Dictionary of all allowed environment variables.<br/>
The pol.cfg setting AllowedEnvironmentVariablesAccess controls script access to this function. See documentation for more details.</change>
</entry>
<entry>
<date>02-22-2021</date>
<author>Kevin:</author>
<change type="Fixed">Various compilation issues when using &quot;\\&quot; in scripts.</change>
<change type="Fixed">Passing a string for the skill to CheckSkill() now correctly uses the mobile's skill.</change>
</entry>
<entry>
<date>12-17-2020</date>
<author>Turley:</author>
<change type="Added">AppendConfigFileElem now checks if the file could be opened, returns an error if this fails.</change>
</entry>
<entry>
<date>12-09-2020</date>
<author>Turley:</author>
<change type="Added">os::LoadExportedScript(scriptname, args:={})<br/>
Load and start program part of given script.<br/>
The optional args array will be unpacked and passed as single arguments to the program.<br/>
Script will be started non-critical or critical depending on the caller's state.<br/>
Blocks until the program part ends.<br/>
Returns array{ExportScript, return value} return value is the return value of the program or 1 if nothing was returned.</change>
<change type="Added">ExportScript object<br/>
the script will remain loaded as long as the object exists.</change>
<change type="member">.exported_functions array of exported function names<br/>
method .call(functionname, args:={})<br/>
Calls and blocks current script a exported function and returns the return value or 1 if no return value was given.<br/>
Like LoadExportedScript critical state depends on the caller's script.<br/>
Args see LoadExportedScript.</change>
<change type="Added">packageref.dir member returns directory path<br/>
packageref.desc member returns description &quot;pkg.name (pkg.dir)&quot;</change>
<change type="Changed">added optional parameter for syslog &quot;log_verbose&quot; if set to 0 only the text will be logged and printed, not the scriptname.</change>
</entry>
<entry>
<date>10-25-2020</date>
<author>Turley:</author>
<change type="Changed">updated StrFormatTime to allow all format specifiers see http://www.cppreference.com/stddate/strftime.html for full list.<br/>
Removed restriction of 100 characters.</change>
</entry>
<entry>
<date>10-20-2020</date>
<author>Syzygy:</author>
<change type="Changed">It is now a syntax error to have a string literal that spans multiple lines.<br/>
If you have code like this:<br/>
var a := &quot;first line<br/>
second line&quot;;<br/>
change it to something like this (adjust padding as needed):<br/>
var a := &quot;first line\n&quot;<br/>
+ &quot; second line&quot;;</change>
</entry>
<entry>
<date>10-17-2020</date>
<author>Syzygy:</author>
<change type="Changed">Now using semantic versions for core versions.<br/>
polcore().version now returns a string like 100.0.0 rather than an integer like 100</change>
</entry>
<entry>
<date>09-15-2020</date>
<author>Syzygy:</author>
<change type="Changed">Replaced the eScript compiler. (Added the new compiler, which is used by default)<br/>
The intent is that the new compiler will compile every script that used to compile,<br/>
and will compile to identical instructions in the .ecl files.<br/>
There are a few cases where the old compiler (or &quot;OG compiler&quot;) and the new compiler differ:<br/>
- Functions that are included but not referenced now have to have valid syntax.<br/>
- It is now an error for a &quot;case&quot; statement to specify the same value more than once when selecting which block to execute.<br/>
- Some operator precedence levels have changed:<br/>
- postfix operators: now have highest precedence.<br/>
- bit shift, bitwise or, bitwise and: now have the same precedence as multiplication<br/>
- bitwise or, bitwise xor: now have the same precedence as addition<br/>
- &quot;in&quot;: now has higher precedence than the comparison (&lt; &lt;= &gt;= &gt;) operators<br/>
- elvis: now has precedence just below addition, and above &quot;in&quot;, and above comparison<br/>
- As an example, this means &quot;x &amp; 0xFF == y &amp; 0xFF&quot; no longer needs parentheses to mean &quot;(x &amp; 0xff) == (y &amp; 0xFF)&quot;<br/>
- All operator precedence levels are here: https://github.com/polserver/polserver/blob/master/lib/EscriptGrammar/EscriptParser.g4#L252<br/>
- The ordering of module function declarations (from .em files) and user function definitions:<br/>
- the OG compiler orders these in order of use<br/>
- the new compiler orders them alphabetically<br/>
- On 64-bit windows, the old compiler generates the wrong constant (-1) for hex values with the high bit set.<br/>
- Example: const EVENT_PEACEMADE := 0x90000000;<br/>
In order to ensure that the behavior of your scripts does not change, please perform the following steps:<br/>
- Run &quot;ecompile -f -a -s -l -G&quot; to run both compilers in &quot;comparison mode&quot; against all of your scripts.<br/>
- Fix any syntax errors.<br/>
- Remove duplicate &quot;case&quot; statement dispatch selector values.<br/>
- Add parentheses as needed to account for operator precedence.<br/>
- Repeat until both compilers produce the same output.<br/>
Here are some examples of changes that I had to make:<br/>
- https://github.com/polserver/ModernDistro/pull/28/files<br/>
- https://github.com/polserver/ModernDistro/pull/36/files<br/>
- https://github.com/polserver/ClassicDistro/pull/6/files<br/>
The OG compiler is still available. I'll remove it in a later version. If needed, you can use it by doing either of the following:<br/>
- pass &quot;-g-&quot; to ecompile<br/>
- set &quot;UseCompiler2020 0&quot; in ecompile.cfg<br/>
New ecompile.cfg options:<br/>
EmParseTreeCacheSize (default 25): The number of .em files to cache. This value is intended to be high enough to cache every .em file.<br/>
IncParseTreeCacheSize (default 50): The number of .inc files to cache. You might see a tiny speed boost by increasing this.<br/>
UseCompiler2020 (default 1): Whether or not to use the new compiler.</change>
</entry>
<entry>
<date>08-27-2020</date>
<author>Nando:</author>
<change type="Changed">If &quot;ShowGumpWarnings&quot; in pol.cfg is disabled, it will also disable warnings about<br/>
overflow in the gump responses (B1 packet). Those messages may indicates the use of macro<br/>
tools or custom clients.</change>
</entry>
<entry>
<date>08-18-2020</date>
<author>Nando:</author>
<change type="Added">Parameter &quot;max_cmdlevel&quot; to polsys::ListTextCommands(). Indicates the maximum cmdlevel to include in the list.</change>
</entry>
<entry>
<date>08-13-2020</date>
<author>Nando:</author>
<change type="Changed">item.hitscript and item.onhitscript now always return the full path to the script (&quot;:pkgname:scriptname&quot;).<br/>
Before, if the item was defined on the same package as the script, only &quot;scriptname&quot; was returned.<br/>
POTENTIAL BREAKING CHANGE!</change>
</entry>
<entry>
<date>08-09-2020</date>
<author>Turley:</author>
<change type="Added">new argument &quot;outdir&quot; for uoconvert tiles/landtiles/multis this allows to define a different directory then the current workdirectory for the produced cfgs</change>
</entry>
<entry>
<date>08-04-2020</date>
<author>AsYlum:</author>
<change type="Added">polcore().last_character_serial returns last character serial assigned by core<br/>
polcore().last_item_serial returns last item serial assigned by core</change>
</entry>
<entry>
<date>08-03-2020</date>
<author>Kevin:</author>
<change type="Added">Optional parameter exit_code to uo::Shutdown() to change the pol process' exit code.</change>
</entry>
<entry>
<date>08-03-2020</date>
<author>Syzygy:</author>
<change type="Added">ecompile.cfg &quot;VerbosityLevel&quot; option (setting this is equivalent to ecompile -vN)</change>
</entry>
<entry>
<date>08-01-2020</date>
<author>Turley:</author>
<change type="Added">attribute.em CheckSkill() accepts now also the attribute name instead of the skill id.</change>
</entry>
<entry>
<date>07-31-2020</date>
<author>Nando:</author>
<change type="Fixed">Quality of any item can now be directly assigned from an ItemDescriptor. Before this only worked for Equipment (Armor &amp; Weapons).</change>
<change type="Fixed">Stackable items with different values of 'quality' will no longer stack.</change>
</entry>
<entry>
<date>07-28-2020</date>
<author>Kevin:</author>
<change type="Fixed">Multiple scripts should not be allowed to call uo::SendTextEntryGump on the same character.</change>
</entry>
<entry>
<date>07-16-2020</date>
<author>DevGIB:</author>
<change type="Added">SwingSpeedIncrease(swing_speed_increase) and SwingSpeedIncreaseMod(swing_speed_increase_mod) to Mobiles and Items allowing people to have a dynamic modifier to the calculated swing speed.<br/>
Swing Speed Increase is used as a % modifier to the calculated speed of a weapon, e.g. Weapon speed of 30 * swing speed increase of 100% would make the swing speed 60.</change>
</entry>
<entry>
<date>06-14-2020</date>
<author>Syzygy:</author>
<change type="Fixed">A compiler optimization bug that could corrupt emitted instructions<br/>
if branches of an if statement were optimized out.</change>
</entry>
<entry>
<date>06-10-2020</date>
<author>Syzygy:</author>
<change type="Changed">It is now a compile error if a script requires a terminator (semicolon, etc)<br/>
at its end-of-file. This fixes bug009 in the escript test suite.</change>
</entry>
<entry>
<date>05-07-2020</date>
<author>Syzygy:</author>
<change type="Changed">Removed the &quot;declare&quot; keyword, which used to forward-declare functions.<br/>
It's unlikely that anything still uses this keyword after 17 years, but if<br/>
any of your scripts still forward-declare functions this way,<br/>
just delete the line.</change>
</entry>
<entry>
<date>04-28-2020</date>
<author>Syzygy:</author>
<change type="Added">Elvis operator: short-circuit binary operator EXPR_LHS ?: EXPR_RHS<br/>
This operator evaluates the left-hand-side operand and keeps its value if it is a true value.<br/>
Otherwise, evaluates the right-hand side operand and uses its value instead.<br/>
This is a short-circuit operator: if EXPR_LHS is true, the code for EXPR_RHS won't be executed.<br/>
These can also be changed: A ?: B ?: C ?: D evaluates to the first true value from left to right.<br/>
It has lower precedence than the binary additive operators (+ -), and higher precedence than the binary comparison operators (&gt; &gt;= &lt; &lt;=).<br/>
These are equivalent with or without parenthesis:<br/>
a ?: b + c a ?: ( b + c ) // lower precedence than addition<br/>
a ?: b &lt;= c (a ?: b) &lt;= c // higher precedence than comparison<br/>
See also https://en.wikipedia.org/wiki/Elvis_operator<br/>
For example, you could change this:<br/>
var difficulty;<br/>
if(targetsquare.objtype)<br/>
difficulty := GetHarvestDifficulty(&quot;fish&quot;, targetsquare.x, targetsquare.y, targetsquare.objtype, who.realm);<br/>
else<br/>
difficulty := GetHarvestDifficulty(&quot;fish&quot;, targetsquare.x, targetsquare.y, locinfo.landtile, who.realm);<br/>
endif<br/>
to this:<br/>
var difficulty := GetHarvestDifficulty(&quot;fish&quot;,<br/>
targetsquare.x, targetsquare.y,<br/>
targetsquare.objtype ?: locinfo.landtile,<br/>
who.realm);</change>
</entry>
<entry>
<date>04-18-2020</date>
<author>DevGIB:</author>
<change type="Added">ShowWarningCursorSequence to pol.cfg to silence &quot;cursor out of sequence&quot; errors.</change>
</entry>
<entry>
<date>03-19-2020</date>
<author>Kevin:</author>
<change type="Added">New Server Specific Option (servspecopt.cfg) EnableWorldMapPackets. If enabled, the server will respond to client<br/>
requests for guild and party member locations. This option is disabled by default.</change>
</entry>
<entry>
<date>02-05-2020</date>
<author>Kevin:</author>
<change type="Added">New SCRIPTOPT_SURVIVE_ATTACHED_DISCONNECT will keep attached scripts (eg. skill scripts, item use scripts) alive if the<br/>
character's client disconnects. Note that by default all references to the character will become invalidated; for example,<br/>
GetObjProperty(chr, &quot;prop&quot;) will return an error. Enable SCRIPTOPT_CAN_ACCESS_OFFLINE_MOBILES to bypass this.</change>
<change type="Fixed">Scripts that have Set_Script_Option(SCRIPTOPT_CAN_ACCESS_OFFLINE_MOBILES) can correctly access offline mobiles.</change>
</entry>
<entry>
<date>01-20-2020</date>
<author>Kevin:</author>
<change type="Fixed">Huge Performance loss in Lower/Upper String functions.</change>
</entry>
<entry>
<date>01-18-2020</date>
<author>DevGIB:</author>
<change type="Changed">Return type of XMLFile method .appendxmlnode() now returns the created node on success.</change>
<change type="Changed">Return type of XMLNode method .appendxmlnode() now returns the created node on success.</change>
<change type="Changed">Return type of XMLNode methods .setxmlattribute() and .removexmlattribute() now returns parent node on success.</change>
</entry>
<entry>
<date>01-12-2020</date>
<author>Kevin:</author>
<change type="Changed">On Windows, the pol.cfg setting UoDataFileRoot will now default to the directory of the Ultima Online installation found in<br/>
the Windows Registry. This setting MUST be set for servers that do not have Ultima Online installed through the operating<br/>
system, and MAY be set to use custom a client data files directory.</change>
</entry>
<entry>
<date>01-04-2020</date>
<author>Turley:</author>
<change type="Fixed">Tabulator and newline chars where disallowed in CChr and the sanitize step of strings. (introduced with unicode support)</change>
</entry>
<entry>
<date>01-03-2020</date>
<author>DevGIB:</author>
<change type="Changed">POTENTIAL BREAKING CHANGE! Updated AddAmount() function to return the item reference on success instead of 1.<br/>
You'll need to check your scripts for AddAmount and make sure its not evaluated against 1 for success.</change>
</entry>
<entry>
<date>12-29-2019</date>
<author>Kevin:</author>
<change type="Added">Added definitions for packets 0xFA (Open UO Store) and 0xFB (Update View Public House Contents).</change>
</entry>
<entry>
<date>12-28-2019</date>
<author>Turley:</author>
<change type="Changed">house.house_parts member returns now when in edit mode the current (possible not yet confirmed)<br/>
list of parts instead of an error.</change>
<change type="Changed">misc/customhousecommit.src no more has a third parameter elements.<br/>
Before this parameter was the only option to get the current working list,<br/>
but since the client is able to modify the house further especially when the script shows a confirm dialog the given list is outdated.<br/>
Its highly recommended in case of an confirm dialog to calculate the price again after gump confirmation!</change>
<change type="Changed">syshook CloseCustomHouse now gets also called when client disconnects</change>
<change type="Fixed">Several other bugs with custom houses<br/>
Thx Pumpkins!</change>
</entry>
<entry>
<date>12-28-2019</date>
<author>DevGIB:</author>
<change type="Fixed">CustomHouses when no backup existed the foundation vanished on pressing revert.</change>
</entry>
<entry>
<date>12-12-2019</date>
<author>Turley:</author>
<change type="Fixed">Poison/invul status for newer clients, when mobile didnt move</change>
</entry>
<entry>
<date>10-05-2019</date>
<author>Turley:</author>
<change type="Changed">ECompile reports warnings and errors to cerr instead of printing everything to cout.<br/>
Exit code of ECompile is 1 when at least one file fails to compile.</change>
<change type="Added">ecompile.cfg ErrorOnFileCaseMissmatch (default 0)<br/>
commandline flag -c<br/>
Leads to a compilation error if the capitalization of the include directive does not match the filename.<br/>
This has only a meaning on windows.<br/>
The existing warning is now an official warning meaning that the error on warning flag leads also to an abort.</change>
<change type="Added">pre/post increment/decrement unary operator (++i, i++, --i, i--) for integer and doubles.<br/>
++i is the same as writing i+=1 or i:=i+1<br/>
i++ returns the old value, thus its equal to j:=i; i+=1;<br/>
Since it is an unary operator it can be directly used as function parameter or eg while loops.<br/>
Instead of writing<br/>
while (i&lt;5)<br/>
i+=1;<br/>
...<br/>
you can directly write<br/>
while (++i&lt;5)<br/>
...</change>
<change type="Note">The operators are only implemented for numbers but this includes also eg. arrays or members when it represents a number. So ++a[1], ++who.fire_resist_mod are also valid.<br/>
Performance wise is i:=i+1 the slowest then i+=1 then i++ then ++i. (i++ is slower since it returns the old value).</change>
</entry>
<entry>
<date>10-03-2019</date>
<author>Turley:</author>
<change type="Fixed">min/max damage visualization in the statbar are now cropped between 0 and 65k like damage calculation.</change>
</entry>
<entry>
<date>09-30-2019</date>
<author>Nando:</author>
<change type="Changed">Changed default of GetProcess(pid) from 0 to -1 due to compatibility issues with scripts using CInt()'s result directly.<br/>
PIDs are now enforced to never represent negative numbers. Please update your os.em and recompile your scripts.</change>
</entry>
<entry>
<date>09-26-2019</date>
<author>DevGIB:</author>
<change type="Added">Script objects now have package member which returns a PackageRef. e.g. script.package.name = &quot;GuildStone&quot;.</change>
</entry>
<entry>
<date>09-21-2019</date>
<author>Turley:</author>
<change type="Changed">The core is now Unicode aware!<br/>
A normal String object can hold unicode.<br/>
Files can now be stored in utf8 with or without BOM.<br/>
For backward compatibility if invalid unicode is detected while compiling/file reading ISO8859 will be assumed.<br/>
CAsc and CAscZ are normally no more needed, most incompatible changes are due to the fact that the old unicode array used for uctext is now replaced by an normal string object.</change>
<change type="Changed">The following incompatible changes where made:<br/>
party.cfg<br/>
OnPublicChat second parameter is now a string object<br/>
OnPrivateChat third parameter is now a string object<br/>
ChangePublicChat second parameter is now a string object<br/>
ChangePrivateChat third parameter is now a string object<br/>
unicode.em<br/>
RequestInputUC return value no more contains member uc_text<br/>
CharRef.clientinfo struct return value member video_description and langcode is now a string<br/>
PacketObj.getunicodestring()/getunicodestringflipped() return a string<br/>
TextCmd arguments are now (CharRef, String, [langcode=String])<br/>
SpeechEvent no more contains uc_text member<br/>
scripts/misc/charprofile.ecl fourth parameter is a string</change>
<change type="Changed">all places which currently accept an UnicodeArray can now also receive a String (UnicodeArray just for backward compatibility)<br/>
cliloc.em SendSysMessageCL, PrintTextAboveCL, PrintTextAbovePrivateCL<br/>
npc.em SayUC<br/>
party.em SendPartyMsg, SendPrivatePartyMsg<br/>
unicode.em BroadcastUC, PrintTextAbovePrivateUC, PrintTextAboveUC, RequestInputUC, SendSysMessageUC<br/>
uo.em SendCharProfile<br/>
PacketObj.setunicodestring()/setunicodestringflipped()<br/>
CharRef.addbuff()</change>
<change type="Note">Item/Mobile names need still to be in ASCII format.</change>
<change type="Note">In the case of an unicode string as parameter for the following functions the unicode replacement will be automatically used, with ENU as langcode:<br/>
Broadcast -&gt; BroadcastUC<br/>
PrintTextAbovePrivate -&gt; PrintTextAbovePrivateUC<br/>
PrintTextAbove -&gt; PrintTextAboveUC<br/>
RequestInput -&gt; RequestInputUC<br/>
Say -&gt; SayUC<br/>
SendSysMessage -&gt; SendSysMessageUC</change>
</entry>
<entry>
<date>08-26-2019</date>
<author>Nando:</author>
<change type="Changed">Improved how the debug, www and aux servers handle connections. They should be faster and more stable now. Minor issues fixed.</change>
</entry>
<entry>
<date>08-21-2019</date>
<author>DevGIB:</author>
<change type="Fixed">Missing default on GetProcess( pid ), this is now GetProcess( pid:= 0 ) to align with docs and functionallity. Please update your os.em file and recompile.</change>
</entry>
<entry>
<date>07-12-2019</date>
<author>DevGIB:</author>
<change type="Fixed">Initalization error with the new AOS props causing items with no props set to inject random numbers on server boot.</change>
<change type="Changed">Fixed issue with moving a character to a shadow realm within the same screen, the core would not correctly send mobile serials to the characters client on relocation and you would still see inaccessible characters in the shadow realm.</change>
<change type="Changed">Fixed some incorrect dates on the change log.</change>
</entry>
<entry>
<date>06-18-2019</date>
<author>DevGIB:</author>
<change type="Changed">Fixed SendQuestArrow() function to use arrow id's rather than an actual object reference. This allows for multiple arrows to be sent to the client and cancelled individually by storing them in a cprop to be recalled later.<br/>
When sending SendQuestArrow() the function will return the arrows id for further processing.</change>
</entry>
<entry>
<date>06-17-2019</date>
<author>DevGIB:</author>
<change type="Changed">Fixed default for OS::Start_Skill_Script on script_name attribute to be string like required.</change>
</entry>
<entry>
<date>06-17-2019</date>
<author>DevGIB:</author>
<change type="Added">Support for LowerReagentCost, SpellDamageIncrease, FasterCasting, FasterCastRecovery, DefenceIncrease, DefenceIncreaseCap, LowerManaCost, Hitchance,<br/>
Luck, FireResistCap, ColdResistCap, EnergyResistCap, PhysicalResistCap, and PoisonResistCap and their subsequent mods to UObject as dynaprops.</change>
<change type="Changed">Elevated Luck to UObject and added related LuckMod.</change>
<change type="Added">Support for new prop changes to the status bar packet.</change>
<change type="Added">Resistances will now be limited to caps by core, unless caps aren't set or are 0.</change>
<change type="Added">CoreIgnoresDefenceCaps to servspecopt.cfg which defaults to 0. If set to 1 core will not calculate resistances and defence increase limits set on the mobile.</change>
</entry>
<entry>
<date>04-26-2019</date>
<author>Nando:</author>
<change type="Changed">Improved connection handling. Linux won't be limited to 1024 clients anymore, recent Windows shouldn't be affected besides some slight performance gain.</change>
<change type="Note">POL now requires at least Windows Vista / Server 2008. Let us know if Windows XP was important to you.</change>
<change type="Removed">pol.cfg option &quot;ListenPort&quot;. It was deprecated since 2012 (and likely didn't work). You should use a Listener in uoclient.cfg.</change>
<change type="Removed">pol.cfg option &quot;Multithread&quot;. It was deprecated since 2016 and unstable. Also removed the method OS::System_RPM(), which was only useful for singlethreaded POL.</change>
</entry>
<entry>
<date>04-26-2019</date>
<author>Turley:</author>
<change type="Added">pol.cfg setting &quot;LoginServerTimeout&quot;. Defines a timeout for new connections to the loginserver.<br/>
Defaults to 10 minutes, should give enough time to select a character.</change>
</entry>
<entry>
<date>03-19-2019</date>
<author>Kevin:</author>
<change type="Changed">attributes::GetAttribute now accepts an optional parameter to specify the precision of the attribute<br/>
value returned. Use ATTRIBUTE_PRECISION_NORMAL (default) to use the existing precision, or<br/>
ATTRIBUTE_PRECISION_TENTHS to get the value in tenths.<br/>
Since this is a change to the module function's number of arguments, you MUST recompile your scripts.</change>
</entry>
<entry>
<date>03-08-2019</date>
<author>Yukiko:</author>
<change type="Changed">pol.cfg settings HideWarningGump and HideWarningItem to ShowWarningGump and ShowWarningItem.<br/>
This positive logic is consistent with all other console output settings.<br/>
Default setting is one (1). The output be displayed by default. Set to zero (0) to suppress.</change>
</entry>
<entry>
<date>02-18-2019</date>
<author>Skinny:</author>
<change type="Added">pol.cfg HideWarningGump and HideWarningItem.<br/>
Many players macros generate warnings messages on the console, causing flooding, especially if you have lots of players online.<br/>
You can enable setting HideWarningGump=1 and HideWarningItem=1 in the pol.cfg. Default value is 0.</change>
</entry>
<entry>
<date>02-02-2019</date>
<author>Yukiko:</author>
<change type="Added">uoconvert.exe will now surface the AnimID for equippables to tiles.cfg. This can be used to look-up the gump pic for wearables that are displayed on the paper doll. Add this number to 50000 for male gumpart or 60000 for female gump art. The resulting number will be the gump art that is displayed in the paper doll.</change>
</entry>
<entry>
<date>01-21-2019</date>
<author>Nando:</author>
<change type="Changed">account.split() will now return an AccountRef to the new account instead of &quot;true&quot;.</change>
</entry>
<entry>
<date>01-17-2019</date>
<author>Kevin:</author>
<change type="Fixed">Vendor purchases could overflow</change>
</entry>
<entry>
<date>01-01-2019</date>
<author>Turley:</author>
<change type="Changed">DepletedFunction hook now receives a second parameter: reason<br/>
The values are:<br/>
0: Regenerate, 1: Damage, 2: Movement, 3: Death, 4: Resurrect, 5: Script</change>
</entry>
<entry>
<date>12-30-2018</date>
<author>Turley:</author>
<change type="Added">vitals.cfg optional entry DepletedFunction<br/>
gets called once the vital reaches 0.<br/>
Given Argument is character reference<br/>
Like the other entries the syntax is ScriptName:ExportedFunctionName</change>
</entry>
<entry>
<date>12-21-2018</date>
<author>Turley:</author>
<change type="Fixed">CPU usage of UseSingleThreadLogin</change>
</entry>
<entry>
<date>11-27-2018</date>
<author>Nando:</author>
<change type="Added">Top-level items can now receive ENTEREDAREA and LEFTAREA events.</change>
</entry>
<entry>
<date>11-25-2018</date>
<author>Yukiko:</author>
<change type="Changed">The order of a couple of functions listed in uo.em. They were out of alphabetical order.</change>
<change type="Added">To uo.em ListItemsInBoxOfObjType( objtype, x1, y1, z1, x2, y2, z2, realm := _DEFAULT_REALM)<br/>
The function returns an array of all items in the bounds of the coordinates matching the ObjType specified.</change>
<change type="Added">To uo.em ListObjectsInBoxOfClass( POL_Class, x1, y1, z1, x2, y2, z2, realm := _DEFAULT_REALM)<br/>
The function returns an array of all items in the bounds of the coordinates matching the POL_Class specified.</change>
</entry>
<entry>
<date>10-22-2018</date>
<author>Turley:</author>
<change type="Fixed">Undefined behaviour after ~20 days due to overflow in time measurment. This fixes both internal time measurments e.g. for repeating tasks, swing,.. and for the EScript function ReadMilliSecondClock() see below.</change>
<change type="Changed">ReadMillisecondClock() returns now a double instead of an integer to allow higher uptimes.</change>
</entry>
<entry>
<date>10-13-2018</date>
<author>Turley:</author>
<change type="Added">syshook.cfg SystemMethod for defining object class method scripts.<br/>
Like itemdesc method scripts overriding builtin methods is possible, the builtin method can be called when prefixing with _.<br/>
For UObject classes like shown in the objref docs the inheritance is respected<br/>
so methods defined for items will be usable in weapons and methods defined in equipment override uobject methods.<br/>
Valid cfg keys are:<br/>
uobject, item, equipment, lockable, map, multi, armor, weapon, door, container, boat,<br/>
house, spellbook, corpse, npc, character, client, account, party, guild<br/>
Itemdesc/Npctemplate specific method scripts will still be first checked.</change>
<change type="Note">uoclient.cfg MethodScript entry is deprecated</change>
</entry>
<entry>
<date>10-12-2018</date>
<author>DevGIB:</author>
<change type="Changed">Added -1 as acceptable return from ConsumeAmmunition hook which will make the core continue with the normal ammunition checks.</change>
</entry>
<entry>
<date>10-07-2018</date>
<author>Turley:</author>
<change type="Added">array.sorted_insert(obj, sub_index:=0, reverse:=0)<br/>
assumes an already sorted array and inserts given obj. sub_index and reverse parameter have to match the sorting criteria of the array.</change>
</entry>
<entry>
<date>10-06-2018</date>
<author>DevGIB:</author>
<change type="Added">ConsumeAmmunition syshook to hook the cores check for ammunition consumption during combat. Hook should return 1 if combat is to go ahead and 0 if the weapon should not fire.</change>
</entry>
<entry>
<date>09-07-2018</date>
<author>DevGIB:</author>
<change type="Changed">FindObjtypeInContainer(container, objtype, flags :=0 ) to recurse all containers from base container.</change>
<change type="Added">Constants FINDOBJTYPE_RECURSIVE, FINDOBJTYPE_IGNORE_LOCKED and FINDOBJTYPE_ROOT_ONLY to UO.EM</change>
<change type="Added">Flags to FindObjtypeInContainer() for only accessing root container, and bypassing locked container checks.</change>
<change type="Note">THESE CHANGES TO FindObjtypeInContainer() WILL EFFECTIVELY CHANGE THE DEFAULT FUNCTIONALITY OF THE FUNCTION AS DEFAULT IS NOW TO RECURSE SUB CONTAINERS.</change>
<change type="Added">Additional documentation to the Racalac escript guide to include additional information supplied by Yukiko.</change>
</entry>
<entry>
<date>07-27-2018</date>
<author>DevGIB:</author>
<change type="Added">ListStaticsNearLocationOfType( x, y, z, range, objtype, flags := 0, realm := _DEFAULT_REALM ) to get a struct of statics near a location which match an objtype.</change>
<change type="Added">ListStaticsNearLocationWithFlag( x, y, z, range, flags, realm := _DEFAULT_REALM ) to get a struct of statics near a location which have matching flags in the tiledata.</change>
</entry>
<entry>
<date>07-29-2018</date>
<author>Turley:</author>
<change type="Added">ecompile.cfg NumberOfThreads<br/>
forces N number of threads to be used for compilation, default is 0 which like before autodetects the number.<br/>
cmd param -T can now be optionally extended with a number to override the cfg setting</change>
</entry>
<entry>
<date>07-19-2018</date>
<author>DevGIB:</author>
<change type="Added">EncodeBase64(String) and DecodeBase64(String) to basic.em to enable people to encode and decode strings using base64 without requiring an escript function.</change>
</entry>
<entry>
<date>04-02-2018</date>
<author>Bodom:</author>
<change type="Removed">polcore().compiledate and polcore().compiletime</change>
<change type="Added">polcore().compiledatetime</change>
</entry>
<entry>
<date>03-19-2018</date>
<author>Nando:</author>
<change type="Fixed">Crash at shutdown when POL hasn't been correctly started.</change>
</entry>
<entry>
<date>02-26-2018</date>
<author>Nando:</author>
<change type="Added">uoconvert now supports UOP files and will use them by default. If there is no<br/>
map[N]LegacyMUL.uop in the UODataFileRoot, uoconvert will fall back to the<br/>
old map[N].mul files. You can force uoconvert to convert from the old MULs by using<br/>
readuop=0.</change>
</entry>
<entry>
<date>02-10-2018</date>
<author>Nando:</author>
<change type="Changed">POL099 is officially released after almost 10 years. Starting the work on POL100.</change>
</entry>
</version>
<version name="POL099.1">
<entry>
<date>02-11-2018</date>
<author>Nando:</author>
<change type="Added">range parameter to Accessible(chr, item, range := ACCESSIBLE_DEFAULT).<br/>
Valid values: range &gt;= 0, range == ACCESSIBLE_DEFAULT or range == ACCESSIBLE_IGNOREDISTANCE.<br/>
The default range will be defined as the servspecopt entry &quot;DefaultAccessibleRange&quot;. If that<br/>
entry doesn't exist, the &quot;DefaultDoubleclickRange&quot; will be used instead (which defaults to 2).</change>
<change type="Fixed">Accessible(chr, item) now checks for the distance to the item. Differently from the distance<br/>
of 2 tiles the docs stated, the allowed distance before was about 18 tiles. To recover the old behavior,<br/>
use ACCESSIBLE_IGNOREDISTANCE as range.</change>
</entry>
</version>
<version name="POL099">
<entry>
<date>02-06-2018</date>
<author>Turley:</author>
<change type="Fixed">fileaccess.cfg: Not specifying Directory entry behaves like before and gives access to all directories. (broken since 01-05-2018)</change>
</entry>
<entry>
<date>02-05-2018</date>
<author>Turley:</author>
<change type="Added">Operator @<br/>
used to receive a function object, which can later be used to call the underlying function with the same parameters/return value via the method &quot;.call(..)&quot;</change>
<change type="Note">This object can only executed in the same script instance where it was created and cannot be saved/loaded from datafiles/cprops.</change>
<change type="Note">Use cases:<br/>
function genericItemLoop(func)<br/>
for item in ...<br/>
// complicated checks<br/>
func.call(item);<br/>
endfor<br/>
endfunction<br/>
function changecolor(item)<br/>
item.color:=6;<br/>
endfunction<br/>
...<br/>
genericItemLoop(@changecolor);<br/>
genericItemLoop(@changeY);<br/>
// (fast) function table, instead of &quot;if&quot; cascade<br/>
var look=dictionary;<br/>
look[&quot;blubb&quot;]:=@doSomething<br/>
look[&quot;blah&quot;]:=@doSomethingElse<br/>
...<br/>
look[mykey].call();</change>
<change type="Changed">Version number of ecl files, recompilation needed.</change>
</entry>
<entry>
<date>01-07-2018</date>
<author>Kevin:</author>
<change type="Added">basic::UnpackJSON(string)<br/>
Given a string in JSON format, returns an eScript object representing that JSON value.</change>
<change type="Added">basic::PackJSON(expr)<br/>
Given an eScript expression (Int, Dbl, String, Array, Struct, Dict), returns a serialization of the object in JSON format.</change>
</entry>
<entry>
<date>01-05-2018</date>
<author>Turley:</author>
<change type="Added">fileaccess.cfg Directory entry<br/>
Can be definied multiple times in package syntax.<br/>
::config means config rootfolder, :mypkg:test means subfolder test of mypkg. Has only a meaning if AllowRemote is given. Limits the access to given folder and its subfolders.</change>
<change type="Added">New type Boolean<br/>
== != ! operators are implemented<br/>
use new basic.em function Boolean(1/0) to create such type.<br/>
see testsuite/escript/boolean in the sources for detailed scripts of what is possible.</change>
</entry>
<entry>
<date>01-04-2018</date>
<author>Kevin:</author>
<change type="Added">os::HTTPRequest(url, method := &quot;GET&quot;, options := struct{})<br/>
Creates an HTTP request, and returns the returned data as a string.</change>
</entry>
<entry>
<date>12-23-2017</date>
<author>Turley:</author>
<change type="Added">os:PerformanceMeasure(delta_seconds, max_scripts)<br/>
Monitors for given number of seconds the instructions of all scripts. Returns:<br/>
struct with the following members:<br/>
total_number_observed - number of scripts alive in the timespan<br/>
total_instructions - sum of all instructions of the observed scripts<br/>
scripts - array of structs (max number is given max_scripts param) sorted by instructions amount<br/>
each scripts entry has the following members:<br/>
name - script name, if attached with name/npctemplate<br/>
instructions - number of executed instructions<br/>
pid - PID of the script<br/>
percent - percent of the total instruction amount</change>
</entry>
<entry>
<date>12-20-2017</date>
<author>Turley:</author>
<change type="Changed">Doubled the speed of custom method resolution.</change>
</entry>
<entry>
<date>10-20-2017</date>
<author>DevGIB:</author>
<change type="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.</change>
</entry>
<entry>
<date>10-11-2017</date>
<author>DevGIB:</author>
<change type="Changed">Added params to OS::OpenConnection() to allow you to pass parameters to the script that is run for the connection.</change>
</entry>
<entry>
<date>09-23-2017</date>
<author>Turley:</author>
<change type="Added">array.sort(int sub_index:=0) the optional parameter specifies the index used for sorting in the case of an array of arrays</change>
</entry>
<entry>
<date>09-10-2017</date>
<author>Turley:</author>
<change type="Added">poltool uncompressgump<br/>
unpacks and prints content of a compressed gump<br/>
only parameter is a filename, which needs to contain a single 0xDD packetlog</change>
<change type="Added">item member no_drop 1/0 r/w (itemdesc NoDrop)<br/>
if set no drop of this item is allowed<br/>
container/npc member no_drop_exception 1/0 r/w<br/>
(itemdesc/npctemplate NoDropException)<br/>
if set this container/npc is a valid target even if no_drop is set for the item</change>
</entry>
<entry>
<date>08-03-2017</date>
<author>Nando:</author>
<change type="Fixed">Shutdown crash when using character method scripts.</change>
</entry>
<entry>
<date>07-31-2017</date>
<author>Nando:</author>
<change type="Fixed">Interactive commands could cause a crash when used inside a run-to-completion script<br/>
(e.g., syshooks, scripts ran via OS::run_script_to_completion() and method scripts). The<br/>
interactive commands will now return an error if the script can't be blocked.<br/>
(Note: this does not apply to critical scripts, which *can* block).<br/>
Affected commands:<br/>
UO::Target(), UO::TargetCoordinates(), UO::TargetMultiPlacement(), UO::SelectMenuItem(),<br/>
UO::SendDialogGump(), UO::SendGumpMenu(), UO::SendTextEntryGump(), UO::SendInstaResDialog(),<br/>
UO::SelectColor(), UO::SendPopupMenu(), UO::RequestInput(), Unicode::RequestInputUC()</change>
</entry>
<entry>
<date>07-23-2017</date>
<author>DevGIB:</author>
<change type="Added">_DEFAULT_TEXT_REQUIREDCMD := 0 to uo.em which allows to set a minimum cmd level that broadcasts will be sent to.</change>
<change type="Changed">Broadcast( text, font := _DEFAULT_TEXT_FONT, color := _DEFAULT_TEXT_COLOR, requiredcmdlevel := _DEFAULT_TEXT_REQUIREDCMD )<br/>
adding requiredcmdlevel argument which allows you to set a minimum cmd level that the broadcast will be sent to.</change>
<change type="Changed">No longer require a PID for GetProcess( pid := &quot;&quot; ), not selecting a PID will use the PID of the parent script.</change>
</entry>
<entry>
<date>07-17-2017</date>
<author>Kevin:</author>
<change type="Fixed">PrintTextAbove*CL() now behaves similarly to PrintTextAbove*() functions, displaying the<br/>
object's description instead of &quot;System&quot;.</change>
</entry>
<entry>
<date>05-28-2017</date>
<author>Turley:</author>
<change type="Removed">pol.cfg entry to disable assertions. A crash will anyway happen, thus it makes no sense and only hides the real reason.</change>
</entry>
<entry>
<date>05-28-2017</date>
<author>Nando:</author>
<change type="Fixed">Crash when using SplitWords() in a script that was compiled with outdated .em files.</change>
</entry>
<entry>
<date>05-01-2017</date>
<author>Turley:</author>
<change type="Fixed">Item.house property gets now reset on component remove</change>
</entry>
<entry>
<date>11-29-2016</date>
<author>Boberski:</author>
<change type="Added">Support for TOL (Time of Legends) expantion.</change>
</entry>
<entry>
<date>10-23-2016</date>
<author>Nando:</author>
<change type="Added">Member character.carrying_capacity (read only)<br/>
Returns the current carrying capacity of a character, defined as:<br/>
(40 + 3.5*STR + chr.carrying_capacity_mod)*ssopt.carrying_capacity_mod</change>
<change type="Note">Characters can go above their carrying_capacity, but they will spend<br/>
much more stamina to move according to movecost.cfg. Don't treat this<br/>
as max_weight.</change>
</entry>
<entry>
<date>08-28-2016</date>
<author>Turley:</author>
<change type="Fixed">Calculation of NPC AOS resistance/damage values</change>
<change type="Added">Member object.specific_name<br/>
returns 1 if a custom name is set. if its still the original (eg itemdesc) returns 0</change>
</entry>
<entry>
<date>03-27-2016</date>
<author>Nando:</author>
<change type="Added">Option &quot;ThreadStacktracesWhenStuck&quot; to pol.cfg. Useful to debug the core when<br/>
no clock movement occurs for more than 30 seconds. Defaults to false.</change>
</entry>
<entry>
<date>03-25-2016</date>
<author>Nando:</author>
<change type="Fixed">Crashes when receiving very big packets.</change>
</entry>
<entry>
<date>03-24-2016</date>
<author>Nando:</author>
<change type="Fixed">Crashes after deleting a component (hold, tillerman, plank) of a boat</change>
</entry>
<entry>
<date>03-23-2016</date>
<author>Nando:</author>
<change type="Fixed">Possible crashes when a script teminates while executing a SQL command.</change>
</entry>
<entry>
<date>03-21-2016</date>
<author>Nando:</author>
<change type="Fixed">Possible crashes when handling a client's response to menus<br/>
created with CreateMenu()</change>
</entry>
<entry>
<date>03-02-2016</date>
<author>Nando:</author>
<change type="Changed">POL will default to use multithreading (Multithread = 1 in pol.cfg).</change>
<change type="Note">Multithread=0 is deprecated and likely buggy. It's possible that it doesn't<br/>
even work at the moment. Because every OS should support threading by now,<br/>
we see no reason to maintain two separate systems. Singlethread support will<br/>
be removed in the next version.</change>
</entry>
<entry>
<date>03-02-2016</date>
<author>Nando &amp; Turley:</author>
<change type="Fixed">Possible crashes when sending events to npcs whose event queues were full.</change>
</entry>
<entry>
<date>02-29-2016</date>
<author>Nando &amp; Turley:</author>
<change type="Fixed">Data races when dealing with clients. Some other not-reproducible crashes<br/>
should also go away now.</change>
</entry>
<entry>
<date>02-15-2016</date>
<author>Nando:</author>
<change type="Changed">UO::SendQuestArrow(x := -1, y := -1, target := &quot;&quot;)<br/>
This function will now work for HSA clients (version &gt; 7.0.9), which<br/>
require a larger packet. Target is ignored for older clients, but is<br/>
required (and must be a valid Item or Character reference) for HSA<br/>
clients.</change>
<change type="Added">UO::SingleClick(who, what)<br/>
This function will emulate a single-click from the client, sending<br/>
the character name, guild and tags or the item description. Note<br/>
that the client may display the item description wherever it had<br/>
clicked before. &quot;what&quot; can be either a serial, item or character.</change>
</entry>
<entry>
<date>01-31-2016</date>
<author>Bodom:</author>
<change type="Added">CProp profiler: helps detecting unused CProps.<br/>
It can be enabled by using the new pol.cfg option &quot;ProfileCProps&quot;.<br/>
For better results, should be enabled before startup.<br/>
Impacts on performance very slightly, but consumes an average of<br/>
300 bytes of extra RAM for every CProp used.<br/>
New polsys.em function LogCPropProfile() can be called to dump<br/>
the profiling information into cpprofile.log.</change>
</entry>
<entry>
<date>01-30-2016</date>
<author>Bodom &amp; Nando:</author>
<change type="Fixed">Spoofing prevention on packet 0xD7 (custom housing)</change>
</entry>
<entry>
<date>01-22-2016</date>
<author>Bodom:</author>
<change type="Fixed">Minor bug in ecompile allowing Double literals in the form &quot;2d4&quot;.<br/>
These were incorrectly interpreted as &quot;2e4&quot;, meaning 20000 and<br/>
leading to confusion with dice rolls. The compiler now issues<br/>
an error instead.</change>
</entry>
<entry>
<date>01-20-2016</date>
<author>Bodom:</author>
<change type="Added">New Item.house property, returns a reference to the house if the<br/>
item is a component of it (listed in House.components()).<br/>
This is the intended replacement for the previously removed CProp<br/>
&quot;house_serial&quot;: use item.house.serial instead of<br/>
GetObjProperty(item, &quot;house_serial&quot;).</change>
</entry>
<entry>
<date>12-27-2015</date>
<author>Bodom &amp; Nando:</author>
<change type="Fixed">Linux crash on shutdown</change>
</entry>
<entry>
<date>12-26-2015</date>
<author>Bodom:</author>
<change type="Fixed">Bug in String.format()<br/>
String tags were not correctly processed.<br/>
&quot;{name} you hit level {level}&quot;.format(struct{name:=&quot;Jane Doe&quot;, level:=4})<br/>
now correctly formats as &quot;Jane Doe you hit level 4&quot; instead of<br/>
&quot;Jane Doe you hit level &lt;invalid index: #2&gt;&quot;</change>
</entry>
<entry>
<date>12-18-2015</date>
<author>Bodom:</author>
<change type="Added">New eScript escape sequence in strings &quot;\xAA&quot;. Allows to specify a<br/>
single character by its binary value (\x01 to \xFF). The value must<br/>
always be 2 digits long, in hex, case insensitive (eg. \xA is not<br/>
valid).</change>
</entry>
<entry>
<date>12-05-2015</date>
<author>Bodom:</author>
<change type="Added">Buff Bar support<br/>
New Character's addBuff(), delBuff() and clearBuffs() methods,<br/>
please see docs for details and explanation.<br/>
0xDF packets are automatically sent when needed (eg. at relogin).<br/>
Buff Bar status is not saved, maybe it will be in future.</change>
</entry>
<entry>
<date>11-28-2015</date>
<author>Bodom:</author>
<change type="Added">New Client object properties last_packet_at and last_activity_at</change>
</entry>
<entry>
<date>11-01-2015</date>
<author>Bodom:</author>
<change type="Added">mysql_query() now supports a third &quot;parameters&quot; (array) argument.<br/>
It can be used to safely replace &quot;?&quot; placeholders inside the query<br/>
with corresponding array entries.</change>
</entry>
<entry>
<date>10-27-2015</date>
<author>Bodom:</author>
<change type="Added">New pol.cfg option AllowMultiClientsPerAccount (default: false)<br/>
When true, allows multiple characters from the same account to be<br/>
logged in at the same time</change>
<change type="Fixed">Items' CProps were loaded again from itemdesc.cfg at startup when deleted</change>
</entry>
<entry>
<date>10-18-2015</date>
<author>Bodom:</author>
<change type="Fixed">MoveItemToContainer could stack non-stackable items in some circumstances</change>
</entry>
<entry>
<date>10-07-2015</date>
<author>Bodom:</author>
<change type="Removed">&quot;house_serial&quot; CProp is no longer set by core for house components</change>
<change type="Fixed">Exception when editing a custom house with components outside of the<br/>
house</change>
</entry>
<entry>
<date>10-06-2015</date>
<author>Bodom:</author>
<change type="Fixed">Fixed crash condition (stack overflow) when unequipping last armor<br/>
piece weared by an NPC and then receiving an hit.</change>
<change type="Changed">Intrinsic armor now takes precedence over equipped armor (is was the<br/>
opposite before). Anyway, using both of them could lead to unexpected<br/>
behavior so it is not a good pratice.</change>
</entry>
<entry>
<date>10-02-2015</date>
<author>Bodom:</author>
<change type="Added">Intrinsic Shield support, works just like intrinsic weapons<br/>
New extobj.cfg entry &quot;Shield&quot; (defaults to 0x1F022)<br/>
New item must be defined in itemdesc.cfg<br/>
// Intrinsic Shield template - special pseudo Shield for NPCs<br/>
Armor 0x1F022<br/>
{<br/>
Name intrinsicshield<br/>
Graphic 1<br/>
MaxHP 1<br/>
SaveOnExit 0<br/>
}</change>
</entry>
<entry>
<date>09-30-2015</date>
<author>Bodom:</author>
<change type="Added">MoveItemToContainer parameter add_to_existing_stack can now be 2 for &quot;auto&quot; behavior<br/>
The function will try to add the item to an existing stack and just try move the<br/>
item inside the container if no stack is found</change>
</entry>
<entry>
<date>09-29-2015</date>
<author>Bodom:</author>
<change type="Fixed">When a robe is already equipped before resurrect, no longer destroy it to<br/>
equip the death robe</change>
<change type="Fixed">When HonorUnequipScriptOnDeath is on, item's unequip and unequiptest scripts<br/>
were called twice on death and in the wrong order</change>
</entry>
<entry>
<date>09-27-2015</date>
<author>Bodom:</author>
<change type="Fixed">Armor were not calculated correctly for NPCs wearing equip</change>
<change type="Fixed">Allow changing graphic of equipped items again if the new graphic has the same layer</change>
</entry>
<entry>
<date>09-25-2015</date>
<author>Bodom:</author>
<change type="Added">New uo.em function SendPopUpMenu( to, above, menu ).</change>
<change type="Added">On pop-up menu request (single click) &quot;misc/popupmenu.ecl&quot; is called.</change>
<change type="Fixed">When using MapDiff, tiles could disappear in some circumstances</change>
</entry>
<entry>
<date>09-24-2015</date>
<author>Bodom:</author>
<change type="Added">New keyword AttackCProp on npcdesc.cfg allows defining CProps for<br/>
intrinsic weapons.</change>
<change type="Fixed">Hp/MaxHp updates to nearby clients were still using the real value<br/>
instead of the 1000-based ratio when sending the 0xa1 packet.</change>
<change type="Fixed">Hp/MaxHp updates were sent twice to the originating character.</change>
</entry>
<entry>
<date>09-12-2015</date>
<author>Bodom:</author>
<change type="Fixed">Bug in loading POL098 and older data files: boats were rotated leaving<br/>
dynamic elements like plank and tillerman on the old position.</change>
</entry>
<entry>
<date>09-08-2015</date>
<author>Bodom:</author>
<change type="Fixed">Bug in LAN IP address identification (some IPs in 172.16.0.0/12 were skipped)</change>
</entry>
<entry>
<date>09-06-2015</date>
<author>Nando:</author>
<change type="Added">Data integrity check will test if the item serial is valid (serial &gt;= 0x40000000) when loading items.</change>
<change type="Fixed">Items could be created with character serials if the wrong values were saved in data/pol.txt.</change>
<change type="Note">Character serials must be in the range 1 to 0x3FFFFFF (inclusive), while item serials must<br/>
be between 0x40000000 and 0x7FFFFFFF (inclusive).</change>
</entry>
<entry>
<date>09-06-2015</date>
<author>Bodom:</author>
<change type="Added">New Item.process property<br/>
Returns reference to the controlscript, if any running</change>
<change type="Changed">Script.attached_to now returns a reference to the Item when called on a ControlScript</change>
<change type="Added">New servspecopt.cfg option DefaultCharacterHeight (1-32)<br/>
This will be the default (and never changed so far) height of Characters<br/>
and NPCs. Default value is 15. Back in the POL095 days is was 9, so consider<br/>
9-15 as your &quot;safe&quot; play range. Anything outside that range could cause weird<br/>
movement behavior. Even small changes will have a great impact on LOS<br/>
calculations and, more in general, on the combat system.<br/>
It is also used to calculate wether a Character can fit under a low<br/>
passage (e.g. dungeon stairs).<br/>
Keep in mind a Titan and a Slime will have the same height.</change>
</entry>
<entry>
<date>09-05-2015</date>
<author>Bodom:</author>
<change type="Changed">Process ids (pid) no longer start from 1 but from 0x01000000.<br/>
This should have no practical effect.</change>
<change type="Added">Allow specifying an arbitrary Gump id in SendDialogGump()<br/>
Custom gump ids must be in the range 1-0xFFFFFF. If no gumpid is given,<br/>
the old behavior of using the pid will still be used (so that this<br/>
does not break backward compatibility).<br/>
It is now possible to organize the gumpids in a constants file and have<br/>
the same gump to always be sent with the same id. This way the client<br/>
will recognize it and, if the player moved it last time, it will<br/>
reposition it where the player liked it: this should be a nice<br/>
interface improvement.<br/>
It is now possible to implement the Virtues gump, since it needs a<br/>
pre-defined gumpid of 0x01CD to work.</change>
<change type="Changed">CloseGump() now accepts a gumpid instead of a pid. For scripts not<br/>
using custom gump ids, its behavior is the same as before.</change>
</entry>
<entry>
<date>09-03-2015</date>
<author>Bodom:</author>
<change type="Added">Item insurance support, new Item.insured property (0/1)<br/>
An insured item behaves on death like a newbie item, except that the insured flag gets reset back<br/>
to 0 after every death. If the item for some reason (e.g. when backpack is full) will get dropped<br/>
instead, the insured flag will be reset anyway. Insured items are not stackable with normal items<br/>
but they can still be sold to vendors.</change>
<change type="Hint">this feature can also be used in conjunction with CanDie sys hook to determine via script which<br/>
items a player will drop on death; since the CanDie hook is called exactly one moment before death you<br/>
can use it to insure the items that you don't want to fall on the corpse.</change>
<change type="Added">RepSys NameColor and HighLightColor hooks can now return -1 to let the core run the builtin code.</change>
</entry>
<entry>
<date>08-27-2015</date>
<author>Bodom:</author>
<change type="Added">New eScript keyword: unused<br/>
This keyword can now be added before a variable name in function or program block declarations.<br/>
It has no effect on the resulting compiled code, but instructs the compiler not to issue a warning if<br/>
the following variable will not be used. The compiler will instead fire a warning if the interested<br/>
variable will then be used later in the code. Examples:<br/>
program onremovescript( character, container, unused item, unused item_amount, movetype )<br/>
// Here the variables item and item_amount are needed in the program declaration but will not be used,<br/>
// the unused keyword prevents warnings to be triggered<br/>
endprogram<br/>
function myfunc( parameter1, unused parameter_for_future_use )<br/>
// Same as above: parameter_for_future_use is not used and unused prevents the warning message<br/>
endfunction</change>
</entry>
<entry>
<date>07-27-2015</date>
<author>Turley:</author>
<change type="Added">array.cycle([count])<br/>
will move array backwards or forwards in-place as it were a conveyor belt.<br/>
{1, 2, 3}.cycle()<br/>
Will make it:<br/>
{3, 1, 2}<br/>
Accepts a negative value as a shift to move different direction</change>
<change type="Changed">string.format()<br/>
Now actually faster than string concatenation in eScript<br/>
Fixes a bug where {:d} formating could cause an arbitrary number shown instead of a real value<br/>
tag errors are slightly more intuitive and compact.</change>
<change type="Note">Patches submitted by andenixa</change>
</entry>
<entry>
<date>02-08-2015</date>
<author>Turley:</author>
<change type="Added">PolCore().memory_usage member, returns current process usage in KB</change>
<change type="Changed">0xF1 Freeshard list pkt is now allowed during login state,<br/>
thus its possible to create eg a UOGateway pkthook for this pkt</change>
</entry>
<entry>
<date>01-31-2015</date>
<author>Turley:</author>
<change type="Added">uo::ListMobilesInBox( x1,y1,z1, x2,y2,z2, realm := _DEFAULT_REALM )<br/>
like ListObjectsInBox but returns only mobiles.</change>
<change type="Changed">uo::List*InBox functions accept as z parameters LIST_IGNORE_Z<br/>
Thx @ andenixa</change>
<change type="Added">uo::GetMidpointCircleCoords( xcenter, ycenter, radius )<br/>
based on given center coordinates and radius returns array of x,y structs which represent a circle<br/>
Thx @ andenixa<br/>
The array of coordinates is sorted, which means that its easily possible to only use every second point</change>
</entry>
<entry>
<date>09-12-2014</date>
<author>Nando:</author>
<change type="Fixed">Client crash with clients older than 7.0.9.0 but newer than 7.0.0.0, because of wrong size in<br/>
boat movement packets.</change>
</entry>
<entry>
<date>07-12-2014</date>
<author>Nando:</author>
<change type="Fixed">Items were not disappearing from the character's backpack after being moved to the corpse.</change>
<change type="Fixed">Items were disappearing from the corpse when an equippable item was moved/inserted into it.</change>
</entry>
<entry>
<date>11-13-2014</date>
<author>Nando:</author>
<change type="Added">EnforceMountObjtype property in pol.cfg. Will enforce that only items with the mount<br/>
objtype (as defined in extobj.cfg, default 0x1F021) can be mounted.</change>
<change type="Fixed">Inconsistency when handling mount objects that would trigger an assertion for equipping<br/>
items with the mount objtype but a bad graphic.</change>
<change type="Note">To be equipped as a mount, the item must be in the mount tiles list of uoconvert.cfg.<br/>
This ensures that the item has layer 25 and the equippable flag, otherwise it won't<br/>
be considered equippable.</change>
</entry>
<entry>
<date>11-05-2014</date>
<author>Nando:</author>
<change type="Added">polsys::Realms() will now report how many offline mobiles and multis there are.</change>
<change type="Added">&quot;ShowRealmInfo&quot; option in pol.cfg (default to false). Will report every once in a while<br/>
the number of items, mobiles and multis per realm.</change>
<change type="Added">uo::ListOfflineMobilesInRealm(realm) method to return the list of offline mobiles in a<br/>
specific realm. Useful for moving the offline mobiles out of a shadow realm before<br/>
deleting it.</change>
<change type="Fixed">Crash bug when deleting shadow realms while an offline mobile or a multi were still in it.</change>
<change type="Fixed">Top-level items were not properly counted when moved between realms.</change>
</entry>
<entry>
<date>10-29-2014</date>
<author>Nando:</author>
<change type="Fixed">Crash bug when deleting item directly from a corpse.</change>
</entry>
<entry>
<date>10-19-2014</date>
<author>Turley:</author>
<change type="Added">AnimXlate.cfg for newer clients</change>
<change type="Added">example animxlate.cfg:<br/>
defines which graphics support mount translation<br/>
and per graphic type how to translate animation from older clients to newer (7.0.9.0)<br/>
see cfg for description of possible entries.</change>
</entry>
<entry>
<date>09-23-2014</date>
<author>Nando:</author>
<change type="Changed">Corpses will no longer send the full list of contents before being open. Only the equipped<br/>
items will be shown. This should decrease slowdowns in areas with many corpses.</change>
</entry>
<entry>
<date>09-21-2014</date>
<author>Nando:</author>
<change type="Fixed">Corpses will now equip items that are placed on them, even if they don't have an OnInsert script.</change>
<change type="Fixed">Possible crash when items having layers larger than 25 were placed/removed from corpses.</change>
</entry>
<entry>
<date>06-07-2014</date>
<author>Tomi:</author>
<change type="Fixed">using DestroyItem or SubtractAmount on an item 'gotten' it will now first release the item and then destroy it</change>
<change type="Fixed">NPCs looks for players for enter/leftarea events when, these were only looking for npcs<br/>
- moved with MoveObjectToLocation function<br/>
- on every move<br/>
- unhide<br/>
- npc creation</change>
<change type="Fixed">Destroying an equipped item now calls unequip scripts</change>
<change type="Fixed">Changing cmdlevel with chr.cmdlevel := or chr.SetCmdLevel() sends updates correctly to see concealed characters<br/>
Old Commits:</change>
<change type="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.</change>
<change type="Fixed">Crash during character creation where equipment realm was not updated and pol crashed when unequipping/equipping.</change>
<change type="Fixed">Setting Enter/Left area event listening for npcs on range 32 did never send the left area on distance 33</change>
</entry>
<entry>
<date>05-26-2014</date>
<author>Turley:</author>
<change type="Added">character.last_textcolor readonly member returns last textcolor of the character. Values are between 2 and 1001. Returns 0 if not yet spoken.<br/>
(will not be saved inside of the datafile)</change>
</entry>
<entry>
<date>05-06-2014</date>
<author>Tomi:</author>
<change type="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 &quot;britannia&quot;</change>
</entry>
<entry>
<date>04-05-2014</date>
<author>Turley:</author>
<change type="Fixed">multi.items returns now all toplevel items inside of the multi</change>
</entry>
<entry>
<date>03-15-2014</date>
<author>Turley:</author>
<change type="Changed">sql functions connect, select and query perform the communication part in background while script itself<br/>
is stopped (like eg Target()). Which means that these time consuming functions do not block the complete shard.<br/>
Removed sql module from runecl, since it no more compatible.</change>
</entry>
<entry>
<date>03-01-2014</date>
<author>Nando:</author>
<change type="Added">Character.temporally_criminal is true when a criminal timer is running on the character.</change>
<change type="Note">The old property chr.criminal stays the same: it is true when the character is temporally<br/>
criminal or a murderer.</change>
</entry>
<entry>
<date>02-27-2014</date>
<author>Tomi:</author>
<change type="Fixed">changing cmdlevel now updates correctly which concealed characters you see</change>
<change type="Fixed">crashes when parent script is killed before child script returns</change>
<change type="Fixed">crashes when reporting error in an armordesc entry defined in config\itemdesc.cfg</change>
</entry>
<entry>
<date>02-25-2014</date>
<author>Tomi:</author>
<change type="Added">Boat Smooth move for clients which support it ( HSA+ )</change>
<change type="Added">boat.em flags ( These flags are ignored for boat movements sent to old than HSA clients )<br/>
const BOAT_SPEED_ONE_TILE := 1;<br/>
const BOAT_SPEED_SLOW := 2;<br/>
const BOAT_SPEED_MEDIUM := 3;<br/>
const BOAT_SPEED_FAST := 4;</change>
<change type="Changed">boat.em functions<br/>
MoveBoat( boat, facing ) to MoveBoat( boat, facing, speed := BOAT_SPEED_ONE_TILE )<br/>
MoveBoatRelative( boat, direction ) to MoveBoatRelative( boat, direction, speed := BOAT_SPEED_ONE_TILE )</change>
<change type="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.<br/>
The clientversions are checked in core to determine what type of boat movement will be sent</change>
</entry>
<entry>
<date>02-01-2014</date>
<author>Tomi:</author>
<change type="Fixed">Customhousing exterior stairs delete is now working, commiting does not readd them anymore</change>
<change type="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</change>
</entry>
<entry>
<date>01-20-2014</date>
<author>Nando:</author>
<change type="Added">DisableNagle option in pol.cfg to disable Nagle's algorithm, default to 0. In theory, latency should improve if DisableNagle=1.</change>
</entry>
<entry>
<date>01-20-2014</date>
<author>Turley:</author>
<change type="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.<br/>
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.<br/>
Boolean check for the connection object performs now a ping and returns false if the connection is lost (eg. timeout)</change>
</entry>
<entry>
<date>12-31-2013</date>
<author>Turley:</author>
<change type="Added">Print small backtrace on crash/passert failure, should help a bit without the need of the dump.<br/>
Works only under Windows 64bit</change>
<change type="Changed">optimized world object storage and usage. Should improve eg pkt sends and scales better.</change>
</entry>
<entry>
<date>11-03-2013</date>
<author>Tomi:</author>
<change type="Fixed">Container Max Weight works now like it did earlier before _mod changes, all values &lt;= 0 sets it as 0xFFFF max weight</change>
</entry>
<entry>
<date>10-25-2013</date>
<author>Turley:</author>
<change type="Fixed">newbie flagged backpack caused endless loop on death</change>
</entry>
<entry>
<date>10-21-2013</date>
<author>Tomi:</author>
<change type="Added">polsys::FormatItemDescription( desc, amount := 1, suffix := &quot;&quot; )<br/>
This formats the desc using Pols built in Singular/Plular formatter</change>
</entry>
<entry>
<date>10-04-2013</date>
<author>Turley:</author>
<change type="Fixed">\= operation</change>
</entry>
<entry>
<date>10-01-2013</date>
<author>Tomi:</author>
<change type="Fixed">Container.locked works again</change>
</entry>
<entry>
<date>09-25-2013</date>
<author>Tomi:</author>
<change type="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 )<br/>
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 )<br/>
This can also be used to disable skills for example during an event or pvp</change>
<change type="Added">item.name_suffix for adding crafter marks or such<br/>
item.desc returns the formatted name and suffix added to it without formatting if it exists<br/>
item.name does not include this suffix, so that can be used to get the item name without formatting and without suffix</change>
</entry>
<entry>
<date>09-21-2013</date>
<author>Tomi:</author>
<change type="Changed">Pol doesnt send &quot;I am frozen&quot; messages anymore when paralyzed, now it sends in all those cases &quot;I am paralyzed&quot; messages</change>
</entry>
<entry>
<date>09-20-2013</date>
<author>Tomi:</author>
<change type="Fixed">Invul changes now sends the healthbar color correctly for UOKR and later clients</change>
<change type="Fixed">All repsys changes now send the update correctly to yourself and all client around you</change>
<change type="Removed">support for murderer healthbars for UOKR clients.</change>
</entry>
<entry>
<date>09-18-2013</date>
<author>Tomi:</author>
<change type="Added">cfgfile::GetConfigIntArray, works the same way as GetConfigStringArray but returns an array of ints instead of strings</change>
<change type="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</change>
</entry>
<entry>
<date>09-17-2013</date>
<author>Tomi:</author>
<change type="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 )</change>
<change type="Fixed">Mountpieces will not be copied into corpses during character death anymore even if they are non movable</change>
</entry>
<entry>
<date>09-03-2013</date>
<author>Tomi:</author>
<change type="Changed">Equipment members .maxhp_mod .hp .maxhp and .quality moved to Item<br/>
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</change>
<change type="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</change>
<change type="Fixed">upper limits using the container members .max_items_mod .max_weight_mod and .max_slots_mod<br/>
if max_items &gt;= 3200 it will be set to 3200<br/>
if max_weight &gt;= 65535 it will be set to 65535<br/>
if max_slots &gt;= 255 it will be set to 255</change>
<change type="Note">None of these members can go below zero</change>
</entry>
<entry>
<date>09-02-2013</date>
<author>Tomi:</author>
<change type="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 )</change>
</entry>
<entry>
<date>08-31-2013</date>
<author>Turley</author>
<change type="Fixed">EScript memoryleak (eg myvar[blubb]:=othervar)</change>
</entry>
<entry>
<date>08-28-2013</date>
<author>Tomi ( based on andenixas patch )</author>
<change type="Added">ssopt.MobilesBlockNpcMovement ( default true ) to determine if mobiles block the movement of npcs</change>
<change type="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</change>
</entry>
<entry>
<date>08-27-2013</date>
<author>Nando (patch by andenixa, text adapted from forum post):</author>
<change type="Added">string.format( args ) - formats a string using the data from args<br/>
Accepts the following format:<br/>
{:x} for hex representation<br/>
{:o} for octal<br/>
{:b} for binary<br/>
Add a # to get notation prefix:<br/>
E.g. &quot;{:x}&quot;.format(10) -&gt; &quot;a&quot;<br/>
&quot;{:#x}&quot;.format(10) -&gt; &quot;0xa&quot;<br/>
Parameters can be simple:<br/>
&quot;You have {} gold coins&quot;.format(120) -&gt; &quot;You have 120 gold coins&quot;<br/>
and are unpacked implicitly by their order:<br/>
&quot;{} hits {} for {} of damage&quot;.format(&quot;John&quot;, &quot;Bob&quot;, 120) -&gt; &quot;John hits Bob for 120 of damage&quot;<br/>
However you can specify parameters explicitly (first argument is at 1):<br/>
&quot;You hit {2} for {1} damage&quot;.format(120, &quot;John Doe&quot;) -&gt; &quot;You hit John Doe for 120 damage&quot;<br/>
Format allows accessing object members:<br/>
&quot;Spell {1.spell_name} requires reagents: {1.reagents}&quot;.format(struct{spell_name:=&quot;Fire Wrath&quot;, &quot;Ba, Bm, Ga&quot;})<br/>
-&gt; &quot;Spell Fire Wrath requires reagents: Ba, Bm, Ga&quot;<br/>
Implicit members also work:<br/>
&quot;{name} you hit level {level}&quot;.format(struct{name:=&quot;Jane Doe&quot;, level:=4})<br/>
-&gt; &quot;Jane Doe you hit level 4&quot;<br/>
Character or item members are accessed the same way:<br/>
&quot;{1.name}, your shield {2.desc} has {2.hp} hp&quot;.format(who, who.shield)&quot;<br/>
-&gt; &quot;Admin, your shield Buckler of Death has 150 hp&quot;</change>
</entry>
<entry>
<date>07-27-2013</date>
<author>Tomi:</author>
<change type="Changed">UO::TargetMultiPlacement( character, objtype, flags := 0, xoffset := 0, yoffset := 0, hue := 0 );<br/>
New optional hue parameter to show hued multis which are supprted by clients &gt;= 7.0.9 ( HSA )<br/>
Older clients ignores this option</change>
</entry>
<entry>
<date>06-17-2013</date>
<author>Kevin:</author>
<change type="Fixed">adding missing mysql_close() entry to sql.em</change>
<change type="Fixed">OpenSellWindow() &quot;Buyable&quot; container wasn't actually restricting what entries showed.<br/>
Pass flag VENDOR_BUYABLE_CONTAINER_FILTER to enable this filter.</change>
</entry>
<entry>
<date>05-25-2013</date>
<author>Kevin:</author>
<change type="Fixed">bug in mysql_select_db() returning error on successful calls</change>
<change type="Fixed">adding missing mysql_free_result() entry to sql.em</change>
</entry>
<entry>
<date>02-26-2013</date>
<author>Kevin:</author>
<change type="Fixed">item.SplitStackInto(container,amount,add_to_existing_stack := 1) no longer requires three parameters and will default<br/>
the add_to_existing_stack to 1/true if not present</change>
<change type="Fixed">item.SplitStackInto() with add_to_existing_stack == 1 will re-add the removed-portion of stack back to original item<br/>
if it cannot add to the existing stack (ie, container's caninsert script returns false)</change>
<change type="Changed">item.SplitStackInto() with add_to_existing_stack == 1 will first attempt to add to an existing stack if found, and otherwise<br/>
will create a new stack if no existing stack found. This is similar to how the existing CreateItemInContainer() works</change>
</entry>
<entry>
<date>02-20-2013</date>
<author>Tomi:</author>
<change type="Fixed">When changing graphic of a lightsource item, it now changes correctly the facing too.</change>
<change type="Fixed">Status bar now shows for weapon mindamage ( id.mindamage + dmg_mod ) and for maxdamage ( id.maxdamage + dmg_mod )</change>
</entry>
<entry>
<date>02-17-2013</date>
<author>Tomi:</author>
<change type="Fixed">Changing invul status now updates it for the character itself too, not just all mobiles around</change>
</entry>
<entry>
<date>02-15-2013</date>
<author>Tomi:</author>
<change type="Fixed">item.SplitStackInto method</change>
</entry>
<entry>
<date>01-04-2013</date>
<author>Tomi:</author>
<change type="Added">Syshook CanTrade<br/>
parameters ( character, drop_on_chr, item )</change>
<change type="Note">This syshook runs when dropping an item on a character or when trying to add an item to a tradewindow</change>
</entry>
<entry>
<date>12-15-2012</date>
<author>Tomi:</author>
<change type="Fixed">Items now get their facing from tiledata flag if no itemdesc entry is found<br/>
This fixes wrong lightsources for items such as lampposts</change>
</entry>
<entry>
<date>12-08-2012</date>
<author>Tomi:</author>
<change type="Fixed">Typo in uo.em with new LISTEX flags</change>
<change type="Added">const REALM_BRITANNIA_ALT to uo.em</change>
</entry>
<entry>
<date>12-05-2012</date>
<author>Tomi:</author>
<change type="Added">Pol now send on invul/murderer status changed for &gt;= KR Clients packet 0x17 to get Yellow or Red color health bars</change>
<change type="Changed">UO:ListMobilesNearLocationEx added 2 new flags LISTEX_FLAG_PLAYERS_ONLY and LISTEX_FLAG_NPC_ONLY</change>
<change type="Changed">combat.cfg option &quot;SendAttackmsg&quot; to &quot;SendAttackMsg&quot; to match cases of other options</change>
<change type="Fixed">UO:MoveItemToContainer doesnt crash anymore when using add_to_exisitng stack parameter</change>
<change type="Fixed">item methods .SplitStackAt and .SplitStackInto doesnt crash Pol anymore when using add_to_existing_stack parameter</change>
</entry>
<entry>
<date>11-16-2012</date>
<author>Turley:</author>
<change type="Added">string methods:<br/>
str.length() : returns like len(str) the length of the string<br/>
str.upper() : returns like upper(str) the uppercase version and also modifies the str<br/>
str.lower() : returns like lower(str) the lowercase version and also modifies the str<br/>
str.find(Search,[Start]) : returns like Find(string, search, start) the index of the first occurance of 'search' after 'start' within str<br/>
but unlike the basic.em function the Start parameter is optional if not given it searches the whole string<br/>
str.join(array) : returns a string which is the concatenation of the array elements, seperated by str</change>
</entry>
<entry>
<date>11-14-2012</date>
<author>Turley:</author>
<change type="Changed">SplitWords( str, delimiter := &quot; &quot;, max_split := -1 )<br/>
it has now an additional parameter max_split, if given it limits the number of times that a string will be split</change>
<change type="default">-1 no limit<br/>
(Patch submitted by andenixa)</change>
<change type="Added">ecompile its now possible to override through the cmdline<br/>
GenerateDependencyInfo entry with &quot;-D-&quot;<br/>
GenerateDebugInfo entry with &quot;-x-&quot;</change>
</entry>
<entry>
<date>11-10-2012</date>
<author>Turley:</author>
<change type="Added">uoclient.cfg Listener property &quot;KeepClients&quot; 1/0 default 0<br/>
if set to 1 clients keep this listener port even after different gameserver select</change>
<change type="Note">actually 1 is the old behaviour and 0 the old behaviour of pol.cfg ListenPort</change>
<change type="Added">pol.cfg &quot;UseSingleThreadLogin&quot; 1/0 default 0<br/>
if set all prelogin clients are handled inside the listener thread and not inside an extra thread<br/>
this will reduce the amount of thread creates and destroys</change>
</entry>
<entry>
<date>10-14-2012</date>
<author>Tomi:</author>
<change type="Added">SystemHook &quot;WarmodeChange&quot; called when a character changes warmode status either by member .warmode or by clicking the warmode button on the paperdoll<br/>
Params CharRef and new_warmode_status<br/>
Return value is ignored</change>
</entry>
<entry>
<date>10-09-2012</date>
<author>Tomi:</author>
<change type="Fixed">packet 0x17 ( poison health bar packet ) was sending 2 bytes with wrong endian when sending to nearby clients</change>
</entry>
<entry>
<date>10-08-2012</date>
<author>Turley:</author>
<change type="Fixed">secured Shadowrealm delete, it will now iterate through all StorageArea Items and check if old shadowrealm property exists</change>
</entry>
<entry>
<date>10-06-2012</date>
<author>Tomi:</author>
<change type="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.</change>
</entry>
<entry>
<date>10-05-2012</date>
<author>Turley:</author>
<change type="Added">ecompile parameter -wP</change>
<change type="Added">ecompile.cfg entry ParanoiaWarnings</change>
<change type="Note">since &quot;{}&quot; is valid syntax, only complain about it if ParanoiaWarnings is enabled</change>
</entry>
<entry>
<date>09-29-2012</date>
<author>Turley:</author>
<change type="Added">ecompile parameter -T</change>
<change type="Added">ecompile.cfg entry ThreadedCompilation</change>
<change type="Note">if set will use openmp for parallel compilation</change>
</entry>
<entry>
<date>09-25-2012</date>
<author>Kevin:</author>
<change type="Fixed">Guild and alliance messages no longer send as regular speech messages. They are sent to all guild or alliance members online.</change>
<change type="Added">servspecopt.cfg CoreGuildMessages=0/1 default 1 to determine if core should handle guild and alliance messages.</change>
</entry>
<entry>
<date>08-29-2012</date>
<author>Turley:</author>
<change type="Fixed">Crash if a attached script kills the attached npc</change>
</entry>
<entry>
<date>08-27-2012</date>
<author>Tomi:</author>
<change type="Changed">MoveItemToContainer( item, container, x := -1, y := -1 ); to MoveItemToContainer( item, container, x := -1, y := -1, add_to_existing_stack := 0 );</change>
<change type="Changed">item.SplitStackInto( container, amount ) to item.SplitStackInto( container, amount, add_to_existing_stack := 0 )</change>
<change type="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 )<br/>
If add_to_existing_stack == 1 and there is no stack in the container, it will return Error &quot;There is no existing stack&quot;, so its up to scripts to check this.</change>
<change type="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.</change>
</entry>
<entry>
<date>08-26-2012</date>
<author>Nando:</author>
<change type="Removed">Support for ListenPort in pol.cfg when Multithread is activated. Everyone should<br/>
be using uoclients.cfg by now!</change>
</entry>
<entry>
<date>08-01-2012</date>
<author>Kevin:</author>
<change type="Added">R/W member carrying_capacity_mod for mobiles to modify carrying capacity on a<br/>
mobile-per-mobile basis. Is taken into account prior to global ssopt modifier.</change>
</entry>
<entry>
<date>08-01-2012</date>
<author>Kevin:</author>
<change type="Added">osmod::Debugger() to put current script in debug state to be attached by external<br/>
debugging application</change>
<change type="Added">stacktrace debug command to print stacktrace. Displays:<br/>
&lt;size of stack&gt;<br/>
foreach stack element:<br/>
&lt;program counter&gt;<br/>
&lt;file number&gt;<br/>
&lt;line number&gt;<br/>
&lt;number of local variables&gt;<br/>
foreach local variable:<br/>
&lt;variable name&gt; &lt;packed value&gt;</change>
</entry>
<entry>
<date>07-12-2012</date>
<author>Tomi:</author>
<change type="Added">combat.cfg entry &quot;SendAttackMsg&quot; values 0/1 defaults to 1<br/>
setting this to 0 stops the core repsys system sending &quot;is attacking you&quot; messages.</change>
</entry>
<entry>
<date>06-03-2012</date>
<author>Tomi:</author>
<change type="Added">Readonly members .active_skill and .casting_spell for characters<br/>
return values 0/1 if character has an active attached skill or spell script</change>
</entry>
<entry>
<date>05-01-2012</date>
<author>Tomi:</author>
<change type="Fixed">On equipped items .resist_*_mod members did not update character status window when changed<br/>
Patch submitted by Agata</change>
</entry>
<entry>
<date>04-15-2012</date>
<author>Tomi:</author>
<change type="Added">R/W member editable 0/1 for maps</change>
</entry>
<entry>
<date>04-14-2012</date>
<author>Tomi:</author>
<change type="Added">Support for new map message packet 0xF5 for clients 7.0.13+<br/>
This packet supports the new facetXX.mul files and now can use every different realm for cartography maps and sea charts.</change>
<change type="Added">r/w member .facetid for Maps<br/>
This has actually nothing to do with realms, the value is the same as in FacetXX.mul file</change>
</entry>
<entry>
<date>04-06-2012</date>
<author>Tomi:</author>
<change type="Fixed">Roof problem at 4th floor on a custom house.<br/>
Patch submitted by Agata</change>
<change type="Added">Packet 0xD6 to be ignored for activity ( fixes inactivity logout for ML+ )<br/>
Patch submitted by OWHorus</change>
</entry>
<entry>
<date>04-05-2012</date>
<author>Kevin:</author>
<change type="Added">ecompile.cfg directive &quot;ErrorOnWarning&quot; and ecompile switch -y to treat warnings<br/>
on errors during ecompile. Default is 'false'</change>
<change type="Fixed">various locations were showing warnings even without the -w switch provided.</change>
</entry>
<entry>
<date>03-26-2012</date>
<author>Tomi:</author>
<change type="Added">character readonly member .lastcoord returns struct{.lastx, .lasty, .lastz}</change>
</entry>
<entry>
<date>03-09-2012</date>
<author>Tomi:</author>
<change type="Fixed">uo::SendInstaResDialog() was sending wrong packet</change>
</entry>
<entry>
<date>03-07-2012</date>
<author>Tomi:</author>
<change type="Added">scripts/misc/dblclickitem.ecl to run a script on every double click on items.<br/>
params are (mobile, item)<br/>
usefull for removing meditation stuff and such in 1 place instead of every script.</change>
<change type="Note">this script will not be attached to the mobile and will run before any usescript.</change>
</entry>
<entry>
<date>02-08-2012</date>
<author>Tomi:</author>
<change type="Added">character readonly member .tradewindow<br/>
return ContainerRef if the char has an active trade and error if no active trade</change>
</entry>
<entry>
<date>02-06-2012</date>
<author>MuadDib:</author>
<change type="Fixed">Added orphan checks in Character::get_from_ground for both passed serial and items it itr through. Proper logging, returns, and<br/>
continue used to keep from attempting movement of orphaned items after log report.</change>
</entry>
<entry>
<date>02-05-2012</date>
<author>Tomi:</author>
<change type="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.</change>
<change type="Changed">AR in ArmorDescs defaults to 0.</change>
</entry>
<entry>
<date>02-02-2012</date>
<author>Tomi:</author>
<change type="Added">Readonly member .multiid for boats and houses</change>
<change type="Fixed">Old boats didnt read the components correctly on server restart</change>
</entry>
<entry>
<date>01-21-2012</date>
<author>Tomi:</author>
<change type="Removed">Graphic from multis, no graphic entry needed for multis in itemdescs anymore, uoconvert doesnt add a graphic value to multis anymore.</change>
<change type="Added">MultiID entry to boats.cfg instead of the ObjType.</change>
<change type="Changed">Multi itemdescs now require MultiID to be defined for each multi.</change>
<change type="Note">Multi objtypes still need to be &gt; MaxTileID from pol.cfg<br/>
Example of a multi entry in itemdesc<br/>
Boat 0x10000<br/>
{<br/>
Name SmallBoatN<br/>
MultiID 0x0<br/>
}</change>
<change type="Added">boats.cfg is now shipped with the core too with boats up to date with HSA so just remove what you dont use.</change>
<change type="Note">Reconvert of multis.cfg with UOConvert needed<br/>
Make sure you have a itemdesc entry for every boat direction</change>
</entry>
<entry>
<date>01-21-2012</date>
<author>Turley:</author>
<change type="Fixed">RequestInputUC() for eg russian chars</change>
</entry>
<entry>
<date>01-16-2012</date>
<author>Turley:</author>
<change type="Changed">SpeedUp for uoconvert</change>
</entry>
<entry>
<date>01-14-2012</date>
<author>Turley:</author>
<change type="Changed">UnicodespeechEvent additional Member &quot;tokens&quot; if speech has (speech.mul) Tokens, gives array of spoken TokenIDs</change>
<change type="Added">servspecopt.cfg SeperateSpeechTokens=1/0 default 0 when set RegisterForSpeechEvents() and EnableEvents/DisableEvents behave different</change>
<change type="Added">uo:RegisterForSpeechEvents Flags LISTENPT_HEAR_TOKENS,LISTENPT_NO_SPEECH</change>
<change type="Added">SYSEVENT_TOKEN_SPEECH:=0x4000 and SYSEVENT_TOKEN_GHOST_SPEECH:=0x8000 for uo:EnableEvents/DisableEvents</change>
<change type="Note">if SeperateSpeechTokens is set you can control which events you get,<br/>
for NPCs you only get speech with tokens if you set SYSEVENT_TOKEN_SPEECH/SYSEVENT_TOKEN_GHOST_SPEECH<br/>
and non Token speech with SYSEVENT_SPEECH,SYSEVENT_GHOST_SPEECH<br/>
for RegisterForSpeechEvents() you get speech with and without Tokens when setting LISTENPT_HEAR_TOKENS and no speech without Tokens<br/>
setting LISTENPT_NO_SPEECH</change>
<change type="Note">Token and nonToken Eventtype is still the same (SYSEVENT_SPEECH)</change>
</entry>
<entry>
<date>01-03-2012</date>
<author>Turley:</author>
<change type="Changed">major rewrite of primitive operators +,-,*,/,...<br/>
major speedup of +=,-=,...</change>
<change type="Added">finally support for +=,-=,*=,/=,%= with objectmembers, like who.resist_fire_mod+=1</change>
<change type="Note">if member would return UnInit or Error it does nothing<br/>
so its like (only faster and atomic):<br/>
var temp:=who.resist_fire_mod;<br/>
if (!(TypeOfInt(temp) in {OT_UNINIT,OT_ERROR}))<br/>
temp+=1;<br/>
who.resist_fire_mod:=temp;<br/>
endif</change>
</entry>
<entry>
<date>01-02-2012</date>
<author>Turley:</author>
<change type="Added">XMLFile/XMLNode.removexmlnode(int value)<br/>
removes node of given index<br/>
XMLFile/XMLNode.removexmlnode(XmlNode node)<br/>
removes given node<br/>
XmlNode.clonenode()<br/>
since all NodeObjects get destroyed when the corresponding XmlFileObject is destroyed, use this method to store a node for later use.</change>
</entry>
<entry>
<date>12-18-2011</date>
<author>Nando:</author>
<change type="Changed">internal handling of intrinsic weapons' unload.</change>
<change type="Removed">INTRINSIC property from Weapon template in itemdesc.cfg. An error occurs<br/>
if it's set. Some shards might have forgot to set it, which would cause<br/>
damage to intrinsic wrestling weapon. This is now handled automatically.</change>
</entry>
<entry>
<date>12-17-2011</date>
<author>Nando:</author>
<change type="Changed">boats.cfg entries are now &quot;Name Graphic X Y &lt;Z&gt;&quot;, where Z is optional and<br/>
defaults to zero.</change>
</entry>
<entry>
<date>12-17-2011</date>
<author>Tomi:</author>
<change type="Added">Support for hued boats, use the normal .color r/w member to change the hue<br/>
Patch Submitted by Agata</change>
</entry>
<entry>
<date>12-14-2011</date>
<author>Tomi:</author>
<change type="Changed">objtype vectors changed to maps to only reserve as much memory as there are<br/>
itemdesc entries, not reserving memory for up to 4 billions of objtypes.</change>
<change type="Changed">boats.cfg entries changed from &quot;Name Graphic X Y&quot; to &quot;Name Graphic X Y Z&quot;<br/>
because some of the new boat components requires different Z levels than the boat<br/>
itself.</change>
</entry>
<entry>
<date>12-13-2011</date>
<author>Austin:</author>
<change type="Added">Support for destroy scripts on multis.</change>
</entry>
<entry>
<date>12-13-2011</date>
<author>Tomi:</author>
<change type="Added">Support for HSA boats ( no smooth move yet, but now all boats are usable )</change>
<change type="Changed">boat.cfg to support new entries &quot;Rope&quot;, &quot;Wheel&quot;, &quot;Hull&quot;, &quot;Tiller&quot;, &quot;Rudder&quot;, &quot;Sails&quot;, &quot;Storage&quot;, &quot;Weaponslot&quot;<br/>
there can be more than 1 of each entry<br/>
the old entries &quot;Tillerman&quot;, &quot;Hold&quot;, &quot;PortGangplankExtended&quot;, &quot;PortGangplankRetracted&quot;, &quot;StarboarGangplankExtended&quot;, &quot;StarboardGangplankRetracted&quot; support just 1 entry each or the boat members get broken</change>
<change type="Added">ReadOnly members for boats<br/>
.components returns an array of ItemRefs of all the components on the boat<br/>
.hull returns an array of ItemRefs of all the hull components on the boat, or empty array if none.<br/>
.rope returns an array of ItemRefs of all the rope components on the boat, or empty array if none.<br/>
.wheel returns an array of ItemRefs of all the wheel components on the boat, or empty array if none.<br/>
.rudder returns an array of ItemRefs of all the rudder components on the boat, or empty array if none.<br/>
.tiller returns an array of ItemRefs of all the tiller components on the boat, or empty array if none.<br/>
.sails returns an array of ItemRefs of all the sails components on the boat, or empty array if none.<br/>
.storage returns an array of ItemRefs of all the storage components on the boat, or empty array if none.<br/>
.weaponslot returns an array of ItemRefs of all the weaponslot components on the boat, or empty array if none.<br/>
Changed extobj.cfg to support new entries for all the new boat component types and changed the default value of all entries.<br/>
extobj.cfg entries with default values:<br/>
Tillerman=0x1F010<br/>
Port_Plank=0x1F011<br/>
Starboard_Plank=0x1F012<br/>
Hold=0x1F013<br/>
Rope=0x1F014<br/>
Wheel=0x1F015<br/>
Hull=0x1F016<br/>
Tiller=0x1F017<br/>
Rudder=0x1F018<br/>
Sails=0x1F019<br/>
Storage=0x1F01A<br/>
Weaponslot=0x1F01B<br/>
Wrestling=0x1F020<br/>
Mount=0x1F021<br/>
Secure_Trade_Container=0x1FF01<br/>
Wornitems_Container=0x1FF02</change>
<change type="Note">extobj entries just let you define the objtypes, all of these still have to be defined in itemdescs for boats to work correctly.<br/>
extobj.cfg is now shipped with the core.</change>
</entry>
<entry>
<date>12-05-2011</date>
<author>Tomi:</author>
<change type="Fixed">Door methods .open() and .close() were working opposite what they should.</change>
</entry>
<entry>
<date>12-04-2011</date>
<author>Tomi:</author>
<change type="Fixed">EA broke the prof.txt with the latest clients adding &quot;Evaluating Intelligence&quot; and &quot;Spirit Speak&quot; with spaces that resulted into skillnumber 0xFF and skillvalue 0</change>
<change type="Added">UO::UpdateItem( item );<br/>
updates the item to every client in range, good to use for example after returning 1 in some packethook and the item get invisible.</change>
</entry>
<entry>
<date>12-01-2011</date>
<author>Nando:</author>
<change type="Fixed">Client hanging after having his connection refused on login. I recommend testing<br/>
different ways of having a client disconnected, like acct.disable(), .ban() and others.</change>
</entry>
<entry>
<date>12-01-2011</date>
<author>MuadDib:</author>
<change type="Changed">UoClientGeneral.maxskills changed to unsigned short. Few places in loops with it changed to use same for the loop counter.</change>
</entry>
<entry>
<date>11-30-2011</date>
<author>Tomi:</author>
<change type="Fixed">Old style spellbooks.</change>
</entry>
<entry>
<date>11-29-2011</date>
<author>MuadDib:</author>
<change type="Fixed">Fixed a script breaker caused by inserting new TypeOfInt() constants in the middle of the Enum. Moved SQL Types to end of list.</change>
<change type="Added">Added SQL entries to the Basic.EM since were missing.</change>
</entry>
<entry>
<date>11-29-2011</date>
<author>Tomi:</author>
<change type="Added">Opengraphic itemdesc entry for Doors ( optional parameter, no need to define if you dont want to use the built in methods )</change>
<change type="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 &amp; 0x1.<br/>
this makes those methods works for new doors too and not only T2A era doors.</change>
<change type="Changed">basic::CChrz( intarray ) to basic::CChrz( intarray, break_at_first_null := 0 );<br/>
if the break_at_first_null parameter is 0 it uses the old behaviour to just skip the nulls and still convert everything<br/>
if the break_at_first_null parameter is set to 1 it stops the conversion to string at the first null it finds.</change>
<change type="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</change>
</entry>
<entry>
<date>11-28-2011</date>
<author>MuadDib:</author>
<change type="Removed">UObject-&gt;Color_Ext : Removed, and when used is replaced with ctBEu16() calls. This includes read/write of /data files.</change>
<change type="Removed">Last of any UOX references for imports. Most was all commented, a few empty refences was also left. All now removed completely.</change>
</entry>
<entry>
<date>11-27-2011</date>
<author>MuadDib:</author>
<change type="Removed">UObject-&gt;Graphic_Ext : Removed, and when used is replaced with ctBEu16() calls. This includes read/write of /data files.</change>
<change type="Note">UObject-&gt;Serial_Ext will not be removed as previously considered, due to the orphan system making primary use of this.</change>
</entry>
<entry>
<date>11-27-2011</date>
<author>Nando:</author>
<change type="Fixed">corrected memory leak in cfgfile::GetConfigStringDictionary(...)</change>
</entry>
<entry>
<date>11-26-2011</date>
<author>Tomi:</author>
<change type="Changed">CascZ( str ) to CascZ( str, nullterm := 0 )<br/>
if nullterm 1 it adds the terminating 0 in the end of array.</change>
<change type="Note">Recompile of scripts needed.</change>
</entry>
<entry>
<date>11-24-2011</date>
<author>Tomi:</author>
<change type="Added">Support for Mysticism and BardMasteries spell books<br/>
Mysticism Spell ID's 678 -&gt; 693 and BardMasteries spell ID's 701+</change>
</entry>
<entry>
<date>11-23-2011</date>
<author>Tomi:</author>
<change type="Added">can_insert and on_insert scripts for Tradewindows</change>
</entry>
<entry>
<date>11-22-2011</date>
<author>Kevin:</author>
<change type="Added">pol/sqlscrobj.cpp pol/sqlscrobj.h</change>
<change type="Changed">pol/module/sqlmod.cpp pol/module/sqlmod.h<br/>
Add preliminary MySQL database support.<br/>
New eScript objects: BSQLConnection, BSQLResultSet, BSQLRow<br/>
Added several new sql module functions:<br/>
mysql_connect(host,username,password);<br/>
mysql_query(connection,query);<br/>
mysql_fetch_row(result);<br/>
mysql_affected_rows(result);<br/>
mysql_num_fields(result);<br/>
mysql_num_rows(result);<br/>
mysql_select_db(connection,database);<br/>
mysql_field_name(result,column_index);<br/>
mysql_free_result(result);<br/>
mysql_close(connection);<br/>
In order to build with MySQL support, define the HAVE_MYSQL preprocessor directive in your build configuration.<br/>
You must have the MySQL headers and libraries installed.<br/>
Only really tested with dynamically linking mysql libraries on Linux.</change>
<change type="Added">pol/network/auxclient.h</change>
<change type="Changed">pol/network/auxclient.cpp pol/module/osmod.cpp pol/module/osmod.h clib/socketsvc.cpp clib/socketsvc.h<br/>
Moved AuxClient-related classes to its own header file (shared between auxclient.cpp and osmod.cpp)<br/>
Implemented os::OpenConnection() to create outgoing TCP/IP connections.</change>
<change type="Changed">runecl/runecl.cpp<br/>
Added the sql module to runecl to allow quick testing</change>
<change type="Changed">pol/uoscrobj.cpp pol/mobile/charactr.cpp pol/mobile/character.h bscript/parser.cpp bscript/objmembers.h<br/>
Added read/write property &quot;mountedsteps&quot; for mobiles. Represents number of steps taken while character was mounted.</change>
<change type="Changed">bscript/parser.cpp<br/>
Declaring an array only using &quot;{}&quot; will show a compiler warning; please explicitly state 'array', 'struct', or 'dictionary'</change>
<change type="Changed">pol/pol.cpp<br/>
If using Linux, remove pol.pid on shutdown of pol.</change>
<change type="Changed">pol/uoexec.h pol/scrsched.cpp<br/>
Added script option &quot;AUXSVC_ASSUME_STRING&quot; which will allow aux service connections to send and receive non-packed strings.</change>
<change type="Changed">ecompile/ecompile.cpp<br/>
If using Linux, a slash (&quot;/&quot;) cannot be used to define ecompile options to allow support for absolute filenames.</change>
<change type="Changed">bscript/object.cpp bscript/bobject.h<br/>
Implemented array operation MultiSubscript. Will return a splice of an array, eg:<br/>
array{&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;,&quot;e&quot;}[2,4] will return array{&quot;b&quot;,&quot;c&quot;,&quot;d&quot;}</change>
</entry>
<entry>
<date>11-12-2011</date>
<author>Tomi:</author>
<change type="Added">Pol/config/extobj.cfg<br/>
Values it accept now and default values are<br/>
Tillerman=0xF010<br/>
Port_Plank=0xF011<br/>
Starboard_Plank=0xF012<br/>
Hold=0xF013<br/>
Wrestling=0xF020<br/>
Mount=0xF021<br/>
Secure_Trade_Container=0xFF01<br/>
Wornitems_Container=0xFF02</change>
<change type="Note">These values HAVE TO BE &gt; pol.cfg max_tile_id and the same as objtype for them in itemdescs</change>
<change type="Added">UOExpansion HSA server sends now 0x387DF</change>
</entry>
<entry>
<date>11-11-2011</date>
<author>Tomi:</author>
<change type="Changed">Objtypes are now from 2 up to max_objtype from pol.cfg</change>
<change type="Note">if objtypes &lt;= pol.cfg max_tile_id and no graphic defined in itemdesc Pol uses objtype as graphic.<br/>
Multis and custom items should all be moved to &gt; pol.cfg max_tile_id</change>
<change type="Added">support for new 0xA9 packet for clients &gt;= 7.0.13.0</change>
<change type="Changed">startlocs.cfg default values for MapID ( 0 ) and Cliloc ( 1075072 which is the Yew town information )<br/>
Example:<br/>
StartingLocation Yew<br/>
{<br/>
City Yew<br/>
Description Town Center<br/>
Coordinate 535,992,0<br/>
MapID 0<br/>
Cliloc 1075072<br/>
}</change>
<change type="Note">MapID is the same number as in mapX.mul files<br/>
Cliloc values are the description of the start locations<br/>
Newest clients has max stats during char creation 90</change>
</entry>
<entry>
<date>11-06-2011</date>
<author>Tomi:</author>
<change type="Added">pol.cfg setting MaxObjtype &lt;default 0x20000&gt;</change>
<change type="Note">can be any value between 0x20000 and 0xFFFFFFFF</change>
</entry>
<entry>
<date>10-26-2011</date>
<author>Tomi:</author>
<change type="Added">support for clients &gt;= 7.0.16.0 ( 2D ) char create packet 0xF8<br/>
Enchanced clients still use packet 0x8D</change>
</entry>
<entry>
<date>10-15-2011</date>
<author>Austin:</author>
<change type="Added">.doubleclickrange for items (read only).</change>
</entry>
<entry>
<date>09-03-2011</date>
<author>Turley:</author>
<change type="Added">DestroyMulti(house) returns error &quot;House currently being customized.&quot;</change>
<change type="Added">house.cancelediting(chr, drop_changes) will stop editing mode.<br/>
drop_changes 1/0 if true drops all non committed changes</change>
<change type="Errors">&quot;House is not custom&quot;,&quot;House is currently not been edited&quot;,&quot;Character is not editing this house&quot;</change>
<change type="Added">Syshook CloseCustomHouse(mobile, house)<br/>
called after client quits editing, or when house.cancelediting() is called<br/>
return value is ignored</change>
<change type="Added">servspecopt.cfg<br/>
&quot;SpeedHack_MountRunDelay&quot; default 80 ms<br/>
&quot;SpeedHack_MountWalkDelay&quot; default 180 ms<br/>
&quot;SpeedHack_FootRunDelay&quot; default 180 ms<br/>
&quot;SpeedHack_FootWalkDelay&quot; default 380 ms<br/>
Change them on your own risk</change>
</entry>
<entry>
<date>08-08-2011</date>
<author>Austin:</author>
<change type="Added">servspecopt.cfg flag &quot;ScriptedMerchantHandlers&quot; default is 0 which results in no change in behavior.<br/>
If enabled, the below change will come into effect:</change>
<change type="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.<br/>
When the event for EVID_MERCHANT_SOLD and EVID_MERCHANT_BOUGHT is sent it will be a struct containing the following struct:<br/>
struct.type = EVID_MERCHANT_SOLD or EVID_MERCHANT_BOUGHT<br/>
struct.source = player buying<br/>
struct.shoppinglist = array( struct.item, struct.amount )<br/>
The shopping list items will still be items in the merchant's container.<br/>
It is up to the script to split the items from the stacks there and move them to the player's pack.<br/>
It is also up to the script to handle gold checks and consumption.</change>
<change type="Added">item.SplitStackInto(container, amount)<br/>
Will split the item into 2 stacks. Returns a reference to the new stack made from item. Places new stack into the container.</change>
<change type="Added">item.SplitStackAt(x, y, z, realm, amount)<br/>
Will split the item into 2 stacks. Returns a reference to the new stack made from item. Places new stack at the coordinates.</change>
</entry>
<entry>
<date>05-19-2011</date>
<author>Turley:</author>
<change type="Added">CustomHousing Support (beta)<br/>
officially added uo::SendHousingTool( who, house );</change>
<change type="Added">script call of &quot;scripts/misc/customhousecommit.ecl&quot; on commit (noncritical)</change>
<change type="params">( who, house, houseelemarray )<br/>
houseelem = struct{graphic,xoffset,yoffset,z}<br/>
to get the real coords from an elem add house.x/y<br/>
called after client presses the commit button<br/>
to accept the changes call new method house.acceptcommit(chr,1) or house.acceptcommit(chr,0) to drop the commit<br/>
main purpose should be calculation of cost (with delta support for later changes),<br/>
link establishing of houseteleporters (0x181D - 0x1828)<br/>
and adding a signhanger/sign if you didnt added it during multifoundation buildup<br/>
Doors and Teleporters are added to house components as normal items without any special treatment<br/>
so dont forget to add scripts/itemdesc entries</change>
<change type="Added">member multi.house_parts<br/>
returns array of structs{graphic,xoffset,yoffset,z} or error if not a custom house, or currently been edited<br/>
to get the real coords from an elem add house.x/y</change>
<change type="Added">method multi.addhousepart(graphic,xoffset,yoffset,z) returns true or error</change>
<change type="Added">method multi.erasehousepart(graphic,xoffset,yoffset,z) returns true or error</change>
<change type="Added">members multi.house_editing / who.house_editing returns true if house is currently been edited / who is currently editing</change>
<change type="Note">house.setcustom(1) is needed before SendHousingTool() works</change>
<change type="Note">during editing chr is only allowed to walk inside the house<br/>
all components which are not invisible get removed from component list during edit and added to design<br/>
(not invisible to give the chance to eg protect a house sign from been removed from the editing char)<br/>
any item inside the house will be invisible for the chr<br/>
any other mobiles get moved outside the house</change>
<change type="Note">param houseelemarray in script call is the current list of houseparts,<br/>
multi.house_parts gives you the last stored list</change>
<change type="Note">until no house.acceptcommit() is called and start of commitscript no new SendHousingTool() for this house is allowed</change>
</entry>
<entry>
<date>05-04-2011</date>
<author>Turley:</author>
<change type="Fixed">Questarrow packet</change>
</entry>
<entry>
<date>04-30-2011</date>
<author>Turley:</author>
<change type="Fixed">enter/leave-events for NPCs (OWHorus)</change>
<change type="Fixed">diagonal moves in npc::CanMove() and uo::FindPath() (OWHorus)</change>
</entry>
<entry>
<date>04-03-2011</date>
<author>Turley:</author>
<change type="Added">uotool param checkmultis<br/>
prints infos about used center item</change>
</entry>
<entry>
<date>03-12-2011</date>
<author>Turley:</author>
<change type="Fixed">npc:SayUC() sends SpeechEvent for do_event==SAY_DOEVENT_ENABLE</change>
<change type="Changed">removed warning &quot;No handler for skill..&quot; and changed sysmsg to &quot;That skill cannot be used directly.&quot;<br/>
since most of the time the behaviour is wanted</change>
<change type="Added">basic::TypeOfInt( expr ) + basic.em constants<br/>
returns like TypeOf() the type of given parameter, but returns instead of a string an integer (see basic.em constants)<br/>
since integer comparison are way faster then string comparison this function should always be used for comparisons</change>
</entry>
<entry>
<date>03-10-2011</date>
<author>Turley:</author>
<change type="Added">pol.cfg AccountDataSave (default -1)<br/>
Values:<br/>
-1 : old behaviour, saves accounts.txt immediately after an account change<br/>
0 : saves only during worldsave (if needed)<br/>
&gt;0 : saves every X seconds and during worldsave (if needed)</change>
</entry>
<entry>
<date>02-15-2011</date>
<author>Turley:</author>
<change type="Changed">&quot;in&quot; keyword now returns the arrayindex or 0 if no match was found</change>
</entry>
<entry>
<date>02-05-2011</date>
<author>Turley:</author>
<change type="Fixed">no exception will be thrown if region enter/leavescript doesnt exist</change>
<change type="Fixed">windows trayicon</change>
</entry>
<entry>
<date>10-22-2010</date>
<author>Turley:</author>
<change type="Fixed">UOHSA packet changes</change>
<change type="Added">mobile.clienttype / client.clienttype HSA flag 0x200</change>
</entry>
<entry>
<date>09-06-2010</date>
<author>Turley:</author>
<change type="Added">TinyXML based xml reading/writing</change>
<change type="Added">file::OpenXMLFile(filename)<br/>
opens given filename and returns XMLFile object<br/>
fileaccess.cfg is checked<br/>
file::CreateXMLFile()<br/>
creates an empty XMLFile object<br/>
XMLFile.setxmldeclaration(string version, string encoding, string standalone)<br/>
sets xmldeclaration eg &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot; ?&gt;<br/>
XMLFile.appendxmlnode(string value, struct{attributes})<br/>
appends Node with name value and given attributes (key=name, value=value)<br/>
XMLFile.appendxmlcomment(string value)<br/>
appends Comment<br/>
XMLFile.removexmlnode(string value)<br/>
removes first node of given value<br/>
XMLFile.savexml(string filename)<br/>
saves to filename<br/>
fileaccess.cfg is checked<br/>
XMLFile.xmltostring([string indent])<br/>
returns the xml file as String with given indent string {default &quot;\t&quot;}<br/>
XMLFile[string] returns first node of given name<br/>
XMLFile[integer] returns node of given index (1-based)</change>
<change type="Added">XMLNode object<br/>
XMLNode.attributes<br/>
returns XMLAttributes object<br/>
XMLNode.type<br/>
returns type string<br/>
(XMLComment, XMLDeclaration, XMLDocument, XMLElement, XMLText, XMLTypeCount, XMLUnknown)<br/>
XMLNode.firstxmlchild([string value])<br/>
returns first child or first child of given name<br/>
XMLNode.nextxmlsibling([string value])<br/>
returns next sibling, or next sibling of given name<br/>
XMLNode.appendxmlnode(string value, struct{attributes})<br/>
appends Node with name value and given attributes (key=name, value=value)<br/>
XMLNode.appendxmlcomment(string value)<br/>
appends Comment<br/>
XMLNode.setxmlattribute(struct{attributes})<br/>
sets attributes for node<br/>
XMLNode.removexmlattribute(string key)<br/>
removes attribute of given key<br/>
XMLNode.removexmlnode(string value)<br/>
removes first node of given value<br/>
XMLNode.appendxmltext(string text)<br/>
appends text to node<br/>
XMLNode[string] returns first node of given name<br/>
XMLNode[integer] returns node of given index (1-based)</change>
<change type="Added">XMLAttributes object<br/>
XMLAttributes.propnames()<br/>
returns Array of all attribute names<br/>
XMLAttributes[string] returns value of given attribute name</change>
<change type="Added">foreach loop support:<br/>
XMLFile, XMLNode: iterates over all child Nodes<br/>
iterator is XMLNode object, &quot;_iterator_iter&quot; is integer index</change>
<change type="XMlAttributes">iterates over all attributes<br/>
iterator is a struct with key=attributename, value=attributevalue<br/>
&quot;_iterator_iter&quot; is integer index</change>
<change type="Note">small examples:<br/>
one way to read an xml file:<br/>
&lt;?xml version=&quot;1.0&quot; ?&gt;<br/>
&lt;root&gt;<br/>
&lt;Hello&gt;World&lt;/Hello&gt;<br/>
&lt;!--Comment--&gt;<br/>
&lt;nodetwo i=&quot;1&quot; /&gt;<br/>
&lt;/root&gt;<br/>
var file:=OpenXMLFile(&quot;helloworld.xml&quot;);<br/>
parsenode(file,&quot;&quot;);<br/>
function parsenode(node,i)<br/>
foreach blubb in node<br/>
syslog(i+cstr(blubb)+&quot; [&quot;+blubb.type+&quot;] (&quot;+cstr(_blubb_iter)+&quot;)&quot;);<br/>
parseattrib(blubb,i+&quot;-&quot;);<br/>
parsenode(blubb,i+&quot; &quot;);<br/>
endforeach<br/>
endfunction<br/>
function parseattrib(node,i)<br/>
foreach ele in (node.attributes)<br/>
syslog(i+cstr(ele)+&quot; (&quot;+_ele_iter+&quot;)&quot;);<br/>
endforeach<br/>
endfunction<br/>
one way how to create such an file:<br/>
var file:=CreateXMLFile();<br/>
file.setxmldeclaration(&quot;1.0&quot;,&quot;&quot;,&quot;&quot;);<br/>
file.appendxmlnode(&quot;root&quot;);<br/>
file[&quot;root&quot;].appendxmlnode(&quot;Hello&quot;);<br/>
file[&quot;root&quot;][&quot;Hello&quot;].appendxmltext(&quot;World&quot;);<br/>
file[&quot;root&quot;].appendxmlcomment(&quot;Comment&quot;);<br/>
file[&quot;root&quot;].appendxmlnode(&quot;nodetwo&quot;,struct{i:=1});<br/>
file.savexml(&quot;helloworld.xml&quot;);</change>
</entry>
<entry>
<date>08-20-2010</date>
<author>Turley:</author>
<change type="Fixed">util:StrFormatTime() checks if format string is correct and if not returns &quot;Invalid Format String.&quot; error<br/>
instead of server crash</change>
</entry>
<entry>
<date>08-09-2010</date>
<author>Turley:</author>
<change type="Fixed">exported function calls a different exported function stops execution (eg repsys functions in same script)</change>
</entry>
<entry>
<date>06-22-2010</date>
<author>Turley:</author>
<change type="Fixed">uo::RestartScript() wakes up old script so it stops immediately</change>
</entry>
<entry>
<date>06-19-2010</date>
<author>Turley:</author>
<change type="Fixed">uo::SendDialogGump SENDDIALOGMENU_FORCE_OLD for 2d 7.x clients (UOKR &amp; UOSA clients ignore the flag)</change>
</entry>
<entry>
<date>03-27-2010</date>
<author>Turley:</author>
<change type="Added">os::Start_Skill_Script( chr, attr_name, script_name := &quot;&quot;, param := 0 )<br/>
starts for given chr and attr_name definied script (overrideable with param script_name)<br/>
param is any UObject given to skill script as second param (first is chr)<br/>
performs the same checks like normal skillusage (death,frozen,skilldelay,...)<br/>
(Tomi)</change>
</entry>
<entry>
<date>03-26-2010</date>
<author>Turley:</author>
<change type="Changed">uo::DisconnectClient() now accepts client or character object (Tomi)</change>
</entry>
<entry>
<date>03-24-2010</date>
<author>Turley:</author>
<change type="Added">ClientRef object<br/>
pkt.sendpacket() &amp; SendPacket() now accepts client or character<br/>
r/o members:<br/>
ip, acctname, clientversion, clientinfo, clienttype, clientver_detail, uo_expansion_client<br/>
methods:<br/>
compareversion()<br/>
used as prelogin param for packethooks instead of old struct (so you can send packets)</change>
<change type="Added">character.client<br/>
returns ClientRef object or error</change>
<change type="Note">This or next release duplicate members/methods get deleted from chr (except acctname)</change>
</entry>
<entry>
<date>03-17-2010</date>
<author>Turley:</author>
<change type="Fixed">Trim: left&amp;right doesnt return empty string if complete string has to be trimmed</change>
</entry>
<entry>
<date>03-12-2010</date>
<author>Turley:</author>
<change type="Fixed">uoconvert - default value of MaxTileID (0x3FFF)</change>
<change type="Added">uoconvert param {maxtileid=0x3FFF/0x7FFF} (if uodata= param is given pol.cfg never gets read)</change>
</entry>
<entry>
<date>02-20-2010</date>
<author>Turley:</author>
<change type="Changed">ListStaticsInBox,ListObjectsInBox,ListMultisInBox now swap x,y,z values if in wrong order</change>
<change type="Added">uo::DistanceEuclidean(obj1, obj2) &amp; uo::CoordinateDistanceEuclidean(x1, y1, x2, y2)<br/>
returns the Euclidean distance as double ( sqrt(pow(x1-x2,2)+pow(y1-y2,2)) )</change>
</entry>
<entry>
<date>02-18-2010</date>
<author>Turley:</author>
<change type="Added">(Tomi) Syshook UnHide(mobile)<br/>
return values 0 stops the char from unhiding and 1 let the core process it.</change>
<change type="Added">(Tomi) &quot;DisableCoreChecks&quot; 0/1 (default 0) to each attribute entry in attribute.cfg<br/>
if true the core will not check during skill_use ( from skillwindow ) for active skills,<br/>
active spells, frozen, paralyzed or delay<br/>
if false core will check everything as it does now.</change>
<change type="Changed">Increased Maximum UO SkillID to 57 (default value of uoclient::MaxSkillID)</change>
</entry>
<entry>
<date>02-17-2010</date>
<author>Turley:</author>
<change type="Fixed">direct usage of struct/dictionary initializer in array/dictionary/struct definition</change>
<change type="eg">var dict:=dictionary; dict[&quot;blubb&quot;]:=struct{a:=1};</change>
</entry>
<entry>
<date>02-16-2010</date>
<author>Turley:</author>
<change type="Fixed">StrReplace,SubStrReplace return &quot;Invalid parameter type&quot; instead of crashing if non string object<br/>
is given as to_replace, replace_with</change>
<change type="Fixed">Several small memoryleaks</change>
</entry>
<entry>
<date>02-04-2010</date>
<author>Turley:</author>
<change type="Added">polcfg:DiscardOldEvents 1/0 {default 0}<br/>
if set instead of discarding new event if queue is full it discards oldest event and adds the new event</change>
<change type="Changed">&quot;Event queue is full..&quot; only prints if polcfg.LogLevel &gt;= 11</change>
</entry>
<entry>
<date>02-03-2010</date>
<author>Turley:</author>
<change type="Added">MethodScript support for mobiles</change>
<change type="NPC">npcdesc.cfg MethodScript entry</change>
<change type="Character">uoclient.cfg section &quot;General&quot; MethodScript entry</change>
</entry>
<entry>
<date>02-01-2010</date>
<author>Turley:</author>
<change type="Added">multi create additionally checks for valid realm coord of the corners</change>
<change type="Changed">uotool staticdefrag [britannia] (removed &quot;realm=&quot;)</change>
<change type="Added">uotool formatdesc [desc] little helper prints singular &amp; plural form of given desc</change>
</entry>
<entry>
<date>01-22-2010</date>
<author>Turley:</author>
<change type="Added">Speedhack Prevention System</change>
<change type="Added">ssopt::SpeedhackPrevention 0/1 (default 0)</change>
<change type="Added">chr priv &quot;speedhack&quot; disables Speedhack Prevention for chr</change>
</entry>
<entry>
<date>01-15-2010</date>
<author>Turley:</author>
<change type="Added">(Tomi) chr priv &quot;runwhilestealth&quot; you can run while you are in stealth for as many stealthsteps you have</change>
<change type="Added">(Tomi) new npcdesc entry &quot;SaveOnExit&quot; 0/1 ( defaults to 1 )</change>
<change type="Note">this also means that SaveOnExit can be definied in the override_properties struct</change>
<change type="Changed">vitals::ApplyDamage( mobile, damage, userepsys := DAMAGE_USE_REPSYS, send_damage := DAMAGE_USE_DEFAULT )<br/>
vitals::ApplyRawDamage( character, hits, userepsys := DAMAGE_USE_REPSYS, send_damage := DAMAGE_USE_DEFAULT )<br/>
const DAMAGE_NO_SHOW := 0;<br/>
const DAMAGE_SHOW := 1;<br/>
const DAMAGE_USE_DEFAULT := 2;<br/>
DAMAGE_USE_DEFAULT uses the SendDamagePacket setting from combat.cfg (Tomi)</change>
<change type="Added">uo::SendOverallSeason( season_id, playsound := 1 )<br/>
Used to send the Season packet 0xBC to all clients logged on.<br/>
This function doesnt resend the lightlevel or weather after it sends season, that has to be done by scripts.<br/>
chr.setseason( season_id, playsound )<br/>
Used to send the Season packet 0xBC to a single character.<br/>
This method doesnt resend the lightlevel or weather after it sends season, that has to be done by scripts.<br/>
(Tomi)</change>
<change type="Changed">(Tomi) uo::SpeakPowerWords( who, spellid, font := _DEFAULT_TEXT_FONT, color := _DEFAULT_TEXT_COLOR)<br/>
font, color like every speech function</change>
</entry>
<entry>
<date>01-14-2010</date>
<author>Turley:</author>
<change type="Fixed">(Arkham) ip byteorder for gameserverlist if hostname is given</change>
<change type="Changed">(Tomi) gargoyle char create equips 0x1F03 robe</change>
<change type="Added">(Tomi) ssopt.NewbieStartingEquipment 1/0 (default 1) to determine if equipped items<br/>
created during the character creation should be newbied or not.</change>
<change type="Changed">misc/oncreate.src added third param profession<br/>
some clients doesnt send skillvalues if profession is given now core doesnt stop char creation,<br/>
based on third param you can set the skillvalues in oncreate</change>
<change type="Added">more errorchecks to char create, it now checks if hair/beard/face can be equipped (fixes crash with latest OSI<br/>
tiledata where facial horn has the same layer as &quot;normal&quot; horn)</change>
<change type="Added">Combatcfg:AttackWhileFrozen 1/0 (default 1) if set to false attack checks if chr is frozen or paralyzed</change>
</entry>
<entry>
<date>01-12-2010</date>
<author>Turley:</author>
<change type="Added">on Profile opening and update request &quot;scripts/misc/charprofile.ecl&quot; is called<br/>
params are character, of_who, mode,uctext<br/>
if mode==0 (request) uctext is 0<br/>
if mode==1 (update) uctext is new unicode array<br/>
both modes ignore the return value<br/>
- Tomi</change>
<change type="Added">uo::SendCharProfile( character, of_who, title, uneditable_text := CHARPROFILE_NO_UNEDITABLE_TEXT, editable_text := CHARPROFILE_NO_EDITABLE_TEXT )<br/>
will send the serverside charprofile packet back to client and display it for the player.<br/>
uneditable_text &amp; editable_text are unicode arrays<br/>
constants are:<br/>
const CHARPROFILE_NO_UNEDITABLE_TEXT := array;<br/>
const CHARPROFILE_NO_EDITABLE_TEXT := array;<br/>
- Tomi</change>
<change type="Note">Only a script interface for making a fully working CharProfile without packethooks.<br/>
Not a fully working charprofile system controlled by the core, ALL text strings still have to be<br/>
stored somewhere by scripts.</change>
</entry>
<entry>
<date>01-01-2010</date>
<author>Nando:</author>
<change type="Added">(Tomi) New itemdesc property &quot;StackLimit&quot;, defines the maximum stack<br/>
of that item (lower than 60k). If not defined, will default to 60000.</change>
<change type="Note">Happy new year. :)</change>
</entry>
<entry>
<date>12-21-2009</date>
<author>Turley:</author>
<change type="Fixed">call of built-in method with ._methodname if overridden</change>
<change type="Added">Multis now support method script</change>
</entry>
<entry>
<date>12-18-2009</date>
<author>Turley:</author>
<change type="Added">file::CreateDirectory( dirname )<br/>
returns 1 on success else error<br/>
(&quot;Error in dirname descriptor&quot;,&quot;No parent path traversal please.&quot;,<br/>
&quot;Directory already exists.&quot;,&quot;Could not create directory.&quot;)</change>
<change type="Added">file::ListDirectory( dirname, extension := LISTDIR_ALL_FILES, listdirs := LISTDIR_DONT_LIST_DIRS )<br/>
extension param can be extension without &quot;.&quot; or file.em constant<br/>
file.em constants:<br/>
const LISTDIR_LIST_DIRS := 0x1;<br/>
const LISTDIR_DONT_LIST_DIRS := 0x0;<br/>
const LISTDIR_NO_FILES := &quot;&quot;;<br/>
const LISTDIR_ALL_FILES := &quot;*&quot;;<br/>
returns array of strings or error<br/>
(&quot;Error in dirname descriptor&quot;,&quot;No parent path traversal please.&quot;,&quot;Directory not found.&quot;)</change>
<change type="Note">Both functions doesnt check file access rights</change>
</entry>
<entry>
<date>12-17-2009</date>
<author>Turley:</author>
<change type="Added">uo::CloseWindow( character, type, object ) - Tomi<br/>
possible values for type<br/>
const CLOSE_PAPERDOLL := 1;<br/>
const CLOSE_STATUS := 2;<br/>
const CLOSE_PROFILE := 8;<br/>
const CLOSE_CONTAINER := 12;</change>
<change type="Note">if ( type == CLOSE_CONTAINER ) object has to be a ContainerRef, to close the open container gump.<br/>
else object has to be a MobRef to close paperdoll, status or profile of the chosen mob.</change>
</entry>
<entry>
<date>12-16-2009</date>
<author>Turley:</author>
<change type="Added">Encrypted Client support - Tomi</change>
<change type="Changed">uoclient.cfg Listener::Encryption and pol.cfg ClientEncryptionVersion now support<br/>
ignition = uorice = none, 2.0.0x and due to autocalculation major.minor.build (no patch)<br/>
e.g. 7.0.4 for latest client 7.0.4.1<br/>
default for both is &quot;none&quot;</change>
<change type="Note">Till OSI changes the encryption type pol now supports every encrypted client without<br/>
updating the core (last change was 2.0.4)</change>
</entry>
<entry>
<date>12-04-2009</date>
<author>Turley:</author>
<change type="Removed">deprecated pol.cfg entries &quot;MasterKey1&quot;,&quot;MasterKey2&quot;,&quot;ClientVersion&quot;,&quot;KeyFile&quot; - Tomi</change>
<change type="Added">Gargoyles count as mounted while flying</change>
</entry>
<entry>
<date>12-03-2009</date>
<author>Turley:</author>
<change type="Added">basic gargoyle flying support (new movemode &quot;F&quot;)</change>
<change type="Fixed">poison status for newer clients</change>
<change type="Note">gargoyles can &quot;fly&quot; on tiles with tiledata flag HOVEROVER (MAPDATA_FLAG_OVERFLIGHT)<br/>
rebuilding of all realms is required<br/>
currently flymode can only be activated clientside (0xBF:0x32) and if race=RACE_GARGOYLE<br/>
renamed uo:TILEDATA_FLAG_NODIAGONAL to uo:TILEDATA_FLAG_HOVEROVER</change>
</entry>
<entry>
<date>12-02-2009</date>
<author>Turley:</author>
<change type="Added">0xF3 packet is send instead of 0x1A for clients &gt;= 7 or UO:SA clients - Tomi</change>
<change type="Added">polcfg MaxTileID 0x3FFF / 0x7FFF (default 0x3FFF)<br/>
since client 7.0.0.0 item graphic can be definied up to 0x7FFF - Tomi</change>
<change type="Added">&quot;SA&quot; for expansion type. This includes sending 0x187DF with packet 0xB9. - Tomi</change>
<change type="Added">support of new map TerMur - Tomi</change>
<change type="Note">uoconvert param:<br/>
realm=termur mapid=5 width=1280 height=4096<br/>
uoconvert.cfg new stairs since SA:<br/>
0x1de0 0x1de1 0x1de2 0x1de3 0x1de4 0x1de5 0x1de6 0x1de7 0x1de8 0x1de9 0x1dea 0x1deb</change>
<change type="Added">Gargoyle support (race = uo:RACE_GARGOYLE)</change>
<change type="Note">graphics are:<br/>
UOBJ_GARGOYLE_MALE 0x029A<br/>
UOBJ_GARGOYLE_FEMALE 0x029B<br/>
UOBJ_GARGOYLE_MALE_GHOST 0x02B6<br/>
UOBJ_GARGOYLE_FEMALE_GHOST 0x02B7</change>
<change type="Added">support of UO:KR/SA char create packet 0x8D</change>
<change type="Added">new gargoyle hair &amp; beard 0x4258-0x425F &amp; 0x42AD-0x42B0</change>
<change type="Added">UO:KR/SA face support</change>
<change type="Added">ssopt.SupportFaces 0/1/2 (default 0)<br/>
set it to 1 to support basic faces<br/>
set it to 2 to support roleplay faces (sets 0x2000 flag in 0xB9 packet)</change>
<change type="Note">Faces are normal items (like hair/beard) with layer 15, objtype 0x3B44-0x3B57<br/>
roleplay faces 0x3B4E-0x3B57</change>
</entry>
<entry>
<date>11-30-2009</date>
<author>Turley:</author>
<change type="Added">polsys::MD5Encrypt(str) returns MD5 hash string.</change>
<change type="Fixed">RecalcVitals function for vital changes doesnt check if maximum value changed</change>
</entry>
<entry>
<date>11-26-2009</date>
<author>Turley:</author>
<change type="Added">Syshook CanDie(mobile)<br/>
Called when the mobile is about to die, return 0 to stop death.</change>
</entry>
<entry>
<date>11-24-2009</date>
<author>Turley:</author>
<change type="Fixed">missing realm check for ListenPoints</change>
</entry>
<entry>
<date>11-23-2009</date>
<author>Turley:</author>
<change type="Added">uotool param staticdefrag [realm=britannia] to defrag/remove duplicate statics (like fiddler does)</change>
</entry>
<entry>
<date>11-20-2009</date>
<author>Turley:</author>
<change type="Changed">RecalcVitals( character, calc_attribute := RECALC_INTRINSIC_MOD, calc_vital := RECALC_VITALS )<br/>
const RECALC_INTRINSIC_MOD := 1;<br/>
const RECALC_NO_INTRINSIC_MOD := 0;<br/>
const RECALC_VITALS := 1;<br/>
const RECALC_NO_VITALS := 0;<br/>
possible values for calc_attribute:<br/>
RECALC_INTRINSIC_MOD - calls for every attribute the GetIntrinsicModFunction (old behaviour)<br/>
RECALC_NO_INTRINSIC_MOD - skips the GetIntrinsicModFunction calls<br/>
attribute name string - only calls the GetIntrinsicModFunction for given attribute<br/>
possible values for calc_vital:<br/>
RECALC_VITALS - calls for every vital the RegenRateFunction &amp; MaximumFunction (old behaviour)<br/>
RECALC_NO_VITALS - skips the RegenRateFunction &amp; MaximumFunction calls<br/>
vital name string - only calls the RegenRateFunction &amp; MaximumFunction for given vital<br/>
- based on Tomi</change>
</entry>
<entry>
<date>11-19-2009</date>
<author>Turley:</author>
<change type="Changed">chr.setlightlevel() now supports endless duration (-1) return is the new gameclock value - Tomi</change>
<change type="Added">[paralyzed] &amp; [deafened] @ singleclick packet - Tomi</change>
<change type="Added">ServSpecOpt CoreSendsSeason 1/0 (default 1)<br/>
Determines if the core should send season packet on char creation/logon/reconnect and realm<br/>
change based on the season entry in realm.cfg. - Tomi</change>
<change type="Removed">&quot;You cannot insert that item into the container.&quot; sysmsg after container CanInsert script<br/>
returns 0 - Tomi</change>
<change type="Changed">uo::UpdateMobile(who, flags:=UPDATEMOBILE_UPDATE)<br/>
const UPDATEMOBILE_RECREATE := 1;<br/>
const UPDATEMOBILE_UPDATE := 0;<br/>
if flags is UPDATEMOBILE_UPDATE old behaviour it sends update Mobile packet 0x77,<br/>
if set to UPDATEMOBILE_RECREATE it sends recreate packet 0x78 - Tomi</change>
<change type="Added">ServSpecOpt CoreHandledTags (default 0xffff)<br/>
bitfield to determine which tags are displayed on singleclick, current used bits are:<br/>
0x1 [title_guild]<br/>
0x2 [frozen]<br/>
0x4 [paralyzed]<br/>
0x8 [squelched]<br/>
0x10 [deafened]</change>
</entry>
<entry>
<date>11-17-2009</date>
<author>Turley:</author>
<change type="Fixed">possible hang in party system<br/>
remove object packet send when container is on a character<br/>
several movement code bugs</change>
</entry>
<entry>
<date>11-16-2009</date>
<author>Turley:</author>
<change type="Added">NPCs receive EnteredArea event on char resurrect</change>
</entry>
<entry>
<date>11-11-2009</date>
<author>Turley:</author>
<change type="Changed">intern container MaxItems too highest possible value (packet size) its now 3200</change>
<change type="Changed">container &quot;can add&quot;-functions to only check weight recursive</change>
</entry>
<entry>
<date>10-22-2009</date>
<author>Turley:</author>
<change type="Added">Syshook Ouch(mobile,lastx,lasty,lastz)<br/>
Called if mobile falls atleast 22 down (fixed Clientside value)</change>
<change type="Added">uo::CanWalk(movemode, x1, y1, z1, x2_or_dir, y2 := CANWALK_DIR, realm := _DEFAULT_REALM)<br/>
const CANWALK_DIR := -1;<br/>
movemode is mobile.movemode string<br/>
if y2 is CANWALK_DIR x2 is considered as direction (0-7)<br/>
if x2 and y2 is given it calculates the needed direction<br/>
returns new z value or error</change>
</entry>
<entry>
<date>10-17-2009</date>
<author>Turley:</author>
<change type="Added">PrivUpdater for &quot;invul&quot;,&quot;seeghosts&quot;,&quot;seehidden&quot; and &quot;seeinvisitems&quot; updates/sends/removes objects<br/>
in visual range on enable/disable - Tomi</change>
<change type="Changed">.startlog/.stoplog checks now if priv &quot;plogany&quot; is enabled instead of only given - Tomi</change>
<change type="Fixed">priv &quot;all&quot; now works as expected if enabled every other priv is also enabled</change>
</entry>
<entry>
<date>10-14-2009</date>
<author>MuadDib:</author>
<change type="Changed">Methods Char.Squelch() and Char.Deaf() return the gameclock value they are in effect until.</change>
</entry>
<entry>
<date>10-14-2009</date>
<author>Turley:</author>
<change type="Added">char privilege &quot;canbeheardasghost&quot;<br/>
With this privilege everybody can hear you even as a ghost (no 'oO' replacement) - Tomi</change>
<change type="Added">pol.cfg TimestampEveryLine 1/0 (default 0) if set every line in pol.log gets timestamp</change>
<change type="Added">char.deaf(duration) - duration in seconds. -1=forever, 0=off</change>
<change type="Added">char.deafened r/o</change>
</entry>
<entry>
<date>10-12-2009</date>
<author>Turley:</author>
<change type="Changed">Method/Syshook definitions now supports :pkg: format - Tomi</change>
<change type="Added">ServSpecOpt SpeechRange default 12<br/>
ServSpecOpt WhisperRange default 2<br/>
ServSpecOpt YellRange default 25<br/>
- Tomi</change>
</entry>
<entry>
<date>10-10-2009</date>
<author>Turley:</author>
<change type="Added">new Spellbook methods<br/>
book.removespell(id) removes given spellid returns 1/0<br/>
book.addspell(id) adds given spellid returns 1/0</change>
</entry>
<entry>
<date>10-09-2009</date>
<author>Turley:</author>
<change type="Added">new Spellbook methods<br/>
book.spells() returns Array of SpellIDs<br/>
book.hasspell(id) checks if SpellID is inside the spellbook returns 1/0</change>
</entry>
<entry>
<date>10-07-2009</date>
<author>Turley:</author>
<change type="Fixed">DestroyItem call inside CanInsert scripts</change>
</entry>
<entry>
<date>10-03-2009</date>
<author>MuadDib:</author>
<change type="Added">SysHook::CanDecay(item). Return 0, core decay will ignore item and continue on the cycler. If it<br/>
returns 1, core decay will handle the item as normal. - Patch submitted by Tomi</change>
<change type="Fixed">Useage of plural forms for more than 1 word in the itemdesc desc entry. - Patch by Tomi</change>
</entry>
<entry>
<date>09-22-2009</date>
<author>Turley:</author>
<change type="Added">Combatcfg:SendDamagePacket 1/0 default 0 if set sends packet 0xB (0xBF sub 0x22 for clients&lt;4.0.7a)<br/>
to attacker(ScriptController) and defender on ApplyDamage and ApplyRawDamage</change>
<change type="Added">new param to ApplyDamage &amp; ApplyDamage they are now:<br/>
ApplyDamage( mobile, damage, userepsys := DAMAGE_USE_REPSYS );<br/>
ApplyRawDamage( character, hits, userepsys := DAMAGE_USE_REPSYS );<br/>
const DAMAGE_USE_REPSYS := 1;<br/>
const DAMAGE_NO_REPSYS := 0;<br/>
If userepsys is set to DAMAGE_NO_REPSYS repsys system isnt called (on_attack &amp; on_damage)</change>
</entry>
<entry>
<date>09-22-2009</date>
<author>MuadDib:</author>
<change type="Changed">NPC/Char ar/ar_mod internal handling rewrote.</change>
<change type="Fixed">NPC Elemental Resist/Damage storage issues.</change>
<change type="Fixed">Lightlevel resetting in client during Login.</change>
</entry>
<entry>
<date>09-20-2009</date>
<author>MuadDib:</author>
<change type="Changed">Spell casting no longer unhides. Be sure to update your scripts to unhide.</change>
<change type="Changed">SpeakPowerWords() will now check if mob is hidden. If so, it uses Private Say Above.</change>
</entry>
<entry>
<date>09-18-2009</date>
<author>MuadDib:</author>
<change type="Added">Multi Walk On Script support. Works for player and npc. Just add Walkon itemdesc entry to the house.</change>
<change type="Note">This is in early stages. While it is working, not all cases may register and deregister where a mob<br/>
gets put onto or removed from a house. If you find cases that do, report to bugtracker.</change>
<change type="Removed">Storing scrolls inside spellbooks. Destroyed after insert is complete.</change>
<change type="Changed">Pre-AOS Clients still get the same packet they always did when opening a spellbook, built entirely<br/>
off the bitflag system for newer spellbooks. So no more keeping scrolls inside of books. :D</change>
<change type="Note">As spellbooks are loaded for the first time with newer cores and as added to books, scrolls are<br/>
marked SaveOnExit 0. Newly inserted scrolls from then on, are destroyed during insertion after spell<br/>
contents are updated on the book.</change>
</entry>
<entry>
<date>09-16-2009</date>
<author>Turley:</author>
<change type="Removed">char.isUOKR</change>
<change type="Added">char.ClientType r/o bitfield</change>
<change type="Note">current Flags are:<br/>
CLIENTTYPE_4000 = 0x1, // 4.0.0a (new spellbookcontent packet 0xbf:0x1b)<br/>
CLIENTTYPE_4070 = 0x2, // 4.0.7a (new damage packet 0x0b instead of 0xbf:0x22)<br/>
CLIENTTYPE_5000 = 0x4, // 5.0.0a (compressed gumps)<br/>
CLIENTTYPE_5020 = 0x8, // 5.0.2a (Buff/Debuff 0xdf)<br/>
CLIENTTYPE_6017 = 0x10, // 6.0.1.7 (Grid locs)<br/>
CLIENTTYPE_60142 = 0x20, // 6.0.14.2 (feature enable 0xb9 size change)<br/>
CLIENTTYPE_UOKR = 0x40,<br/>
CLIENTTYPE_7000 = 0x80, // 7.0.0.0 (Gargoyle race)<br/>
CLIENTTYPE_UOSA = 0x100</change>
<change type="Note">Pol will be now compiled with flag /LARGEADDRESSAWARE (win only flag) pol should now be able to consume more memory</change>
</entry>
<entry>
<date>09-14-2009</date>
<author>MuadDib:</author>
<change type="Removed">All import abilities built in to core for UOX data files. O_O</change>
<change type="Note">The file &quot;import.txt&quot; will be loaded each time POL loads, when found in the world data directory. This file's<br/>
format is the same as, for example, the ITEMS.TXT file POL saves. You can use this for example, to store all your<br/>
doors, decorations, etc, to ensure they are reloaded after a wipe, or loaded every time POL starts. These items<br/>
are added to the real world, and saved to items.txt. However, if on load the same objtype is found at the same<br/>
x y z as the item in IMPORT.TXT, it destroys that item, and loads the import one.</change>
</entry>
<entry>
<date>09-10-2009</date>
<author>Turley:</author>
<change type="Added">CompressedGump support packet 0xdd</change>
<change type="Added">flag param to SendDialogGump() SENDDIALOGMENU_FORCE_OLD/0 default 0</change>
<change type="Note">SendDialogGump sends compressed gump if (client.isUOKR || (!SENDDIALOGMENU_FORCE_OLD &amp;&amp; clientversion &gt;=5.0.0a)) else old uncompressed</change>
<change type="Note">Patch submitted by Grin</change>
</entry>
<entry>
<date>09-09-2009</date>
<author>Turley:</author>
<change type="Added">ServSpecOpt CarryingCapacityMod (double default 1.0) as * modifier for mobile max_weight</change>
<change type="Note">Formula is (40 + strength * 7 / 2) * ssopt.CarryingCapacityMod</change>
<change type="Note">Since ML max weight is send for statusgump</change>
<change type="Note">Patch submitted by Tomi</change>
</entry>
<entry>
<date>09-05-2009</date>
<author>MuadDib:</author>
<change type="Added">POL Linux builds will now create a PID file when loading. Patch submitted by Crazyman</change>
</entry>
<entry>
<date>09-05-2009</date>
<author>Turley:</author>
<change type="Added">struct .? and .- as shortcut for .exists() and .erase()</change>
</entry>
<entry>
<date>09-03-2009</date>
<author>MuadDib:</author>
<change type="Changed">CoreHitSounds, ScriptedAttackChecks, ResetSwingOnTurn, SendSwingPacket all moved from SSOPT to Combat CFG.</change>
</entry>
<entry>
<date>08-19-2009</date>
<author>Turley:</author>
<change type="Added">r/o member character.uo_expansion_client client sends this flag at packet 0x5D charselect and 0x00 createchar</change>
<change type="Note">values are:<br/>
FLAG_T2A = 0x00,<br/>
FLAG_RENAISSANCE = 0x01,<br/>
FLAG_THIRD_DAWN = 0x02,<br/>
FLAG_LBR = 0x04,<br/>
FLAG_AOS = 0x08,<br/>
FLAG_SE = 0x10,<br/>
FLAG_SA = 0x20,<br/>
FLAG_UO3D = 0x40, // ?<br/>
FLAG_RESERVED = 0x80,<br/>
FLAG_3DCLIENT = 0x100 // 3d Client</change>
</entry>
<entry>
<date>08-14-2009</date>
<author>Turley:</author>
<change type="Changed">Stopped spam of unknown packet for 0xBF.5 &amp; 0xBF.C</change>
</entry>
<entry>
<date>08-09-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Better handling of sending poison updated to UO:KR Clients.</change>
<change type="Changed">UpdateCharacterWeight() now sends correct packets instead of calling on RefreshAR() to<br/>
notify client of new weight. Reduces overhead.</change>
</entry>
<entry>
<date>08-07-2009</date>
<author>MuadDib:</author>
<change type="Fixed">New system in core for handling layers on items and corpses. On mobile death, only items equipped<br/>
will be given the Layer prop in the corpse.</change>
<change type="Changed">New system for corpses also is affected by insert/remove of items to the corpse by script and<br/>
drop into by player. Dropping new items into a corpse will cause it to set the layer accordingly<br/>
long as nothing else is already using that layer on the corpse.</change>
<change type="Changed">Very small optimization to equip item code for handling the setting of layer.</change>
</entry>
<entry>
<date>08-06-2009</date>
<author>MuadDib:</author>
<change type="Changed">PasswordOnlyHash removed from core. Now only ClearText and Hashed Passwords will be used.<br/>
Default is now PasswordHash instead of ClearText.</change>
<change type="Note">Using ClearText is not recommended as it leaves all your account's passwords wide open if<br/>
the accounts.txt file is comprimised. You have been warned.</change>
<change type="Removed">Account.PasswordHash - This was for the PasswordOnlyHash.</change>
<change type="Added">Item.getgottenby Member. Returns CharRef of Player holding item, Error if not being held.</change>
</entry>
<entry>
<date>08-06-2009</date>
<author>Turley:</author>
<change type="Added">new Methods<br/>
Character.setAggressorTo(chr)<br/>
Character.setLawfullydamagedTo(chr)<br/>
sets aggressor/lawfullydamaged for repsys.cfg:AggressorFlagTimeout seconds for given chr<br/>
Character.clearAggressorTo(chr)<br/>
Character.clearLawfullydamagedTo(chr)<br/>
clears aggressor/lawfullydamaged entry for given chr</change>
</entry>
<entry>
<date>08-04-2009</date>
<author>MuadDib:</author>
<change type="Changed">RecalcVitals() and other internal parts of core that share recalc_vital_stuff() will now check to see if<br/>
each vital has changed, before resending it to client. Reduces overhead.</change>
</entry>
<entry>
<date>08-03-2009</date>
<author>MuadDib:</author>
<change type="Removed">uopacket.cfg::is6017 has been removed.</change>
<change type="Added">uopacket.cfg::Version (1 or 2) Default 1<br/>
uopacket.cfg::Client (client version string) Default 1.25.25.0<br/>
Read packethooks.txt for details.</change>
</entry>
<entry>
<date>07-31-2009</date>
<author>Turley:</author>
<change type="Added">ServSpecOpts::ResetSwingOnTurn=true/false default false<br/>
Should SwingTimer be reset with projectile weapon on facing change</change>
<change type="Added">ServSpecOpts::SendSwingPacket=true/false default true<br/>
Should packet 0x2F be send on swing.<br/>
Client sends automatically move packet to face the opponent</change>
</entry>
<entry>
<date>07-25-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Bug blocking equipping when intrinsic weapon was marked as two handed.</change>
</entry>
<entry>
<date>07-17-2009</date>
<author>Turley:</author>
<change type="Added">&quot;ShadowRealms&quot;<br/>
polsys::AddRealm(realm_name,base_realm);<br/>
returns 1 or error (&quot;BaseRealm not found.&quot;,&quot;BaseRealm is a ShadowRealm.&quot;,&quot;Realmname already defined.&quot;)<br/>
Creates a new Realm based on an other realm, uses same map and regions<br/>
polsys::DeleteRealm(realm);<br/>
returns 1 or error (&quot;Realm not found.&quot;,&quot;Realm is not a ShadowRealm.&quot;,&quot;Mobiles in Realm.&quot;,&quot;Items in Realm.&quot;)<br/>
Deletes a ShadowRealm, only if the realm is &quot;clean&quot;</change>
<change type="Note">ShadowRealms get saved/loaded in pol.txt</change>
<change type="Note">if ServerSpecOpt is set AddRealm/startup creates a Decaythread</change>
<change type="Changed">On realm change client gets RemovePacket for all objects inrange</change>
</entry>
<entry>
<date>07-16-2009</date>
<author>MuadDib:</author>
<change type="Added">Removal of Grid Index to items when Container::remove is called within the core.</change>
<change type="Added">ItemDesc::Container::MaxSlots = 1-255, default ServSpecOpts::MaxSlots</change>
<change type="Added">ServSpecOpts::UseContainerSlots=true/false, default false.</change>
<change type="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.</change>
<change type="Changed">DropItem packets now redone for Slot support. Better handling internally, and core will move an item to next available slot<br/>
if one sent is not available. Before code is used, it checks if UseContainerSlots is true.<br/>
Note*: UseContainerSlots is not yet fully implemented. Will cause core to ignore all grid setting for core moved items.<br/>
The purpose of this, is since Legacy 2D clients ignore this setting anyway, you can use this to ignore Max Slots<br/>
and allow core to move items into a container regardless of MaxSlots settings (which is kinda like a secondary Max Items).<br/>
With this enabled, it will enfore MaxSlots when core and player moves items to containers. If Max Items is not reached,<br/>
it will check MaxSlots. If MaxSlots is not reached, allows moving the item into container.<br/>
This is being added to allow to turn grid support on and off based on the client versions (and types) that you will be<br/>
supporting on your shard.</change>
</entry>
<entry>
<date>07-04-2009</date>
<author>Turley:</author>
<change type="Added">new Object Class BinaryFile<br/>
File::OpenBinaryFile( filename, mode := OPENMODE_IN, endian := LITTLE_ENDIAN );<br/>
like the other file functions it checks file access rights (fileaccess.cfg) (Read and/or Write)<br/>
mode constants:<br/>
const OPENMODE_IN := 0x01; // (input) Allow input operations on the stream<br/>
const OPENMODE_OUT := 0x02; // (output) Allow output operations on the stream<br/>
const OPENMODE_ATE := 0x04; // (at end) Set the stream's position indicator to the end of the stream on opening<br/>
const OPENMODE_APP := 0x08; // (append) Set the stream's position indicator to the end of the stream before each output operation<br/>
const OPENMODE_TRUNC := 0x10; // (truncate) Any current content is discarded, assuming a length of zero on opening<br/>
endian constants:<br/>
const LITTLE_ENDIAN := 0x00;<br/>
const BIG_ENDIAN := 0x01;<br/>
returns BinaryFile Object or error</change>
<change type="Note">implemented BinaryFile comparisons are<br/>
true/false (!) checks if filestream is open<br/>
== checks if filename is the same</change>
<change type="Added">BinaryFile methods:<br/>
.close() closes the underlying stream returns 1<br/>
.size() returns the filesize or error<br/>
.seek(int offset, int seekdir) sets position returns 1/0 or error<br/>
seekdir constants:<br/>
const SEEKDIR_BEG := 0x00; // beginning of sequence<br/>
const SEEKDIR_CUR := 0x01; // current position within sequence<br/>
const SEEKDIR_END := 0x02; // end of sequence<br/>
.tell() gets current position returns int<br/>
.peek() Reads and returns the next byte without extracting it (-1 if eof is reached)<br/>
.flush() writes all unwritten chars from buffer to file<br/>
.getInt32() gets unsigned 32-bit (4 byte) 1 or error<br/>
.getInt16() gets unsigned 16-bit (2 byte) 1 or error<br/>
.getInt8() gets unsigned 8-bit (1 byte) 1 or error<br/>
.getSInt32() gets signed 32-bit (4 byte) 1 or error<br/>
.getSInt16() gets signed 16-bit (2 byte) 1 or error<br/>
.getSInt8() gets signed 8-bit (1 byte) 1 or error<br/>
.getString(length) gets a string (1-byte characters) string or error<br/>
.setInt32() sets unsigned 32-bit (4 byte) 1 or error<br/>
.setInt16() sets unsigned 16-bit (2 byte) 1 or error<br/>
.setInt8() sets unsigned 8-bit (1 byte) 1 or error<br/>
.setSInt32() sets signed 32-bit (4 byte) 1 or error<br/>
.setSInt16() sets signed 16-bit (2 byte) 1 or error<br/>
.setSInt8() sets signed 8-bit (1 byte) 1 or error<br/>
.setString(string string, int nullterminate) sets a string<br/>
set nullterminate to 1 to append a 0 terminator 1 or error</change>
</entry>
<entry>
<date>07-01-2009</date>
<author>Turley:</author>
<change type="Changed">UoConvert now also saves the color of static tiles</change>
<change type="Added">ListStatics* return struct member &quot;hue&quot;</change>
<change type="Note">Rebuild of all realms is required</change>
</entry>
<entry>
<date>06-29-2009</date>
<author>MuadDib:</author>
<change type="Added">Additional check in internal grid checks on containers, to speed up handling for full containers.</change>
<change type="Added">ServSpecOpt.cfg::MaxContainerSlots=unsigned integer.<br/>
This will allow setting the internal overall allowed item count for containers. This is introduced for future KR support.<br/>
KR client is only 125, but we are making this here so custom clients later can support more slots.<br/>
If you have containers with max item count over 125 and use ONLY 2D, and not KR, set this to your highest amount used!</change>
</entry>
<entry>
<date>06-27-2009</date>
<author>Turley:</author>
<change type="Fixed">Item creation with ItemDescriptor can now override .Desc</change>
</entry>
<entry>
<date>06-25-2009</date>
<author>Turley:</author>
<change type="Added">new r/o Members (Array{Struct{&quot;serial&quot;,&quot;ref&quot;,&quot;seconds&quot;}})<br/>
Mobile.aggressorto<br/>
Mobile.lawfullydamaged<br/>
as interface for core repsyssystem</change>
</entry>
<entry>
<date>06-20-2009</date>
<author>Turley:</author>
<change type="Added">new r/w Members (Double) default 1.0<br/>
Mobile.movecost_walk_mod<br/>
Mobile.movecost_run_mod<br/>
Mobile.movecost_walk_mounted_mod<br/>
Mobile.movecost_run_mounted_mod<br/>
used as multiplier see movecost.cfg doc for exact calculation</change>
</entry>
<entry>
<date>06-17-2009</date>
<author>Turley:</author>
<change type="Added">Method Array.randomentry() shortcut for var entry:=array[RandomInt(array.size())+1];</change>
<change type="Added">uo::GetRegionLightLevelAtLocation(x,y,realm) returns the current region lightlevel</change>
</entry>
<entry>
<date>05-02-2009</date>
<author>Turley:</author>
<change type="Added">new TargetCoordinates return member &quot;multi&quot; with multiref if coords are inside a multi</change>
</entry>
<entry>
<date>04-17-2009</date>
<author>Turley:</author>
<change type="Changed">SpeechMul SysHook has now an additional parameter with the complete message as string</change>
<change type="Added">party hooks:<br/>
OnLeaveParty(who,fromwho)<br/>
OnAddToParty(who)<br/>
OnPartyCreate(party)<br/>
OnDecline(who)<br/>
OnLootPermChange(who)</change>
<change type="Note">OnLeaveParty fromwho==who if who removes himself</change>
<change type="Added">party General options:<br/>
RemoveMemberOnLogoff 1/0 (default 0)<br/>
RejoinPartyOnLogon 1/0 (default 0)</change>
<change type="Note">RejoinPartyOnLogon is only used if RemoveMemberOnLogoff is true, if partyleader logoffs<br/>
the next member becomes the leader</change>
</entry>
</version>
<version name="POL098.2">
<entry>
<date>08-21-2009</date>
<author>Turley:</author>
<change type="Fixed">Regions where limited to 128 due to intern (char)id, changed to ushort</change>
</entry>
<entry>
<date>07-31-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Cleanup crash in shutdown involving characters and combat. Now all clients and characters are disconnected by the<br/>
core before any cleanup is intiated. This will begin the cleanup for client and character alike.</change>
</entry>
<entry>
<date>07-20-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Item::Facing updates were no longer updating surrounding clients.</change>
<change type="Fixed">Bug with stackables where graphic and crops may be different, still allowing to combine stack (of same objtype)</change>
</entry>
<entry>
<date>07-15-2009</date>
<author>Turley:</author>
<change type="Added">Support for client 6.0.14.2 and latest UOKR (this change breaks every older UOKR)<br/>
packet 0xB9 has now a length of 5</change>
</entry>
<entry>
<date>06-28-2009</date>
<author>MuadDib:</author>
<change type="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<br/>
to change the graphic of an item with layer set.</change>
</entry>
<entry>
<date>06-27-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Layer bug with updating/sending equipped items</change>
</entry>
</version>
<version name="POL098.1">
<entry>
<date>06-20-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Reset now occurs for tile_layer internal property when graphic is changed on item class.</change>
<change type="Fixed">SetOpponent() for npcs will now once again correctly set the warmode.</change>
</entry>
<entry>
<date>05-20-2009</date>
<author>Turley:</author>
<change type="Fixed">TypeOf() return of Error</change>
</entry>
<entry>
<date>05-14-2009</date>
<author>Turley:</author>
<change type="Fixed">some Memoryleaks</change>
</entry>
<entry>
<date>04-29-2009</date>
<author>Turley:</author>
<change type="Fixed">Exception on mobile.kill() if death/chrdeath.ecl does not exist</change>
</entry>
<entry>
<date>04-28-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Removal of items from containers not sending destroy object to nearby clients when object removed.<br/>
This affects containers when was owned by a character.</change>
</entry>
<entry>
<date>04-21-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Crash at shutdown during character cleanup involving players that was in combat.</change>
</entry>
<entry>
<date>04-20-2009</date>
<author>Turley:</author>
<change type="Added">Comparison check == for Boat,Multi,GuildRef</change>
</entry>
<entry>
<date>04-19-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Endian format for SendPartyMsg().</change>
</entry>
</version>
<version name="POL098">
<entry>
<date>04-06-2009</date>
<author>MuadDib:</author>
<change type="Changed">When adding ally/enemy guilds, removing ally/enemy guilds, adding/removing members, core now<br/>
updates online members and those around them correctly.</change>
<change type="Added">If LogLevel in pol.cfg is higher than 1, new report added to console. If an account has AOS Expansion<br/>
and uses a Spellbook, console now reports this if UOFeatureEnable does not contain 0x20 bitflag for<br/>
new spellbook system in client. This is due to client issues with books using old methods when still<br/>
recieving the AOS flag for an account.</change>
</entry>
<entry>
<date>04-05-2009</date>
<author>MuadDib:</author>
<change type="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.<br/>
0xFEFEFEFC = UOKR Client<br/>
0XFEFEFEFD = 6050+ 2D Client<br/>
0xFEFEFEFE = Normal 2D client (pre-6.0.5.0 client)</change>
<change type="Note">Change to keys is for passing these details from Loginserver to Gameserver during loginprocess.<br/>
Clients disconnect from LoginServer and Connect to Gameserver. This is the easiest method for<br/>
identifying the client type connecting to your game server since versions are handled to decide<br/>
this on the loginserver connection.</change>
</entry>
<entry>
<date>04-04-2009</date>
<author>Nando:</author>
<change type="Fixed">Removing an offline member from party was causing POL to crash.</change>
</entry>
<entry>
<date>04-04-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Issue with resistances and damages from npcdesc.cfg.</change>
<change type="Note">NPC's eScript changing/quipping with Resistances/Damages will be rewritten in 099. We are<br/>
putting this into 099 due to a Class Rewrite to NPCs that will resolve this issue and allow<br/>
better expansions of the NPC class in the core.</change>
</entry>
<entry>
<date>04-02-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Crash in cleanup of character objects during Shutdown and deletion.</change>
<change type="Fixed">Crash involving sending warmode information during disconnect/shutdown.</change>
</entry>
<entry>
<date>04-01-2009</date>
<author>Nando:</author>
<change type="Fixed">When creating a new char, attributes' caps weren't being set to the default value and<br/>
were just set to a random value.</change>
</entry>
<entry>
<date>03-30-2009</date>
<author>Nando:</author>
<change type="Fixed">Sometimes when casting a spell, a race-condition would make POL end with a<br/>
passert( !start_attached || (script_ex == NULL) ) error in chrituse.cpp.</change>
<change type="Fixed">Bug in Packet::GetString(offset, len) where it would return a string of 'len' ascii chars,<br/>
regardless of having a null-byte in there. Will now limit to len or the first null-byte<br/>
found, whichever comes first.</change>
</entry>
<entry>
<date>03-30-2009</date>
<author>MuadDib</author>
<change type="Fixed">Equipment.quality will now convert plain integers to Double/Float for it when using<br/>
item.quality:=2; instead of item.quality:=2.0;</change>
</entry>
<entry>
<date>03-28-2009</date>
<author>Turley:</author>
<change type="Fixed">Resend party list if remove hooks dont allow it</change>
</entry>
<entry>
<date>03-27-2009</date>
<author>Turley:</author>
<change type="Fixed">Crash in party speechhandler</change>
</entry>
<entry>
<date>03-27-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Crash in Basic::Trim(). Now checks explicitly for String as param 1. Errors out if not.</change>
<change type="Fixed">Event LeftArea and EnteredArea both being able to be triggered when 1 is actually disabled.</change>
</entry>
<entry>
<date>03-25-2009</date>
<author>MuadDib:</author>
<change type="Changed">StrReplace() and SubStrReplace() will now accept Dict/Struct/Array/Error as param 1 and converts<br/>
them to string format (like when using print() or syslog()) before comparing/converting.</change>
</entry>
<entry>
<date>03-24-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Crash with StrReplace() allowing to go past end of a string.</change>
<change type="Changed">StrReplace() will now allow the replace_with string to be empty, to remove the to_replace<br/>
param from the string completely.</change>
<change type="Fixed">Crash in onRemove system for removing objects on npc/offline mobiles.</change>
</entry>
<entry>
<date>03-22-2009</date>
<author>Nando:</author>
<change type="Added">New servspectopt::SendStatLocks (default false) to send the stat locks message.<br/>
Beware that this message will only be sent to clients which have major version &gt; 3<br/>
(to avoid breaking older ones).</change>
<change type="Changed">Canceling of trade window will no longer trigger refreshing of AR/Resistances/Damages.<br/>
It will only send the status bar packet to the client for weight updates.</change>
<change type="Changed">Updates so refreshing of AR/Resistances/Damages is not called when dropping items unless<br/>
to equip them etc as should be.</change>
</entry>
<entry>
<date>03-22-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Bug with items that use the Resource entry in ItemDesc.Cfg causing crashes on shutdown.</change>
</entry>
<entry>
<date>03-20-2009</date>
<author>MuadDib:</author>
<change type="Added">Storage system will now ignore all root containers with SaveOnExit set to 0.</change>
</entry>
<entry>
<date>03-19-2009</date>
<author>Nando:</author>
<change type="Added">UO::PlayMusic( chr, music_id := 0 ), plays the music with music_id<br/>
on client. You can find the music id's this uses at your UO FOLDER/Music/Digital/Config.txt</change>
</entry>
<entry>
<date>03-19-2009</date>
<author>Turley:</author>
<change type="Added">on Chatbutton pressing &quot;scripts/misc/chatbutton.ecl&quot; is called</change>
<change type="Note">only simple implementation no Chatsystem!</change>
</entry>
<entry>
<date>03-18-2009</date>
<author>MuadDib:</author>
<change type="Added">Basic::Compare(str1, str2, pos1_start:=0, pos1_end:=0, pos2_start:=0, pos2_end:=0);<br/>
Can be used in 3 overloaded ways. Returns 1 on compare success.<br/>
Compare(string1, string2)<br/>
Compare(string1, string2, string1_index, string1_length)<br/>
Compare(string1, string2, string1_index, string1_length, string2_index, string2_length)<br/>
Index is a starting position to begin the compare in the string, and length is the length to<br/>
compare from the index. When using the 3rd method, you can compare substrings in both strings<br/>
instead of just the substring of string1 to entire string2.</change>
<change type="Fixed">Bug with Player Color and their magic underwear in the Race Changer packet handling.</change>
</entry>
<entry>
<date>03-18-2009</date>
<author>Nando:</author>
<change type="Added">New ssopt option: CoreSendsCaps 0/1 (default 0), makes POL send<br/>
attribute cap information in the Send Skills (0x3A) packet.</change>
</entry>
<entry>
<date>03-17-2009</date>
<author>Nando:</author>
<change type="Added">New ssopt option: DefaultAttributeCap (default 1000), defines<br/>
which value POL should use as cap for attributes.</change>
<change type="Added">New attributes.cfg option: DefaultCap (default DefaultAttributeCap),<br/>
to set the default for each attribute.</change>
<change type="Added">GetAttributeCap(who, attr), SetAttributeCap(who, attr, capvalue) and<br/>
GetAttributeDefaultCap(attr). The names should explain it all.</change>
<change type="Note">Caps are defined in tenths (100.0 -&gt; 1000, 55.2 -&gt; 552), same as<br/>
base values.</change>
</entry>
<entry>
<date>03-17-2009</date>
<author>MuadDib:</author>
<change type="Added">Concealed Updater now also run when changing command levels.</change>
<change type="Added">Basic::Trim(string, type, set). Trims whitespaces from strings<br/>
String = String to trim from.<br/>
Type = TRIM_LEFT, TRIM_RIGHT, TRIM_BOTH. Directions to trim the whitespace from. Default is BOTH.<br/>
Set = Character set to trim as whitespace. Default is &quot; &quot;.</change>
<change type="Added">Basic::StrReplace(string, to_replace, replace_with). Replace all instances of to_replace in the string<br/>
with replace_with.</change>
<change type="Added">Basic::SubStrReplace(string, replace_with, start, length:=0). Replace portion of string using replace_with,<br/>
beginning at start for length. If length passed is 0 or lower, it replaces from start to end of string.<br/>
Error Returns: &quot;Index must not be negative&quot;, &quot;Index out of range&quot;, &quot;Length out of range&quot;, &quot;Length must not<br/>
be negative&quot;</change>
</entry>
<entry>
<date>03-12-2009</date>
<author>Turley:</author>
<change type="Added">repsys.cfg General section &quot;PartyHelpFullCountsAsCriminal 1/0&quot; default 0 if 0 OnHelp does not set<br/>
mobile to criminal if helped char is criminal/murderer when they are in the same party</change>
</entry>
<entry>
<date>03-11-2009</date>
<author>Turley:</author>
<change type="Added">new systemhook script 'OnCast'<br/>
function OnCast(who, spellid)<br/>
is called if who casts a spell (including macros) before all checks</change>
<change type="Return">0 if you wish POL to perform the checks and casting, 1 if you want to handle it fully scriptside</change>
<change type="Note">The two partystatusgump buttons send spellid 11(green) and 29(red) with clientside reserved next target answer</change>
<change type="Added">on Paperdoll Guildbutton pressing &quot;scripts/misc/guildbutton.ecl&quot; is called</change>
<change type="Added">on Paperdoll Questbutton pressing &quot;scripts/misc/questbutton.ecl&quot; is called</change>
<change type="Added">on Paperdoll Virtuebutton (pentagram doubleclick) pressing &quot;scripts/misc/virtuebutton.ecl&quot; is called</change>
<change type="Removed">&quot;Client tried to drop item to X,Y,Z but server is putting it at Z=&quot; logmsg</change>
</entry>
<entry>
<date>03-09-2009</date>
<author>MuadDib:</author>
<change type="Changed">Console will no longer spam about invalid speech color. Instead it adjusts the<br/>
color back to the default 1001 color and goes on.</change>
</entry>
<entry>
<date>03-08-2009</date>
<author>Turley:</author>
<change type="Added">Partysystem<br/>
new savefile parties.txt<br/>
new em Module party.em<br/>
new cfg file config/party.cfg<br/>
new Object Class Party<br/>
savefile parties:<br/>
saves Leader,Members and Cprops<br/>
new Char members:<br/>
who.party r/o returns PartyRef or Error<br/>
who.candidate_of_party r/o returns PartyRef or Error<br/>
who.partycanloot 1/0 r/o<br/>
PartyRef members:<br/>
party.members r/o returns Array of OfflineCharRefs<br/>
party.candidates r/o returns Array of OfflineCharRefs<br/>
party.leader r/o returns OfflineCharRef<br/>
PartyRef methods:<br/>
party.setleader(CharRef) sets new Leader returns 1/Error<br/>
party.addmember(CharRef) adds new Member returns 1/Error<br/>
party.addcandidate(CharRef) adds new Candidate returns 1/Error<br/>
party.removemember(CharRef) removes Member returns 1/Error<br/>
party.removecandidate(CharRef) removes Candidate returns 1/Error<br/>
party.setprop/getprop/eraseprop/propnames for cprops<br/>
Party.em:<br/>
CreateParty( leader, firstmember ); Creates a Party returns 1 or Error<br/>
DisbandParty( partyref ); Disbands a Party returns 1 or Error<br/>
SendPartyMsg( party, character, uctext ); Sends PartyMsg with Sender=character returns 1/Error<br/>
SendPrivatePartyMsg( party, character, tocharacter, uctext ); Sends PrivateMsg with Sender=character<br/>
returns 1/Error<br/>
party.cfg:<br/>
General<br/>
{<br/>
//How many chars are allowed in a Party (normal clients only have 10 slots)<br/>
[MaxPartyMembers int (default 10)]<br/>
//Newer Clients (&gt;=3.0.6e) does not automatically change &quot;/# &quot; to private msg (they use &quot;/t #&quot;)<br/>
//set to true any public msg will be checked for &quot;# &quot; (0-9 0=slot 10)<br/>
[TreatNoAsPrivate (1/0) (default 0)]<br/>
//How long is an invite valid befor automatic decline<br/>
//set to 0 disables the timeout<br/>
[DeclineTimeout int seconds (default 10)]<br/>
//Prefix for a private Msg (e.g. P:)<br/>
[PrivateMsgPrefix string (default &quot;&quot;)]<br/>
}<br/>
HookList<br/>
{<br/>
// CanAddToParty(leader,member) return check true/false<br/>
// called when a leader invites someone<br/>
CanAddToParty<br/>
// CanRemoveMember(leader,member) return check true/false<br/>
// called when leader wants to remove member<br/>
CanRemoveMember<br/>
// CanLeaveParty (member) return check true/false<br/>
// called when member wants to leafe the party<br/>
CanLeaveParty<br/>
// OnPublicChat(member,uctext) return check none<br/>
// called when a member sends a PartyMsg e.g. for logging<br/>
OnPublicChat<br/>
// OnPrivateChat(member,tomember,uctext) return check none<br/>
// called when a member sends a PrivateMsg e.g. for logging<br/>
OnPrivateChat<br/>
// OnDisband(partyref) return check none<br/>
// called when a Party is about to be disbanded<br/>
OnDisband<br/>
// ChangePublicChat(member,uctext) return new uctext/true/false<br/>
// called when a member sends a PartyMsg return value is the new uctextarray,<br/>
// or true for no change, or false to block the msg<br/>
ChangePublicChat<br/>
// ChangePrivateChat(member,tomember,uctext) return new uctext/true/false<br/>
// called when a member sends a PrivateMsg return value is the new uctextarray,<br/>
// or true for no change, or false to block the msg<br/>
ChangePrivateChat<br/>
}</change>
<change type="Note">implemented PartyRef comparisons are ! and ==</change>
<change type="Note">Candidates are not saved<br/>
A party with (candidates+members)&lt;=1 gets disbanded</change>
<change type="Note">All msgs send are cliloc's used cliloc numbers are:<br/>
1005437, 1005439, 1005440, 1005441, 1005442, 1005444, 1005445, 1005446, 1005447, 1005448,<br/>
1005449, 1005450, 1005451, 1005452, 1005453, 1005455, 1008087, 1008089, 1008090, 1008091,<br/>
1008092, 1008094, 1008095, 3000211, 3000222, 3000223</change>
</entry>
<entry>
<date>03-08-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Spacing for all titles and name for mobs in Tooltips and Paperdoll. Also added the<br/>
mob.title_guild in the Tooltips string for names of mobiles.</change>
</entry>
<entry>
<date>03-08-2009</date>
<author>Nando:</author>
<change type="Added">New privilege &quot;moveanydist&quot;, will allow moving items regardless of distance (by now,<br/>
the only limit to this priv is the client.)</change>
</entry>
<entry>
<date>03-07-2009</date>
<author>MuadDib:</author>
<change type="Changed">Setting of title_prefix, title_suffix, title_race, title_guild will no trigger an<br/>
obj cache to be sent to tooltip enabled clients for updates of tooltips client side.<br/>
This does not affect paperdolls. Paperdolls not being updated until Double Clicking<br/>
again is an issue client-side.</change>
<change type="Added">AOS Extended Statbar members such as followers, followers_max, tithing, and luck will<br/>
now cuase the Update packet to be sent to AOS enabled accounts when changed.</change>
<change type="Changed">Handling of packet 0x07 (Pick Up Item Request). On success, core now checks for if the<br/>
item was equipped on yourself, and refreshes ar and sends stats. If was in a container<br/>
not on your character, only refreshes stats. If item was on the ground, only stats. If<br/>
on a mobile other than yourself, only stats. If item was inside your own worn items,<br/>
it does nothing (since not worn, and no additional weight to send to client). The big<br/>
Difference here, was client use to ALWAYS refresh the ar of character and statmsg. This<br/>
will eliminate at the least, over 50 loops per pickup when it's not needed, and packets<br/>
not being sent, when not needed.</change>
</entry>
<entry>
<date>03-06-2009</date>
<author>MuadDib:</author>
<change type="Added">Elemental Damage properties added for items and mobiles. These follow the same<br/>
rules as all the AOS Resistances. Same details for itemdesc, GetItemDescriptor(),<br/>
etc.<br/>
Mobile.damage_fire, damage_cold, damage_energy, damage_poison, damage_physical R/O<br/>
Mobile.damage_fire_mod, etc. R/W<br/>
Item.damage_fire, etc. R/O<br/>
Item.damage_fire_mod, etc R/W<br/>
Itemdesc.cfg: FireDamage, ColdDamage, EnergyDamage, PoisonDamage, PhysicalDamage<br/>
ItemDesc entries accept Dice Strings just like resistances.<br/>
NPCDesc.Cfg: FireDamage, etc just like ItemDesc.cfg</change>
</entry>
<entry>
<date>03-05-2009</date>
<author>Nando:</author>
<change type="Changed">Core will no longer spam &quot;out-of-sequence gump command&quot; when closing.</change>
<change type="Changed">CloseGump(who, pid, response := 0) will now accept any object to be returned,<br/>
and will send '0' as the buttonid in close gump packet.</change>
<change type="Added">Statlock change (Extended Stats, 0xBF sub 0x1A) will be handled if<br/>
CoreHandledLocks is enabled. It will now send statlock (Extended Stats,<br/>
0xBF sub 0x19) on every status update.</change>
</entry>
<entry>
<date>03-04-2009</date>
<author>Nando:</author>
<change type="Added">UO::CloseGump(who, pid, response := 0), closes gump by sending 0xBF's CLOSE_GUMP,<br/>
and returns 'response' for the gump script. 'response' is a LONG. 'pid' is from<br/>
the script that issued the SendGumpDialog() command.</change>
</entry>
<entry>
<date>03-03-2009</date>
<author>MuadDib:</author>
<change type="Changed">Item and Character members for AOS Resistances now report the total of resist and<br/>
resist_mod.</change>
</entry>
<entry>
<date>03-02-2009</date>
<author>MuadDib:</author>
<change type="Fixed">eScript's Internal &quot;move&quot; command causing items to get misplaced in wrong realms<br/>
on move failed MoveItem* Commands in eScript.</change>
</entry>
<entry>
<date>03-02-2009</date>
<author>Nando:</author>
<change type="Fixed">When running out of memory, the creation of new threads is not possible. Core<br/>
will now check if the thread was properly created to (probably) solve the symptom<br/>
of zombie threads. The problem of not having enought memory to create thread is<br/>
not solved, though. There will still be logs of this error.</change>
</entry>
<entry>
<date>03-01-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Issue with Mount Objtype 0xF021 and EquipItem() ignoring setting it's Layer.</change>
<change type="Added">Complete packethook support with Clients 6.0.1.7 and higher. This is handled via<br/>
the earlier added Is6017 uopacket.cfg entry. This will allow you to specify a<br/>
packethook to be triggered ONLY if the client involved is 6.0.1.7 and higher.<br/>
It does not have to be a different packet size for this to work, only the client.</change>
<change type="Added">&quot;KR&quot; for expansion type. This includes sending the 0x86DB with packet 0xB9.</change>
</entry>
<entry>
<date>02-28-2009</date>
<author>MuadDib:</author>
<change type="Changed">UO::DestroyItem(). Now sends a Destroy Item packet to the script controller for<br/>
the item destroyed. This is in addition to sending in range of the item. Reason<br/>
for this, is for Storage Containers across realms.</change>
<change type="Added">New flag for uopacket.cfg of &quot;Is6017 0/1&quot;. This is show the defined packet entry<br/>
is explicity for a 6.0.1.7 and higher packet type. Will let you define packethooks<br/>
for the same packet, that is different based on client version.</change>
<change type="Added">Character.followers = int. This is for storage for the Followers byte in statmsg<br/>
packet.</change>
<change type="Added">ML Expansion statmsg packet support. If Expansion for account is ML or higher,<br/>
and client version is 5.0 or higher (or is KR), sends ML Info Flag and data.</change>
<change type="Added">Special Verbose messages (with POL.CFG::Verbose=1) for 6.0.5.0+ crypt seed packets<br/>
and the UOKR 0xFF Seed Packet.</change>
</entry>
<entry>
<date>02-27-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Clothing on corpses. COMPLETELY! This age old bug is now 100% fixed. If it was<br/>
equipped at time of death, it will be on the corpse until the on remove script<br/>
check for the corpse is triggered for taking the item out (on remove, not can)</change>
<change type="Added">Base 6.0.1.7 and up Incoming Packet Handling ability to core.</change>
<change type="Changed">Packets 0x3C updated for supporting clients 6.0.1.7. and newer.</change>
<change type="Changed">Grid index support (KR and 6.0.1.7) for Drop item Packet and sending. Grid<br/>
Index is still not set on Container Add by scripts and core yet (since this is<br/>
only truly needed for KR support for slotted bags).</change>
<change type="Changed">Updated Secure Trade Drop Item packet to support 6.0.1.7 and newer clients.</change>
<change type="Changed">Updated sending of packet 0x25 to support 6.0.1.7 and newer clients.</change>
</entry>
<entry>
<date>02-26-2009</date>
<author>Nando:</author>
<change type="Fixed">Bug where a player / npc moving in a diagonal direction 'd' wasn't blocked by<br/>
items on direction 'd+1' and 'd-1'. (For example, moving in direction NE while<br/>
having items blocking on N and E was allowed by core, while disallowed by client)</change>
</entry>
<entry>
<date>02-26-2009</date>
<author>Turley:</author>
<change type="Added">uo::CheckLosBetween( x1, y1, z1, x2, y2, z2, realm := _DEFAULT_REALM )<br/>
Same like uo::CheckLosAt and uo::CheckLineOfSight</change>
</entry>
<entry>
<date>02-25-2009</date>
<author>Nando:</author>
<change type="Added">New attributes.em functions: SetAttributeLock(who, attrname, lockstate) and<br/>
GetAttributeLock(who, attrname). With new constants: ATTRIBUTE_LOCK_UP,<br/>
ATTRIBUTE_LOCK_DOWN, ATTRIBUTE_LOCK_LOCKED. This works for any attribute.</change>
</entry>
<entry>
<date>02-25-2009</date>
<author>MuadDib:</author>
<change type="Added">Support for UOKR Poisoned Status bar updates. Core will now update UOKR clients correctly<br/>
when poisoned set to true or false for a character.</change>
</entry>
<entry>
<date>02-24-2009</date>
<author>MuadDib:</author>
<change type="Changed">SendPacket() now returns an error if packet string passed is not valid size (Divisible<br/>
by 2).</change>
<change type="Added">SendPacket() buffer size now allows max packet size. No more need to worry bout length.</change>
<change type="Fixed">Issue where equipped spellbooks would not open to the correct bookmarked page when opened.</change>
<change type="Added">Support of 0x25 Packet (Send item in container) with Client version &gt;= 6.0.1.7.</change>
<change type="Added">Support for Grid Index with Trade Container Packet sending.</change>
</entry>
<entry>
<date>02-22-2009</date>
<author>MuadDib:</author>
<change type="Changed">Updating of worn items will be handled by sending Delete Item packet to those<br/>
in range, then sending the worn item packets. This is to address an issue with<br/>
client not updating worn items on other players when graphics.color.etc are changed.</change>
<change type="Removed">Saving of base AOS Resistances to pcs.txt. This is not truly needed, as core will handle<br/>
updating these live based on the armor etc. resist mods only thing needing saved now at<br/>
this point. Just like AR. Same with Items.</change>
</entry>
<entry>
<date>02-22-2009</date>
<author>Nando:</author>
<change type="Added">New servspecopt.cfg option: CoreHandledLocks, default to false. If enabled, core will<br/>
handle the change of skill locks and stat locks from the client (setting the attribute<br/>
locks).</change>
<change type="Added">Every Attribute now have a lock state. Later, this lock state will be read/changed via<br/>
eScripts methods.</change>
</entry>
<entry>
<date>02-21-2009</date>
<author>MuadDib:</author>
<change type="Added">Ability to use Dice strings for AOS Resistances in itemdesc.cfg entries.</change>
<change type="Fixed">Bug allowing two players to open trade window, walk away, and continue trading. If players<br/>
get more than 4 tiles away, it will now cancel the trade upon walking to 5th tile away.</change>
<change type="Added">ServSpecOpt::AllowMovingTrade=0/1(default 0). 0 = Disable moving more than 4 tiles with<br/>
an open trade window. If you move more than 4 tiles from who trading with, cancels trade.</change>
<change type="Removed">UOClient::Listener::Statcap</change>
<change type="Added">Character.statcap = Replaces the Listener::Statcap. Default 225 r/w<br/>
Character.skillcap = This is for storage, of overall skillcap. Default 700 r/w<br/>
Character.followers_max = Max followers for statmsg packet. Default 0 r/w<br/>
Character.luck = Luck for statmsg packet. Default 0 r/w<br/>
Character.tithing = Tithing for statmsg packet. Default 0 r/w</change>
<change type="Added">Min/Max Damage added as per OSI Standards to Statmsg packet. This is done by the min and<br/>
max of the dice roll for a weapon before any mods etc.</change>
<change type="Fixed">Now cannot request stats for chars not visible to you, concealed from you, and over 20<br/>
tiles away.</change>
</entry>
<entry>
<date>02-20-2009</date>
<author>MuadDib:</author>
<change type="Added">Priv &quot;plogany&quot;. Used with new startlog and stoplog commands to activate target cursor.</change>
<change type="Changed">Built-in textcommand .startlog and .stoplog for packet logging. If character has the<br/>
plogany priv they get a target cursor to select who to set packet logging for.</change>
</entry>
<entry>
<date>02-18-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Fixed Physical Resist not showing correctly with AOS Resistances in Statbar in place of AR.</change>
</entry>
<entry>
<date>02-18-2009</date>
<author>Turley:</author>
<change type="Fixed">..Boat Fix Drunken Coder syndrome?</change>
</entry>
<entry>
<date>02-17-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Instances where core uses UO::ClearGottenItem() type code caused ghosted item on client<br/>
cursor. Will require more feedback from users after publish for remaining instances<br/>
where this still occurs (outside of ClearGottenItem()).</change>
</entry>
<entry>
<date>02-16-2009</date>
<author>Turley:</author>
<change type="Fixed">Hold again part of boat multi</change>
</entry>
<entry>
<date>02-07-2009</date>
<author>Turley:</author>
<change type="Removed">SystemFindObjectBySerial() flag SYSFIND_SEARCH_STORAGE_AREAS (was obsolete since years)</change>
</entry>
<entry>
<date>02-05-2009</date>
<author>MuadDib:</author>
<change type="Added">UOClient::Listener::AOSResistances 0/1. This flag aids in deciding which version<br/>
of Armor to send in the StatMsg packets. With this enabled, a client who uses<br/>
an account with AOS Expansion enabled will see their Physical Resist instead<br/>
of AR member.</change>
</entry>
<entry>
<date>02-03-2009</date>
<author>MuadDib:</author>
<change type="Added">Character.resist_fire_mod/resist_cold_mod/resist_energy_mod/resist_poison_mod<br/>
/resist_physical_mod as R/W.</change>
<change type="Added">Item.resist_fire_mod/resist_cold_mod/resist_energy_mod/resist_poison_mod<br/>
/resist_physical_mod as R/W.</change>
<change type="Changed">GetItemDescriptor() Handles new AOS Resistance Entries.</change>
<change type="Added">POL Debug Port has access to Mobile/Item resist members.</change>
</entry>
<entry>
<date>02-02-2009</date>
<author>MuadDib:</author>
<change type="Added">Anytime AR will get refreshed (armor damaged, equip/unequip, etc), Resistances<br/>
for Character will also get updated based on the items worn.</change>
<change type="Note">UO::EquipItem() and UO::EquipItemFromTemplate() trigger the same Equip Code in<br/>
core as dropping it on your paperdoll. So should be up to date with new resistance<br/>
code in equipping also.</change>
<change type="Note">AOS Physical Resist is NOT the same as AR. Keep that in mind, when writing syshooks<br/>
for combat, equip scripts, spells, etc. Eventually Core Combat will differentiate<br/>
between these based on Expansion (on which to use for a client or npc). But as of<br/>
right now, they will always use AR for combat, etc.</change>
</entry>
<entry>
<date>02-01-2009</date>
<author>MuadDib:</author>
<change type="Added">Character.resist_fire/resist_cold/resist_energy/resist_poison/resist_physical members<br/>
as R/O. All these are for is storage. No core implementation for resists is present.<br/>
These ARE sent with the Full Stat Msg packet also, based on Expansion. These are also<br/>
stored to pcs.txt.</change>
<change type="Added">Item.resist_fire/resist_cold/resist_energy/resist_poison/resist_physical members as R/O.<br/>
This was added at item level, to cover armor, weapons, clothing, containers, etc for<br/>
broad spectrum use on any item class that could be equipped. Such as Quivers and Totems<br/>
in AOS.</change>
<change type="Added">NPC.resist_fire/resist_cold/resist_energy/resist_poison/resist_physical members as R/O.</change>
<change type="Added">NPCTemplate::FireResist/ColdResist/EnergyResist/PoisonResist/PhysicalResist. These work<br/>
just like NPCTemplate::AR. You CAN use diceroll strings for these just like AR, or a set<br/>
number for it's amount.</change>
<change type="Note">These are only written to file if the amount is != 0.</change>
<change type="Added">Itemdesc FireResist/ColdResist/EnergyResist/PoisonResist/PhysicalResist.</change>
</entry>
<entry>
<date>01-29-2009</date>
<author>MuadDib:</author>
<change type="Added">NPC.saveonexit 0/1. Same as for Items. When set to 0 (1 default), the NPC and all<br/>
items contained within it's wornitems container are IGNORED during save.</change>
<change type="Fixed">Parry will now only refresh the AR if a shield is equipped, as was intended.</change>
<change type="Removed">Some ... Drunken Coder syndromes. :)</change>
</entry>
<entry>
<date>01-28-2009</date>
<author>MuadDib:</author>
<change type="Changed">Rewrote ObjCache Building. Now constructs the packet for uokr/aos once when sending<br/>
to a group (send to in range). Previous method built this packet per client requiring<br/>
it. Should improve handling in populated areas.</change>
<change type="Fixed">Client bug where AOS Expansion accounts could not see normal magery books without<br/>
UOFeatureEnable 0x20 bit set. Although this IS a client bug, found a way to fix this<br/>
VERY common bug server-side. As a feature of this fix, you can now have the AOS<br/>
features that do NOT require 0x20 (tooltips etc), AND the magery books work without<br/>
packet hooks.</change>
</entry>
<entry>
<date>01-28-2009</date>
<author>Turley:</author>
<change type="Changed">Optional parameter flags:=FACE_NORMAL/FACE_FORCE added to<br/>
TurnToward(),TurnAwayFrom(), TurnTowardLocation(), TurnAwayFromLocation()</change>
<change type="Fixed">servspecopt option HiddenTurnsCount check readded in facing change</change>
<change type="Fixed">Privilege &quot;freemove&quot; can now also be used for NPCs</change>
</entry>
<entry>
<date>01-27-2009</date>
<author>MuadDib:</author>
<change type="Changed">uoclient.cfg::General::Statcap is deprecated now. Please change to now use<br/>
uoclient.cfg::Listener::Statcap. This is for the new upcoming Listener Seperate<br/>
settings. This new step in POL will allow custom settings for clients based on the<br/>
Listener (uoclient.cfg) they are connecting through. Upcoming changes (but not yet<br/>
done) will include such things as UOFeatureEnable, TotalStatsAtCreation, ItemColorMask,<br/>
and so on. This is to make it so you can configure different ports for different client<br/>
configurations and expansions. One use of this, is to allow both 2.0.0 clients on your<br/>
shard, AOS Clients with Tooltips, ML Clients without tooltips, and so on. The<br/>
possibilities will be good, and really expand the support you can give with your<br/>
scripts.</change>
<change type="Fixed">Magery Books will now be viewable for AOS enabled accounts on servers that do NOT have<br/>
the UOFeatureEnable 0x20 bitflag to enable AOS style books. This was implemented to fix<br/>
a CLIENT BUG. But, since so many people do not seem to realize you MUST have 0x20 on for<br/>
AOS style book handling on AOS activated accounts, we must do this. Boo to you :(</change>
</entry>
<entry>
<date>01-27-2009</date>
<author>Turley:</author>
<change type="Changed">math::Min/Max now accepts Array as first parameter, if given returns the biggest/lowest<br/>
Integer/Double entry (second parameter is ignored).</change>
<change type="Errors">&quot;Array empty&quot;&amp;&quot;No Integer/Double elements&quot;<br/>
Second parameter has now default value of 0</change>
</entry>
<entry>
<date>01-25-2009</date>
<author>MuadDib:</author>
<change type="Changed">Rewrote entire core handling of config/bannedips.cfg<br/>
This should address a small memory leak caused by the cfg system (leak still exists<br/>
I just changed how it is done with this file). It also will increase POL speed for<br/>
login/account verification. Remember, the larger your bannedips.cfg, the longer it takes<br/>
for the loginserver to verify the client IP is not banned.</change>
<change type="Added">ReloadConfiguration() will cause the bannedips.cfg to get reloaded. YAY.</change>
<change type="Added">Item.saveonexit member. Does what it says. All items default to 1. If you set this<br/>
to 0 the item and (if container, it's contents) will NOT be saved to datafile.</change>
</entry>
<entry>
<date>01-23</date>
<author>Nando:</author>
<change type="Changed">polcore().bytes_sent and polcore().bytes_received are now Doubles. This will fix some<br/>
problems with negative values after some time... (internally they are now 64 bit integers).</change>
<change type="Note">Lots of small leaks fixed, and more to come. Too much to list here, but you will feel the<br/>
difference.</change>
</entry>
<entry>
<date>01-16</date>
<author>Turley</author>
<change type="Fixed">Filled PolCore().iostats.received with sense</change>
</entry>
<entry>
<date>01-16</date>
<author>Nando</author>
<change type="Fixed">UOConvert was always reading map0.mul when uomapid is 1. It will now try to read map1.mul,<br/>
and if not found read map0.mul. (The same for staidx1 and statics1)</change>
</entry>
<entry>
<date>01-07</date>
<author>MuadDib</author>
<change type="Added">Due to Ecompile always breaking for single file and right click compile useage when<br/>
no absolute path is given in the ecompile.cfg, added redundant code to verify drive<br/>
letter path in Windows environments. (aka, if you use &quot;scripts&quot; for include directory<br/>
instead of &quot;c:\pol\scripts&quot;). This should help in most cases. (Win32 Cores only right now)</change>
<change type="Note">This works by checking if the core simply looked for &quot;ecompile.cfg&quot; or if it used the<br/>
-C &lt;path to config&gt; and handled accordingly. If you pass -C &lt;path&gt; it uses that to append<br/>
to the beginning of the dir structure in the config. Otherwise it appens the structure<br/>
based on the location of ecompile.exe being executed (since it's looking there for the cfg).</change>
<change type="Note">In case people never realized. If you set the Evironment Variable called ECOMPILE_CFG_PATH<br/>
to point directly to the path where ecompile.cfg is kept, Ecompile.exe will use this to<br/>
locate your config file (Read core-changes people :D )</change>
<change type="Added">ECompile.exe Flag &quot;-E&lt;path to ecompile cfg&gt;&quot;. Correct, no space between them just like the<br/>
-Ppath Option. This is for Windows machines. It sets/changes the ECOMPILE_CFG_PATH Environment<br/>
Variable via the commandline so no need to add/edit it via the System Properties of the machine.<br/>
Remember, you must be logged in with Admin rights to change Environment Variables and this won't<br/>
show in the System Properties until Reboot. But it IS accessible WITHOUT rebooting.</change>
</entry>
<entry>
<date>01-03</date>
<author>MuadDib</author>
<change type="Added">Ability to send two commands to the POL Service via SCM (Service Control Manager).<br/>
Command 1200 is a Beep (just for Nando), and 1201 will initial POL Shutdown just like<br/>
via Script or clicking on Stop on the POL System Tray Icon.<br/>
More to come later.</change>
<change type="Fixed">Drunken coder syndrome in the AOS Tooltip handling and oldschool Tooltip code too.</change>
<change type="Removed">Logging/Reporting of empty Attack Request Packets. Useless information that is unreliable.</change>
<change type="Removed">References to unused portions of POL.cfg (things no longer supported that was still being<br/>
checked for).</change>
</entry>
<entry>
<date>01-02</date>
<author>Turley</author>
<change type="Changed">Scriptname &amp; PC info in .setprop log entry &quot;wtf, setprop w/ an error&quot;</change>
</entry>
<entry>
<date>12-26</date>
<author>MuadDib</author>
<change type="Added">Ecompile.exe flag -xt defined in /? output.</change>
<change type="Added">Ecompile.exe flag -Au added. This is same as -A but to only compile Updated Src.</change>
<change type="Added">Ecompile.exe flag -s to Display Summary if -q is not set.</change>
<change type="Added">Ecompile.exe flag -D to create .dep files (Dependency information).</change>
</entry>
<entry>
<date>12-20</date>
<author>Turley:</author>
<change type="Added">new char member .clientver_detail returns struct of ints {major;minor;rev;patch}<br/>
new char method .compareversion(string) returns 1 if clientversion is &gt;= then given version string<br/>
else 0 or error &quot;Not enough parameters&quot;/&quot;Invalid parameter type&quot;/&quot;No client attached&quot;</change>
<change type="Added">new ssopt &quot;ForceNewObjCachePackets&quot; default false</change>
<change type="Added">support for new ObjectCacheInfos introduced in 5.0.0<br/>
old behavior: Server sends 0xBF Sub 0x10 per object -&gt;Client response also with 0xBF Sub 0x10 per item<br/>
new behavior: Server sends 0xDC per object -&gt; Client response with 0xD6 (there can be more then one serial up to ~16)<br/>
intern check is<br/>
if ((ssopt.ForceNewObjCachePackets) || (isUOKR) || (clientversion.major&gt;=5))<br/>
since the client sends his clientversion not instantly the first few ObjCacheInfos are sent<br/>
the old way (thats why the new ssopt is added)</change>
<change type="Note">since client 6.0.5.0 the clientversion is instantly known (new seed packet)</change>
<change type="Added">support of new seed packet (&gt;=6.0.5.0)</change>
<change type="Note">right now no new packet is implementend (some packetsizes have changed)</change>
</entry>
<entry>
<date>12-19</date>
<author>Turley:</author>
<change type="Changed">Extended PerformAction() it is now:<br/>
PerformAction(character,action,framecount:=5,repeatcount:=1,<br/>
backward:=ACTION_DIR_FORWARD,repeatflag:=ACTION_NOREPEAT,delay:=1);</change>
</entry>
<entry>
<date>12-18</date>
<author>MuadDib:</author>
<change type="Changed">Aux Client now sends &quot;Connection closed&quot; to a client that attempts to connect<br/>
from an invalid IP according to IPMATCH settings before closing the socket.</change>
</entry>
<entry>
<date>12-18</date>
<author>Turley:</author>
<change type="Added">Setting for servspecopt.cfg 'PrivacyPaperdoll' Default is disabled.<br/>
If enabled, Paperdoll gives only char name for others (See Luth 09-28)</change>
</entry>
<entry>
<date>12-17</date>
<author>MuadDib:</author>
<change type="Fixed">Item.layer gets reset to 0 when unequipped.</change>
<change type="Fixed">When loading Realms, POL will shutdown if it cannot find any realms<br/>
and say so.</change>
<change type="Added">Item.tile_layer returns the Layer setting in the Tiles.cfg/Tiledata.<br/>
This was added to always give the layer it uses, while leaving the<br/>
internal handling both of Core and Scripts that utilize the fact of<br/>
&quot;if layer is set, it's equipped&quot;. This is ALWAYS set from the tile info<br/>
at server load. So changing your tiledata, re-creating tiles.cfg will<br/>
auto update your items.</change>
<change type="Note">Item.layer gets internally reset on server load if it is equipped, via<br/>
tiles.cfg entry as well.</change>
</entry>
<entry>
<date>12-16</date>
<author>MuadDib:</author>
<change type="Added">AuxSvc Configs now accept an IPMATCH entry identical to /config/servers.cfg.<br/>
This is only an additional security feature, and not required to be in the .CFG :)<br/>
The illegal ip will be treated by immediately closing the connection.</change>
</entry>
<entry>
<date>12-14</date>
<author>Nando:</author>
<change type="Fixed">Characters/Starting Location packet wasn't sending the correct characters number. This<br/>
was causing problems when enabling the 6th &amp; 7th slot (or limiting to 1 slot). Characters<br/>
number will now be set to Max(CharacterSlot, 5). The number of CharacterSlots shown will<br/>
depend on the acct expansion. (If it´s more than AOS, it'll send &gt; 6, else 5).</change>
<change type="Added">Flags in the Characters/Starting Location packet and the Enable Features (0xB9) are<br/>
now being set according to the CharacterSlots option in pol.cfg. It only works now<br/>
with 1, 5, 6 and 7 slots, as this is a client limitation. You can hook the 0xB9 packet<br/>
to change this in the future.</change>
</entry>
<entry>
<date>12-10</date>
<author>Nando:</author>
<change type="Removed">POL's Windows-systray-icon beep when right-clicking is now gone.</change>
<change type="Changed">Region's internal tile zone is now 4x4 (was 32x32).</change>
</entry>
<entry>
<date>12-05</date>
<author>Luth:</author>
<change type="Fixed">A bug in Run_Script caused when a Parent script ended before the child script.</change>
</entry>
<entry>
<date>10-29</date>
<author>Luth:</author>
<change type="Changed">PrintTextAbove*() now takes one more optional parameter, journal_print, with acceptible values:</change>
<change type="JOURNAL_[UC_]PRINT_NAME">In the journal, it prints the item's description / npc's name, colon, the message (POL standard)</change>
<change type="JOURNAL_[UC_]PRINT_YOU_SEE">In the journal, it prints &quot;You see: &quot; followed by the message (UO standard)<br/>
This does not affect the text that is printed above the item, ONLY what is shown in the Journal.</change>
<change type="Fixed">OnRemoveScript and OnInsertScript now called with all appropriate parameters<br/>
program onremovescript(character, container, item, item_amount, movetype)<br/>
program oninsertscript(character, container, movetype, inserttype, adding_item, existing_stack, amount_to_add)</change>
</entry>
<entry>
<date>10-28</date>
<author>Luth:</author>
<change type="Changed">Set_Script_Option() now returns the previous value that was set for that option</change>
</entry>
<entry>
<date>09-28</date>
<author>Luth:</author>
<change type="Added">npc::Face( direction );</change>
<change type="Added">mobile.SetFacing( direction, flags := FACE_NORMAL );</change>
<change type="Note">mobile.facing := [0-7]; is the same as calling: mobile.SetFacing( [0-7], FACE_NORMAL );</change>
<change type="Added">MOVEITEM_IGNOREMOVABLE flag to move an object regardless of its .movable property</change>
<change type="Fixed">Paperdolls now give all information for self, and less information for others</change>
</entry>
<entry>
<date>09-23</date>
<author>Turley:</author>
<change type="Added">uo::PlaySoundEffectXYZ( x, y, z, effect, realm := _DEFAULT_REALM );</change>
</entry>
<entry>
<date>09-17</date>
<author>Turley:</author>
<change type="Added">uo::CreateNPCFromTemplate param override_properties can now<br/>
contain .CProps Dictionary (key=cpropname value=cpropvalue)</change>
</entry>
<entry>
<date>09-08</date>
<author>Turley:</author>
<change type="Added">uo::UpdateMobile(mob)<br/>
Sends to mobiles in visual range UpdatePlayer packet of mob, for example to<br/>
inform of notority changes</change>
<change type="Added">Packet 0xC7 Functions:<br/>
uo::PlayMovingEffectEx( source, target, effect, speed, duration := 0,<br/>
hue := 0, render := 0, fixeddirection := 0, explode := 0,<br/>
effect3d := 0, effect3dexplode := 0, effect3dsound := 0 );<br/>
uo::PlayMovingEffectXYZEx( srcx, srcy, srcz, dstx, dsty, dstz, realm := _DEFAULT_REALM,<br/>
effect, speed, duration := 0, hue := 0, render := 0,<br/>
fixeddirection := 0, explode := 0,<br/>
effect3d := 0, effect3dexplode := 0, effect3dsound := 0 );<br/>
uo::PlayObjectCenteredEffectEx( center, effect, speed, duration := 0, hue := 0,<br/>
render := 0, layer := 0, effect3d := 0 );<br/>
uo::PlayStationaryEffectEx( x, y, z, realm := _DEFAULT_REALM, effect, speed,<br/>
duration := 0, hue := 0, render := 0,<br/>
layer := 0, effect3d := 0 );<br/>
layer,effect3d,effect3dexplode,effect3dsound are only interpreted by the 3D client<br/>
(current known) render values are:<br/>
0 no change<br/>
1 It becomes dark<br/>
2 It becomes bright<br/>
3 Bright color is emphasized and dark color is converted transparently<br/>
4 The translucency (transparency is high)<br/>
5 The translucency (it is close to primary color)<br/>
6 Negative positive reversal<br/>
7 The background which is transparent negative positive reversal<br/>
layer values are:<br/>
0 Head<br/>
1 RightHand<br/>
2 LeftHand<br/>
3 Waist<br/>
4 LeftFoot<br/>
5 RightFoot<br/>
7 CenterFeet<br/>
effect3dexplode and effect3dsound are only interpreted if explode is set<br/>
effect3d and effect3dexplode values can be found in client/particles dir<br/>
Examples:<br/>
CastAnimation only seen by 3D clients:<br/>
PlayObjectCenteredEffectEx( chr, 0, 10, 5, 0, 0, 1, 9041 ); //firesparkle on right hand<br/>
PerformAction(chr,0xCB); // moves with char<br/>
Fireball with explosion and sound:<br/>
PlayMovingEffectEx( chr,tar,0x36d4,7,0,0,0,0,1,9502,4019,0x160);</change>
<change type="Changed">StatRequest 0x34 checks if target is visible to char (e.g. Injection exploit)</change>
</entry>
<entry>
<date>08-29</date>
<author>Turley:</author>
<change type="Added">uo::GetGlobalPropertyNames()</change>
<change type="Changed">uo::FindSubstance( container, objtype, amount, makeinuse := 0 );<br/>
to FindSubstance( container, objtype, amount, makeinuse := 0, flags := 0 );<br/>
flags are:</change>
<change type="FINDSUBSTANCE_IGNORE_LOCKED">Find matches in locked containers</change>
<change type="FINDSUBSTANCE_ROOT_ONLY">Do not find matches in sub-containers</change>
<change type="FINDSUBSTANCE_FIND_ALL">Find all matches ignoring given amount</change>
<change type="Added">new Char methods:<br/>
.attack_once([opp])<br/>
attacks once without modifing the swingtimer<br/>
if no opp is given attacks current attackable opponent, else attacks given opponent (and<br/>
but checks if opponent is attackable<br/>
.setswingtimer(time)<br/>
if opponent is set sets swingtimer to given ms time<br/>
.kill([killer])<br/>
kills character ignoring invul, if killer is set repsys:OnDamage is called</change>
<change type="Added">new Char members:<br/>
.hitchance_mod +-int in thousandth<br/>
additive modificator of the hitchance from the attacker<br/>
.evasionchance_mod +-int in thousandth<br/>
subtractive modificator of the hitchance from the defender</change>
<change type="Added">new privilages:<br/>
&quot;firewhilemoving&quot; : swingtimer will not be reset if char is moving with projectile weapon<br/>
&quot;attackhidden&quot; : char can attack hidden opponents<br/>
&quot;hiddenattack&quot; : char can attack while hidden</change>
<change type="Added">new systemhook script 'HitMiss'<br/>
function HitMiss(attacker, defender)<br/>
is called if hitchance check fails no overriding of corefunctions or resultcheck</change>
</entry>
</version>
<version name="POL097.4">
<entry>
<date>03-19-2009</date>
<author>MuadDib:</author>
<change type="Fixed">Crash in reporting of leftover objects during Shutdown.</change>
</entry>
<entry>
<date>02-28-2009</date>
<author>VeNdOr:</author>
<change type="Fixed">Crash involving Auxconnection.ip.</change>
<change type="Fixed">NPC events ENTEREDAREA and LEFTAREA were both fired even when one of them was eanbled.</change>
</entry>
<entry>
<date>02-28-2009</date>
<author>MuadDib:</author>
<change type="Fixed">NPC.ar bug where ar was not reading intrinsic ar correctly when using ar_mod for<br/>
the NPC.</change>
</entry>
<entry>
<date>02-25-2009</date>
<author>Nando:</author>
<change type="Fixed">Removed a stray '\n' that was being sent at the end of a binary transfer in browser, causing<br/>
some images to be corrupted. (This will finally solve the problem with some 'blank' images)</change>
</entry>
<entry>
<date>02-22-2009</date>
<author>Nando:</author>
<change type="Fixed">Internal webserver will now handle binary files correctly. This was causing sporadic fails<br/>
when loading a webpage which had images, stylesheets or any other of those fancy things...</change>
</entry>
</version>
<version name="POL097.3">
<entry>
<date>01-31-2009</date>
<author>MuadDib:</author>
<change type="Added">POL.Cfg::MiniDumpType=variable. This is a new DMP file version. For now, I HIGHLY<br/>
RECOMMEND USING THIS IF YOU EXPERIENCE A LOT OF CRASHES OR ONES YOU CAN'T FIGURE OUT!<br/>
The reason for this, is it is a small dump PLUS it stores all variable information<br/>
from internal core functions in relation to the crash. This is information that<br/>
could be VERY crucial to us Core Developers when you send the DMP file to the forums.<br/>
So please, try to start using this one (We know the large option can be horendous.<br/>
This is an alternative to that).</change>
<change type="Fixed">Null Package fix (Luth did this one a while back in 098)</change>
</entry>
<entry>
<date>01-14</date>
<author>Nando</author>
<change type="Changed">Highest allowed mobile graphic is now 0x800 (2048). Was 1024 since POL070.. wow... :)</change>
</entry>
</version>
<version name="POL097.2">
<entry>
<date>01-05</date>
<author>Turley</author>
<change type="Fixed">URL percent decoding (like %2F= '/')</change>
</entry>
<entry>
<date>12-31</date>
<author>Nando:</author>
<change type="Fixed">Internal webserver's threads weren't being reported in case there were threads<br/>
hanging when shutting down. This might not solve the &quot;zombie connections&quot; bug,<br/>
but will at least change it's name to &quot;internal webserver bug&quot;, I'm hoping.</change>
</entry>
<entry>
<date>12-30</date>
<author>MuadDib:</author>
<change type="Added">POL.Cfg::ReportMissingConfigs 0/1 (Default 1). Handles if Missing Config File<br/>
reports are printed to the Debug.Log file. These are reports for example, when<br/>
you use :*:npcdesc to open all npcdesc files in a script but not all packages<br/>
of course will have this file.</change>
<change type="Changed">Weapons now have a Default Speed of 35 if no entry for Speed is in the itemdesc.cfg<br/>
file if Delay is used. If no Delay, then will still throw an error and fail to load.</change>
<change type="Fixed">Typo on spellbook reports.</change>
</entry>
<entry>
<date>12-17</date>
<author>MuadDib:</author>
<change type="Fixed">Possible memory leak with AOS Tooltips.</change>
</entry>
<entry>
<date>12-16</date>
<author>MuadDib:</author>
<change type="Fixed">Memory leak in Packet Class using .Setxxxx Methods on Variable Length Packets.</change>
<change type="Added">Error Struct &quot;Offset value out of range on a fixed length packet&quot; when trying<br/>
to use packet.Setxxxx() whose value is out of range in a fixed length packet.</change>
</entry>
</version>
<version name="POL097.1">
<entry>
<date>09-17</date>
<author>Turley:</author>
<change type="Changed">To simplify usage util::RandonIntMinMax() now accepts<br/>
negative Integers and if parameters in wrong order swaps them</change>
</entry>
<entry>
<date>09-12</date>
<author>Turley:</author>
<change type="Fixed">Memoryleak in PathFind</change>
<change type="Fixed">If only PacketHook SendFunction is defined on receive default handler is called if exists</change>
</entry>
<entry>
<date>09-09-2008</date>
<author>Austin:</author>
<change type="Fixed">Usernames and passwords will accept all characters except control characters<br/>
'\t','\f','\v','\n','\r' the characters '{' '}' and spaces.</change>
</entry>
</version>
<version name="POL097">
<entry>
<date>08-28</date>
<author>Turley:</author>
<change type="Fixed">math::Min()/Max() now returns Integer/Double based on params</change>
</entry>
<entry>
<date>08-26</date>
<author>Turley:</author>
<change type="Fixed">AR recalc if parryskill changes, or if hp,maxhp_mod,ar_mod of equipt armor changes</change>
</entry>
<entry>
<date>08-23</date>
<author>Turley:</author>
<change type="Fixed">Event queue full error prints now event details</change>
</entry>
<entry>
<date>08-20</date>
<author>Turley:</author>
<change type="Fixed">server-side check if item is stackable on drop</change>
</entry>
<entry>
<date>08-19</date>
<author>Turley:</author>
<change type="Fixed">Character.clientversion string</change>
</entry>
<entry>
<date>08-19</date>
<author>Luth</author>
<change type="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.</change>
</entry>
<entry>
<date>08-16</date>
<author>Turley:</author>
<change type="Changed">Character.connected startup value is 0</change>
<change type="Added">Accountname string struct member &quot;account&quot; added to<br/>
pre-character selection Packets</change>
</entry>
<entry>
<date>08-15</date>
<author>Austin:</author>
<change type="Added">Setting for servspecopt.cfg 'ScriptedAttackChecks' Default is disabled.<br/>
If enabled, the combat hook must check distance, line of sight, visibility<br/>
and if both combatants are alive.</change>
</entry>
<entry>
<date>07-29</date>
<author>Mehdorn:</author>
<change type="Changed">uo::ReserveItem() will return<br/>
1 - Item has been reserved by me.<br/>
2 - Item was already reserved by me.<br/>
Error - Item is in use by someone else, or invalid Parameter.</change>
</entry>
<entry>
<date>07-08</date>
<author>Turley:</author>
<change type="Changed">Status of other player (e.g. WarMode) will be shown correctly.</change>
<change type="Added">Character.MoveMode member. Returns the MoveMode like given in NPCDesc.</change>
<change type="Added">Item.Stackable member. Returns 0/1 based on stackability of Item.<br/>
uo::IsStackable(). Returns 0/1 if both Items can be stacked together.</change>
<change type="Changed">Random Number Generator &quot;lagged Fibonacci generator&quot; will be used.</change>
<change type="Added">util::RandomIntMinMax(). Return Random Value between...</change>
</entry>
<entry>
<date>07-26</date>
<author>VeNdOr:</author>
<change type="Added">ApplyDamage now returns the real damage applied to the mobile.</change>
</entry>
<entry>
<date>05-28</date>
<author>VeNdOr:</author>
<change type="Fixed">In some conditions, when the AuxScript exited, the AuxConnection didn't close.</change>
</entry>
<entry>
<date>05-23</date>
<author>Austin:</author>
<change type="Fixed">If MinCmdlevelToLogin was used, characters could not be created.<br/>
POL will now check the account's default command level.</change>
<change type="Added">servspecopt.cfg CoreHitSounds default: disabled<br/>
If disabled, scripts will handle sounds when a mobile is damaged.<br/>
If enabled, will work as it did before - but for npcs will use a DamagedSound<br/>
property from its config file.</change>
</entry>
<entry>
<date>02-09</date>
<author>Shinigami:</author>
<change type="Fixed">Bug in Unpack() with zero length Strings.</change>
</entry>
<entry>
<date>02-08</date>
<author>Austin:</author>
<change type="Added">CharacterSlots setting in pol.cfg. Defaults to 5. This is to set the maximum number<br/>
of slots an account can hold - to support clients that support 6 slots.</change>
</entry>
<entry>
<date>02-05</date>
<author>Austin:</author>
<change type="Changed">The freemove privilege will also allow targetting to be done when frozen / paralyzed.</change>
</entry>
<entry>
<date>02-02</date>
<author>Madman:</author>
<change type="Changed">Trying to move when Paralyzed will no longer spam your screen with<br/>
&quot;You are frozen and cannot move.&quot;</change>
</entry>
<entry>
<date>12-09</date>
<author>Shinigami:</author>
<change type="Fixed">Bug in Unpack() with Strings in Arrays, Dictionaries etc. in case that<br/>
the String is not the last element.</change>
</entry>
<entry>
<date>11-05</date>
<author>MuadDib</author>
<change type="Added">Character.Cursor member. Returns 0/1 based on if character has an active<br/>
cursor.<br/>
Character.Gump member. Returns 0/1 based on if character has any active<br/>
gumps.<br/>
Character.Prompt member. Returns 0/1 based on if character has any active<br/>
unicode and/or normal text prompt gumps open.</change>
</entry>
<entry>
<date>10-20</date>
<author>MuadDib</author>
<change type="Removed">Basic::Left and Basic::Mid. These functions reported not working since<br/>
095, and code was set to not use them anyway. Val[int, int] works anyway<br/>
and does what these functions do.</change>
<change type="Added">Basic::SubStr(string, start, length). Replace for left/right/mid. Works<br/>
same way as virtual SubStrings in eScript (val[int, int]). This is for<br/>
those who like the func methods instead.</change>
<change type="Added">Math::Min and Math::Max functions.</change>
</entry>
<entry>
<date>10-11</date>
<author>MuadDib</author>
<change type="Fixed">Changing realms with Season info would reset light levels until next<br/>
light update in that realm. Send Season in core now sends light level<br/>
whenever season info is sent to the client (Client issue). Also fixes<br/>
an issue with seasons and 1.x clients.</change>
<change type="Added">servspecopt.cfg::DefaultLightLevel=ushort. New default light level<br/>
setting for regions with no light level defined in regions cfg files.<br/>
Default is 10. Replaced arbitrary setting in core.</change>
<change type="Fixed">Exploit in Create Character system.</change>
</entry>
<entry>
<date>10-10</date>
<author>MuadDib</author>
<change type="Fixed">uo::CreateAccount() will no longer accept non-alphanumeric characters<br/>
for account name, will return error stating such if one is used. Also<br/>
now passwords can contain all characters except whitespace and control<br/>
characters. Please test heavily. I tested for the commons via script<br/>
already.</change>
</entry>
<entry>
<date>10-04</date>
<author>MuadDib</author>
<change type="Changed">NPC::IsLegalMove() will now explicitly check for a MOVE in the given<br/>
direction, regardless of NPC's current Facing. Will stop AI's that<br/>
have NPC's using Bounding Boxes that walk out of the box by checking<br/>
legal move, turning, then moving 1 step. Please be sure to check<br/>
your AI's that use bounding boxes, to see if you coded that way!<br/>
This check is for step movement. Facing should only be blockable if<br/>
frozen, paralyzed, or stamina affected (if server set to use stam).</change>
<change type="Fixed">Exploit in Unpack() with Arrays and Dictionaries. If an element within<br/>
the pack returns an error when unpacked, Unpack() halts and returns an<br/>
error. Still ignores Uninit stuff as before. Same reasoning for fix as<br/>
with Strings on 10-02. Dictionary will continue on and insert the error<br/>
returns in key/value entries.</change>
</entry>
<entry>
<date>10-02</date>
<author>MuadDib</author>
<change type="Fixed">Exploit in unpacking Strings with length definition. Affected manual<br/>
building of packed versions such as in use by Aux connections etc.<br/>
New error returns:<br/>
&quot;Unable to unpack string length. Invalid length!&quot; = 0 or less Length<br/>
&quot;Unable to unpack string length. Bad format. Colon not found!&quot; = Duh.<br/>
&quot;Unable to unpack string length. String length excessive.&quot; = Said it 3,<br/>
but length was actually less.<br/>
&quot;Unable to unpack string length. String length short.&quot; = Said it was 3,<br/>
but length was actually more.</change>
<change type="Note">The following is acceptable in packed data sets.<br/>
's' = String data, no length defined. Ex: sHello World!<br/>
'S': String With Length defined. Ex: S12:Hello World!<br/>
'i': Integer follows. Ex: i12<br/>
'r': Double Integer format. Ex: r12.9<br/>
'u': Unitialized Object format.<br/>
'a': Array follows. Ex: a2:S12:Hello World!S12:Hello World.<br/>
'd': Dictionary.<br/>
't': Struct<br/>
'e': Escript Error<br/>
'x': Unitialized Object<br/>
If you ever question the format for something packed, then just use<br/>
the Pack() function on your data, to see the end result.</change>
</entry>
<entry>
<date>09-05</date>
<author>VeNdOr</author>
<change type="Fixed">equipped items become invisible on realms different from britannia</change>
</entry>
<entry>
<date>09-04</date>
<author>VeNdOr</author>
<change type="Added">auxconnection.ip -- returns remote ip of connection as string</change>
</entry>
<entry>
<date>08-20</date>
<author>Shinigami</author>
<change type="Fixed">Bug in config/movecost.cfg - &quot;Walking_Mounted&quot; section was ignored</change>
</entry>
<entry>
<date>08-19</date>
<author>Shinigami</author>
<change type="Fixed">Memory Leak in PacketHook functions</change>
</entry>
<entry>
<date>07-09</date>
<author>Shinigami</author>
<change type="Added">added UO:KR login process</change>
<change type="Added">player.isUOKR -- returns 1 if player uses an UO:KR client</change>
</entry>
<entry>
<date>06-17</date>
<author>Shinigami</author>
<change type="Added">Entry to pol.cfg 'WorldDataPath' to set a different path to the data files.<br/>
Defaults to 'data/'</change>
</entry>
<entry>
<date>05-04</date>
<author>Shinigami</author>
<change type="Added">uo::GetRegionName( object ) - get name of [justice] region<br/>
uo::GetRegionNameAtLocation( x, y, realm ) - get name of [justice] region</change>
</entry>
<entry>
<date>04-12</date>
<author>Austin</author>
<change type="Added">Projectile support for NPC intrinsic weapons.<br/>
Property keys are AttackProjectile, AttackProjectileAnim, AttackProjectileType and AttackProjectileSound</change>
</entry>
<entry>
<date>04-08</date>
<author>MuadDib</author>
<change type="Fixed">Crash involving Realms() and passing non-string param or empty param to it.</change>
<change type="Changed">Sending of worn items to inrange pcs has been optimized. Should help<br/>
reduce load a little bit for fully dressed mobs and full packs. Maybe<br/>
reduce server load during bashes? Would require testing of course to make<br/>
that statement :)</change>
<change type="Removed">CreateNPCFromTemplate() will now only accept Struct for override props.<br/>
Arrays was removed due to core changes in array handling since this<br/>
function was updated to use arrays.</change>
</entry>
<entry>
<date>04-04</date>
<author>MuadDib</author>
<change type="Added">WornItms Container checks that look for and handle container class<br/>
objects like Quivers, etc, will ignore the following layers for the<br/>
obvious and specific reasons:<br/>
11 (hair), 15 (shhhh), 16 (beard), 21 (pack), 25 (mount)</change>
<change type="Changed">WornItems container checks when looking for accessible items. If an<br/>
item inside the WornItems container is a container itself, it will<br/>
now check inside that. This affects for example, quivers added in<br/>
the ML Expansion. Lets you make new equippable containers to<br/>
hand layers, etc, and be usable fully for adding items into it<br/>
and removing while equipped. This is in effect for layers 1-25<br/>
so be very carefull when creating these items!</change>
<change type="Changed">WornItems container is now checked for legal containers when drag-n-drop<br/>
attempts to drop an item onto the equipped container class object (quiver).<br/>
THe above layer ignoring is in place here also.</change>
<change type="Added">Projectile weapons will now check equipped containers for ammo if it<br/>
cannot find any in the backpack first.</change>
<change type="NOTE">I very strongly recommend making equip scripts and all for these<br/>
items. Since it IS a container, you need to make sure the layer<br/>
the client is putting it on, is the correct layer. So just have the<br/>
equip script make sure the correct layer is empty on the character<br/>
equipping this. Remember, these are CONTAINERS, not armor/weapons.<br/>
The client will allow equipping only if the item is set as armor<br/>
or weapon, and uses layers client side. Never trust the client, thus<br/>
the need for an equipscript for containers when they can possibly be<br/>
equipped.</change>
</entry>
<entry>
<date>03-28</date>
<author>Shinigami</author>
<change type="Changed">Adjustment to increasing the revision state for Equipment loosing<br/>
HPs while fighting.</change>
</entry>
<entry>
<date>01-15</date>
<author>MuadDib</author>
<change type="Fixed">PrintTextAboveCL() now checks for object instead of mobile class<br/>
being passed to it.</change>
<change type="Changed">Default of uc_text in cliloc.em. Just smack me.</change>
</entry>
<entry>
<date>01-03</date>
<author>MuadDib</author>
<change type="Added">Packets that are pre-character selection will now report a struct to<br/>
a packethook with the member &quot;ip&quot;. So far this is the only member in<br/>
the struct. Future members might be added, but don't hold me to it.<br/>
Account references at this time, cannot be added.</change>
</entry>
<entry>
<date>01-02</date>
<author>MuadDib</author>
<change type="Added">Native handling of 2D and 3D &quot;Allnames&quot; macro that uses CTRL+SHIFT.<br/>
Added due to the nature of client to spam a lot of these in crowded<br/>
areas, which would cause server lag due to packet hooks to handle each<br/>
request individually in critical mode per client using it.</change>
</entry>
<entry>
<date>12-27</date>
<author>MuadDib</author>
<change type="Fixed">Server IP is now sent in correct order in the 0xA8 packet.</change>
</entry>
<entry>
<date>12-05</date>
<author>Shinigami</author>
<change type="Fixed">fixed a Bug in Walking-on-Multi-Code. A Multi-Definition Door upstairs could block walking.</change>
</entry>
<entry>
<date>11-02</date>
<author>Austin</author>
<change type="Changed">POL no longer requires the presence of the following files in pol/config/ in order to start up:<br/>
combat.cfg, movecost.cfg, watch.cfg, armrzone.cfg, circles.cfg, spells.cfg npcdesc.cfg<br/>
and pol/regions/resource.cfg</change>
</entry>
<entry>
<date>10-30</date>
<author>Austin</author>
<change type="Fixed">Error in the internal webserver where it would sometimes only send the first part of a file.</change>
</entry>
<entry>
<date>10-25</date>
<author>Austin</author>
<change type="Added">Entry to pol.cfg 'RealmDataPath' to set a different path to the data created by uoconvert.<br/>
Defaults to 'realm/'</change>
</entry>
<entry>
<date>10-20</date>
<author>Austin</author>
<change type="Fixed">array{array{}} was appending as a single array as a result of a 10-17 change.</change>
</entry>
<entry>
<date>10-17</date>
<author>Austin</author>
<change type="Fixed">array += array will work properly now by merging the arrays.<br/>
array += xxx will place 'xxx' at the ending index of the array.</change>
</entry>
<entry>
<date>09-28</date>
<author>Austin</author>
<change type="Added">account.AddCharacter(index)<br/>
* If Index is 0 (.AddCharacter(0)), it will find the next available slot on the account.<br/>
(Otherwise pass 1-5)<br/>
Will create a naked, uncolored, male character named &quot;new character&quot; at 1, 1, 1 on Britannia.<br/>
Character setup will need to be done in the script that creates it.<br/>
Does not start &quot;scripts/misc/oncreate.ecl&quot;</change>
</entry>
<entry>
<date>09-27</date>
<author>Austin</author>
<change type="Added">File::FileExists( filename ) - returns 1 if a file exists, 0 if not.</change>
</entry>
<entry>
<date>09-26</date>
<author>Austin</author>
<change type="Fixed">Bug in repsys hook where highlight and name color params were backwards for player-player.</change>
<change type="Fixed">move_offline_mobiles method for boats.</change>
</entry>
<entry>
<date>09-23</date>
<author>Shinigami</author>
<change type="Changed">Profiling counter Script_Cycle and Sleep_Cycle uses 64bit now</change>
</entry>
<entry>
<date>09-20</date>
<author>Austin</author>
<change type="Changed">polsys::Realms() to polsys::Realms(realm:=&quot;&quot;)<br/>
If a realm name is passed, it will provide a struct for that specific realm,<br/>
otherwise will work as it did before.</change>
</entry>
<entry>
<date>09-17</date>
<author>MuadDib</author>
<change type="Added">NPC::SayUC(). Same thing as Say(), cept unicode formatted.</change>
<change type="Changed">NPC::Say() and SayUC() now check distances for different text types.</change>
<change type="Note">DoEvent for SayUC() is currently disabled.</change>
</entry>
<entry>
<date>09-17</date>
<author>Shinigami</author>
<change type="Changed">uo::SendEvent() and Script.sendevent() will return error<br/>
&quot;Event queue is full, discarding event&quot;</change>
</entry>
<entry>
<date>09-16</date>
<author>Shinigami</author>
<change type="Added">some Packet functions, same as original one, but with flipping Byte Order<br/>
Packet.GetUnicodeStringFlipped(offset, length)<br/>
Packet.SetUnicodeStringFlipped(offset, unicode character array, nullterminate)</change>
</entry>
<entry>
<date>09-15</date>
<author>Austin</author>
<change type="Added">ENUMERATE_ROOT_ONLY for EnumerateItemsInContainer(container, flags)<br/>
Will cause it to only list the contents in the container passed and not<br/>
the contents of any sub-containers.</change>
</entry>
<entry>
<date>09-05</date>
<author>MuadDib</author>
<change type="Added">UOConvert now adds &quot;season 1&quot; to the realm.cfg file for each realm during<br/>
conversion. Season will default to 1, if no season entry is given (aka<br/>
you was to lazy to run the newest uoconvert for your maps!). Seasons<br/>
are listed as follows:<br/>
0 = Spring<br/>
1 = Summer<br/>
2 = Fall<br/>
3 = Winter<br/>
4 = Desolation (Felucca)</change>
<change type="Added">Realms() will now also return .season for each realm.</change>
<change type="Fixed">Core not sending season information correctly when logging in or<br/>
changing realms if non-encrypted clients was set up in pol.cfg.</change>
</entry>
<entry>
<date>09-03</date>
<author>MuadDib</author>
<change type="Added">character.shield member. Returns an ObjRef of shield equipped.</change>
</entry>
<entry>
<date>09-02</date>
<author>MuadDib</author>
<change type="Added">Polsys::IncRevision(object). Used to increase the Revision number of an<br/>
object (mobile or item). It then also runs a check for resending the<br/>
tooltip data to client. This can be used in scripts when you change<br/>
CProps or other items that normaly do not update the tooltips for<br/>
custom tooltip hooks.</change>
<change type="Changed">Internal handling of UO.EM Function execution. Should not affect<br/>
scripts. As always, be sure to recompile your scripts when you<br/>
upgrade to a new core release.</change>
</entry>
<entry>
<date>09-01</date>
<author>MuadDib</author>
<change type="Fixed">Bug causing Pre-AOS status bars to freeze clients and/or generate core<br/>
crashes.</change>
<change type="Changed">Adjustments to increasing the revision state for stacks, items, and<br/>
mobiles. Rule of thumb, if you change a member like newbie, title_race,<br/>
and so on via script, this is not automatically updated. Names, amounts,<br/>
and so on that are more critical ARE increased. This is pre to a an<br/>
upcoming ability to increase via scripts and force tooltips to be<br/>
resynced with the client for custom tooltip hooks to be fired.</change>
</entry>
<entry>
<date>08-31</date>
<author>MuadDib</author>
<change type="Removed">All instances, calls, used and unused, code for the permitems.txt<br/>
data file. This was never fully implemented, and as such, has been<br/>
removed by decision of several developers.</change>
</entry>
<entry>
<date>08-26</date>
<author>Austin</author>
<change type="Fixed">POL will check to make sure the corpse and backpack items are setup<br/>
in an itemdesc.cfg when loading.<br/>
If EnableSecureTrading is enabled in pol.cfg it will also check to<br/>
make sure its container is setup.</change>
</entry>
<entry>
<date>08-25</date>
<author>MuadDib</author>
<change type="Fixed">Padding involving stats.</change>
</entry>
<entry>
<date>08-22</date>
<author>Austin</author>
<change type="Added">npc.alignment : 0 - Neutral, 1 - Evil, 2 - Good</change>
</entry>
<entry>
<date>08-19</date>
<author>Austin</author>
<change type="Added">Three more hooks to repsys.cfg's HookList elem.<br/>
OnAttack Run when a mobile attacks another.<br/>
- Target with the TGTOPT_HARMFUL flag set.<br/>
- Mobile goes into warmode and double clicks another.<br/>
OnDamage Run when a mobile damages another.<br/>
- ApplyDamage() or ApplyRawDamage() is used.<br/>
OnHelp Run when a mobile helps another.<br/>
- Target with TGTOPT_HELPFUL is used.</change>
</entry>
<entry>
<date>08-17</date>
<author>Austin</author>
<change type="Added">repsys.cfg<br/>
New elem called 'HookList' which will support syste hook scripts for the reputation system.<br/>
Currently name (single click) and highlight (health bar) colors are hookable.<br/>
Example:<br/>
repsys.cfg<br/>
HookList HookList<br/>
{<br/>
NameColor :repsys:hookScript:NameColor<br/>
HighLightColor :repsys:hookScript:HighLightColor<br/>
}<br/>
:repsys:hookScript.src<br/>
exported function NameColor(mobile, visible_to)<br/>
return CInt(GetObjProperty(mobile, &quot;NameColor&quot;));<br/>
endfunction<br/>
exported function HighLightColor(mobile, visible_to)<br/>
return CInt(GetObjProperty(mobile, &quot;HighLightColor&quot;));<br/>
endfunction<br/>
HighLightColor note: The client seems to only accept the following numbers<br/>
0 - None, 1 - Innocent, 2 - Friend, 3 - Attackable,<br/>
4 - Criminal, 5 - Enemy, 6 - Murderer, 7 - Invulnerable<br/>
8 - Unknown (blue gump, pure black mobile)</change>
</entry>
<entry>
<date>08-14</date>
<author>MuadDib</author>
<change type="Added">uo.em command CancelTarget( of_whom). Can be used to kill an existing cursor<br/>
if one exists, for a client.</change>
</entry>
<entry>
<date>08-12</date>
<author>Austin</author>
<change type="Changed">pol.cfg IgnoreLoadErrors=1 (enabled) changes<br/>
Instead of stopping the startup, the following will occur:<br/>
* If an item belongs in a container or on a character and neither<br/>
are present, the item will be destroyed.<br/>
* If an item has an undefined objtype greater than 0x3FFF, it will not be loaded.</change>
</entry>
<entry>
<date>08-11</date>
<author>Austin</author>
<change type="Added">Datafile::ListDataFiles()<br/>
Returns an array of structs containing<br/>
.pkg - name of the package the datafile belongs to<br/>
.name - name of the file<br/>
.descriptor - :pkg:name</change>
</entry>
<entry>
<date>07-24</date>
<author>MuadDib</author>
<change type="Changed">Handling of non-aos expansion accounts and status bars.</change>
</entry>
<entry>
<date>07-20</date>
<author>Austin</author>
<change type="Fixed">Spelling mistake for the method setcriminal</change>
<change type="Fixed">Guilds were not saving data.</change>
<change type="Changed">NPCs with the template set to 'Good' for alignment will now change highlight color<br/>
if set to murderer or criminal.</change>
</entry>
<entry>
<date>06-29</date>
<author>Austin</author>
<change type="Added">Operator support for += -= *= /= and %=<br/>
i += 5; would be the same as i := i+5;</change>
</entry>
<entry>
<date>06-23</date>
<author>Austin</author>
<change type="Added">PolSys::ListTextCommands() - Returns a dict of a dict of structs.<br/>
Dict 1 - Package names Dict 2 - Command levels Struct - .dir .script<br/>
Example:<br/>
foreach package in ( commands )<br/>
Print(&quot;Pkg:&quot;+_package_iter);<br/>
foreach level in ( package )<br/>
Print(&quot; CmdLvl:&quot;+_level_iter);<br/>
foreach command in ( level )<br/>
Print(&quot; &quot;+command);<br/>
SleepMS(2);<br/>
endforeach<br/>
SleepMS(2);<br/>
endforeach<br/>
SleepMS(2);<br/>
endforeach</change>
</entry>
<entry>
<date>06-22</date>
<author>Austin</author>
<change type="Added">Attributes::GetAttributeName(alias) - Returns the real attribute name from an alias.</change>
<change type="Added">Vitals::GetVitalName(alias) - Returns the real vital name from an alias.</change>
<change type="Added">PolSys::GetCmdLvlName(alias/number) - Returns the real command level name from an alias.</change>
</entry>
<entry>
<date>06-21</date>
<author>MuadDib</author>
<change type="Added">Cliloc::PrintTextAboveCL() and PrintTextAbovePrivate().</change>
<change type="Added">Support for Talisman layer (layer 9) in core definitions.</change>
<change type="Hint">Quivers (added in ML) share layer 20 with cloaks. You can however<br/>
on Origin equip cloaks AND quivers. Ewwww.</change>
</entry>
<entry>
<date>06-20</date>
<author>MuadDib</author>
<change type="Added">Cliloc.em added to the list of new EM Modules. Included in this is already<br/>
the command SendSysMessageCL(). The new EM will have the commands<br/>
commented for instruction of use. If you know about clilocs, you know<br/>
they can be a pain and have additional arguments. Sending normal clilocs<br/>
and ones with arguments are both supported in the single commands.<br/>
Argument flag defaults to 0 in the EM for this.</change>
</entry>
<entry>
<date>06-20</date>
<author>Austin</author>
<change type="Changed">Moved guild functions to guilds.em</change>
</entry>
<entry>
<date>06-18</date>
<author>Austin</author>
<change type="Changed">Moved storage area functions to storage.em</change>
<change type="Changed">Moved vital functions, ApplyDamage, ApplyRawDamage and HealDamage<br/>
from uo.em to vitals.em</change>
</entry>
<entry>
<date>06-17</date>
<author>Austin</author>
<change type="Changed">Updated handling of object properties and methods. Should provide a slight<br/>
speed increase.</change>
<change type="Changed">Moved attribute functions from uo.em to a new attributes.em module.</change>
</entry>
<entry>
<date>06-16</date>
<author>MuadDib</author>
<change type="Changed">AddMenuItem() now has a color option. Default is 0.</change>
<change type="Hint">menus.cfg uses the color of the itemdesc entry of the objtype given,<br/>
to get color. So if an item has no itemdesc entry, it defaults to 0.</change>
</entry>
<entry>
<date>06-16</date>
<author>Austin</author>
<change type="Removed">Skills.cfg is no longer used.<br/>
Instead skill IDs will be read from uoskills.cfg and redirected to<br/>
attributes.cfg. The attributes.cfg file now has support for the old entries.<br/>
skills.cfg entries supported now in attributes.cfg are:<br/>
DELAY, UNHIDES and SCRIPT</change>
</entry>
<entry>
<date>06-15</date>
<author>Austin</author>
<change type="Added">mobile.Privileges() - Returns a dictionary.<br/>
The key is the privilege name. The value 0/1 is if it is enabled or not.</change>
<change type="Removed">Built-in text commands (you'll need to script them):<br/>
.eobjcount, .i_help, .log, .los, .objcount, .priv, .privs, .set, .turn,<br/>
.t_online, .unload, .unloadall, .wheretest</change>
</entry>
<entry>
<date>06-15</date>
<author>MuadDib</author>
<change type="Added">Function OpenURL(character, url_string) to OS.EM. Used to send Open Web<br/>
Browser packet to client.</change>
</entry>
<entry>
<date>06-14</date>
<author>MuadDib</author>
<change type="Added">AOS style status bar is now generated correctly for AOS+ clients that ALSO<br/>
have the UOExpansion set to AOS or higher. Only thing populated by core is<br/>
the statcap entry. Rest can be done via packethooks.</change>
<change type="Added">UOClient.cfg entry &quot;StatCap&quot; in General. This is used with AOS era<br/>
status bars to send the statcap in the packet. Default is 225. Can use<br/>
packethooks to override this outgoing to client.</change>
</entry>
<entry>
<date>06-14</date>
<author>Austin</author>
<change type="Changed">All log files (pol.log, debug.log, start.log, etc.) will now be placed in pol/log/</change>
</entry>
<entry>
<date>06-13</date>
<author>Austin</author>
<change type="Changed">Config files in packages can now be in pkgname/config/cfgfile.cfg.<br/>
If it is not present there, it will look in the package root (pkgname/cfgfile.cfg)<br/>
pkg.cfg must still be at the root of the package.</change>
</entry>
<entry>
<date>06-13</date>
<author>MuadDib</author>
<change type="Changed">Handling of target request returns in core. Returns errors more efficiently<br/>
when client already has an active target cursor.</change>
</entry>
<entry>
<date>06-12</date>
<author>Austin</author>
<change type="Added">UO::CloseTradeWindow(mobile) - Will close the trade window for the mobile and the<br/>
person it is trading with.</change>
</entry>
<entry>
<date>06-11</date>
<author>Austin</author>
<change type="Added">mobile.trading_with - Returns a mobile reference if a secure trade is taking place.</change>
<change type="Added">Util::StrFormatTime(format_string, time_stamp).<br/>
Takes in the StrFTime() specifiers for the format string.<br/>
(http://www.cppreference.com/stddate/strftime.html)<br/>
If time_stamp is 0, it will use POLCore().systime.</change>
</entry>
<entry>
<date>06-11</date>
<author>MuadDib</author>
<change type="Changed">When a client already has a target cursor request, instead of core<br/>
just returning that to the new requesting call, now returns an error<br/>
code back to the calling cursor script.</change>
</entry>
<entry>
<date>06-10</date>
<author>MuadDib</author>
<change type="Cleanup">Removed last of stat advancement code. While this was depreciated<br/>
several versions ago, please remember stat advancement must be done<br/>
via the scripts.</change>
</entry>
<entry>
<date>06-09</date>
<author>MuadDib</author>
<change type="Cleanup">Cleaned out some old code.</change>
<change type="Removed">Removed depreciated UO.EM Function MoveCharacterToLocation(). Use<br/>
MoveObjectToLocation() now.</change>
<change type="Removed">Removed depreciated UO.EM Function MoveItemToLocation(). Use<br/>
MoveObjectToLocation() now.</change>
</entry>
</version>
<version name="POL096.7">
<entry>
<date>04-23</date>
<author>MuadDib</author>
<change type="Added">Realm checks in transmitting of packets to clients &quot;in range&quot;.</change>
</entry>
<entry>
<date>04-22</date>
<author>MuadDib</author>
<change type="Added">Changing of Invisible, Movable, and Newbie now reset the respective<br/>
decay timer.</change>
</entry>
</version>
<version name="POL096.6">
<entry>
<date>03-30</date>
<author>MuadDib</author>
<change type="Notes">Due to questions involving this, here is a partial list of things passable<br/>
through the override of CreateNPCFromTemplate that use different names:<br/>
Common Properties:<br/>
TRUEOBJTYPE<br/>
TRUECOLOR<br/>
TITLEPREFIX<br/>
TITLESUFFIX<br/>
TITLEGUILD<br/>
TITLERACE<br/>
These should work also from the override you usually use. Noting these<br/>
due to being named differently than what you usually use and see.</change>
</entry>
<entry>
<date>03-29</date>
<author>MuadDib</author>
<change type="Added">0x3e98 (Swamp Dragon) added to uoconvert.cfg.</change>
</entry>
<entry>
<date>01-09</date>
<author>MuadDib</author>
<change type="Fixed">Status Flag checks totally rewritten. PLEASE PAY ATTENTION! They are now<br/>
dependant on the UOExpansion Setting for accounts! Older (2.x) clients<br/>
did not use the CanAlterPaperdoll flag, and used 0x40 for the warmode,<br/>
and so on. LBR era, introduced the CanAlterPaperdoll (or around there).<br/>
AOS+ clients use even more different, using 0x1 for warmode! Paperdolls<br/>
seem to only use the warmode, unlike all other resources say.</change>
</entry>
<entry>
<date>01-06</date>
<author>MuadDib</author>
<change type="Fixed">Height checks when walking down items with gradual flag (such as ladders<br/>
ands steps).</change>
</entry>
<entry>
<date>01-04</date>
<author>MuadDib</author>
<change type="Fixed">Status flag in paperdoll packet.</change>
</entry>
</version>
<version name="POL096.5">
<entry>
<date>01-02</date>
<author>MuadDib</author>
<change type="Fixed">Updating of self when notoriety changes in reputation system.</change>
<change type="Fixed">Some orphan checks within reputation system.</change>
</entry>
<entry>
<date>01-01</date>
<author>MuadDib</author>
<change type="Fixed">Few instances still using older Character Height of 9.</change>
</entry>
<entry>
<date>12-30</date>
<author>MuadDib</author>
<change type="Fixed">RaceChanger system now also sets TrueColor after a race change.</change>
</entry>
<entry>
<date>12-29</date>
<author>Shinigami</author>
<change type="Fixed">uo::SplitWords() will not hang server on queue of delimiter</change>
</entry>
</version>
<version name="POL096.4">
<entry>
<date>11-25</date>
<author>Shinigami</author>
<change type="Fixed">Sometimes uo::GetWorldHeight() has returned error while using same input values.</change>
</entry>
<entry>
<date>10-28</date>
<author>Shinigami</author>
<change type="Changed">em-files moved to script\modules subfolder.<br/>
Please remove your old em-files and modify ModuleDirectory in ecompile.cfg !</change>
</entry>
<entry>
<date>10-27</date>
<author>Austin</author>
<change type="Fixed">MoveObjectToLocation() will return an error if a multi (other than a boat) is moved.</change>
</entry>
<entry>
<date>10-20</date>
<author>Austin</author>
<change type="Fixed">Items were being marked as in use permanently once picked up by a client.<br/>
which prevented them from being destroyed.</change>
<change type="Fixed">DestroyItem() and SubtractAmount() will work on items reserved in the same script.</change>
</entry>
<entry>
<date>10-17</date>
<author>Austin</author>
<change type="Fixed">gotten items (items on a client's cursor) will save in items.txt<br/>
at the position it is currently being carried at.</change>
</entry>
<entry>
<date>10-07</date>
<author>Shinigami</author>
<change type="Added">FreeBSD support</change>
</entry>
<entry>
<date>10-07</date>
<author>MuadDib</author>
<change type="Changed">Memory handling for FindPath().</change>
<change type="Changed">Core Decay now checks if item is in use. Also affects Gotten Items<br/>
that are check for decay by the core while it's being picked up.</change>
<change type="Fixed">Bug that would keep an item marked in use if drop item failed.</change>
<change type="Fixed">Crash involving UO::DestroyItem being called on an item being held<br/>
by a player. Now returns an error same as if item is in use and not<br/>
reserved to that character.</change>
<change type="Note">ALWAYS remember, to keep bugs happening in your scripts that involve<br/>
players picking up/moving items to keep them from being removed from<br/>
containers or ground by scripts, or from being destroyed, ALWAYS use<br/>
ReserveItem() to lock that item. If an item is reserved, you cannot<br/>
pick it up, etc.</change>
</entry>
<entry>
<date>09-16</date>
<author>Shinigami</author>
<change type="Fixed">Memory Overwrite Bug in Unicode code (e.g. packet.SetUnicodeString())</change>
</entry>
</version>
<version name="POL096.3">
<entry>
<date>09-07</date>
<author>MuadDib</author>
<change type="Fixed">Validation issues with xyz of realm coordinates within boat movement<br/>
commands.</change>
</entry>
<entry>
<date>09-05</date>
<author>MuadDib</author>
<change type="Changed">PerformAction() value restriction removed to support new animation ids.<br/>
Be warned. Know what ID you are sending to clients, as an Incorrect id<br/>
could cause the client to have &quot;issues&quot;</change>
</entry>
<entry>
<date>09-02</date>
<author>MuadDib</author>
<change type="Fixed">Core now checks for changes in light level for a character whenever<br/>
the MoveObjectToLocation() is used on a player.</change>
<change type="Fixed">Core now sends the remove object packet correctly for items within<br/>
containers or equipped, when moved out of view/realm.</change>
<change type="Fixed">Bug where the coordinates for a realm would be checked on an item's<br/>
current realm, instead of the realm it was being sent to.</change>
</entry>
<entry>
<date>09-01</date>
<author>MuadDib</author>
<change type="Added">Reduncancy check for node parents in FindPath().</change>
</entry>
</version>
<version name="POL096.2">
<entry>
<date>08-29</date>
<author>Austin</author>
<change type="Changed">Gump errors will report client account name to the console when invalid messages<br/>
and buffer-overflow attempts occur.</change>
</entry>
<entry>
<date>07-26</date>
<author>MuadDib</author>
<change type="Fixed">Zero height items should no longer disappear under the floors of multis.</change>
</entry>
</version>
<version name="POL096.1">
<entry>
<date>06-28-2006</date>
<author>MuadDib</author>
<change type="Fixed">Crash issue involved in moving sub-containers from one realm directly<br/>
to another (like a character's backpack from their realm, to another).</change>
</entry>
<entry>
<date>06-27-2006</date>
<author>MuadDib</author>
<change type="Added">Realm property to return struct of TargetCoordinates() function. This<br/>
is based off the targeter's realm. Never trust information returned<br/>
by the client for stuff like this.</change>
</entry>
<entry>
<date>06-24-2006</date>
<author>MuadDib</author>
<change type="Changed">Offline mobiles can once again be targeted without problems.</change>
</entry>
</version>
<version name="POL096">
<entry>
<date>06-05</date>
<author>Shinigami</author>
<change type="Added">little bit more logging why Clients get disconnected on Logon by Core</change>
</entry>
<entry>
<date>06-01</date>
<author>MuadDib</author>
<change type="Hint">The pol.cfg setting &quot;LogLevel&quot; can be used to debug issues at startup of<br/>
POL and various other places (unloadall for example). By setting this<br/>
higher than 1, up to 11 (just sounds good), it will force printing of<br/>
better information to help you find out problems during Loading and such.<br/>
Setting it for example, above 0, core will start spitting out &quot;Checkpoint&quot;<br/>
data during startup to say what it is about to load/process. Such as the<br/>
configuration, load realms, load multis, etc etc.</change>
</entry>
<entry>
<date>05-31</date>
<author>MuadDib</author>
<change type="Fixed">Issue resolved with standard spellbook and no AOS+ Expansion enabled.</change>
<change type="Hint">Recognized scroll objects now are: Magic: 0x1F2D - 0x1F6C, Necro<br/>
0x2260 - 0x226F, Paladin: 0x2270 - 0x227C, Bushido: 0x238D - 0x2392,</change>
<change type="Ninjitsu">0x23A1 - 0x23A8, SpellWeaving: 0x2D51 - 0x2D60.<br/>
Remember, this IS hardcoded! &gt;:)<br/>
For Bushido and Ninjitsu, there was never any scrolls made. So your<br/>
items for those are the Icons for the moves. Try setting their graphic<br/>
to a scroll and using it ;)</change>
</entry>
<entry>
<date>05-30</date>
<author>Shinigami</author>
<change type="Hint">UOConvert will convert Mondain's Legacy extended Britannia Map.<br/>
Just set width to 7168 (e.g.):<br/>
uoconvert map realm=britannia mapid=0 usedif=0 width=7168 height=4096<br/>
uoconvert statics realm=britannia<br/>
uoconvert maptile realm=britannia</change>
<change type="Updated">uoconvert.txt (some comments and Mondain's Legacy hint)</change>
<change type="Fixed">Bug with detection of Gump-Cancel in uo::SendCharacterRaceChanger()</change>
<change type="Fixed">ShowRoofAndPlatformWarning has shown everything</change>
<change type="Fixed">smaller mistype in Log created via TextCMD .startlog/stoplog</change>
<change type="Fixed">set correct Time stamp in TextCMD .startlog/stoplog</change>
</entry>
<entry>
<date>05-30</date>
<author>MuadDib</author>
<change type="Added">Guild and Quest buttons added to the &quot;known&quot; list of subcommands in core.<br/>
Should fix some crashes when recieving these. Especially when using hooks<br/>
on packet 0xD7 (their parent packet ID).</change>
</entry>
<entry>
<date>05-29</date>
<author>MuadDib</author>
<change type="Added">Added &quot;SpellType&quot; entries for &quot;Bushido&quot;, &quot;Ninjitsu&quot;, &amp; &quot;SpellWeaving&quot; for<br/>
spellbook types in itemdesc.cfg. The list of spellids for<br/>
spells.cfg is now as follows: Magery = 1+, Necro = 101+,<br/>
Paladin = 201+, Bushido = 401+, Ninjitsu = 501+, SpellWeaving = 601+.<br/>
Hopefully this more completes our addition of the other<br/>
expansions for 096 where we lack in other areas.</change>
</entry>
<entry>
<date>05-27</date>
<author>MuadDib</author>
<change type="Update">Just FYI, as previously reported, SingleCombat does NOT use servspecopt.cfg<br/>
but rather combat.cfg. Sorry about the typo when it was introduced.</change>
</entry>
<entry>
<date>05-26</date>
<author>MuadDib</author>
<change type="Fixed">Crash on checking targetted players when target is not logged in.</change>
<change type="Fixed">ItemColorMask is now read properly during itemdesc load and during<br/>
POL startup.</change>
</entry>
<entry>
<date>05-26</date>
<author>Shinigami</author>
<change type="Fixed">Crash on call of scripts/misc/dblclickother if another script is running.</change>
<change type="Fixed">removed an additional check for UOConvert's option ShowRoofAndPlatformWarning</change>
</entry>
<entry>
<date>05-24</date>
<author>Shinigami</author>
<change type="Added">uo::SendCharacterRaceChanger( character ) - to change Hair, Beard and Color</change>
</entry>
<entry>
<date>05-23</date>
<author>Shinigami</author>
<change type="Fixed">Crash inside Packet Hooks with SubCommands and without default Handler.</change>
</entry>
<entry>
<date>05-20</date>
<author>MuadDib</author>
<change type="Removed">Requiring, and support, for armrdesc.cfg. Armor within this file is to be<br/>
moved to the itemdesc.cfg as intended. File has been obsolete for a while<br/>
now.</change>
</entry>
<entry>
<date>05-19</date>
<author>MuadDib :</author>
<change type="Removed">Requirement for wepndesc.cfg in the /config folder. Any shards still<br/>
using this obsolete file can use the itemdesc.cfg files for the weapons as<br/>
intended. Core will no longer require this file to load either.</change>
</entry>
<entry>
<date>05-16</date>
<author>Shinigami</author>
<change type="Updated">Account.set_uo_expansion(string): recognized values: ML, SE, AOS, LBR, T2A (default), &quot;&quot;.<br/>
This determines what flag is sent with packet 0xB9 during login (Nothing -&gt; 0x0000 /<br/>
T2A -&gt; 0x0001 / LBR -&gt; 0x0002 / AOS -&gt; 0x801b / SE -&gt; 0x805b / ML -&gt; 0x80db).<br/>
It's possible to hook 0xB9 but don't forget to set_uo_expansion anyway because core<br/>
uses this for internal flags (e.g. AoS Tooltips). Packet 0xB9 will be sent earlier<br/>
(before you choose a character) and after you've used set_uo_expansion.</change>
<change type="Updated">servspecopt.cfg property: UOFeatureEnable, used in the last dword of the 0xA9 login packet,<br/>
will block Bit 6 (support up to 6 Chars). To enable AoS stuff set Bit 5 (use 0x20),<br/>
to enable SE stuff set Bit 7 &amp; 5 (use 0xa0) and to enable ML stuff set Bit 8, 7 &amp; 5 (use 0x1a0).</change>
<change type="Added">mobile.race [r/w] - set/get the ML race (new constants in UO.EM: RACE_HUMAN, RACE_ELF)<br/>
You have to set visual graphic by yourself if you change value.<br/>
(Human male/female = 0x190/0x191 / Elf male/female = 0x25d/0x25e)<br/>
You can choose Race at Char creation if your UOExpansion and UOFeature settings fit.</change>
<change type="WARNING">Don't forget to update your server side config/tiles.cfg using<br/>
UOConvert and Mondain's Legacy tiledata.mul! (Hint: &quot;uoconvert tiles&quot;)<br/>
Race Prop is available inside Interactive Debugger too.</change>
</entry>
<entry>
<date>05-13</date>
<author>MuadDib</author>
<change type="Added">Targeting will now also check the NoCombat zone for targeted players also,<br/>
and not just who is doing the targeting.</change>
</entry>
<entry>
<date>05-10</date>
<author>MuadDib</author>
<change type="Fixed">Targeting should now check to make sure a mobile is visible to the targeter<br/>
before processing. This checks hidden and concealment both.</change>
</entry>
<entry>
<date>05-10</date>
<author>Shinigami</author>
<change type="Fixed">small bug inside uo::ListMobilesNearLocationEx()</change>
</entry>
<entry>
<date>05-07</date>
<author>Shinigami</author>
<change type="Added">flag VENDOR_SEND_AOS_TOOLTIP in<br/>
uo::SendBuyWindow( character, container, vendor, items, flags := 0 )<br/>
uo::SendSellWindow( character, vendor, i1, i2, i3, flags := 0 )<br/>
to send Item Description using AoS Tooltips in any case (this will correct problems<br/>
with Item Descriptions in newer Clients, but maybe freeze ancient Clients...).</change>
</entry>
<entry>
<date>05-04</date>
<author>Austin</author>
<change type="Added">LISTEX_FLAG_CONCEALED support for ListMobilesNearLocationEX()</change>
</entry>
<entry>
<date>04-11</date>
<author>MuadDib</author>
<change type="Change">Starting Gold will no longer be newbied (blessed). Can still be set newbied if you choose in<br/>
the create scripts for new characters.</change>
</entry>
<entry>
<date>04-09</date>
<author>Shinigami</author>
<change type="Added">uoconvert.cfg element option added, TileOptions, in the following form:<br/>
TileOptions<br/>
{<br/>
ShowRoofAndPlatformWarning 1<br/>
}<br/>
it's a flag and defaults to 1 (shows a Warning if you use both Flags in same Tile).</change>
</entry>
<entry>
<date>04-05</date>
<author>MuadDib</author>
<change type="Changed">Added combat.cfg flag SingleCombat. This is a 0/1 flag for allowing players to attack<br/>
themselves. 0 will disable it (default). Per request.</change>
<change type="Fixed">Crash involving invalid serial data sent with Target Cursor from client.</change>
<change type="Fixed">Bug blocking non-harmful targeting of Players in NoCombat zones.</change>
<change type="Fixed">Optimized NoCombat Target check.</change>
</entry>
<entry>
<date>03-19</date>
<author>MuadDib</author>
<change type="Fixed">Will now correctly send AOS Tooltips if features are combined with 0x20 in the<br/>
UOFeatureEnable setting in servspecopt.cfg file.</change>
</entry>
<entry>
<date>03-18</date>
<author>MuadDib</author>
<change type="Added">Servspecopt.cfg entry StartingGold=#. This will default to 100 gold. However, it can be<br/>
used to override the core's initial starting gold amount to this setting. Enjoy.</change>
</entry>
<entry>
<date>03-15</date>
<author>MuadDib</author>
<change type="Fixed">Attack Request will be automatically denied if Defender.serial == Attacker.serial.</change>
<change type="Changed">Packet Logs (using .startlog and .stoplog) format has changed. It has been updated<br/>
for easier reading and to match Packet Loggers format more (Such as UOLog and<br/>
Spy UO).</change>
</entry>
<entry>
<date>03-07</date>
<author>MuadDib</author>
<change type="Added">New Justice/Region config entry for Regions. NoCombat is a 0/1 Flag to set<br/>
a region to be a No Combat region. No Combat regions will not allow the<br/>
Clicking of a mobile to select as a new opponent if they are in this region.<br/>
It will also reset opponent data for mob if one enters this region. This is<br/>
a PvP specific addon. It does NOT check for npcs, this will have to be done<br/>
via packethooks.<br/>
When Entering a NoCombat region, while already in combat, if YOU are the<br/>
attacker, it will reset your fight. If you are the one being attacked, it<br/>
will reset the fight with the first &quot;opponent&quot; you have listed.</change>
</entry>
<entry>
<date>03-06</date>
<author>MuadDib</author>
<change type="Changed">Regen after being damaged delay was changed from 10 seconds to 2 seconds.</change>
<change type="Changed">Regen delay after changing warmode was changed from 5 seconds to 2 seconds.</change>
</entry>
<entry>
<date>03-03</date>
<author>MuadDib</author>
<change type="Changed">Optimized handling of mobile.connected in core.</change>
</entry>
<entry>
<date>03-02</date>
<author>MuadDib</author>
<change type="Fixed">Handling of 0x22 Move Resync with &quot;Player Noto&quot; handling to send<br/>
correct information.</change>
</entry>
<entry>
<date>03-01</date>
<author>MuadDib</author>
<change type="Changed">Handling of item's decayat property when moved.</change>
<change type="Fixed">Stack checking for decayat handling when moving items.</change>
<change type="Fixed">Newly created characters will now have the connected member set<br/>
correctly.</change>
</entry>
<entry>
<date>01-18</date>
<author>Shinigami</author>
<change type="Changed">Prop script_process.attached_to will return NPC if it's his AI-Script.<br/>
(script_process comes from NPC.process or uo::GetProcess(pid))</change>
</entry>
<entry>
<date>01-09</date>
<author>MuadDib</author>
<change type="Changed">Added check for No Decay timer on items when resetting decay time.</change>
<change type="Fixed">AOS Tooltips will now correctly show the Reputation of mobiles. In order<br/>
to see Invul correctly, InvulTag MUST be set to 2 due to the Reputation<br/>
color being handled fully client-side (No way around this).</change>
</entry>
<entry>
<date>12-10</date>
<author>MuadDib</author>
<change type="Changed">Various changes involving item dropping and creation and setting of<br/>
decayat properties to help with instant decay.</change>
<change type="Fixed">Secure Trade Window now correctly updates client when items added. As a<br/>
side effect, also fixes a small problem involving adding items to normal<br/>
containers also when using tooltips.</change>
<change type="Note">For now, since Tooltips is an AOS feature, do NOT leave tooltips disabled<br/>
and use UOExpansion set to AOS or this WILL cause client problems. The client<br/>
was never designed for this to happen, and I do plan on putting in failsafes<br/>
in the core to keep these problems from happening. Bear with me on this please.</change>
</entry>
<entry>
<date>12-09</date>
<author>MuadDib</author>
<change type="Changed">Repsys coloring for Invulnerable names will only occur when InvulTag is<br/>
set to 2. Will follow OSI standards more, and allow more flexibility to<br/>
shard admins per request.</change>
<change type="Fixed">ItemGiven Event will now return items if the script handler does nothing<br/>
with the item.</change>
<change type="Fixed">Items will now move correctly across realms or to same realm again with<br/>
MoveObjectToLocation().</change>
<change type="Fixed">Crash bug when deleting items after using MoveObjectToRealm().</change>
<change type="Added">New read-only member .uclang for players. Reports the Unicode Language string<br/>
client sends during logon. Usefull for Unicode support based on language of<br/>
individual clients/characters.</change>
</entry>
<entry>
<date>12-06</date>
<author>Shinigami</author>
<change type="Fixed">z&lt;0 bug inside uo::MoveCharacterToLocation() and uo::MoveObjectToLocation()</change>
</entry>
<entry>
<date>12-05</date>
<author>MuadDib</author>
<change type="Added">Decay timer reset when Item is picked up/dragged by client (only on success).<br/>
Should *help* with instant decay problems when dropping items</change>
<change type="Added">InvulTag=0/1/2 in ServSpecOpt.cfg. 0 Disables invul tags totally. 1 (default)<br/>
keeps them as they are now, giving [Invul] tag when single clicked. 2 will<br/>
work only on 3.x+ clients, and makes the mob's highlight color Yellow with<br/>
no [Invul] tag when single clicked. Only recommend using 2 if your shard<br/>
requires a 3.x or higher client!</change>
<change type="Added">Invulnerable entry in RepSys.cfg for coloring name of invuls.</change>
</entry>
<entry>
<date>11-29</date>
<author>MuadDib</author>
<change type="Added">Packet 0x9 will no longer cause POL to treat client as active.</change>
<change type="Fixed">Change to Secure trade window handling. Be sure to test thouroughly with all<br/>
versions of clients and report back to pol-core-test with results. Hoping this<br/>
helps with client issues reported.</change>
</entry>
<entry>
<date>11-29</date>
<author>Shinigami</author>
<change type="Fixed">uo::SplitWords() will now accept each type of to-split-value as same as in the past</change>
</entry>
<entry>
<date>11-26</date>
<author>MuadDib</author>
<change type="Fixed">Fixed Attack Denied method for client expectations.</change>
<change type="Fixed">Logon issues involving map visibility on &gt;2 mapid.</change>
<change type="Fixed">Issues with weather and seasons on logon.</change>
</entry>
<entry>
<date>11-26</date>
<author>Austin</author>
<change type="Added">Support for bit shifting integers using &lt;&lt; and &gt;&gt;</change>
</entry>
<entry>
<date>11-26</date>
<author>Shinigami</author>
<change type="Fixed">Compiler will work case insensitive now.</change>
<change type="Added">New Mounts to uoconvert.cfg</change>
<change type="Added">uoconvert.cfg to Linux Files</change>
<change type="Fixed">illegal Attack Requests (Packet 0x05) will not crash Pol</change>
</entry>
<entry>
<date>11-25</date>
<author>Shinigami</author>
<change type="Changed">Packet 0xBF Subcommand 0x24 will no longer cause POL to treat client as active.</change>
</entry>
<entry>
<date>11-25</date>
<author>MuadDib</author>
<change type="Fixed">AttackRequest now checks for distance &lt; 20, realm, hidden, concealed higher, and dead characters.</change>
<change type="Fixed">Visibility checks now check for same realm.</change>
<change type="Added">Packet 0xBF Subcommand 0x24 no longer reports in unknown packets. Packet will still cause<br/>
POL to treat client as active.</change>
</entry>
<entry>
<date>11-24</date>
<author>Austin</author>
<change type="Added">basic::Bin() - Convert 25 to 11001</change>
</entry>
<entry>
<date>11-23</date>
<author>Austin</author>
<change type="Fixed">account.Get_Member(member name) now works.</change>
<change type="Fixed">.Get_Member(member name) for script objects now works.</change>
</entry>
<entry>
<date>11-23</date>
<author>MuadDib</author>
<change type="Added">Added second optional param to SplitWords() function. Second param now defaults to space.<br/>
Allows use of &quot;bleh&quot; &quot;+&quot; &quot;,&quot; &quot;_,&quot; &quot;.&quot; etc. as the delimiter instead of just whitespace.</change>
<change type="Added">New combat.cfg setting &quot;WarModeDelay&quot;. Setting is in Integer for Seconds delay between<br/>
ability to toggle war mode status via client. Does not affect using SetWarMode method.</change>
</entry>
<entry>
<date>11-20</date>
<author>Austin</author>
<change type="Fixed">Attempt # 2 with *InBox() coordinate checks.</change>
<change type="Fixed">Region scripts (EnterScript / LeaveScript) no longer need an<br/>
EnterText and LeaveText to work.</change>
</entry>
<entry>
<date>11-15</date>
<author>Austin</author>
<change type="Added">using &quot;::regions/&quot; in a config path will allow a config file from pol/regions/ to be read.<br/>
Example ReadConfigFile(&quot;::regions/justice&quot;);</change>
<change type="Added">regions.cfg / justice.cfg support for EnterScript and LeaveScript.<br/>
Scripts will be run when a player enters or leaves the region.<br/>
Parameters passed to it are the mobile that entered/left and the region name.<br/>
Please note these scripts run critical.<br/>
Regions.cfg Example:<br/>
Region Britain<br/>
{<br/>
Range 1416 1500 1740 1790<br/>
Guarded 1<br/>
EnterText You have entered britain<br/>
LeaveText You have left britain<br/>
Midi 9<br/>
EnterScript :coords:enterScript<br/>
LeaveScript :coords:leaveScript<br/>
}<br/>
Example of enterScript.ecl<br/>
------<br/>
use uo;<br/>
program EnterRegionZone(mobile, region_name)<br/>
ApplyRawDamage(mobile, 10000);<br/>
SendSysMessage(mobile, &quot;You just died because you entered an area that makes you dead!&quot;);<br/>
return 1;<br/>
endprogram<br/>
------</change>
</entry>
<entry>
<date>11-14</date>
<author>Austin</author>
<change type="Fixed">uo::*InBox(x1, y1, z1, x2, y2, z2) functions will check the boundaries of the coordinates.<br/>
If they are too low or too high, they will be adjusted to fit within the realm.</change>
<change type="Fixed">Using the .realm property on an intrinsic weapon caused a core crash.</change>
<change type="Added">weapon.intrinsic</change>
</entry>
<entry>
<date>11-10</date>
<author>Austin</author>
<change type="Fixed">Items moved to invalid locations will now go to the player's feet on the<br/>
correct realm and not just to britannia.</change>
</entry>
<entry>
<date>11-03</date>
<author>Austin</author>
<change type="Added">uo::CoordinateDistance(x1, y1, x2, y2) - Returns the distance between two coordinates.<br/>
The following two functions were originally scripted by Myrathi:</change>
<change type="Added">uo::GetCoordsInLine(x1, y1, x2, y2) - Returns an array of structs {.x, .y} for every coordinate<br/>
between the two points.</change>
<change type="Added">uo::GetFacing(from_x, from_y, to_x, to_y) - Returns the facing number an object must have in order to<br/>
face to_x and to_y from from_x and from_y.</change>
</entry>
<entry>
<date>10-31</date>
<author>Austin</author>
<change type="Fixed">Core crash with MoveCharacterToLocation() when a character was moved to the same realm.</change>
</entry>
<entry>
<date>10-30</date>
<author>Austin</author>
<change type="Changed">NPC.connected will now always return 1. Before it was 0.</change>
</entry>
<entry>
<date>10-29</date>
<author>Austin</author>
<change type="Added">polsys::GetCmdLevelName(number) - Will get a command level's name.</change>
<change type="Added">polsys::GetCmdLevelNumber(name) - Will get the numeric value of a command level.</change>
<change type="Added">polsys::GetPackageByName(name) - Will return a package reference.</change>
<change type="Added">account.SetDefaultCmdLevel(number) - Will set the account's default command level.</change>
<change type="Added">account.defaultcmdlevel - Will return a number for the accounts default command level.</change>
<change type="Changed">If npc.ar is used and the NPC has no armor equipped, it will give its intrinsic armor value<br/>
(NPCDESC.CFG AR entry). If it has armor equipped, it will work as it did before.</change>
<change type="Changed">Added some error checking and reporting when &quot;(something in array)&quot; is used in a script.<br/>
Hopefully this will fix the rare &quot;in&quot; crash or at the least, make it a little easier to find.</change>
</entry>
<entry>
<date>10-17</date>
<author>Austin</author>
<change type="Added">Added uo::MoveObjectToLocation( object, x, y, z, realm := _DEFAULT_REALM, flags := MOVEOBJECT_NORMAL );<br/>
Function will replace MoveCharacterToLocation(), MoveItemToLocation(), and MoveObjectToRealm()<br/>
Currently moves boats, mobiles, and items.</change>
</entry>
<entry>
<date>10-16</date>
<author>Shinigami</author>
<change type="Changed">added x- and y-Offset to uo::SendDialogGump( who, layout, textlines, x := 0, y := 0 );<br/>
(don't forget to recompile all your Scripts using new uo.em)</change>
</entry>
<entry>
<date>10-13</date>
<author>Shinigami</author>
<change type="Added">Linux: Core will check libc version and print Warning if libc is to old (&lt; 2.3.2)</change>
</entry>
<entry>
<date>10-07</date>
<author>Austin</author>
<change type="Added">scripts/misc/dblclickother - Runs when a player double clicks another player or npc.<br/>
Will not run if the npc has the double click event enabled.<br/>
Program arguments are (who, mobile_clicked)</change>
<change type="Added">servspecopt.cfg - 'DoubleClickWait'. (Default is 0)<br/>
Time in seconds that must pass before a player can double click something again.</change>
<change type="Added">mobile.GetCorpse() - Returns an item reference to the most recent corpse made.</change>
</entry>
<entry>
<date>10-03</date>
<author>Austin</author>
<change type="Added">corpse.ownerserial - Returns the serial of the npc / player that died.</change>
</entry>
<entry>
<date>10-02</date>
<author>Shinigami</author>
<change type="Added">Prop script_process.attached_to and script_process.controller.<br/>
(script_process comes from NPC.process or uo::GetProcess(pid))</change>
</entry>
<entry>
<date>09-30</date>
<author>Shinigami</author>
<change type="Fixed">added Player Check to uo::SendStatus (crashed on NPCs)</change>
</entry>
<entry>
<date>09-25</date>
<author>Shinigami</author>
<change type="Fixed">eCompile - FileCheck for multiple include of same File<br/>
e.g.: inside scripts\textcmd\test\textcmd.src:<br/>
Include &quot;../../../pkg/std/housing/include/test&quot;;<br/>
Include &quot;:housing:test&quot;;<br/>
Include &quot;:housing:include/test&quot;;<br/>
will be handled as same file now</change>
</entry>
<entry>
<date>09-23</date>
<author>Shinigami</author>
<change type="Added">uo::SendStatus( character ) - to send full Status Packet to support Extensions<br/>
like Resistances, if you add'em via Packet Hook. Use SendStatus to update'em.</change>
</entry>
<entry>
<date>09-17</date>
<author>Shinigami</author>
<change type="Fixed">Crash if Name of Items or Mobiles was to long and you've clicked'em</change>
</entry>
<entry>
<date>09-16</date>
<author>Shinigami</author>
<change type="Added">pol.log will show last running Script and it's Program Counter<br/>
(you can use eCompile LST-file (Switch: -l) to get the Source Line)</change>
<change type="Added">Linux: pol.log will show Backtrace (as same as STDERR)</change>
</entry>
<entry>
<date>09-15</date>
<author>Austin</author>
<change type="Added">mobile.connected - To determine if the character is actively connected to the game.<br/>
Is set to 1 before logon/reconnect scripts are run and 0 right before logofftest is run.</change>
</entry>
<entry>
<date>09-14</date>
<author>Shinigami</author>
<change type="Added">vitals.cfg element option &quot;RegenWhileDead&quot; added (0/1 - defaults to 0)</change>
</entry>
<entry>
<date>09-13</date>
<author>Austin</author>
<change type="Fixed">When a player dies, it will send SYSEVENT_DISENGAGED to the opponent-npc, if one is set.</change>
</entry>
<entry>
<date>09-12</date>
<author>Shinigami</author>
<change type="Added">some Packet functions, same as original one, but with flipping Byte Order<br/>
Packet.GetInt16Flipped(offset, value)<br/>
Packet.GetInt32Flipped(offset, value)<br/>
Packet.SetInt16Flipped(offset, value)<br/>
Packet.SetInt32Flipped(offset, value)</change>
</entry>
<entry>
<date>09-11</date>
<author>Austin</author>
<change type="Added">Member for mobiles &quot;.opponent&quot;. Returns a mobile reference if a combat opponent is selected.</change>
</entry>
<entry>
<date>09-10</date>
<author>Shinigami</author>
<change type="Added">math::Root - returns y Root of x (same as Pow(x,1.0/y))</change>
</entry>
<entry>
<date>09-08</date>
<author>Shinigami</author>
<change type="Changed">eCompile - BASIC style for loops (for i:= start to end) will warn again on -v5 (and above)<br/>
about the iteration variable being unused</change>
</entry>
<entry>
<date>09-08</date>
<author>Austin</author>
<change type="Added">polsys::Packages() now has a .npcdesc member. Will be 1 if the package has an npcdesc.cfg file.</change>
</entry>
<entry>
<date>09-07</date>
<author>Folko</author>
<change type="Changed">eCompile - BASIC style for loops (for i:= start to end) will no longer complain about the iteration variable being unused</change>
<change type="Changed">Fixed some endianess issues and improved the conversion performance</change>
</entry>
<entry>
<date>09-03</date>
<author>Shinigami</author>
<change type="Changed">uo::FindPath will redefine Param mobilesblock as flags (FP_IGNORE_*)</change>
<change type="Added">uo::FindPath can ignore Doors (FP_IGNORE_DOORS)</change>
</entry>
<entry>
<date>09-03</date>
<author>Austin</author>
<change type="Fixed">cfgfile::GetConfigStringArray() lines that contain a property name but no value will not be placed in the array.</change>
<change type="Added">cfgfile::GetConfigStringDictionary( element, property_name ). Works similarly to<br/>
GetConfigStringArray() but will take the first word on the line and use it for the key.<br/>
Elem ElemName<br/>
{<br/>
PropLine keyname this will be the text placed in it<br/>
}</change>
</entry>
<entry>
<date>09-02</date>
<author>Shinigami</author>
<change type="Fixed">uo::Attach allowed you to attach more than one Script to a Character</change>
</entry>
<entry>
<date>08-29</date>
<author>Shinigami</author>
<change type="Changed">UseAAnTileFlags in SERVSPECOPT(.LOCAL).CFG renamed to UseTileFlagPrefix (check 03-05)<br/>
(compatibility with const TILEDATA_FLAG_* inside uo.em)</change>
<change type="Changed">player.spyonclient2 renamed to player.clientinfo (check 01-24)</change>
</entry>
<entry>
<date>08-29</date>
<author>Folko</author>
<change type="Added">Support for custom MIME types in config/www.cfg. This allows you to<br/>
add new file types that the web server can handle, for example PNG images,<br/>
PDF files or favicon.ico. If you don't supply a www.cfg, old defaults are used.</change>
<change type="Hint">Here's an example www.cfg:<br/>
MIME gif<br/>
{<br/>
Extension gif<br/>
MIME image/gif<br/>
}<br/>
MIME jpg<br/>
{<br/>
Extension jpg<br/>
MIME image/jpeg<br/>
}<br/>
MIME jpeg<br/>
{<br/>
Extension jpeg<br/>
MIME image/jpeg<br/>
}</change>
</entry>
<entry>
<date>08-28</date>
<author>Austin</author>
<change type="Added">Ability to initialize error as you would a struct.<br/>
Example return error{&quot;errortext&quot; := &quot;This is the error message&quot;};</change>
<change type="Added">Extended NPC.EM Say() function to allow for two additional parameters.<br/>
Say( text, text_type:=SAY_TEXTTYPE_DEFAULT, do_event:=SAY_DOEVENT_DISABLE );<br/>
Text type is a string &quot;default&quot;, &quot;yell&quot;, &quot;whisper&quot;, constants are:<br/>
SAY_TEXTTYPE_DEFAULT, SAY_TEXTTYPE_YELL, SAY_TEXTTYPE_WHISPER (added to npc.em)<br/>
If do_event is enabled with SAY_DOEVENT_ENABLE, it will send a speech event to nearby npcs.</change>
</entry>
<entry>
<date>08-26</date>
<author>Austin</author>
<change type="Fixed">LEFTAREA event was not being sent to npcs in the old realm when a mobile was moved to a new realm.</change>
</entry>
<entry>
<date>08-25</date>
<author>Austin</author>
<change type="Fixed">LEFTAREA event was not being sent if a mobile was teleported 33 tiles or more away.</change>
</entry>
<entry>
<date>08-23</date>
<author>Austin</author>
<change type="Added">Logging out will now send a LEFTAREA event (after logout.ecl has finished).</change>
<change type="Added">New flag for servspecopt.cfg called &quot;EventVisibilityCoreChecks&quot; set to 0 (disabled) by default.<br/>
Enabled - the core does visibility checks before sending events as it did before.<br/>
Disabled - requires your scripts do visibility checking.</change>
</entry>
<entry>
<date>08-22</date>
<author>Shinigami</author>
<change type="Fixed">sometimes the Core crashed while destroying Items (e.g. via Control Scripts) on Boats</change>
</entry>
<entry>
<date>07-28</date>
<author>Shinigami</author>
<change type="Changed">eCompile - Assignment inside Condition Check will produce Warning on -v5 (and above) only</change>
</entry>
<entry>
<date>07-26</date>
<author>Shinigami</author>
<change type="Changed">TextCMDs can be specified in Packages; just make a commands/gm (new style) or<br/>
textcmd/gm (old style) etc directory. These are only scanned at startup,<br/>
so if the directory doesn't exist then, it won't be searched until restart.</change>
<change type="Changed">Support for packaged Includes - if you use 'Include &quot;:blah:blubb&quot;;'<br/>
eCompile will search for &quot;:blah:blubb.inc&quot; and &quot;:blah:include/blubb.inc&quot;.<br/>
It will use first file found. If both files exist eCompile will print a Warning.</change>
</entry>
<entry>
<date>07-25</date>
<author>Shinigami</author>
<change type="Added">MinDamage and MaxDamage in weapon.GetItemDescriptor() calculated from Damage-Dice</change>
<change type="Changed">usable Msg size of SendDialogGump doubled - now you can use larger Gumps</change>
</entry>
<entry>
<date>07-16</date>
<author>Shinigami</author>
<change type="Fixed">uoconvert will ignore illegal statics with graphic &gt;= 0x4000</change>
<change type="Added">uoconvert.cfg element option extended by ShowIllegalGraphicWarning<br/>
StaticOptions<br/>
{<br/>
MaxStaticsPerBlock 1000<br/>
WarningStaticsPerBlock 1000<br/>
ShowIllegalGraphicWarning 1<br/>
}<br/>
it's a flag and defaults to 1 (for the other entries go to 07-05)</change>
</entry>
<entry>
<date>07-07</date>
<author>Shinigami</author>
<change type="Hint">uo::ListItems*Location, uo::ListMobile*Location and uo::ListStatics*Location<br/>
will check for out-of-range coords now<br/>
uo::ListObjectsInBox, uo::ListMultisInBox and uo::ListStaticsInBox<br/>
will NOT check for out-of-range coords - a lot of scripter &quot;love&quot; this bug :o/</change>
</entry>
<entry>
<date>07-06</date>
<author>Shinigami</author>
<change type="Fixed">u'll get the correct string representation even if a numeric Config File<br/>
Value will cause an overflow</change>
</entry>
<entry>
<date>07-05</date>
<author>Shinigami</author>
<change type="Added">Warning if no tiles or landtiles are loaded (maybe files missing...)</change>
<change type="Added">uoconvert.cfg element option added, StaticOptions, in the following form:<br/>
StaticOptions<br/>
{<br/>
MaxStaticsPerBlock 1000<br/>
WarningStaticsPerBlock 1000<br/>
}<br/>
max. Amount of Static Items per Block of 8x8x256 (or Warning Level)<br/>
it is hard limited to 10000. default is 1000.</change>
</entry>
<entry>
<date>07-04</date>
<author>Shinigami</author>
<change type="Changed">uo::ListStaticItemsAtLocation to uo::ListStaticsAtLocation( x, y, z, flags, realm )<br/>
uo::ListStaticItemsNearLocation to uo::ListStaticsNearLocation( x, y, z, range, flags, realm )<br/>
IGNORE_* constants to ITEMS_IGNORE_* constants</change>
<change type="Added">Parameter Z in uo::ListStatics*Location</change>
<change type="Added">LIST_IGNORE_Z constant u can use for Z Parameter to list all Items ignoring Z-Value<br/>
in uo::ListStatics*Location, uo::ListItems*Location and uo::ListMobilesNearLocation*</change>
<change type="Added">uo::ListStaticsInBox( x1,y1,z1, x2,y2,z2, flags, realm );<br/>
creates an array of structures with Static and Multi Items in box.<br/>
you can specify via flags which Items you want to get. check ITEMS_IGNORE_* constants.</change>
<change type="Added">realm-based coord check inside List*InBox and uo::ListMobilesNearLocation*</change>
</entry>
<entry>
<date>07-01</date>
<author>Shinigami</author>
<change type="Fixed">low-fragmentation Heap is linked dynamically, so Core will work on Win9x/NT again</change>
<change type="ReAdded">uo::GetAttributeIntrinsicMod( character, attrname )<br/>
You set intrinsic Mod via exported GetIntrinsicModFunction in attributes.cfg</change>
<change type="Fixed">Memory leak inside cfgfile::Read-/UnloadConfigFile(...)<br/>
cfgfile::AppendConfigFile(...) will call cfgfile::UnloadConfigFile(...) immediately</change>
</entry>
<entry>
<date>06-15</date>
<author>Shinigami</author>
<change type="Added">npc::CanMove( direction ) - checks if an NPC can move in given direction<br/>
(IsLegalMove works in a different way and is used for bounding boxes only)</change>
<change type="Added">UseWinLFH=0|1 in SERVSPECOPT(.LOCAL).CFG (default = 0)<br/>
Use Windows XP/2003 low-fragmentation Heap?</change>
</entry>
<entry>
<date>06-06</date>
<author>Shinigami</author>
<change type="Fixed">FindPath will work again @ Linux-Core without crashing server in some cases.</change>
</entry>
<entry>
<date>06-01</date>
<author>Shinigami</author>
<change type="Fixed">Cancel of TradeWin will put items in correct Realm on ground if backpack full</change>
<change type="Added">movecost.cfg can have 'Walking_Mounted' and 'Running_Mounted' sections too.<br/>
You've to declare one global 'MovementCost' section or 2 sections 'Walking' and<br/>
'Running'. If you don't declare Mounted sections, Core will use unmounted values.</change>
<change type="Added">uo::Attach( character ) - attach a Script to a Character</change>
<change type="Fixed">moving intrinsic Weapon via MoveItemToLocation crashed Server</change>
<change type="WARNING">You should never touch intrinsic Weapons!</change>
<change type="Added">uo::ListStaticItemsAtLocation( x, y, flags, realm )</change>
<change type="Added">uo::ListStaticItemsNearLocation( x, y, range, flags, realm )<br/>
creates an array of structures with Static and Multi Items at or around location.<br/>
you can specify via flags which Items you want to get. check IGNORE_* constants.</change>
<change type="[Edit">changed... please check 07-04 above]</change>
<change type="Added">uo::GetStandingLayers( x, y, flags, realm )<br/>
get an array of standing layers and blocking solids. check MAPDATA_FLAG_* constants.</change>
</entry>
<entry>
<date>05-31</date>
<author>Shinigami</author>
<change type="Added">flag LOG_DATETIME in file::LogToFile( filename, line, flags := 0 )<br/>
to log Core-Style DateTimeStr in front of log entry</change>
</entry>
<entry>
<date>05-28</date>
<author>Shinigami</author>
<change type="Added">flag ENUMERATE_IGNORE_LOCKED in uo::EnumerateItemsInContainer( container, flags := 0 )<br/>
to list content of locked container too</change>
<change type="Added">uo::SecureTradeWin( character, character2 ) - to init secure trade via script over long distances</change>
<change type="Added">uo::MoveItemToSecureTradeWin( item, character ) - to move item to secure trade window via script</change>
</entry>
<entry>
<date>05-25</date>
<author>Shinigami</author>
<change type="Added">Account.delete() - delete this empty account</change>
<change type="Added">Account.split( newacctname : string, index : 1..5 )<br/>
create a new account and move character to it</change>
<change type="Added">Account.move_char( destacctname : string, index : 1..5 )<br/>
move character from this account to destination account.<br/>
you can use it to flip chars on same account too - it's not a bug, it's a feature ;oP</change>
</entry>
<entry>
<date>04-04</date>
<author>Shinigami</author>
<change type="Added">player.createdat - returns the PolClock when the character was created</change>
<change type="Added">Before character deletion, scripts/misc/candelete.ecl will be called.<br/>
program definition is:<br/>
- program can_delete( who, deleteby ); // return nonzero to allow deletion<br/>
new constants in UO.EM:<br/>
- DELETE_BY_PLAYER : Delete-Request by Player<br/>
- DELETE_BY_SCRIPT : Delete-Request by account.DeleteCharacter( index )<br/>
Before character deletion, scripts/misc/ondelete.ecl and anypkg/ondelete.ecl will be called.<br/>
Their return values are ignored.</change>
<change type="Fixed">Call OnDelete script in account.DeleteCharacter( index ) too.</change>
<change type="Updated">Account.set_uo_expansion(string): recognized values: SE, AOS, LBR, T2A (default), &quot;&quot;.<br/>
This determines what flag is sent with packet 0xB9 during login<br/>
(Nothing -&gt; 0x0000 / T2A -&gt; 0x0001 / LBR -&gt; 0x0002 / AOS -&gt; 0x801b / SE -&gt; 0x805b).<br/>
It's possible to hook 0xB9 but don't forget to set_uo_expansion anyway because core<br/>
uses this for internal flags (e.g. AoS Tooltips). Packet 0xB9 will be sent earlier<br/>
(before you choose a character) and after you've used set_uo_expansion.</change>
<change type="Updated">servspecopt.cfg property: UOFeatureEnable, used in the last dword of the 0xA9 login packet,<br/>
will block Bit 6 (support up to 6 Chars).<br/>
To enable AoS stuff set Bit 5 (use 0x20), to enable SE stuff set Bit 7 &amp; 5 (use 0xa0).</change>
</entry>
<entry>
<date>04-02</date>
<author>Shinigami</author>
<change type="Added">Additional realm-support<br/>
CreateItemCopyAtLocation(x, y, z, item, realm := _DEFAULT_REALM);<br/>
boat.move_offline_mobiles(int x, int y, int z[, string realm]);<br/>
(If realm is not set, Boat-realm is used.)</change>
<change type="Added">Some realm-constants to uo.em</change>
</entry>
<entry>
<date>03-09</date>
<author>Shinigami</author>
<change type="Added">WeaponTemplate Prop Delay [ms]</change>
<change type="Added">NPCDesc Prop AttackDelay [ms]</change>
<change type="Added">character.delay_mod [+-ms] for WeaponDelay<br/>
If (Delay!=0) use Delay(+delay_mod) to calculate next weapon swing.</change>
</entry>
<entry>
<date>03-05</date>
<author>Shinigami</author>
<change type="Added">UseTileFlagPrefix=0|1 in SERVSPECOPT(.LOCAL).CFG (default = 1)<br/>
Should Core prepend &quot;a&quot;/&quot;an&quot; according to tiles.cfg flags to formatted item names?<br/>
(p.s.: in 08-29 renamed from UseAAnTileFlags to UseTileFlagPrefix)</change>
<change type="Fixed">Last but not least, remove Spell Delay usage from core.</change>
</entry>
<entry>
<date>03-03</date>
<author>Madman</author>
<change type="Fixed">My previous attempt to remove spellcasting from the core was incomplete. It should no<br/>
longer run a skillcheck before starting the spell script.</change>
</entry>
<entry>
<date>03-02</date>
<author>Shinigami</author>
<change type="Fixed">MoveObjectToRealm will handle any type of items (equipment etc.) and container with content too.</change>
<change type="Fixed">You can move item from container to different realm without crash.</change>
</entry>
<entry>
<date>03-01</date>
<author>Shinigami</author>
<change type="Fixed">Pol will support up to 5 Maps now (Britannia, Britannia_alt, Ilshenar, Malas, Tokuno)</change>
</entry>
<entry>
<date>02-23</date>
<author>Shinigami</author>
<change type="Added">DecayItems=0|1 in SERVSPECOPT(.LOCAL).CFG (default = 1)<br/>
Disable (e.g. World Design Server) or enable (Live Shard Server) item decay.</change>
</entry>
<entry>
<date>02-14</date>
<author>Shinigami</author>
<change type="Fixed">AOS Spellbook entries in itemdesc.cfg will not crash linux build anymore.</change>
<change type="Fixed">Wrong handling of double clicking AoS style Spellbooks.</change>
</entry>
<entry>
<date>01-27</date>
<author>Shinigami</author>
<change type="Fixed">UOConvert will convert Samurai Empire Map Tokuno.<br/>
Don't forget to use tiledata.mul shipped with SE.<br/>
Don't forget to build new tiles.cfg and landtiles.cfg too.<br/>
If not, your Tokuno Realm works and maybe looks funny ;o)</change>
<change type="Fixed">Small bug within UOConvert and Tiledata names with full length.</change>
</entry>
<entry>
<date>01-24</date>
<author>Shinigami</author>
<change type="Added">player.clientinfo -- returns a struct with a lot of usefull infomation about client PC<br/>
Example :<br/>
Function TestClientInfo(who)<br/>
Var info:=who.clientinfo;<br/>
If (info.unknown1) // in most/all cases 0x02<br/>
SysLog(&quot;ClientInfo '&quot;+who.name+&quot;' [&quot;+who.acctname+&quot;]&quot;);<br/>
SysLog(&quot; Unknown1 = &quot;+Lower(Hex(info.unknown1)));<br/>
SysLog(&quot; Unique Instance ID of UO = &quot;+Lower(Hex(info.instance)));<br/>
SysLog(&quot; OS Version = &quot;+info.os_major+&quot;.&quot;+info.os_minor+&quot;.&quot;+info.os_revision);<br/>
SysLog(&quot; CPU Manufacturer = &quot;+info.cpu_manufacturer);<br/>
SysLog(&quot; CPU Family = &quot;+info.cpu_family);<br/>
SysLog(&quot; CPU Model = &quot;+info.cpu_model);<br/>
SysLog(&quot; CPU Clock Speed = &quot;+info.cpu_clockspeed+&quot; MHz&quot;);<br/>
SysLog(&quot; CPU Quantity = &quot;+info.cpu_quantity);<br/>
SysLog(&quot; Memory = &quot;+info.memory+&quot; MB&quot;);<br/>
SysLog(&quot; Screen Resolution = &quot;+info.screen_width+&quot; x &quot;+info.screen_height+&quot; x &quot;+info.screen_depth+&quot; Bit&quot;);<br/>
SysLog(&quot; Direct X Version = &quot;+info.directx_major+&quot;.&quot;+info.directx_minor);<br/>
SysLog(&quot; Video Card Description = &quot;+CChrZ(info.video_description));<br/>
SysLog(&quot; Video Card Vendor ID = &quot;+info.video_vendor);<br/>
SysLog(&quot; Video Card Device ID = &quot;+info.video_device);<br/>
SysLog(&quot; Video Card Memory = &quot;+info.video_memory+&quot; MB&quot;);<br/>
SysLog(&quot; Distribution = &quot;+info.distribution);<br/>
SysLog(&quot; Clients Running = &quot;+info.clients_running);<br/>
SysLog(&quot; Clients Installed = &quot;+info.clients_installed);<br/>
SysLog(&quot; Partial Insstalled = &quot;+info.partial_installed);<br/>
SysLog(&quot; Language Code = &quot;+CChrZ(info.langcode));<br/>
SysLog(&quot; Unknown2 = &quot;+info.unknown2);<br/>
Else<br/>
SysLog(&quot;No ClientInfo '&quot;+who.name+&quot;' [&quot;+who.acctname+&quot;]&quot;);<br/>
EndIf<br/>
EndFunction<br/>
Limitations :<br/>
The client doesn't send this Packet every time,<br/>
if available you can use it first time in your misc/logon.src.<br/>
If your login server differs from play/shard server it doesn't work<br/>
(Packet will be send before you choose the server only).<br/>
This will work for Win release only, until now. Win and Linux core<br/>
handle server-choose- and play-connection in a different way.<br/>
Not sure why, must be something with OS-Socks implementation :o(<br/>
Comment :<br/>
Seems to be very usefull to detect shadow accounts...<br/>
You love 1984? OSI too ;oP<br/>
(p.s.: in 08-29 renamed from player.spyonclient2 to player.clientinfo)</change>
</entry>
<entry>
<date>01-24</date>
<author>Shinigami</author>
<change type="Linux">If you'll get something like this using Gentoo Release:</change>
<change type="pol">../sysdeps/generic/dl-tls.c:72: _dl_next_tls_modid:<br/>
Assertion `result &lt;= _dl_tls_max_dtv_idx' failed.<br/>
try following to run your Pol:<br/>
#!/bin/sh<br/>
export LD_ASSUME_KERNEL=2.4<br/>
./pol</change>
</entry>
<entry>
<date>09-18</date>
<author>Birdy</author>
<change type="Fixed">Moved login complete packet send higher in login process to try to fix<br/>
problems with logging into a weather region with weather where it would<br/>
start to rain spell icons instead of rain or snow.</change>
</entry>
<entry>
<date>08-03</date>
<author>Birdy</author>
<change type="Added">AcctMatch lines in server entries in servers.cfg. Example of format<br/>
is below. AcctMatch lines have one account name per line, and are<br/>
those accounts to show the given server to on login to the<br/>
'login server'(the server that is in the client's login.cfg).<br/>
Example :<br/>
GameServer<br/>
{<br/>
Name Test<br/>
IP 192.168.0.1<br/>
Port 5003<br/>
AcctMatch admin<br/>
AcctMatch staff<br/>
}<br/>
The above would only display that particular server(Test, located at<br/>
192.168.0.1:5003) to someone logging into the login server with<br/>
accounts admin or staff.<br/>
IPMatch still works as well, and for an account to see the server it<br/>
must fulfill both IPMatch and AcctMatch entries, if those exist to<br/>
match up against.</change>
</entry>
<entry>
<date>08-03</date>
<author>Birdy</author>
<change type="Fixed">Good Aligned NPCs that attack innocents and go criminal will<br/>
highlight grey now.<br/>
Attacking criminal flagged Good NPCs will no longer flag others as<br/>
criminal.</change>
</entry>
<entry>
<date>08-01</date>
<author>Birdy</author>
<change type="Fixed">Crash bug related to realm not being set in createitemincontainer soon<br/>
enough for references to it in create scripts.</change>
</entry>
<entry>
<date>07-27</date>
<author>Birdy</author>
<change type="Added">New system event : SYSEVENT_GONE_CRIMINAL := 0x2000;<br/>
You should add this to your sysevent.inc file or wherever you keep your<br/>
system event constants. This event is closely associated with the<br/>
SYSEVENT_ENTERED_AREA event. It uses the current range setting for<br/>
the ENTERED_AREA event as it's own range, and this is for good reason.<br/>
The GONE_CRIMINAL event lets the system tell the NPC when a mobile has<br/>
become a criminal(from a previously non-criminal state) by firing this<br/>
event and placing a character reference to the new criminal in the<br/>
source field of the event. If used in conjunction with the ENTERED_AREA<br/>
system event, then guards should be able to do their guarding work<br/>
without needing to do polling scans of the area around them periodically.<br/>
On ENTERED_AREA events, you check to see if the person entering the area<br/>
is a criminal or not. On GONE_CRIMINAL events, you know that the person<br/>
who was already in the area has become a criminal from previously being<br/>
innocent.<br/>
This event will only fire if the criminal is visible to the NPC. Though<br/>
again, if you are using it in conjunction with the ENTERED_AREA event, then<br/>
when the criminal comes out of hiding, an ENTERED_AREA event will be fired<br/>
and you can handle the criminal there.<br/>
This event will also only fire on transitions from innocent status to<br/>
criminal status. No events will fire on transition to innocent status<br/>
again, and if the subject was already a criminal to begin with, then<br/>
doing a criminal act again will not fire the event. This is to keep the<br/>
system from being overloaded with events since every hit on an innocent<br/>
is a new criminal act.<br/>
I will stress one last time, use this WITH the SYSEVENT_ENTERED_AREA<br/>
system event, NOT on it's own! Or you will be confused and bewildered.<br/>
You have been warned!</change>
</entry>
<entry>
<date>07-18</date>
<author>Madman Across the Water</author>
<change type="Changed">Casting from the default spellbook:<br/>
* It no longer checks if you are dead, says the words of power,<br/>
performs the animations, checks for free hands, performs a<br/>
skill check, or checks for or consumes mana or reagents. All<br/>
these things must now be handled in scripts. This, combined<br/>
with Myrathi's changes on 5-12, wherein spellid is now passed<br/>
to the cast spell, should allow greater flexibility and also<br/>
simplicity in spell systems and scripts.</change>
</entry>
<entry>
<date>06-17</date>
<author>Birdy</author>
<change type="Changed">Uncommented RandomFloat(...) in util.em to allow it to be used.</change>
</entry>
<entry>
<date>06-13</date>
<author>Birdy</author>
<change type="Fixed">Items dragged across realms and dropped will update properly. This<br/>
is necessary to allow storage containers to be able to have their items<br/>
dragged out of them and dropped on the ground directly, even if the<br/>
ground is not the default realm that storage containers are all in.</change>
<change type="Fixed">All worn items will now have their realm updated on character realm<br/>
transfer instead of just the backpack.</change>
</entry>
<entry>
<date>06-09</date>
<author>Myrathi</author>
<change type="Removed">Deprecated UO.EM functions:<br/>
* Damage()<br/>
* GameStat()</change>
</entry>
<entry>
<date>06-08</date>
<author>Myrathi</author>
<change type="Fixed">CASE statements given a significant overhaul:<br/>
* Error messages now correctly refer to them as a &quot;CASE statement&quot;,<br/>
not a &quot;SWITCH statement&quot;.<br/>
* They now *require* their test-expression to be within parenthesis.<br/>
* Empty CASE statements with no option clauses are now caught as<br/>
invalid.<br/>
* A warning message will be displayed if the only thing defined is<br/>
a &quot;default:&quot; clause (i.e. no option clauses)<br/>
* Missing option values are now caught and less cryptic error messages<br/>
shown (e.g. when using undefined constants)</change>
</entry>
<entry>
<date>06-06</date>
<author>Myrathi</author>
<change type="Added">New 'dowhile' keyword (to solve the &quot;do/while()/endwhile/while()&quot;<br/>
bug). &quot;do..dowhile()&quot; now follows the more usual block syntax<br/>
style (if..endif, while..endwhile, etc.).<br/>
Syntax is as follows:<br/>
do<br/>
&lt;statements&gt;<br/>
dowhile ( &lt;expression-is-true&gt; );</change>
</entry>
<entry>
<date>06-05</date>
<author>Birdy</author>
<change type="Added">ItemColorMask ServerSpecOpt option. This option defaults to the<br/>
typical POL mask of 0xFFF. It is a bitmask of what colors should<br/>
be considered valid. For example, with an ItemColorMask of<br/>
0xFFF, any color from 0 to 4095 is considered a valid color.<br/>
With an ItemColorMask of 0xFF, this would be reduced to a range<br/>
from 0 to 255. It was left a mask instead of given as a range<br/>
in order to allow specifying certain bits to be on. So, for<br/>
instance, with the newer clients, a mask of 0x4FFF will allow<br/>
the third bit (value 4) of the most significant nibble to<br/>
be turned on, but no others in that nibble. This allows for<br/>
newer clients to use the &quot;transparent animation&quot; feature, which<br/>
allows equipped mounts to be transparent(ie, ethereals). Bear<br/>
in mind, older clients may well crash if you set colors to be<br/>
outside of the non-default mask of 0xFFF, so this is strictly at<br/>
your own risk to use it. But for those of you wishing ethereal<br/>
beetles and other mount animations to be ethereal, you will have<br/>
to set the mount piece to be color 0x4001 and then equip it.<br/>
And in order to do that, you will need an ItemColorMask of<br/>
0x4FFF.</change>
</entry>
<entry>
<date>06-03</date>
<author>Birdy</author>
<change type="Removed">GetAttributeIntrinsicMod(...) function interface in uo.em was<br/>
removed, since no Set for the function has existed since way<br/>
back in POL094 test cores and no plans to impliment a set<br/>
exist. This will require a search of your scripts for this<br/>
function and removal of it(some distro code has it) and<br/>
a recompile of those scripts.</change>
</entry>
<entry>
<date>05-24</date>
<author>Birdy</author>
<change type="Fixed">FindSubstance should now (hopefully) auto-release items reserved by<br/>
it on script termination.</change>
<change type="Fixed">Packet.SendAreaPacket(x,y,range,realm) now looks for 4 parameters<br/>
as it should instead of 3.</change>
</entry>
<entry>
<date>05-17</date>
<author>Birdy</author>
<change type="Changed">concealed property is no longer compared to cmdlevel by core. Any<br/>
scripts changing concealed should do validation against cmdlevel<br/>
itself. Doing this now allows NPCs and others to be able to be<br/>
concealed at higher levels than their cmdlevel. For this added<br/>
flexibility, all validation must now be done within scripts!</change>
</entry>
<entry>
<date>05-16</date>
<author>Myrathi</author>
<change>Removed deprecated operators and tokens (as promised! :P'):<br/>
- '=' has been removed; use '==' to test for equality.<br/>
(appropriate suggestions will be made for '==' or ':=')<br/>
- 'local', 'global' and 'dim' have been removed; use 'var' to declare variables.<br/>
- 'begin' and 'end' have been removed:<br/>
do..while() loops now work without them.<br/>
repeat..until() loops never actually needed them: so no loss. :)<br/>
** Scripts containing any of the removed operators or tokens **<br/>
** WILL NOT COMPILE ANY MORE!! Update your scripts!! **</change>
</entry>
<entry>
<date>05-12</date>
<author>Myrathi</author>
<change type="Fixed">Mobile 'mob.frozen' flag is now saved properly (NOTE: this includes PCs and<br/>
will most likely require any existing scripted workarounds to be rewritten!)</change>
<change type="Added">Extra 'spell_id' parameter is now passed to spell scripts which relates to<br/>
'SPELLID' in the spell's entry in '::spells.cfg'.<br/>
Example:<br/>
use uo;<br/>
program spellscript( who, spell_id )<br/>
SendSysMessage(who, &quot;Casting SPELLID# &quot; + CStr(spell_id));<br/>
// &quot;Clumsy&quot; has spell_id = 1, &quot;Create Food&quot; = 2, etc..<br/>
endprogram</change>
</entry>
<entry>
<date>05-01</date>
<author>Birdy</author>
<change type="Fixed">Number of Map/Static patches was reversed in the enable difs packet.</change>
</entry>
<entry>
<date>05-01</date>
<author>Racalac</author>
<change>Fixed CProps &quot;GivenBy&quot;, &quot;GivenTo&quot;, and &quot;GivenTime&quot; set on items dropped on NPCs.</change>
</entry>
<entry>
<date>04-26</date>
<author>Birdy</author>
<change type="Added">New uo.em function created :<br/>
FindSubstance( container, objtype, amount, makeinuse := 0 )<br/>
This function will search the given container for items of objtype in an<br/>
amount equal or greater than the amount given(stackables can return greater<br/>
than #), if makeinuse is set to 1, then the items will be reserved. If<br/>
sufficient # of items have been found, those found(and possibly reserved)<br/>
will be returned in an array as the return value. If not enough of the<br/>
given item were found, then an error with errortext = &quot;Not enough of that<br/>
substance in container&quot; will be returned.</change>
</entry>
<entry>
<date>04-25</date>
<author>Racalac</author>
<change>Added new house methods that allow write access to the house.components array.<br/>
house.add_component(item ref)<br/>
house.erase_component(item ref)<br/>
Added multi member:<br/>
multi.footprint<br/>
returns a struct with &quot;xmin&quot;, &quot;xmax&quot;, &quot;ymin&quot;, &quot;ymax&quot; of the world coordinates<br/>
the house or boat occupies.<br/>
Added GetMultiDimensions(graphic), returns struct with &quot;xmin&quot;, &quot;xmax&quot;, &quot;ymin&quot;, &quot;ymax&quot;<br/>
of _relative_ distances from center. xmin and ymin are _negative_.<br/>
Changed TargetMultiPlacement. new optional parameters:<br/>
TargetMultiPlacement( character, objtype, flags := 0, xoffset := 0, yoffset := 0 );<br/>
xoffset and yoffset change the &quot;ghost&quot; target house. NOTE: the coordinates returned<br/>
by this are the coordinates of the &quot;target&quot; cursor, not the center of the house!<br/>
So if you want to have the front steps be under the cursor, you must transform the<br/>
parameters to CreateMultiAtLocation to include your xoffset and yoffset. ANOTHER</change>
<change type="NOTE">positive offsets move the cursor left/down in relation to the ghost house.<br/>
When transforming the coordinates for CreateMultiAtLocation, use the negative (i.e<br/>
if yoffset is 4, subtract 4 from the y coordinate result of TargetMultiPlacement<br/>
when passing the location to CreateMultiAtLocation.<br/>
Example, using the front steps to target:<br/>
var dims := GetMultiDimensions( 0x6071 );<br/>
if(!dims) return; endif<br/>
var loc := TargetMultiPlacement( who, 0x6071, 0, 0, dims.ymax );<br/>
if(!loc) return; endif<br/>
var house := CreateMultiAtLocation( loc.x, loc.y - dims.ymax, loc.z, 0x6071, 0, who.realm );</change>
</entry>
<entry>
<date>04-24</date>
<author>Racalac</author>
<change>Armor Zone 0 errors hae a better message now.<br/>
Half-created PCs shouldn't get into the world file now.<br/>
Added house.custom() returns 1/0 (for upcoming custom house support)<br/>
NPC move functions check the current realm's bounds<br/>
CreateItemAtLocation correctly checks passed coordinates for validity for the realm<br/>
Map methods (insertpin, etc) check the current realm's bounds. Not like there's art for<br/>
the other realms anyway.<br/>
Packet 0x1B changed to include correct map/server bounds</change>
</entry>
<entry>
<date>04-23</date>
<author>Birdy</author>
<change type="Changed">Mounts listed in uoconvert.cfg that are not found to have tiledata.mul<br/>
entries will now be created regardless. Should fix problems related to<br/>
0x3ea2 mount(perhaps others too), which has no tiledata.mul entry, yet<br/>
is a valid mount graphic.</change>
</entry>
<entry>
<date>04-20</date>
<author>Birdy</author>
<change type="Fixed">FindPath(...) should work again now.</change>
</entry>
<entry>
<date>04-17</date>
<author>Birdy</author>
<change type="Changed">Speech.mul -- Added in support for UTF-8 -&gt; Unicode decoding in speech.mul<br/>
packets. Should work now (hopefully) for all languages.</change>
<change type="Fixed">Minor tweaks to movement. Should fix some bounceback problems.</change>
</entry>
<entry>
<date>04-17</date>
<author>Racalac</author>
<change>Multimap/Realm Support<br/>
----------------------<br/>
POL now supports seperate maps, or &quot;Realms&quot;, such as britannia, ilshenar,<br/>
and malas. The uoconvert tool is the starting point for using realms on<br/>
your shard. Run the updated instructions in the included uoconvert.txt<br/>
help file. The names of the directories created in pol/realms by uoconvert<br/>
are the realm names that are used by the core and your scripts. I<br/>
recommend you keep them the same as what is in the uoconvert.txt file.<br/>
Realm names are the key to using realms on your shard.<br/>
The client's *.dif files should be used in the uoconvert process, as the<br/>
client needs to know how many patches exist. Any time the .dif files<br/>
change on the client side, re-run uoconvert with the new .dif files to<br/>
stay in sync.<br/>
Object Changes:<br/>
UObject.realm: Read-only string. (This inherits to Item, Character, Multi, etc)<br/>
Account.uo_expansion: Read-only string<br/>
Account.set_uo_expansion(string): recognized values: AOS, LBR, T2A (default)<br/>
This determines what flag is sent with packet 0xB9 during login. The<br/>
servspecopt.cfg UOFeatureEnable is used with packet 0xA9 and is currently<br/>
global to all clients.<br/>
Packet.SendAreaPacket(x,y,range,realm), realm name string parameter added.<br/>
Escript Module Changes:<br/>
polsys.em:<br/>
Added &quot;Realms()&quot;: returns a dictionary of structs. example:<br/>
&quot;realm_name&quot; -&gt; &quot;width&quot;<br/>
&quot;height&quot;<br/>
&quot;mapid&quot;<br/>
&quot;toplevel_item_count&quot;<br/>
&quot;mobile_count&quot;<br/>
uo.em (included with zip):<br/>
The following functions were enhanced with a realm parameter (all realm<br/>
parameters are a case-sensative string name of the realm). All other<br/>
functions use some object's context for determining the realm.<br/>
Tip for upgrading: all your scripts should works normall _in Britannia_.<br/>
In any other realm they will fail. You must find all occurances of these<br/>
functions on your shard and fill in the realm parameter with an appropriate<br/>
value. For example, in the createnpc textcommand, the call to<br/>
CreateNPCAtLocation should be made with 'who.realm' as the last parameter.<br/>
Many script changes are easy like this, others are harder, like<br/>
spawnregion and recall/gate spells. If something doesn't work, you can be<br/>
fairly sure it's due to an incorrect realm parameter. The pol-distro<br/>
sourceforge project has been updated with many of these changes if you<br/>
wish to look.<br/>
const _DEFAULT_REALM := &quot;britannia&quot;;<br/>
CreateItemAtLocation( x, y, z, objtype, amount := 1, realm := _DEFAULT_REALM );<br/>
CreateMultiAtLocation( x, y, z, objtype, flags := 0, realm := _DEFAULT_REALM );<br/>
CreateNpcFromTemplate( template, x, y, z, override_properties := 0, realm := _DEFAULT_REALM);<br/>
FindPath( x1, y1, z1, x2, y2, z2, realm := _DEFAULT_REALM, mobilesblock := 0, searchskirt := 5 );<br/>
GetHarvestDifficulty( resource, x, y, tiletype, realm := _DEFAULT_REALM );<br/>
GetMapInfo( x, y, realm := _DEFAULT_REALM );<br/>
GetRegionString( resource, x, y, propertyname, realm := _DEFAULT_REALM );<br/>
GetStandingHeight( x, y, startz, realm := _DEFAULT_REALM );<br/>
GetWorldHeight( x, y, realm := _DEFAULT_REALM );<br/>
HarvestResource( resource, x, y, b, n, realm := _DEFAULT_REALM ); // returns b*a where 0 &lt;= a &lt;= n<br/>
ListGhostsNearLocation( x, y, z, range, realm := _DEFAULT_REALM );<br/>
ListItemsAtLocation( x, y, z, realm := _DEFAULT_REALM );<br/>
ListItemsNearLocation( x, y, z, range, realm := _DEFAULT_REALM );<br/>
ListItemsNearLocationOfType( x,y,z, range, objtype, realm := _DEFAULT_REALM );<br/>
ListItemsNearLocationWithFlag( x,y,z, range, flags, realm := _DEFAULT_REALM );<br/>
ListMobilesNearLocation( x, y, z, range, realm := _DEFAULT_REALM );<br/>
ListMobilesNearLocationEx( x,y,z, range, flags, realm := _DEFAULT_REALM );<br/>
ListObjectsInBox( x1,y1,z1, x2,y2,z2, realm := _DEFAULT_REALM );<br/>
ListMultisInBox( x1,y1,z1, x2,y2,z2, realm := _DEFAULT_REALM );<br/>
PlayMovingEffectXYZ( srcx, srcy, srcz, dstx, dsty, dstz, effect, speed, loop := 0, explode := 0, realm := _DEFAULT_REALM );<br/>
PlayStationaryEffect( x, y, z, effect, speed, loop := 0, explode := 0, realm := _DEFAULT_REALM );<br/>
Functions added:<br/>
MoveObjectToRealm( object, realm, x, y, z, flags := 0 );<br/>
--This is the only write interface to an object's realm. If you wish<br/>
an object to reside on another realm, this is the only function<br/>
available. Check obj.realm != destination_realm to avoid unnecessary<br/>
same-realm transfers. flags is the normal MoveItem|CharacterToLocation<br/>
flags. The passed x,y,z must be a standable location in the specified<br/>
realm.<br/>
Most of these functions will return the errors &quot;Realm not found&quot; and<br/>
&quot;Invalid Coordinates for realm&quot;.<br/>
Regions:<br/>
Added &quot;Realm realmname&quot; property<br/>
poltool:<br/>
added a 5th parameter for the 'mapdump' command, a realm name string as above<br/>
uoconvert:<br/>
number of map and static patches (from mapdif and stadif files) saved to<br/>
/realm/[name]/realm.cfg<br/>
Recommend to turn on mapdifs for all realms.<br/>
Other Changes:<br/>
AOS Spellbook packets are supported. For this, change you spellbook's<br/>
itemdesc.cfg type from Container to Spellbook. Paladin and Necromancer<br/>
spellbooks are supported by the new Spellbook itemdesc type property<br/>
&quot;SpellType&quot; which is one of these strings: &quot;Magic&quot;, &quot;Paladin&quot;, &quot;Necro&quot;.<br/>
Recognized scroll objects are: Magic: 0x1F2D - 0x1F6C, Necro 0x2260 - 0x226F,</change>
<change type="Paladin">0x2270 - 0x227C. Sorry this is hardcoded :P<br/>
Simple support for AOS tooltips - old single click functionality is supported.<br/>
Custom Houses - not yet sorry, that's next!</change>
</entry>
<entry>
<date>04-01</date>
<author>Birdy</author>
<change type="Added">MaxPathFindRange servspecopt[.local].cfg option added. This will define the<br/>
maximum distance between the start and destination points which pathfinding<br/>
will be performed on. If PathFind is called on points greater than this<br/>
value, an error result will be returned with &quot;Beyond Max Range.&quot; as the<br/>
errortext. Default value for this is 50.</change>
<change type="Added">HiddenTurnsCount servspecopt[.local].cfg option added. This will define<br/>
whether or not turns made while hidden will count as a &quot;move&quot;. It defaults<br/>
to 1, which is the way POL has always operated. If set to zero, then if<br/>
you are hidden and make a turn, it will not count against your stealth steps,<br/>
nor will it unhide you if you are not stealthing. If set to one, turns while<br/>
hidden do count against stealthsteps, and will unhide you if you are not<br/>
stealthing.</change>
<change type="Added">New uo.em function added, UseItem(item, character); This will allow the<br/>
item specified's use script to be run by the character specified. No checks<br/>
are done for distance, or check for being a ghost, or anything else.<br/>
Essentially, the script is just fired off on the character without checks, so<br/>
the script calling this function should do those checks if desired. This<br/>
function can also be called with NPC's as the character, but any use script<br/>
that requires interactivity with it's user that is called on an NPC may have<br/>
unpredictable results(dependant on the script).</change>
<change type="Added">UOConvert now will report the (x,y,z) of invalid tiles that cause it to<br/>
abort map conversion instead of just aborting.</change>
</entry>
<entry>
<date>03-29</date>
<author>Birdy</author>
<change type="Fixed">Caves should now be able to be walked into. Some problems along shores fixed too.<br/>
Run UOconvert on your files for this fix to work.</change>
</entry>
<entry>
<date>03-24</date>
<author>Birdy</author>
<change type="Changed">Character height in all other aspects changed to 15 from 9 to better reflect height in<br/>
game relative to items.</change>
<change type="Changed">Walking related to ladders modified to try to help in their traversal.</change>
<change type="Changed">The map now should block LOS. Run UOconvert on all your files again! (see uoconvert.txt<br/>
for instructions)</change>
<change type="Fixed">Speech.mul should now display speech with keywords even when on a non-ENU region computer.</change>
<change type="Changed">Boats now check height of blockables in relation to the boat before being<br/>
blocked by them. This should allow boats to travel under sufficiently high<br/>
bridges and over statics that may be under the map.</change>
<change type="Added">Pathfinding function FindPath. This is a very experimental function and has a minute<br/>
chance of returning a &quot;Path Corrupted&quot; error. If you use it and can find a distinct<br/>
path from point A to point B which generates a &quot;Path Corrupted&quot; error, please send<br/>
details to the dev team.<br/>
Function prototype is found in uo.em and takes the form :<br/>
FindPath( x1, y1, z1, x2, y2, z2, realm := _DEFAULT_REALM, mobilesblock := 0, searchskirt := 5 );<br/>
(x1,y1,z1) = start of the path<br/>
(x2,y2,z2) = destination<br/>
mobilesblock = Whether or not to consider mobiles in the way as 'blocking' the path.<br/>
searchskirt = The skirt around the square that is formed around the start of the path<br/>
to the destination which represents the searchable area.<br/>
If it finds a path it will return an array of coordinates, representing each step<br/>
along the path from the next step to take from the start of the path to the actual<br/>
destination. The coordinates are found in .x, .y, and .z. Ex :<br/>
myPath := FindPath(startx, starty, startz, endx, endy, endz);<br/>
The first step to take from a standing position at (startx,starty,startz) would be<br/>
at (myPath[1].x, myPath[1].y, myPath[1].z), the next at (myPath[2].x, myPath[2].y,<br/>
myPath[2].z), etc.<br/>
Keep in mind that if you want you can give as large a search area as you want, and<br/>
it will try to find the area. But the larger the search area(ie, the larger the<br/>
distance from start to destination), the more memory and more time it will take to<br/>
find a path. Trying to search, for instance, for a path from Yew to Britain will<br/>
almost certainly freeze your shard and gobble up all it's memory. No restrictions<br/>
were placed in core in order to allow for use of the function with future computers<br/>
which may indeed one day be able to search for such a path in a split second. But<br/>
that leaves the responsibility on the scripter using the function to be certain to<br/>
not try to search for outrageously large paths. My experience is that paths of<br/>
20 or less tiles are fairly quick and low impact on the server.<br/>
Several errors can be returned instead, with the following errortext messages :<br/>
&quot;Failed to find a path.&quot; -- The typical error returned when a path hasn't been found.<br/>
&quot;Out of memory.&quot; -- This will only happen if there isn't sufficient memory to perform the search.<br/>
&quot;Solution Corrupted!&quot; -- This is an error that rarely seems to happen, but if you can get it to<br/>
happen repeatedly along a static(non-changing) specific path, please<br/>
report it to birdy@polserver.com<br/>
&quot;Pathfind Error.&quot; -- A catch-all error for various other circumstances, assume no path could be found.</change>
</entry>
<entry>
<date>03-04</date>
<author>Birdy</author>
<change type="Changed">Character look height changed to 15 from 9 to better reflect height in game relative<br/>
to items.</change>
<change type="Added">uoconvert.cfg element option added, LOSOptions, in the following form:<br/>
LOSOptions<br/>
{<br/>
UseNoShoot 1<br/>
LOSThroughWindows 1<br/>
}<br/>
UseNoShoot means uoconvert will determine whether or not something blocks LOS by use of<br/>
the NoShoot tiledata flag instead of the Blocking tiledata flag. A couple of special<br/>
cases exist for secret door items and blocking items that are walls(in both cases, LOS<br/>
will be hindered), but otherwise the NoShoot tiledata flag will be used. This should<br/>
make many blocking, yet not really LOS blocking items no longer block sight, such as<br/>
candelabras, lamp posts, and such.<br/>
LOSThroughWindows only matters if UseNoShoot is 1. If LOSThroughWindows is 1, then<br/>
items marked as windows in tiledata will not impede LOS.<br/>
Both of these options default to false. When UseNoShoot is false, the old method of<br/>
determining sight blocking as being equivalent to ability to pass will be used for LOS.</change>
<change type="Added">uoconvert.cfg element option added, Mounts, in the following form:<br/>
Mounts<br/>
{<br/>
Tiles 0x3ea0 0x3ea1 0x3ea2 0x3ea3 0x3ea4 0x3ea5 0x3ea6 0x3ea8 0x3ea9 0x3eb0 0x3eb2 0x3eb3 0x3e9f<br/>
}<br/>
If this element exists, and if Tiles exist within it, then those tiles with the graphic IDs<br/>
listed will be considered to be mounts by uoconvert and will set the layer to be the<br/>
mount layer and it will set the tile to be equippable.</change>
<change type="Added">New System Hook : SpeechMul -- This hook will be activated when someone using a client with speech.mul<br/>
in it says a speech.mul keyword(one or more). The person who spoke is passed as the first parameter<br/>
and an array containing each of the speech tokens they spoke is passed as the second parameter.<br/>
This is a very experimental hook, so use at your own risk! Though I would like to know if it works,<br/>
particularly on non-english systems. For ENU players/admins, whether you have a hook or not, these<br/>
changes should make it such that you no longer &quot;lose text&quot; that has speech.mul tokens in it.<br/>
If you wish to write a syshook script for speech.mul tokens, you will need a syshook.cfg file with<br/>
the following in it. This should be in a package of some sort too of course.<br/>
SystemHookScript speechmulhook.ecl<br/>
{<br/>
SpeechMul SpeechMul<br/>
}<br/>
The following is an example of a very simple hook called speechmulhook.src. It is, of course, up to<br/>
you to make something actually useful. :<br/>
use uo;<br/>
program SpeechMulHook()<br/>
return 1; //change to 1 to enable the hook<br/>
endprogram<br/>
exported function SpeechMul(who, speechtokens) //note passed ARRAY of speech.mul tokens<br/>
Print(&quot;Tokens : &quot;);<br/>
foreach token in speechtokens<br/>
Print(CStr(token));<br/>
endforeach<br/>
endfunction</change>
</entry>
<entry>
<date>12-27</date>
<author>Racalac</author>
<change>Fixed invisible corpse clothing<br/>
Fixed boat member access<br/>
Fixed (maybe) first non-nodraw tile in multi definition flagged as static by uoconvert<br/>
Changed core visibility function - characters now can always see themselves. Fix for<br/>
equipping items while hidden not showing until unhiding.</change>
</entry>
<entry>
<date>12-06</date>
<author>Racalac</author>
<change type="Fixed">Invisible items in containers caused random items to become temporarily invisible</change>
<change type="Fixed">default doubleclick range for items without an itemdesc entry wasn't reading from servspecopt.cfg</change>
</entry>
<entry>
<date>11-16</date>
<author>Racalac</author>
<change type="Fixed">member access to account and script objects (and any dicts/structs with the same key names)<br/>
Recompile your scripts! Keep testing, find my errors! :)</change>
<change type="Changed">logged-off players are now considered not visible for any/all systems that check visibility.</change>
</entry>
<entry>
<date>11-15</date>
<author>Racalac</author>
<change type="poltool">prints flag descriptions</change>
<change type="Fixed">height 1 &quot;half-height&quot; tiles no longer considered height 0.</change>
<change type="Fixed">crash by passing 0 to SystemFindBoatBySerial</change>
<change type="Fixed">account object method fall-through. d'oh!</change>
</entry>
<entry>
<date>11-10</date>
<author>Racalac</author>
<change>Fixed member access to datastore, script, and guild objects. Keep testing!</change>
<change type="Changed">equipment.container returns an &quot;offline&quot; character reference when equipped.</change>
</entry>
<entry>
<date>11-09</date>
<author>Racalac</author>
<change type="Changed">invisible items in containers can't be seen by those without the seeinvisitems priv<br/>
Major Changes: New ecompile version! Changed the way object methods and members are set and get.<br/>
This should give a moderate to major speed enhancement to script execution. Please report<br/>
any weirdness you encounter with respect to setting and getting object (and struct/dict)<br/>
members, calling object methods, and methodscripts (that may or may not override core-defined<br/>
methods).<br/>
Temporary new ecompile/ecompile.cfg option: specifiy the -m command-line paramter to compile<br/>
using the old way, or set &quot;OptimizeObjectMembers&quot; in ecompile.cfg to 0 (1 by default).<br/>
This option will go away when I'm satisfied this new code works.</change>
</entry>
<entry>
<date>11-01</date>
<author>Racalac (not in 11-01 test core)</author>
<change type="Fixed">water statics above walkable map no longer blocks movement below</change>
<change type="Fixed">second equipped item in a layer no longer stored as &quot;gotten&quot; (fixes crash on save?)</change>
</entry>
<entry>
<date>10-31</date>
<author>Racalac</author>
<change>Items with no defined itemdesc.cfg entry (walls, floors, etc) will use the<br/>
servspecopt.cfg values for decay time and dblclickrange.<br/>
Added character.cleargottenitem(). Returns &quot;dragged&quot; item to original<br/>
location. There's an graphical glitch with the client that makes it<br/>
look like the item is duplicated. The item that appears to remain on<br/>
the cursor is not really there.</change>
<change type="uoconvert">changed map structure to allow building dynamic items and walking<br/>
around on them. RECONVERT YOUR MAP!<br/>
Allowed movement in places like T2A with dramatic Z changes in the map.</change>
<change type="Fixed">certain script parameters were being flagged wrongly as out-of-range</change>
<change type="Fixed">(maybe) If a layer is already equipped, trying to equip another item<br/>
on that layer will return the item to its original location (3D client thing).<br/>
Added Npcdesc.cfg property: AttackAnimation (default 0 (wrestling)), use this<br/>
change the template's intrinsic weapon animation (i.e. for LBR npcs)</change>
</entry>
<entry>
<date>10-25</date>
<author>Racalac</author>
<change>Added uoconvert.cfg for defining what multi IDs are what type (Boat, House, Stairs (AOS)). See included file for 'normal' values.<br/>
Added for Packet Hooks: SubCommandLength property for 'parent' packets: 1, 2, or 4 byte lengths for subcommand fields.<br/>
Example:<br/>
Packet 0x12 //Macro/Spell/Action<br/>
{<br/>
Length variable<br/>
SubCommandOffset 3<br/>
SubCommandLength 1 //unlike cmd BF, the subcommand is 1 byte, not 2<br/>
}<br/>
SubPacket 0x12<br/>
{<br/>
SubCommandID 0xC7 //bow or salute<br/>
ReceiveFunction command_12:HandleC7Action<br/>
}</change>
</entry>
<entry>
<date>09-27</date>
<author>Racalac</author>
<change>Fixed improper cleanup of accounts and player characters on exit, leftovers.txt should be reduced in size now.<br/>
Maybe fixed a memory leak in the packet hook system.</change>
</entry>
<entry>
<date>09-08</date>
<author>Racalac</author>
<change>Fixed a crash condition concerning multis and movement.<br/>
Added error messages if missing realm files.</change>
<change type="uoconvert">handles a specific poorly formed staidx block</change>
</entry>
<entry>
<date>09-06</date>
<author>Racalac</author>
<change>uotool reads pol.cfg from the same dir to find the MUL files.<br/>
uotool &amp; poltool usage statements updated<br/>
Example to fix mounts, add en entry like this in tiles.cfg for each of your mount types (i.e. listed in tamed.src)<br/>
Remember running &quot;uoconvert tiles&quot; will not save your manual changes.<br/>
tile 0x3ea2<br/>
{<br/>
Desc mount<br/>
UoFlags 0x04404000<br/>
Layer 25<br/>
Height 3<br/>
Weight 0<br/>
Equippable 1<br/>
Movable 1<br/>
}<br/>
Changed UOConvert handling of blocking flags, probably fixing NPCs walking through fences, etc. Please re-run UOconvert.<br/>
Syz changed uoconvert to be more friendly to tool-created map and statics MULs.</change>
</entry>
<entry>
<date>08-21</date>
<author>Racalac</author>
<change>Turned off core sends of Packet oxB9 (UO expansion enable) for now, it will return!<br/>
Fixed bug with CreatePacket with specified cmdtype with fixed-length.</change>
</entry>
<entry>
<date>08-20</date>
<author>Racalac</author>
<change>Fixed a bug in multis walking code introduced in the 08-19 testcore.</change>
</entry>
<entry>
<date>08-16</date>
<author>Syzygy</author>
<change>The 'Summon Water Elemental' spell must now be in the spellbook to be cast.</change>
</entry>
<entry>
<date>08-14</date>
<author>Syzygy</author>
<change>Fixed a LOS issue when doubleclicking an item stored in an NPC's backpack</change>
</entry>
<entry>
<date>08-13</date>
<author>Syzygy</author>
<change>corrected an error where a client could be redirected to the wrong server if servers.cfg specified 'IPMatch' directives.<br/>
corrected an error which would not allow a mob to drop an item to a lower Z.<br/>
at death, those added to your &quot;reportable&quot; list will no longer be marked aggressor to you.<br/>
at death, those added to your &quot;reportable&quot; list will no longer be marked as having lawfully damaged you.<br/>
(this is imperfect - all your aggressors, and lawful damagers, should be cleared at your death)</change>
</entry>
<entry>
<date>08-09</date>
<author>Syzygy</author>
<change>pol.exe no longer uses .mul files. See uoconvert.txt for notes (you will use uoconvert to generate pol data files)<br/>
notable changes:<br/>
a door will only be ignored if its itemdesc entry says it's a door<br/>
(previously, used the tiledata.mul &quot;door&quot; flag to tell)<br/>
I do not recommend editing multis.cfg, tiles.cfg, or landtiles.cfg by hand - as uoconvert is young, it's likely<br/>
that you'll have to regenerate these files from the .mul files soon.</change>
</entry>
<entry>
<date>08-05</date>
<author>Syzygy</author>
<change>Removed 'UseDynamicMapCache' pol.cfg option and related code</change>
</entry>
<entry>
<date>07-27</date>
<author>Syzygy</author>
<change>CreateNpcFromTemplate will now accept a struct, or an array (with element names), specifying custom properties</change>
</entry>
<entry>
<date>07-26</date>
<author>Racalac</author>
<change>Fixed creating armor items with GetItemDescriptor</change>
<change type="Added">Packet Hook Scripts. See packethooks.txt. Don't try to hook AOS packets or I'll cry.</change>
</entry>
<entry>
<date>06-20</date>
<author>Syzygy</author>
<change>account.GetCharacter(index) will notice if you pass 0, which is bad.<br/>
account.DeleteCharacter(index) - same</change>
</entry>
</version>
<version name="POL095">
<entry>
<date>07-03</date>
<author>Syzygy</author>
<change>Added length validation for the 0xBD (client version) packet.</change>
</entry>
<entry>
<date>07-01</date>
<author>Syzygy</author>
<change>ecompile looks for ecompile.cfg in the current directory before looking where the binary is.<br/>
ecompile now flags the following as errors:<br/>
var s := &quot;1234&quot; + ;<br/>
var a := +;<br/>
var a := { 4, +, 6 };</change>
</entry>
<entry>
<date>06-30</date>
<author>Racalac</author>
<change>account.SetName() takes an optional second parameter for new account password. If you have RetainCleartextPasswords=0,<br/>
then you must pass a new account password, or you will get an error.<br/>
default WeatherType for a region is now 255 (no weather), not 0 (rain).</change>
</entry>
<entry>
<date>06-30</date>
<author>Syzygy</author>
<change>Corrected a crash exception on character creation if a control character was included in the name.<br/>
Fixed a crash bug when displaying corpses in some circumstances.</change>
</entry>
<entry>
<date>06-25</date>
<author>Syzygy</author>
<change>Items which specify &quot;SaveOnExit 0&quot; will have serials allocated from the same range as normal items.<br/>
This also fixes a bug where duplicate serials could be allocated for nonsaved items.</change>
</entry>
<entry>
<date>06-24</date>
<author>Racalac</author>
<change>Changed MD5 hashing flags to work on a broader range of windows installations.<br/>
Instrinsic NPC weapons now are read-only for: hp, maxhp_mod, quality, dmg_mod.</change>
</entry>
<entry>
<date>06-20</date>
<author>Syzygy</author>
<change>account.GetCharacter and account.DeleteCharacter will no longer accept an index of 0<br/>
Fixed a problem with character creation that could result in characters being written<br/>
with 'CharIdx -1' (these were all failed character creations)<br/>
Character creation will refuse to create a character with control characters in the name (newline, for example)</change>
</entry>
<entry>
<date>06-19</date>
<author>Racalac</author>
<change>Added a 2 minute timeout for closing sockets POL has not received any data on. The client normally sends keep-alive<br/>
messages every 60 seconds. This may fix the &quot;number of connections reported much higher than the number of clients&quot;<br/>
bug.</change>
</entry>
<entry>
<date>06-19</date>
<author>Syzygy</author>
<change>Fixed an access violation if a negative X or negative Y value was passed to various functions<br/>
canInsert / onInsert script rework, part 3: changing parameter order to make things more consistent:<br/>
adding an amount to existing stack:<br/>
canInsert( mob, container, movetype, INSERT_INCREASE_STACK, adding_item, existing_stack, amt_to_add )<br/>
onInsert( mob, container, movetype, INSERT_INCREASE_STACK, uninit, existing_stack, amt_to_add )<br/>
(NOTE: for canInsert, adding_item can be an uninit, if one of the CreateItem functions is merely adding to an existing stack.<br/>
By the time onInsert is called, adding_item is gone.)<br/>
adding new item:<br/>
canInsert( mob, container, movetype, INSERT_ADD_ITEM, adding_item )<br/>
onInsert( mob, container, movetype, INSERT_ADD_ITEM, adding_item )<br/>
Fixed a race condition which could cause socket error 10038</change>
</entry>
<entry>
<date>06-18</date>
<author>Syzygy</author>
<change type="escript">array + array will return a concatenation of the arrays:<br/>
{ 3,2,6 } + {6,4} returns {3,2,6,6,4}<br/>
AddMenuItem will once again accept 0 as a valid objtype<br/>
TargetMultiPlacement will once again accept objtype values between 0x4000 and 0x4fff<br/>
**** A VERY SPECIAL NOTE ****<br/>
It would be best if you defined all your your objtypes in the range 0x5000 to 0xEFFF.<br/>
See notes under POL092-2000-12-11 for how to specify OldObjType in itemdesc.cfg to convert objtypes at load time.<br/>
*** END VERY SPECIAL NOTE ***</change>
</entry>
<entry>
<date>06-16</date>
<author>Syzygy</author>
<change>Fixed typo in RESURRECT_FORCELOCATION flag<br/>
The main listen thread will no longer be started if ListenPort=0<br/>
All intrinsic weapons and storage area root items are now always marked inuse<br/>
- this way, DestroyItem, EquipItem, dragging etc won't work on these types of items<br/>
(this was a cause of the dreaded 'itr != wc.items.end()' assertion failures)<br/>
Fixed a memory leak in GetItemDescriptor()<br/>
Added sanity checking in GetItemDescriptor use in case you set descriptor.CProps to other than a dictionary,<br/>
or StackingIgnoresCProps to other than an array, to detect this rather than crash.<br/>
canInsert / onInsert script rework, part 2:<br/>
old:<br/>
can/onInsert( owner, container, item, movetype )<br/>
can/onInsert( owner, container, item, movetype, amtadded ) (sometimes)<br/>
new:<br/>
adding an amount to existing stack:<br/>
canInsert( mob, container, movetype, INSERT_INCREASE_STACK, existing_item, amt_to_add, adding_item )<br/>
onInsert( mob, container, movetype, INSERT_INCREASE_STACK, existing_item, amt_to_add )<br/>
(NOTE: adding_item can be an uninit, if one of the CreateItem functions is merely adding to an existing stack.<br/>
By the time onInsert is called, adding_item is gone.)<br/>
adding new item:<br/>
canInsert( mob, container, movetype, INSERT_ADD_ITEM, new_item )<br/>
onInsert( mob, container, movetype, INSERT_ADD_ITEM, new_item )<br/>
These are the times when canInsert / onInsert scripts are called:<br/>
Client drag/drop<br/>
vendor buy: when moving items to the player's backpack<br/>
vendor sell: when putting gold in the player's backpack<br/>
secure trade, when cancelling or confirming a trade<br/>
MoveItemToContainer<br/>
CreateItemInContainer<br/>
CreateItemInInventory<br/>
CreateItemInBackpack<br/>
Since I didn't actually test the backtrace-on-assertion functionality under Linux, it didn't work.<br/>
Now it does.<br/>
console.cfg is now reloadable (ReloadConfiguration, or SIGHUP)<br/>
Added file.em module:<br/>
ReadFile( filename ): read a text file<br/>
reads a text file<br/>
returns contents as an array of strings<br/>
removing newlines<br/>
WriteFile( filename, contents ): write a text file<br/>
contents is an array of strings.<br/>
appends newlines.<br/>
creates file if it does not exist.<br/>
renames existing file to filename.bak<br/>
AppendToFile( filename, morelines ): append to a text file</change>
<change type="morelines">an array of strings<br/>
appends newlines.<br/>
creates file if it does not exist.<br/>
LogToFile( filename, textline ): append a single line to a text file<br/>
appends newlines.<br/>
creates file if it does not exist.<br/>
By default, no package has any file access rights.<br/>
config/fileaccess.cfg: reloadable config file, grants access. Example:<br/>
FileAccess<br/>
{<br/>
AllowRead 1<br/>
AllowRemote 1<br/>
Package testfileaccess<br/>
Extension .cfg<br/>
Extension .src<br/>
}<br/>
FileAccess<br/>
{<br/>
AllowWrite 1<br/>
AllowRemote 0<br/>
Package testfileaccess<br/>
Extension .txt<br/>
}<br/>
FileAccess<br/>
{<br/>
AllowAppend 1<br/>
Package *<br/>
Extension .log<br/>
}</change>
</entry>
<entry>
<date>06-15</date>
<author>Syzygy</author>
<change>new pol.cfg option: AssertionFailureAction = abort/continue/shutdown/shutdown-nosave</change>
<change type="abort">(like old behavior) aborts immediately, without saving data.</change>
<change type="continue">allows execution to continue.</change>
<change type="shutdown">attempts graceful shutdown<br/>
shutdown-nosave: attempts graceful shutdown, without saving data.<br/>
If the assertion occurred during execution of a script, either 'shutdown', 'shutdown-nosave', or 'continue'<br/>
will abort that script, displaying the script name and PC.<br/>
Added uo.em function: ListMultisInBox(x1,y1,z1, x2,y2,z2) lists multis that have at least one static within the volume specified.<br/>
Resurrect takes an optional parameter. If you pass RESURRECT_FORCELOCATION, will not check for blocking objects.<br/>
Be sure you know what you're doing if you pass this flag.<br/>
Just a note: if you're using Listener entries in uoclient.cfg, you should set ListenPort=0 in pol.cfg</change>
<change type="ecompile">uses ECOMPILE_CFG_PATH environment variable to find ecompile.cfg, if present.<br/>
(note that normally it tries to look where the executable is. Some shells don't always pass this,<br/>
particularly if you're using batch files or shell scripts - try putting the full path to ecompile in your batch file)<br/>
Added a bewildering number of options to ecompile.cfg:<br/>
DisplayWarnings = 0/1 (same as -w flag)<br/>
CompileAspPages = 0/1 (same as -a flag)<br/>
OnlyCompileUpdatedScripts = 0/1 (same as -u flag)<br/>
GenerateDependencyInfo = 0/1 Generate .dep files whether or not updating<br/>
DisplayUpToDateScripts = 0/1 Display the &quot;xxx/script.ecl is up-to-date&quot; message, or not.<br/>
AutoCompileByDefault = 0/1 If set, and you don't pass any script names or -r or -A, will perform an auto compile.<br/>
UpdateOnlyOnAutoCompile = 0/1 If set, autocompile will only update modified scripts.<br/>
DisplaySummary = 0/1 Displays overall totals after compilation, unless compilation aborted due to a compile error.<br/>
These are the settings I like:<br/>
GenerateListing 1<br/>
GenerateDebugInfo 1<br/>
GenerateDebugTextInfo 1<br/>
DisplayWarnings 1<br/>
CompileAspPages 1<br/>
AutoCompileByDefault 1<br/>
UpdateOnlyOnAutoCompile 1<br/>
OnlyCompileUpdatedScripts 1<br/>
DisplaySummary 1<br/>
GenerateDependencyInfo 1<br/>
DisplayUpToDateScripts 0<br/>
This way, if I'm editing scripts, I just type 'ecompile' and it compiles everything that's<br/>
changed. If I want to compile a particular file, I pass its .src name on the command line.</change>
</entry>
<entry>
<date>06-13</date>
<author>Syzygy</author>
<change>mob.backpack.container now returns a mobileref to the owner.</change>
<change type="bugfix">buyprice was sometimes being incorrectly read as 2147483647, after being<br/>
gratuitously written as 4294967295. This value is now detected and ignored.<br/>
Resurrect() will return an error if the mobile's location would be blocked if the mob were alive (ie by a door)<br/>
LOS to an object is no longer blocked by the parts of other objects that share the same space with it.<br/>
For example, this means:<br/>
If two chests sit at the same place, neither blocks LOS to the other.<br/>
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.<br/>
If a ghost is standing in a closed doorway, you can still have LOS to it. (but note the change to Resurrect above)</change>
<change type="Fixed">When sending mana level, sometimes the &quot;current value&quot; would be sent in place of the &quot;maximum value&quot;, making it look like the mob had 100% mana.<br/>
ondelete scripts are now passed an offline mobileref.<br/>
Minor overhaul for onInsert scripts:<br/>
MoveItemToContainer:<br/>
now calls onInsert script _after_ putting the item in the container.<br/>
CreateItemInContainer, CreateItemInInventory, CreateItemInBackpack:<br/>
now call the onInsert script _after_ putting the item in the container.<br/>
when adding to an existing stack, passes the &quot;amount added&quot; as noted in the POL092 changelog.<br/>
(it was passing the size of the existing stack)<br/>
!!<br/>
I have just noticed that when any of these adds to an existing stack, the canInsert<br/>
script is called with these parameters: canInsert( mobile, container, existing_stack_already_within_container, MOVETYPE_PLAYER )<br/>
This is no good. More thought required.<br/>
When purchasing from a vendor:<br/>
onInsert called _after_ putting the item in the PC's backpack.</change>
</entry>
<entry>
<date>06-12</date>
<author>Syzygy</author>
<change>escript changes:<br/>
Added (yet another) syntax for declaring initialized arrays:<br/>
var x := array { 4, 3, 2 };<br/>
this is more consistent with struct { x, y, z } initializer syntax.<br/>
array(8,3,2) looks too much like it's creating a multi-dimensional array, so I don't like it anymore.<br/>
Added syntax for declaring initialized dictionaries:<br/>
var x := dictionary { &quot;abx&quot; -&gt; 72, &quot;xyz&quot; -&gt; 32 }; // direct<br/>
var key := 5, value := &quot;x&quot;;<br/>
var x := dictionary { key -&gt; value }; // indirect<br/>
var x := dictionary { &quot;abc&quot;, &quot;cyz&quot; }; // values start as uninit<br/>
var pfx := &quot;X&quot;;<br/>
var v := 7;<br/>
var x := dictionary { pfx+&quot;abx&quot; -&gt; 72, pfx+&quot;xyz&quot; -&gt; 32+v }; // with expressions<br/>
These are the preferred forms for declarations (see how they match?)<br/>
var x := array;<br/>
var x := dictionary;<br/>
var x := array { 53, 76, 32 };<br/>
var x := struct { x, y, z };<br/>
var x := dictionary { &quot;ABC&quot; -&gt; 62 };<br/>
Expressions like these will now be flagged as errors by the compiler:<br/>
var x := { 2, 6, };<br/>
var x := array { 2, 6, };<br/>
var x := array( 2, 4, };<br/>
var x := struct { a, y, };<br/>
var x := 4 array;<br/>
bitwise operations are now optimizable:<br/>
int &amp; int<br/>
int | int<br/>
int ^ int<br/>
~ int<br/>
ecompile changes:<br/>
new ecompile option: -C &lt;config file path&gt;<br/>
new ecompile option: -A<br/>
&quot;Auto compile&quot;, I guess - compiles scripts in your PolScriptRoot and all enabled packages under your PackageRoot directories.<br/>
(like -r, but knows where to go, using ecompile.cfg)<br/>
Fixed two memory leaks. ecompile is now much more svelte when it runs, especially on directory trees.</change>
</entry>
<entry>
<date>06-11</date>
<author>Syzygy</author>
<change>structs will again allow the obj[ keyname ] syntax, but only for strings.<br/>
if you pass a number, your script will abort. If you pass another kind of object,<br/>
an error will be returned. This is meant to help you quickly find cases where a script<br/>
pretends that a struct is an array, which is not the case.<br/>
fixed a compiler bug where the following would compile:<br/>
var a, b, c;<br/>
a := b { c, b };<br/>
AppendConfigElem will either accept an array of arrays, as it does now,<br/>
or an array of struct { name, value }</change>
</entry>
<entry>
<date>06-10</date>
<author>Syzygy</author>
<change type="linux">SIGUSR2 will now display a stack backtrace to console, and continue execution.</change>
<change type="linux">properly set socket nonblocking options after accept()<br/>
(learned, first from intense googling, then ironically enough from 'man accept', that<br/>
linux can't be bothered to adhere to BSD norms in the &quot;BSD sockets&quot; interface, and<br/>
instead discards socket options on accept()'ed connections)</change>
<change type="Note">there's a hole in the aux client interface obj.transmit() function, where it<br/>
can still block, but it shouldn't be a problem if you're just using it to feed<br/>
a local web server.</change>
</entry>
<entry>
<date>06-10</date>
<author>Syzygy</author>
<change>It is once again possible to use mobrefs / itemrefs etc as keys to dictionaries.<br/>
structs are now totally different objects than dictionaries. They can only contain named members,<br/>
and the [] operator no longer functions on them.<br/>
Also, struct names are now case-insensitive<br/>
For structs, you should use operations like this:<br/>
var a := struct { x, y, z };<br/>
a.x := 5;<br/>
var b := struct;<br/>
b.+g := 6;<br/>
For dictionaries, you should use operations like this:<br/>
var a := dictionary;<br/>
a[57] := 4;<br/>
a[&quot;XY&quot;] := &quot;Z&quot;;<br/>
a.erase( &quot;XY&quot; );</change>
</entry>
<entry>
<date>06-09</date>
<author>Syzygy</author>
<change>removed 'SellPrice 4294967295' and 'BuyPrice 4294967295' spam from items.txt etc.<br/>
revised signal handling for linux.</change>
</entry>
<entry>
<date>06-08</date>
<author>Syzygy</author>
<change>Added dirty flag to all mobiles/items. This should be set when anything on the object changes, and cleared on world save.<br/>
Fixed a crash bug when a container previously send with SendOpenSpecialContainer was deleted.<br/>
Fixed a crash bug on shutdown having to do with the thread registry.<br/>
SaveWorldState() now returns a structure on success:<br/>
struct { CleanObjects, DirtyObjects, ElapsedMilliseconds };<br/>
internal change: The following will now return a true 'struct', rather than an array bastardized with element names:<br/>
(If you access these with obj.elemname you will have no trouble; if you use obj[1] etc you will have to make changes)<br/>
object methods/properties:<br/>
mobile.reportables<br/>
polcore().script_profiles<br/>
polcore().iostats<br/>
polcore().queued_iostats<br/>
uo.em:<br/>
TargetCoordinates<br/>
SelectMenuItem<br/>
GetPosition<br/>
GetMapInfo<br/>
GetStandingHeight<br/>
npc.em:<br/>
Position()<br/>
events (all):<br/>
speech events<br/>
unicode speech events<br/>
damaged events<br/>
engage events<br/>
disengage events<br/>
item-given events<br/>
dictionary object methods now explictly check that key objects are either an integer, a real, or a string.</change>
</entry>
<entry>
<date>06-07</date>
<author>Racalac</author>
<change>Major Addition: You may now specify properties for an item during creation. Here are the mechanics:<br/>
polsys.em: GetItemDescriptor(objtype or name) returns a struct of all the itemdesc.cfg properties<br/>
for the specified objtype. You can use this to print the contents:<br/>
var ret := GetItemDescriptor(objtype);<br/>
foreach thing in ret<br/>
print(_thing_iter + &quot;: &quot; + thing);<br/>
endforeach<br/>
There are a couple special members. &quot;CProps&quot; is a dictionary of string-&gt;object pairs (object could be any<br/>
packable type). &quot;StackingIgnoresCProps&quot; is an array of strings. You may edit the values in this dict<br/>
but not all are assigned per-item (meaning it will do nothing). The item create functions accept this<br/>
dictionary in place of the objtype / objtypename parameter.<br/>
For example, to create a new item that will automatically stack with an existing stack with non-standard<br/>
color and cprops, it would look like:<br/>
var ret := GetItemDescriptor(objtype);<br/>
ret.Color := 0x10;<br/>
ret.CProps.insert(&quot;blah&quot;,&quot;1&quot;); //assuming the existing stack have this color and cprop<br/>
ret.StackingIgnoresCProps.append(&quot;blingbling&quot;);<br/>
var item := CreateItemInBackpack(who,ret,10);</change>
</entry>
<entry>
<date>06-07</date>
<author>Syzygy</author>
<change>SystemFindObjectBySerial now returns proper multirefs for multis<br/>
fixed a place that switched cout to hex formatting without switching it back</change>
</entry>
<entry>
<date>06-06</date>
<author>Syzygy</author>
<change>Added automatic lockup detection: thread status will automatically be displayed after 30 seconds.<br/>
Fixed a potential corruption error during queued data mode.</change>
</entry>
<entry>
<date>06-05</date>
<author>Racalac</author>
<change type="Changed">pol.cfg EncryptPasswords to RetainCleartextPasswords (default 1). NOTE this is logically opposite<br/>
to the old EncryptPasswords option. We now ALWAYS MD5 hash passwords and ALWAYS store them. Make this<br/>
option 1 if you want to also retain normal passwords, 0 if you only want the hashed passwords stored.</change>
<change type="Added">PasswordOnlyHash is written to accounts.txt. If the cleartext password is missing, it will be<br/>
empty until the account successfully logs in.</change>
<change type="Added">account.PasswordHash (password only hashed), and account.UsernamePasswordHash (username + password<br/>
hashed). account here is an account script object, i.e. character.acct.</change>
<change type="Added">accounts.txt reading info, X elements in Y ms.</change>
</entry>
<entry>
<date>06-05</date>
<author>Syzygy</author>
<change>The .NET build now uses STLport 4.5.3 instead of MS's crappy implementation.<br/>
It seems to be a bit faster now.<br/>
Some comparison sysload numbers, using Xandros' huge shard data:<br/>
.NET old: 100(33018), 100(16326), 100(62705), 100(64700), 100(66679), 100(67030), 100(67030), 93(53725), 5(0), idle<br/>
VC6 05-24: 98(33533), 100(18338), 25(1519), 0(0), idle<br/>
.NET now: 35(19292), 6(1), idle<br/>
win32: we now retrieve CPU time used from the OS. This is reported as cputime, when sysload<br/>
is reported. cputime is read once a minute, and the value displayed is the number of microseconds used.<br/>
So, if cpuload is 10,000,000 then 10 seconds of CPU time were used.<br/>
It doesn't look possible to get this on linux without considerable teeth-pulling.<br/>
pol.cfg: ListenPort is now optional. If you don't set it, or set it to zero, it won't be used.<br/>
Added to polsys.em: SetSysTrayPopupText( text )</change>
</entry>
<entry>
<date>06-04</date>
<author>Syzygy</author>
<change>performance improvements:<br/>
ListMobilesNearLocation<br/>
ListMobilesNearLocationEx<br/>
ListGhostsNearLocation<br/>
Speech (sending events to NPCs)</change>
</entry>
<entry>
<date>06-03</date>
<author>Syzygy</author>
<change type="escript">fixed a bug where the compiler could emit corrupt code if an IF statement was optimized away<br/>
equipment.quality is now stored as a double-precision float, so equality comparisons should work better now.<br/>
Added itemdesc.cfg flags. These apply to everything, even your own backpack.<br/>
CanUseWhileFrozen = 0/1<br/>
CanUseWhileParalyzed = 0/1<br/>
Removed internal command: .t_setusescript<br/>
Renamed internal &quot;.props&quot; command to &quot;.t_props&quot;. This script should replace it:<br/>
use uo;<br/>
program dot_props( who )<br/>
var what := Target( who );<br/>
if (what)<br/>
var names := what.propnames();<br/>
if (names.size() != 0)<br/>
foreach propname in names<br/>
SendSysMessage( who, propname + &quot;: &quot; + what.getprop( propname ) );<br/>
endforeach<br/>
else<br/>
SendSysMessage( who, &quot;No properties.&quot; );<br/>
endif<br/>
endif<br/>
endprogram</change>
</entry>
<entry>
<date>06-02</date>
<author>Syzygy</author>
<change>Modified i/o handling to better deal with unexpected signals (EINTR - socket error 4)</change>
<change type="escript">equality comparisons for floats will allow for small differences (0.00000001)<br/>
win32 .NET build: changed some compiler settings to improve performance</change>
</entry>
<entry>
<date>05-31</date>
<author>Syzygy</author>
<change>Backed out the 05/26 SetRegionWeatherLevel change which was causing a stack overflow<br/>
(which then caused pol to exit without any message)<br/>
Corrected music, justice, and weather zone switch handling. They were broken<br/>
(would do no processing if you moved either into or out of a location entirely outside the regions)</change>
<change type="Note">set the weather type to 255 to turn weather off.</change>
</entry>
<entry>
<date>05-29</date>
<author>Syzygy</author>
<change>Target() will return a proper multiref if a multi is targetted (usable with DestroyMulti etc)<br/>
This does not apply to floors, etc - only ship masts and so forth.<br/>
Any function taking an objtype as a parameter will return an error if the objtype is not defined.<br/>
Note that all objtypes in the 0x0000-0x3fff range are implicitly defined.<br/>
(previous behavior was to throw an exception reporting that the objtype defined no graphic)</change>
</entry>
<entry>
<date>05-28</date>
<author>Syzygy</author>
<change>New console command [threadstatus] will display thread status and checkpoints<br/>
Thread status is now available on win32 as well as linux.</change>
</entry>
<entry>
<date>05-26</date>
<author>Racalac</author>
<change type="Fixed">SetRegionWeatherLevel should work now!</change>
<change type="Changed">Removed client 2.0.* weather packet disable. Let us know if there are still weather problems with<br/>
2.0.* clients.</change>
</entry>
<entry>
<date>05-24</date>
<author>Syzygy</author>
<change type="Fixed">a crash when an NPC killed itself in its script</change>
<change type="Masked">crashes at shutdown due to leftover objects. The objects will be leaked rather than attempt destruction.<br/>
(if we can find out _why_ we have leftovers, we won't get these crashes at all - this crash in particular is a symptom)</change>
</entry>
<entry>
<date>05-23</date>
<author>Syzygy</author>
<change type="Fixed">NPC weapons will use the hitscript specified, not the wrestling hitscript</change>
<change type="Fixed">Display issue (1.26.4 clients only) when dragging an item to a mob that is too far away.<br/>
Linux build: Added segfault handler - will dump a stack backtrace to stderr before aborting.<br/>
please forward these (they'll just be a set of numbers) to PCT, if you're running the latest linux build.</change>
<change type="escript">added more convenient syntax for declaring structures:<br/>
var t := struct { a, b, c }; // basic<br/>
var t := struct { a := 4, b := &quot;hey&quot;, m := foo(bar(4)) }; // initialized<br/>
var t := struct { a := 4, b := struct { g,h,i }, c }; // with nested structures</change>
</entry>
<entry>
<date>05-22</date>
<author>Syzygy</author>
<change>NPCs will be destroyed immediately when they die, rather than a little later.<br/>
It should now be impossible to &quot;kill&quot; an NPC twice, ending up with multiple corpses.<br/>
There may be cases where an NPC will be only partially killed. We don't know why yet,<br/>
but there will now be log information to help us find out why. If you find an NPC that can't be<br/>
killed, please check your logs for output containing: &quot;Abnormal end after checkpoint&quot; and post to PCT.<br/>
NPCs will use their intrinsic weapon templates again. They were using human wrestling.<br/>
Log additions: character creation, deletion</change>
</entry>
<entry>
<date>05-20</date>
<author>Racalac</author>
<change type="Fixed">boat planks were not cleaned up correctly<br/>
For debugging: leftovers.txt is written to the pol directory on shutdown, contains serial and name for<br/>
objects that survived cleanup somehow.</change>
</entry>
<entry>
<date>05-17</date>
<author>Syzygy</author>
<change>pol.log will now roll over every day. Old logfiles will have names of the form: pol-YYYY-MM-DD.log</change>
</entry>
<entry>
<date>05-17</date>
<author>Racalac</author>
<change>Added new pol.cfg option: EncryptPasswords=0/1 (default 0), if =1, the server will encrypt all passwords<br/>
and all plaintext passwords will be lost! YOU CANNOT GO BACK AT THIS POINT WITHOUT RESETTING ALL THE<br/>
PASSWORDS ON THE SERVER. So be careful about setting this option to 1! Don't make me have to repeat<br/>
myself! I mean it!</change>
</entry>
<entry>
<date>05-17</date>
<author>Syzygy</author>
<change>Fixed a crash caused when a script accessed container.container on something in a mob's backpack.</change>
</entry>
<entry>
<date>05-16</date>
<author>Syzygy</author>
<change>item.setcolor( color ) will return an error if the specified color is &gt; 0xFFF<br/>
(it will still mask off the high bits and use what's left, though)<br/>
Alt-Tab should no longer show a window called &quot;Dialog&quot; while POL is running.<br/>
Fixed an assertion failure on load if a mobile or container failed to create completely.</change>
</entry>
<entry>
<date>05-15</date>
<author>Racalac</author>
<change type="Added">MD5 hashing of passwords. accounts.txt &quot;Password&quot; property is automatically converted, and saved<br/>
back to &quot;PasswordHash&quot;. No passwords are stored in plaintext on disk or in memory anymore, so full<br/>
memory dumps should be safe from nosy people. MD5 strings cannot be reversed back to the original<br/>
plaintext password.</change>
</entry>
<entry>
<date>05-15</date>
<author>Syzygy</author>
<change>HitScript will be read from itemdesc.cfg entries for weapons, and used.<br/>
OnHitScript will be read from itemdesc.cfg entries for armor, and used.<br/>
AttackMinRange and AttackMaxRange will be read from npcdesc.cfg<br/>
uoclient.cfg can now specify multiple ports to listen for clients on, and the encryption to use with each.<br/>
Here is an example:<br/>
Listener<br/>
{<br/>
Port 7011<br/>
Encryption ignition<br/>
}<br/>
Listener<br/>
{<br/>
Port 7012<br/>
Encryption 1.26.4<br/>
}<br/>
Note that the Port specified overrides the value from servers.cfg.</change>
</entry>
<entry>
<date>05-13</date>
<author>Syzygy</author>
<change>Changing an item's graphic will also set its height accordingly.<br/>
There's now a little system tray icon that will let you stop POL. Maybe later it'll let<br/>
you look at the console output or logs. We're accepting fan art for the icon :-)<br/>
You'll need to uninstall and reinstall the service (pol -u, then pol -i) for the tray icon<br/>
to be able to appear.<br/>
start.log will now be written properly when POL is run as a service.</change>
</entry>
<entry>
<date>05-11</date>
<author>Racalac</author>
<change type="Changed">With the CreateItemInContainer/Backpack functions, a new stackable item will not be added to<br/>
an existing stack unless the existing item stack has color equal to its itemdesc.cfg color property<br/>
AND has equal CProps as its itemdesc.cfg entry (not counting locally and globally ignored cprops)</change>
</entry>
<entry>
<date>05-11</date>
<author>Syzygy</author>
<change>process.kill() will immediately kill sleeping scripts, as well as scripts being debugged.<br/>
(previously, script process would not die until the script woke up, if it was sleeping.)<br/>
Mobiles will now break off an attack when an opponent changes from non-Innocent to Innocent.<br/>
(previously, this happened for PCs, but not for NPCs, particularly pets)</change>
</entry>
<entry>
<date>05-10</date>
<author>Racalac</author>
<change>Fixed another 4.0.0e client hang issue.</change>
</entry>
<entry>
<date>05-09</date>
<author>Syzygy</author>
<change>Undid my brain-dead repsys timer change which was causing lockups.</change>
</entry>
<entry>
<date>05-08</date>
<author>Syzygy</author>
<change>POL can now run as a service:<br/>
1. Put the executable in your POL directory (as always...)<br/>
2. Run 'pol -i' to install. 'pol -u' will uninstall if needed.<br/>
3. Recommended: Use the service manager to change the login from 'LocalSystem' to some account.<br/>
4. Start the service</change>
</entry>
<entry>
<date>05-07</date>
<author>Racalac</author>
<change>Added new pol.cfg option: &quot;MiniDumpType&quot;, determines the type of crash dump created. &quot;small&quot; is the<br/>
normal minidump (default), &quot;large&quot; is the full memory space for POL (creates large files, but much<br/>
more useful to the developers). Case-sensative.</change>
</entry>
<entry>
<date>05-07</date>
<author>Syzygy</author>
<change>Corrected possible crash bug in repsys handling<br/>
Corrected repsys timeout logic (would sometimes timeout early, would sometimes never time out)<br/>
Corrected possible crash bug related to client reconnections and interactive scripts</change>
</entry>
<entry>
<date>04-25</date>
<author>Racalac</author>
<change type="Fixed">CreateItemCopyAtLocation now copies cprops correctly.</change>
<change type="Fixed">Dead NPC taking damage somehow is now killed.</change>
<change type="Added">servspecopt.cfg property: UOFeatureEnable, used in the last dword of the 0xA9 login packet.<br/>
Probably has no effect (and possibly ill effects) until client messages like 0xBF 0x13 are<br/>
handled.</change>
</entry>
<entry>
<date>04-18</date>
<author>Racalac</author>
<change type="Fixed">Generic Gump textentry should work again for ANSI characters.</change>
<change type="Added">Linux console command support</change>
</entry>
<entry>
<date>04-13</date>
<author>Racalac</author>
<change type="Fixed">Input is rejected for SendTextEntryGump if the string contains a control character (newline, etc)</change>
<change type="Fixed">Generic Gump 'textentry' will strip out any control characters from user input.</change>
</entry>
<entry>
<date>04-10</date>
<author>Racalac</author>
<change type="Fixed">Moving a character during logout no longer throws an exception (introduced 3/27)</change>
</entry>
<entry>
<date>04-09</date>
<author>Racalac</author>
<change type="Fixed">MoveBoatXY did mot move items on deck properly.</change>
</entry>
<entry>
<date>04-06</date>
<author>Racalac</author>
<change type="Change">Call Attribute Intrinsic Modification exported functions before Vital Maximum and Regen.</change>
<change type="Note">clients 4.0.0e and newer do not like the uoclient.cfg setting EnableControlFlowPackets enabled,<br/>
and causes login to fail. No way around this it seems.</change>
</entry>
<entry>
<date>03-27</date>
<author>Racalac</author>
<change type="Added">boat.em: MoveBoatXY(boatref,x,y)</change>
<change type="Fixed">MoveCharacterToLocation with an offline character could cause an exception.</change>
<change type="Fixed">who.multi was not returning a boat ref, when appropriate.</change>
</entry>
<entry>
<date>03-25</date>
<author>Racalac</author>
<change type="Fixed">4.0.0e login issue (login tested with 4.0.0e (uorice), 4.0.0c (uorice), 3.0.8q (uorice),<br/>
2.0.0b, and 1.26.4b. (2.0.0g still doesn't work, oh well..)</change>
</entry>
<entry>
<date>03-24</date>
<author>Racalac</author>
<change type="Fixed">Login (A9) packet was the wrong length (might fix 4.0.0e login issue)</change>
<change type="Fixed">Maps didn't work with set/get_member()</change>
<change type="Fixed">Multi.isa wasn't working</change>
</entry>
<entry>
<date>03-20</date>
<author>Myrathi</author>
<change type="Fixed">ECOMPILE will no longer compile files with .src/.hsr/.asp/.inc<br/>
*anywhere* in the filename. These extensions must now be at the *end*<br/>
of the filenames for them to be compiled! (fixes 'file.src.bak' bug)</change>
<change type="Found">Undocumented ECOMPILE option: -ri [dir]<br/>
Same as '-r' except it recursively compiles .INC files! Useful for<br/>
testing that your include files compile!</change>
<change type="Fixed">ECOMPILE options bug: -r [dir] / -ri [dir]<br/>
These options will no longer 'eat up' options that follow them on the<br/>
command line (&quot;-r -u&quot; would incorrectly 'eat' the &quot;-u&quot; option!). Such<br/>
an option would be equivalent to &quot;-r . -u&quot; (recurse current folder).</change>
<change type="NOTE">If you need to compile files AS WELL AS recursing the current folder<br/>
you MUST add the '.' (no quotes) so it doesn't treat the files as a<br/>
folder (WRONG one would try to recurse the FOLDER 'myscript.src'!)<br/>
This is WRONG: ECOMPILE.EXE -u -r myscript.src<br/>
This is RIGHT: ECOMPILE.EXE -u -r . myscript.src &lt;-- note the '.'</change>
</entry>
<entry>
<date>03-19</date>
<author>Racalac</author>
<change>Changed the order of calling the Vital Maximum and Regenerate functions via RecalcVitals().<br/>
Order is: Maximum function, Regenerate function.<br/>
Important CFG change: Set Weapon 0xF020 to SaveOnExit 0. This will force the intrinsic NPC<br/>
wrestling weapon to a non-saved serial number.<br/>
Fixed 03-18 npctemplate oversight.</change>
</entry>
<entry>
<date>03-19</date>
<author>Myrathi</author>
<change type="Added">extra 'movetype' parameter to Can/OnInsert and Can/OnRemove scripts.<br/>
The values returned in this parameter are as follows (new constants in UO.EM)<br/>
- MOVETYPE_PLAYER : physically moved (dragged) by a player<br/>
- MOVETYPE_COREMOVE : moved by the core (eg, MoveItemToContainer().)<br/>
And in the *Insert scripts only...<br/>
- MOVETYPE_CORECREATE : created by core (eg, CreateItemInBackpack().)<br/>
Example:<br/>
use uo;<br/>
program caninsertscript(character, container, item, movetype)<br/>
if ( movetype != MOVETYPE_PLAYER )<br/>
// allow any movement/creation by core functions<br/>
return 1;<br/>
endif<br/>
// insertion by a player must be validated<br/>
// ...extra code here...<br/>
endprogram</change>
</entry>
<entry>
<date>03-18</date>
<author>Racalac</author>
<change type="Fixed">&quot;npctemplate&quot; was not initialized on start-up when the exported<br/>
vital functions were called.</change>
<change type="Added">pol.cfg options:<br/>
ReportRunToCompletionScripts=0/1 (default=1)<br/>
ReportCriticalScripts=0/1 (default=1)<br/>
- Set to 0 to remove the &quot;Script X running...&quot; (RTC) and<br/>
&quot;Critical Script X has run for X instructions...&quot; console messages.</change>
</entry>
<entry>
<date>03-16</date>
<author>Myrathi</author>
<change>Fixed RequestInputUC() input-validation issue (control-characters are now<br/>
correctly identified).<br/>
Returns:<br/>
- 0 (zero) if input is cancelled.<br/>
- a struct: 'uc_text' =&gt; Unicode Array, 'lang' =&gt; 3-char language code<br/>
- an error, when appropriate (see .errortext)</change>
</entry>
<entry>
<date>03-16</date>
<author>Racalac</author>
<change>Added error message for thread exceptions, AUX service.<br/>
Fixed annoying garbled &quot;Listening for HTTP requests on port&quot; message.<br/>
Fixed up RequestInputUC().</change>
</entry>
<entry>
<date>03-16</date>
<author>Myrathi</author>
<change type="Added">UNICODE.EM function RequestInputUC(): works the same as UO.EM's<br/>
RequestInput() function except it takes 'unicode array' and 'language<br/>
code' parameters in place of the 'prompt' parameter. The 'item'<br/>
parameter is still simply a placeholder and a client cannot act upon<br/>
one of these functions if the other has already been called (you'll<br/>
get the &quot;Another script has an active prompt&quot; error).</change>
</entry>
<entry>
<date>03-15</date>
<author>Racalac</author>
<change>Added uoclient.cfg property: MaxSkillID (&quot;General&quot; section,default 51 if not found). Use this depending on<br/>
what client versions connect to your server. Newer clients can handle more skill IDs and older clients<br/>
(which often crash being sent skillids above 48). You must have skills.cfg entires for each skillid up<br/>
to MaxSkillID.</change>
</entry>
<entry>
<date>03-14</date>
<author>Racalac</author>
<change>Added ClientEncryptionVersion &quot;none&quot; and &quot;uorice&quot; to help newbies. These are identical to &quot;ignition&quot;.<br/>
Linux Build:<br/>
This is Rac's first linux build, and hopefully it's improved. Previously, linux builds were made<br/>
using STLport and NO compiler optimizations. This build was made with libstdc++ 5.0.2, glibc 2.3.2<br/>
(with linuxthreads 2.3.2), gcc 3.2.2, and kernel 2.4.20. Consider using the same version libs as these.<br/>
Also, optimizations are turned on in this build (they were turned off because of inexplicable segfaults.<br/>
Hopefully, new build lib versions help this).</change>
</entry>
<entry>
<date>03-13</date>
<author>Racalac</author>
<change>Fixed linux &quot;.unload&quot; crash.<br/>
Fixed exception with Character serial 0x1.</change>
</entry>
<entry>
<date>03-12</date>
<author>Myrathi</author>
<change type="Fixed">RadToDeg() and DegToRad() in MATH.EM. They now work the right way around. :)</change>
</entry>
<entry>
<date>03-10</date>
<author>Racalac</author>
<change>Save character and item serial counter to pol.txt.<br/>
Increased Maximum UO SkillID to 51 (skills.cfg requires an update).<br/>
Fixed 03-08 bug: new multis not found with SFOBS.</change>
</entry>
<entry>
<date>03-08</date>
<author>Racalac</author>
<change>Implimented Serial Recycling:<br/>
When POL reaches the maximum serial for characters (0x3FFFFFFF) and items (0x7FFFFFFF), it will then<br/>
search from the minimum serial (1 for characters, 0x40000000 for items) for an unused serial to give.<br/>
Note, nothing is done about CProps which store serials referring to destroyed objects. Hopefully with<br/>
this system of reusing the &quot;oldest&quot; unused serial will avoid most of these problems.<br/>
Very Significant speed improvement for all SystemFindObjectBySerial calls (including internal ones)! Your<br/>
start-up times (with CheckIntegrity enabled) should be vasty improved.<br/>
Fixed build so minidumps should give more information.</change>
</entry>
<entry>
<date>02-18</date>
<author>Racalac</author>
<change>Removed unecessary equip layer check (some items in client 4.0.0 were prevented from being equipped due to<br/>
a client bug).</change>
</entry>
<entry>
<date>02-09</date>
<author>Racalac</author>
<change type="Added">new servspecopt.cfg options: DefaultContainerMaxItems (default 125) and DefaultContainerMaxWeight<br/>
(default 250). These values will be used for containers that do not define &quot;MaxItems&quot; and &quot;MaxWeight&quot;<br/>
in their itemdesc.cfg entries.</change>
<change type="Added">OS.EM function: is_critical(). Returns 1 if the calling script was set critical, else 0.</change>
<change type="Fixed">client version string was being limited to 10 characters.</change>
</entry>
<entry>
<date>02-09</date>
<author>Racalac</author>
<change type="Changed">CheckIntegrity=1 in pol.cfg now also checks storage areas and offline character for duplicate serial<br/>
items (This extends start up times).</change>
</entry>
<entry>
<date>02-08</date>
<author>Syzygy</author>
<change>Sort-of fix for shards with data files with very high serial numbers:<br/>
if 0x4effffff &lt;= serial &lt;= 0x40000000, serial will be allocated as a normal serial<br/>
if 0x7fffffff &lt;= serial &lt;= 0x4f000000, serial will be allocated as a &quot;nonsaved&quot; serial.<br/>
The upper range for &quot;saved&quot; serials will not be raised at this time.</change>
</entry>
<entry>
<date>02-04</date>
<author>Racalac</author>
<change type="Changed">PushthroughHook array of obstructors now includes hidden mobiles.</change>
<change type="Changed">renaming a stackable item a specific name will now prepend the amount to the single-click description.<br/>
i.e. rename 2 items 'sucky item', then stack will produce a desc of '2 sucky items'.</change>
<change type="Fixed">character.height was being assigned an incorrect value on start, causing LOS problems.</change>
</entry>
<entry>
<date>02-03</date>
<author>Racalac</author>
<change type="Fixed">offline boat travelers were not being processed correctly on startup, leaving them behind on the water.</change>
<change type="Added">POL now supports Minidumps on Windows. If you are running POL on Windows XP, you do not need to do<br/>
anything to enable this. Before Windows XP, you need a new &quot;dbghelp.dll&quot; with version 5.1 or greater in your<br/>
POL directory. I've uploaded a redistributable version on core-test, this will be available and/or included<br/>
in the final 095 core package.<br/>
What Minidumps do: When(/if!) POL crashes, you will no longer see the cryptic dump of registers and call<br/>
stack. Instead, POL will log and print on console that it has created a &quot;.dmp&quot; file in your POL directory.<br/>
This file is much much more useful to us for debugging a crash than the simple text dump as before. This<br/>
File should be sent to the developers along with the usual &quot;what I did to cause this crash&quot; information.<br/>
If you run Linux, everything should work as before.</change>
<change type="Added">Newly created NPCs send and receive SYSEVENT_ENTERED_AREA events with the NPCs around them.<br/>
Fixed by Syz: While on a moving boat, mobile's names no longer flash, and it's much easier to talk on a moving<br/>
boat. Only annoyance is now mobiles show the walk animation while the boat moves (but don't move anywhere)</change>
</entry>
<entry>
<date>02-02</date>
<author>Syzygy</author>
<change>Added minidump support</change>
</entry>
<entry>
<date>02-01</date>
<author>Syzygy</author>
<change>CoreRequired in pkg.cfg can now be a full version string (ie &quot;POL095-2003-02-01&quot; )<br/>
(pkg)/uoclient.cfg can now contain a 'Protocol' element:<br/>
Protocol<br/>
{<br/>
#<br/>
# EnableFlowControlPackets: use the 0x33 (0x00 / 0x01) pause/restart packets.<br/>
# Though OSI seems to no longer send these packets, they seem to help with smoothness,<br/>
# particularly with boat movement.<br/>
EnableFlowControlPackets 1<br/>
}</change>
</entry>
<entry>
<date>01-30</date>
<author>Racalac</author>
<change type="Fixed">&quot;TrueObjtype&quot; was not read correctly on startup.</change>
<change type="Fixed">coordinate bounds checking for CreateNPCFromTemplate and CreateMultiAtLocation (still be careful with<br/>
this latter one, if some part of the multi overlaps beyond the map edge, it will cause problems)</change>
<change type="Fixed">unequiptest and equiptest are now automatically reloaded after an .unload or .unloadall</change>
</entry>
<entry>
<date>01-28</date>
<author>Racalac</author>
<change>Fixed a crash with destroying items in core-called run-to-completion scripts (like OnInsert) introduced 01-26</change>
</entry>
<entry>
<date>01-26</date>
<author>Syzygy</author>
<change>foreach will no longer iterate over error objects</change>
</entry>
<entry>
<date>01-26</date>
<author>Racalac</author>
<change>Added better stacking control over CProps: You can now specify specific CProp names that will be ignored when<br/>
items are being stacked. There are two ways to do this:<br/>
-Template level: new Itemdesc.cfg property: StackingIgnoresCProps, a space-delimited list of case-sensative<br/>
cprop names to ignore only for stacking items of this objtype. i.e.:<br/>
StackingIgnoresCProps propname1 propname2 etc.<br/>
-Global level: A new packagable config file stacking.cfg (can be in /config and/or any package) specifies<br/>
lists of CProp names that are ignored for all stacking items (duplicate names ignored). Structure:<br/>
Stacking<br/>
{<br/>
IgnoreCprops propname1 propname2 etc.<br/>
}</change>
<change type="Fixed">movecost.cfg entries were being interpolated in the wrong order.</change>
<change type="Changed">MoveItemToLocation now calls UnEquipTest and UnEquip Scripts if the item was equipped on a char.</change>
<change type="Changed">OnRemove and OnInsert are now Run-To-Completion (i.e. CRITICAL) scripts.</change>
</entry>
<entry>
<date>01-24</date>
<author>Syzygy</author>
<change>The compiler will now put correct function names in listfiles.</change>
</entry>
<entry>
<date>01-22</date>
<author>Syzygy</author>
<change>Added ReadMillisecondClock() to polsys.em</change>
</entry>
<entry>
<date>01-22</date>
<author>Racalac</author>
<change>Fixed moved some npc creation code around so now npc.npctemplate is initialized by the time the vital maximum<br/>
and regen rate exported functions are called. (so grabbing the HITS property from the npcdesc element is<br/>
successful)</change>
</entry>
<entry>
<date>01-20</date>
<author>Racalac</author>
<change>Fixed resetting stealthsteps (broken 01-09)<br/>
Added control character stripping from sysbook text entry.</change>
</entry>
<entry>
<date>01-18</date>
<author>Racalac</author>
<change>Removed 01-06 LOS combat initiation check.<br/>
Fixed weirdness with merchant sell window and the .buy/sellprice changes.<br/>
Removed hardcoded death sounds for human characters.</change>
</entry>
<entry>
<date>01-15</date>
<author>Racalac</author>
<change type="Fixed">Errors on startup from corrupt items shouldn't crash the server. Also, file name &amp; line numbers are<br/>
printed for ease of debugging.</change>
<change type="Fixed">Buying stackable items from NPC merchants now call canInsert and onInsert for player's backpack.</change>
<change type="Fixed">Setting .buyprice and .sellprice to 0 means the item's price is 0, not itemdesc default. (setting the<br/>
members to -1 will force them to default to itemdesc)</change>
<change type="Fixed">Entered/Left regions weren't firing since 12-23.</change>
</entry>
<entry>
<date>01-12</date>
<author>Syzygy</author>
<change>Fixed an assertion failure when assigning to a non-integer element of an array<br/>
test script: &quot;var a := {}; var b; a[b] := 3;&quot;</change>
</entry>
<entry>
<date>01-12</date>
<author>Racalac</author>
<change type="Fixed">Polsys::ReloadConfiguration() now really reloads npcdesc!</change>
<change type="Fixed">item.multi should now return the correct MultiRef (items on tables and other 'blocked' locations<br/>
were not being processed correctly)<br/>
Removed hack fix for bug noted in 01-08 changes. Caused problem with boats.</change>
</entry>
<entry>
<date>01-09</date>
<author>Racalac</author>
<change type="Fixed">polcore().clear_script_profile_counters() shouldn't complain if you pass 0 parameters (the correct amount)</change>
<change type="Fixed">PC Unhide generating ENTERED_AREA events shouldn't fire strange combat update functions anymore.</change>
</entry>
<entry>
<date>01-08</date>
<author>Racalac</author>
<change>Hack fix for gold &quot;dropping through&quot; floors of multis. This would affect ant 0 height graphic.<br/>
**Please let me know if there are any weird effects with multis, LOS around/in/through multis,<br/>
**walking on multies, dropping items on multis, and so on!</change>
</entry>
<entry>
<date>01-07</date>
<author>Syzygy</author>
<change>NPC Templates in packages will once again have &quot;:packagename:&quot; prepended to their template name<br/>
(npc.npctemplate, as well as what's written to npcs.txt)</change>
</entry>
<entry>
<date>01-06</date>
<author>Racalac</author>
<change type="Fixed">You now need line-of-sight to initiate combat.</change>
</entry>
<entry>
<date>01-05</date>
<author>Racalac</author>
<change type="Fixed">run_speed and use_adjustments weren't written to the save file.</change>
</entry>
<entry>
<date>01-04</date>
<author>Racalac</author>
<change type="Added">obj.set_member(membername, value) and obj.get_member(membername) to replace the removed &quot;.&quot; method.<br/>
This sets/gets a built-in member on the object which is named &quot;membername&quot;. Returns an error if the<br/>
member was not found on that object (i.e. &quot;dmg_mod&quot; on a backpack).</change>
</entry>
<entry>
<date>01-03</date>
<author>Myrathi</author>
<change>Implimented new encryption routines as the basis for making future encryption updates<br/>
a LOT easier (and is the start of internal support for encryptions 2.0.3 upwards!)<br/>
NO NEW ENCRYPTIONS ARE WORKING AT THIS TIME.</change>
</entry>
<entry>
<date>01-02</date>
<author>Racalac</author>
<change>Added character and account name to &quot;No handler for skill X&quot; message.</change>
</entry>
<entry>
<author>Syzygy</author>
<change>Deleting an element from the datastore will mark the associated file as dirty.</change>
</entry>
<entry>
<date>01-01</date>
<author>Syzygy</author>
<change>Windows 95 is no longer supported. Minimum (MS) OS required: Win98/NT4<br/>
Added to polsys.em: ReloadConfiguration(). Loads npcdesc.cfg and pol.cfg</change>
<change type="Linux">HUP signal will cause ReloadConfiguration to be called.</change>
</entry>
<entry>
<date>01-01</date>
<author>Racalac</author>
<change type="Fixed">for real: EnumerateItemsInContainer crash (with &quot;worn items container&quot; who.backpack.container)</change>
</entry>
<entry>
<date>03-01-2001</date>
<author>Myrathi</author>
<change type="Added">DefaultDecayTime=# in SERVSPECOPT(.LOCAL).CFG (default = 10) - unit: minutes</change>
<change type="NOTE">Only newly created or &quot;refreshed&quot; items will use any new setting! Existing<br/>
items and items which remain &quot;untouched&quot; will retain the old value.</change>
<change type="Fixed">Picking up an item, failing to place it somewhere else and having the<br/>
action &quot;undone&quot; (by the core) will no longer reset the decay timer if the<br/>
&quot;time until decay&quot; is greater than the default interval.</change>
<change type="Fixed">CreateItemCopyAtLocation() now copies itemref.graphic to cloned item.</change>
</entry>
<entry>
<date>12-29</date>
<author>Syzygy</author>
<change>accounts.txt will no longer be reloaded after a new version is written by pol itself<br/>
Failure to bind the listening socket will now cause startup to fail on windows.<br/>
New ecompile.cfg options:<br/>
GenerateListing [0,1]<br/>
GenerateDebugInfo [0,1]<br/>
GenerateDebugTextInfo [0,1]<br/>
Fix for ecompile under win32: use GetModuleFileName instead of argv[0] to determine<br/>
path to ecompile.cfg</change>
</entry>
<entry>
<date>12-29</date>
<author>Myrathi</author>
<change type="Fixed">Shutdown no longer crashes when built with .NET (bonus points go to Syz!)</change>
<change type="Fixed">Deprecation warnings now give filename of the operator/token as well as line number.</change>
</entry>
<entry>
<date>12-28</date>
<author>Racalac</author>
<change type="Added">IP &amp; Account logging information for unexpected and out-of-sequence messages.</change>
</entry>
<entry>
<date>12-28</date>
<author>Syzygy</author>
<change>Fixed a crash bug on exit in the VS.NET build (having to do with Token destruction)<br/>
(on the VS.NET build, some globals are destroyed in the opposite order. We now manually clear<br/>
one particular container)</change>
</entry>
<entry>
<date>12-27</date>
<author>Racalac</author>
<change type="ReFixed">Players cannot rename a mobile with an invalid string.</change>
<change type="MaybeFixed">Crash in EnumerateItemsInContainer. A long-shot fix, please test who ever was<br/>
experiencing this bug!</change>
</entry>
<entry>
<date>12-25</date>
<author>Myrathi</author>
<change type="Added">CFGFILE.EM function ListConfigElemProps(element): returns an array of the<br/>
element's property-names (as unique strings).</change>
</entry>
<entry>
<date>12-24</date>
<author>Racalac</author>
<change type="Fixed">Now updates the client correctly when another mobile's color changed.</change>
</entry>
<entry>
<date>12-24</date>
<author>Myrathi</author>
<change type="Fixed">unicode support problems under Linux (think I got 'em all)</change>
<change type="Fixed">various bugs in various unicode routines. :P</change>
<change type="Fixed">unicode spell invocation using: ~IN&lt;spellid&gt;</change>
<change type="Added">&quot;INVOKE: &lt;info&gt;&quot; console spam now restricted to [pol.cfg]LogLevel=6 or higher.</change>
</entry>
<entry>
<date>12-23</date>
<author>Myrathi</author>
<change type="Fixed">Stat messages should now normalize properly to 1000 max-hp (0x11 packet)</change>
</entry>
<entry>
<date>12-23</date>
<author>Racalac</author>
<change type="Fixed">Exception if no regions were defined.</change>
<change type="Fixed">CreateMultiAtLocation now returns a MultiRef, not an ItemRef ;)</change>
</entry>
<entry>
<date>12-22</date>
<author>Racalac</author>
<change type="Fixed">When combining two stacks of the same objtype (either dragging one stack onto the other, or<br/>
onto the container containing the other stack), the CProp lists of each item must match EXACTLY<br/>
in order to be stacked. So, if Stack A has cprop myprop i5 and Stack B has cprop myprop i6, they<br/>
will not be stackable by dragging. Similarly, if either of the stacks are missing a cprop the<br/>
other possesses, the items will not stack.<br/>
**Needs testing please**</change>
</entry>
<entry>
<date>12-21</date>
<author>Racalac</author>
<change type="Fixed">when a player buys an item from a merchant NPC, canInsert and OnInsert scripts are called<br/>
for his/her backpack.</change>
<change type="CRITICAL">You MUST add this to an itemdesc.cfg entry or you server will fail to start!<br/>
Container 0xFF02<br/>
{<br/>
Name WornItemsContainer<br/>
graphic 0x1E5E<br/>
Gump 0x003C<br/>
MinX 0<br/>
MaxX 66<br/>
MinY 0<br/>
MaxY 33<br/>
Weight 0<br/>
MaxItems 65535<br/>
Maxweight 65535<br/>
}<br/>
Note the objtype is in the core-reserved range of 0xF000 - 0xFFFF. I hope no one has any<br/>
items defined in that range.. :)<br/>
Note this change just fixed a bug with backpack weight limits, and won't help &quot;total&quot;<br/>
character weight (including equipped items).</change>
<change type="Fixed">using an item's x,y,z members in its own create script would throw an exception.</change>
<change type="Added">UO.EM function CreateItemCopyAtLocation(x, y, z, itemref): makes a clone of the item<br/>
referenced with &quot;itemref&quot; at location x,y,z. Copies member variables and CProps. Does<br/>
not work with Multi objects. Does not copy a container's contents.<br/>
**Needs testing please**</change>
<change type="Fixed">Items split from a stack retain the CProps from the original stack.</change>
<change type="Fixed">character.setwarmode() now works with NPC characters (no longer throws an exception)</change>
<change type="Fixed">If the items sold TO an NPC merchant cost more than 60k gold, the core now creates seperate<br/>
stacks of 60k gold instead of one greater than 60k (invalid for the client). So if you have any<br/>
script code that handles this, you should probably remove it (or face creating twice the amount<br/>
of gold you should!).</change>
<change type="Added">Unhiding AND Unconcealing generates a SYSEVENT_ENTEREDAREA event for nearby NPCs.</change>
</entry>
<entry>
<date>12-20</date>
<author>Racalac</author>
<change type="Fixed">A Mobile's lifebar will no longer disappear when you (for example), poison it.</change>
<change type="Fixed">An exploit that allowed players to drag items onto far away mobiles.</change>
</entry>
<entry>
<date>12-19</date>
<author>Racalac</author>
<change type="Fixed">a bug with system books where bad characters were written to the save files, causing errors<br/>
like &quot;Item has no SERIAL property&quot;.</change>
<change type="Fixed">If zero items were sold to an NPC, a gold coin was created in the player's pack with<br/>
amount == 0.</change>
</entry>
<entry>
<date>12-17</date>
<author>Racalac</author>
<change type="Fixed">a nasty bug where items would not decay in certain areas (specifically, in a zone with<br/>
a multi house). Also fixes the related &quot;items don't decay near multis&quot; bug.</change>
<change type="Fixed">If an item is defined as no decay on multis (the default), its destroy script was<br/>
mistakenly called when the item was not decayed. This is fixed.</change>
</entry>
<entry>
<date>12-15</date>
<author>Syzygy</author>
<change>Correct crash bug in CanRemove and OnRemove script execution when there's no owning mobile<br/>
The originally defining package will be listed when multiple packages define an objtype<br/>
&quot;attack timer&quot; spam outputs only when DebugLevel &gt;= 20<br/>
item.invisible will initialize based on itemdesc.cfg settings</change>
</entry>
<entry>
<date>12-10</date>
<author>Myrathi</author>
<change>Added array.exists( index ) - returns 1 if index &lt;= array.size(), otherwise 0.</change>
<change type="Added">sturdier parameter checking for object member-functions (no AV when too few params)</change>
<change type="Fixed">corrected the size of the 0xBB 'messenger' packet (no longer &quot;eats up&quot; extra bytes)</change>
<change type="Fixed">rename packet validation. Invalid content is truncated and a log message shown<br/>
for admin use (including an output dump of the invalid data).<br/>
Valid characters are spaces and upper- or lower-case letters (A-Z)<br/>
e.g.<br/>
Client #1 (account test) attempted an invalid rename (packet 0x75):<br/>
0000: 48 61 63 6b 54 65 73 74 0d 0a 09 43 6f 6c 6f 72 HackTest ...Color<br/>
0010: 20 30 78 34 38 30 0d 0a 0x480.. ........</change>
<change type="Fixed">core now sends correct number-of-chars to client at login (this should fix the UOTD<br/>
&quot;can't create character&quot; client issues)</change>
<change type="Fixed">array member-functions (.erase(), .size(), etc) now enforce parameter-passing:<br/>
if you pass the wrong number of parameters (too few -or- too many) they'll return an<br/>
appropriate error (until now, passing too few caused an Access Violation! Argh!!!)</change>
<change type="Fixed">arrays will no longer &quot;resize&quot; when you attempt to *retrieve* a value from an index<br/>
that doesn't exist. Setting a value in a non-existant index still resizes, as always.<br/>
Test array.size() or check array.exists(index) as appropriate.<br/>
- Example:<br/>
var arr := {1,2}; // create array with arr[1] and arr[2]<br/>
arr[4] := &quot;test&quot;; // auto-enlarges to 4 indices (arr[3] is uninitialized)<br/>
var foo := arr[23]; // arr.size() is still 4 and it returns:<br/>
// error{ errortext = &quot;Array index out of bounds&quot; }<br/>
var bar := arr.exists(15); // bar holds 0 since arr[15] doesn't exist.<br/>
var zim := arr.exists(3); // zim holds 1. arr[3] exists, even though it's uninit!</change>
<change type="Removed">account.SetAcctName() member-function (deprecated since 089!)<br/>
- use instead: account.SetName(name)</change>
</entry>
<entry>
<date>12-09</date>
<author>Myrathi</author>
<change>Added new uo.em function: SendQuestArrow(to_whom, x := -1, y := -1)<br/>
- 'to_whom' is the character the arrow shows to.<br/>
- Passing 'x' and 'y' within map bounds will set the Quest Arrow to point at that location.<br/>
- Passing -1 as 'x' and 'y' (ie. by just called SendQuestArrow(to_whom)) will remove it.</change>
</entry>
<entry>
<date>12-09</date>
<author>Myrathi</author>
<change type="Fixed">All UNICODE.EM commands now take arrays with integers the &quot;right way round&quot; (sorry!)<br/>
Integers must now be &quot;Big Endian&quot; (0x1234) and not &quot;Little Endian&quot; (0x3412).</change>
<change type="Fixed">Text-commands typed by a unicode-enabled client are now &quot;recognised&quot; properly.</change>
<change type="Added">Text-command scripts now receive 2 extra parameters when activated by<br/>
Unicode-enabled clients.<br/>
- Program blocks should now look like this, to take advantage of them:<br/>
program textcmd_mycmd( who, text, uc_text, langcode )<br/>
- 'uc_text' is a &quot;Unicode array&quot; of 2-byte &quot;Big Endian&quot; integers (see above) and<br/>
can be an empty array (uc_text.size() == 0).<br/>
- 'langcode' is a 3-character, uppercase language code.<br/>
- 'uc_text' will be an 'error' type if the Unicode input is &quot;bad&quot;.<br/>
- 'uc_text' and 'langcode' will be uninitialized if no Unicode text is available<br/>
(ie, when a non-Unicode client types the command)<br/>
-Note- Text-commands should still be in an &quot;English readable&quot; character set!!<br/>
There is no guarantee that foreign character sets in script-names will work,<br/>
never mind Unicode character-sets, as the 'filename' is still matched against<br/>
the ASCII equivalent!</change>
<change type="Added">NPCs now receive 2 *extra* event-parameters when they &quot;hear&quot; Unicode speech:<br/>
- 'uc_text' is a &quot;Unicode array&quot; of 2-byte &quot;Big Endian&quot; integers (as above)<br/>
- 'langcode' is a 3-character, uppercase language code.<br/>
- these 2 parameters do not exist when speech is received from a non-Unicode client.<br/>
- Example:<br/>
var ev := os::wait_for_event(120);<br/>
if ( ev )<br/>
case ( ev.type )<br/>
SYSEVENT_SPEECH:<br/>
PrintTextAbovePrivate(Self(), &quot;You said...&quot;, ev.source);<br/>
if ( ev.uc_text )<br/>
PrintTextAbovePrivateUC(Self(), ev.uc_text, ev.langcode, ev.source);<br/>
PrintTextAbovePrivate(Self(), &quot;...in Unicode&quot;, ev.source);<br/>
else<br/>
PrintTextAbovePrivate(Self(), ev.text, ev.source);<br/>
PrintTextAbovePrivate(Self(), &quot;...in ASCII&quot;, ev.source);<br/>
endif<br/>
endcase<br/>
endif</change>
</entry>
<entry>
<date>12-07</date>
<author>Syzygy</author>
<change type="Fixed">compiler bug w/ switch statement containing variable declarations</change>
<change type="Fixed">compiler bug allowing this to compile:<br/>
Broadcast( &quot;ff&quot;;</change>
<change type="Fixed">itemdesc.cfg setting 'Invisible' not being used on item creation</change>
</entry>
<entry>
<date>12-05</date>
<author>Racalac</author>
<change>Fixed a crash bug with cheaters sending an invalid packet.</change>
</entry>
<entry>
<date>12-04</date>
<author>Racalac</author>
<change>Added Character Method: setwarmode( 0/1 ); Sets the internal warmode flag and sends the<br/>
update to the player. Returns the new warmode value.</change>
<change type="Added">MoveItemToContainer and MoveItemToLocation both call the item's parent container's<br/>
canRemove and onRemove scripts.</change>
<change type="Fixed">Text command scripts now have their controller properly set. (character reference in<br/>
canInsert scripts where being passed as uninitialzed when the script was started via a<br/>
textcommand)</change>
</entry>
<entry>
<date>12-02</date>
<author>Racalac</author>
<change type="Fixed">Characters with the &quot;freemove&quot; privilages can now move with 0 stamina, frozen,<br/>
or paralyzed.</change>
<change type="Added">&quot;You are too fatigued to move&quot; message when trying to move with 0 stamina, or<br/>
not enough stamina as defined in movecost.cfg. (Only if MovementUsesStamina=1 is<br/>
enabled in servspecopt.cfg)</change>
<change type="Changed">MaximumClients in pol.cfg will be checked only after a character is selected to<br/>
play. Clients connected are only counted if they have attached characters (so a client<br/>
waiting to log in is not counted, and neither is a client that recently logged out).</change>
<change type="Added">MaximumClientsBypassCmdLevel (default 1). This integer value (from 0 (player<br/>
cmdlevel) to 5 (&quot;test&quot;) defines the minimum character command level to bypass the<br/>
maximum clients check. So if the option =1, counselors and above staff can log in if<br/>
the MaximumClients value is reached, but additional player cmdlevel characters cannot.</change>
</entry>
<entry>
<date>12-01</date>
<author>Racalac</author>
<change>Improvements to pol.cfg MaximumClients: cmd_level&gt;0 is checked, and clients without<br/>
characters attached are not counted against the maximum.</change>
</entry>
<entry>
<date>12-01</date>
<author>Myrathi</author>
<change type="Fixed">Unicode ghost speech (no longer shows in chinese)</change>
<change type="Fixed">Various buffer overflow exploits in various uo.em functions (eg PrintTextAbove())<br/>
New EModule: UNICODE.EM containing 2 new constants and 4 new functions.<br/>
_DEFAULT_UCFONT, _DEFAULT_UCCOLOR<br/>
BroadcastUC(), PrintTextAboveUC(), PrintTextAbovePrivateUC(), SendSysMessageUC()<br/>
- These functions act identically to their UO.EM predecessors except for the parameters.<br/>
- ** please note the &quot;UC&quot; function suffixes **<br/>
- Unicode &quot;strings&quot; are actually EScript Arrays of 2-byte integers, where each integer<br/>
is a unicode wide-character. (example uctest.src will be uploaded to CoreTest group)<br/>
These &quot;integer codes&quot; are always clipped (internally) to 2 bytes (value &amp; 0xFFFF) and<br/>
a '0x0000' value will stop the end the string, regardless of the size of the array.<br/>
- Passing a non-array variable or an array with a non-integer value in it, as the<br/>
'uc_text' parameter, will throw an error. They MUST all be integers.<br/>
- The 'uc_text' array cannot exceed the current 'maximum speech length' of 200.<br/>
- LangCode's are 3-character identifiers for the language it's in: ENG, RUS, KOR, etc.<br/>
Passing a langcode string that's not 3 characters will throw an error.</change>
</entry>
<entry>
<date>11-30</date>
<author>Myrathi</author>
<change>ECompile now displays &quot;deprecation&quot; warnings for certain operators and tokens and<br/>
although your scripts will still compile, these are now &quot;last warnings&quot;:<br/>
- '=' is deprecated; use '=='<br/>
- 'local', 'global' and 'dim' are deprecated; use 'var'<br/>
- 'begin' and 'end' are deprecated.<br/>
** Deprecated expressions will be removed from 096 **<br/>
** so make sure you update your scripts!!! **</change>
</entry>
<entry>
<date>11-28</date>
<author>Racalac</author>
<change type="Improved">canInsert script will be called when a stack of item is placed into the<br/>
backpack through the paperdoll icon</change>
<change type="Fixed">.hp, .maxhp_mod, for weapon and armor items should be writable again.</change>
<change type="Fixed">.buyprice and .sellprice were returning 0 if you didn't write to them first.<br/>
Now if they are not written to first, they will return the itemdesc value for<br/>
VendorBuysFor and VendorSellsFor.</change>
</entry>
<entry>
<date>11-27</date>
<author>Racalac</author>
<change>Added for Secure Trade Window: if a trade is cancelled, canInsert and onInsert scripts<br/>
will be called for the player's backpack. If the items cannot be inserted, they will fall<br/>
to the player's feet.</change>
</entry>
<entry>
<date>11-25</date>
<author>Racalac</author>
<change>Fixed a bug with character.concealed being misread on server start as a boolean (0/1), not<br/>
an integer(0-255)<br/>
Fixed a bug in SystemFindObjectBySerial where items in the secure trade container were not<br/>
being found.<br/>
Fixed a crash introduced in the 11-21 test core concerning core-destroyed stacks of items.<br/>
Fixed a bug with the conceal system where if a character's concealed level was reduced to<br/>
a value still greater than 0, other characters of the same new concealed level did not<br/>
see the character.</change>
</entry>
<entry>
<date>11-24</date>
<author>Racalac</author>
<change>Added new itemdesc.cfg property: UseRequiresLOS (defaults to 1 if not defined). If true,<br/>
Line-of-sight is needed to double-click the item. If false, a player can use the item<br/>
without LOS.<br/>
* Note DoubleClickRange is still checked.<br/>
Added new itemdesc.cfg property: GhostsCanUse (defaults to 0 if not defined). If true, dead<br/>
(ghost) characters may double-click this item.<br/>
Fixed a bug in SystemFindObjectBySerial where an item held on a character's cursor was not<br/>
found.<br/>
Added a new os.em function: set_event_queue_size(newsize) : Changes the maximum number of<br/>
events the current script will keep in the queue (additional events will be discarded).<br/>
If not called, the default size is 20 events. The function returns the old queue size.</change>
</entry>
<entry>
<date>11-21</date>
<author>Syzygy</author>
<change>active trades will be cancelled on death<br/>
Fixed a problem with listening points that would cause big problems after<br/>
listener destruction (house doors, tillermen, wink wink, nudge nudge)<br/>
Containers will default to limits: 150 items, 250 stones</change>
</entry>
<entry>
<date>11-20</date>
<author>Racalac</author>
<change>Added a new object method: script_process.clear_event_queue(). (script_process comes from<br/>
NPC.process or uo.em's getprocess(pid))</change>
</entry>
<entry>
<date>11-19</date>
<author>Racalac</author>
<change>You will no longer be able to initiate a secure trade with a ghost (if either party is dead).</change>
</entry>
<entry>
<date>11-17</date>
<author>Racalac</author>
<change>These Item creation/movement/deletion functions now properly will update character's weight on<br/>
the status gump: ConsumeSubstance, DestroyItem, CreateItemInContainer, CreateItemInBackpack,<br/>
MoveItemToContainer, MoveItemToLocation, SubtractAmount.<br/>
CreateItemInContainer and -Backpack will call the container's canInsert and onInsert scripts.<br/>
POL will attempt to find a character that owns this container. If one is not found (i.e.<br/>
container is on the ground, the CharacterRef passed to the passed to the canInsert and<br/>
onInsert scripts will be an uninitialized object (so, check to make sure it's valid before<br/>
using it).<br/>
Adding to a stack of items (manually and by a CreateItem script function) in a container will<br/>
call the container's canInsert and onInsert scripts. Note if a script initiates this action<br/>
(and the script has no character controller), the CharacterRef passed to the canInsert and<br/>
onInsert scripts will be an uninitialized object (so, check to make sure it's valid before<br/>
using it).<br/>
The core will no longer play sounds effects for items being inserted into containers (thus, they<br/>
aren't heard by everyone.). You can get the desired effects using the container's onInsert<br/>
script. For example, to get the different gold drop sounds in addition to the default one,<br/>
you might have in your container's onInsert:<br/>
if(item.objtype == GetObjtypeByName(&quot;goldcoin&quot;))<br/>
if(item.amount &gt;= 100)<br/>
PlaySoundEffectPrivate( who, 0x38, who ); //lotsa gold<br/>
elseif(item.amount &gt;= 30)<br/>
PlaySoundEffectPrivate( who, 0x37, who ); //some gold<br/>
else<br/>
PlaySoundEffectPrivate( who, 0x36, who ); //a few coins<br/>
endif<br/>
else<br/>
PlaySoundEffectPrivate( who, 0x49, who ); //default sound<br/>
endif</change>
</entry>
<entry>
<date>11-17</date>
<author>Myrathi</author>
<change>Fixed Unicode speech (and a couple of possible buffer overflow bugs)<br/>
- Text commands are now properly recognised and run<br/>
TypeOf() (see basic.em) on Dictionary and Struct variables now returns<br/>
&quot;Dictionary&quot; and &quot;Struct&quot;, respectively.<br/>
Added &quot;unicode.em&quot; with Unicode support functions (refer to file for names)<br/>
- a Unicode &quot;string&quot; ('uc_text' param) is simply an Array of Integers.<br/>
- each Integer corresponds to a 2-byte Unicode character.<br/>
- each of the 4 functions must also be given a 3-character &quot;language code&quot;<br/>
- examples are &quot;ENU&quot; (US English), &quot;ENG&quot; (UK English), &quot;RUS&quot; (Russian)</change>
</entry>
<entry>
<date>11-17</date>
<author>Syzygy</author>
<change>Fixed the map Z-height algorithm to match the UO client for negative Z<br/>
(for an example, see 1906,49)<br/>
Fixed an assertion failure in SendOpenBook on Linux systems<br/>
Fixed an ecompile error with substrings/multidimensional subscript access ( ex: tmp := Props[3,1] )</change>
</entry>
<entry>
<date>11-16</date>
<author>Racalac</author>
<change>New member for the Text Event struct: &quot;texttype&quot;. This will be a string with a value of &quot;yell&quot;,<br/>
&quot;whisper&quot;, &quot;emote&quot;, or &quot;default&quot; depending on the type of speech received.<br/>
NPCs will only receive text events if the source is in range, depending on the texttype (this<br/>
will be configurable in the future, for now, whisper is 2 tiles, normal is 12, and yell is<br/>
25 tiles). So an NPC will not get a yell event from a source 30 tiles away, even if its<br/>
speech event range is 40. Item text listeners will get all text in their range, regardless<br/>
of texttype. (Need feedback for this)<br/>
New os.em function: clear_event_queue(), empties current script's event queue.<br/>
(Distro folks! - need to add this prototype to os.em)<br/>
The npc.em movement functions (Wander(), Move(), WalkToward(), WalkAwayFrom(), RunToward(),<br/>
RunAwayFrom(), TurnToward(), TurnAwayFrom(), WalkTowardLocation(),WalkAwayFromLocation(),<br/>
RunTowardLocation(), RunAwayFromLocation(), TurnTowardLocation(), TurnAwayFromLocation())<br/>
now return 1 is the move was successful, and 0 if the move failed. NOTE this will almost<br/>
ALWAYS return 1, if UseAdjustments is true (see next item), because the &quot;adjusted&quot; move<br/>
probably succeeded.<br/>
New npcdesc.cfg member: UseAdjustments : If set to 1 all NPCs of this template will behave as<br/>
normal when blocked by and object (pace back and forth if path is blocked). If set to 0, the<br/>
NPC will not attempt to find a adjacent tile toward the target that is not blocked (defaults<br/>
to 1 if not found in the npcdesc.cfg entry). Also, a new NPC member with the name<br/>
&quot;.use_adjustments&quot; is read/write. These NPC changes are in preperation for a pathfinding<br/>
system.<br/>
New npcdesc.cfg member: RunSpeed . If present, (default to dexterity value) this value is used<br/>
for time delay between NPC moves (maximum usable value is 250, which is pretty damn fast!<br/>
Running NPCs move twice as fast as walking NPCs). Also, a new NPC member with the name<br/>
&quot;.run_speed&quot; is read/write. Note that this member may become a Vital in the near future<br/>
(before the 095 final release).</change>
</entry>
<entry>
<date>11-14</date>
<author>Racalac</author>
<change>Fixed MoveItemToContainer bug (default container coords of -1 was being flagged<br/>
as out of range). Reminder: any value of x or y outside the gump coordinate<br/>
range as defined in the container's itemdesc.cfg will be interpreted as &quot;random location&quot;<br/>
Added new uo.em function: ListItemsNearLocationWithFlag(x,y,z,range,flags). &quot;flags&quot; here are<br/>
tiledata.mul flags for the item's graphic. A list of known flags is forthcoming<br/>
(curious people can see Alazane's file format page at<br/>
http://dkbush.cablenet-va.com/alazane/file_formats.html#3.19 )<br/>
Fixed an additional MoveItemToContainer bug that was causing random location of items inside<br/>
the container gump.</change>
</entry>
<entry>
<date>11-13</date>
<author>Myrathi</author>
<change>Updated ECOMPILE and RUNECL banners to include better version info<br/>
(number after the decimal point is the supported file version)</change>
</entry>
<entry>
<date>11-12</date>
<author>Syzygy</author>
<change>Added support for ecompile.cfg and packaged includes<br/>
see scripts/ecompile.cfg.example</change>
<change type="usage">include &quot;:pkgname:filebase&quot;;<br/>
npcdesc.cfg can once again hold non-&quot;NpcTemplate&quot; elements.<br/>
xlate.cfg is no longer loaded and ignored, just ignored.</change>
</entry>
<entry>
<date>11-10</date>
<author>Syzygy</author>
<change>item.color := (value) will once again set the color properly.</change>
</entry>
<entry>
<date>11-10</date>
<author>Myrathi</author>
<change>Updated item.facing - valid range is now 0-127<br/>
Updated TotalStatsAtCreation= option in SERVSPECOPT(.LOCAL).CFG<br/>
Can now take comma-delimited lists of values and/or ranges (default = &quot;65,80&quot;)<br/>
Example:<br/>
TotalStatsAtCreation=65,80,90-95,100-110<br/>
Anti-exploit checks in uo::SelectColor()<br/>
now validates values as 2 to 1001 to prevent client-side exploits:<br/>
- returns the chosen color value<br/>
- or an error (&quot;Client selected an out-of-range color&quot;)<br/>
An error situation will also display information on the console:<br/>
e.g.<br/>
Client #1 (account test) selected an out-of-range color 0x1<br/>
Anti-exploit checks &amp; updates in UNICODE-speech code<br/>
squelch()'d mobiles cannot speak.<br/>
Text-color is validated between 2 and 1001 to prevent client-side<br/>
exploits. Invalid color prints a message to console:<br/>
e.g.<br/>
Client #1 (account test) speaking with out-of-range color 0x1</change>
</entry>
<entry>
<date>11-09</date>
<author>Syzygy</author>
<change>Major changes to the script engine:<br/>
*** ALL SCRIPTS MUST BE RECOMPILED!! ***<br/>
All scripts should function as they do now, with two exceptions:<br/>
.smember no longer works<br/>
the hidden iterator variable in &quot;foreach&quot; is now called<br/>
_(var)_iter instead of _(var)_counter<br/>
Fixed two major script object leaks.<br/>
Internal changes to the way member assignment and access works.<br/>
Internal changes to the way script substrings are handled.<br/>
Removed the 'Substring' object type.</change>
<change type="Fixed">len() on an error would return random values<br/>
(now returns the number of elements in the error dictionary,<br/>
which is probably unnecessary)</change>
</entry>
<entry>
<date>11-04</date>
<author>Syzygy</author>
<change>Fixed a nasty compiler error. Expressions like this:<br/>
(!ev.source.isA(POLCLASS_NPC))<br/>
will now work properly.<br/>
The compiler used to consider that something like<br/>
(!ev.(&quot;source&quot;.isA(POLCLASS_NPC) ) )</change>
</entry>
<entry>
<date>10-23</date>
<author>Syzygy</author>
<change>foreach now operates over dictionaries:<br/>
foreach v in dict<br/>
print( _v_iter + &quot; -&gt; &quot; + v );<br/>
endforeach</change>
</entry>
<entry>
<date>10-17</date>
<author>Syzygy</author>
<change>xlate.cfg is no longer used.<br/>
spells.cfg no longer depends on xlate.cfg for reagent name lookup - will use itemdesc.cfg names.<br/>
Preload 'equiptest' and 'unequiptest' scripts, to speed system load time.<br/>
(however, equiptest/unequiptest scripts created after startup will not be noticed)<br/>
Changed config file handling to speed load time.<br/>
(menus.cfg entries might have their elements reordered, though)<br/>
Sped up system load</change>
</entry>
<entry>
<date>10-13</date>
<author>Syzygy</author>
<change>Sped up storage area lookups</change>
</entry>
<entry>
<date>09-14</date>
<author>merged changes from Racalac:</author>
<change>-New property for itemdesc.cfg Map{} entries: Editable, which defaults to 0<br/>
This determines if the user can plot points on the map gump. Note you can still edit the map<br/>
via the script methods.<br/>
-New script methods for map objects:<br/>
GetPins(): returns an array of structs with .x and .y members for each pin point.<br/>
InsertPin( index, x, y ): inserts a pin with the passed x,y before the passed index. Valid range 0 to n-1<br/>
AppendPin( x, y ): appends a pin to the end of the course with the passed x,y<br/>
ErasePin( index ): erases the pin at the passed index (valid 0 to n-1), and shifts pins down.<br/>
isa(): returns true if the object is a map object<br/>
-New pol.cfg option:<br/>
MaximumClients=X<br/>
Denies logon to clients if # of clients connected is at defined maximum<br/>
-New syshook for walking through other players, i.e. define a package with syshook.cfg :<br/>
SystemHookScript pushhook.ecl<br/>
{<br/>
Pushthrough Pushthrough<br/>
}<br/>
with pushhook.src with something like:<br/>
use uo;<br/>
program PushthroughHook()<br/>
return 1;<br/>
endprogram<br/>
exported function Pushthrough(walker, obstructors) //note passed ARRAY of mobiles in destination tile<br/>
foreach mob in obstructors<br/>
print(mob.name);<br/>
endforeach<br/>
if(GetVital(walker,&quot;Stamina&quot;) &lt; GetVitalMaximumValue(walker,&quot;Stamina&quot;))<br/>
return 0;<br/>
else<br/>
return ConsumeVital(walker,&quot;Stamina&quot;,1000);<br/>
endif<br/>
endfunction<br/>
-New player privilage: 'freemove' - ignore Pushthrough/stamina cost for movement<br/>
-New character method: character.GetGottenItem() returns itemref to item on player's &quot;cursor&quot;</change>
</entry>
<entry>
<date>09-12</date>
<change>Linux changes</change>
</entry>
</version>
</ESCRIPT>