[Home] [Downloads] [Search] [Help/forum]

Release notes for MUSHclient version 4.45

Version 4.45

Released on 24 Dec 2009

1. Fixed bug where, if you used WindowLoadImage, and the image had less than 24 bpp (bits per pixel) the image would be rendered incorrectly, or MUSHclient would crash.

2. Fixed bug where, if you used the auto-mapper, and added a "special" direction (like "nu/sd") the mapper would then stop adding normal directions (like N, S).

3. Fixed bug where, if you tried to add multiple plugins with the "Add" button in the Plugins dialog box, and the combined file names were longer than 255 characters, nothing would be added. The maximum length of the combined names has been increased to 4096 characters.

4. Fixed problem where, if you loaded multiple plugins with the "Add" button in the Plugins dialog box, and one plugin had an error, subsequent ones would not be loaded. Now an attempt is made to load each one, regardless of whether the others succeeded or not.

5. Added new plugin script function: OnPluginListChanged

This is called (with no arguments) when:

* All plugins have been loaded at world load time (called once, after all the plugins are loaded)

* The list of plugins changes (because of adding or removing plugins from the Plugins dialog box) - called once if multiple plugins are loaded or removed at the same time.

* A plugin is reloaded via the Plugins dialog box, or the ReloadPlugin script function is called.

* A plugin is added via the LoadPlugin script function.

An example use might be:

function OnPluginListChanged ()

-- see what plugins are now installed
local installed_plugins = GetPluginList()

end -- OnPluginListChanged

The intention of this function is to allow plugin writers to ensure that all plugins needed have been loaded (for example, if plugins have dependencies on other plugins). A plugin that requires another plugin to be loaded could display a warning if it found the other plugin missing. This warning would therefore be repeated each time the world is loaded, until the required plugin was installed. It would also be displayed if the required plugin was removed, even if it was installed earlier.

To prevent infinite loops, OnPluginListChanged will not be called again if, inside OnPluginListChanged, the list of plugins is changed (eg. by doing a LoadPlugin call).

6. Upgraded PCRE (Perl Compatible Regular Expression) support from version 7.2 to 8.0. This has various improvements, bug fixes, and speed improvements as documented at some length here:


Behaviour changes might be noticed for:

* trigger matching
* alias matching
* use of the rex library in Lua

7. Upgraded SQLite3 support from version 3.6.16 to 3.6.21. This adds various improvements and features, including enforcement of foreign key constraints.

For more information about foreign keys ...

See: http://www.gammon.com.au/forum/?id=9922
Also: http://www.sqlite.org/foreignkeys.html

And about SQLite3 in general: http://www.sqlite.org/

8. Upgraded PNG support from version 1.2.35 to 1.2.41. This fixes some possible problems with decoding images with bad data.

For more information about libPNG: http://www.libpng.org/pub/png/

9. Upgraded zLib support from version 1.1.3 to 1.2.3. This has some bug fixes and speed improvements (for compression and decompression, eg. for using MCCP protocol).

For more information about zLib: http://www.zlib.net/

10. Fixed bug where, if you added or removed a plugin, the main world file was not flagged as changed, and therefore you were not prompted to save it. Thus the new plugin may not have been loaded next time you opened the world.

11. Fixed bug where, if you created a miniwindow with dimension 0 x 0, and then loaded an image into it, and then resized that window (ie. recreated it with different dimensions), and then displayed the image which was previously loaded, the image would have been converted to monochrome.

12. Changed DatabaseError function to return values for 100 and 101 return codes, namely:

100: "row ready"
101: "finished"

This avoids getting the message "unknown error" if you happen to be using DatabaseError to show the results of calls to DatabaseStep.

13. Some help file improvements.

14. Updated the RegularExpressions.txt file somewhat to reflect some of the newer features in the PCRE functionality.

15. Changed script function WindowFont so that if you pass an empty string as the font name, and zero as the font size, any existing font of that font ID will be deleted. This effectively allows you to "clean up" by removing fonts you don't need. However fonts are automatically removed when a miniwindow is deleted.

16. Added new selector 21 to GetPluginInfo. This returns the sequence in which plugins are evaluated (effectively, the order they were loaded), starting at 1. Thus if a particular plugin has an evaluation order of 3 then triggers, aliases etc. in it are processed 3rd after plugins 1 and 2. Note that disabled plugins are counted. This number is recalculated each time GetPluginInfo is called, so if you were to remove a plugin, for example, and reinstall it, it may change position in the list.

