diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 4e7af8712..33dcbe27c 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -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 }; // ========================================================================= diff --git a/src/d_netcmd.h b/src/d_netcmd.h index bc20ff50f..bf8109be5 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -158,6 +158,7 @@ typedef enum XD_GIVEITEM, // 32 XD_ADDBOT, // 33 XD_DISCORD, // 34 + XD_PLAYSOUND, // 35 MAXNETXCMD } netxcmd_t; diff --git a/src/s_sound.c b/src/s_sound.c index 9d3456f59..73607cdbc 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -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 : 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"))