void MusicDirector::ExecFrame() { if (no_music) return; AutoThreadSync a(sync); if (next_track && !track) { track = next_track; next_track = 0; } if (track) { if (track->IsDone()) { if (mode != NONE && mode != SHUTDOWN && next_track == 0) { GetNextTrack(track->GetIndex()+1); } delete track; track = next_track; next_track = 0; } else if (track->IsLooped()) { if (mode != NONE && mode != SHUTDOWN && next_track == 0) { GetNextTrack(track->GetIndex()+1); } track->FadeOut(); track->ExecFrame(); } else { track->ExecFrame(); } } if (next_track) { if (next_track->IsDone()) { delete next_track; next_track = 0; } else if (next_track->IsLooped()) { next_track->FadeOut(); next_track->ExecFrame(); } else { next_track->ExecFrame(); } } }
void Reached_Tramcar( gentity_t *ent ) { gentity_t *next; float speed; vec3_t move; float length; // copy the apropriate values next = ent->nextTrain; if ( !next || !next->nextTrain ) { return; // just stop } // Rafael if ( next->wait == -1 && next->count ) { // G_Printf ("stoped wait = -1 count %i\n",next->count); return; } if ( !Q_stricmp( ent->classname, "props_me109" ) ) { vec3_t vec, angles; float diff; if ( next->spawnflags & 8 ) { // laps next->count--; if ( !next->count ) { next->count = next->count2; GetNextTrack( ent ); Think_SetupAirplaneWaypoints( ent ); next = ent->nextTrain; G_Printf( "changed track to %s\n", next->targetname ); } else { G_Printf( "%s lap %i\n", next->targetname, next->count ); } } else if ( ( next->spawnflags & 1 ) && !( next->count ) && ent->health > 0 ) { // SCRIPT flag GetNextTrack( ent ); Think_SetupAirplaneWaypoints( ent ); } else if ( ( next->spawnflags & 2 ) && ( ent->spawnflags & 8 ) && ent->health <= 0 && ent->takedamage ) { // death path ent->takedamage = qfalse; GetNextTrack( ent ); Think_SetupAirplaneWaypoints( ent ); } else if ( ( next->spawnflags & 4 ) ) { // explode the plane ExplodePlaneSndFx( ent ); ent->s.modelindex = crash_part; // spawn the wing at the player effect ent->nextTrain = NULL; G_UseTargets( next, NULL ); return; } VectorSubtract( ent->nextTrain->nextTrain->s.origin, ent->r.currentOrigin, vec ); vectoangles( vec, angles ); diff = AngleSubtract( ent->r.currentAngles [YAW], angles[YAW] ); // diff = AngleSubtract (ent->TargetAngles [YAW], angles[YAW]); ent->rotate[1] = 1; ent->angle = -diff; //if (angles[YAW] == 0) // ent->s.apos.trDuration = ent->s.pos.trDuration; //else // ent->s.apos.trDuration = 1000; { VectorCopy( next->s.origin, ent->pos1 ); VectorCopy( next->nextTrain->s.origin, ent->pos2 ); // if the path_corner has a speed, use that if ( next->speed ) { speed = next->speed; } else { // otherwise use the train's speed speed = ent->speed; } if ( speed < 1 ) { speed = 1; } // calculate duration VectorSubtract( ent->pos2, ent->pos1, move ); length = VectorLength( move ); ent->s.apos.trDuration = length * 1000 / speed; //testing // ent->gDuration = ent->s.apos.trDuration; ent->gDurationBack = ent->gDuration = ent->s.apos.trDuration; // ent->gDeltaBack = ent->gDelta = } VectorClear( ent->s.apos.trDelta ); SetMoverState( ent, MOVER_1TO2ROTATE, level.time ); VectorCopy( ent->r.currentAngles, ent->s.apos.trBase ); trap_LinkEntity( ent ); ent->think = props_me109_think; ent->nextthink = level.time + 50; } else if ( !Q_stricmp( ent->classname, "truck_cam" ) ) { G_Printf( "target: %s\n", next->targetname ); if ( next->spawnflags & 2 ) { // END ent->s.loopSound = 0; // stop sound ent->nextTrain = NULL; return; } else { vec3_t vec, angles; float diff; if ( next->spawnflags & 4 ) { // reverse ent->props_frame_state = truck_reverse; VectorSubtract( ent->r.currentOrigin, ent->nextTrain->nextTrain->s.origin, vec ); } else { ent->props_frame_state = truck_moving; VectorSubtract( ent->nextTrain->nextTrain->s.origin, ent->r.currentOrigin, vec ); } vectoangles( vec, angles ); diff = AngleSubtract( ent->r.currentAngles [YAW], angles[YAW] ); ent->rotate[1] = 1; ent->angle = -diff; if ( angles[YAW] == 0 ) { ent->s.apos.trDuration = ent->s.pos.trDuration; } else { ent->s.apos.trDuration = 1000; } //testing ent->gDuration = ent->s.pos.trDuration; VectorClear( ent->s.apos.trDelta ); SetMoverState( ent, MOVER_1TO2ROTATE, level.time ); VectorCopy( ent->r.currentAngles, ent->s.apos.trBase ); trap_LinkEntity( ent ); } if ( next->wait == -1 ) { ent->props_frame_state = truck_idle; } if ( next->count2 == 1 ) { ent->props_frame_state = truck_gear1; } else if ( next->count2 == 2 ) { ent->props_frame_state = truck_gear2; } else if ( next->count2 == 3 ) { ent->props_frame_state = truck_gear3; } switch ( ent->props_frame_state ) { case truck_idle: ent->s.loopSound = truck_idle_snd; break; case truck_gear1: ent->s.loopSound = truck_gear1_snd; break; case truck_gear2: ent->s.loopSound = truck_gear2_snd; break; case truck_gear3: ent->s.loopSound = truck_gear3_snd; break; case truck_reverse: ent->s.loopSound = truck_reverse_snd; break; case truck_moving: ent->s.loopSound = truck_moving_snd; break; case truck_breaking: ent->s.loopSound = truck_breaking_snd; break; case truck_bouncy1: ent->s.loopSound = truck_bouncy1_snd; break; case truck_bouncy2: ent->s.loopSound = truck_bouncy2_snd; break; case truck_bouncy3: ent->s.loopSound = truck_bouncy3_snd; break; } //testing ent->s.loopSound = truck_sound; ent->think = truck_cam_think; ent->nextthink = level.time + ( FRAMETIME / 2 ); } else if ( !Q_stricmp( ent->classname, "camera_cam" ) ) { } // fire all other targets G_UseTargets( next, NULL ); // set the new trajectory ent->nextTrain = next->nextTrain; if ( next->wait == -1 ) { next->count = 1; } VectorCopy( next->s.origin, ent->pos1 ); VectorCopy( next->nextTrain->s.origin, ent->pos2 ); // if the path_corner has a speed, use that if ( next->speed ) { speed = next->speed; } else { // otherwise use the train's speed speed = ent->speed; } if ( speed < 1 ) { speed = 1; } // calculate duration VectorSubtract( ent->pos2, ent->pos1, move ); length = VectorLength( move ); ent->s.pos.trDuration = length * 1000 / speed; //testing // ent->gDuration = ent->s.pos.trDuration; ent->gDurationBack = ent->gDuration = ent->s.pos.trDuration; // ent->gDeltaBack = ent->gDelta = ; // looping sound if ( next->soundLoop ) { ent->s.loopSound = next->soundLoop; } // start it going SetMoverState( ent, MOVER_1TO2, level.time ); // if there is a "wait" value on the target, don't start moving yet // if ( next->wait ) if ( next->wait && next->wait != -1 ) { ent->nextthink = level.time + next->wait * 1000; ent->think = Think_BeginMoving; ent->s.pos.trType = TR_STATIONARY; } }