//----------------------------------------------------------------------------- // Purpose: Sets up the attachment point lookup for the model //----------------------------------------------------------------------------- void C_WeaponStunStick::SetupAttachmentPoints( void ) { // Setup points for both types of views if ( ShouldDrawUsingViewModel() ) { const char *szBeamAttachNamesTop[NUM_BEAM_ATTACHMENTS] = { "spark1a","spark2a","spark3a","spark4a", "spark5a","spark6a","spark7a","spark8a", "spark9a", }; const char *szBeamAttachNamesBottom[NUM_BEAM_ATTACHMENTS] = { "spark1b","spark2b","spark3b","spark4b", "spark5b","spark6b","spark7b","spark8b", "spark9b", }; // Lookup and store all connections for ( int i = 0; i < NUM_BEAM_ATTACHMENTS; i++ ) { m_BeamAttachments[i].IDs[0] = LookupAttachment( szBeamAttachNamesTop[i] ); m_BeamAttachments[i].IDs[1] = LookupAttachment( szBeamAttachNamesBottom[i] ); } // Setup the center beam point m_BeamCenterAttachment = LookupAttachment( BEAM_ATTACH_CORE_NAME ); } else { // Setup the center beam point m_BeamCenterAttachment = 1; } }
//----------------------------------------------------------------------------- // Purpose: Draw our special effects //----------------------------------------------------------------------------- void C_WeaponStunStick::DrawEffects( void ) { if ( ShouldDrawUsingViewModel() ) { DrawFirstPersonEffects(); } else { DrawThirdPersonEffects(); } }
//----------------------------------------------------------------------------- // Purpose: Tells us we're always a translucent entity //----------------------------------------------------------------------------- bool C_WeaponStunStick::InSwing( void ) { int activity = GetActivity(); // FIXME: This is needed until the actual animation works if ( ShouldDrawUsingViewModel() == false ) return true; // These are the swing activities this weapon can play if ( activity == GetPrimaryAttackActivity() || activity == GetSecondaryAttackActivity() || activity == ACT_VM_MISSCENTER || activity == ACT_VM_MISSCENTER2 ) return true; return false; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponCrossbow::DoLoadEffect( void ) { SetSkin( BOLT_SKIN_GLOW ); CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if ( pOwner == NULL ) return; //Tony; change this up a bit; on the server, dispatch an effect but don't send it to the client who fires //on the client, create an effect either in the view model, or on the world model if first person. CEffectData data; data.m_nAttachmentIndex = 1; data.m_vOrigin = pOwner->GetAbsOrigin(); CPASFilter filter( data.m_vOrigin ); #ifdef GAME_DLL filter.RemoveRecipient( pOwner ); data.m_nEntIndex = entindex(); #else CBaseViewModel *pViewModel = pOwner->GetViewModel(); if ( ShouldDrawUsingViewModel() && pViewModel != NULL ) data.m_hEntity = pViewModel->GetRefEHandle(); else data.m_hEntity = GetRefEHandle(); #endif DispatchEffect( "CrossbowLoad", data, filter ); #ifndef CLIENT_DLL CSprite *pBlast = CSprite::SpriteCreate( CROSSBOW_GLOW_SPRITE2, GetAbsOrigin(), false ); if ( pBlast ) { pBlast->SetAttachment( this, 1 ); pBlast->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNone ); pBlast->SetBrightness( 128 ); pBlast->SetScale( 0.2f ); pBlast->FadeOutFromSpawn(); } #endif }
//----------------------------------------------------------------------------- // Purpose: Randomly adds extra effects //----------------------------------------------------------------------------- void C_WeaponStunStick::ClientThink( void ) { if ( InSwing() == false ) { if ( m_bSwungLastFrame ) { // Start fading m_flFadeTime = gpGlobals->curtime; m_bSwungLastFrame = false; } return; } // Remember if we were swinging last frame m_bSwungLastFrame = InSwing(); if ( IsEffectActive( EF_NODRAW ) ) return; if ( ShouldDrawUsingViewModel() ) { // Update our effects if ( gpGlobals->frametime != 0.0f && ( random->RandomInt( 0, 3 ) == 0 ) ) { Vector vecOrigin; QAngle vecAngles; // Inner beams BeamInfo_t beamInfo; int attachment = random->RandomInt( 0, 15 ); UTIL_GetWeaponAttachment( this, attachment, vecOrigin, vecAngles ); ::FormatViewModelAttachment( vecOrigin, false ); CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); CBaseEntity *pBeamEnt = pOwner->GetViewModel(); beamInfo.m_vecStart = vec3_origin; beamInfo.m_pStartEnt= pBeamEnt; beamInfo.m_nStartAttachment = attachment; beamInfo.m_pEndEnt = NULL; beamInfo.m_nEndAttachment = -1; beamInfo.m_vecEnd = vecOrigin + RandomVector( -8, 8 ); beamInfo.m_pszModelName = STUNSTICK_BEAM_MATERIAL; beamInfo.m_flHaloScale = 0.0f; beamInfo.m_flLife = 0.05f; beamInfo.m_flWidth = random->RandomFloat( 1.0f, 2.0f ); beamInfo.m_flEndWidth = 0; beamInfo.m_flFadeLength = 0.0f; beamInfo.m_flAmplitude = random->RandomFloat( 16, 32 ); beamInfo.m_flBrightness = 255.0; beamInfo.m_flSpeed = 0.0; beamInfo.m_nStartFrame = 0.0; beamInfo.m_flFrameRate = 1.0f; beamInfo.m_flRed = 255.0f;; beamInfo.m_flGreen = 255.0f; beamInfo.m_flBlue = 255.0f; beamInfo.m_nSegments = 16; beamInfo.m_bRenderable = true; beamInfo.m_nFlags = 0; beams->CreateBeamEntPoint( beamInfo ); } } }