Simple trace check

This commit is contained in:
mittorn 2016-03-27 19:58:18 +00:00
parent 1b811d5644
commit 9c36b3d4f5
1 changed files with 23 additions and 16 deletions

View File

@ -49,10 +49,10 @@ public:
int iItemSlot(void) { return 4; } int iItemSlot(void) { return 4; }
int GetItemInfo(ItemInfo *p); int GetItemInfo(ItemInfo *p);
int AddToPlayer(CBasePlayer *pPlayer); int AddToPlayer(CBasePlayer *pPlayer);
int m_iStage = 0; int m_iStage;
BOOL Deploy(void); BOOL Deploy(void);
void Holster(int skiplocal = 0); void Holster(int skiplocal = 0);
int m_iGrabFailures = 0; int m_iGrabFailures;
EHANDLE m_hAimentEntity; EHANDLE m_hAimentEntity;
void UpdateEffect(const Vector &startPoint, const Vector &endPoint, float timeBlend); void UpdateEffect(const Vector &startPoint, const Vector &endPoint, float timeBlend);
CBaseEntity * TraceForward(CBaseEntity *pMe, float radius); CBaseEntity * TraceForward(CBaseEntity *pMe, float radius);
@ -66,13 +66,13 @@ public:
void WeaponIdle(void); void WeaponIdle(void);
void Pull(CBaseEntity* ent, float force); void Pull(CBaseEntity* ent, float force);
void GravAnim(int iAnim, int skiplocal, int body); void GravAnim(int iAnim, int skiplocal, int body);
CBaseEntity *GetCrossEnt( Vector gunpos, Vector aim ); CBaseEntity *GetCrossEnt( Vector gunpos, Vector aim, float radius );
float m_flNextGravgunAttack = gpGlobals->time; float m_flNextGravgunAttack;
float m_flAmmoUseTime;// since we use < 1 point of ammo per update, we subtract ammo on a timer. float m_flAmmoUseTime;// since we use < 1 point of ammo per update, we subtract ammo on a timer.
void GrabThink(void); void GrabThink(void);
void Fire(const Vector &vecOrigSrc, const Vector &vecDir); float Fire(const Vector &vecOrigSrc, const Vector &vecDir);
BOOL HasAmmo(void); BOOL HasAmmo(void);
@ -224,7 +224,7 @@ void CGrav::Attack(void)
case FIRE_CHARGE: case FIRE_CHARGE:
{ {
Fire(vecSrc, vecAiming); float dist = Fire(vecSrc, vecAiming);
m_pPlayer->m_iWeaponVolume = 20; m_pPlayer->m_iWeaponVolume = 20;
if (pev->fuser1 <= gpGlobals->time) if (pev->fuser1 <= gpGlobals->time)
@ -239,7 +239,7 @@ void CGrav::Attack(void)
CBaseEntity* crossent = m_hAimentEntity; CBaseEntity* crossent = m_hAimentEntity;
m_hAimentEntity = NULL; m_hAimentEntity = NULL;
if( !crossent) if( !crossent)
crossent = GetCrossEnt(vecSrc, gpGlobals->v_forward); crossent = GetCrossEnt(vecSrc, gpGlobals->v_forward, dist + 30);
//int oc = 0; //int oc = 0;
if (crossent) { if (crossent) {
m_flNextGravgunAttack = gpGlobals->time + 0.8; m_flNextGravgunAttack = gpGlobals->time + 0.8;
@ -328,7 +328,8 @@ void CGrav::Attack2(void)
case FIRE_CHARGE: case FIRE_CHARGE:
{ {
Fire(vecSrc, vecAiming); float dist = Fire(vecSrc, vecAiming);
ALERT( at_console, "dist: %f\n", dist );
m_pPlayer->m_iWeaponVolume = 100; m_pPlayer->m_iWeaponVolume = 100;
if (pev->fuser1 <= gpGlobals->time) if (pev->fuser1 <= gpGlobals->time)
@ -337,7 +338,7 @@ void CGrav::Attack2(void)
pev->fuser1 = 1000; pev->fuser1 = 1000;
} }
//CBaseEntity* crossent = TraceForward(m_pPlayer,500); //CBaseEntity* crossent = TraceForward(m_pPlayer,500);
CBaseEntity* crossent = GetCrossEnt(vecSrc, gpGlobals->v_forward); CBaseEntity* crossent = GetCrossEnt(vecSrc, gpGlobals->v_forward, dist );
if( !crossent || !(m_fPushSpeed = crossent->TouchGravGun(m_pPlayer,3)) ) if( !crossent || !(m_fPushSpeed = crossent->TouchGravGun(m_pPlayer,3)) )
{ {
crossent = TraceForward(m_pPlayer, 1000); crossent = TraceForward(m_pPlayer, 1000);
@ -348,6 +349,7 @@ void CGrav::Attack2(void)
} }
} }
if ( crossent ){ if ( crossent ){
m_fireMode = FIRE_NARROW;
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, GRAV_SOUND_RUN, 0.6, ATTN_NORM, 0, 70 + RANDOM_LONG(0, 34)); EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, GRAV_SOUND_RUN, 0.6, ATTN_NORM, 0, 70 + RANDOM_LONG(0, 34));
if(crossent->TouchGravGun(m_pPlayer, 0)) if(crossent->TouchGravGun(m_pPlayer, 0))
{ {
@ -363,12 +365,12 @@ void CGrav::Attack2(void)
} }
} }
CBaseEntity *CGrav::GetCrossEnt( Vector gunpos, Vector aim ) CBaseEntity *CGrav::GetCrossEnt( Vector gunpos, Vector aim, float radius )
{ {
edict_t *pEdict = g_engfuncs.pfnPEntityOfEntIndex( 1 ); edict_t *pEdict = g_engfuncs.pfnPEntityOfEntIndex( 1 );
edict_t *pClosest = NULL; edict_t *pClosest = NULL;
Vector vecLOS; Vector vecLOS;
float flMaxDot = 0.4; float flMaxDot = 0.9;
float flDot; float flDot;
if ( !pEdict ) if ( !pEdict )
@ -378,24 +380,28 @@ CBaseEntity *CGrav::GetCrossEnt( Vector gunpos, Vector aim )
{ {
if ( pEdict->free ) // Not in use if ( pEdict->free ) // Not in use
continue; continue;
if( pEdict == m_pPlayer->edict() )
continue;
Vector origin = pEdict->v.origin; Vector origin = pEdict->v.origin;
//if( pEdict->v.solid == SOLID_BSP || pEdict->v.movetype == MOVETYPE_PUSHSTEP ) //if( pEdict->v.solid == SOLID_BSP || pEdict->v.movetype == MOVETYPE_PUSHSTEP )
origin = VecBModelOrigin(&pEdict->v); origin = VecBModelOrigin(&pEdict->v);
vecLOS = origin - gunpos; vecLOS = origin - gunpos;
if( vecLOS.Length() > radius )
continue;
if( pEdict == m_pPlayer->edict() )
continue;
ALERT( at_console, "len: %f\n", vecLOS.Length() );
vecLOS = UTIL_ClampVectorToBox(vecLOS, pEdict->v.size * 0.5); vecLOS = UTIL_ClampVectorToBox(vecLOS, pEdict->v.size * 0.5);
flDot = DotProduct(vecLOS, aim); flDot = DotProduct(vecLOS, aim);
if (flDot > flMaxDot) if (flDot > flMaxDot)
{ {
/// TODO: add second trace here
pClosest = pEdict; pClosest = pEdict;
flMaxDot = flDot; flMaxDot = flDot;
} }
} }
return GET_PRIVATE(pClosest); return CBaseEntity::Instance(pClosest);
} }
@ -615,7 +621,7 @@ void CGrav::SecondaryAttack(void)
} }
} }
void CGrav::Fire(const Vector &vecOrigSrc, const Vector &vecDir) float CGrav::Fire(const Vector &vecOrigSrc, const Vector &vecDir)
{ {
Vector vecDest = vecOrigSrc + vecDir * 2048; Vector vecDest = vecOrigSrc + vecDir * 2048;
edict_t *pentIgnore; edict_t *pentIgnore;
@ -626,9 +632,10 @@ void CGrav::Fire(const Vector &vecOrigSrc, const Vector &vecDir)
UTIL_TraceLine(vecOrigSrc, vecDest, dont_ignore_monsters, pentIgnore, &tr); UTIL_TraceLine(vecOrigSrc, vecDest, dont_ignore_monsters, pentIgnore, &tr);
if (tr.fAllSolid) if (tr.fAllSolid)
return; return (tr.vecEndPos - tmpSrc).Length();
UpdateEffect(tmpSrc, tr.vecEndPos, 1); UpdateEffect(tmpSrc, tr.vecEndPos, 1);
return (tr.vecEndPos - tmpSrc).Length();
} }