diff options
| author | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:31:46 -0800 |
|---|---|---|
| committer | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:46:31 -0800 |
| commit | f56bb35301836e56582a575a75864392a0177875 (patch) | |
| tree | de61ddd39de3e7df52759711950b4c288592f0dc /mp/src/game/server/h_ai.cpp | |
| parent | Mark some more files as text. (diff) | |
| download | source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip | |
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/game/server/h_ai.cpp')
| -rw-r--r-- | mp/src/game/server/h_ai.cpp | 532 |
1 files changed, 266 insertions, 266 deletions
diff --git a/mp/src/game/server/h_ai.cpp b/mp/src/game/server/h_ai.cpp index 881f33d6..52dffc8e 100644 --- a/mp/src/game/server/h_ai.cpp +++ b/mp/src/game/server/h_ai.cpp @@ -1,266 +1,266 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose: Utility functions used by AI code.
-//
-//=============================================================================//
-
-#include "cbase.h"
-#include "game.h"
-#include "vstdlib/random.h"
-#include "movevars_shared.h"
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include "tier0/memdbgon.h"
-
-#define NUM_LATERAL_CHECKS 13 // how many checks are made on each side of a NPC looking for lateral cover
-#define NUM_LATERAL_LOS_CHECKS 6 // how many checks are made on each side of a NPC looking for lateral cover
-
-#define TOSS_HEIGHT_MAX 300 // altitude of initial trace done to see how high something can be tossed
-
-//float flRandom = random->RandomFloat(0,1);
-
-bool g_fDrawLines = FALSE;
-
-
-//=========================================================
-// FBoxVisible - a more accurate ( and slower ) version
-// of FVisible.
-//
-// !!!UNDONE - make this CAI_BaseNPC?
-//=========================================================
-bool FBoxVisible( CBaseEntity *pLooker, CBaseEntity *pTarget, Vector &vecTargetOrigin, float flSize )
-{
- // don't look through water
- if ((pLooker->GetWaterLevel() != 3 && pTarget->GetWaterLevel() == 3)
- || (pLooker->GetWaterLevel() == 3 && pTarget->GetWaterLevel() == 0))
- return FALSE;
-
- trace_t tr;
- Vector vecLookerOrigin = pLooker->EyePosition();//look through the NPC's 'eyes'
- for (int i = 0; i < 5; i++)
- {
- Vector vecTarget = pTarget->GetAbsOrigin();
- vecTarget.x += random->RandomFloat( pTarget->WorldAlignMins().x + flSize, pTarget->WorldAlignMaxs().x - flSize);
- vecTarget.y += random->RandomFloat( pTarget->WorldAlignMins().y + flSize, pTarget->WorldAlignMaxs().y - flSize);
- vecTarget.z += random->RandomFloat( pTarget->WorldAlignMins().z + flSize, pTarget->WorldAlignMaxs().z - flSize);
-
- UTIL_TraceLine(vecLookerOrigin, vecTarget, MASK_BLOCKLOS, pLooker, COLLISION_GROUP_NONE, &tr);
-
- if (tr.fraction == 1.0)
- {
- vecTargetOrigin = vecTarget;
- return TRUE;// line of sight is valid.
- }
- }
- return FALSE;// Line of sight is not established
-}
-
-
-
-//-----------------------------------------------------------------------------
-// Purpose: Returns the correct toss velocity to throw a given object at a point.
-// Like the other version of VecCheckToss, but allows you to filter for any
-// number of entities to ignore.
-// Input : pEntity - The object doing the throwing. Is *NOT* automatically included in the
-// filter below.
-// pFilter - A trace filter of entities to ignore in the object's collision sweeps.
-// It is recommended to include at least the thrower.
-// vecSpot1 - The point from which the object is being thrown.
-// vecSpot2 - The point TO which the object is being thrown.
-// flHeightMaxRatio - A scale factor indicating the maximum ratio of height
-// to total throw distance, measured from the higher of the two endpoints to
-// the apex. -1 indicates that there is no maximum.
-// flGravityAdj - Scale factor for gravity - should match the gravity scale
-// that the object will use in midair.
-// bRandomize - when true, introduces a little fudge to the throw
-// Output : Velocity to throw the object with.
-//-----------------------------------------------------------------------------
-Vector VecCheckToss( CBaseEntity *pEntity, ITraceFilter *pFilter, Vector vecSpot1, Vector vecSpot2, float flHeightMaxRatio, float flGravityAdj, bool bRandomize, Vector *vecMins, Vector *vecMaxs )
-{
- trace_t tr;
- Vector vecMidPoint;// halfway point between Spot1 and Spot2
- Vector vecApex;// highest point
- Vector vecScale;
- Vector vecTossVel;
- Vector vecTemp;
- float flGravity = GetCurrentGravity() * flGravityAdj;
-
- if (vecSpot2.z - vecSpot1.z > 500)
- {
- // to high, fail
- return vec3_origin;
- }
-
- Vector forward, right;
- AngleVectors( pEntity->GetLocalAngles(), &forward, &right, NULL );
-
- if (bRandomize)
- {
- // toss a little bit to the left or right, not right down on the enemy's bean (head).
- vecSpot2 += right * ( random->RandomFloat(-8,8) + random->RandomFloat(-16,16) );
- vecSpot2 += forward * ( random->RandomFloat(-8,8) + random->RandomFloat(-16,16) );
- }
-
- // calculate the midpoint and apex of the 'triangle'
- // UNDONE: normalize any Z position differences between spot1 and spot2 so that triangle is always RIGHT
- // get a rough idea of how high it can be thrown
- vecMidPoint = vecSpot1 + (vecSpot2 - vecSpot1) * 0.5;
- UTIL_TraceLine(vecMidPoint, vecMidPoint + Vector(0,0,TOSS_HEIGHT_MAX), MASK_SOLID_BRUSHONLY, pFilter, &tr);
- vecMidPoint = tr.endpos;
-
- if( tr.fraction != 1.0 )
- {
- // (subtract 15 so the object doesn't hit the ceiling)
- vecMidPoint.z -= 15;
- }
-
- if (flHeightMaxRatio != -1)
- {
- // But don't throw so high that it looks silly. Maximize the height of the
- // throw above the highest of the two endpoints to a ratio of the throw length.
- float flHeightMax = flHeightMaxRatio * (vecSpot2 - vecSpot1).Length();
- float flHighestEndZ = MAX(vecSpot1.z, vecSpot2.z);
- if ((vecMidPoint.z - flHighestEndZ) > flHeightMax)
- {
- vecMidPoint.z = flHighestEndZ + flHeightMax;
- }
- }
-
- if (vecMidPoint.z < vecSpot1.z || vecMidPoint.z < vecSpot2.z)
- {
- // Not enough space, fail
- return vec3_origin;
- }
-
- // How high should the object travel to reach the apex
- float distance1 = (vecMidPoint.z - vecSpot1.z);
- float distance2 = (vecMidPoint.z - vecSpot2.z);
-
- // How long will it take for the object to travel this distance
- float time1 = sqrt( distance1 / (0.5 * flGravity) );
- float time2 = sqrt( distance2 / (0.5 * flGravity) );
-
- if (time1 < 0.1)
- {
- // too close
- return vec3_origin;
- }
-
- // how hard to throw sideways to get there in time.
- vecTossVel = (vecSpot2 - vecSpot1) / (time1 + time2);
-
- // how hard upwards to reach the apex at the right time.
- vecTossVel.z = flGravity * time1;
-
- // find the apex
- vecApex = vecSpot1 + vecTossVel * time1;
- vecApex.z = vecMidPoint.z;
-
- // JAY: Repro behavior from HL1 -- toss check went through gratings
- UTIL_TraceLine(vecSpot1, vecApex, (MASK_SOLID&(~CONTENTS_GRATE)), pFilter, &tr);
- if (tr.fraction != 1.0)
- {
- // fail!
- return vec3_origin;
- }
-
- // UNDONE: either ignore NPCs or change it to not care if we hit our enemy
- UTIL_TraceLine(vecSpot2, vecApex, (MASK_SOLID_BRUSHONLY&(~CONTENTS_GRATE)), pFilter, &tr);
- if (tr.fraction != 1.0)
- {
- // fail!
- return vec3_origin;
- }
-
- if ( vecMins && vecMaxs )
- {
- // Check to ensure the entity's hull can travel the first half of the grenade throw
- UTIL_TraceHull( vecSpot1, vecApex, *vecMins, *vecMaxs, (MASK_SOLID&(~CONTENTS_GRATE)), pFilter, &tr);
- if ( tr.fraction < 1.0 )
- return vec3_origin;
- }
-
- return vecTossVel;
-}
-
-
-
-//-----------------------------------------------------------------------------
-// Purpose: Returns the correct toss velocity to throw a given object at a point.
-// Input : pEntity - The entity that is throwing the object.
-// vecSpot1 - The point from which the object is being thrown.
-// vecSpot2 - The point TO which the object is being thrown.
-// flHeightMaxRatio - A scale factor indicating the maximum ratio of height
-// to total throw distance, measured from the higher of the two endpoints to
-// the apex. -1 indicates that there is no maximum.
-// flGravityAdj - Scale factor for gravity - should match the gravity scale
-// that the object will use in midair.
-// bRandomize - when true, introduces a little fudge to the throw
-// Output : Velocity to throw the object with.
-//-----------------------------------------------------------------------------
-Vector VecCheckToss( CBaseEntity *pEntity, Vector vecSpot1, Vector vecSpot2, float flHeightMaxRatio, float flGravityAdj, bool bRandomize, Vector *vecMins, Vector *vecMaxs )
-{
- // construct a filter and call through to the other version of this function.
- CTraceFilterSimple traceFilter( pEntity, COLLISION_GROUP_NONE );
- return VecCheckToss( pEntity, &traceFilter, vecSpot1, vecSpot2,
- flHeightMaxRatio, flGravityAdj, bRandomize,
- vecMins, vecMaxs );
-}
-
-//
-// VecCheckThrow - returns the velocity vector at which an object should be thrown from vecspot1 to hit vecspot2.
-// returns vec3_origin if throw is not feasible.
-//
-Vector VecCheckThrow ( CBaseEntity *pEdict, const Vector &vecSpot1, Vector vecSpot2, float flSpeed, float flGravityAdj, Vector *vecMins, Vector *vecMaxs )
-{
- float flGravity = GetCurrentGravity() * flGravityAdj;
-
- Vector vecGrenadeVel = (vecSpot2 - vecSpot1);
-
- // throw at a constant time
- float time = vecGrenadeVel.Length( ) / flSpeed;
- vecGrenadeVel = vecGrenadeVel * (1.0 / time);
-
- // adjust upward toss to compensate for gravity loss
- vecGrenadeVel.z += flGravity * time * 0.5;
-
- Vector vecApex = vecSpot1 + (vecSpot2 - vecSpot1) * 0.5;
- vecApex.z += 0.5 * flGravity * (time * 0.5) * (time * 0.5);
-
-
- trace_t tr;
- UTIL_TraceLine(vecSpot1, vecApex, MASK_SOLID, pEdict, COLLISION_GROUP_NONE, &tr);
- if (tr.fraction != 1.0)
- {
- // fail!
- //NDebugOverlay::Line( vecSpot1, vecApex, 255, 0, 0, true, 5.0 );
- return vec3_origin;
- }
-
- //NDebugOverlay::Line( vecSpot1, vecApex, 0, 255, 0, true, 5.0 );
-
- UTIL_TraceLine(vecSpot2, vecApex, MASK_SOLID_BRUSHONLY, pEdict, COLLISION_GROUP_NONE, &tr);
- if (tr.fraction != 1.0)
- {
- // fail!
- //NDebugOverlay::Line( vecApex, vecSpot2, 255, 0, 0, true, 5.0 );
- return vec3_origin;
- }
-
- //NDebugOverlay::Line( vecApex, vecSpot2, 0, 255, 0, true, 5.0 );
-
- if ( vecMins && vecMaxs )
- {
- // Check to ensure the entity's hull can travel the first half of the grenade throw
- UTIL_TraceHull( vecSpot1, vecApex, *vecMins, *vecMaxs, MASK_SOLID, pEdict, COLLISION_GROUP_NONE, &tr);
- if ( tr.fraction < 1.0 )
- {
- //NDebugOverlay::SweptBox( vecSpot1, tr.endpos, *vecMins, *vecMaxs, vec3_angle, 255, 0, 0, 64, 5.0 );
- return vec3_origin;
- }
- }
-
- //NDebugOverlay::SweptBox( vecSpot1, vecApex, *vecMins, *vecMaxs, vec3_angle, 0, 255, 0, 64, 5.0 );
-
- return vecGrenadeVel;
-}
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Utility functions used by AI code. +// +//=============================================================================// + +#include "cbase.h" +#include "game.h" +#include "vstdlib/random.h" +#include "movevars_shared.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +#define NUM_LATERAL_CHECKS 13 // how many checks are made on each side of a NPC looking for lateral cover +#define NUM_LATERAL_LOS_CHECKS 6 // how many checks are made on each side of a NPC looking for lateral cover + +#define TOSS_HEIGHT_MAX 300 // altitude of initial trace done to see how high something can be tossed + +//float flRandom = random->RandomFloat(0,1); + +bool g_fDrawLines = FALSE; + + +//========================================================= +// FBoxVisible - a more accurate ( and slower ) version +// of FVisible. +// +// !!!UNDONE - make this CAI_BaseNPC? +//========================================================= +bool FBoxVisible( CBaseEntity *pLooker, CBaseEntity *pTarget, Vector &vecTargetOrigin, float flSize ) +{ + // don't look through water + if ((pLooker->GetWaterLevel() != 3 && pTarget->GetWaterLevel() == 3) + || (pLooker->GetWaterLevel() == 3 && pTarget->GetWaterLevel() == 0)) + return FALSE; + + trace_t tr; + Vector vecLookerOrigin = pLooker->EyePosition();//look through the NPC's 'eyes' + for (int i = 0; i < 5; i++) + { + Vector vecTarget = pTarget->GetAbsOrigin(); + vecTarget.x += random->RandomFloat( pTarget->WorldAlignMins().x + flSize, pTarget->WorldAlignMaxs().x - flSize); + vecTarget.y += random->RandomFloat( pTarget->WorldAlignMins().y + flSize, pTarget->WorldAlignMaxs().y - flSize); + vecTarget.z += random->RandomFloat( pTarget->WorldAlignMins().z + flSize, pTarget->WorldAlignMaxs().z - flSize); + + UTIL_TraceLine(vecLookerOrigin, vecTarget, MASK_BLOCKLOS, pLooker, COLLISION_GROUP_NONE, &tr); + + if (tr.fraction == 1.0) + { + vecTargetOrigin = vecTarget; + return TRUE;// line of sight is valid. + } + } + return FALSE;// Line of sight is not established +} + + + +//----------------------------------------------------------------------------- +// Purpose: Returns the correct toss velocity to throw a given object at a point. +// Like the other version of VecCheckToss, but allows you to filter for any +// number of entities to ignore. +// Input : pEntity - The object doing the throwing. Is *NOT* automatically included in the +// filter below. +// pFilter - A trace filter of entities to ignore in the object's collision sweeps. +// It is recommended to include at least the thrower. +// vecSpot1 - The point from which the object is being thrown. +// vecSpot2 - The point TO which the object is being thrown. +// flHeightMaxRatio - A scale factor indicating the maximum ratio of height +// to total throw distance, measured from the higher of the two endpoints to +// the apex. -1 indicates that there is no maximum. +// flGravityAdj - Scale factor for gravity - should match the gravity scale +// that the object will use in midair. +// bRandomize - when true, introduces a little fudge to the throw +// Output : Velocity to throw the object with. +//----------------------------------------------------------------------------- +Vector VecCheckToss( CBaseEntity *pEntity, ITraceFilter *pFilter, Vector vecSpot1, Vector vecSpot2, float flHeightMaxRatio, float flGravityAdj, bool bRandomize, Vector *vecMins, Vector *vecMaxs ) +{ + trace_t tr; + Vector vecMidPoint;// halfway point between Spot1 and Spot2 + Vector vecApex;// highest point + Vector vecScale; + Vector vecTossVel; + Vector vecTemp; + float flGravity = GetCurrentGravity() * flGravityAdj; + + if (vecSpot2.z - vecSpot1.z > 500) + { + // to high, fail + return vec3_origin; + } + + Vector forward, right; + AngleVectors( pEntity->GetLocalAngles(), &forward, &right, NULL ); + + if (bRandomize) + { + // toss a little bit to the left or right, not right down on the enemy's bean (head). + vecSpot2 += right * ( random->RandomFloat(-8,8) + random->RandomFloat(-16,16) ); + vecSpot2 += forward * ( random->RandomFloat(-8,8) + random->RandomFloat(-16,16) ); + } + + // calculate the midpoint and apex of the 'triangle' + // UNDONE: normalize any Z position differences between spot1 and spot2 so that triangle is always RIGHT + // get a rough idea of how high it can be thrown + vecMidPoint = vecSpot1 + (vecSpot2 - vecSpot1) * 0.5; + UTIL_TraceLine(vecMidPoint, vecMidPoint + Vector(0,0,TOSS_HEIGHT_MAX), MASK_SOLID_BRUSHONLY, pFilter, &tr); + vecMidPoint = tr.endpos; + + if( tr.fraction != 1.0 ) + { + // (subtract 15 so the object doesn't hit the ceiling) + vecMidPoint.z -= 15; + } + + if (flHeightMaxRatio != -1) + { + // But don't throw so high that it looks silly. Maximize the height of the + // throw above the highest of the two endpoints to a ratio of the throw length. + float flHeightMax = flHeightMaxRatio * (vecSpot2 - vecSpot1).Length(); + float flHighestEndZ = MAX(vecSpot1.z, vecSpot2.z); + if ((vecMidPoint.z - flHighestEndZ) > flHeightMax) + { + vecMidPoint.z = flHighestEndZ + flHeightMax; + } + } + + if (vecMidPoint.z < vecSpot1.z || vecMidPoint.z < vecSpot2.z) + { + // Not enough space, fail + return vec3_origin; + } + + // How high should the object travel to reach the apex + float distance1 = (vecMidPoint.z - vecSpot1.z); + float distance2 = (vecMidPoint.z - vecSpot2.z); + + // How long will it take for the object to travel this distance + float time1 = sqrt( distance1 / (0.5 * flGravity) ); + float time2 = sqrt( distance2 / (0.5 * flGravity) ); + + if (time1 < 0.1) + { + // too close + return vec3_origin; + } + + // how hard to throw sideways to get there in time. + vecTossVel = (vecSpot2 - vecSpot1) / (time1 + time2); + + // how hard upwards to reach the apex at the right time. + vecTossVel.z = flGravity * time1; + + // find the apex + vecApex = vecSpot1 + vecTossVel * time1; + vecApex.z = vecMidPoint.z; + + // JAY: Repro behavior from HL1 -- toss check went through gratings + UTIL_TraceLine(vecSpot1, vecApex, (MASK_SOLID&(~CONTENTS_GRATE)), pFilter, &tr); + if (tr.fraction != 1.0) + { + // fail! + return vec3_origin; + } + + // UNDONE: either ignore NPCs or change it to not care if we hit our enemy + UTIL_TraceLine(vecSpot2, vecApex, (MASK_SOLID_BRUSHONLY&(~CONTENTS_GRATE)), pFilter, &tr); + if (tr.fraction != 1.0) + { + // fail! + return vec3_origin; + } + + if ( vecMins && vecMaxs ) + { + // Check to ensure the entity's hull can travel the first half of the grenade throw + UTIL_TraceHull( vecSpot1, vecApex, *vecMins, *vecMaxs, (MASK_SOLID&(~CONTENTS_GRATE)), pFilter, &tr); + if ( tr.fraction < 1.0 ) + return vec3_origin; + } + + return vecTossVel; +} + + + +//----------------------------------------------------------------------------- +// Purpose: Returns the correct toss velocity to throw a given object at a point. +// Input : pEntity - The entity that is throwing the object. +// vecSpot1 - The point from which the object is being thrown. +// vecSpot2 - The point TO which the object is being thrown. +// flHeightMaxRatio - A scale factor indicating the maximum ratio of height +// to total throw distance, measured from the higher of the two endpoints to +// the apex. -1 indicates that there is no maximum. +// flGravityAdj - Scale factor for gravity - should match the gravity scale +// that the object will use in midair. +// bRandomize - when true, introduces a little fudge to the throw +// Output : Velocity to throw the object with. +//----------------------------------------------------------------------------- +Vector VecCheckToss( CBaseEntity *pEntity, Vector vecSpot1, Vector vecSpot2, float flHeightMaxRatio, float flGravityAdj, bool bRandomize, Vector *vecMins, Vector *vecMaxs ) +{ + // construct a filter and call through to the other version of this function. + CTraceFilterSimple traceFilter( pEntity, COLLISION_GROUP_NONE ); + return VecCheckToss( pEntity, &traceFilter, vecSpot1, vecSpot2, + flHeightMaxRatio, flGravityAdj, bRandomize, + vecMins, vecMaxs ); +} + +// +// VecCheckThrow - returns the velocity vector at which an object should be thrown from vecspot1 to hit vecspot2. +// returns vec3_origin if throw is not feasible. +// +Vector VecCheckThrow ( CBaseEntity *pEdict, const Vector &vecSpot1, Vector vecSpot2, float flSpeed, float flGravityAdj, Vector *vecMins, Vector *vecMaxs ) +{ + float flGravity = GetCurrentGravity() * flGravityAdj; + + Vector vecGrenadeVel = (vecSpot2 - vecSpot1); + + // throw at a constant time + float time = vecGrenadeVel.Length( ) / flSpeed; + vecGrenadeVel = vecGrenadeVel * (1.0 / time); + + // adjust upward toss to compensate for gravity loss + vecGrenadeVel.z += flGravity * time * 0.5; + + Vector vecApex = vecSpot1 + (vecSpot2 - vecSpot1) * 0.5; + vecApex.z += 0.5 * flGravity * (time * 0.5) * (time * 0.5); + + + trace_t tr; + UTIL_TraceLine(vecSpot1, vecApex, MASK_SOLID, pEdict, COLLISION_GROUP_NONE, &tr); + if (tr.fraction != 1.0) + { + // fail! + //NDebugOverlay::Line( vecSpot1, vecApex, 255, 0, 0, true, 5.0 ); + return vec3_origin; + } + + //NDebugOverlay::Line( vecSpot1, vecApex, 0, 255, 0, true, 5.0 ); + + UTIL_TraceLine(vecSpot2, vecApex, MASK_SOLID_BRUSHONLY, pEdict, COLLISION_GROUP_NONE, &tr); + if (tr.fraction != 1.0) + { + // fail! + //NDebugOverlay::Line( vecApex, vecSpot2, 255, 0, 0, true, 5.0 ); + return vec3_origin; + } + + //NDebugOverlay::Line( vecApex, vecSpot2, 0, 255, 0, true, 5.0 ); + + if ( vecMins && vecMaxs ) + { + // Check to ensure the entity's hull can travel the first half of the grenade throw + UTIL_TraceHull( vecSpot1, vecApex, *vecMins, *vecMaxs, MASK_SOLID, pEdict, COLLISION_GROUP_NONE, &tr); + if ( tr.fraction < 1.0 ) + { + //NDebugOverlay::SweptBox( vecSpot1, tr.endpos, *vecMins, *vecMaxs, vec3_angle, 255, 0, 0, 64, 5.0 ); + return vec3_origin; + } + } + + //NDebugOverlay::SweptBox( vecSpot1, vecApex, *vecMins, *vecMaxs, vec3_angle, 0, 255, 0, 64, 5.0 ); + + return vecGrenadeVel; +} |