bool VEH_StartStrafeRam(Vehicle_t *pVeh, bool Right) { if (!(pVeh->m_ulFlags&VEH_STRAFERAM)) { float speed = VectorLength(pVeh->m_pParentEntity->client->ps.velocity); if (speed>400.0f) { // Compute Pos3 //-------------- vec3_t right; AngleVectors(pVeh->m_vOrientation, 0, right, 0); VectorMA(pVeh->m_pParentEntity->client->ps.velocity, (Right)?( speed):(-speed), right, pVeh->m_pParentEntity->pos3); pVeh->m_ulFlags |= VEH_STRAFERAM; parentPS->hackingTime = (Right)?(STRAFERAM_DURATION):(-STRAFERAM_DURATION); if (pVeh->m_iSoundDebounceTimer<level.time && Q_irand(0,1)==0) { int shiftSound = Q_irand(1,4); switch (shiftSound) { case 1: shiftSound=pVeh->m_pVehicleInfo->soundShift1; break; case 2: shiftSound=pVeh->m_pVehicleInfo->soundShift2; break; case 3: shiftSound=pVeh->m_pVehicleInfo->soundShift3; break; case 4: shiftSound=pVeh->m_pVehicleInfo->soundShift4; break; } if (shiftSound) { pVeh->m_iSoundDebounceTimer = level.time + Q_irand(1000, 4000); G_SoundIndexOnEnt( pVeh->m_pParentEntity, CHAN_AUTO, shiftSound); } } return true; } } return false; }
void Svcmd_SaberAttackCycle_f( void ) { if ( !&g_entities[0] || !g_entities[0].client ) { return; } gentity_t *self = G_GetSelfForPlayerCmd(); if ( self->s.weapon != WP_SABER ) {// saberAttackCycle button also switches to saber gi.SendConsoleCommand("weapon 1" ); return; } if ( self->client->ps.dualSabers ) {//can't cycle styles with dualSabers, so just toggle second saber on/off if ( WP_SaberCanTurnOffSomeBlades( &self->client->ps.saber[1] ) ) {//can turn second saber off if ( self->client->ps.saber[1].ActiveManualOnly() ) {//turn it off qboolean skipThisBlade; for ( int bladeNum = 0; bladeNum < self->client->ps.saber[1].numBlades; bladeNum++ ) { skipThisBlade = qfalse; if ( WP_SaberBladeUseSecondBladeStyle( &self->client->ps.saber[1], bladeNum ) ) {//check to see if we should check the secondary style's flags if ( (self->client->ps.saber[1].saberFlags2&SFL2_NO_MANUAL_DEACTIVATE2) ) { skipThisBlade = qtrue; } } else {//use the primary style's flags if ( (self->client->ps.saber[1].saberFlags2&SFL2_NO_MANUAL_DEACTIVATE) ) { skipThisBlade = qtrue; } } if ( !skipThisBlade ) { self->client->ps.saber[1].BladeActivate( bladeNum, qfalse ); G_SoundIndexOnEnt( self, CHAN_WEAPON, self->client->ps.saber[1].soundOff ); } } } else if ( !self->client->ps.saber[0].ActiveManualOnly() ) {//first one is off, too, so just turn that one on if ( !self->client->ps.saberInFlight ) {//but only if it's in your hand! self->client->ps.saber[0].Activate(); } } else {//turn on the second one self->client->ps.saber[1].Activate(); } return; } } else if ( self->client->ps.saber[0].numBlades > 1 && WP_SaberCanTurnOffSomeBlades( &self->client->ps.saber[0] ) )//self->client->ps.saber[0].type == SABER_STAFF ) {//can't cycle styles with saberstaff, so just toggles saber blades on/off if ( self->client->ps.saberInFlight ) {//can't turn second blade back on if it's in the air, you naughty boy! return; } /* if ( self->client->ps.saber[0].singleBladeStyle == SS_NONE ) {//can't use just one blade? return; } */ qboolean playedSound = qfalse; if ( !self->client->ps.saber[0].blade[0].active ) {//first one is not even on //turn only it on self->client->ps.SaberBladeActivate( 0, 0, qtrue ); return; } qboolean skipThisBlade; for ( int bladeNum = 1; bladeNum < self->client->ps.saber[0].numBlades; bladeNum++ ) { if ( !self->client->ps.saber[0].blade[bladeNum].active ) {//extra is off, turn it on self->client->ps.saber[0].BladeActivate( bladeNum, qtrue ); } else {//turn extra off skipThisBlade = qfalse; if ( WP_SaberBladeUseSecondBladeStyle( &self->client->ps.saber[1], bladeNum ) ) {//check to see if we should check the secondary style's flags if ( (self->client->ps.saber[1].saberFlags2&SFL2_NO_MANUAL_DEACTIVATE2) ) { skipThisBlade = qtrue; } } else {//use the primary style's flags if ( (self->client->ps.saber[1].saberFlags2&SFL2_NO_MANUAL_DEACTIVATE) ) { skipThisBlade = qtrue; } } if ( !skipThisBlade ) { self->client->ps.saber[0].BladeActivate( bladeNum, qfalse ); if ( !playedSound ) { G_SoundIndexOnEnt( self, CHAN_WEAPON, self->client->ps.saber[0].soundOff ); playedSound = qtrue; } } } } return; } int allowedStyles = self->client->ps.saberStylesKnown; if ( self->client->ps.dualSabers && self->client->ps.saber[0].Active() && self->client->ps.saber[1].Active() ) { allowedStyles |= (1<<SS_DUAL); for ( int styleNum = SS_NONE+1; styleNum < SS_NUM_SABER_STYLES; styleNum++ ) { if ( styleNum == SS_TAVION && ((self->client->ps.saber[0].stylesLearned&(1<<SS_TAVION))||(self->client->ps.saber[1].stylesLearned&(1<<SS_TAVION)))//was given this style by one of my sabers && !(self->client->ps.saber[0].stylesForbidden&(1<<SS_TAVION)) && !(self->client->ps.saber[1].stylesForbidden&(1<<SS_TAVION)) ) {//if have both sabers on, allow tavion only if one of our sabers specifically wanted to use it... (unless specifically forbidden) } else if ( styleNum == SS_DUAL && !(self->client->ps.saber[0].stylesForbidden&(1<<SS_DUAL)) && !(self->client->ps.saber[1].stylesForbidden&(1<<SS_DUAL)) ) {//if have both sabers on, only dual style is allowed (unless specifically forbidden) } else { allowedStyles &= ~(1<<styleNum); } } } if ( !allowedStyles ) { return; } int saberAnimLevel; if ( !self->s.number ) { saberAnimLevel = cg.saberAnimLevelPending; } else { saberAnimLevel = self->client->ps.saberAnimLevel; } saberAnimLevel++; int sanityCheck = 0; while ( self->client->ps.saberAnimLevel != saberAnimLevel && !(allowedStyles&(1<<saberAnimLevel)) && sanityCheck < SS_NUM_SABER_STYLES+1 ) { saberAnimLevel++; if ( saberAnimLevel > SS_STAFF ) { saberAnimLevel = SS_FAST; } sanityCheck++; } if ( !(allowedStyles&(1<<saberAnimLevel)) ) { return; } WP_UseFirstValidSaberStyle( self, &saberAnimLevel ); if ( !self->s.number ) { cg.saberAnimLevelPending = saberAnimLevel; } else { self->client->ps.saberAnimLevel = saberAnimLevel; } #ifndef FINAL_BUILD switch ( saberAnimLevel ) { case SS_FAST: gi.Printf( S_COLOR_BLUE"Lightsaber Combat Style: Fast\n" ); //LIGHTSABERCOMBATSTYLE_FAST break; case SS_MEDIUM: gi.Printf( S_COLOR_YELLOW"Lightsaber Combat Style: Medium\n" ); //LIGHTSABERCOMBATSTYLE_MEDIUM break; case SS_STRONG: gi.Printf( S_COLOR_RED"Lightsaber Combat Style: Strong\n" ); //LIGHTSABERCOMBATSTYLE_STRONG break; case SS_DESANN: gi.Printf( S_COLOR_CYAN"Lightsaber Combat Style: Desann\n" ); //LIGHTSABERCOMBATSTYLE_DESANN break; case SS_TAVION: gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Tavion\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; case SS_DUAL: gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Dual\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; case SS_STAFF: gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Staff\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; } //gi.Printf("\n"); #endif }
//MP RULE - ALL PROCESSMOVECOMMANDS FUNCTIONS MUST BE BG-COMPATIBLE!!! //If you really need to violate this rule for SP, then use ifdefs. //By BG-compatible, I mean no use of game-specific data - ONLY use //stuff available in the MP bgEntity (in SP, the bgEntity is #defined //as a gentity, but the MP-compatible access restrictions are based //on the bgEntity structure in the MP codebase) -rww // ProcessMoveCommands the Vehicle. static void ProcessMoveCommands( Vehicle_t *pVeh ) { /************************************************************************************/ /* BEGIN Here is where we move the vehicle (forward or back or whatever). BEGIN */ /************************************************************************************/ //Client sets ucmds and such for speed alterations float speedInc, speedIdleDec, speedIdle, speedIdleAccel, speedMin, speedMax; playerState_t *parentPS; playerState_t *pilotPS = NULL; int curTime; #ifdef _JK2MP parentPS = pVeh->m_pParentEntity->playerState; if (pVeh->m_pPilot) { pilotPS = pVeh->m_pPilot->playerState; } #else parentPS = &pVeh->m_pParentEntity->client->ps; if (pVeh->m_pPilot) { pilotPS = &pVeh->m_pPilot->client->ps; } #endif // If we're flying, make us accelerate at 40% (about half) acceleration rate, and restore the pitch // to origin (straight) position (at 5% increments). if ( pVeh->m_ulFlags & VEH_FLYING ) { speedInc = pVeh->m_pVehicleInfo->acceleration * pVeh->m_fTimeModifier * 0.4f; } #ifdef _JK2MP else if ( !parentPS->m_iVehicleNum ) #else else if ( !pVeh->m_pVehicleInfo->Inhabited( pVeh ) ) #endif {//drifts to a stop speedInc = 0; //pVeh->m_ucmd.forwardmove = 127; } else { speedInc = pVeh->m_pVehicleInfo->acceleration * pVeh->m_fTimeModifier; } speedIdleDec = pVeh->m_pVehicleInfo->decelIdle * pVeh->m_fTimeModifier; #ifndef _JK2MP//SP curTime = level.time; #elif QAGAME//MP GAME curTime = level.time; #elif CGAME//MP CGAME //FIXME: pass in ucmd? Not sure if this is reliable... curTime = pm->cmd.serverTime; #endif if ( (pVeh->m_pPilot /*&& (pilotPS->weapon == WP_NONE || pilotPS->weapon == WP_MELEE )*/ && (pVeh->m_ucmd.buttons & BUTTON_ALT_ATTACK) && pVeh->m_pVehicleInfo->turboSpeed) #ifdef _JK2MP || (parentPS && parentPS->electrifyTime > curTime && pVeh->m_pVehicleInfo->turboSpeed) //make them go! #endif ) { #ifdef _JK2MP if ( (parentPS && parentPS->electrifyTime > curTime) || (pVeh->m_pPilot->playerState && (pVeh->m_pPilot->playerState->weapon == WP_MELEE || (pVeh->m_pPilot->playerState->weapon == WP_SABER && pVeh->m_pPilot->playerState->saberHolstered))) ) { #endif if ((curTime - pVeh->m_iTurboTime)>pVeh->m_pVehicleInfo->turboRecharge) { pVeh->m_iTurboTime = (curTime + pVeh->m_pVehicleInfo->turboDuration); if (pVeh->m_pVehicleInfo->iTurboStartFX) { int i; for (i=0; (i<MAX_VEHICLE_EXHAUSTS && pVeh->m_iExhaustTag[i]!=-1); i++) { #ifndef _JK2MP//SP // Start The Turbo Fx Start //-------------------------- G_PlayEffect(pVeh->m_pVehicleInfo->iTurboStartFX, pVeh->m_pParentEntity->playerModel, pVeh->m_iExhaustTag[i], pVeh->m_pParentEntity->s.number, pVeh->m_pParentEntity->currentOrigin ); // Start The Looping Effect //-------------------------- if (pVeh->m_pVehicleInfo->iTurboFX) { G_PlayEffect(pVeh->m_pVehicleInfo->iTurboFX, pVeh->m_pParentEntity->playerModel, pVeh->m_iExhaustTag[i], pVeh->m_pParentEntity->s.number, pVeh->m_pParentEntity->currentOrigin, pVeh->m_pVehicleInfo->turboDuration, qtrue); } #else #ifdef QAGAME if (pVeh->m_pParentEntity && pVeh->m_pParentEntity->ghoul2 && pVeh->m_pParentEntity->playerState) { //fine, I'll use a tempent for this, but only because it's played only once at the start of a turbo. vec3_t boltOrg, boltDir; mdxaBone_t boltMatrix; VectorSet(boltDir, 0.0f, pVeh->m_pParentEntity->playerState->viewangles[YAW], 0.0f); trap_G2API_GetBoltMatrix(pVeh->m_pParentEntity->ghoul2, 0, pVeh->m_iExhaustTag[i], &boltMatrix, boltDir, pVeh->m_pParentEntity->playerState->origin, level.time, NULL, pVeh->m_pParentEntity->modelScale); BG_GiveMeVectorFromMatrix(&boltMatrix, ORIGIN, boltOrg); BG_GiveMeVectorFromMatrix(&boltMatrix, ORIGIN, boltDir); G_PlayEffectID(pVeh->m_pVehicleInfo->iTurboStartFX, boltOrg, boltDir); } #endif #endif } } #ifndef _JK2MP //kill me now if (pVeh->m_pVehicleInfo->soundTurbo) { G_SoundIndexOnEnt(pVeh->m_pParentEntity, CHAN_AUTO, pVeh->m_pVehicleInfo->soundTurbo); } #endif parentPS->speed = pVeh->m_pVehicleInfo->turboSpeed; // Instantly Jump To Turbo Speed } #ifdef _JK2MP } #endif } // Slide Breaking if (pVeh->m_ulFlags&VEH_SLIDEBREAKING) { if (pVeh->m_ucmd.forwardmove>=0 #ifndef _JK2MP || ((level.time - pVeh->m_pParentEntity->lastMoveTime)>500) #endif ) { pVeh->m_ulFlags &= ~VEH_SLIDEBREAKING; } parentPS->speed = 0; } else if ( (curTime > pVeh->m_iTurboTime) && !(pVeh->m_ulFlags&VEH_FLYING) && pVeh->m_ucmd.forwardmove<0 && fabs(pVeh->m_vOrientation[ROLL])>25.0f) { pVeh->m_ulFlags |= VEH_SLIDEBREAKING; } if ( curTime < pVeh->m_iTurboTime ) { speedMax = pVeh->m_pVehicleInfo->turboSpeed; if (parentPS) { parentPS->eFlags |= EF_JETPACK_ACTIVE; } } else { speedMax = pVeh->m_pVehicleInfo->speedMax; if (parentPS) { parentPS->eFlags &= ~EF_JETPACK_ACTIVE; } } speedIdle = pVeh->m_pVehicleInfo->speedIdle; speedIdleAccel = pVeh->m_pVehicleInfo->accelIdle * pVeh->m_fTimeModifier; speedMin = pVeh->m_pVehicleInfo->speedMin; if ( parentPS->speed || parentPS->groundEntityNum == ENTITYNUM_NONE || pVeh->m_ucmd.forwardmove || pVeh->m_ucmd.upmove > 0 ) { if ( pVeh->m_ucmd.forwardmove > 0 && speedInc ) { parentPS->speed += speedInc; } else if ( pVeh->m_ucmd.forwardmove < 0 ) { if ( parentPS->speed > speedIdle ) { parentPS->speed -= speedInc; } else if ( parentPS->speed > speedMin ) { parentPS->speed -= speedIdleDec; } } // No input, so coast to stop. else if ( parentPS->speed > 0.0f ) { parentPS->speed -= speedIdleDec; if ( parentPS->speed < 0.0f ) { parentPS->speed = 0.0f; } } else if ( parentPS->speed < 0.0f ) { parentPS->speed += speedIdleDec; if ( parentPS->speed > 0.0f ) { parentPS->speed = 0.0f; } } } else { if ( !pVeh->m_pVehicleInfo->strafePerc #ifdef _JK2MP || (0 && pVeh->m_pParentEntity->s.number < MAX_CLIENTS) ) #else || (!g_speederControlScheme->value && !pVeh->m_pParentEntity->s.number) ) #endif {//if in a strafe-capable vehicle, clear strafing unless using alternate control scheme //pVeh->m_ucmd.rightmove = 0; } } if ( parentPS->speed > speedMax ) { parentPS->speed = speedMax; } else if ( parentPS->speed < speedMin ) { parentPS->speed = speedMin; } #ifndef _JK2MP // In SP, The AI Pilots Can Directly Control The Speed Of Their Bike In Order To // Match The Speed Of The Person They Are Trying To Chase //------------------------------------------------------------------------------- if (pVeh->m_pPilot && (pVeh->m_ucmd.buttons&BUTTON_VEH_SPEED)) { parentPS->speed = pVeh->m_pPilot->client->ps.speed; } #endif /********************************************************************************/ /* END Here is where we move the vehicle (forward or back or whatever). END */ /********************************************************************************/ }
//MP RULE - ALL PROCESSMOVECOMMANDS FUNCTIONS MUST BE BG-COMPATIBLE!!! //If you really need to violate this rule for SP, then use ifdefs. //By BG-compatible, I mean no use of game-specific data - ONLY use //stuff available in the MP bgEntity (in SP, the bgEntity is #defined //as a gentity, but the MP-compatible access restrictions are based //on the bgEntity structure in the MP codebase) -rww // ProcessMoveCommands the Vehicle. static void ProcessMoveCommands( Vehicle_t *pVeh ) { /************************************************************************************/ /* BEGIN Here is where we move the vehicle (forward or back or whatever). BEGIN */ /************************************************************************************/ //Client sets ucmds and such for speed alterations float speedInc, speedIdleDec, speedIdle, speedIdleAccel, speedMin, speedMax; float fWalkSpeedMax; int curTime; bgEntity_t *parent = pVeh->m_pParentEntity; #ifdef _JK2MP playerState_t *parentPS = parent->playerState; #else playerState_t *parentPS = &parent->client->ps; #endif #ifndef _JK2MP//SP curTime = level.time; #elif QAGAME//MP GAME curTime = level.time; #elif CGAME//MP CGAME //FIXME: pass in ucmd? Not sure if this is reliable... curTime = pm->cmd.serverTime; #endif #ifndef _JK2MP //bad for prediction - fixme // Bucking so we can't do anything. if ( pVeh->m_ulFlags & VEH_BUCKING || pVeh->m_ulFlags & VEH_FLYING || pVeh->m_ulFlags & VEH_CRASHING ) { //#ifdef QAGAME //this was in Update above // ((gentity_t *)parent)->client->ps.speed = 0; //#endif parentPS->speed = 0; return; } #endif speedIdleDec = pVeh->m_pVehicleInfo->decelIdle * pVeh->m_fTimeModifier; speedMax = pVeh->m_pVehicleInfo->speedMax; speedIdle = pVeh->m_pVehicleInfo->speedIdle; speedIdleAccel = pVeh->m_pVehicleInfo->accelIdle * pVeh->m_fTimeModifier; speedMin = pVeh->m_pVehicleInfo->speedMin; if ( pVeh->m_pPilot /*&& (pilotPS->weapon == WP_NONE || pilotPS->weapon == WP_MELEE )*/ && (pVeh->m_ucmd.buttons & BUTTON_ALT_ATTACK) && pVeh->m_pVehicleInfo->turboSpeed ) { if ((curTime - pVeh->m_iTurboTime)>pVeh->m_pVehicleInfo->turboRecharge) { pVeh->m_iTurboTime = (curTime + pVeh->m_pVehicleInfo->turboDuration); #ifndef _JK2MP //kill me now if (pVeh->m_pVehicleInfo->soundTurbo) { G_SoundIndexOnEnt(pVeh->m_pParentEntity, CHAN_AUTO, pVeh->m_pVehicleInfo->soundTurbo); } #endif parentPS->speed = pVeh->m_pVehicleInfo->turboSpeed; // Instantly Jump To Turbo Speed } } if ( curTime < pVeh->m_iTurboTime ) { speedMax = pVeh->m_pVehicleInfo->turboSpeed; } else { speedMax = pVeh->m_pVehicleInfo->speedMax; } #ifdef _JK2MP if ( !parentPS->m_iVehicleNum ) #else if ( !pVeh->m_pVehicleInfo->Inhabited( pVeh ) ) #endif {//drifts to a stop speedInc = speedIdle * pVeh->m_fTimeModifier; VectorClear( parentPS->moveDir ); //m_ucmd.forwardmove = 127; parentPS->speed = 0; } else { speedInc = pVeh->m_pVehicleInfo->acceleration * pVeh->m_fTimeModifier; } if ( parentPS->speed || parentPS->groundEntityNum == ENTITYNUM_NONE || pVeh->m_ucmd.forwardmove || pVeh->m_ucmd.upmove > 0 ) { if ( pVeh->m_ucmd.forwardmove > 0 && speedInc ) { parentPS->speed += speedInc; } else if ( pVeh->m_ucmd.forwardmove < 0 ) { if ( parentPS->speed > speedIdle ) { parentPS->speed -= speedInc; } else if ( parentPS->speed > speedMin ) { parentPS->speed -= speedIdleDec; } } // No input, so coast to stop. else if ( parentPS->speed > 0.0f ) { parentPS->speed -= speedIdleDec; if ( parentPS->speed < 0.0f ) { parentPS->speed = 0.0f; } } else if ( parentPS->speed < 0.0f ) { parentPS->speed += speedIdleDec; if ( parentPS->speed > 0.0f ) { parentPS->speed = 0.0f; } } } else { if ( pVeh->m_ucmd.forwardmove < 0 ) { pVeh->m_ucmd.forwardmove = 0; } if ( pVeh->m_ucmd.upmove < 0 ) { pVeh->m_ucmd.upmove = 0; } //pVeh->m_ucmd.rightmove = 0; /*if ( !pVeh->m_pVehicleInfo->strafePerc || (!g_speederControlScheme->value && !parent->s.number) ) {//if in a strafe-capable vehicle, clear strafing unless using alternate control scheme pVeh->m_ucmd.rightmove = 0; }*/ } fWalkSpeedMax = speedMax * 0.275f; if ( curTime>pVeh->m_iTurboTime && (pVeh->m_ucmd.buttons & BUTTON_WALKING) && parentPS->speed > fWalkSpeedMax ) { parentPS->speed = fWalkSpeedMax; } else if ( parentPS->speed > speedMax ) { parentPS->speed = speedMax; } else if ( parentPS->speed < speedMin ) { parentPS->speed = speedMin; } /********************************************************************************/ /* END Here is where we move the vehicle (forward or back or whatever). END */ /********************************************************************************/ }
void Svcmd_SaberAttackCycle_f( void ) { if ( !&g_entities[0] || !g_entities[0].client ) { return; } gentity_t *self = G_GetSelfForPlayerCmd(); if ( self->s.weapon != WP_SABER ) {// saberAttackCycle button also switches to saber gi.SendConsoleCommand("weapon 1" ); return; } if ( self->client->ps.dualSabers ) {//can't cycle styles with dualSabers, so just toggle second saber on/off if ( self->client->ps.saber[1].Active() ) {//turn it off self->client->ps.saber[1].Deactivate(); G_SoundIndexOnEnt( self, CHAN_WEAPON, self->client->ps.saber[0].soundOff ); } else if ( !self->client->ps.saber[0].Active() ) {//first one is off, too, so just turn that one on if ( !self->client->ps.saberInFlight ) {//but only if it's in your hand! self->client->ps.saber[0].Activate(); } } else {//turn on the second one self->client->ps.saber[1].Activate(); } return; } else if ( self->client->ps.saber[0].numBlades > 1 )//self->client->ps.saber[0].type == SABER_STAFF ) {//can't cycle styles with saberstaff, so just toggles saber blades on/off if ( self->client->ps.saberInFlight ) {//can't turn second blade back on if it's in the air, you naughty boy! return; } qboolean playedSound = qfalse; if ( !self->client->ps.saber[0].blade[0].active ) {//first one is not even on //turn only it on self->client->ps.SaberBladeActivate( 0, 0, qtrue ); return; } for ( int i = 1; i < self->client->ps.saber[0].numBlades; i++ ) { if ( !self->client->ps.saber[0].blade[i].active ) {//extra is off, turn it on self->client->ps.SaberBladeActivate( 0, i, qtrue ); } else {//turn extra off self->client->ps.SaberBladeActivate( 0, i, qfalse ); if ( !playedSound ) { G_SoundIndexOnEnt( self, CHAN_WEAPON, self->client->ps.saber[0].soundOff ); playedSound = qtrue; } } } return; } //FIXME: if dualSabers and both on, do something here, too... maybe toggle the second one on/off? if ( !self->client->ps.saberStylesKnown ) { return; } int saberAnimLevel; if ( !self->s.number ) { saberAnimLevel = cg.saberAnimLevelPending; } else { saberAnimLevel = self->client->ps.saberAnimLevel; } saberAnimLevel++; int sanityCheck = 0; while ( self->client->ps.saberAnimLevel != saberAnimLevel && !(self->client->ps.saberStylesKnown&(1<<saberAnimLevel)) && sanityCheck < SS_NUM_SABER_STYLES+1 ) { saberAnimLevel++; if ( saberAnimLevel > SS_STAFF ) { saberAnimLevel = SS_FAST; } sanityCheck++; } if ( !(self->client->ps.saberStylesKnown&(1<<saberAnimLevel)) ) { return; } if ( !self->s.number ) { cg.saberAnimLevelPending = saberAnimLevel; } else { self->client->ps.saberAnimLevel = saberAnimLevel; } #ifndef FINAL_BUILD switch ( saberAnimLevel ) { case SS_FAST: gi.Printf( S_COLOR_BLUE"Lightsaber Combat Style: Fast\n" ); //LIGHTSABERCOMBATSTYLE_FAST break; case SS_MEDIUM: gi.Printf( S_COLOR_YELLOW"Lightsaber Combat Style: Medium\n" ); //LIGHTSABERCOMBATSTYLE_MEDIUM break; case SS_STRONG: gi.Printf( S_COLOR_RED"Lightsaber Combat Style: Strong\n" ); //LIGHTSABERCOMBATSTYLE_STRONG break; case SS_DESANN: gi.Printf( S_COLOR_CYAN"Lightsaber Combat Style: Desann\n" ); //LIGHTSABERCOMBATSTYLE_DESANN break; case SS_TAVION: gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Tavion\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; case SS_DUAL: gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Dual\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; case SS_STAFF: gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Staff\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; } //gi.Printf("\n"); #endif }