Update gravgun code

This commit is contained in:
mittorn 2016-03-28 18:38:09 +06:00
parent 9c36b3d4f5
commit 4b805c8a00
2 changed files with 94 additions and 115 deletions

View File

@ -281,12 +281,12 @@ void CGrav::Attack(void)
m_flNextGravgunAttack = gpGlobals->time + 0.7; m_flNextGravgunAttack = gpGlobals->time + 0.7;
EndAttack(); EndAttack();
} }
if (m_fireMode = FIRE_NARROW) { EndAttack(); }
} }
m_flNextGravgunAttack = gpGlobals->time + 0.5; m_flNextGravgunAttack = gpGlobals->time + 0.5;
pev->nextthink = gpGlobals->time + 0.3;
SetThink( &CGrav::DestroyEffect );
break; break;
} }
@ -316,51 +316,61 @@ void CGrav::Attack2(void)
switch (m_fireState) switch (m_fireState)
{ {
case FIRE_OFF: case FIRE_OFF:
{ {
GravAnim(GAUSS_FIRE, 1, 0); GravAnim(GAUSS_FIRE, 1, 0);
m_pPlayer->m_iWeaponVolume = 20; m_pPlayer->m_iWeaponVolume = 20;
m_fireState = FIRE_CHARGE; m_fireState = FIRE_CHARGE;
m_fireMode = FIRE_WIDE;
}
}
break; break;
case FIRE_CHARGE: case FIRE_CHARGE:
{ {
float dist = Fire(vecSrc, vecAiming); float dist = Fire(vecSrc, vecAiming) + 30;
ALERT( at_console, "dist: %f\n", dist ); m_flNextGravgunAttack = gpGlobals->time + 0.1;
m_pPlayer->m_iWeaponVolume = 100; //ALERT( at_console, "dist: %f\n", dist );
m_pPlayer->m_iWeaponVolume = 100;
if (pev->fuser1 <= gpGlobals->time) if (pev->fuser1 <= gpGlobals->time)
{ {
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, dist ); 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,0)) )
{ {
crossent = TraceForward(m_pPlayer, 1000); crossent = TraceForward(m_pPlayer, 1000);
if( !crossent || !(m_fPushSpeed = crossent->TouchGravGun(m_pPlayer,3)) ) if( !crossent || !(m_fPushSpeed = crossent->TouchGravGun(m_pPlayer,0)) )
{ {
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, GRAV_SOUND_FAILRUN, 0.6, ATTN_NORM, 0, 70 + RANDOM_LONG(0, 34)); EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, GRAV_SOUND_FAILRUN, 0.6, ATTN_NORM, 0, 70 + RANDOM_LONG(0, 34));
crossent = NULL; crossent = NULL;
} }
} }
if ( crossent ){ if ( crossent ){
m_fireMode = FIRE_NARROW; DestroyEffect();
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, GRAV_SOUND_RUN, 0.6, ATTN_NORM, 0, 70 + RANDOM_LONG(0, 34)); m_fireMode = FIRE_NARROW;
if(crossent->TouchGravGun(m_pPlayer, 0)) UpdateEffect( vecSrc, crossent->pev->origin, 1 );
{ EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, GRAV_SOUND_RUN, 0.6, ATTN_NORM, 0, 70 + RANDOM_LONG(0, 34));
m_hAimentEntity = crossent; if(crossent->TouchGravGun(m_pPlayer, 0))
Pull(crossent,5); {
GravAnim(GAUSS_SPIN, 0, 0); m_hAimentEntity = crossent;
} Pull(crossent,5);
GravAnim(GAUSS_SPIN, 0, 0);
} }
} }
else
{
if( m_fireMode == FIRE_NARROW )
DestroyEffect();
m_fireMode = FIRE_WIDE;
}
}
break; break;
} }
@ -376,97 +386,65 @@ CBaseEntity *CGrav::GetCrossEnt( Vector gunpos, Vector aim, float radius )
if ( !pEdict ) if ( !pEdict )
return NULL; return NULL;
edict_t *player = m_pPlayer->edict();
// uncomment this for profiling
int tracecount = 0;
for ( int i = 1; i < gpGlobals->maxEntities; i++, pEdict++ ) for ( int i = 1; i < gpGlobals->maxEntities; i++, pEdict++ )
{ {
if ( pEdict->free ) // Not in use if ( pEdict->free ) // Not in use
continue; continue;
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); continue; //bsp models will be found by trace later
Vector origin = VecBModelOrigin(&pEdict->v);
vecLOS = origin - gunpos; vecLOS = origin - gunpos;
// too far, ignore it now
if( vecLOS.Length() > radius ) if( vecLOS.Length() > radius )
continue; continue;
if( pEdict == m_pPlayer->edict() )
// ignore player
if( pEdict == player )
continue; continue;
ALERT( at_console, "len: %f\n", vecLOS.Length() );
//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)
{ continue;
/// TODO: add second trace here tracecount++;
pClosest = pEdict; TraceResult tr;
flMaxDot = flDot; UTIL_TraceLine(gunpos, origin, missile, player, &tr);
if( ( tr.vecEndPos - gunpos ).Length() < (origin - gunpos).Length())
} continue;
pClosest = pEdict;
flMaxDot = flDot;
} }
ALERT( at_console, "tracecount: %d\n", tracecount );
return CBaseEntity::Instance(pClosest); return CBaseEntity::Instance(pClosest);
} }
CBaseEntity* CGrav::TraceForward(CBaseEntity *pMe,float radius) CBaseEntity* CGrav::TraceForward(CBaseEntity *pMe,float radius)
{ {
#ifdef USEGUN
CBaseEntity *pObject = NULL;
CBaseEntity *pClosest = NULL;
Vector vecLOS;
float flMaxDot = 0.4;
float flDot;
UTIL_MakeVectors(m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle);// so we know which way we are facing
while ((pObject = UTIL_FindEntityInSphere(pObject, m_pPlayer->pev->origin, radius)) != NULL)
{//pObject->ObjectCaps() & (FCAP_ACROSS_TRANSITION | FCAP_CONTINUOUS_USE )&&
if (pObject!=m_pPlayer) {
vecLOS = (VecBModelOrigin(pObject->pev) - (m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs));
vecLOS = UTIL_ClampVectorToBox(vecLOS, pObject->pev->size * 0.5);
flDot = DotProduct(vecLOS, gpGlobals->v_forward);
if (flDot > flMaxDot&&pClosest != m_pPlayer)
{
pClosest = pObject;
flMaxDot = flDot;
}
ALERT(at_console, "%s : %f\n", STRING(pObject->pev->classname), flDot);
}
}
pObject = pClosest;
return pObject;
#else
TraceResult tr; TraceResult tr;
UTIL_MakeVectors(pMe->pev->v_angle); UTIL_MakeVectors(pMe->pev->v_angle);
UTIL_TraceLine(pMe->pev->origin + pMe->pev->view_ofs, pMe->pev->origin + pMe->pev->view_ofs + gpGlobals->v_forward * radius, missile, pMe->edict(), &tr); UTIL_TraceLine(pMe->pev->origin + pMe->pev->view_ofs, pMe->pev->origin + pMe->pev->view_ofs + gpGlobals->v_forward * radius, missile, pMe->edict(), &tr);
if (tr.flFraction != 1.0 && !FNullEnt(tr.pHit)) if( tr.flFraction != 1.0 && !FNullEnt(tr.pHit) )
{ return CBaseEntity::Instance(tr.pHit);
CBaseEntity *pHit = CBaseEntity::Instance(tr.pHit);
return pHit;
}
#endif
return NULL; return NULL;
} }
//Failure traces counter for GrabThink
//Used for prop grab and //Used for prop grab and
void CGrav::GrabThink() void CGrav::GrabThink()
{ {
//CBaseEntity *ent = FindEntityForward4(m_pPlayer, 130);
if (( m_iGrabFailures < 50 )&& m_hAimentEntity ) if (( m_iGrabFailures < 50 )&& m_hAimentEntity )
{ {
Vector origin = m_hAimentEntity->pev->origin; Vector origin = m_hAimentEntity->pev->origin;
@ -505,10 +483,6 @@ void CGrav::Pull(CBaseEntity* ent,float force)
if( ent->IsBSPModel()) if( ent->IsBSPModel())
origin = VecBModelOrigin(ent->pev); origin = VecBModelOrigin(ent->pev);
UTIL_MakeVectors(m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle); UTIL_MakeVectors(m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle);
ent->pev->angles.x = UTIL_AngleMod(ent->pev->angles.x);
ent->pev->angles.y = UTIL_AngleMod(ent->pev->angles.y);
ent->pev->angles.z = UTIL_AngleMod(ent->pev->angles.z);
Vector target = m_pPlayer->pev->origin + gpGlobals->v_forward * 75; Vector target = m_pPlayer->pev->origin + gpGlobals->v_forward * 75;
target.z += 32; target.z += 32;
if ((target - origin).Length() > 60){ if ((target - origin).Length() > 60){
@ -557,7 +531,7 @@ void CGrav::Pull(CBaseEntity* ent,float force)
} }
else if( ent->TouchGravGun(m_pPlayer, 2) ) else if( ent->TouchGravGun(m_pPlayer, 2) )
{ {
ent->pev->velocity = (target - origin)* 40; ent->pev->velocity = (target - origin)* 35;
if(ent->pev->velocity.Length()>900) if(ent->pev->velocity.Length()>900)
ent->pev->velocity = (target - origin).Normalize() * 900; ent->pev->velocity = (target - origin).Normalize() * 900;
ent->pev->velocity = ent->pev->velocity + m_pPlayer->pev->velocity; ent->pev->velocity = ent->pev->velocity + m_pPlayer->pev->velocity;
@ -602,6 +576,7 @@ void CGrav::SecondaryAttack(void)
{ {
return; return;
} }
//m_fireMode = FIRE_WIDE;
EndAttack(); EndAttack();
SetThink(NULL); SetThink(NULL);
m_flNextGravgunAttack = gpGlobals->time + 0.6; m_flNextGravgunAttack = gpGlobals->time + 0.6;
@ -615,7 +590,6 @@ void CGrav::SecondaryAttack(void)
} }
} }
else { else {
m_fireMode = FIRE_NARROW;
Attack2(); Attack2();
} }

View File

@ -118,6 +118,11 @@ public:
pev->avelocity.y = UTIL_AngleDiff(atarget.y, pev->angles.y) * 10; pev->avelocity.y = UTIL_AngleDiff(atarget.y, pev->angles.y) * 10;
pev->avelocity.z = UTIL_AngleDiff(atarget.z, pev->angles.z) * 10; pev->avelocity.z = UTIL_AngleDiff(atarget.z, pev->angles.z) * 10;
} }
if( stage == 3 )
{
pev->avelocity.y = pev->avelocity.y*1.5 + RANDOM_FLOAT(100, -100);
pev->avelocity.x = pev->avelocity.x*1.5 + RANDOM_FLOAT(100, -100);
}
if( !m_attacker || m_attacker == this ) if( !m_attacker || m_attacker == this )
{ {
m_owner2 = attacker; m_owner2 = attacker;