17. Added Lua functions scan_dir and shuffle to the commas.lua module. For more information about those two functions, see:

scan_dir: http://www.gammon.com.au/forum/?id=9906
shuffle: http://www.gammon.com.au/forum/?id=9908

18. Amended the dialogs for adding or amending triggers and aliases to not allow non-printable characters (eg. hex 0x08) in the match, or send text, as these cause world files to be saved which cannot be loaded back in. This is not a total solution to the problem of world file saving, however triggers and aliases are more likely than most places to get invalid characters, as users are likely to copy and paste output from the screen.

19. On a "cancel mouseover" event for a miniwindow hotspot, WindowInfo (14) and WindowInfo (15) now contain the location of the mouse, relative to the miniwindow (not the hotspot) at the moment the cancel mouseover was detected. (This may be negative as the mouse may have moved outside the miniwindow before the movement was detected. It also may not necessarily be exactly one pixel away from the edge.)

Ditto for "cancel mousedown". However in the case of "cancel mousedown" the current mouse position may be recorded for two miniwindows. One: the one in which the mousedown occurred; Two: the one in which the mouseup occurred (for example, if you mousedown in miniwindow A, and then release the mouse over miniwindow B).

20. Added new selectors for GetInfo:

283: last mouse position (X) relative to the world window output client area
284: last mouse position (Y) relative to the world window output client area
285: Is output window available? (true or false)

GetInfo (285) indicates whether or not the world output window has been initialized yet. At world creation time, until the world details have been read from the world file, the output window has not yet been created, because its dimensions, font type, font size, wrap column, etc. are not yet established.

While this is false, any attempts to write to the output window (eg. world.Note) silently fail. This may in particular happen during plugin initialization, as plugins are loaded before the output window is initialized.

21. Added new plugin script callback: OnPluginMouseMoved

This is called when a mouse-move event is detected for the main output window.

The function is called with 3 arguments: 2 numbers and a string.

Example of using it:

function OnPluginMouseMoved (x, y, miniwindow)
TraceOut ("mouse move: x=", x, ", y=", y, ", mw=", miniwindow)
end -- function OnPluginMouseMoved

The mouse position, relative to the top-left corner of the current world's output window is supplied as the x and y coordinates. The third argument is the miniwindow ID of any miniwindow the mouse may happen to be over, or "" if it is not over a miniwindow.

Processing inside this function should be restricted to a fairly small amount, otherwise the client may be slowed down somewhat. Tests show that if the mouse is moved continuously, you may get something like 60 mouse-move events per second, approximately.

22. Added new selector to SetCursor. Now if you call:

SetCursor (-1)

... the cursor (mouse pointer) is removed. Note that in general, moving the mouse around will immediately restore it, as MUSHclient is setting the cursor shape in response to movement over text, etc.

Tests seem to show that setting the cursor to -1 in the OnPluginMouseMoved function (above) keeps the cursor hidden.

23. Added flag to WindowAddHotspot (the Flags parameter).

This parameter which was previously unused, now recognises bit 1.

If set, the mouse-over callback (if present) is called for all mouse movements over the hotspot, not just the first.

The "flags" parameter supplied to the mouseover function will have the 0x80 bit set if this is a subsequent call, and clear for the first call.

For example:

WindowAddHotspot(win, "hs",
0, 0, 0, 0, -- entire miniwindow
"", -- no tooltip
1, -- hand cursor
1) -- want notification of all mouse movements

For a lengthy discussion about this, see:


24. Changed WindowAddHotspot to allow for a cursor value of -1, which means no cursor is visible over that hotspot.

View all MUSHclient release notes

Quick links: MUSHclient. MUSHclient help. Forum shortcuts. Posting templates. Lua modules. Lua documentation.

Information and images on this site are licensed under the Creative Commons Attribution 3.0 Australia License unless stated otherwise.


Written by Nick Gammon - 5K   profile for Nick Gammon on Stack Exchange, a network of free, community-driven Q&A sites   Marriage equality

Comments to: Gammon Software support
[RH click to get RSS URL] Forum RSS feed ( https://gammon.com.au/rss/forum.xml )

[Best viewed with any browser - 2K]    [Hosted at FutureQuest]