123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511 |
- /*
- ===========================================================================
- Doom 3 GPL Source Code
- Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
- This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
- Doom 3 Source Code is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- Doom 3 Source Code is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
- In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
- If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
- ===========================================================================
- */
- #include "../../idlib/precompiled.h"
- #pragma hdrstop
- #include "../Game_local.h"
- #include "TypeInfo.h"
- /*
- ==================
- Cmd_GetFloatArg
- ==================
- */
- float Cmd_GetFloatArg( const idCmdArgs &args, int &argNum ) {
- const char *value;
- value = args.Argv( argNum++ );
- return atof( value );
- }
- /*
- ===================
- Cmd_EntityList_f
- ===================
- */
- void Cmd_EntityList_f( const idCmdArgs &args ) {
- int e;
- idEntity *check;
- int count;
- size_t size;
- idStr match;
- if ( args.Argc() > 1 ) {
- match = args.Args();
- match.Replace( " ", "" );
- } else {
- match = "";
- }
- count = 0;
- size = 0;
- gameLocal.Printf( "%-4s %-20s %-20s %s\n", " Num", "EntityDef", "Class", "Name" );
- gameLocal.Printf( "--------------------------------------------------------------------\n" );
- for( e = 0; e < MAX_GENTITIES; e++ ) {
- check = gameLocal.entities[ e ];
- if ( !check ) {
- continue;
- }
- if ( !check->name.Filter( match, true ) ) {
- continue;
- }
- gameLocal.Printf( "%4i: %-20s %-20s %s\n", e,
- check->GetEntityDefName(), check->GetClassname(), check->name.c_str() );
- count++;
- size += check->spawnArgs.Allocated();
- }
- gameLocal.Printf( "...%d entities\n...%d bytes of spawnargs\n", count, size );
- }
- /*
- ===================
- Cmd_ActiveEntityList_f
- ===================
- */
- void Cmd_ActiveEntityList_f( const idCmdArgs &args ) {
- idEntity *check;
- int count;
- count = 0;
- gameLocal.Printf( "%-4s %-20s %-20s %s\n", " Num", "EntityDef", "Class", "Name" );
- gameLocal.Printf( "--------------------------------------------------------------------\n" );
- for( check = gameLocal.activeEntities.Next(); check != NULL; check = check->activeNode.Next() ) {
- char dormant = check->fl.isDormant ? '-' : ' ';
- gameLocal.Printf( "%4i:%c%-20s %-20s %s\n", check->entityNumber, dormant, check->GetEntityDefName(), check->GetClassname(), check->name.c_str() );
- count++;
- }
- gameLocal.Printf( "...%d active entities\n", count );
- }
- /*
- ===================
- Cmd_ListSpawnArgs_f
- ===================
- */
- void Cmd_ListSpawnArgs_f( const idCmdArgs &args ) {
- int i;
- idEntity *ent;
- ent = gameLocal.FindEntity( args.Argv( 1 ) );
- if ( !ent ) {
- gameLocal.Printf( "entity not found\n" );
- return;
- }
- for ( i = 0; i < ent->spawnArgs.GetNumKeyVals(); i++ ) {
- const idKeyValue *kv = ent->spawnArgs.GetKeyVal( i );
- gameLocal.Printf( "\"%s\" "S_COLOR_WHITE"\"%s\"\n", kv->GetKey().c_str(), kv->GetValue().c_str() );
- }
- }
- /*
- ===================
- Cmd_ReloadScript_f
- ===================
- */
- void Cmd_ReloadScript_f( const idCmdArgs &args ) {
- // shutdown the map because entities may point to script objects
- gameLocal.MapShutdown();
- // recompile the scripts
- gameLocal.program.Startup( SCRIPT_DEFAULT );
- #ifdef _D3XP
- // loads a game specific main script file
- idStr gamedir;
- int i;
- for ( i = 0; i < 2; i++ ) {
- if ( i == 0 ) {
- gamedir = cvarSystem->GetCVarString( "fs_game_base" );
- } else if ( i == 1 ) {
- gamedir = cvarSystem->GetCVarString( "fs_game" );
- }
- if ( gamedir.Length() > 0 ) {
- idStr scriptFile = va( "script/%s_main.script", gamedir.c_str() );
- if ( fileSystem->ReadFile(scriptFile.c_str(), NULL) > 0 ) {
- gameLocal.program.CompileFile( scriptFile.c_str() );
- gameLocal.program.FinishCompilation();
- }
- }
- }
- #endif
- // error out so that the user can rerun the scripts
- gameLocal.Error( "Exiting map to reload scripts" );
- }
- /*
- ===================
- Cmd_Script_f
- ===================
- */
- void Cmd_Script_f( const idCmdArgs &args ) {
- const char * script;
- idStr text;
- idStr funcname;
- static int funccount = 0;
- idThread * thread;
- const function_t *func;
- idEntity *ent;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- sprintf( funcname, "ConsoleFunction_%d", funccount++ );
- script = args.Args();
- sprintf( text, "void %s() {%s;}\n", funcname.c_str(), script );
- if ( gameLocal.program.CompileText( "console", text, true ) ) {
- func = gameLocal.program.FindFunction( funcname );
- if ( func ) {
- // set all the entity names in case the user named one in the script that wasn't referenced in the default script
- for( ent = gameLocal.spawnedEntities.Next(); ent != NULL; ent = ent->spawnNode.Next() ) {
- gameLocal.program.SetEntity( ent->name, ent );
- }
- thread = new idThread( func );
- thread->Start();
- }
- }
- }
- /*
- ==================
- KillEntities
- Kills all the entities of the given class in a level.
- ==================
- */
- void KillEntities( const idCmdArgs &args, const idTypeInfo &superClass ) {
- idEntity *ent;
- idStrList ignore;
- const char *name;
- int i;
- if ( !gameLocal.GetLocalPlayer() || !gameLocal.CheatsOk( false ) ) {
- return;
- }
- for( i = 1; i < args.Argc(); i++ ) {
- name = args.Argv( i );
- ignore.Append( name );
- }
- for( ent = gameLocal.spawnedEntities.Next(); ent != NULL; ent = ent->spawnNode.Next() ) {
- if ( ent->IsType( superClass ) ) {
- for( i = 0; i < ignore.Num(); i++ ) {
- if ( ignore[ i ] == ent->name ) {
- break;
- }
- }
- if ( i >= ignore.Num() ) {
- ent->PostEventMS( &EV_Remove, 0 );
- }
- }
- }
- }
- /*
- ==================
- Cmd_KillMonsters_f
- Kills all the monsters in a level.
- ==================
- */
- void Cmd_KillMonsters_f( const idCmdArgs &args ) {
- KillEntities( args, idAI::Type );
- // kill any projectiles as well since they have pointers to the monster that created them
- KillEntities( args, idProjectile::Type );
- }
- /*
- ==================
- Cmd_KillMovables_f
- Kills all the moveables in a level.
- ==================
- */
- void Cmd_KillMovables_f( const idCmdArgs &args ) {
- if ( !gameLocal.GetLocalPlayer() || !gameLocal.CheatsOk( false ) ) {
- return;
- }
- KillEntities( args, idMoveable::Type );
- }
- /*
- ==================
- Cmd_KillRagdolls_f
- Kills all the ragdolls in a level.
- ==================
- */
- void Cmd_KillRagdolls_f( const idCmdArgs &args ) {
- if ( !gameLocal.GetLocalPlayer() || !gameLocal.CheatsOk( false ) ) {
- return;
- }
- KillEntities( args, idAFEntity_Generic::Type );
- KillEntities( args, idAFEntity_WithAttachedHead::Type );
- }
- /*
- ==================
- Cmd_Give_f
- Give items to a client
- ==================
- */
- void Cmd_Give_f( const idCmdArgs &args ) {
- const char *name;
- int i;
- bool give_all;
- idPlayer *player;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- name = args.Argv( 1 );
- if ( idStr::Icmp( name, "all" ) == 0 ) {
- give_all = true;
- } else {
- give_all = false;
- }
- if ( give_all || ( idStr::Cmpn( name, "weapon", 6 ) == 0 ) ) {
- if ( gameLocal.world->spawnArgs.GetBool( "no_Weapons" ) ) {
- gameLocal.world->spawnArgs.SetBool( "no_Weapons", false );
- for( i = 0; i < gameLocal.numClients; i++ ) {
- if ( gameLocal.entities[ i ] ) {
- gameLocal.entities[ i ]->PostEventSec( &EV_Player_SelectWeapon, 0.5f, gameLocal.entities[ i ]->spawnArgs.GetString( "def_weapon1" ) );
- }
- }
- }
- }
- if ( ( idStr::Cmpn( name, "weapon_", 7 ) == 0 ) || ( idStr::Cmpn( name, "item_", 5 ) == 0 ) || ( idStr::Cmpn( name, "ammo_", 5 ) == 0 ) ) {
- player->GiveItem( name );
- return;
- }
- if ( give_all || idStr::Icmp( name, "health" ) == 0 ) {
- player->health = player->inventory.maxHealth;
- if ( !give_all ) {
- return;
- }
- }
- if ( give_all || idStr::Icmp( name, "weapons" ) == 0 ) {
- player->inventory.weapons = BIT( MAX_WEAPONS ) - 1;
- player->CacheWeapons();
- if ( !give_all ) {
- return;
- }
- }
- if ( give_all || idStr::Icmp( name, "ammo" ) == 0 ) {
- for ( i = 0 ; i < AMMO_NUMTYPES; i++ ) {
- player->inventory.ammo[ i ] = player->inventory.MaxAmmoForAmmoClass( player, idWeapon::GetAmmoNameForNum( ( ammo_t )i ) );
- }
- if ( !give_all ) {
- return;
- }
- }
- if ( give_all || idStr::Icmp( name, "armor" ) == 0 ) {
- player->inventory.armor = player->inventory.maxarmor;
- if ( !give_all ) {
- return;
- }
- }
- if ( idStr::Icmp( name, "berserk" ) == 0 ) {
- player->GivePowerUp( BERSERK, SEC2MS( 30.0f ) );
- return;
- }
- if ( idStr::Icmp( name, "invis" ) == 0 ) {
- player->GivePowerUp( INVISIBILITY, SEC2MS( 30.0f ) );
- return;
- }
- #ifdef _D3XP
- if ( idStr::Icmp( name, "invulnerability" ) == 0 ) {
- if ( args.Argc() > 2 ) {
- player->GivePowerUp( INVULNERABILITY, atoi( args.Argv( 2 ) ) );
- }
- else {
- player->GivePowerUp( INVULNERABILITY, 30000 );
- }
- return;
- }
- if ( idStr::Icmp( name, "helltime" ) == 0 ) {
- if ( args.Argc() > 2 ) {
- player->GivePowerUp( HELLTIME, atoi( args.Argv( 2 ) ) );
- }
- else {
- player->GivePowerUp( HELLTIME, 30000 );
- }
- return;
- }
- if ( idStr::Icmp( name, "envirosuit" ) == 0 ) {
- if ( args.Argc() > 2 ) {
- player->GivePowerUp( ENVIROSUIT, atoi( args.Argv( 2 ) ) );
- }
- else {
- player->GivePowerUp( ENVIROSUIT, 30000 );
- }
- return;
- }
- #endif
- if ( idStr::Icmp( name, "pda" ) == 0 ) {
- player->GivePDA( args.Argv(2), NULL );
- return;
- }
- if ( idStr::Icmp( name, "video" ) == 0 ) {
- player->GiveVideo( args.Argv(2), NULL );
- return;
- }
- if ( !give_all && !player->Give( args.Argv(1), args.Argv(2) ) ) {
- gameLocal.Printf( "unknown item\n" );
- }
- }
- /*
- ==================
- Cmd_CenterView_f
- Centers the players pitch
- ==================
- */
- void Cmd_CenterView_f( const idCmdArgs &args ) {
- idPlayer *player;
- idAngles ang;
- player = gameLocal.GetLocalPlayer();
- if ( !player ) {
- return;
- }
- ang = player->viewAngles;
- ang.pitch = 0.0f;
- player->SetViewAngles( ang );
- }
- /*
- ==================
- Cmd_God_f
- Sets client to godmode
- argv(0) god
- ==================
- */
- void Cmd_God_f( const idCmdArgs &args ) {
- char *msg;
- idPlayer *player;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( player->godmode ) {
- player->godmode = false;
- msg = "godmode OFF\n";
- } else {
- player->godmode = true;
- msg = "godmode ON\n";
- }
- gameLocal.Printf( "%s", msg );
- }
- /*
- ==================
- Cmd_Notarget_f
- Sets client to notarget
- argv(0) notarget
- ==================
- */
- void Cmd_Notarget_f( const idCmdArgs &args ) {
- char *msg;
- idPlayer *player;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( player->fl.notarget ) {
- player->fl.notarget = false;
- msg = "notarget OFF\n";
- } else {
- player->fl.notarget = true;
- msg = "notarget ON\n";
- }
- gameLocal.Printf( "%s", msg );
- }
- /*
- ==================
- Cmd_Noclip_f
- argv(0) noclip
- ==================
- */
- void Cmd_Noclip_f( const idCmdArgs &args ) {
- char *msg;
- idPlayer *player;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( player->noclip ) {
- msg = "noclip OFF\n";
- } else {
- msg = "noclip ON\n";
- }
- player->noclip = !player->noclip;
- gameLocal.Printf( "%s", msg );
- }
- /*
- =================
- Cmd_Kill_f
- =================
- */
- void Cmd_Kill_f( const idCmdArgs &args ) {
- idPlayer *player;
- if ( gameLocal.isMultiplayer ) {
- if ( gameLocal.isClient ) {
- idBitMsg outMsg;
- byte msgBuf[ MAX_GAME_MESSAGE_SIZE ];
- outMsg.Init( msgBuf, sizeof( msgBuf ) );
- outMsg.WriteByte( GAME_RELIABLE_MESSAGE_KILL );
- networkSystem->ClientSendReliableMessage( outMsg );
- } else {
- player = gameLocal.GetClientByCmdArgs( args );
- if ( !player ) {
- common->Printf( "kill <client nickname> or kill <client index>\n" );
- return;
- }
- player->Kill( false, false );
- cmdSystem->BufferCommandText( CMD_EXEC_NOW, va( "say killed client %d '%s^0'\n", player->entityNumber, gameLocal.userInfo[ player->entityNumber ].GetString( "ui_name" ) ) );
- }
- } else {
- player = gameLocal.GetLocalPlayer();
- if ( !player ) {
- return;
- }
- player->Kill( false, false );
- }
- }
- /*
- =================
- Cmd_PlayerModel_f
- =================
- */
- void Cmd_PlayerModel_f( const idCmdArgs &args ) {
- idPlayer *player;
- const char *name;
- idVec3 pos;
- idAngles ang;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc() < 2 ) {
- gameLocal.Printf( "usage: playerModel <modelname>\n" );
- return;
- }
- name = args.Argv( 1 );
- player->spawnArgs.Set( "model", name );
- pos = player->GetPhysics()->GetOrigin();
- ang = player->viewAngles;
- player->SpawnToPoint( pos, ang );
- }
- /*
- ==================
- Cmd_Say
- ==================
- */
- static void Cmd_Say( bool team, const idCmdArgs &args ) {
- const char *name;
- idStr text;
- const char *cmd = team ? "sayTeam" : "say" ;
- if ( !gameLocal.isMultiplayer ) {
- gameLocal.Printf( "%s can only be used in a multiplayer game\n", cmd );
- return;
- }
- if ( args.Argc() < 2 ) {
- gameLocal.Printf( "usage: %s <text>\n", cmd );
- return;
- }
- text = args.Args();
- if ( text.Length() == 0 ) {
- return;
- }
- if ( text[ text.Length() - 1 ] == '\n' ) {
- text[ text.Length() - 1 ] = '\0';
- }
- name = "player";
- idPlayer * player;
- // here we need to special case a listen server to use the real client name instead of "server"
- // "server" will only appear on a dedicated server
- if ( gameLocal.isClient || cvarSystem->GetCVarInteger( "net_serverDedicated" ) == 0 ) {
- player = gameLocal.localClientNum >= 0 ? static_cast<idPlayer *>( gameLocal.entities[ gameLocal.localClientNum ] ) : NULL;
- if ( player ) {
- name = player->GetUserInfo()->GetString( "ui_name", "player" );
- }
- #ifdef CTF
- // Append the player's location to team chat messages in CTF
- if ( gameLocal.mpGame.IsGametypeFlagBased() && team && player ) {
- idLocationEntity *locationEntity = gameLocal.LocationForPoint( player->GetEyePosition() );
-
- if ( locationEntity ) {
- idStr temp = "[";
- temp += locationEntity->GetLocation();
- temp += "] ";
- temp += text;
- text = temp;
- }
-
- }
- #endif
-
- } else {
- name = "server";
- }
- if ( gameLocal.isClient ) {
- idBitMsg outMsg;
- byte msgBuf[ 256 ];
- outMsg.Init( msgBuf, sizeof( msgBuf ) );
- outMsg.WriteByte( team ? GAME_RELIABLE_MESSAGE_TCHAT : GAME_RELIABLE_MESSAGE_CHAT );
- outMsg.WriteString( name );
- outMsg.WriteString( text, -1, false );
- networkSystem->ClientSendReliableMessage( outMsg );
- } else {
- gameLocal.mpGame.ProcessChatMessage( gameLocal.localClientNum, team, name, text, NULL );
- }
- }
- /*
- ==================
- Cmd_Say_f
- ==================
- */
- static void Cmd_Say_f( const idCmdArgs &args ) {
- Cmd_Say( false, args );
- }
- /*
- ==================
- Cmd_SayTeam_f
- ==================
- */
- static void Cmd_SayTeam_f( const idCmdArgs &args ) {
- Cmd_Say( true, args );
- }
- /*
- ==================
- Cmd_AddChatLine_f
- ==================
- */
- static void Cmd_AddChatLine_f( const idCmdArgs &args ) {
- gameLocal.mpGame.AddChatLine( args.Argv( 1 ) );
- }
- /*
- ==================
- Cmd_Kick_f
- ==================
- */
- static void Cmd_Kick_f( const idCmdArgs &args ) {
- idPlayer *player;
- if ( !gameLocal.isMultiplayer ) {
- gameLocal.Printf( "kick can only be used in a multiplayer game\n" );
- return;
- }
- if ( gameLocal.isClient ) {
- gameLocal.Printf( "You have no such power. This is a server command\n" );
- return;
- }
- player = gameLocal.GetClientByCmdArgs( args );
- if ( !player ) {
- gameLocal.Printf( "usage: kick <client nickname> or kick <client index>\n" );
- return;
- }
- cmdSystem->BufferCommandText( CMD_EXEC_NOW, va( "say kicking out client %d '%s^0'\n", player->entityNumber, gameLocal.userInfo[ player->entityNumber ].GetString( "ui_name" ) ) );
- cmdSystem->BufferCommandText( CMD_EXEC_NOW, va( "kick %d\n", player->entityNumber ) );
- }
- /*
- ==================
- Cmd_GetViewpos_f
- ==================
- */
- void Cmd_GetViewpos_f( const idCmdArgs &args ) {
- idPlayer *player;
- idVec3 origin;
- idMat3 axis;
- player = gameLocal.GetLocalPlayer();
- if ( !player ) {
- return;
- }
- const renderView_t *view = player->GetRenderView();
- if ( view ) {
- gameLocal.Printf( "(%s) %.1f\n", view->vieworg.ToString(), view->viewaxis[0].ToYaw() );
- } else {
- player->GetViewPos( origin, axis );
- gameLocal.Printf( "(%s) %.1f\n", origin.ToString(), axis[0].ToYaw() );
- }
- }
- /*
- =================
- Cmd_SetViewpos_f
- =================
- */
- void Cmd_SetViewpos_f( const idCmdArgs &args ) {
- idVec3 origin;
- idAngles angles;
- int i;
- idPlayer *player;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( ( args.Argc() != 4 ) && ( args.Argc() != 5 ) ) {
- gameLocal.Printf( "usage: setviewpos <x> <y> <z> <yaw>\n" );
- return;
- }
- angles.Zero();
- if ( args.Argc() == 5 ) {
- angles.yaw = atof( args.Argv( 4 ) );
- }
- for ( i = 0 ; i < 3 ; i++ ) {
- origin[i] = atof( args.Argv( i + 1 ) );
- }
- origin.z -= pm_normalviewheight.GetFloat() - 0.25f;
- player->Teleport( origin, angles, NULL );
- }
- /*
- =================
- Cmd_Teleport_f
- =================
- */
- void Cmd_Teleport_f( const idCmdArgs &args ) {
- idVec3 origin;
- idAngles angles;
- idPlayer *player;
- idEntity *ent;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc() != 2 ) {
- gameLocal.Printf( "usage: teleport <name of entity to teleport to>\n" );
- return;
- }
- ent = gameLocal.FindEntity( args.Argv( 1 ) );
- if ( !ent ) {
- gameLocal.Printf( "entity not found\n" );
- return;
- }
- angles.Zero();
- angles.yaw = ent->GetPhysics()->GetAxis()[ 0 ].ToYaw();
- origin = ent->GetPhysics()->GetOrigin();
- player->Teleport( origin, angles, ent );
- }
- /*
- =================
- Cmd_Trigger_f
- =================
- */
- void Cmd_Trigger_f( const idCmdArgs &args ) {
- idVec3 origin;
- idAngles angles;
- idPlayer *player;
- idEntity *ent;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc() != 2 ) {
- gameLocal.Printf( "usage: trigger <name of entity to trigger>\n" );
- return;
- }
- ent = gameLocal.FindEntity( args.Argv( 1 ) );
- if ( !ent ) {
- gameLocal.Printf( "entity not found\n" );
- return;
- }
- ent->Signal( SIG_TRIGGER );
- ent->ProcessEvent( &EV_Activate, player );
- ent->TriggerGuis();
- }
- /*
- ===================
- Cmd_Spawn_f
- ===================
- */
- void Cmd_Spawn_f( const idCmdArgs &args ) {
- const char *key, *value;
- int i;
- float yaw;
- idVec3 org;
- idPlayer *player;
- idDict dict;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk( false ) ) {
- return;
- }
- if ( args.Argc() & 1 ) { // must always have an even number of arguments
- gameLocal.Printf( "usage: spawn classname [key/value pairs]\n" );
- return;
- }
- yaw = player->viewAngles.yaw;
- value = args.Argv( 1 );
- dict.Set( "classname", value );
- dict.Set( "angle", va( "%f", yaw + 180 ) );
- org = player->GetPhysics()->GetOrigin() + idAngles( 0, yaw, 0 ).ToForward() * 80 + idVec3( 0, 0, 1 );
- dict.Set( "origin", org.ToString() );
- for( i = 2; i < args.Argc() - 1; i += 2 ) {
- key = args.Argv( i );
- value = args.Argv( i + 1 );
- dict.Set( key, value );
- }
- gameLocal.SpawnEntityDef( dict );
- }
- /*
- ==================
- Cmd_Damage_f
- Damages the specified entity
- ==================
- */
- void Cmd_Damage_f( const idCmdArgs &args ) {
- if ( !gameLocal.GetLocalPlayer() || !gameLocal.CheatsOk( false ) ) {
- return;
- }
- if ( args.Argc() != 3 ) {
- gameLocal.Printf( "usage: damage <name of entity to damage> <damage>\n" );
- return;
- }
- idEntity *ent = gameLocal.FindEntity( args.Argv( 1 ) );
- if ( !ent ) {
- gameLocal.Printf( "entity not found\n" );
- return;
- }
- ent->Damage( gameLocal.world, gameLocal.world, idVec3( 0, 0, 1 ), "damage_moverCrush", atoi( args.Argv( 2 ) ), INVALID_JOINT );
- }
- /*
- ==================
- Cmd_Remove_f
- Removes the specified entity
- ==================
- */
- void Cmd_Remove_f( const idCmdArgs &args ) {
- if ( !gameLocal.GetLocalPlayer() || !gameLocal.CheatsOk( false ) ) {
- return;
- }
- if ( args.Argc() != 2 ) {
- gameLocal.Printf( "usage: remove <name of entity to remove>\n" );
- return;
- }
- idEntity *ent = gameLocal.FindEntity( args.Argv( 1 ) );
- if ( !ent ) {
- gameLocal.Printf( "entity not found\n" );
- return;
- }
- delete ent;
- }
- /*
- ===================
- Cmd_TestLight_f
- ===================
- */
- void Cmd_TestLight_f( const idCmdArgs &args ) {
- int i;
- idStr filename;
- const char *key, *value, *name;
- idPlayer * player;
- idDict dict;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk( false ) ) {
- return;
- }
- renderView_t *rv = player->GetRenderView();
- float fov = tan( idMath::M_DEG2RAD * rv->fov_x / 2 );
- dict.SetMatrix( "rotation", mat3_default );
- dict.SetVector( "origin", rv->vieworg );
- dict.SetVector( "light_target", rv->viewaxis[0] );
- dict.SetVector( "light_right", rv->viewaxis[1] * -fov );
- dict.SetVector( "light_up", rv->viewaxis[2] * fov );
- dict.SetVector( "light_start", rv->viewaxis[0] * 16 );
- dict.SetVector( "light_end", rv->viewaxis[0] * 1000 );
- if ( args.Argc() >= 2 ) {
- value = args.Argv( 1 );
- filename = args.Argv(1);
- filename.DefaultFileExtension( ".tga" );
- dict.Set( "texture", filename );
- }
- dict.Set( "classname", "light" );
- for( i = 2; i < args.Argc() - 1; i += 2 ) {
- key = args.Argv( i );
- value = args.Argv( i + 1 );
- dict.Set( key, value );
- }
- for ( i = 0; i < MAX_GENTITIES; i++ ) {
- name = va( "spawned_light_%d", i ); // not just light_, or it might pick up a prelight shadow
- if ( !gameLocal.FindEntity( name ) ) {
- break;
- }
- }
- dict.Set( "name", name );
- gameLocal.SpawnEntityDef( dict );
- gameLocal.Printf( "Created new light\n");
- }
- /*
- ===================
- Cmd_TestPointLight_f
- ===================
- */
- void Cmd_TestPointLight_f( const idCmdArgs &args ) {
- const char *key, *value, *name;
- int i;
- idPlayer *player;
- idDict dict;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk( false ) ) {
- return;
- }
- dict.SetVector("origin", player->GetRenderView()->vieworg);
- if ( args.Argc() >= 2 ) {
- value = args.Argv( 1 );
- dict.Set("light", value);
- } else {
- dict.Set("light", "300");
- }
- dict.Set( "classname", "light" );
- for( i = 2; i < args.Argc() - 1; i += 2 ) {
- key = args.Argv( i );
- value = args.Argv( i + 1 );
- dict.Set( key, value );
- }
- for ( i = 0; i < MAX_GENTITIES; i++ ) {
- name = va( "light_%d", i );
- if ( !gameLocal.FindEntity( name ) ) {
- break;
- }
- }
- dict.Set( "name", name );
- gameLocal.SpawnEntityDef( dict );
- gameLocal.Printf( "Created new point light\n");
- }
- /*
- ==================
- Cmd_PopLight_f
- ==================
- */
- void Cmd_PopLight_f( const idCmdArgs &args ) {
- idEntity *ent;
- idMapEntity *mapEnt;
- idMapFile *mapFile = gameLocal.GetLevelMap();
- idLight *lastLight;
- int last;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- bool removeFromMap = ( args.Argc() > 1 );
- lastLight = NULL;
- last = -1;
- for( ent = gameLocal.spawnedEntities.Next(); ent != NULL; ent = ent->spawnNode.Next() ) {
- if ( !ent->IsType( idLight::Type ) ) {
- continue;
- }
- if ( gameLocal.spawnIds[ ent->entityNumber ] > last ) {
- last = gameLocal.spawnIds[ ent->entityNumber ];
- lastLight = static_cast<idLight*>( ent );
- }
- }
- if ( lastLight ) {
- // find map file entity
- mapEnt = mapFile->FindEntity( lastLight->name );
- if ( removeFromMap && mapEnt ) {
- mapFile->RemoveEntity( mapEnt );
- }
- gameLocal.Printf( "Removing light %i\n", lastLight->GetLightDefHandle() );
- delete lastLight;
- } else {
- gameLocal.Printf( "No lights to clear.\n" );
- }
- }
- /*
- ====================
- Cmd_ClearLights_f
- ====================
- */
- void Cmd_ClearLights_f( const idCmdArgs &args ) {
- idEntity *ent;
- idEntity *next;
- idLight *light;
- idMapEntity *mapEnt;
- idMapFile *mapFile = gameLocal.GetLevelMap();
- bool removeFromMap = ( args.Argc() > 1 );
- gameLocal.Printf( "Clearing all lights.\n" );
- for( ent = gameLocal.spawnedEntities.Next(); ent != NULL; ent = next ) {
- next = ent->spawnNode.Next();
- if ( !ent->IsType( idLight::Type ) ) {
- continue;
- }
- light = static_cast<idLight*>( ent );
- mapEnt = mapFile->FindEntity( light->name );
- if ( removeFromMap && mapEnt ) {
- mapFile->RemoveEntity( mapEnt );
- }
- delete light;
- }
- }
- /*
- ==================
- Cmd_TestFx_f
- ==================
- */
- void Cmd_TestFx_f( const idCmdArgs &args ) {
- idVec3 offset;
- const char *name;
- idPlayer * player;
- idDict dict;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- // delete the testModel if active
- if ( gameLocal.testFx ) {
- delete gameLocal.testFx;
- gameLocal.testFx = NULL;
- }
- if ( args.Argc() < 2 ) {
- return;
- }
- name = args.Argv( 1 );
- offset = player->GetPhysics()->GetOrigin() + player->viewAngles.ToForward() * 100.0f;
- dict.Set( "origin", offset.ToString() );
- dict.Set( "test", "1");
- dict.Set( "fx", name );
- gameLocal.testFx = ( idEntityFx * )gameLocal.SpawnEntityType( idEntityFx::Type, &dict );
- }
- #define MAX_DEBUGLINES 128
- typedef struct {
- bool used;
- idVec3 start, end;
- int color;
- bool blink;
- bool arrow;
- } gameDebugLine_t;
- gameDebugLine_t debugLines[MAX_DEBUGLINES];
- /*
- ==================
- Cmd_AddDebugLine_f
- ==================
- */
- static void Cmd_AddDebugLine_f( const idCmdArgs &args ) {
- int i, argNum;
- const char *value;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc () < 7 ) {
- gameLocal.Printf( "usage: addline <x y z> <x y z> <color>\n" );
- return;
- }
- for ( i = 0; i < MAX_DEBUGLINES; i++ ) {
- if ( !debugLines[i].used ) {
- break;
- }
- }
- if ( i >= MAX_DEBUGLINES ) {
- gameLocal.Printf( "no free debug lines\n" );
- return;
- }
- value = args.Argv( 0 );
- if ( !idStr::Icmp( value, "addarrow" ) ) {
- debugLines[i].arrow = true;
- } else {
- debugLines[i].arrow = false;
- }
- debugLines[i].used = true;
- debugLines[i].blink = false;
- argNum = 1;
- debugLines[i].start.x = Cmd_GetFloatArg( args, argNum );
- debugLines[i].start.y = Cmd_GetFloatArg( args, argNum );
- debugLines[i].start.z = Cmd_GetFloatArg( args, argNum );
- debugLines[i].end.x = Cmd_GetFloatArg( args, argNum );
- debugLines[i].end.y = Cmd_GetFloatArg( args, argNum );
- debugLines[i].end.z = Cmd_GetFloatArg( args, argNum );
- debugLines[i].color = Cmd_GetFloatArg( args, argNum );
- }
- /*
- ==================
- Cmd_RemoveDebugLine_f
- ==================
- */
- static void Cmd_RemoveDebugLine_f( const idCmdArgs &args ) {
- int i, num;
- const char *value;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc () < 2 ) {
- gameLocal.Printf( "usage: removeline <num>\n" );
- return;
- }
- value = args.Argv( 1 );
- num = atoi(value);
- for ( i = 0; i < MAX_DEBUGLINES; i++ ) {
- if ( debugLines[i].used ) {
- if ( --num < 0 ) {
- break;
- }
- }
- }
- if ( i >= MAX_DEBUGLINES ) {
- gameLocal.Printf( "line not found\n" );
- return;
- }
- debugLines[i].used = false;
- }
- /*
- ==================
- Cmd_BlinkDebugLine_f
- ==================
- */
- static void Cmd_BlinkDebugLine_f( const idCmdArgs &args ) {
- int i, num;
- const char *value;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc () < 2 ) {
- gameLocal.Printf( "usage: blinkline <num>\n" );
- return;
- }
- value = args.Argv( 1 );
- num = atoi( value );
- for ( i = 0; i < MAX_DEBUGLINES; i++ ) {
- if ( debugLines[i].used ) {
- if ( --num < 0 ) {
- break;
- }
- }
- }
- if ( i >= MAX_DEBUGLINES ) {
- gameLocal.Printf( "line not found\n" );
- return;
- }
- debugLines[i].blink = !debugLines[i].blink;
- }
- /*
- ==================
- PrintFloat
- ==================
- */
- static void PrintFloat( float f ) {
- char buf[128], i;
- for ( i = sprintf( buf, "%3.2f", f ); i < 7; i++ ) {
- buf[i] = ' ';
- }
- buf[i] = '\0';
- gameLocal.Printf( buf );
- }
- /*
- ==================
- Cmd_ListDebugLines_f
- ==================
- */
- static void Cmd_ListDebugLines_f( const idCmdArgs &args ) {
- int i, num;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- num = 0;
- gameLocal.Printf( "line num: x1 y1 z1 x2 y2 z2 c b a\n" );
- for ( i = 0; i < MAX_DEBUGLINES; i++ ) {
- if ( debugLines[i].used ) {
- gameLocal.Printf( "line %3d: ", num );
- PrintFloat( debugLines[i].start.x );
- PrintFloat( debugLines[i].start.y );
- PrintFloat( debugLines[i].start.z );
- PrintFloat( debugLines[i].end.x );
- PrintFloat( debugLines[i].end.y );
- PrintFloat( debugLines[i].end.z );
- gameLocal.Printf( "%d %d %d\n", debugLines[i].color, debugLines[i].blink, debugLines[i].arrow );
- num++;
- }
- }
- if ( !num ) {
- gameLocal.Printf( "no debug lines\n" );
- }
- }
- /*
- ==================
- D_DrawDebugLines
- ==================
- */
- void D_DrawDebugLines( void ) {
- int i;
- idVec3 forward, right, up, p1, p2;
- idVec4 color;
- float l;
- for ( i = 0; i < MAX_DEBUGLINES; i++ ) {
- if ( debugLines[i].used ) {
- if ( !debugLines[i].blink || (gameLocal.time & (1<<9)) ) {
- color = idVec4( debugLines[i].color&1, (debugLines[i].color>>1)&1, (debugLines[i].color>>2)&1, 1 );
- gameRenderWorld->DebugLine( color, debugLines[i].start, debugLines[i].end );
- //
- if ( debugLines[i].arrow ) {
- // draw a nice arrow
- forward = debugLines[i].end - debugLines[i].start;
- l = forward.Normalize() * 0.2f;
- forward.NormalVectors( right, up);
- if ( l > 3.0f ) {
- l = 3.0f;
- }
- p1 = debugLines[i].end - l * forward + (l * 0.4f) * right;
- p2 = debugLines[i].end - l * forward - (l * 0.4f) * right;
- gameRenderWorld->DebugLine( color, debugLines[i].end, p1 );
- gameRenderWorld->DebugLine( color, debugLines[i].end, p2 );
- gameRenderWorld->DebugLine( color, p1, p2 );
- }
- }
- }
- }
- }
- /*
- ==================
- Cmd_ListCollisionModels_f
- ==================
- */
- static void Cmd_ListCollisionModels_f( const idCmdArgs &args ) {
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- collisionModelManager->ListModels();
- }
- /*
- ==================
- Cmd_CollisionModelInfo_f
- ==================
- */
- static void Cmd_CollisionModelInfo_f( const idCmdArgs &args ) {
- const char *value;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc () < 2 ) {
- gameLocal.Printf( "usage: collisionModelInfo <modelNum>\n"
- "use 'all' instead of the model number for accumulated info\n" );
- return;
- }
- value = args.Argv( 1 );
- if ( !idStr::Icmp( value, "all" ) ) {
- collisionModelManager->ModelInfo( -1 );
- } else {
- collisionModelManager->ModelInfo( atoi(value) );
- }
- }
- /*
- ==================
- Cmd_ExportModels_f
- ==================
- */
- static void Cmd_ExportModels_f( const idCmdArgs &args ) {
- idModelExport exporter;
- idStr name;
- // don't allow exporting models when cheats are disabled,
- // but if we're not in the game, it's ok
- if ( gameLocal.GetLocalPlayer() && !gameLocal.CheatsOk( false ) ) {
- return;
- }
- if ( args.Argc() < 2 ) {
- exporter.ExportModels( "def", ".def" );
- } else {
- name = args.Argv( 1 );
- name = "def/" + name;
- name.DefaultFileExtension( ".def" );
- exporter.ExportDefFile( name );
- }
- }
- /*
- ==================
- Cmd_ReexportModels_f
- ==================
- */
- static void Cmd_ReexportModels_f( const idCmdArgs &args ) {
- idModelExport exporter;
- idStr name;
- // don't allow exporting models when cheats are disabled,
- // but if we're not in the game, it's ok
- if ( gameLocal.GetLocalPlayer() && !gameLocal.CheatsOk( false ) ) {
- return;
- }
- idAnimManager::forceExport = true;
- if ( args.Argc() < 2 ) {
- exporter.ExportModels( "def", ".def" );
- } else {
- name = args.Argv( 1 );
- name = "def/" + name;
- name.DefaultFileExtension( ".def" );
- exporter.ExportDefFile( name );
- }
- idAnimManager::forceExport = false;
- }
- /*
- ==================
- Cmd_ReloadAnims_f
- ==================
- */
- static void Cmd_ReloadAnims_f( const idCmdArgs &args ) {
- // don't allow reloading anims when cheats are disabled,
- // but if we're not in the game, it's ok
- if ( gameLocal.GetLocalPlayer() && !gameLocal.CheatsOk( false ) ) {
- return;
- }
- animationLib.ReloadAnims();
- }
- /*
- ==================
- Cmd_ListAnims_f
- ==================
- */
- static void Cmd_ListAnims_f( const idCmdArgs &args ) {
- idEntity * ent;
- int num;
- size_t size;
- size_t alloced;
- idAnimator * animator;
- const char * classname;
- const idDict * dict;
- int i;
- if ( args.Argc() > 1 ) {
- idAnimator animator;
- classname = args.Argv( 1 );
- dict = gameLocal.FindEntityDefDict( classname, false );
- if ( !dict ) {
- gameLocal.Printf( "Entitydef '%s' not found\n", classname );
- return;
- }
- animator.SetModel( dict->GetString( "model" ) );
- gameLocal.Printf( "----------------\n" );
- num = animator.NumAnims();
- for( i = 0; i < num; i++ ) {
- gameLocal.Printf( "%s\n", animator.AnimFullName( i ) );
- }
- gameLocal.Printf( "%d anims\n", num );
- } else {
- animationLib.ListAnims();
- size = 0;
- num = 0;
- for( ent = gameLocal.spawnedEntities.Next(); ent != NULL; ent = ent->spawnNode.Next() ) {
- animator = ent->GetAnimator();
- if ( animator ) {
- alloced = animator->Allocated();
- size += alloced;
- num++;
- }
- }
- gameLocal.Printf( "%d memory used in %d entity animators\n", size, num );
- }
- }
- /*
- ==================
- Cmd_AASStats_f
- ==================
- */
- static void Cmd_AASStats_f( const idCmdArgs &args ) {
- int aasNum;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- aasNum = aas_test.GetInteger();
- idAAS *aas = gameLocal.GetAAS( aasNum );
- if ( !aas ) {
- gameLocal.Printf( "No aas #%d loaded\n", aasNum );
- } else {
- aas->Stats();
- }
- }
- /*
- ==================
- Cmd_TestDamage_f
- ==================
- */
- static void Cmd_TestDamage_f( const idCmdArgs &args ) {
- idPlayer *player;
- const char *damageDefName;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc() < 2 || args.Argc() > 3 ) {
- gameLocal.Printf( "usage: testDamage <damageDefName> [angle]\n" );
- return;
- }
- damageDefName = args.Argv( 1 );
- idVec3 dir;
- if ( args.Argc() == 3 ) {
- float angle = atof( args.Argv( 2 ) );
- idMath::SinCos( DEG2RAD( angle ), dir[1], dir[0] );
- dir[2] = 0;
- } else {
- dir.Zero();
- }
- // give the player full health before and after
- // running the damage
- player->health = player->inventory.maxHealth;
- player->Damage( NULL, NULL, dir, damageDefName, 1.0f, INVALID_JOINT );
- player->health = player->inventory.maxHealth;
- }
- /*
- ==================
- Cmd_TestBoneFx_f
- ==================
- */
- static void Cmd_TestBoneFx_f( const idCmdArgs &args ) {
- idPlayer *player;
- const char *bone, *fx;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc() < 3 || args.Argc() > 4 ) {
- gameLocal.Printf( "usage: testBoneFx <fxName> <boneName>\n" );
- return;
- }
- fx = args.Argv( 1 );
- bone = args.Argv( 2 );
- player->StartFxOnBone( fx, bone );
- }
- /*
- ==================
- Cmd_TestDamage_f
- ==================
- */
- static void Cmd_TestDeath_f( const idCmdArgs &args ) {
- idPlayer *player;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- idVec3 dir;
- idMath::SinCos( DEG2RAD( 45.0f ), dir[1], dir[0] );
- dir[2] = 0;
- g_testDeath.SetBool( 1 );
- player->Damage( NULL, NULL, dir, "damage_triggerhurt_1000", 1.0f, INVALID_JOINT );
- if ( args.Argc() >= 2) {
- player->SpawnGibs( dir, "damage_triggerhurt_1000" );
- }
- }
- /*
- ==================
- Cmd_WeaponSplat_f
- ==================
- */
- static void Cmd_WeaponSplat_f( const idCmdArgs &args ) {
- idPlayer *player;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- player->weapon.GetEntity()->BloodSplat( 2.0f );
- }
- /*
- ==================
- Cmd_SaveSelected_f
- ==================
- */
- static void Cmd_SaveSelected_f( const idCmdArgs &args ) {
- int i;
- idPlayer *player;
- idEntity *s;
- idMapEntity *mapEnt;
- idMapFile *mapFile = gameLocal.GetLevelMap();
- idDict dict;
- idStr mapName;
- const char *name;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- s = player->dragEntity.GetSelected();
- if ( !s ) {
- gameLocal.Printf( "no entity selected, set g_dragShowSelection 1 to show the current selection\n" );
- return;
- }
- if ( args.Argc() > 1 ) {
- mapName = args.Argv( 1 );
- mapName = "maps/" + mapName;
- }
- else {
- mapName = mapFile->GetName();
- }
- // find map file entity
- mapEnt = mapFile->FindEntity( s->name );
- // create new map file entity if there isn't one for this articulated figure
- if ( !mapEnt ) {
- mapEnt = new idMapEntity();
- mapFile->AddEntity( mapEnt );
- for ( i = 0; i < 9999; i++ ) {
- name = va( "%s_%d", s->GetEntityDefName(), i );
- if ( !gameLocal.FindEntity( name ) ) {
- break;
- }
- }
- s->name = name;
- mapEnt->epairs.Set( "classname", s->GetEntityDefName() );
- mapEnt->epairs.Set( "name", s->name );
- }
- if ( s->IsType( idMoveable::Type ) ) {
- // save the moveable state
- mapEnt->epairs.Set( "origin", s->GetPhysics()->GetOrigin().ToString( 8 ) );
- mapEnt->epairs.Set( "rotation", s->GetPhysics()->GetAxis().ToString( 8 ) );
- }
- else if ( s->IsType( idAFEntity_Generic::Type ) || s->IsType( idAFEntity_WithAttachedHead::Type ) ) {
- // save the articulated figure state
- dict.Clear();
- static_cast<idAFEntity_Base *>(s)->SaveState( dict );
- mapEnt->epairs.Copy( dict );
- }
- // write out the map file
- mapFile->Write( mapName, ".map" );
- }
- /*
- ==================
- Cmd_DeleteSelected_f
- ==================
- */
- static void Cmd_DeleteSelected_f( const idCmdArgs &args ) {
- idPlayer *player;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( player ) {
- player->dragEntity.DeleteSelected();
- }
- }
- /*
- ==================
- Cmd_SaveMoveables_f
- ==================
- */
- static void Cmd_SaveMoveables_f( const idCmdArgs &args ) {
- int e, i;
- idMoveable *m;
- idMapEntity *mapEnt;
- idMapFile *mapFile = gameLocal.GetLevelMap();
- idStr mapName;
- const char *name;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- for( e = 0; e < MAX_GENTITIES; e++ ) {
- m = static_cast<idMoveable *>(gameLocal.entities[ e ]);
- if ( !m || !m->IsType( idMoveable::Type ) ) {
- continue;
- }
- if ( m->IsBound() ) {
- continue;
- }
- if ( !m->IsAtRest() ) {
- break;
- }
- }
- if ( e < MAX_GENTITIES ) {
- gameLocal.Warning( "map not saved because the moveable entity %s is not at rest", gameLocal.entities[ e ]->name.c_str() );
- return;
- }
- if ( args.Argc() > 1 ) {
- mapName = args.Argv( 1 );
- mapName = "maps/" + mapName;
- }
- else {
- mapName = mapFile->GetName();
- }
- for( e = 0; e < MAX_GENTITIES; e++ ) {
- m = static_cast<idMoveable *>(gameLocal.entities[ e ]);
- if ( !m || !m->IsType( idMoveable::Type ) ) {
- continue;
- }
- if ( m->IsBound() ) {
- continue;
- }
- // find map file entity
- mapEnt = mapFile->FindEntity( m->name );
- // create new map file entity if there isn't one for this articulated figure
- if ( !mapEnt ) {
- mapEnt = new idMapEntity();
- mapFile->AddEntity( mapEnt );
- for ( i = 0; i < 9999; i++ ) {
- name = va( "%s_%d", m->GetEntityDefName(), i );
- if ( !gameLocal.FindEntity( name ) ) {
- break;
- }
- }
- m->name = name;
- mapEnt->epairs.Set( "classname", m->GetEntityDefName() );
- mapEnt->epairs.Set( "name", m->name );
- }
- // save the moveable state
- mapEnt->epairs.Set( "origin", m->GetPhysics()->GetOrigin().ToString( 8 ) );
- mapEnt->epairs.Set( "rotation", m->GetPhysics()->GetAxis().ToString( 8 ) );
- }
- // write out the map file
- mapFile->Write( mapName, ".map" );
- }
- /*
- ==================
- Cmd_SaveRagdolls_f
- ==================
- */
- static void Cmd_SaveRagdolls_f( const idCmdArgs &args ) {
- int e, i;
- idAFEntity_Base *af;
- idMapEntity *mapEnt;
- idMapFile *mapFile = gameLocal.GetLevelMap();
- idDict dict;
- idStr mapName;
- const char *name;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc() > 1 ) {
- mapName = args.Argv( 1 );
- mapName = "maps/" + mapName;
- }
- else {
- mapName = mapFile->GetName();
- }
- for( e = 0; e < MAX_GENTITIES; e++ ) {
- af = static_cast<idAFEntity_Base *>(gameLocal.entities[ e ]);
- if ( !af ) {
- continue;
- }
- if ( !af->IsType( idAFEntity_WithAttachedHead::Type ) && !af->IsType( idAFEntity_Generic::Type ) ) {
- continue;
- }
- if ( af->IsBound() ) {
- continue;
- }
- if ( !af->IsAtRest() ) {
- gameLocal.Warning( "the articulated figure for entity %s is not at rest", gameLocal.entities[ e ]->name.c_str() );
- }
- dict.Clear();
- af->SaveState( dict );
- // find map file entity
- mapEnt = mapFile->FindEntity( af->name );
- // create new map file entity if there isn't one for this articulated figure
- if ( !mapEnt ) {
- mapEnt = new idMapEntity();
- mapFile->AddEntity( mapEnt );
- for ( i = 0; i < 9999; i++ ) {
- name = va( "%s_%d", af->GetEntityDefName(), i );
- if ( !gameLocal.FindEntity( name ) ) {
- break;
- }
- }
- af->name = name;
- mapEnt->epairs.Set( "classname", af->GetEntityDefName() );
- mapEnt->epairs.Set( "name", af->name );
- }
- // save the articulated figure state
- mapEnt->epairs.Copy( dict );
- }
- // write out the map file
- mapFile->Write( mapName, ".map" );
- }
- /*
- ==================
- Cmd_BindRagdoll_f
- ==================
- */
- static void Cmd_BindRagdoll_f( const idCmdArgs &args ) {
- idPlayer *player;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( player ) {
- player->dragEntity.BindSelected();
- }
- }
- /*
- ==================
- Cmd_UnbindRagdoll_f
- ==================
- */
- static void Cmd_UnbindRagdoll_f( const idCmdArgs &args ) {
- idPlayer *player;
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( player ) {
- player->dragEntity.UnbindSelected();
- }
- }
- /*
- ==================
- Cmd_GameError_f
- ==================
- */
- static void Cmd_GameError_f( const idCmdArgs &args ) {
- gameLocal.Error( "game error" );
- }
- /*
- ==================
- Cmd_SaveLights_f
- ==================
- */
- static void Cmd_SaveLights_f( const idCmdArgs &args ) {
- int e, i;
- idLight *light;
- idMapEntity *mapEnt;
- idMapFile *mapFile = gameLocal.GetLevelMap();
- idDict dict;
- idStr mapName;
- const char *name;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc() > 1 ) {
- mapName = args.Argv( 1 );
- mapName = "maps/" + mapName;
- }
- else {
- mapName = mapFile->GetName();
- }
- for( e = 0; e < MAX_GENTITIES; e++ ) {
- light = static_cast<idLight*>(gameLocal.entities[ e ]);
- if ( !light || !light->IsType( idLight::Type ) ) {
- continue;
- }
- dict.Clear();
- light->SaveState( &dict );
- // find map file entity
- mapEnt = mapFile->FindEntity( light->name );
- // create new map file entity if there isn't one for this light
- if ( !mapEnt ) {
- mapEnt = new idMapEntity();
- mapFile->AddEntity( mapEnt );
- for ( i = 0; i < 9999; i++ ) {
- name = va( "%s_%d", light->GetEntityDefName(), i );
- if ( !gameLocal.FindEntity( name ) ) {
- break;
- }
- }
- light->name = name;
- mapEnt->epairs.Set( "classname", light->GetEntityDefName() );
- mapEnt->epairs.Set( "name", light->name );
- }
- // save the light state
- mapEnt->epairs.Copy( dict );
- }
- // write out the map file
- mapFile->Write( mapName, ".map" );
- }
- /*
- ==================
- Cmd_SaveParticles_f
- ==================
- */
- static void Cmd_SaveParticles_f( const idCmdArgs &args ) {
- int e;
- idEntity *ent;
- idMapEntity *mapEnt;
- idMapFile *mapFile = gameLocal.GetLevelMap();
- idDict dict;
- idStr mapName, strModel;
- if ( !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc() > 1 ) {
- mapName = args.Argv( 1 );
- mapName = "maps/" + mapName;
- }
- else {
- mapName = mapFile->GetName();
- }
- for( e = 0; e < MAX_GENTITIES; e++ ) {
- ent = static_cast<idStaticEntity*> ( gameLocal.entities[ e ] );
- if ( !ent ) {
- continue;
- }
- strModel = ent->spawnArgs.GetString( "model" );
- if ( strModel.Length() && strModel.Find( ".prt") > 0 ) {
- dict.Clear();
- dict.Set( "model", ent->spawnArgs.GetString( "model" ) );
- dict.SetVector( "origin", ent->GetPhysics()->GetOrigin() );
- // find map file entity
- mapEnt = mapFile->FindEntity( ent->name );
- // create new map file entity if there isn't one for this entity
- if ( !mapEnt ) {
- continue;
- }
- // save the particle state
- mapEnt->epairs.Copy( dict );
- }
- }
- // write out the map file
- mapFile->Write( mapName, ".map" );
- }
- /*
- ==================
- Cmd_DisasmScript_f
- ==================
- */
- static void Cmd_DisasmScript_f( const idCmdArgs &args ) {
- gameLocal.program.Disassemble();
- }
- /*
- ==================
- Cmd_TestSave_f
- ==================
- */
- static void Cmd_TestSave_f( const idCmdArgs &args ) {
- idFile *f;
- f = fileSystem->OpenFileWrite( "test.sav" );
- gameLocal.SaveGame( f );
- fileSystem->CloseFile( f );
- }
- /*
- ==================
- Cmd_RecordViewNotes_f
- ==================
- */
- static void Cmd_RecordViewNotes_f( const idCmdArgs &args ) {
- idPlayer *player;
- idVec3 origin;
- idMat3 axis;
- if ( args.Argc() <= 3 ) {
- return;
- }
- player = gameLocal.GetLocalPlayer();
- if ( !player ) {
- return;
- }
- player->GetViewPos( origin, axis );
- // Argv(1) = filename for map (viewnotes/mapname/person)
- // Argv(2) = note number (person0001)
- // Argv(3) = comments
- idStr str = args.Argv(1);
- str.SetFileExtension( ".txt" );
- #ifdef _D3XP
- idFile *file = fileSystem->OpenFileAppend( str, false, "fs_cdpath" );
- #else
- idFile *file = fileSystem->OpenFileAppend( str );
- #endif
- if ( file ) {
- file->WriteFloatString( "\"view\"\t( %s )\t( %s )\r\n", origin.ToString(), axis.ToString() );
- file->WriteFloatString( "\"comments\"\t\"%s: %s\"\r\n\r\n", args.Argv(2), args.Argv(3) );
- fileSystem->CloseFile( file );
- }
- idStr viewComments = args.Argv(1);
- viewComments.StripLeading("viewnotes/");
- viewComments += " -- Loc: ";
- viewComments += origin.ToString();
- viewComments += "\n";
- viewComments += args.Argv(3);
- player->hud->SetStateString( "viewcomments", viewComments );
- player->hud->HandleNamedEvent( "showViewComments" );
- }
- /*
- ==================
- Cmd_CloseViewNotes_f
- ==================
- */
- static void Cmd_CloseViewNotes_f( const idCmdArgs &args ) {
- idPlayer *player = gameLocal.GetLocalPlayer();
- if ( !player ) {
- return;
- }
-
- player->hud->SetStateString( "viewcomments", "" );
- player->hud->HandleNamedEvent( "hideViewComments" );
- }
- /*
- ==================
- Cmd_ShowViewNotes_f
- ==================
- */
- static void Cmd_ShowViewNotes_f( const idCmdArgs &args ) {
- static idLexer parser( LEXFL_ALLOWPATHNAMES | LEXFL_NOSTRINGESCAPECHARS | LEXFL_NOSTRINGCONCAT | LEXFL_NOFATALERRORS );
- idToken token;
- idPlayer *player;
- idVec3 origin;
- idMat3 axis;
- player = gameLocal.GetLocalPlayer();
- if ( !player ) {
- return;
- }
- if ( !parser.IsLoaded() ) {
- idStr str = "viewnotes/";
- str += gameLocal.GetMapName();
- str.StripFileExtension();
- str += "/";
- if ( args.Argc() > 1 ) {
- str += args.Argv( 1 );
- } else {
- str += "comments";
- }
- str.SetFileExtension( ".txt" );
- if ( !parser.LoadFile( str ) ) {
- gameLocal.Printf( "No view notes for %s\n", gameLocal.GetMapName() );
- return;
- }
- }
- if ( parser.ExpectTokenString( "view" ) && parser.Parse1DMatrix( 3, origin.ToFloatPtr() ) &&
- parser.Parse1DMatrix( 9, axis.ToFloatPtr() ) && parser.ExpectTokenString( "comments" ) && parser.ReadToken( &token ) ) {
- player->hud->SetStateString( "viewcomments", token );
- player->hud->HandleNamedEvent( "showViewComments" );
- player->Teleport( origin, axis.ToAngles(), NULL );
- } else {
- parser.FreeSource();
- player->hud->HandleNamedEvent( "hideViewComments" );
- return;
- }
- }
- /*
- =================
- FindEntityGUIs
- helper function for Cmd_NextGUI_f. Checks the passed entity to determine if it
- has any valid gui surfaces.
- =================
- */
- bool FindEntityGUIs( idEntity *ent, const modelSurface_t ** surfaces, int maxSurfs, int &guiSurfaces ) {
- renderEntity_t *renderEnt;
- idRenderModel *renderModel;
- const modelSurface_t *surf;
- const idMaterial *shader;
- int i;
- assert( surfaces != NULL );
- assert( ent != NULL );
- memset( surfaces, 0x00, sizeof( modelSurface_t *) * maxSurfs );
- guiSurfaces = 0;
- renderEnt = ent->GetRenderEntity();
- renderModel = renderEnt->hModel;
- if ( renderModel == NULL ) {
- return false;
- }
- for( i = 0; i < renderModel->NumSurfaces(); i++ ) {
- surf = renderModel->Surface( i );
- if ( surf == NULL ) {
- continue;
- }
- shader = surf->shader;
- if ( shader == NULL ) {
- continue;
- }
- if ( shader->GetEntityGui() > 0 ) {
- surfaces[ guiSurfaces++ ] = surf;
- }
- }
- return ( guiSurfaces != 0 );
- }
- /*
- =================
- Cmd_NextGUI_f
- =================
- */
- void Cmd_NextGUI_f( const idCmdArgs &args ) {
- idVec3 origin;
- idAngles angles;
- idPlayer *player;
- idEntity *ent;
- int guiSurfaces;
- bool newEnt;
- renderEntity_t *renderEnt;
- int surfIndex;
- srfTriangles_t *geom;
- idMat4 modelMatrix;
- idVec3 normal;
- idVec3 center;
- const modelSurface_t *surfaces[ MAX_RENDERENTITY_GUI ];
- player = gameLocal.GetLocalPlayer();
- if ( !player || !gameLocal.CheatsOk() ) {
- return;
- }
- if ( args.Argc() != 1 ) {
- gameLocal.Printf( "usage: nextgui\n" );
- return;
- }
- // start at the last entity
- ent = gameLocal.lastGUIEnt.GetEntity();
- // see if we have any gui surfaces left to go to on the current entity.
- guiSurfaces = 0;
- newEnt = false;
- if ( ent == NULL ) {
- newEnt = true;
- } else if ( FindEntityGUIs( ent, surfaces, MAX_RENDERENTITY_GUI, guiSurfaces ) == true ) {
- if ( gameLocal.lastGUI >= guiSurfaces ) {
- newEnt = true;
- }
- } else {
- // no actual gui surfaces on this ent, so skip it
- newEnt = true;
- }
- if ( newEnt == true ) {
- // go ahead and skip to the next entity with a gui...
- if ( ent == NULL ) {
- ent = gameLocal.spawnedEntities.Next();
- } else {
- ent = ent->spawnNode.Next();
- }
- for ( ; ent != NULL; ent = ent->spawnNode.Next() ) {
- if ( ent->spawnArgs.GetString( "gui", NULL ) != NULL ) {
- break;
- }
-
- if ( ent->spawnArgs.GetString( "gui2", NULL ) != NULL ) {
- break;
- }
- if ( ent->spawnArgs.GetString( "gui3", NULL ) != NULL ) {
- break;
- }
-
- // try the next entity
- gameLocal.lastGUIEnt = ent;
- }
- gameLocal.lastGUIEnt = ent;
- gameLocal.lastGUI = 0;
- if ( !ent ) {
- gameLocal.Printf( "No more gui entities. Starting over...\n" );
- return;
- }
- }
- if ( FindEntityGUIs( ent, surfaces, MAX_RENDERENTITY_GUI, guiSurfaces ) == false ) {
- gameLocal.Printf( "Entity \"%s\" has gui properties but no gui surfaces.\n", ent->name.c_str() );
- }
- if ( guiSurfaces == 0 ) {
- gameLocal.Printf( "Entity \"%s\" has gui properties but no gui surfaces!\n", ent->name.c_str() );
- return;
- }
- gameLocal.Printf( "Teleporting to gui entity \"%s\", gui #%d.\n" , ent->name.c_str (), gameLocal.lastGUI );
- renderEnt = ent->GetRenderEntity();
- surfIndex = gameLocal.lastGUI++;
- geom = surfaces[ surfIndex ]->geometry;
- if ( geom == NULL ) {
- gameLocal.Printf( "Entity \"%s\" has gui surface %d without geometry!\n", ent->name.c_str(), surfIndex );
- return;
- }
- assert( geom->facePlanes != NULL );
- modelMatrix = idMat4( renderEnt->axis, renderEnt->origin );
- normal = geom->facePlanes[ 0 ].Normal() * renderEnt->axis;
- center = geom->bounds.GetCenter() * modelMatrix;
- origin = center + (normal * 32.0f);
- origin.z -= player->EyeHeight();
- normal *= -1.0f;
- angles = normal.ToAngles ();
- // make sure the player is in noclip
- player->noclip = true;
- player->Teleport( origin, angles, NULL );
- }
- #ifdef _D3XP
- void Cmd_SetActorState_f( const idCmdArgs &args ) {
- if ( args.Argc() != 3 ) {
- common->Printf( "usage: setActorState <entity name> <state>\n" );
- return;
- }
- idEntity* ent;
- ent = gameLocal.FindEntity( args.Argv( 1 ) );
- if ( !ent ) {
- gameLocal.Printf( "entity not found\n" );
- return;
- }
-
- if(!ent->IsType(idActor::Type)) {
- gameLocal.Printf( "entity not an actor\n" );
- return;
- }
- idActor* actor = (idActor*)ent;
- actor->PostEventMS(&AI_SetState, 0, args.Argv(2));
- }
- #endif
- static void ArgCompletion_DefFile( const idCmdArgs &args, void(*callback)( const char *s ) ) {
- cmdSystem->ArgCompletion_FolderExtension( args, callback, "def/", true, ".def", NULL );
- }
- /*
- ===============
- Cmd_TestId_f
- outputs a string from the string table for the specified id
- ===============
- */
- void Cmd_TestId_f( const idCmdArgs &args ) {
- idStr id;
- int i;
- if ( args.Argc() == 1 ) {
- common->Printf( "usage: testid <string id>\n" );
- return;
- }
- for ( i = 1; i < args.Argc(); i++ ) {
- id += args.Argv( i );
- }
- if ( idStr::Cmpn( id, STRTABLE_ID, STRTABLE_ID_LENGTH ) != 0 ) {
- id = STRTABLE_ID + id;
- }
- gameLocal.mpGame.AddChatLine( common->GetLanguageDict()->GetString( id ), "<nothing>", "<nothing>", "<nothing>" );
- }
- /*
- =================
- idGameLocal::InitConsoleCommands
- Let the system know about all of our commands
- so it can perform tab completion
- =================
- */
- void idGameLocal::InitConsoleCommands( void ) {
- cmdSystem->AddCommand( "listTypeInfo", ListTypeInfo_f, CMD_FL_GAME, "list type info" );
- cmdSystem->AddCommand( "writeGameState", WriteGameState_f, CMD_FL_GAME, "write game state" );
- cmdSystem->AddCommand( "testSaveGame", TestSaveGame_f, CMD_FL_GAME|CMD_FL_CHEAT, "test a save game for a level" );
- cmdSystem->AddCommand( "game_memory", idClass::DisplayInfo_f, CMD_FL_GAME, "displays game class info" );
- cmdSystem->AddCommand( "listClasses", idClass::ListClasses_f, CMD_FL_GAME, "lists game classes" );
- cmdSystem->AddCommand( "listThreads", idThread::ListThreads_f, CMD_FL_GAME|CMD_FL_CHEAT, "lists script threads" );
- cmdSystem->AddCommand( "listEntities", Cmd_EntityList_f, CMD_FL_GAME|CMD_FL_CHEAT, "lists game entities" );
- cmdSystem->AddCommand( "listActiveEntities", Cmd_ActiveEntityList_f, CMD_FL_GAME|CMD_FL_CHEAT, "lists active game entities" );
- cmdSystem->AddCommand( "listMonsters", idAI::List_f, CMD_FL_GAME|CMD_FL_CHEAT, "lists monsters" );
- cmdSystem->AddCommand( "listSpawnArgs", Cmd_ListSpawnArgs_f, CMD_FL_GAME|CMD_FL_CHEAT, "list the spawn args of an entity", idGameLocal::ArgCompletion_EntityName );
- cmdSystem->AddCommand( "say", Cmd_Say_f, CMD_FL_GAME, "text chat" );
- cmdSystem->AddCommand( "sayTeam", Cmd_SayTeam_f, CMD_FL_GAME, "team text chat" );
- cmdSystem->AddCommand( "addChatLine", Cmd_AddChatLine_f, CMD_FL_GAME, "internal use - core to game chat lines" );
- cmdSystem->AddCommand( "gameKick", Cmd_Kick_f, CMD_FL_GAME, "same as kick, but recognizes player names" );
- cmdSystem->AddCommand( "give", Cmd_Give_f, CMD_FL_GAME|CMD_FL_CHEAT, "gives one or more items" );
- cmdSystem->AddCommand( "centerview", Cmd_CenterView_f, CMD_FL_GAME, "centers the view" );
- cmdSystem->AddCommand( "god", Cmd_God_f, CMD_FL_GAME|CMD_FL_CHEAT, "enables god mode" );
- cmdSystem->AddCommand( "notarget", Cmd_Notarget_f, CMD_FL_GAME|CMD_FL_CHEAT, "disables the player as a target" );
- cmdSystem->AddCommand( "noclip", Cmd_Noclip_f, CMD_FL_GAME|CMD_FL_CHEAT, "disables collision detection for the player" );
- cmdSystem->AddCommand( "kill", Cmd_Kill_f, CMD_FL_GAME, "kills the player" );
- cmdSystem->AddCommand( "where", Cmd_GetViewpos_f, CMD_FL_GAME|CMD_FL_CHEAT, "prints the current view position" );
- cmdSystem->AddCommand( "getviewpos", Cmd_GetViewpos_f, CMD_FL_GAME|CMD_FL_CHEAT, "prints the current view position" );
- cmdSystem->AddCommand( "setviewpos", Cmd_SetViewpos_f, CMD_FL_GAME|CMD_FL_CHEAT, "sets the current view position" );
- cmdSystem->AddCommand( "teleport", Cmd_Teleport_f, CMD_FL_GAME|CMD_FL_CHEAT, "teleports the player to an entity location", idGameLocal::ArgCompletion_EntityName );
- cmdSystem->AddCommand( "trigger", Cmd_Trigger_f, CMD_FL_GAME|CMD_FL_CHEAT, "triggers an entity", idGameLocal::ArgCompletion_EntityName );
- cmdSystem->AddCommand( "spawn", Cmd_Spawn_f, CMD_FL_GAME|CMD_FL_CHEAT, "spawns a game entity", idCmdSystem::ArgCompletion_Decl<DECL_ENTITYDEF> );
- cmdSystem->AddCommand( "damage", Cmd_Damage_f, CMD_FL_GAME|CMD_FL_CHEAT, "apply damage to an entity", idGameLocal::ArgCompletion_EntityName );
- cmdSystem->AddCommand( "remove", Cmd_Remove_f, CMD_FL_GAME|CMD_FL_CHEAT, "removes an entity", idGameLocal::ArgCompletion_EntityName );
- cmdSystem->AddCommand( "killMonsters", Cmd_KillMonsters_f, CMD_FL_GAME|CMD_FL_CHEAT, "removes all monsters" );
- cmdSystem->AddCommand( "killMoveables", Cmd_KillMovables_f, CMD_FL_GAME|CMD_FL_CHEAT, "removes all moveables" );
- cmdSystem->AddCommand( "killRagdolls", Cmd_KillRagdolls_f, CMD_FL_GAME|CMD_FL_CHEAT, "removes all ragdolls" );
- cmdSystem->AddCommand( "addline", Cmd_AddDebugLine_f, CMD_FL_GAME|CMD_FL_CHEAT, "adds a debug line" );
- cmdSystem->AddCommand( "addarrow", Cmd_AddDebugLine_f, CMD_FL_GAME|CMD_FL_CHEAT, "adds a debug arrow" );
- cmdSystem->AddCommand( "removeline", Cmd_RemoveDebugLine_f, CMD_FL_GAME|CMD_FL_CHEAT, "removes a debug line" );
- cmdSystem->AddCommand( "blinkline", Cmd_BlinkDebugLine_f, CMD_FL_GAME|CMD_FL_CHEAT, "blinks a debug line" );
- cmdSystem->AddCommand( "listLines", Cmd_ListDebugLines_f, CMD_FL_GAME|CMD_FL_CHEAT, "lists all debug lines" );
- cmdSystem->AddCommand( "playerModel", Cmd_PlayerModel_f, CMD_FL_GAME|CMD_FL_CHEAT, "sets the given model on the player", idCmdSystem::ArgCompletion_Decl<DECL_MODELDEF> );
- cmdSystem->AddCommand( "testFx", Cmd_TestFx_f, CMD_FL_GAME|CMD_FL_CHEAT, "tests an FX system", idCmdSystem::ArgCompletion_Decl<DECL_FX> );
- cmdSystem->AddCommand( "testBoneFx", Cmd_TestBoneFx_f, CMD_FL_GAME|CMD_FL_CHEAT, "tests an FX system bound to a joint", idCmdSystem::ArgCompletion_Decl<DECL_FX> );
- cmdSystem->AddCommand( "testLight", Cmd_TestLight_f, CMD_FL_GAME|CMD_FL_CHEAT, "tests a light" );
- cmdSystem->AddCommand( "testPointLight", Cmd_TestPointLight_f, CMD_FL_GAME|CMD_FL_CHEAT, "tests a point light" );
- cmdSystem->AddCommand( "popLight", Cmd_PopLight_f, CMD_FL_GAME|CMD_FL_CHEAT, "removes the last created light" );
- cmdSystem->AddCommand( "testDeath", Cmd_TestDeath_f, CMD_FL_GAME|CMD_FL_CHEAT, "tests death" );
- cmdSystem->AddCommand( "testSave", Cmd_TestSave_f, CMD_FL_GAME|CMD_FL_CHEAT, "writes out a test savegame" );
- cmdSystem->AddCommand( "testModel", idTestModel::TestModel_f, CMD_FL_GAME|CMD_FL_CHEAT, "tests a model", idTestModel::ArgCompletion_TestModel );
- cmdSystem->AddCommand( "testSkin", idTestModel::TestSkin_f, CMD_FL_GAME|CMD_FL_CHEAT, "tests a skin on an existing testModel", idCmdSystem::ArgCompletion_Decl<DECL_SKIN> );
- cmdSystem->AddCommand( "testShaderParm", idTestModel::TestShaderParm_f, CMD_FL_GAME|CMD_FL_CHEAT, "sets a shaderParm on an existing testModel" );
- cmdSystem->AddCommand( "keepTestModel", idTestModel::KeepTestModel_f, CMD_FL_GAME|CMD_FL_CHEAT, "keeps the last test model in the game" );
- cmdSystem->AddCommand( "testAnim", idTestModel::TestAnim_f, CMD_FL_GAME|CMD_FL_CHEAT, "tests an animation", idTestModel::ArgCompletion_TestAnim );
- cmdSystem->AddCommand( "testParticleStopTime", idTestModel::TestParticleStopTime_f,CMD_FL_GAME|CMD_FL_CHEAT, "tests particle stop time on a test model" );
- cmdSystem->AddCommand( "nextAnim", idTestModel::TestModelNextAnim_f, CMD_FL_GAME|CMD_FL_CHEAT, "shows next animation on test model" );
- cmdSystem->AddCommand( "prevAnim", idTestModel::TestModelPrevAnim_f, CMD_FL_GAME|CMD_FL_CHEAT, "shows previous animation on test model" );
- cmdSystem->AddCommand( "nextFrame", idTestModel::TestModelNextFrame_f, CMD_FL_GAME|CMD_FL_CHEAT, "shows next animation frame on test model" );
- cmdSystem->AddCommand( "prevFrame", idTestModel::TestModelPrevFrame_f, CMD_FL_GAME|CMD_FL_CHEAT, "shows previous animation frame on test model" );
- cmdSystem->AddCommand( "testBlend", idTestModel::TestBlend_f, CMD_FL_GAME|CMD_FL_CHEAT, "tests animation blending" );
- cmdSystem->AddCommand( "reloadScript", Cmd_ReloadScript_f, CMD_FL_GAME|CMD_FL_CHEAT, "reloads scripts" );
- cmdSystem->AddCommand( "script", Cmd_Script_f, CMD_FL_GAME|CMD_FL_CHEAT, "executes a line of script" );
- cmdSystem->AddCommand( "listCollisionModels", Cmd_ListCollisionModels_f, CMD_FL_GAME, "lists collision models" );
- cmdSystem->AddCommand( "collisionModelInfo", Cmd_CollisionModelInfo_f, CMD_FL_GAME, "shows collision model info" );
- cmdSystem->AddCommand( "reexportmodels", Cmd_ReexportModels_f, CMD_FL_GAME|CMD_FL_CHEAT, "reexports models", ArgCompletion_DefFile );
- cmdSystem->AddCommand( "reloadanims", Cmd_ReloadAnims_f, CMD_FL_GAME|CMD_FL_CHEAT, "reloads animations" );
- cmdSystem->AddCommand( "listAnims", Cmd_ListAnims_f, CMD_FL_GAME, "lists all animations" );
- cmdSystem->AddCommand( "aasStats", Cmd_AASStats_f, CMD_FL_GAME, "shows AAS stats" );
- cmdSystem->AddCommand( "testDamage", Cmd_TestDamage_f, CMD_FL_GAME|CMD_FL_CHEAT, "tests a damage def", idCmdSystem::ArgCompletion_Decl<DECL_ENTITYDEF> );
- cmdSystem->AddCommand( "weaponSplat", Cmd_WeaponSplat_f, CMD_FL_GAME|CMD_FL_CHEAT, "projects a blood splat on the player weapon" );
- cmdSystem->AddCommand( "saveSelected", Cmd_SaveSelected_f, CMD_FL_GAME|CMD_FL_CHEAT, "saves the selected entity to the .map file" );
- cmdSystem->AddCommand( "deleteSelected", Cmd_DeleteSelected_f, CMD_FL_GAME|CMD_FL_CHEAT, "deletes selected entity" );
- cmdSystem->AddCommand( "saveMoveables", Cmd_SaveMoveables_f, CMD_FL_GAME|CMD_FL_CHEAT, "save all moveables to the .map file" );
- cmdSystem->AddCommand( "saveRagdolls", Cmd_SaveRagdolls_f, CMD_FL_GAME|CMD_FL_CHEAT, "save all ragdoll poses to the .map file" );
- cmdSystem->AddCommand( "bindRagdoll", Cmd_BindRagdoll_f, CMD_FL_GAME|CMD_FL_CHEAT, "binds ragdoll at the current drag position" );
- cmdSystem->AddCommand( "unbindRagdoll", Cmd_UnbindRagdoll_f, CMD_FL_GAME|CMD_FL_CHEAT, "unbinds the selected ragdoll" );
- cmdSystem->AddCommand( "saveLights", Cmd_SaveLights_f, CMD_FL_GAME|CMD_FL_CHEAT, "saves all lights to the .map file" );
- cmdSystem->AddCommand( "saveParticles", Cmd_SaveParticles_f, CMD_FL_GAME|CMD_FL_CHEAT, "saves all lights to the .map file" );
- cmdSystem->AddCommand( "clearLights", Cmd_ClearLights_f, CMD_FL_GAME|CMD_FL_CHEAT, "clears all lights" );
- cmdSystem->AddCommand( "gameError", Cmd_GameError_f, CMD_FL_GAME|CMD_FL_CHEAT, "causes a game error" );
- #ifndef ID_DEMO_BUILD
- cmdSystem->AddCommand( "disasmScript", Cmd_DisasmScript_f, CMD_FL_GAME|CMD_FL_CHEAT, "disassembles script" );
- cmdSystem->AddCommand( "recordViewNotes", Cmd_RecordViewNotes_f, CMD_FL_GAME|CMD_FL_CHEAT, "record the current view position with notes" );
- cmdSystem->AddCommand( "showViewNotes", Cmd_ShowViewNotes_f, CMD_FL_GAME|CMD_FL_CHEAT, "show any view notes for the current map, successive calls will cycle to the next note" );
- cmdSystem->AddCommand( "closeViewNotes", Cmd_CloseViewNotes_f, CMD_FL_GAME|CMD_FL_CHEAT, "close the view showing any notes for this map" );
- cmdSystem->AddCommand( "exportmodels", Cmd_ExportModels_f, CMD_FL_GAME|CMD_FL_CHEAT, "exports models", ArgCompletion_DefFile );
- // multiplayer client commands ( replaces old impulses stuff )
- cmdSystem->AddCommand( "clientDropWeapon", idMultiplayerGame::DropWeapon_f, CMD_FL_GAME, "drop current weapon" );
- cmdSystem->AddCommand( "clientMessageMode", idMultiplayerGame::MessageMode_f, CMD_FL_GAME, "ingame gui message mode" );
- // FIXME: implement
- // cmdSystem->AddCommand( "clientVote", idMultiplayerGame::Vote_f, CMD_FL_GAME, "cast your vote: clientVote yes | no" );
- // cmdSystem->AddCommand( "clientCallVote", idMultiplayerGame::CallVote_f, CMD_FL_GAME, "call a vote: clientCallVote si_.. proposed_value" );
- cmdSystem->AddCommand( "clientVoiceChat", idMultiplayerGame::VoiceChat_f, CMD_FL_GAME, "voice chats: clientVoiceChat <sound shader>" );
- cmdSystem->AddCommand( "clientVoiceChatTeam", idMultiplayerGame::VoiceChatTeam_f, CMD_FL_GAME, "team voice chats: clientVoiceChat <sound shader>" );
- // multiplayer server commands
- cmdSystem->AddCommand( "serverMapRestart", idGameLocal::MapRestart_f, CMD_FL_GAME, "restart the current game" );
- cmdSystem->AddCommand( "serverForceReady", idMultiplayerGame::ForceReady_f,CMD_FL_GAME, "force all players ready" );
- cmdSystem->AddCommand( "serverNextMap", idGameLocal::NextMap_f, CMD_FL_GAME, "change to the next map" );
- #endif
- // localization help commands
- cmdSystem->AddCommand( "nextGUI", Cmd_NextGUI_f, CMD_FL_GAME|CMD_FL_CHEAT, "teleport the player to the next func_static with a gui" );
- cmdSystem->AddCommand( "testid", Cmd_TestId_f, CMD_FL_GAME|CMD_FL_CHEAT, "output the string for the specified id." );
- #ifdef _D3XP
- cmdSystem->AddCommand( "setActorState", Cmd_SetActorState_f, CMD_FL_GAME|CMD_FL_CHEAT, "Manually sets an actors script state", idGameLocal::ArgCompletion_EntityName );
- #endif
- }
- /*
- =================
- idGameLocal::ShutdownConsoleCommands
- =================
- */
- void idGameLocal::ShutdownConsoleCommands( void ) {
- cmdSystem->RemoveFlaggedCommands( CMD_FL_GAME );
- }
|