Here goes some info:
Quake2 allows you to run your own server code if you put it in a sub dir under quake2 named "release". This also works under the standalone version, jitspoe hasn't removed the code so this still works. I had the source code to q2admin.
www.q2admin.com that adds the commands:
play_all (wavefile)
play_team (wavefile)
play_person [LIKE/RE/CL] (playername) (wavefile)
say_person [LIKE/RE/CL] (playername) (message)
say_group [LIKE/RE/CL] (playername) (message)
it also adds messagemode versions
play_all format: !a wavfile
play_team format: !t wavfile
play_person format: !w [LIKE/RE/CL] name wavfile
say_person format: !p [LIKE/RE/CL] (playername) (message>
say_group format: !g [LIKE/RE/CL] (playername) (message)
[LIKE] The playername must be somewhere in the actual players name.
[RE] Regular Expression match of a players name.
[CL] The (playername) must be a client number. This can only really be used
by admin's that can run the rcon status command to find out the client
number. The CL option is mainly for the !say_ server console commands.
Multiple clients can be selected by using the '+' between the
client numbers. e.g. CL 0+2+14+3
Note there are NO spaces between the numbers and '+'s.
Detailed examples of added commands to binds:
bind o "play_all insane/insane6.wav"
bind o "play_team insane/insane6.wav"
bind o "play_person like Mustahus insane/insane6.wav"
bind o "say !a insane/insane6.wav"
bind o "say !t insane/insane6.wav"
bind o "say_group re "fred\\|john\\|ted" yo yo, what's up guys?"
bind o "say_group cl 0+2+14 yo yo, what's up guys?"