diff options
author | Ben Millwood <thebenmachine@gmail.com> | 2009-10-03 12:16:05 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2013-01-03 00:15:48 +0000 |
commit | ccbc1b2f5a63cdf5545390d35bf0364a1073d395 (patch) | |
tree | fa04d8845b9b8a814a20a57dad8bf22b17176bb3 /src/game | |
parent | c56b5dd095d6f710b3de27ab053f63b018c4483a (diff) |
* Allow boosters to give poison within the first 30 seconds of the game
* Allow /noclip and /where to be used by spectators
* Allow /noclip and /setviewpos to be used by specs even when cheats are off
* Run PM_Weapon and set view height while noclipping
* Make player speed while spectating or noclipping configurable via cg_flySpeed
* Remove requirement for cgame's cvartable to have a non-null vmCvar pointer
* Make PM_Paralyzed a macro and add a similar category, PM_Live
* Stop dretches from biting dead buildings
Diffstat (limited to 'src/game')
-rw-r--r-- | src/game/bg_pmove.c | 61 | ||||
-rw-r--r-- | src/game/bg_public.h | 6 | ||||
-rw-r--r-- | src/game/g_active.c | 19 | ||||
-rw-r--r-- | src/game/g_buildable.c | 6 | ||||
-rw-r--r-- | src/game/g_client.c | 8 | ||||
-rw-r--r-- | src/game/g_cmds.c | 9 | ||||
-rw-r--r-- | src/game/g_local.h | 20 | ||||
-rw-r--r-- | src/game/g_weapon.c | 3 |
8 files changed, 73 insertions, 59 deletions
diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c index dfcac8df..6f15674c 100644 --- a/src/game/bg_pmove.c +++ b/src/game/bg_pmove.c @@ -88,25 +88,13 @@ void PM_AddTouchEnt( int entityNum ) } /* -=============== -PM_Paralyzed -=============== -*/ -qboolean PM_Paralyzed( playerState_t *ps ) -{ - return ( ps->pm_type == PM_DEAD || - ps->pm_type == PM_FREEZE || - ps->pm_type == PM_INTERMISSION ); -} - -/* =================== PM_StartTorsoAnim =================== */ void PM_StartTorsoAnim( int anim ) { - if( PM_Paralyzed( pm->ps ) ) + if( PM_Paralyzed( pm->ps->pm_type ) ) return; pm->ps->torsoAnim = ( ( pm->ps->torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) @@ -120,7 +108,7 @@ PM_StartWeaponAnim */ static void PM_StartWeaponAnim( int anim ) { - if( PM_Paralyzed( pm->ps ) ) + if( PM_Paralyzed( pm->ps->pm_type ) ) return; pm->ps->weaponAnim = ( ( pm->ps->weaponAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) @@ -134,7 +122,7 @@ PM_StartLegsAnim */ static void PM_StartLegsAnim( int anim ) { - if( PM_Paralyzed( pm->ps ) ) + if( PM_Paralyzed( pm->ps->pm_type ) ) return; //legsTimer is clamped too tightly for nonsegmented models @@ -1619,8 +1607,6 @@ static void PM_NoclipMove( void ) float wishspeed; float scale; - pm->ps->viewheight = DEFAULT_VIEWHEIGHT; - // friction speed = VectorLength( pm->ps->velocity ); @@ -2428,23 +2414,29 @@ static void PM_SetWaterLevel( void ) /* ============== +PM_SetViewheight +============== +*/ +static void PM_SetViewheight( void ) +{ + pm->ps->viewheight = ( pm->ps->pm_flags & PMF_DUCKED ) + ? BG_ClassConfig( pm->ps->stats[ STAT_CLASS ] )->crouchViewheight + : BG_ClassConfig( pm->ps->stats[ STAT_CLASS ] )->viewheight; +} + +/* +============== PM_CheckDuck -Sets mins, maxs, and pm->ps->viewheight +Sets mins and maxs, and calls PM_SetViewheight ============== */ static void PM_CheckDuck (void) { trace_t trace; vec3_t PCmins, PCmaxs, PCcmaxs; - int PCvh, PCcvh; BG_ClassBoundingBox( pm->ps->stats[ STAT_CLASS ], PCmins, PCmaxs, PCcmaxs, NULL, NULL ); - PCvh = BG_ClassConfig( pm->ps->stats[ STAT_CLASS ] )->viewheight; - PCcvh = BG_ClassConfig( pm->ps->stats[ STAT_CLASS ] )->crouchViewheight; - - if( pm->ps->persistant[ PERS_SPECSTATE ] != SPECTATOR_NOT ) - PCcvh = PCvh; pm->mins[ 0 ] = PCmins[ 0 ]; pm->mins[ 1 ] = PCmins[ 1 ]; @@ -2461,10 +2453,9 @@ static void PM_CheckDuck (void) return; } - // If the standing and crouching viewheights are the same the class can't crouch - if( ( pm->cmd.upmove < 0 ) && ( PCvh != PCcvh ) && - pm->ps->pm_type != PM_JETPACK && - !BG_InventoryContainsUpgrade( UP_BATTLESUIT, pm->ps->stats ) ) + // If the standing and crouching bboxes are the same the class can't crouch + if( ( pm->cmd.upmove < 0 ) && !VectorCompare( PCmaxs, PCcmaxs ) && + pm->ps->pm_type != PM_JETPACK ) { // duck pm->ps->pm_flags |= PMF_DUCKED; @@ -2483,15 +2474,11 @@ static void PM_CheckDuck (void) } if( pm->ps->pm_flags & PMF_DUCKED ) - { pm->maxs[ 2 ] = PCcmaxs[ 2 ]; - pm->ps->viewheight = PCcvh; - } else - { pm->maxs[ 2 ] = PCmaxs[ 2 ]; - pm->ps->viewheight = PCvh; - } + + PM_SetViewheight( ); } @@ -3418,7 +3405,7 @@ PM_Animate */ static void PM_Animate( void ) { - if( PM_Paralyzed( pm->ps ) ) + if( PM_Paralyzed( pm->ps->pm_type ) ) return; if( pm->cmd.buttons & BUTTON_GESTURE ) @@ -3697,7 +3684,7 @@ void PmoveSingle( pmove_t *pmove ) else if( pm->cmd.forwardmove > 0 || ( pm->cmd.forwardmove == 0 && pm->cmd.rightmove ) ) pm->ps->pm_flags &= ~PMF_BACKWARDS_RUN; - if( PM_Paralyzed( pm->ps ) ) + if( PM_Paralyzed( pm->ps->pm_type ) ) { pm->cmd.forwardmove = 0; pm->cmd.rightmove = 0; @@ -3718,6 +3705,8 @@ void PmoveSingle( pmove_t *pmove ) { PM_UpdateViewAngles( pm->ps, &pm->cmd ); PM_NoclipMove( ); + PM_SetViewheight( ); + PM_Weapon( ); PM_DropTimers( ); return; } diff --git a/src/game/bg_public.h b/src/game/bg_public.h index ca61f135..5763c658 100644 --- a/src/game/bg_public.h +++ b/src/game/bg_public.h @@ -116,6 +116,12 @@ typedef enum PM_INTERMISSION, // no movement or status bar } pmtype_t; +// pmtype_t categories +#define PM_Paralyzed( x ) ( (x) == PM_DEAD || (x) == PM_FREEZE ||\ + (x) == PM_INTERMISSION ) +#define PM_Live( x ) ( (x) == PM_NORMAL || (x) == PM_JETPACK ||\ + (x) == PM_GRABBED ) + typedef enum { WEAPON_READY, diff --git a/src/game/g_active.c b/src/game/g_active.c index 8b3b79fc..cee31467 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -40,7 +40,7 @@ void P_DamageFeedback( gentity_t *player ) vec3_t angles; client = player->client; - if( client->ps.pm_type == PM_DEAD ) + if( !PM_Live( client->ps.pm_type ) ) return; // total points of damage shot at the player this frame @@ -457,13 +457,14 @@ 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( queued ) + else if( client->noclip ) + client->ps.pm_type = PM_NOCLIP; + else if( queued ) client->ps.pm_flags |= PMF_QUEUED; - client->ps.speed = BG_Class( client->ps.stats[ STAT_CLASS ] )->speed; + client->ps.pm_type = PM_SPECTATOR; + + client->ps.speed = client->pers.flySpeed; client->ps.stats[ STAT_STAMINA ] = 0; client->ps.stats[ STAT_MISC ] = 0; client->ps.stats[ STAT_BUILDABLE ] = 0; @@ -1495,7 +1496,11 @@ void ClientThink_real( gentity_t *ent ) } // set speed - client->ps.speed = g_speed.value * BG_Class( client->ps.stats[ STAT_CLASS ] )->speed; + if( client->ps.pm_type == PM_NOCLIP ) + client->ps.speed = client->pers.flySpeed; + else + client->ps.speed = g_speed.value * + BG_Class( client->ps.stats[ STAT_CLASS ] )->speed; if( client->lastCreepSlowTime + CREEP_TIMEOUT < level.time ) client->ps.stats[ STAT_STATE ] &= ~SS_CREEPSLOWED; diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index 2a089ba5..11fe5214 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -309,7 +309,7 @@ G_FindOvermind Attempt to find an overmind for self ================ */ -static qboolean G_FindOvermind( gentity_t *self ) +qboolean G_FindOvermind( gentity_t *self ) { int i; gentity_t *ent; @@ -348,7 +348,7 @@ G_IsOvermindBuilt Simple wrapper to G_FindOvermind to check if a location has an overmind ================ */ -qboolean G_IsOvermindBuilt( void ) +static qboolean G_IsOvermindBuilt( void ) { gentity_t dummy; @@ -1395,7 +1395,7 @@ void ABooster_Touch( gentity_t *self, gentity_t *other, trace_t *trace ) if( !client ) return; - if( client && client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS ) + if( client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS ) return; client->ps.stats[ STAT_STATE ] |= SS_BOOSTED; diff --git a/src/game/g_client.c b/src/game/g_client.c index 782f053e..e69581da 100644 --- a/src/game/g_client.c +++ b/src/game/g_client.c @@ -1119,6 +1119,14 @@ void ClientUserinfoChanged( int clientNum ) else client->ps.persistant[ PERS_STATE ] &= ~PS_ALWAYSSPRINT; + // fly speed + s = Info_ValueForKey( userinfo, "cg_flySpeed" ); + + if( *s ) + client->pers.flySpeed = atoi( s ); + else + client->pers.flySpeed = BG_Class( PCL_NONE )->speed; + // teamInfo s = Info_ValueForKey( userinfo, "teamoverlay" ); diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index 87fa5777..06d2ed81 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -2975,12 +2975,13 @@ commands_t cmds[ ] = { { "give", CMD_CHEAT|CMD_TEAM|CMD_LIVING, Cmd_Give_f }, { "god", CMD_CHEAT|CMD_TEAM|CMD_LIVING, Cmd_God_f }, { "notarget", CMD_CHEAT|CMD_TEAM|CMD_LIVING, Cmd_Notarget_f }, - { "noclip", CMD_CHEAT|CMD_TEAM|CMD_LIVING, Cmd_Noclip_f }, + { "noclip", CMD_CHEAT_TEAM, Cmd_Noclip_f }, { "levelshot", CMD_CHEAT, Cmd_LevelShot_f }, - { "setviewpos", CMD_CHEAT, Cmd_SetViewpos_f }, + { "setviewpos", CMD_CHEAT_TEAM, Cmd_SetViewpos_f }, { "destroy", CMD_CHEAT|CMD_TEAM|CMD_LIVING, Cmd_Destroy_f }, { "test", CMD_CHEAT, Cmd_Test_f }, { "damage", CMD_CHEAT|CMD_LIVING, Cmd_Damage_f }, + { "where", 0, Cmd_Where_f }, // game commands { "ptrcverify", CMD_SPEC, Cmd_PTRCVerify_f }, @@ -2990,7 +2991,6 @@ commands_t cmds[ ] = { { "follownext", CMD_SPEC, Cmd_FollowCycle_f }, { "followprev", CMD_SPEC, Cmd_FollowCycle_f }, - { "where", CMD_TEAM, Cmd_Where_f }, { "teamvote", CMD_TEAM, Cmd_TeamVote_f }, { "class", CMD_TEAM, Cmd_Class_f }, { "kill", CMD_TEAM|CMD_LIVING, Cmd_Kill_f }, @@ -3053,7 +3053,8 @@ void ClientCommand( int clientNum ) G_FloodLimited( ent ) ) ) return; - if( cmds[ i ].cmdFlags & CMD_TEAM && + if( ( cmds[ i ].cmdFlags & CMD_TEAM || + ( cmds[ i ].cmdFlags & CMD_CHEAT_TEAM && !g_cheats.integer ) ) && ent->client->pers.teamSelection == TEAM_NONE ) { G_TriggerMenu( clientNum, MN_CMD_TEAM ); diff --git a/src/game/g_local.h b/src/game/g_local.h index 01b6ef5c..f1fa6b11 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -304,6 +304,7 @@ typedef struct int location; // player locations int voteCount; // to prevent people from constantly calling votes qboolean teamInfo; // send team overlay updates? + float flySpeed; // for spectator/noclip moves class_t classSelection; // player class (copied to ent->client->ps.stats[ STAT_CLASS ] once spawned) float evolveHealthFraction; @@ -637,14 +638,15 @@ typedef struct int emoticonCount; } level_locals_t; -#define CMD_CHEAT 0x01 -#define CMD_MESSAGE 0x02 // sends message to others (skip when muted) -#define CMD_TEAM 0x04 // must be on a team -#define CMD_SPEC 0x08 // must be in spectator mode -#define CMD_ALIEN 0x10 -#define CMD_HUMAN 0x20 -#define CMD_LIVING 0x40 -#define CMD_INTERMISSION 0x80 // valid during intermission +#define CMD_CHEAT 0x0001 +#define CMD_CHEAT_TEAM 0x0002 // is a cheat when used on a team +#define CMD_MESSAGE 0x0004 // sends message to others (skip when muted) +#define CMD_TEAM 0x0008 // must be on a team +#define CMD_SPEC 0x0010 // must be in spectator mode +#define CMD_ALIEN 0x0020 +#define CMD_HUMAN 0x0040 +#define CMD_LIVING 0x0080 +#define CMD_INTERMISSION 0x0100 // valid during intermission typedef struct { @@ -730,7 +732,7 @@ gentity_t *G_CheckSpawnPoint( int spawnNum, vec3_t origin, vec3_t normal buildable_t G_IsPowered( vec3_t origin ); qboolean G_IsDCCBuilt( void ); int G_FindDCC( gentity_t *self ); -qboolean G_IsOvermindBuilt( void ); +qboolean G_FindOvermind( gentity_t *self ); qboolean G_FindCreep( gentity_t *self ); void G_BuildableThink( gentity_t *ent, int msec ); diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index 1edb5ccf..13648267 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -920,6 +920,9 @@ qboolean CheckVenomAttack( gentity_t *ent ) if( !traceEnt->takedamage ) return qfalse; + if( traceEnt->health <= 0 ) + return qfalse; + if( !traceEnt->client && !traceEnt->s.eType == ET_BUILDABLE ) return qfalse; |