Browse Source

Time-based gravgun grab prediction

gravgun
mittorn 7 years ago
parent
commit
0819d23771
  1. 93
      dlls/gravgun.cpp

93
dlls/gravgun.cpp

@ -39,11 +39,13 @@ enum gauss_e {
GAUSS_DRAW GAUSS_DRAW
}; };
class CGrav : public CBasePlayerWeapon
class CGravGun : public CBasePlayerWeapon
{ {
public: public:
float m_flLastCmd;
void Spawn(void); void Spawn(void);
void Precache(void); void Precache(void);
int iItemSlot(void) { return 4; } int iItemSlot(void) { return 4; }
@ -66,6 +68,7 @@ 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);
Vector PredictTarget( float length );
CBaseEntity *GetCrossEnt( Vector gunpos, Vector aim, float radius ); CBaseEntity *GetCrossEnt( Vector gunpos, Vector aim, float radius );
float m_flNextGravgunAttack; 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.
@ -96,9 +99,9 @@ private:
float m_fPushSpeed; float m_fPushSpeed;
}; };
LINK_ENTITY_TO_CLASS(weapon_gravgun, CGrav); LINK_ENTITY_TO_CLASS(weapon_gravgun, CGravGun);
void CGrav::Spawn() void CGravGun::Spawn()
{ {
pev->classname = MAKE_STRING("weapon_gravgun"); // hack to allow for old names pev->classname = MAKE_STRING("weapon_gravgun"); // hack to allow for old names
Precache(); Precache();
@ -109,9 +112,34 @@ void CGrav::Spawn()
FallInit();// get ready to fall down. FallInit();// get ready to fall down.
} }
#define CONST_MULT 10
#define CMD_MULT 100
Vector CGravGun::PredictTarget(float length)
{
Vector predicted = m_pPlayer->pev->origin;
float cmdtime = gpGlobals->time - m_flLastCmd;
printf("PredictTarget %f\n", cmdtime);
// button-based prediction
if( m_pPlayer->pev->button & IN_FORWARD )
predicted = predicted + gpGlobals->v_forward * CONST_MULT + gpGlobals->v_forward * cmdtime * CMD_MULT;
// do not predict back? it may hurt player
//if( m_pPlayer->pev->button & IN_BACK )
//predicted = predicted + gpGlobals->v_forward * -CONST_MULT / 2 + gpGlobals->v_forward * cmdtime * -CMD_MULT / 2;
if( m_pPlayer->pev->button & IN_MOVELEFT )
predicted = predicted + gpGlobals->v_right * -CONST_MULT + gpGlobals->v_right * cmdtime * -CMD_MULT;
if( m_pPlayer->pev->button & IN_MOVERIGHT )
predicted = predicted + gpGlobals->v_right * CONST_MULT + gpGlobals->v_right * cmdtime * CMD_MULT;
// distance
predicted = predicted + gpGlobals->v_forward * length;
// velocity animation
predicted = predicted + m_pPlayer->pev->velocity * cmdtime;
return predicted;
}
void CGrav::Precache(void) void CGravGun::Precache(void)
{ {
PRECACHE_MODEL("models/w_gravcannon.mdl"); PRECACHE_MODEL("models/w_gravcannon.mdl");
PRECACHE_MODEL("models/v_gravcannon.mdl"); PRECACHE_MODEL("models/v_gravcannon.mdl");
@ -133,14 +161,14 @@ void CGrav::Precache(void)
} }
BOOL CGrav::Deploy(void) BOOL CGravGun::Deploy(void)
{ {
m_deployed = FALSE; m_deployed = FALSE;
m_fireState = FIRE_OFF; m_fireState = FIRE_OFF;
return DefaultDeploy("models/v_gravcannon.mdl", "models/p_gravcannon.mdl", GAUSS_DRAW, "gauss"); return DefaultDeploy("models/v_gravcannon.mdl", "models/p_gravcannon.mdl", GAUSS_DRAW, "gauss");
} }
int CGrav::AddToPlayer(CBasePlayer *pPlayer) int CGravGun::AddToPlayer(CBasePlayer *pPlayer)
{ {
if (CBasePlayerWeapon::AddToPlayer(pPlayer)) if (CBasePlayerWeapon::AddToPlayer(pPlayer))
{ {
@ -154,7 +182,7 @@ int CGrav::AddToPlayer(CBasePlayer *pPlayer)
void CGrav::Holster(int skiplocal /* = 0 */) void CGravGun::Holster(int skiplocal /* = 0 */)
{ {
SetThink(NULL); SetThink(NULL);
@ -168,7 +196,7 @@ void CGrav::Holster(int skiplocal /* = 0 */)
SetThink(NULL); SetThink(NULL);
} }
int CGrav::GetItemInfo(ItemInfo *p) int CGravGun::GetItemInfo(ItemInfo *p)
{ {
p->pszName = STRING(pev->classname); p->pszName = STRING(pev->classname);
p->pszAmmo1 = NULL; p->pszAmmo1 = NULL;
@ -185,7 +213,7 @@ p->pszAmmo1 = NULL;
return 1; return 1;
} }
BOOL CGrav::HasAmmo(void) BOOL CGravGun::HasAmmo(void)
{ {
return TRUE; return TRUE;
@ -193,7 +221,7 @@ BOOL CGrav::HasAmmo(void)
void CGrav::Attack(void) void CGravGun::Attack(void)
{ {
pev->nextthink = gpGlobals->time + 1.1; pev->nextthink = gpGlobals->time + 1.1;
m_flNextGravgunAttack - gpGlobals->time + 0.5; m_flNextGravgunAttack - gpGlobals->time + 0.5;
@ -276,13 +304,13 @@ void CGrav::Attack(void)
m_flNextGravgunAttack = gpGlobals->time + 0.5; m_flNextGravgunAttack = gpGlobals->time + 0.5;
pev->nextthink = gpGlobals->time + 0.2; pev->nextthink = gpGlobals->time + 0.2;
SetThink( &CGrav::DestroyEffect ); SetThink( &CGravGun::DestroyEffect );
break; break;
} }
} }
void CGrav::GravAnim(int iAnim, int skiplocal, int body) void CGravGun::GravAnim(int iAnim, int skiplocal, int body)
{ {
m_pPlayer->pev->weaponanim = iAnim; m_pPlayer->pev->weaponanim = iAnim;
@ -295,7 +323,7 @@ void CGrav::GravAnim(int iAnim, int skiplocal, int body)
MESSAGE_END(); MESSAGE_END();
} }
void CGrav::Attack2(void) void CGravGun::Attack2(void)
{ {
//if (temp) { temp = NULL; } //if (temp) { temp = NULL; }
//if(temp) return; //if(temp) return;
@ -371,7 +399,7 @@ void CGrav::Attack2(void)
} }
} }
CBaseEntity *CGrav::GetCrossEnt( Vector gunpos, Vector aim, float radius ) CBaseEntity *CGravGun::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;
@ -428,7 +456,7 @@ CBaseEntity *CGrav::GetCrossEnt( Vector gunpos, Vector aim, float radius )
} }
CBaseEntity* CGrav::TraceForward(CBaseEntity *pMe,float radius) CBaseEntity* CGravGun::TraceForward(CBaseEntity *pMe,float radius)
{ {
TraceResult tr; TraceResult tr;
UTIL_MakeVectors(pMe->pev->v_angle); UTIL_MakeVectors(pMe->pev->v_angle);
@ -439,8 +467,9 @@ CBaseEntity* CGrav::TraceForward(CBaseEntity *pMe,float radius)
} }
//Used for prop grab and //Used for prop grab and
void CGrav::GrabThink() void CGravGun::GrabThink()
{ {
printf("GrabThink\n");
if (( m_iGrabFailures < 50 )&& m_hAimentEntity ) if (( m_iGrabFailures < 50 )&& m_hAimentEntity )
{ {
Vector origin = m_hAimentEntity->pev->origin; Vector origin = m_hAimentEntity->pev->origin;
@ -454,13 +483,13 @@ void CGrav::GrabThink()
UpdateEffect(pev->origin, origin, 1); UpdateEffect(pev->origin, origin, 1);
Pull(m_hAimentEntity, 100); Pull(m_hAimentEntity, 100);
pev->nextthink = gpGlobals->time + 0.001; pev->nextthink = gpGlobals->time + 0.001;
} }
else{ else{
EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, GRAV_SOUND_OFF, 1, ATTN_NORM, 0, 70 + RANDOM_LONG(0, 34)); EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, GRAV_SOUND_OFF, 1, ATTN_NORM, 0, 70 + RANDOM_LONG(0, 34));
m_iGrabFailures = 0; m_iGrabFailures = 0;
SetThink( NULL ); SetThink( NULL );
if(m_hAimentEntity) if(m_hAimentEntity)
{ {
m_hAimentEntity->pev->velocity = Vector(0,0,0); m_hAimentEntity->pev->velocity = Vector(0,0,0);
@ -473,16 +502,16 @@ void CGrav::GrabThink()
} }
void CGrav::Pull(CBaseEntity* ent,float force) void CGravGun::Pull(CBaseEntity* ent,float force)
{ {
Vector origin = ent->pev->origin; Vector origin = ent->pev->origin;
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);
Vector target = m_pPlayer->pev->origin + gpGlobals->v_forward * 75; Vector target = PredictTarget( 75 );
target.z += 32; target.z += 32;
if ((target - origin).Length() > 60){ if ((target - origin).Length() > 60){
target = m_pPlayer->pev->origin + gpGlobals->v_forward * 110 ; target = PredictTarget(110);
target.z += 60; target.z += 60;
@ -497,7 +526,8 @@ void CGrav::Pull(CBaseEntity* ent,float force)
if( (target - origin).Length() < 150 ) if( (target - origin).Length() < 150 )
{ {
m_iStage = 1; m_iStage = 1;
SetThink( &CGrav::GrabThink );
SetThink( &CGravGun::GrabThink );
pev->nextthink = gpGlobals->time + 0.001; pev->nextthink = gpGlobals->time + 0.001;
ent->TouchGravGun(m_pPlayer, 1); ent->TouchGravGun(m_pPlayer, 1);
} }
@ -532,7 +562,7 @@ void CGrav::Pull(CBaseEntity* ent,float force)
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;
m_iStage = 2; m_iStage = 2;
SetThink( &CGrav::GrabThink ); SetThink( &CGravGun::GrabThink );
pev->nextthink = gpGlobals->time + 0.001; pev->nextthink = gpGlobals->time + 0.001;
} }
else else
@ -548,8 +578,9 @@ void CGrav::Pull(CBaseEntity* ent,float force)
void CGrav::PrimaryAttack(void) void CGravGun::PrimaryAttack(void)
{ {
m_flLastCmd = gpGlobals->time;
if (m_flNextGravgunAttack < gpGlobals->time) if (m_flNextGravgunAttack < gpGlobals->time)
{ {
@ -562,8 +593,9 @@ void CGrav::PrimaryAttack(void)
} }
void CGrav::SecondaryAttack(void) void CGravGun::SecondaryAttack(void)
{ {
m_flLastCmd = gpGlobals->time;
if (m_flNextGravgunAttack < gpGlobals->time) if (m_flNextGravgunAttack < gpGlobals->time)
{ {
if (m_iStage) if (m_iStage)
@ -592,7 +624,7 @@ void CGrav::SecondaryAttack(void)
} }
} }
float CGrav::Fire(const Vector &vecOrigSrc, const Vector &vecDir) float CGravGun::Fire(const Vector &vecOrigSrc, const Vector &vecDir)
{ {
Vector vecDest = vecOrigSrc + vecDir * 2048; Vector vecDest = vecOrigSrc + vecDir * 2048;
edict_t *pentIgnore; edict_t *pentIgnore;
@ -610,7 +642,7 @@ float CGrav::Fire(const Vector &vecOrigSrc, const Vector &vecDir)
} }
void CGrav::UpdateEffect(const Vector &startPoint, const Vector &endPoint, float timeBlend) void CGravGun::UpdateEffect(const Vector &startPoint, const Vector &endPoint, float timeBlend)
{ {
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if (!m_pBeam) if (!m_pBeam)
@ -646,7 +678,7 @@ void CGrav::UpdateEffect(const Vector &startPoint, const Vector &endPoint, float
} }
void CGrav::CreateEffect(void) void CGravGun::CreateEffect(void)
{ {
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
@ -697,7 +729,7 @@ void CGrav::CreateEffect(void)
} }
void CGrav::DestroyEffect(void) void CGravGun::DestroyEffect(void)
{ {
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
@ -727,8 +759,9 @@ void CGrav::DestroyEffect(void)
void CGrav::WeaponIdle(void) void CGravGun::WeaponIdle(void)
{ {
m_flLastCmd = gpGlobals->time;
ResetEmptySound(); ResetEmptySound();
if (m_flTimeWeaponIdle > gpGlobals->time) if (m_flTimeWeaponIdle > gpGlobals->time)
@ -743,7 +776,7 @@ void CGrav::WeaponIdle(void)
void CGrav::EndAttack(void) void CGravGun::EndAttack(void)
{ {
bool bMakeNoise = false; bool bMakeNoise = false;
// if (m_AimentEntity&&m_AimentEntity->pev->velocity.Length() > 100&& (m_AimentEntity->pev->origin-m_pPlayer->pev->origin).Length()<100) { m_AimentEntity->pev->velocity = m_AimentEntity->pev->velocity / 10; } // if (m_AimentEntity&&m_AimentEntity->pev->velocity.Length() > 100&& (m_AimentEntity->pev->origin-m_pPlayer->pev->origin).Length()<100) { m_AimentEntity->pev->velocity = m_AimentEntity->pev->velocity / 10; }

Loading…
Cancel
Save