From 2e5b254639910450b1bb73a0ce872dcbf4b1997c Mon Sep 17 00:00:00 2001 From: Paradox460 Date: Fri, 18 Jul 2008 19:19:03 +0000 Subject: [PATCH] Added spectator noclip, `g_specNoclip`. (Issue 152) Added decent kick reasons (Issue 153) Added `g_defaultLayout` to control which layout is used for a map (Issue 154) Added `!bubbles` flag Q (Issue 156) --- src/game/g_active.c | 13 ++++++++++- src/game/g_admin.c | 49 +++++++++++++++++++++++++++++++++++++++++- src/game/g_admin.h | 1 + src/game/g_buildable.c | 11 +++++++++- src/game/g_cmds.c | 4 ++-- src/game/g_local.h | 6 +++++- src/game/g_main.c | 10 ++++++--- 7 files changed, 85 insertions(+), 9 deletions(-) diff --git a/src/game/g_active.c b/src/game/g_active.c index 7314c11..3c025f3 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -393,7 +393,12 @@ void SpectatorThink( gentity_t *ent, usercmd_t *ucmd ) if( client->sess.spectatorState == SPECTATOR_LOCKED || client->sess.spectatorState == SPECTATOR_FOLLOW ) client->ps.pm_type = PM_FREEZE; else - client->ps.pm_type = PM_SPECTATOR; + { + if( g_specNoclip.integer ) + client->ps.pm_type = PM_NOCLIP; + else + client->ps.pm_type = PM_SPECTATOR; + } if ( client->sess.spectatorState == SPECTATOR_FOLLOW ) { @@ -1635,6 +1640,12 @@ void ClientThink_real( gentity_t *ent ) VectorCopy( clear, ent->client->ps.velocity ); VectorCopy( ent->client->pers.grabber->s.origin, ent->client->ps.origin ); } + + if( client->pers.bubble && client->pers.bubbletime < level.time ){ + gentity_t *bub; + bub = G_TempEntity( client->ps.origin, EV_PLAYER_TELEPORT_OUT ); + client->pers.bubbletime += 500; + } if( BG_InventoryContainsUpgrade( UP_MEDKIT, client->ps.stats ) && BG_UpgradeIsActive( UP_MEDKIT, client->ps.stats ) ) diff --git a/src/game/g_admin.c b/src/game/g_admin.c index 6ddf550..a50fc2f 100644 --- a/src/game/g_admin.c +++ b/src/game/g_admin.c @@ -145,6 +145,11 @@ g_admin_cmd_t g_admin_cmds[ ] = "This will bring you to said players location.", "[^3name|slot#^7]" }, + + {"bubble", G_admin_bubble, "Q", + "Cause bobbles to appear around you untill turned off", + "[^3name|slot#^7]" + }, {"flag", G_admin_flag, "f", "add an admin flag to a player, prefix flag with '-' to disallow", @@ -2303,7 +2308,7 @@ qboolean G_admin_kick( gentity_t *ent, int skiparg ) vic->client->pers.netname, vic->client->pers.guid, vic->client->pers.ip, g_adminTempBan.integer, - "automatic temp ban created by kick" ); + ( *reason ) ? reason : "automatic temp ban created by kick" ); if( g_admin.string[ 0 ] ) admin_writeconfig(); } @@ -7466,3 +7471,45 @@ qboolean G_admin_lockname( gentity_t *ent, int skiparg ) return qtrue; } +qboolean G_admin_bubble( gentity_t *ent, int skiparg ) +{ + int pids[ MAX_CLIENTS ]; + char name[ MAX_NAME_LENGTH ], err[ MAX_STRING_CHARS ]; + char command[ MAX_ADMIN_CMD_LEN ]; + gentity_t *vic; + + if( G_SayArgc() < 2 + skiparg ) + { + ADMP( "^3!bubble: ^7usage: !lockname [name|slot#]\n" ); + return qfalse; + } + G_SayArgv( 1 + skiparg, name, sizeof( name ) ); + if( G_ClientNumbersFromString( name, pids ) != 1 ) + { + G_MatchOnePlayer( pids, err, sizeof( err ) ); + ADMP( va( "^3!bubble: ^7%s\n", err ) ); + return qfalse; + } + if( !admin_higher( ent, &g_entities[ pids[ 0 ] ] ) ) + { + ADMP( "^3!bubble: ^7sorry, but your intended victim has a higher admin" + " level than you\n" ); + return qfalse; + } + vic = &g_entities[ pids[ 0 ] ]; + if( vic->client->pers.bubble == qtrue ) + { + ADMP( va("^3!bubble: ^7bubble mode has been ^1disable^7 for %s^7\n", vic->client->pers.netname )); + vic->client->pers.bubble = qfalse; + vic->client->pers.bubbletime = 0; + } + else + { + ADMP( va("^3!bubble: ^7bubble mode has been ^2enabled^7 for %s^7\n", vic->client->pers.netname )); + vic->client->pers.bubble = qtrue; + vic->client->pers.bubbletime = level.time; + } + + return qtrue; +} + diff --git a/src/game/g_admin.h b/src/game/g_admin.h index e4d38f8..4863920 100644 --- a/src/game/g_admin.h +++ b/src/game/g_admin.h @@ -266,6 +266,7 @@ qboolean G_admin_nobuildsave( gentity_t *ent, int skiparg ); qboolean G_admin_grab( gentity_t *ent, int skiparg ); qboolean G_admin_bring( gentity_t *ent, int skiparg ); qboolean G_admin_lockname( gentity_t *ent, int skiparg ); +qboolean G_admin_bubble( gentity_t *ent, int skiparg ); void G_admin_print( gentity_t *ent, char *m ); void G_admin_buffer_print( gentity_t *ent, char *m ); diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index 1c599ae..e543155 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -4090,7 +4090,16 @@ void G_LayoutSelect( void ) int cnt = 0; int layoutNum; - Q_strncpyz( layouts, g_layouts.string, sizeof( layouts ) ); + Q_strncpyz( layouts, g_defaultLayout.string, sizeof( layouts ) ); + Q_strncpyz( layouts2, g_layouts.string, sizeof( layouts2 ) ); + + if( Q_stricmp( layouts, "" ) && !Q_stricmp( layouts2, "" ) ){ + Q_strncpyz( layouts, g_defaultLayout.string, sizeof( layouts ) ); + } + else{ + Q_strncpyz( layouts, g_layouts.string, sizeof( layouts ) ); + } + trap_Cvar_VariableStringBuffer( "mapname", map, sizeof( map ) ); // one time use cvar diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index 7987848..dbf0537 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -1833,8 +1833,8 @@ void Cmd_CallVote_f( gentity_t *ent ) // use ip in case this player disconnects before the vote ends Com_sprintf( level.voteString, sizeof( level.voteString ), - "!ban %s %d vote kick", level.clients[ clientNum ].pers.ip, - g_adminTempBan.integer + 1 ); + "!ban %s %d %s", level.clients[ clientNum ].pers.ip, + g_adminTempBan.integer + 1, G_SayConcatArgs( 3 ) ); //bit of a hack here, but it does work :) Com_sprintf( level.voteDisplayString, sizeof( level.voteDisplayString ), "Kick player \'%s^7\' for \'%s^7\'", name, G_SayConcatArgs( 3 ) ); diff --git a/src/game/g_local.h b/src/game/g_local.h index 43c8ab8..b5ecc72 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -413,6 +413,9 @@ typedef struct gentity_t *grabber; qboolean nlocked; + + qboolean bubble; + int bubbletime; qboolean firstConnect; } clientPersistant_t; @@ -1456,7 +1459,7 @@ extern vmCvar_t g_modWeaponAmmo; // Weapon ammo per clip extern vmCvar_t g_modWeaponReload; // Weapon reload time extern vmCvar_t g_modTurretAngle; // Allow high turret build angles extern vmCvar_t g_instantBuild; // Enable instant building outside of devmap mode - +extern vmCvar_t g_defaultLayout; extern vmCvar_t g_teamStatus; // Allow the use of /teamstatus extern vmCvar_t g_teamStatusTime; // Allow the use of /teamstatus @@ -1466,6 +1469,7 @@ extern vmCvar_t g_AllStatsTime; extern vmCvar_t g_wwNoHovelBuild; extern vmCvar_t g_moverBuild; +extern vmCvar_t g_specNoclip; void trap_Printf( const char *fmt ); void trap_Error( const char *fmt ); diff --git a/src/game/g_main.c b/src/game/g_main.c index 3b97388..e82733e 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -247,7 +247,7 @@ vmCvar_t g_modTurretAngle; vmCvar_t g_teamStatus; vmCvar_t g_teamStatusTime; - +vmCvar_t g_defaultLayout; vmCvar_t g_instantBuild; vmCvar_t g_AllStats; @@ -257,6 +257,8 @@ vmCvar_t g_wwNoHovelBuild; vmCvar_t g_moverBuild; +vmCvar_t g_specNoclip; + static cvarTable_t gameCvarTable[ ] = { @@ -479,7 +481,7 @@ static cvarTable_t gameCvarTable[ ] = { &g_msgTime, "g_msgTime", "0", CVAR_ARCHIVE, 0, qfalse }, { &g_welcomeMsg, "g_welcomeMsg", "", CVAR_ARCHIVE, 0, qfalse }, { &g_welcomeMsgTime, "g_welcomeMsgTime", "0", CVAR_ARCHIVE, 0, qfalse }, - + { &g_defaultLayout, "g_defaultLayout", "", CVAR_ARCHIVE, 0, qtrue }, { &g_rankings, "g_rankings", "0", 0, 0, qfalse }, { &g_allowShare, "g_allowShare", "1", CVAR_ARCHIVE | CVAR_SERVERINFO, 0, qfalse}, { &g_creditOverflow, "g_creditOverflow", "0", CVAR_ARCHIVE | CVAR_SERVERINFO, 0, qfalse}, @@ -496,7 +498,9 @@ static cvarTable_t gameCvarTable[ ] = { &g_wwNoHovelBuild, "g_wwNoHovelBuild", "0", CVAR_ARCHIVE, 0, qfalse }, - { &g_moverBuild, "g_moverBuild", "0", CVAR_ARCHIVE, 0, qfalse } + { &g_moverBuild, "g_moverBuild", "0", CVAR_ARCHIVE, 0, qfalse }, + + { &g_specNoclip, "g_specNoclip", "0", CVAR_ARCHIVE, 0, qtrue } }; static int gameCvarTableSize = sizeof( gameCvarTable ) / sizeof( gameCvarTable[ 0 ] );