source-engine/game/server/physics_impact_damage.h

67 lines
2.2 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef PHYSICS_IMPACT_DAMAGE_H
#define PHYSICS_IMPACT_DAMAGE_H
#ifdef _WIN32
#pragma once
#endif
struct impactentry_t
{
float impulse;
float damage;
};
// UNDONE: Add a flag to turn off aggregation of mass in object systems (e.g. ragdolls, vehicles)?
struct impactdamagetable_t
{
impactentry_t *linearTable;
impactentry_t *angularTable;
int linearCount; // array size of linearTable
int angularCount; // array size of angularTable
float minSpeedSqr; // minimum squared impact speed for damage
float minRotSpeedSqr;
float minMass; // minimum mass to do damage
// filter out reall small objects, set all to zero to disable
float smallMassMax;
float smallMassCap;
float smallMassMinSpeedSqr;
// exaggerate the effects of really large objects, set all to 1 to disable
float largeMassMin;
float largeMassScale;
float largeMassFallingScale; // emphasize downward impacts so that this will kill instead of stress (we have more information here than there)
float myMinVelocity; // filter out any energy lost by me unless my velocity is greater than this
};
extern impactdamagetable_t gDefaultNPCImpactDamageTable;
extern impactdamagetable_t gDefaultPlayerImpactDamageTable;
extern impactdamagetable_t gDefaultPlayerVehicleImpactDamageTable;
// NOTE Default uses default NPC table
float CalculateDefaultPhysicsDamage( int index, gamevcollisionevent_t *pEvent, float energyScale, bool allowStaticDamage, int &damageTypeOut, string_t iszDamageTableName = NULL_STRING, bool bDamageFromHeldObjects = false );
// use passes in the table
float CalculatePhysicsImpactDamage( int index, gamevcollisionevent_t *pEvent, const impactdamagetable_t &table, float energyScale, bool allowStaticDamage, int &damageTypeOut, bool bDamageFromHeldObjects = false );
struct vphysics_objectstress_t
{
float exertedStress;
float receivedStress;
bool hasNonStaticStress;
bool hasLargeObjectContact;
};
float CalculateObjectStress( IPhysicsObject *pObject, CBaseEntity *pOwnerEntity, vphysics_objectstress_t *pOutput );
#endif // PHYSICS_IMPACT_DAMAGE_H