summaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
authorPaweł Redman <pawel.redman@gmail.com>2015-04-07 13:34:17 +0200
committerPaweł Redman <pawel.redman@gmail.com>2015-04-07 13:34:17 +0200
commit84788917d2deb14f07c5710f2f9eaaae3f0b50a2 (patch)
tree0eca2e499cd6d744c6be2f55db5c91d1aa906781 /src/game
parent7bf6dbfed060ded89da8c53ae8b712e62bd19da2 (diff)
Rename damage blobs to damage indicators.
Diffstat (limited to 'src/game')
-rw-r--r--src/game/bg_public.h9
-rw-r--r--src/game/g_active.c22
-rw-r--r--src/game/g_combat.c95
-rw-r--r--src/game/g_local.h8
4 files changed, 84 insertions, 50 deletions
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index a04d053..1e9d23c 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -1244,7 +1244,8 @@ typedef struct
} dummyCmd_t;
int cmdcmp( const void *a, const void *b );
-// damage blob flags
-#define DAMAGE_BLOB_SPLASH 1 // has to be 1
-#define DAMAGE_BLOB_BUILDABLE 2 // has to be 2
-#define DAMAGE_BLOB_FRIENDLY 4
+// damage indicator flags
+#define DIF_INDIRECT 0x0001 // has to be 1
+#define DIF_BUILDABLE 0x0002 // has to be 2
+#define DIF_FRIENDLY 0x0004
+#define DIF_PERSISTENT 0x0008 // poison and infection
diff --git a/src/game/g_active.c b/src/game/g_active.c
index 02cb6e9..0c84f57 100644
--- a/src/game/g_active.c
+++ b/src/game/g_active.c
@@ -2270,33 +2270,33 @@ void ClientThink( int clientNum )
void G_RunClient( gentity_t *ent )
{
// send all buffered damage blobs
- if( ent->client->bufferedBlobCount )
+ if( ent->client->diBufferCounter )
{
int i;
- g_damageBlob_t *blob;
+ g_damageIndicator_t *di;
char *p, buffer[ 1024 ];
- strcpy( buffer, "dblob" );
- p = buffer + 5;
+ strcpy( buffer, "di" );
+ p = buffer + 2;
- for( i = 0; i < ent->client->bufferedBlobCount; i++ )
+ for( i = 0; i < ent->client->diBufferCounter; i++ )
{
char smallbuf[ 64 ];
int len;
- blob = ent->client->blobBuffer + i;
+ di = ent->client->diBuffer + i;
Com_sprintf( smallbuf, sizeof( smallbuf ), " %.0f %.0f %.0f %d %d",
- blob->origin[ 0 ], blob->origin[ 1 ], blob->origin[ 2 ],
- blob->value, blob->flags );
+ di->origin[ 0 ], di->origin[ 1 ], di->origin[ 2 ],
+ di->value, di->flags );
len = strlen( smallbuf );
if( p - buffer + len + 1 > sizeof( buffer ) )
{
G_SendPublicServerCommand( ent - g_entities, buffer );
- strcpy( buffer, "dblob" );
- p = buffer + 5;
+ strcpy( buffer, "di" );
+ p = buffer + 2;
}
strcpy( p, smallbuf );
@@ -2306,7 +2306,7 @@ void G_RunClient( gentity_t *ent )
if( p > buffer + 6 )
G_SendPublicServerCommand( ent - g_entities, buffer );
- ent->client->bufferedBlobCount = 0;
+ ent->client->diBufferCounter = 0;
}
// update the public health field
diff --git a/src/game/g_combat.c b/src/game/g_combat.c
index 423b517..b0d435b 100644
--- a/src/game/g_combat.c
+++ b/src/game/g_combat.c
@@ -1117,6 +1117,69 @@ void G_InitDamageLocations( void )
/*
============
+G_SpawnDamageIndicator
+
+Computes a damage indicator for a given hit and stores it in the
+player's damage indicator buffer.
+============
+*/
+void G_SpawnDamageIndicator( gentity_t *ent, gentity_t *inflictor,
+ gentity_t *targ, const vec3_t point, int mod, int take, int dflags )
+{
+ g_damageIndicator_t *di;
+
+ if( !ent || !ent->client )
+ return;
+
+ if( ent == targ )
+ return;
+
+ if( !take )
+ return;
+
+ if( ent->client->diBufferCounter >= MAX_BUFFERED_DAMAGE_INDICATORS )
+ return;
+
+ di = ent->client->diBuffer + ent->client->diBufferCounter++;
+ di->value = take;
+
+ di->flags = 0;
+
+ if( targ->s.eType == ET_BUILDABLE )
+ di->flags |= DIF_BUILDABLE;
+
+ if( OnSameTeam( ent, targ ) ||
+ ( targ->s.eType == ET_BUILDABLE &&
+ ent->client->pers.teamSelection == targ->buildableTeam ) )
+ di->flags |= DIF_FRIENDLY;
+
+ if( dflags & DAMAGE_RADIUS )
+ di->flags |= DIF_INDIRECT;
+
+ switch( mod )
+ {
+ case MOD_POISON:
+ case MOD_INFECTION:
+ di->flags |= DIF_INDIRECT | DIF_PERSISTENT;
+ break;
+
+ case MOD_DECONSTRUCT:
+ return;
+ }
+
+ if( di->flags & DIF_INDIRECT )
+ {
+ VectorAdd( targ->r.absmin, targ->r.absmax, di->origin );
+ VectorScale( di->origin, 0.5f, di->origin );
+ }
+ else if( inflictor->s.eType == ET_MISSILE )
+ VectorCopy( inflictor->r.currentOrigin, di->origin );
+ else
+ VectorCopy( point, di->origin );
+}
+
+/*
+============
T_Damage
targ entity that is being damaged
@@ -1446,37 +1509,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
G_CombatStats_HitMOD( attacker, targ, mod, take );
-
- if( attacker && attacker->client && take && attacker != targ &&
- attacker->client->bufferedBlobCount < MAX_BUFFERED_BLOBS )
- {
- g_damageBlob_t *blob;
-
- blob = attacker->client->blobBuffer +
- ( attacker->client->bufferedBlobCount++ );
-
- blob->flags = 0;
- blob->value = take;
-
- if( OnSameTeam( attacker, targ ) ||
- ( targ->s.eType == ET_BUILDABLE &&
- attacker->client->pers.teamSelection == targ->buildableTeam ) )
- blob->flags |= DAMAGE_BLOB_FRIENDLY;
-
- if( targ->s.eType == ET_BUILDABLE )
- blob->flags |= DAMAGE_BLOB_BUILDABLE;
-
- if( ( dflags & DAMAGE_RADIUS ) || mod == MOD_POISON )
- {
- blob->flags |= DAMAGE_BLOB_SPLASH;
- VectorAdd( targ->r.absmin, targ->r.absmax, blob->origin );
- VectorScale( blob->origin, 0.5f, blob->origin );
- }
- else if( inflictor->s.eType == ET_MISSILE )
- VectorCopy( inflictor->r.currentOrigin, blob->origin );
- else
- VectorCopy( point, blob->origin );
- }
+ G_SpawnDamageIndicator( attacker, inflictor, targ, point, mod, take, dflags );
if( targ->health <= 0 )
{
diff --git a/src/game/g_local.h b/src/game/g_local.h
index cbf98bd..b4f6d81 100644
--- a/src/game/g_local.h
+++ b/src/game/g_local.h
@@ -403,13 +403,13 @@ typedef struct unlagged_s {
qboolean used;
} unlagged_t;
-#define MAX_BUFFERED_BLOBS 20
+#define MAX_BUFFERED_DAMAGE_INDICATORS 20
typedef struct
{
vec3_t origin;
int value;
int flags;
-} g_damageBlob_t;
+} g_damageIndicator_t;
#define MAX_TRAMPLE_BUILDABLES_TRACKED 20
// this structure is cleared on each ClientSpawn(),
@@ -520,8 +520,8 @@ struct gclient_s
int notrackEndTime; // Time when the current no track period ends
int blobs;
- g_damageBlob_t blobBuffer[ MAX_BUFFERED_BLOBS ];
- int bufferedBlobCount;
+ g_damageIndicator_t diBuffer[ MAX_BUFFERED_DAMAGE_INDICATORS ];
+ int diBufferCounter;
};