static void Svcmd_SaberColor_f() {//FIXME: just list the colors, each additional listing sets that blade int saberNum = atoi(gi.argv(1)); char *color[MAX_BLADES]; int bladeNum; for ( bladeNum = 0; bladeNum < MAX_BLADES; bladeNum++ ) { color[bladeNum] = gi.argv(2+bladeNum); } if ( !VALIDSTRING( color ) || saberNum < 1 || saberNum > 2 ) { gi.Printf( "Usage: saberColor <saberNum> <blade1 color> <blade2 color> ... <blade8 color> \n" ); gi.Printf( "valid saberNums: 1 or 2\n" ); gi.Printf( "valid colors: red, orange, yellow, green, blue, and purple\n" ); return; } saberNum--; gentity_t *self = G_GetSelfForPlayerCmd(); for ( bladeNum = 0; bladeNum < MAX_BLADES; bladeNum++ ) { if ( !color[bladeNum] || !color[bladeNum][0] ) { break; } else { self->client->ps.saber[saberNum].blade[bladeNum].color = TranslateSaberColor( color[bladeNum] ); } } if ( saberNum == 0 ) { gi.cvar_set( "g_saber_color", color[0] ); } else if ( saberNum == 1 ) { gi.cvar_set( "g_saber2_color", color[0] ); } }
static void Svcmd_SaberColor_f() { char *color = gi.argv(1); if ( !VALIDSTRING( color )) { gi.Printf( "Usage: saberColor <color>\n" ); gi.Printf( "valid colors: red, orange, yellow, green, blue, and purple\n" ); return; } gentity_t *self = G_GetSelfForPlayerCmd(); if ( !Q_stricmp( color, "red" )) { self->client->ps.saberColor = SABER_RED; } else if ( !Q_stricmp( color, "green" )) { self->client->ps.saberColor = SABER_GREEN; } else if ( !Q_stricmp( color, "yellow" )) { self->client->ps.saberColor = SABER_YELLOW; } else if ( !Q_stricmp( color, "orange" )) { self->client->ps.saberColor = SABER_ORANGE; } else if ( !Q_stricmp( color, "purple" )) { self->client->ps.saberColor = SABER_PURPLE; } else if ( !Q_stricmp( color, "blue" )) { self->client->ps.saberColor = SABER_BLUE; } else { gi.Printf( "Usage: saberColor <color>\n" ); gi.Printf( "valid colors: red, orange, yellow, green, blue, and purple\n" ); } }
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 }
/* ================= ClientCommand ================= */ void ClientCommand( int clientNum ) { gentity_t *ent; char *cmd; ent = g_entities + clientNum; if ( !ent->client ) { return; // not fully in game yet } cmd = gi.argv(0); if (Q_stricmp (cmd, "spawn") == 0) { Cmd_Spawn( ent ); return; } if (Q_stricmp (cmd, "give") == 0) Cmd_Give_f (ent); else if (Q_stricmp (cmd, "god") == 0) Cmd_God_f (ent); else if (Q_stricmp (cmd, "undying") == 0) Cmd_Undying_f (ent); else if (Q_stricmp (cmd, "notarget") == 0) Cmd_Notarget_f (ent); else if (Q_stricmp (cmd, "noclip") == 0) { Cmd_Noclip_f (ent); } else if (Q_stricmp (cmd, "kill") == 0) { if ( !CheatsOk( ent ) ) { return; } Cmd_Kill_f (ent); } else if (Q_stricmp (cmd, "levelshot") == 0) Cmd_LevelShot_f (ent); else if (Q_stricmp (cmd, "where") == 0) Cmd_Where_f (ent); else if (Q_stricmp (cmd, "setviewpos") == 0) Cmd_SetViewpos_f( ent ); else if (Q_stricmp (cmd, "setobjective") == 0) Cmd_SetObjective_f( ent ); else if (Q_stricmp (cmd, "viewobjective") == 0) Cmd_ViewObjective_f( ent ); else if (Q_stricmp (cmd, "force_throw") == 0) { ent = G_GetSelfForPlayerCmd(); ForceThrow( ent, qfalse ); } else if (Q_stricmp (cmd, "force_pull") == 0) { ent = G_GetSelfForPlayerCmd(); ForceThrow( ent, qtrue ); } else if (Q_stricmp (cmd, "force_speed") == 0) { ent = G_GetSelfForPlayerCmd(); ForceSpeed( ent ); } else if (Q_stricmp (cmd, "force_heal") == 0) { ent = G_GetSelfForPlayerCmd(); ForceHeal( ent ); } else if (Q_stricmp (cmd, "force_grip") == 0) { ent = G_GetSelfForPlayerCmd(); ForceGrip( ent ); } else if (Q_stricmp (cmd, "force_distract") == 0) { ent = G_GetSelfForPlayerCmd(); ForceTelepathy( ent ); } else if (Q_stricmp (cmd, "taunt") == 0) { ent = G_GetSelfForPlayerCmd(); G_Taunt( ent ); } else if (Q_stricmp (cmd, "victory") == 0) G_Victory( ent ); // else if (Q_stricmp (cmd, "use_shield") == 0) // sounds like the design doc states that the shields will be a pickup and so the player never decides whether to use them or not. // G_ActivatePersonalShield( ent ); // If you want shields (armor), type "give all" or "give armor" or "give armor #amt#" else if (Q_stricmp (cmd, "fly_xwing") == 0) G_PilotXWing( ent ); else if (Q_stricmp (cmd, "drive_atst") == 0) { if ( CheatsOk( ent ) ) { G_DriveATST( ent, NULL ); } } else if (Q_stricmp (cmd, "thereisnospoon") == 0) G_StartMatrixEffect( ent ); else if (Q_stricmp (cmd, "use_electrobinoculars") == 0) Cmd_UseElectrobinoculars_f( ent ); else if (Q_stricmp (cmd, "use_bacta") == 0) Cmd_UseBacta_f( ent ); else if (Q_stricmp (cmd, "use_seeker") == 0) Cmd_UseSeeker_f( ent ); else if (Q_stricmp (cmd, "use_lightamp_goggles") == 0) Cmd_UseGoggles_f( ent ); else if (Q_stricmp (cmd, "use_sentry") == 0) Cmd_UseSentry_f( ent ); else if (Q_stricmp (cmd, "fx") == 0) Cmd_Fx( ent ); else if (Q_stricmp (cmd, "invuse") == 0) { Cmd_UseInventory_f( ent ); } else if (Q_stricmp (cmd, "playmusic") == 0) { char *cmd2 = gi.argv(1); if ( cmd2 ) { gi.SetConfigstring( CS_MUSIC, cmd2 ); } } }
/* ================= ClientCommand ================= */ void ClientCommand( int clientNum ) { gentity_t *ent; const char *cmd; ent = g_entities + clientNum; if ( !ent->client ) { return; // not fully in game yet } cmd = gi.argv(0); if (Q_stricmp (cmd, "spawn") == 0) { Cmd_Spawn( ent ); return; } if (Q_stricmp (cmd, "give") == 0) Cmd_Give_f (ent); else if (Q_stricmp (cmd, "god") == 0) Cmd_God_f (ent); else if (Q_stricmp (cmd, "undying") == 0) Cmd_Undying_f (ent); else if (Q_stricmp (cmd, "notarget") == 0) Cmd_Notarget_f (ent); else if (Q_stricmp (cmd, "noclip") == 0) { Cmd_Noclip_f (ent); } else if (Q_stricmp (cmd, "kill") == 0) { if ( !CheatsOk( ent ) ) { return; } Cmd_Kill_f (ent); } else if (Q_stricmp (cmd, "levelshot") == 0) Cmd_LevelShot_f (ent); else if (Q_stricmp (cmd, "where") == 0) Cmd_Where_f (ent); else if (Q_stricmp (cmd, "setviewpos") == 0) Cmd_SetViewpos_f( ent ); else if (Q_stricmp (cmd, "setobjective") == 0) Cmd_SetObjective_f( ent ); else if (Q_stricmp (cmd, "viewobjective") == 0) Cmd_ViewObjective_f( ent ); else if (Q_stricmp (cmd, "force_throw") == 0) { ent = G_GetSelfForPlayerCmd(); ForceThrow( ent, qfalse ); } else if (Q_stricmp (cmd, "force_pull") == 0) { ent = G_GetSelfForPlayerCmd(); ForceThrow( ent, qtrue ); } else if (Q_stricmp (cmd, "force_speed") == 0) { ent = G_GetSelfForPlayerCmd(); ForceSpeed( ent ); } else if (Q_stricmp (cmd, "force_heal") == 0) { ent = G_GetSelfForPlayerCmd(); ForceHeal( ent ); } else if (Q_stricmp (cmd, "force_grip") == 0) { ent = G_GetSelfForPlayerCmd(); ForceGrip( ent ); } else if (Q_stricmp (cmd, "force_distract") == 0) { ent = G_GetSelfForPlayerCmd(); ForceTelepathy( ent ); } else if (Q_stricmp (cmd, "force_rage") == 0) { ent = G_GetSelfForPlayerCmd(); ForceRage(ent); } else if (Q_stricmp (cmd, "force_protect") == 0) { ent = G_GetSelfForPlayerCmd(); ForceProtect(ent); } else if (Q_stricmp (cmd, "force_absorb") == 0) { ent = G_GetSelfForPlayerCmd(); ForceAbsorb(ent); } else if (Q_stricmp (cmd, "force_sight") == 0) { ent = G_GetSelfForPlayerCmd(); ForceSeeing(ent); } else if (Q_stricmp (cmd, "addsaberstyle") == 0) { ent = G_GetSelfForPlayerCmd(); if ( !ent || !ent->client ) {//wtf? return; } if ( gi.argc() < 2 ) { gi.SendServerCommand( ent-g_entities, va("print \"usage: addsaberstyle <saber style>\n\"")); gi.SendServerCommand( ent-g_entities, va("print \"Valid styles: SS_FAST, SS_MEDIUM, SS_STRONG, SS_DESANN, SS_TAVION, SS_DUAL and SS_STAFF\n\"")); return; } int addStyle = GetIDForString( SaberStyleTable, gi.argv(1) ); if ( addStyle > SS_NONE && addStyle < SS_STAFF ) { ent->client->ps.saberStylesKnown |= (1<<addStyle); } } else if (Q_stricmp (cmd, "setsaberstyle") == 0) { ent = G_GetSelfForPlayerCmd(); if ( !ent || !ent->client ) {//wtf? return; } if ( gi.argc() < 2 ) { gi.SendServerCommand( ent-g_entities, va("print \"usage: setsaberstyle <saber style>\n\"")); gi.SendServerCommand( ent-g_entities, va("print \"Valid styles: SS_FAST, SS_MEDIUM, SS_STRONG, SS_DESANN, SS_TAVION, SS_DUAL and SS_STAFF\n\"")); return; } int setStyle = GetIDForString( SaberStyleTable, gi.argv(1) ); if ( setStyle > SS_NONE && setStyle < SS_STAFF ) { ent->client->ps.saberStylesKnown = (1<<setStyle); cg.saberAnimLevelPending = ent->client->ps.saberAnimLevel = setStyle; } } else if (Q_stricmp (cmd, "taunt") == 0) { ent = G_GetSelfForPlayerCmd(); // G_Taunt( ent ); G_SetTauntAnim( ent, TAUNT_TAUNT ); } else if (Q_stricmp (cmd, "bow") == 0) { ent = G_GetSelfForPlayerCmd(); G_SetTauntAnim( ent, TAUNT_BOW ); } else if (Q_stricmp (cmd, "meditate") == 0) { ent = G_GetSelfForPlayerCmd(); G_SetTauntAnim( ent, TAUNT_MEDITATE ); } else if (Q_stricmp (cmd, "flourish") == 0) { ent = G_GetSelfForPlayerCmd(); G_SetTauntAnim( ent, TAUNT_FLOURISH ); } else if (Q_stricmp (cmd, "gloat") == 0) { ent = G_GetSelfForPlayerCmd(); G_SetTauntAnim( ent, TAUNT_GLOAT ); } /* else if (Q_stricmp (cmd, "drive") == 0) { if ( !CheatsOk( ent ) ) { return; } if ( gi.argc() < 2 ) { gi.SendServerCommand( ent-g_entities, va("print \"usage: drive <vehicle name>\n\"")); gi.SendServerCommand( ent-g_entities, va("print \"Vehicles will be in vehicles.cfg, try using 'speeder' for now\n\"")); return; } G_DriveVehicle( ent, NULL, gi.argv(1) ); } */ else if (Q_stricmp (cmd, "NPCdrive") == 0) { if ( !CheatsOk( ent ) ) { return; } if ( gi.argc() < 3 ) { gi.SendServerCommand( ent-g_entities, va("print \"usage: drive <NPC_targetname> <vehicle name>\n\"")); gi.SendServerCommand( ent-g_entities, va("print \"Vehicles will be in vehicles.cfg, try using 'speeder' for now\n\"")); return; } gentity_t *found = G_Find( NULL, FOFS(targetname), gi.argv(1) ); if ( found && found->health > 0 && found->client ) { // TEMPORARY! BRING BACK LATER!!! //G_DriveVehicle( found, NULL, gi.argv(2) ); } } else if (Q_stricmp (cmd, "thereisnospoon") == 0) G_StartMatrixEffect( ent ); else if (Q_stricmp (cmd, "use_electrobinoculars") == 0) Cmd_UseElectrobinoculars_f( ent ); else if (Q_stricmp (cmd, "use_bacta") == 0) Cmd_UseBacta_f( ent ); else if (Q_stricmp (cmd, "use_seeker") == 0) Cmd_UseSeeker_f( ent ); else if (Q_stricmp (cmd, "use_lightamp_goggles") == 0) Cmd_UseGoggles_f( ent ); else if (Q_stricmp (cmd, "use_sentry") == 0) Cmd_UseSentry_f( ent ); else if (Q_stricmp (cmd, "fx") == 0) Cmd_Fx( ent ); else if (Q_stricmp (cmd, "invuse") == 0) { Cmd_UseInventory_f( ent ); } else if (Q_stricmp (cmd, "playmusic") == 0) { const char *cmd2 = gi.argv(1); if ( cmd2 ) { gi.SetConfigstring( CS_MUSIC, cmd2 ); } } else if (Q_stricmp (cmd, "flushcam") == 0) { Cmd_FlushCamFile_f( ent ); } else if ( Q_stricmp( cmd, "dropsaber" ) == 0 ) { const char *cmd2 = gi.argv(1); int saberNum = 2;//by default, drop both if ( cmd2 && cmd2[0] ) { saberNum = atoi(cmd2); } if ( saberNum > 1 ) {//drop both Cmd_SaberDrop_f( ent, 1 ); Cmd_SaberDrop_f( ent, 0 ); } else {//drop either left or right Cmd_SaberDrop_f( ent, saberNum ); } } }
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 ) { return; } int saberAnimLevel; if ( !self->s.number ) { saberAnimLevel = cg.saberAnimLevelPending; } else { saberAnimLevel = self->client->ps.saberAnimLevel; } saberAnimLevel++; if ( self->client->ps.forcePowerLevel[FP_SABER_OFFENSE] == FORCE_LEVEL_1 ) { saberAnimLevel = FORCE_LEVEL_2; } else if ( self->client->ps.forcePowerLevel[FP_SABER_OFFENSE] == FORCE_LEVEL_2 ) { if ( saberAnimLevel > FORCE_LEVEL_2 ) { saberAnimLevel = FORCE_LEVEL_1; } } else {//level 3 if ( saberAnimLevel > self->client->ps.forcePowerLevel[FP_SABER_OFFENSE] ) {//wrap around saberAnimLevel = FORCE_LEVEL_1; } } if ( !self->s.number ) { cg.saberAnimLevelPending = saberAnimLevel; } else { self->client->ps.saberAnimLevel = saberAnimLevel; } #ifndef FINAL_BUILD switch ( saberAnimLevel ) { case FORCE_LEVEL_1: gi.Printf( S_COLOR_BLUE"Lightsaber Combat Style: Fast\n" ); //LIGHTSABERCOMBATSTYLE_FAST break; case FORCE_LEVEL_2: gi.Printf( S_COLOR_YELLOW"Lightsaber Combat Style: Medium\n" ); //LIGHTSABERCOMBATSTYLE_MEDIUM break; case FORCE_LEVEL_3: gi.Printf( S_COLOR_RED"Lightsaber Combat Style: Strong\n" ); //LIGHTSABERCOMBATSTYLE_STRONG break; case FORCE_LEVEL_4: gi.Printf( S_COLOR_CYAN"Lightsaber Combat Style: Desann\n" ); //LIGHTSABERCOMBATSTYLE_DESANN break; case FORCE_LEVEL_5: gi.Printf( S_COLOR_MAGENTA"Lightsaber Combat Style: Tavion\n" ); //LIGHTSABERCOMBATSTYLE_TAVION break; } //gi.Printf("\n"); #endif }
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 }