summaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
authorBen Millwood <thebenmachine@gmail.com>2009-10-03 12:16:05 +0000
committerTim Angus <tim@ngus.net>2013-01-03 00:15:48 +0000
commitccbc1b2f5a63cdf5545390d35bf0364a1073d395 (patch)
treefa04d8845b9b8a814a20a57dad8bf22b17176bb3 /src/game
parentc56b5dd095d6f710b3de27ab053f63b018c4483a (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.c61
-rw-r--r--src/game/bg_public.h6
-rw-r--r--src/game/g_active.c19
-rw-r--r--src/game/g_buildable.c6
-rw-r--r--src/game/g_client.c8
-rw-r--r--src/game/g_cmds.c9
-rw-r--r--src/game/g_local.h20
-rw-r--r--src/game/g_weapon.c3
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;