Example of MP3 use with the trigger_mp3 entity
|
|
|
|
Now that we have our functions ready to use we can give as example a new trigger entity that will start the
playing of a single mp3 or an array of mp3 just as the trigger_cdaudio. |
|
We are going to add this in the trigger.cpp source file |
|
First we create a new class : |
|
//======================================================
// trigger_mp3 -play or stop a mp3 file or an array of mp3
//====================================================== |
class CTriggerMP3 : public CBaseTrigger//derive
from this class |
{ |
public: |
void Spawn( void
); |
virtual void Use( CBaseEntity *pActivator,
CBaseEntity *pCaller, USE_TYPE useType, float value );//can
be used or called as target |
void Touch ( CBaseEntity *pOther );//start
if the player cross the trigger |
void KeyValue( KeyValueData *pkvd );//retrieve
the values set in the map |
void LaunchMP3( void
);// start the process |
void EXPORT HandlePlay( void
);//will handle the playing of the mp3 file array, it will be called every two seconds
to check |
|
int PlayedTrack;//current
mp3 |
BOOL Done; |
char MP3_path[128]; |
}; |
|
LINK_ENTITY_TO_CLASS( trigger_mp3, CTriggerMP3 ); |
|
|
void CTriggerMP3 :: Spawn( void ) |
{ |
InitTrigger(); |
pev->iuser1 = 0; |
//Hack to be able to save the values in the entvars of the trigger_mp3 entity
//StartTrack = pev->body
//EndTrack = pev->skin
//LoopTo = pev->effects
//Volume = pev->health
//Single = pev->sequence
//PlayedTrack = pev->iuser1
} |
|
void CTriggerMP3 :: Touch ( CBaseEntity *pOther ) |
{ |
if ( !pOther->IsPlayer() ) |
{// only the player can trigger |
return; |
} |
|
if ( !(pev->iuser3) )//we
can trigger only once |
{ |
LaunchMP3(); |
} |
pev->iuser3 = 1; |
} |
|
void CTriggerMP3 :: Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
useType, float value ) |
{ |
LaunchMP3(); |
} |
|
//Now we retrieve the value taht we ca set in the map for this entity |
void CTriggerMP3 :: KeyValue( KeyValueData *pkvd ) |
{ |
if (FStrEq(pkvd->szKeyName, "starttrack"))//the track to play first as integer |
{ |
pev->body = atoi(pkvd->szValue); |
pkvd->fHandled = TRUE; |
} |
else if (FStrEq(pkvd->szKeyName, "single"))//number of the track that will be played only |
{ |
pev->sequence = atoi(pkvd->szValue); |
pkvd->fHandled = TRUE; |
} |
else if (FStrEq(pkvd->szKeyName, "endtrack"))//last track to play |
{ |
pev->skin = atoi(pkvd->szValue); |
pkvd->fHandled = TRUE; |
} |
else if (FStrEq(pkvd->szKeyName, "loopto"))//number of track to go back after the last one |
{ |
pev->effects = atoi(pkvd->szValue); |
pkvd->fHandled = TRUE; |
} |
else if (FStrEq(pkvd->szKeyName, "dossiermod"))//path of the folder where are the mp3 |
{ |
pev->message = ALLOC_STRING( pkvd->szValue
); |
pkvd->fHandled = TRUE; |
} |
else if (FStrEq(pkvd->szKeyName, "volume"))//volume that will be set |
{ |
pev->health = atoi(pkvd->szValue); |
pkvd->fHandled = TRUE; |
} |
else if (FStrEq(pkvd->szKeyName, "priority"))//flag if this track must be played at once |
{ |
pev->iuser2 = atoi(pkvd->szValue); |
pkvd->fHandled = TRUE; |
} |
else |
CBaseTrigger::KeyValue( pkvd ); |
} |
|
//Prepare the mp3 playing process |
void CTriggerMP3 :: LaunchMP3( void ) |
{ |
//Definition of the mp3 path available (mod folder name/mp3folder name)
//for example : MyMod/mp3 |
if ( pev->sequence != 0 )//if
we are in Single mode(only one track) |
{ |
PlayedTrack = pev->sequence;//set the actual track |
} |
else |
{ |
PlayedTrack = pev->body; |
} |
//ALERT(at_console, "MP3 Folder %s\n", STRING(pev->message)); |
pev->iuser1 = PlayedTrack;//save the actual track |
SetThink( HandlePlay);//start the mp3 playing |
pev->nextthink = gpGlobals->time + 1.0; |
} |
|
|
//It will be launched every 2 seconds |
void CTriggerMP3 :: HandlePlay( void ) |
{ |
PlayedTrack = pev->iuser1;//to retreive to value |
|
//Now we build the complete path with the folder path and the track name , there are 10
tracks available : |
//From track0.mp3 to track9.mp3 |
|
if ( PlayedTrack == 0 ) |
{ |
strcpy(MP3_path, STRING(pev->message));//copy the folder path in the buffer |
strcat(MP3_path, "/track0.mp3");//add the name path in the buffer |
} |
else if ( PlayedTrack == 1 ) |
{ |
strcpy(MP3_path, STRING(pev->message)); |
strcat(MP3_path, "/track1.mp3"); |
} |
else if ( PlayedTrack == 2 ) |
{ |
strcpy(MP3_path, STRING(pev->message)); |
strcat(MP3_path, "/track2.mp3"); |
} |
else if ( PlayedTrack == 3 ) |
{ |
strcpy(MP3_path, STRING(pev->message)); |
strcat(MP3_path, "/track3.mp3"); |
} |
else if ( PlayedTrack == 4 ) |
{ |
strcpy(MP3_path, STRING(pev->message)); |
strcat(MP3_path, "/track4.mp3"); |
} |
else if ( PlayedTrack == 5 ) |
{ |
strcpy(MP3_path, STRING(pev->message)); |
strcat(MP3_path, "/track5.mp3"); |
} |
else if ( PlayedTrack == 6 ) |
{ |
strcpy(MP3_path, STRING(pev->message)); |
strcat(MP3_path, "/track6.mp3"); |
} |
else if ( PlayedTrack == 7 ) |
{ |
strcpy(MP3_path, STRING(pev->message)); |
strcat(MP3_path, "/track7.mp3"); |
} |
else if ( PlayedTrack == 8 ) |
{ |
strcpy(MP3_path, STRING(pev->message)); |
strcat(MP3_path, "/track8.mp3"); |
} |
else if ( PlayedTrack == 9 ) |
{ |
strcpy(MP3_path, STRING(pev->message)); |
strcat(MP3_path, "/track9.mp3"); |
} |
//ALERT(at_console, "Piste MP3 %s\n", MP3_path); |
|
int ReadState = UTIL_PlayMP3( MP3_actuel, pev->health,
0, pev->iuser2); |
if ( !ReadState )//the
function a returned 0 because there was no file there |
{ |
ALERT(at_console, "No MP3 at this
path"); |
} |
|
else if ( ReadState != 2 )//
there is a mp3 playing and no priority set, or no mp3 at the path |
{ |
if ( PlayedTrack
== pev->skin )//if we are at the endtrack |
{ |
PlayedTrack = pev->effects;//we go to the loopto track |
} |
else |
{ |
PlayedTrack++;//we go to the next track |
} |
pev->iuser1 = PlayedTrack;//save
the current track |
} |
if ( !(pev->sequence) )//if
we have to play an array of tracks (Single = 0) |
{ |
pev->nextthink = gpGlobals->time
+ 2.0; //next think in 2 seconds |
} |
} |
|
|
|
|
|
|
|
|
|
|
|