/* ================== Cmd_LevelShot_f This is just to help generate the level pictures for the menus. It goes to the intermission immediately and sends over a command to the client to resize the view, hide the scoreboard, and take a special screenshot ================== */ void Cmd_LevelShot_f( gentity_t *ent ) { if ( !CheatsOk( ent ) ) { return; } gi.SendServerCommand( ent-g_entities, "clientLevelShot" ); }
/* ================= Cmd_SetObjective_f ================= */ void Cmd_SetObjective_f( gentity_t *ent ) { int objectiveI,status,displayStatus; if ( gi.argc() == 2 ) { objectiveI = atoi(gi.argv(1)); gi.Printf("objective #%d display status=%d, status=%d\n",objectiveI, ent->client->sess.mission_objectives[objectiveI].display, ent->client->sess.mission_objectives[objectiveI].status ); return; } if ( gi.argc() != 4 ) { gi.SendServerCommand( ent-g_entities, va("print \"usage: setobjective <objective #> <display status> <status>\n\"")); return; } if ( !CheatsOk( ent ) ) { return; } objectiveI = atoi(gi.argv(1)); displayStatus = atoi(gi.argv(2)); status = atoi(gi.argv(3)); ent->client->sess.mission_objectives[objectiveI].display = displayStatus; ent->client->sess.mission_objectives[objectiveI].status = status; }
void Cmd_Give_f( gentity_t *ent ) { if ( !CheatsOk( ent ) ) { return; } G_Give( ent, gi.argv(1), ConcatArgs( 2 ), gi.argc() ); }
/* ================== Cmd_LevelShot_f This is just to help generate the level pictures for the menus. It goes to the intermission immediately and sends over a command to the client to resize the view, hide the scoreboard, and take a special screenshot ================== */ void Cmd_LevelShot_f( gentity_t *ent ) { if ( !CheatsOk( ent ) ) { return; } // doesn't work in single player if ( g_gametype.integer != 0 ) { trap_SendServerCommand( ent-g_entities, "print \"Must be in g_gametype 0 for levelshot\n\"" ); return; } BeginIntermission(); trap_SendServerCommand( ent-g_entities, "clientLevelShot" ); }
/* ================== Cmd_Notarget_f Sets client to notarget argv(0) notarget ================== */ void Cmd_Notarget_f( gentity_t *ent ) { char *msg; if ( !CheatsOk( ent ) ) { return; } ent->flags ^= FL_NOTARGET; if (!(ent->flags & FL_NOTARGET) ) msg = "notarget OFF\n"; else msg = "notarget ON\n"; gi.SendServerCommand( ent-g_entities, "print \"%s\"", msg); }
/* * Cmd_Notarget_f * * Sets client to notarget * * argv(0) notarget */ void Cmd_Notarget_f(Gentity *ent) { char *msg; if(!CheatsOk(ent)) return; ent->flags ^= FL_NOTARGET; if(!(ent->flags & FL_NOTARGET)) msg = "notarget OFF\n"; else msg = "notarget ON\n"; trap_SendServerCommand(ent-g_entities, va("print \"%s\"", msg)); }
/* ================== Cmd_Noclip_f argv(0) noclip ================== */ void Cmd_Noclip_f( gentity_t *ent ) { char *msg; if ( !CheatsOk( ent ) ) { return; } if ( ent->client->noclip ) { msg = "noclip OFF\n"; } else { msg = "noclip ON\n"; } ent->client->noclip = !ent->client->noclip; gi.SendServerCommand( ent-g_entities, "print \"%s\"", msg); }
/* ================== Cmd_God_f Sets client to godmode argv(0) god ================== */ void Cmd_God_f (gentity_t *ent) { char *msg; if ( !CheatsOk( ent ) ) { return; } ent->flags ^= FL_GODMODE; if (!(ent->flags & FL_GODMODE) ) msg = "godmode OFF\n"; else msg = "godmode ON\n"; gi.SendServerCommand( ent-g_entities, "print \"%s\"", msg); }
/* * Cmd_God_f * * Sets client to godmode * * argv(0) god */ void Cmd_God_f(Gentity *ent) { char *msg; if(!CheatsOk(ent)) return; ent->flags ^= FL_GODMODE; if(!(ent->flags & FL_GODMODE)) msg = "godmode OFF\n"; else msg = "godmode ON\n"; trap_SendServerCommand(ent-g_entities, va("print \"%s\"", msg)); }
/* * Cmd_Noclip_f * * argv(0) noclip */ void Cmd_Noclip_f(Gentity *ent) { char *msg; if(!CheatsOk(ent)) return; if(ent->client->noclip) msg = "noclip OFF\n"; else msg = "noclip ON\n"; ent->client->noclip = !ent->client->noclip; trap_SendServerCommand(ent-g_entities, va("print \"%s\"", msg)); }
/* ================== Cmd_Undying_f Sets client to undead mode argv(0) undying ================== */ void Cmd_Undying_f (gentity_t *ent) { char *msg; if ( !CheatsOk( ent ) ) { return; } ent->flags ^= FL_UNDYING; if (!(ent->flags & FL_UNDYING) ) { msg = "undead mode OFF\n"; } else { int max; char *cmd; cmd = gi.argv(1); if ( cmd && atoi( cmd ) ) { max = atoi( cmd ); } else { max = 999; } ent->health = ent->max_health = max; msg = "undead mode ON\n"; if ( ent->client ) { ent->client->ps.stats[STAT_HEALTH] = ent->client->ps.stats[STAT_MAX_HEALTH] = 999; } } gi.SendServerCommand( ent-g_entities, "print \"%s\"", msg); }
/* ================== Cmd_LevelShot_f This is just to help generate the level pictures for the menus. It goes to the intermission immediately and sends over a command to the client to resize the view, hide the scoreboard, and take a special screenshot ================== */ void Cmd_LevelShot_f(gentity_t *ent) { if(!ent->client->pers.localClient) { trap_SendServerCommand(ent-g_entities, "print \"The levelshot command must be executed by a local client\n\""); return; } if(!CheatsOk(ent)) return; // doesn't work in single player if(g_gametype.integer == GT_SINGLE_PLAYER) { trap_SendServerCommand(ent-g_entities, "print \"Must not be in singleplayer mode for levelshot\n\"" ); return; } BeginIntermission(); trap_SendServerCommand(ent-g_entities, "clientLevelShot"); }
/* * Cmd_Give_f * * Give items to a client */ void Cmd_Give_f(Gentity *ent) { char *name; Gitem *it; int i; qbool give_all; Gentity *it_ent; Trace trace; if(!CheatsOk(ent)) return; name = ConcatArgs(1); if(Q_stricmp(name, "all") == 0) give_all = qtrue; else give_all = qfalse; if(give_all || Q_stricmp(name, "health") == 0){ ent->health = ent->client->ps.stats[STAT_MAX_HEALTH]; if(!give_all) return; } if(give_all || Q_stricmp(name, "weapons") == 0){ /* * Give all weapons except hook and Wnone */ ent->client->ps.stats[STAT_PRIWEAPS] = (1<<Wnumweaps) - 1 - (1<<Whook) - (1<<Wnone); ent->client->ps.stats[STAT_SECWEAPS] = (1<<Wnumweaps) - 1 - (1<<Whook) - (1<<Wnone); if(!give_all) return; } if(give_all || Q_stricmp(name, "ammo") == 0){ for(i = Wnone+1; i < Wnumweaps; i++) if(i != Whook && i != Wmelee) ent->client->ps.ammo[i] = 5000; if(!give_all) return; } if(give_all || Q_stricmp(name, "armor") == 0){ ent->client->ps.stats[STAT_SHIELD] = 5000; if(!give_all) return; } if(Q_stricmp(name, "excellent") == 0){ ent->client->ps.persistant[PERS_EXCELLENT_COUNT]++; return; } if(Q_stricmp(name, "impressive") == 0){ ent->client->ps.persistant[PERS_IMPRESSIVE_COUNT]++; return; } if(Q_stricmp(name, "gauntletaward") == 0){ ent->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT]++; return; } if(Q_stricmp(name, "defend") == 0){ ent->client->ps.persistant[PERS_DEFEND_COUNT]++; return; } if(Q_stricmp(name, "assist") == 0){ ent->client->ps.persistant[PERS_ASSIST_COUNT]++; return; } /* spawn a specific item right on the player */ if(!give_all){ it = BG_FindItem(name); if(!it) return; it_ent = G_Spawn(); copyv3(ent->r.currentOrigin, it_ent->s.origin); it_ent->classname = it->classname; G_SpawnItem (it_ent, it); FinishSpawningItem(it_ent); memset(&trace, 0, sizeof(trace)); Touch_Item (it_ent, ent, &trace); if(it_ent->inuse) G_FreeEntity(it_ent); } }
/* ================== Cmd_Give_f Give items to a client ================== */ void Cmd_Give_f (gentity_t *ent) { char *name; gitem_t *it; int i; qboolean give_all; gentity_t *it_ent; trace_t trace; if ( !CheatsOk( ent ) ) { return; } name = ConcatArgs( 1 ); if (Q_stricmp(name, "all") == 0) give_all = qtrue; else give_all = qfalse; if (give_all || Q_stricmp(name, "force") == 0) { if ( ent->client ) { ent->client->ps.forcePower = FORCE_POWER_MAX; } if (!give_all) return; } if (give_all || Q_stricmp(gi.argv(1), "health") == 0) { if (gi.argc() == 3) { ent->health = atoi(gi.argv(2)); if (ent->health > ent->client->ps.stats[STAT_MAX_HEALTH]) { ent->health = ent->client->ps.stats[STAT_MAX_HEALTH]; } } else { ent->health = ent->client->ps.stats[STAT_MAX_HEALTH]; } if (!give_all) return; } if (give_all || Q_stricmp(name, "inventory") == 0) { // Huh? Was doing a INV_MAX+1 which was wrong because then you'd actually have every inventory item including INV_MAX ent->client->ps.stats[STAT_ITEMS] = (1 << (INV_MAX)) - ( 1 << INV_ELECTROBINOCULARS ); ent->client->ps.inventory[INV_ELECTROBINOCULARS] = 1; ent->client->ps.inventory[INV_BACTA_CANISTER] = 5; ent->client->ps.inventory[INV_SEEKER] = 5; ent->client->ps.inventory[INV_LIGHTAMP_GOGGLES] = 1; ent->client->ps.inventory[INV_SENTRY] = 5; ent->client->ps.inventory[INV_GOODIE_KEY] = 5; ent->client->ps.inventory[INV_SECURITY_KEY] = 5; if (!give_all) { return; } } if (give_all || Q_stricmp(name, "weapons") == 0) { ent->client->ps.stats[STAT_WEAPONS] = (1 << (MAX_PLAYER_WEAPONS+1)) - ( 1 << WP_NONE ); // ent->client->ps.stats[STAT_WEAPONS] |= (1 << (WP_MELEE)); if (!give_all) return; } if ( !give_all && Q_stricmp(gi.argv(1), "weaponnum") == 0 ) { ent->client->ps.stats[STAT_WEAPONS] |= (1 << atoi(gi.argv(2))); return; } if ( Q_stricmp(name, "eweaps") == 0) //for developing, gives you all the weapons, including enemy { ent->client->ps.stats[STAT_WEAPONS] = (unsigned)(1 << WP_NUM_WEAPONS) - ( 1 << WP_NONE ); // NOTE: this wasn't giving the last weapon in the list if (!give_all) return; } if (give_all || Q_stricmp(name, "ammo") == 0) { for ( i = 0 ; i < AMMO_MAX ; i++ ) { ent->client->ps.ammo[i] = ammoData[i].max; } if (!give_all) return; } if (give_all || Q_stricmp(gi.argv(1), "batteries") == 0) { if (gi.argc() == 3) ent->client->ps.batteryCharge = atoi(gi.argv(2)); else ent->client->ps.batteryCharge = MAX_BATTERIES; if (!give_all) return; } if (give_all || Q_stricmp(gi.argv(1), "armor") == 0) { if (gi.argc() == 3) ent->client->ps.stats[STAT_ARMOR] = atoi(gi.argv(2)); else ent->client->ps.stats[STAT_ARMOR] = ent->client->ps.stats[STAT_MAX_HEALTH]; if ( ent->client->ps.stats[STAT_ARMOR] > 0 ) { ent->client->ps.powerups[PW_BATTLESUIT] = Q3_INFINITE; } else { ent->client->ps.powerups[PW_BATTLESUIT] = 0; } if (!give_all) return; } // spawn a specific item right on the player if ( !give_all ) { it = FindItem (name); if (!it) { name = gi.argv(1); it = FindItem (name); if (!it) { gi.SendServerCommand( ent-g_entities, "print \"unknown item\n\""); return; } } it_ent = G_Spawn(); VectorCopy( ent->currentOrigin, it_ent->s.origin ); it_ent->classname = it->classname; G_SpawnItem (it_ent, it); FinishSpawningItem(it_ent ); memset( &trace, 0, sizeof( trace ) ); Touch_Item (it_ent, ent, &trace); if (it_ent->inuse) { G_FreeEntity( it_ent ); } } }
/* ================= 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 ); } } }
/* ================== Cmd_Give_f Give items to a client ================== */ void Cmd_Give_f (gentity_t *ent) { char *name; gitem_t *it; int i; qboolean give_all; gentity_t *it_ent; trace_t trace; if ( !CheatsOk( ent ) ) { return; } name = ConcatArgs( 1 ); if (Q_stricmp(name, "all") == 0) give_all = qtrue; else give_all = qfalse; if (give_all || Q_stricmp( name, "health") == 0) { ent->health = ent->client->ps.stats[STAT_MAX_HEALTH]; if (!give_all) return; } if (give_all || Q_stricmp(name, "weapons") == 0) { ent->client->ps.stats[STAT_WEAPONS] = (1 << WP_NUM_WEAPONS) - 1 - ( 1 << WP_GRAPPLING_HOOK ) - ( 1 << WP_NONE ); if (!give_all) return; } if (give_all || Q_stricmp(name, "ammo") == 0) { for ( i = 0 ; i < MAX_WEAPONS ; i++ ) { ent->client->ps.ammo[i] = 999; } if (!give_all) return; } if (give_all || Q_stricmp(name, "armor") == 0) { ent->client->ps.stats[STAT_ARMOR] = 200; if (!give_all) return; } if (Q_stricmp(name, "excellent") == 0) { ent->client->ps.persistant[PERS_EXCELLENT_COUNT]++; return; } if (Q_stricmp(name, "impressive") == 0) { ent->client->ps.persistant[PERS_IMPRESSIVE_COUNT]++; return; } if (Q_stricmp(name, "gauntletaward") == 0) { ent->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT]++; return; } if (Q_stricmp(name, "defend") == 0) { ent->client->ps.persistant[PERS_DEFEND_COUNT]++; return; } if (Q_stricmp(name, "assist") == 0) { ent->client->ps.persistant[PERS_ASSIST_COUNT]++; return; } // spawn a specific item right on the player if ( !give_all ) { it = BG_FindItem (name); if (!it) { return; } it_ent = G_Spawn(); VectorCopy( ent->r.currentOrigin, it_ent->s.origin ); it_ent->classname = it->classname; G_SpawnItem (it_ent, it); FinishSpawningItem(it_ent ); memset( &trace, 0, sizeof( trace ) ); Touch_Item (it_ent, ent, &trace); if (it_ent->inuse) { G_FreeEntity( it_ent ); } } }