diff options
Diffstat (limited to 'src/game')
-rw-r--r-- | src/game/g_buildable.c | 2 | ||||
-rw-r--r-- | src/game/g_combat.c | 44 | ||||
-rw-r--r-- | src/game/g_local.h | 5 | ||||
-rw-r--r-- | src/game/g_main.c | 2 | ||||
-rw-r--r-- | src/game/g_missile.c | 8 | ||||
-rw-r--r-- | src/game/g_weapon.c | 10 |
6 files changed, 37 insertions, 34 deletions
diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index f6a98f6..a65f2a0 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -2607,7 +2607,7 @@ void HSpawn_Blast( gentity_t *self ) //do some radius damage G_RadiusDamage( self->s.pos.trBase, self, self->splashDamage, - self->splashRadius, self, self->splashMethodOfDeath ); + self->splashRadius, self, 0, self->splashMethodOfDeath ); self->think = freeBuildable; self->nextthink = level.time + 100; diff --git a/src/game/g_combat.c b/src/game/g_combat.c index 81a5345..d8eef62 100644 --- a/src/game/g_combat.c +++ b/src/game/g_combat.c @@ -1233,7 +1233,7 @@ inflictor, attacker, dir, and point can be NULL for environmental effects dflags these flags are used to control how T_Damage works DAMAGE_RADIUS damage was indirect (from a nearby explosion) DAMAGE_NO_ARMOR armor does not protect from this damage - DAMAGE_NO_KNOCKBACK do not affect velocity, just view angles + DAMAGE_KNOCKBACK affect velocity, not just view angles DAMAGE_NO_PROTECTION kills godmode, armor, everything ============ */ @@ -1252,7 +1252,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, gclient_t *client; int take; int asave = 0; - int knockback; + int knockback = 0; float damagemodifier=0.0; int takeNoOverkill; @@ -1294,32 +1294,32 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, } if( !dir ) - dflags |= DAMAGE_NO_KNOCKBACK; + dflags &= ~DAMAGE_KNOCKBACK; else VectorNormalize( dir ); - knockback = damage; - - if( inflictor->s.weapon != WP_NONE ) + if( dflags & DAMAGE_KNOCKBACK ) { - knockback = (int)( (float)knockback * - BG_FindKnockbackScaleForWeapon( inflictor->s.weapon ) ); - } + knockback = damage; - if( targ->client ) - { - knockback = (int)( (float)knockback * - BG_FindKnockbackScaleForClass( targ->client->ps.stats[ STAT_PCLASS ] ) ); - } + if( inflictor->s.weapon != WP_NONE ) + { + knockback = (int)( (float)knockback * + BG_FindKnockbackScaleForWeapon( inflictor->s.weapon ) ); + } - if( knockback > 200 ) - knockback = 200; + if( targ->client ) + { + knockback = (int)( (float)knockback * + BG_FindKnockbackScaleForClass( targ->client->ps.stats[ STAT_PCLASS ] ) ); + } - if( targ->flags & FL_NO_KNOCKBACK ) - knockback = 0; + if( knockback > 200 ) + knockback = 200; - if( dflags & DAMAGE_NO_KNOCKBACK ) - knockback = 0; + if( targ->flags & FL_NO_KNOCKBACK ) + knockback = 0; + } // figure momentum add, even if the damage won't be taken if( knockback && targ->client ) @@ -1882,7 +1882,7 @@ G_RadiusDamage ============ */ qboolean G_RadiusDamage( vec3_t origin, gentity_t *attacker, float damage, - float radius, gentity_t *ignore, int mod ) + float radius, gentity_t *ignore, int dflags, int mod ) { float points, dist; gentity_t *ent; @@ -1939,7 +1939,7 @@ qboolean G_RadiusDamage( vec3_t origin, gentity_t *attacker, float damage, // get knocked into the air more dir[ 2 ] += 24; G_Damage( ent, NULL, attacker, dir, origin, - (int)points, DAMAGE_RADIUS|DAMAGE_NO_LOCDAMAGE, mod ); + (int)points, DAMAGE_RADIUS|DAMAGE_NO_LOCDAMAGE|dflags, mod ); } } diff --git a/src/game/g_local.h b/src/game/g_local.h index 6547741..46bc31d 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -168,6 +168,7 @@ struct gentity_s qboolean takedamage; int damage; + int dflags; int splashDamage; // quad will increase this without increasing radius int splashRadius; int methodOfDeath; @@ -1014,7 +1015,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, void G_SelectiveDamage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_t dir, vec3_t point, int damage, int dflags, int mod, int team ); qboolean G_RadiusDamage( vec3_t origin, gentity_t *attacker, float damage, float radius, - gentity_t *ignore, int mod ); + gentity_t *ignore, int dflags, int mod ); qboolean G_SelectiveRadiusDamage( vec3_t origin, gentity_t *attacker, float damage, float radius, gentity_t *ignore, int mod, int team ); void G_Knockback( gentity_t *targ, vec3_t dir, int knockback ); @@ -1026,7 +1027,7 @@ void G_InitDamageLocations( void ); // damage flags #define DAMAGE_RADIUS 0x00000001 // damage was indirect #define DAMAGE_NO_ARMOR 0x00000002 // armour does not protect from this damage -#define DAMAGE_NO_KNOCKBACK 0x00000004 // do not affect velocity, just view angles +#define DAMAGE_KNOCKBACK 0x00000004 // affect velocity, not just view angles #define DAMAGE_NO_PROTECTION 0x00000008 // armor, shields, invulnerability, and godmode have no effect #define DAMAGE_NO_LOCDAMAGE 0x00000010 // do not apply locational damage diff --git a/src/game/g_main.c b/src/game/g_main.c index 99079e8..7e72b87 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -3239,7 +3239,7 @@ static void G_CheckVampireDeathBuildables( void ) ent->health -= damage; else G_Damage( ent, NULL, NULL, NULL, NULL, damage, - DAMAGE_NO_ARMOR|DAMAGE_NO_KNOCKBACK|DAMAGE_NO_PROTECTION|DAMAGE_NO_LOCDAMAGE, MOD_SUICIDE ); + DAMAGE_NO_ARMOR|DAMAGE_NO_PROTECTION|DAMAGE_NO_LOCDAMAGE, MOD_SUICIDE ); } } diff --git a/src/game/g_missile.c b/src/game/g_missile.c index 71b5432..680f49d 100644 --- a/src/game/g_missile.c +++ b/src/game/g_missile.c @@ -92,7 +92,7 @@ void G_ExplodeMissile( gentity_t *ent ) // splash damage if( ent->splashDamage ) G_RadiusDamage( ent->r.currentOrigin, ent->parent, ent->splashDamage, - ent->splashRadius, ent, ent->splashMethodOfDeath ); + ent->splashRadius, ent, ent->dflags, ent->splashMethodOfDeath ); trap_LinkEntity( ent ); } @@ -199,7 +199,7 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace ) velocity[ 2 ] = 1; // stepped on a grenade G_Damage( other, ent, attacker, velocity, ent->s.origin, ent->damage, - 0, ent->methodOfDeath ); + ent->dflags, ent->methodOfDeath ); } } @@ -231,7 +231,7 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace ) // splash damage (doesn't apply to person directly hit) if( ent->splashDamage ) G_RadiusDamage( trace->endpos, ent->parent, ent->splashDamage, ent->splashRadius, - other, ent->splashMethodOfDeath ); + other, ent->dflags, ent->splashMethodOfDeath ); trap_LinkEntity( ent ); } @@ -459,6 +459,7 @@ gentity_t *fire_luciferCannon( gentity_t *self, vec3_t start, vec3_t dir, int da bolt->r.ownerNum = self->s.number; bolt->parent = self; bolt->damage = localDamage; + bolt->dflags = DAMAGE_KNOCKBACK; bolt->splashDamage = localDamage / 2; bolt->splashRadius = radius; bolt->methodOfDeath = MOD_LCANNON; @@ -816,6 +817,7 @@ gentity_t *fire_bounceBall( gentity_t *self, vec3_t start, vec3_t dir ) bolt->r.ownerNum = self->s.number; bolt->parent = self; bolt->damage = LEVEL3_BOUNCEBALL_DMG; + bolt->dflags = DAMAGE_KNOCKBACK; bolt->splashDamage = 0; bolt->splashRadius = 0; bolt->methodOfDeath = MOD_LEVEL3_BOUNCEBALL; diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index bc1491b..8ab005e 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -258,7 +258,7 @@ void meleeAttack( gentity_t *ent, float range, float width, int damage, meansOfD } if( traceEnt->takedamage ) - G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage, DAMAGE_NO_KNOCKBACK, mod ); + G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage, 0, mod ); } /* @@ -644,7 +644,7 @@ void painSawFire( gentity_t *ent ) } if( traceEnt->takedamage ) - G_Damage( traceEnt, ent, ent, forward, tr.endpos, PAINSAW_DAMAGE, DAMAGE_NO_KNOCKBACK, MOD_PAINSAW ); + G_Damage( traceEnt, ent, ent, forward, tr.endpos, PAINSAW_DAMAGE, 0, MOD_PAINSAW ); } /* @@ -929,7 +929,7 @@ qboolean CheckVenomAttack( gentity_t *ent ) tent->s.generic1 = ent->s.generic1; //weaponMode } - G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage, DAMAGE_NO_KNOCKBACK, MOD_LEVEL0_BITE ); + G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage, 0, MOD_LEVEL0_BITE ); return qtrue; } @@ -1287,7 +1287,7 @@ void G_UpdateZaps( int msec ) if( damage ) { G_Damage( target, source, zap->creator, forward, target->s.origin, - damage, DAMAGE_NO_KNOCKBACK | DAMAGE_NO_LOCDAMAGE, MOD_LEVEL2_ZAP ); + damage, DAMAGE_NO_LOCDAMAGE, MOD_LEVEL2_ZAP ); if( g_modAlienRate.integer > 0 ) damage = damage * 100 / g_modAlienRate.integer; zap->damageUsed += damage; @@ -1404,7 +1404,7 @@ qboolean CheckPounceAttack( gentity_t *ent ) ent->client->pmext.pouncePayload = 0; G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage, - DAMAGE_NO_KNOCKBACK|DAMAGE_NO_LOCDAMAGE, MOD_LEVEL3_POUNCE ); + DAMAGE_NO_LOCDAMAGE, MOD_LEVEL3_POUNCE ); ent->client->allowedToPounce = qfalse; |