Files
Mush-Soundpack/cosmic rage/worlds/plugins/Messages_Window.xml
2025-07-01 23:28:00 +03:00

312 lines
8.3 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE muclient>
<muclient>
<plugin
name="Messages_Window"
author="Nick Gammon"
id="126d9061f9758498c878a204"
language="Lua"
purpose="Shows messages in a miniwindow"
date_written="2010-08-24 10:30"
date_modified="2010-08-24 13:30"
save_state="y"
requires="4.55"
version="1.1"
>
<description trim="y">
<![CDATA[
Call from scripts to display information messages.
See: http://www.gammon.com.au/forum/?id=10515
eg.
Note a message (starts a new line):
CallPlugin ("126d9061f9758498c878a204", "MsgNote", "test note")
CallPlugin ("126d9061f9758498c878a204", "MsgNote", "test note", "yellow") -- yellow text
CallPlugin ("126d9061f9758498c878a204", "MsgNote", "test note", "yellow", "white") -- yellow on white
Tell a message in the default text colour (stays on same line):
CallPlugin ("126d9061f9758498c878a204", "MsgTell", "test tell")
CallPlugin ("126d9061f9758498c878a204", "MsgTell", "test tell", "yellow") -- yellow text
CallPlugin ("126d9061f9758498c878a204", "MsgTell", "test tell", "yellow", "white") -- yellow on white
Clear the message window:
CallPlugin ("126d9061f9758498c878a204", "MsgClear")
Hide the message window:
CallPlugin ("126d9061f9758498c878a204", "MsgHide")
Show the message window:
CallPlugin ("126d9061f9758498c878a204", "MsgShow")
Change the message window title:
CallPlugin ("126d9061f9758498c878a204", "MsgTitle", "Combat text")
]]>
</description>
</plugin>
<!-- Script -->
<script>
<![CDATA[
-- configuration
-- number of lines to show
local MAX_LINES = 20
-- font
local FONT_NAME = "Dina"
local FONT_SIZE = 8
-- where to put the window
local WINDOW_POSITION = miniwin.pos_top_right
-- colours
local WINDOW_BACKGROUND_COLOUR = "black"
local WINDOW_TITLE_COLOUR = "black"
local WINDOW_TITLE_BACKGROUND = "darkgoldenrod"
local NOTE_COLOUR = "Cyan"
-- window title
local title = "Messages"
-- offset of text from edge
local TEXT_INSET = 5
-- where to store the message lines
local lines = {} -- table of recent message lines
local styles = {} -- current line
-- display one line
local function show_line (n, styles)
local left = TEXT_INSET
local top = (n - 1) * font_height + TEXT_INSET
-- display each style, including the appropriate background under it
for _, v in ipairs (styles) do
local width = WindowTextWidth (win, "f", v.text) -- get width of text
local right = left + width -- work out RH side
local bottom = top + font_height -- work out bottom
WindowRectOp (win, miniwin.rect_fill, left, top, right, bottom,
ColourNameToRGB (v.backcolour or WINDOW_BACKGROUND_COLOUR)) -- draw background
WindowText (win, "f", v.text, left, top, window_width - TEXT_INSET, 0,
ColourNameToRGB (v.textcolour or NOTE_COLOUR)) -- draw text
left = left + width -- advance horizontally
end -- for each style run
end -- Display_Line
local function add_line (line)
-- remove first line if filled up
if #lines >= MAX_LINES then
table.remove (lines, 1)
end -- if
-- add new line
table.insert (lines, line)
end -- add_line
-- here on output to display
local function redraw_all ()
-- blank existing window contents
WindowRectOp (win, miniwin.rect_fill, 0, 0, 0, 0, ColourNameToRGB (WINDOW_BACKGROUND_COLOUR))
-- draw drag bar rectangle
WindowRectOp (win, miniwin.rect_fill, 0, 0, 0, font_height + 2, ColourNameToRGB (WINDOW_TITLE_BACKGROUND))
-- draw border
check (WindowRectOp (win, miniwin.rect_draw_edge, 0, 0, 0, 0, miniwin.rect_edge_raised, miniwin.rect_edge_at_all))
local sz = WindowTextWidth (win, "fb", title)
WindowText (win, "fb", title, (window_width - sz) / 2, 1, window_width - TEXT_INSET, 0,
ColourNameToRGB (WINDOW_TITLE_COLOUR))
-- display all lines
for k, v in ipairs (lines) do
show_line (k + 1, v)
end -- for
Redraw ()
end -- end redraw_all
local function warning (msg)
ColourNote ("white", "red", msg)
end -- warning
-- EXPOSED FUNCTIONS
-- hide window on removal
function OnPluginClose ()
WindowShow (win, false) -- hide it
end -- OnPluginClose
-- hide window on disable
function OnPluginDisable ()
WindowShow (win, false) -- hide it
end -- OnPluginDisable
-- show window on enable
function OnPluginEnable ()
if #lines > 0 then
WindowShow (win, true) -- show it
end -- if
end -- OnPluginEnable
function OnPluginSaveState ()
-- save window current location for next time
movewindow.save_state (win)
end -- function OnPluginSaveState
-- FOR CALLING BY SCRIPTS:
-- eg. CallPlugin ("126d9061f9758498c878a204", "MsgNote", "test note")
-- CallPlugin ("126d9061f9758498c878a204", "MsgNote", "test note", "yellow") -- yellow text
-- CallPlugin ("126d9061f9758498c878a204", "MsgNote", "test note", "yellow", "white") -- yellow on white
-- Note a line (starts a new line afterwards). Text colour and background colour are optional.
function MsgNote (text, textcolour, backcolour)
-- add this style (if any text)
if text then
if type (text) ~= "string" then
warning ("First argument to MsgNote must be message text (string)")
return
end -- if
table.insert (styles, { text = text, textcolour = textcolour, backcolour = backcolour } )
end -- if
-- add all styles to this line
add_line (styles)
-- start new line
styles = {}
-- display existing lines
redraw_all ()
WindowShow (win, true) -- show it
end -- MsgNote
-- eg. CallPlugin ("126d9061f9758498c878a204", "MsgTell", "test note")
-- CallPlugin ("126d9061f9758498c878a204", "MsgTell", "test note", "yellow") -- yellow text
-- CallPlugin ("126d9061f9758498c878a204", "MsgTell", "test note", "yellow", "white") -- yellow on white
-- Tell a line (does not start a new line). Text colour and background colour are optional.
function MsgTell (text, textcolour, backcolour)
if type (text) ~= "string" then
warning ("First argument to MsgTell must be message text (string)")
return
end -- if
-- add this style
table.insert (styles, { text = text, textcolour = textcolour, backcolour = backcolour } )
end -- MsgTell
-- eg. CallPlugin ("126d9061f9758498c878a204", "MsgClear")
function MsgClear ()
lines = {}
styles = {}
-- display blank window
redraw_all ()
end -- MsgClear
-- eg. CallPlugin ("126d9061f9758498c878a204", "MsgHide")
function MsgHide ()
WindowShow (win, false) -- hide it
end -- MsgHide
-- eg. CallPlugin ("126d9061f9758498c878a204", "MsgShow")
function MsgShow ()
WindowShow (win, true) -- show it
redraw_all ()
end -- MsgShow
-- eg. CallPlugin ("126d9061f9758498c878a204", "MsgTitle", "Combat Messages")
function MsgTitle (new_title)
if type (new_title) ~= "string" then
warning ("First argument to MsgTitle must be window title (string)")
return
end -- if
title = new_title
redraw_all ()
end -- MsgTitle
-- startup stuff - create window, find font characteristics
win = GetPluginID () -- get a unique name
-- make the window
WindowCreate (win, 0, 0, 1, 1, WINDOW_POSITION, 0, 0) -- create window
fonts = utils.getfontfamilies ()
if not fonts.Dina then
AddFont (GetInfo (66) .. "\\Dina.fon")
end -- if Dina not installed
-- grab a font
WindowFont (win, "f", FONT_NAME, FONT_SIZE) -- define font
WindowFont (win, "fb", FONT_NAME, FONT_SIZE, true) -- define font
-- work out how high and wide it is
font_height = WindowFontInfo (win, "f", 1) -- height of the font
wrap_column = GetOption ("wrap_column")
window_width = (wrap_column * WindowFontInfo (win, "f", 6)) + (TEXT_INSET * 2)
window_height = (MAX_LINES + 1) * font_height + TEXT_INSET * 2 -- one more line for title
require "movewindow" -- load the movewindow.lua module
-- install the window movement handler, get back the window position
windowinfo = movewindow.install (win, WINDOW_POSITION)
-- remake the window with the correct width
WindowCreate (win,
windowinfo.window_left,
windowinfo.window_top,
window_width, window_height,
windowinfo.window_mode,
windowinfo.window_flags,
0)
-- add the drag handler so they can move the window around
movewindow.add_drag_handler (win, 0, 0, 0, font_height + 2)
]]>
</script>
</muclient>