Two debounce attempts (recent-append recency, then sustained-unfocus
streak) both failed to stop it firing on almost every incoming line
while the toggle was on. Rather than keep chasing GetFocus() polling
noise, removed the whole feature: poll_output_focus, jump_notepad_to_end,
toggle_jump_to_end, the Ctrl+Alt+J accelerator/alias, the polling timer,
the jump_to_end_on_focus variable, and the now-unused GetFocus/
EM_SCROLLCARET Alien bindings. SmartAppendToNotepad (the actual smart-
scroll fix, unrelated to this and confirmed working) is untouched.
Updated the readme to drop the Ctrl+Alt+J entry.
Debug logging disproved the previous "recent append perturbs GetFocus"
theory - one spurious jump fired 7.67s after the last append. The real
pattern: GetFocus() reports "not focused" for a single poll tick now
and then even while the user never left the window, and that lone blip
was enough for the very next tick to be read as "just switched to the
window," triggering a jump on practically every incoming line.
Now requires 3 consecutive unfocused poll ticks (~0.6s) before the next
focused tick counts as a genuine switch, filtering out single-tick
noise from MUSHclient's own UI thread. Removed the now-unused
last_append_clock tracking from the previous (wrong) fix attempt.
The tostring() comparison fix wasn't sufficient - jump-to-end was still
firing on nearly every incoming line while jump-to-end-on-focus was on.
AppendToNotepad's own SetSel/ReplaceSel appears to momentarily perturb
GetFocus() around each append, which poll_output_focus was reading as a
genuine "just switched to the window" edge. Now skips the jump if a
SmartAppendToNotepad call happened within the last 0.5s.
ppi (the sound engine handle) and dir aren't globals in
NumpadMovement.xml's own Lua state - they belong to other plugins -
so toggle_numpad crashed with "attempt to index global 'ppi' (a nil
value)" every time. Dropped the sound calls entirely, kept the spoken
confirmation. Updated the readme to match.
Accelerator(key, text) always sends text as a literal typed command -
it only calls a Lua function if a matching <alias> routes it there
(the pattern GagManager already used correctly). Several bindings
added this session skipped that step and were silently sending
gibberish to the MUD instead of running: Ctrl+S (save_state_func) in
CosmicRage.xml, Ctrl+Alt+J (toggle_jump_to_end) in output_functions.xml,
and Alt+Enter (toggle_numpad) in NumpadMovement.xml. Added the missing
aliases for all three.
Separately, poll_output_focus's jump-to-end was firing repeatedly even
while focus never changed: it compared Alien pointer returns with
"==", which is unreliable for Alien's userdata-wrapped pointers (two
separate calls returning the same real HWND don't reliably compare
equal). Switched to comparing tostring() output instead, which is
address-based. Debug log confirmed SmartAppendToNotepad's own
restore logic was correct throughout - this poll was the sole cause
of the "jumps to end when new text arrives" complaint.
Ports the zMUD/CMUD numpad.set convention: plain numpad for normal
movement, Ctrl+numpad for moving up a level in that direction, and
Ctrl+Alt+numpad for moving down a level, all sent as literal MUD
commands via Accelerator. Alt+Enter toggles the whole set on/off (with
a sound + spoken confirmation) by clearing/restoring the accelerators,
so a disabled numpad types normally instead of doing nothing.
Cleared the numbers/*/-/+ entries in the world's native <keypad> block
since they'd otherwise double-send alongside the new Accelerator-based
bindings - left "." and "/" (hide/inventory) alone since those aren't
part of this feature. Documented the full three-layer key list and the
toggle in the readme.
Alt+N conflicted with direction_plugin.xml's south-west movement key
and was silently shadowing it (Gag Manager loads later, so its binding
won). Alt+F2 is unused. Updated the accelerator, the config dialog
title, and the readme accordingly.
Covers opening the menu (Alt+N), the 3-step gag creation flow (pattern,
method, category), the voice/full/substitute gag methods, and sharing
gags.lua between players. Also notes a real conflict found while writing
this: Alt+N is also bound to south-west movement by direction_plugin.xml,
and GagManager's later load order currently shadows it.
CheckSoundpackVersion's auto-launch of updator.bat was resolving to
worlds\updator.bat (dir + one "..") instead of the repo root where the
file actually lives (dir + three ".."), so the automatic update prompt
silently failed to launch anything. Verified the corrected path resolves
to the real file. Also fixed readme.md referring to "updater.bat" when
the actual shipped file is "updator.bat".
- output_functions.xml: merge NotepadSmartScroll's Win32/Alien-based
smart-scroll logic in directly (was a separate plugin). Fixed the
caret-restore bug: gating the restore on scroll position was wrong
since the notepad tracks near the bottom during normal reading; now
gated on whether the caret was literally at the end of the old text.
Added a jump-to-end-on-focus toggle (Ctrl+Alt+J) with a 0.2s polling
timer to catch focus landing on the output notepad by any means.
- Reverted the Tab/Ctrl+Space rebinding - removed switch_to_output and
trigger_word_completion along with their accelerators.
- cosmic rage.MCL: dropped the dangling NotepadSmartScroll.xml include
(file no longer exists, was reintroduced by an auto-save).
- readme.md: documented the actual current CosmicRage.xml keys (several
had drifted out of sync - Alt+F12 is now stop-sounds not restart,
Alt+Delete/Ctrl+S/Ctrl+F1-3/Alt+F3/Alt+Shift+H/F11 were undocumented)
and added the output_functions.xml accessible-output keybindings,
which weren't documented at all before.