It seemed to work in testing on Windows 10.
I can't figure out how to make Visual Studio Community 2015 build an executable that works in XP or Wine as a drop-in .exe replacement no matter what project settings I poke at.

-- Subnegotiations go back in just before the EOL so they
-- get processed by MUSHclient in the right sequence.

I think you'll have to change that to "just after" so that they occur at the start of a line, not the end of the previous one.

Hehe. You might be interested, my current iterations on that project are:
https://raw.githubusercontent.com/fiendish/aardwolfclientpackage/development/MUSHclient/worlds/plugins/text_substitution.xml
https://raw.githubusercontent.com/fiendish/aardwolfclientpackage/development/MUSHclient/worlds/plugins/simplified_text_substitution.xml

The first filters both main output and GMCP comm.channel.msg in OnPluginPacketReceived.
The second does only main output via a maximum priority catchall trigger and lets other plugins opt-in with CallPlugin("48f867c18f6ff1d6d3b52918", "filter_string", msg)
Both are still in testing. I expect some fragility. [1]

I'm thinking about doing a third one, which is the middle ground between the two, that does GMCP comm.channel.msg in OnPluginPacketReceived and main output with a trigger.

[1] - e.g. I just got a report from a tester using the first one of the following error. Could be coincidence, could be not. :

Nah, basic gagging/replacement code isn't actually that hard. I've chosen to complicate things somewhat by allowing for gsub-like patterns, color codes and resets, and external functions for conditional replacements through a proxied CallPlugin interface. Because why do something simple when you can do something awesome?

Actually the only reason why I still don't have the simplified version fully working yet is because of having to work within MUSHclient's triggering framework (I keep failing to reliably conditionally omit, halt trigger evaluation, and also simulate, while working together with other plugins that also want to simulate).

Nah, basic gagging/replacement code isn't actually that hard. I've chosen to complicate things somewhat by allowing for gsub-like patterns, color codes and resets, and external functions for conditional replacements through a proxied CallPlugin interface. Because why do something simple when you can do something awesome?

Actually the only reason why I still don't have the simplified version fully working yet is because of having to work within MUSHclient's triggering framework (I keep failing to reliably conditionally omit, halt trigger evaluation, and also simulate, while working together with other plugins that also want to simulate).

Though I think I have all the kinks worked out now pending the fix for dangling styles.