Playsound command

For scripted global sound cues for the entire server.
This commit is contained in:
Sally Coolatta 2022-06-05 10:25:41 -04:00 committed by toaster
parent 70c48fc0e9
commit f571e559d4
3 changed files with 106 additions and 33 deletions

View file

@ -539,41 +539,43 @@ INT32 adminplayers[MAXPLAYERS];
/// \warning Keep this up-to-date if you add/remove/rename net text commands
const char *netxcmdnames[MAXNETXCMD - 1] =
{
"NAMEANDCOLOR",
"WEAPONPREF",
"KICK",
"NETVAR",
"SAY",
"MAP",
"EXITLEVEL",
"ADDFILE",
"PAUSE",
"ADDPLAYER",
"TEAMCHANGE",
"CLEARSCORES",
"VERIFIED",
"RANDOMSEED",
"RUNSOC",
"REQADDFILE",
"SETMOTD",
"RESPAWN",
"DEMOTED",
"LUACMD",
"LUAVAR",
"LUAFILE",
"NAMEANDCOLOR", // XD_NAMEANDCOLOR
"WEAPONPREF", // XD_WEAPONPREF
"KICK", // XD_KICK
"NETVAR", // XD_NETVAR
"SAY", // XD_SAY
"MAP", // XD_MAP
"EXITLEVEL", // XD_EXITLEVEL
"ADDFILE", // XD_ADDFILE
"PAUSE", // XD_PAUSE
"ADDPLAYER", // XD_ADDPLAYER
"TEAMCHANGE", // XD_TEAMCHANGE
"CLEARSCORES", // XD_CLEARSCORES
"VERIFIED", // XD_VERIFIED
"RANDOMSEED", // XD_RANDOMSEED
"RUNSOC", // XD_RUNSOC
"REQADDFILE", // XD_REQADDFILE
"SETMOTD", // XD_SETMOTD
"RESPAWN", // XD_RESPAWN
"DEMOTED", // XD_DEMOTED
"LUACMD", // XD_LUACMD
"LUAVAR", // XD_LUAVAR
"LUAFILE", // XD_LUAFILE
// SRB2Kart
"SETUPVOTE",
"MODIFYVOTE",
"PICKVOTE",
"REMOVEPLAYER",
"POWERLEVEL",
"PARTYINVITE",
"ACCEPTPARTYINVITE",
"LEAVEPARTY",
"CANCELPARTYINVITE",
"GIVEITEM",
"ADDBOT"
"SETUPVOTE", // XD_SETUPVOTE
"MODIFYVOTE", // XD_MODIFYVOTE
"PICKVOTE", // XD_PICKVOTE
"REMOVEPLAYER", // XD_REMOVEPLAYER
"POWERLEVEL", // XD_POWERLEVEL
"PARTYINVITE", // XD_PARTYINVITE
"ACCEPTPARTYINVITE", // XD_ACCEPTPARTYINVITE
"LEAVEPARTY", // XD_LEAVEPARTY
"CANCELPARTYINVITE", // XD_CANCELPARTYINVITE
"GIVEITEM", // XD_GIVEITEM
"ADDBOT", // XD_ADDBOT
"DISCORD", // XD_DISCORD
"PLAYSOUND" // XD_PLAYSOUND
};
// =========================================================================

View file

@ -158,6 +158,7 @@ typedef enum
XD_GIVEITEM, // 32
XD_ADDBOT, // 33
XD_DISCORD, // 34
XD_PLAYSOUND, // 35
MAXNETXCMD
} netxcmd_t;

View file

@ -31,6 +31,7 @@
#include "m_cond.h" // for conditionsets
#include "lua_hook.h" // MusicChange hook
#include "k_boss.h" // bossinfo
#include "byteptr.h"
#ifdef HW3SOUND
// 3D Sound Interface
@ -43,6 +44,8 @@ CV_PossibleValue_t soundvolume_cons_t[] = {{0, "MIN"}, {MAX_VOLUME, "MAX"}, {0,
static void SetChannelsNum(void);
static void Command_Tunes_f(void);
static void Command_RestartAudio_f(void);
static void Command_PlaySound(void);
static void Got_PlaySound(UINT8 **p, INT32 playernum);
// Sound system toggles
static void GameSounds_OnChange(void);
@ -268,6 +271,8 @@ void S_RegisterSoundStuff(void)
COM_AddCommand("tunes", Command_Tunes_f);
COM_AddCommand("restartaudio", Command_RestartAudio_f);
COM_AddCommand("playsound", Command_PlaySound);
RegisterNetXCmd(XD_PLAYSOUND, Got_PlaySound);
}
static void SetChannelsNum(void)
@ -2469,6 +2474,71 @@ static void Command_RestartAudio_f(void)
S_ChangeMusicInternal("titles", looptitle);
}
static void Command_PlaySound(void)
{
const char *sound;
const size_t argc = COM_Argc();
sfxenum_t sfx = NUMSFX;
UINT8 buf[4];
UINT8 *buf_p = buf;
if (argc < 2)
{
CONS_Printf("playsound <name/num>: Plays a sound effect for the entire server.\n");
return;
}
if (client && !IsPlayerAdmin(consoleplayer))
{
CONS_Printf("This can only be used by the server host.\n");
return;
}
sound = COM_Argv(1);
if (*sound >= '0' && *sound <= '9')
{
sfx = atoi(sound);
}
else
{
for (sfx = 0; sfx < NUMSFX; sfx++)
{
if (S_sfx[sfx].name && fasticmp(sound, S_sfx[sfx].name))
break;
}
}
if (sfx < 0 || sfx >= NUMSFX)
{
CONS_Printf("Could not find sound effect named \"sfx_%s\".\n", sound);
return;
}
WRITEINT32(buf_p, sfx);
SendNetXCmd(XD_PLAYSOUND, buf, buf_p - buf);
}
static void Got_PlaySound(UINT8 **cp, INT32 playernum)
{
INT32 sound_id = READINT32(*cp);
if (playernum != serverplayer && !IsPlayerAdmin(playernum)) // hacked client, or disasterous bug
{
CONS_Alert(CONS_WARNING, M_GetText("Illegal playsound received from %s (serverplayer is %s)\n"), player_names[playernum], player_names[serverplayer]);
if (server)
SendKick(playernum, KICK_MSG_CON_FAIL);
return;
}
if (sound_id < 0 || sound_id >= NUMSFX)
{
// bad sound effect, ignore
return;
}
S_StartSound(NULL, sound_id);
}
void GameSounds_OnChange(void)
{
if (M_CheckParm("-nosound") || M_CheckParm("-noaudio"))