static void CG_DumpSpeaker_f(void) { /* char sscrfilename[MAX_QPATH]; char soundfile[MAX_STRING_CHARS]; int i, wait, random; char *extptr, *buffptr; fileHandle_t f; // Check for argument if( trap_Argc() < 2 || trap_Argc() > 4 ) { CG_Printf( "Usage: dumpspeaker <soundfile> ( <wait=value>|<random=value> )\n" ); return; } wait = random = 0; // parse the other parameters for( i = 2; i < trap_Argc(); i++ ) { char *valueptr = NULL; trap_Argv( i, soundfile, sizeof(soundfile) ); for( buffptr = soundfile; *buffptr; buffptr++ ) { if( *buffptr == '=' ) { valueptr = buffptr + 1; break; } } Q_strncpyz( soundfile, soundfile, buffptr - soundfile + 1 ); if( !Q_stricmp( soundfile, "wait" ) ) wait = atoi( valueptr ); else if( !Q_stricmp( soundfile, "random" ) ) random = atoi( valueptr ); } // parse soundfile trap_Argv( 1, soundfile, sizeof(soundfile) ); // Open soundfile Q_strncpyz( sscrfilename, cgs.mapname, sizeof(sscrfilename) ); extptr = sscrfilename + strlen( sscrfilename ) - 4; if( extptr < sscrfilename || Q_stricmp( extptr, ".bsp" ) ) { CG_Printf( "Unable to dump, unknown map name?\n" ); return; } Q_strncpyz( extptr, ".sscr", 5 ); trap_FS_FOpenFile( sscrfilename, &f, FS_APPEND_SYNC ); if( !f ) { CG_Printf( "Failed to open '%s' for writing.\n", sscrfilename ); return; } // Build the entity definition Com_sprintf( soundfile, sizeof(soundfile), "{\n\"classname\" \"target_speaker\"\n\"origin\" \"%i %i %i\"\n\"noise\" \"%s\"\n", (int) cg.snap->ps.origin[0], (int) cg.snap->ps.origin[1], (int) cg.snap->ps.origin[2], soundfile ); if( wait ) { Q_strcat( soundfile, sizeof(soundfile), va( "\"wait\" \"%i\"\n", wait ) ); } if( random ) { Q_strcat( soundfile, sizeof(soundfile), va( "\"random\" \"%i\"\n", random ) ); } Q_strcat( soundfile, sizeof(soundfile), "}\n\n" ); // And write out/acknowledge trap_FS_Write( soundfile, strlen( soundfile ), f ); trap_FS_FCloseFile( f ); CG_Printf( "Entity dumped to '%s' (%i %i %i).\n", sscrfilename, (int) cg.snap->ps.origin[0], (int) cg.snap->ps.origin[1], (int) cg.snap->ps.origin[2] );*/ bg_speaker_t speaker; trace_t tr; vec3_t end; if (!cg.editingSpeakers) { CG_Printf("Speaker Edit mode needs to be activated to dump speakers\n"); return; } memset(&speaker, 0, sizeof(speaker)); speaker.volume = 127; speaker.range = 1250; VectorMA(cg.refdef_current->vieworg, 32, cg.refdef_current->viewaxis[0], end); CG_Trace(&tr, cg.refdef_current->vieworg, NULL, NULL, end, -1, MASK_SOLID); if (tr.fraction < 1.f) { VectorCopy(tr.endpos, speaker.origin); VectorMA(speaker.origin, -4, cg.refdef_current->viewaxis[0], speaker.origin); } else { VectorCopy(tr.endpos, speaker.origin); } if (!BG_SS_StoreSpeaker(&speaker)) { CG_Printf(S_COLOR_RED "ERROR: Failed to store speaker\n"); } }
static qboolean BG_SS_ParseSpeaker(int handle) { pc_token_t token; bg_speaker_t speaker; memset(&speaker, 0, sizeof(speaker)); speaker.volume = 127; speaker.range = 1250; if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "{")) { return BG_SS_ParseError(handle, "expected '{'"); } while (1) { if (!trap_PC_ReadToken(handle, &token)) { break; } if (token.string[0] == '}') { break; } if (!Q_stricmp(token.string, "noise")) { if (!PC_String_ParseNoAlloc(handle, speaker.filename, sizeof(speaker.filename))) { return BG_SS_ParseError(handle, "expected sound filename"); } } else if (!Q_stricmp(token.string, "origin")) { if (!PC_Vec_Parse(handle, &speaker.origin)) { return BG_SS_ParseError(handle, "expected origin vector"); } } else if (!Q_stricmp(token.string, "targetname")) { if (!PC_String_ParseNoAlloc(handle, speaker.targetname, sizeof(speaker.targetname))) { return BG_SS_ParseError(handle, "expected targetname string"); } else { speaker.targetnamehash = BG_StringHashValue(speaker.targetname); } } else if (!Q_stricmp(token.string, "looped")) { if (!trap_PC_ReadToken(handle, &token)) { return BG_SS_ParseError(handle, "expected loop value"); } else { if (!Q_stricmp(token.string, "no")) { speaker.loop = S_LT_NOT_LOOPED; } else if (!Q_stricmp(token.string, "on")) { speaker.loop = S_LT_LOOPED_ON; speaker.activated = qtrue; } else if (!Q_stricmp(token.string, "off")) { speaker.loop = S_LT_LOOPED_OFF; } else { return BG_SS_ParseError(handle, "unknown loop value '%s'", token.string); } } } else if (!Q_stricmp(token.string, "broadcast")) { if (!trap_PC_ReadToken(handle, &token)) { return BG_SS_ParseError(handle, "expected broadcast value"); } else { if (!Q_stricmp(token.string, "no")) { speaker.broadcast = S_BT_LOCAL; } else if (!Q_stricmp(token.string, "global")) { speaker.broadcast = S_BT_GLOBAL; } else if (!Q_stricmp(token.string, "nopvs")) { speaker.broadcast = S_BT_NOPVS; } else { return BG_SS_ParseError(handle, "unknown broadcast value '%s'", token.string); } } } else if (!Q_stricmp(token.string, "wait")) { if (!PC_Int_Parse(handle, &speaker.wait)) { return BG_SS_ParseError(handle, "expected wait value"); } else if (speaker.wait < 0) { return BG_SS_ParseError(handle, "wait value %i is invalid", speaker.wait); } } else if (!Q_stricmp(token.string, "random")) { if (!PC_Int_Parse(handle, &speaker.random)) { return BG_SS_ParseError(handle, "expected random value"); } else if (speaker.random < 0) { return BG_SS_ParseError(handle, "random value %i is invalid", speaker.random); } } else if (!Q_stricmp(token.string, "volume")) { if (!PC_Int_Parse(handle, &speaker.volume)) { return BG_SS_ParseError(handle, "expected volume value"); } else if (speaker.volume < 0 || speaker.volume > 65535) { return BG_SS_ParseError(handle, "volume value %i is invalid", speaker.volume); } } else if (!Q_stricmp(token.string, "range")) { if (!PC_Int_Parse(handle, &speaker.range)) { return BG_SS_ParseError(handle, "expected range value"); } else if (speaker.range < 0) { return BG_SS_ParseError(handle, "range value %i is invalid", speaker.range); } } else { return BG_SS_ParseError(handle, "unknown token '%s'", token.string); } } if (!BG_SS_StoreSpeaker(&speaker)) { return BG_SS_ParseError(handle, "Failed to store speaker", token.string); } return qtrue; }