//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponGrapple::PrimaryAttack(void) { // Can't have an active hook out if (m_hHook != NULL) return; FireHook(); SetWeaponIdleTime(gpGlobals->curtime + SequenceDuration(ACT_VM_PRIMARYATTACK)); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponGrapple::PrimaryAttack( void ) { // Can't have an active hook out if ( m_hHook != NULL ) return; #ifndef CLIENT_DLL CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( !pPlayer ) { return; } if ( m_iClip1 <= 0 ) { if ( !m_bFireOnEmpty ) { Reload(); } else { WeaponSound( EMPTY ); m_flNextPrimaryAttack = 0.15; } return; } m_iPrimaryAttacks++; gamestats->Event_WeaponFired( pPlayer, true, GetClassname() ); WeaponSound( SINGLE ); pPlayer->DoMuzzleFlash(); SendWeaponAnim( ACT_VM_PRIMARYATTACK ); pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_flNextPrimaryAttack = gpGlobals->curtime + 0.75; m_flNextSecondaryAttack = gpGlobals->curtime + 0.75; //Disabled so we can shoot all the time that we want //m_iClip1--; Vector vecSrc = pPlayer->Weapon_ShootPosition(); Vector vecAiming = pPlayer->GetAutoaimVector( AUTOAIM_SCALE_DEFAULT ); //We will not shoot bullets anymore //pPlayer->FireBullets( 1, vecSrc, vecAiming, vec3_origin, MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 0 ); pPlayer->SetMuzzleFlashTime( gpGlobals->curtime + 0.5 ); CSoundEnt::InsertSound( SOUND_COMBAT, GetAbsOrigin(), 600, 0.2, GetOwner() ); if ( !m_iClip1 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 ) { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 ); } trace_t tr; Vector vecShootOrigin, vecShootDir, vecDir, vecEnd; //Gets the direction where the player is aiming AngleVectors (pPlayer->EyeAngles(), &vecDir); //Gets the position of the player vecShootOrigin = pPlayer->Weapon_ShootPosition(); //Gets the position where the hook will hit vecEnd = vecShootOrigin + (vecDir * MAX_TRACE_LENGTH); //Traces a line between the two vectors UTIL_TraceLine( vecShootOrigin, vecEnd, MASK_SHOT, pPlayer, COLLISION_GROUP_NONE, &tr); //Draws the beam DrawBeam( vecShootOrigin, tr.endpos, 15.5 ); //Creates an energy impact effect if we don't hit the sky or other places if ( (tr.surface.flags & SURF_SKY) == false ) { CPVSFilter filter( tr.endpos ); te->GaussExplosion( filter, 0.0f, tr.endpos, tr.plane.normal, 0 ); m_nBulletType = GetAmmoDef()->Index("GaussEnergy"); UTIL_ImpactTrace( &tr, m_nBulletType ); //Makes a sprite at the end of the beam m_pLightGlow = CSprite::SpriteCreate( "sprites/physcannon_bluecore2b.vmt", GetAbsOrigin(), TRUE); //Sets FX render and color m_pLightGlow->SetTransparency( 9, 255, 255, 255, 200, kRenderFxNoDissipation ); //Sets the position m_pLightGlow->SetAbsOrigin(tr.endpos); //Bright m_pLightGlow->SetBrightness( 255 ); //Scale m_pLightGlow->SetScale( 0.65 ); } #endif FireHook(); SetWeaponIdleTime( gpGlobals->curtime + SequenceDuration( ACT_VM_PRIMARYATTACK ) ); }
void Cmd_Hook_f (edict_t *ent) { char *s; int *hookstate_; // get the first hook argument s = gi.argv(1); // create intermediate value hookstate_ = &ent->client->hookstate_; if ((ent->solid != SOLID_NOT) && (ent->deadflag == DEAD_NO) && (!(*hookstate_ & HOOK_ON)) && (Q_stricmp(s, "action") == 0)) { // flags hook as being active *hookstate_ = HOOK_ON; FireHook (ent); return; } if (*hookstate_ & HOOK_ON) { // release hook if (Q_stricmp(s, "action") == 0) { *hookstate_ = 0; return; } // fixme: // hop of chain and release hook when the following conditions apply // if ((ent->client->ps.pmove.pm_flags & PMF_JUMP_HELD) ) // jump is pressed // (*hookstate_ & HOOK_IN) && // hook is attached // (!(ent->client->ps.pmove.pm_flags & PMF_ON_GROUND))) // player not on ground // (!(self.flags & FL_INWATER)) ) // player not in water // { // ent->velocity[2] += 200; // gi.sound (ent, CHAN_BODY, gi.soundindex ("medic/medatck2.wav"), 1, ATTN_IDLE, 0); // *hookstate_ = 0; // return; // } // deactivate chain growth or shrink if (Q_stricmp(s, "stop") == 0) { *hookstate_ -= *hookstate_ & (GROW_ON | SHRINK_ON); return; } // activate chain growth if (Q_stricmp(s, "grow") == 0) { *hookstate_ |= GROW_ON; *hookstate_ -= *hookstate_ & SHRINK_ON; return; } // activate chain shrinking if (Q_stricmp(s, "shrink") == 0) { *hookstate_ |= SHRINK_ON; *hookstate_ -= *hookstate_ & GROW_ON; } } }