//========================================================= // HandleAnimEvent - catches the monster-specific messages // that occur when tagged animation frames are played. // // Returns number of events handled, 0 if none. //========================================================= void CISlave::HandleAnimEvent(MonsterEvent_t *pEvent) { // ALERT( at_console, "event %d : %f\n", pEvent->event, pev->frame ); switch(pEvent->event) { case ISLAVE_AE_CLAW: { // SOUND HERE! CBaseEntity *pHurt = CheckTraceHullAttack(70, gSkillData.slaveDmgClaw, DMG_SLASH); if(pHurt) { if(pHurt->pev->flags & (FL_MONSTER | FL_CLIENT)) { pHurt->pev->punchangle.z = -18; pHurt->pev->punchangle.x = 5; } // Play a random attack hit sound EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, pAttackHitSounds[RANDOM_LONG(0, ARRAYSIZE(pAttackHitSounds) - 1)], 1.0, ATTN_NORM, 0, m_voicePitch); } else { // Play a random attack miss sound EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, pAttackMissSounds[RANDOM_LONG(0, ARRAYSIZE(pAttackMissSounds) - 1)], 1.0, ATTN_NORM, 0, m_voicePitch); } } break; case ISLAVE_AE_CLAWRAKE: { CBaseEntity *pHurt = CheckTraceHullAttack(70, gSkillData.slaveDmgClawrake, DMG_SLASH); if(pHurt) { if(pHurt->pev->flags & (FL_MONSTER | FL_CLIENT)) { pHurt->pev->punchangle.z = -18; pHurt->pev->punchangle.x = 5; } EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, pAttackHitSounds[RANDOM_LONG(0, ARRAYSIZE(pAttackHitSounds) - 1)], 1.0, ATTN_NORM, 0, m_voicePitch); } else { EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, pAttackMissSounds[RANDOM_LONG(0, ARRAYSIZE(pAttackMissSounds) - 1)], 1.0, ATTN_NORM, 0, m_voicePitch); } } break; case ISLAVE_AE_ZAP_POWERUP: { // speed up attack when on hard if(g_iSkillLevel == SKILL_HARD) pev->framerate = 1.5; UTIL_MakeAimVectors(pev->angles); if(m_iBeams == 0) { Vector vecSrc = pev->origin + gpGlobals->v_forward * 2; MESSAGE_BEGIN(MSG_PVS, SVC_TEMPENTITY, vecSrc); WRITE_BYTE(TE_DLIGHT); WRITE_COORD(vecSrc.x); // X WRITE_COORD(vecSrc.y); // Y WRITE_COORD(vecSrc.z); // Z WRITE_BYTE(12); // radius * 0.1 WRITE_BYTE(255); // r WRITE_BYTE(180); // g WRITE_BYTE(96); // b WRITE_BYTE(20 / pev->framerate); // time * 10 WRITE_BYTE(0); // decay * 0.1 MESSAGE_END(); } if(m_hDead != NULL) { WackBeam(-1, m_hDead); WackBeam(1, m_hDead); } else { ArmBeam(-1); ArmBeam(1); BeamGlow(); } EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "debris/zap4.wav", 1, ATTN_NORM, 0, 100 + m_iBeams * 10); pev->skin = m_iBeams / 2; } break; case ISLAVE_AE_ZAP_SHOOT: { ClearBeams(); if(m_hDead != NULL) { Vector vecDest = m_hDead->pev->origin + Vector(0, 0, 38); TraceResult trace; UTIL_TraceHull(vecDest, vecDest, dont_ignore_monsters, human_hull, m_hDead->edict(), &trace); if(!trace.fStartSolid) { CBaseEntity * pNew = Create("monster_alien_slave", m_hDead->pev->origin, m_hDead->pev->angles); CBaseMonster *pNewMonster = pNew->MyMonsterPointer(); pNew->pev->spawnflags |= 1; WackBeam(-1, pNew); WackBeam(1, pNew); UTIL_Remove(m_hDead); EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "hassault/hw_shoot1.wav", 1, ATTN_NORM, 0, RANDOM_LONG(130, 160)); /* CBaseEntity *pEffect = Create( "test_effect", pNew->Center(), pev->angles ); pEffect->Use( this, this, USE_ON, 1 ); */ break; } } ClearMultiDamage(); UTIL_MakeAimVectors(pev->angles); ZapBeam(-1); ZapBeam(1); EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "hassault/hw_shoot1.wav", 1, ATTN_NORM, 0, RANDOM_LONG(130, 160)); // STOP_SOUND( ENT(pev), CHAN_WEAPON, "debris/zap4.wav" ); ApplyMultiDamage(pev, pev); m_flNextAttack = gpGlobals->time + RANDOM_FLOAT(0.5, 4.0); } break; case ISLAVE_AE_ZAP_DONE: { ClearBeams(); } break; default: CSquadMonster::HandleAnimEvent(pEvent); break; } }
//========================================================= // HandleAnimEvent - catches the monster-specific messages // that occur when tagged animation frames are played. // // Returns number of events handled, 0 if none. //========================================================= void CNPC_Vortigaunt::HandleAnimEvent( animevent_t *pEvent ) { // ALERT( at_console, "event %d : %f\n", pEvent->event, pev->frame ); switch( pEvent->event ) { case ISLAVE_AE_CLAW: { // SOUND HERE! CBaseEntity *pHurt = CheckTraceHullAttack( 40, Vector(-10,-10,-10), Vector(10,10,10), sk_islave_dmg_claw.GetFloat(), DMG_SLASH ); CPASAttenuationFilter filter( this ); if ( pHurt ) { if ( pHurt->GetFlags() & ( FL_NPC | FL_CLIENT ) ) pHurt->ViewPunch( QAngle( 5, 0, -18 ) ); // Play a random attack hit sound enginesound->EmitSound( filter, entindex(), CHAN_WEAPON, pAttackHitSounds[ random->RandomInt(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, m_iVoicePitch ); } else // Play a random attack miss sound enginesound->EmitSound( filter, entindex(), CHAN_WEAPON, pAttackMissSounds[ random->RandomInt(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, m_iVoicePitch ); } break; case ISLAVE_AE_CLAWRAKE: { CBaseEntity *pHurt = CheckTraceHullAttack( 40, Vector(-10,-10,-10), Vector(10,10,10), sk_islave_dmg_clawrake.GetFloat(), DMG_SLASH ); CPASAttenuationFilter filter2( this ); if ( pHurt ) { if ( pHurt->GetFlags() & ( FL_NPC | FL_CLIENT ) ) pHurt->ViewPunch( QAngle( 5, 0, 18 ) ); enginesound->EmitSound( filter2, entindex(), CHAN_WEAPON, pAttackHitSounds[ random->RandomInt(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, m_iVoicePitch ); } else enginesound->EmitSound( filter2, entindex(), CHAN_WEAPON, pAttackMissSounds[ random->RandomInt(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, m_iVoicePitch ); } break; case ISLAVE_AE_ZAP_POWERUP: { // speed up attack when on hard if ( g_iSkillLevel == SKILL_HARD ) m_flPlaybackRate = 1.5; Vector v_forward; GetVectors( &v_forward, NULL, NULL ); CBroadcastRecipientFilter filter; te->DynamicLight( filter, 0.0, &GetAbsOrigin(), 125, 200, 100, 2, 120, 0.2 / m_flPlaybackRate, 0 ); if ( m_hDead != NULL ) { WackBeam( -1, m_hDead ); WackBeam( 1, m_hDead ); } else { ArmBeam( -1 ); ArmBeam( 1 ); BeamGlow( ); } CPASAttenuationFilter filter3( this ); enginesound->EmitSound( filter3, entindex(), CHAN_WEAPON, "debris/zap4.wav", 1, ATTN_NORM, 0, 100 + m_iBeams * 10 ); // Huh? Model doesn't have multiple texturegroups, commented this out. -LH // m_nSkin = m_iBeams / 2; } break; case ISLAVE_AE_ZAP_SHOOT: { ClearBeams( ); if ( m_hDead != NULL ) { Vector vecDest = m_hDead->GetAbsOrigin() + Vector( 0, 0, 38 ); trace_t trace; UTIL_TraceHull( vecDest, vecDest, GetHullMins(), GetHullMaxs(),MASK_SOLID, m_hDead, COLLISION_GROUP_NONE, &trace ); if ( !trace.startsolid ) { CBaseEntity *pNew = Create( "monster_alien_slave", m_hDead->GetAbsOrigin(), m_hDead->GetAbsAngles() ); pNew->AddSpawnFlags( 1 ); WackBeam( -1, pNew ); WackBeam( 1, pNew ); UTIL_Remove( m_hDead ); break; } } ClearMultiDamage(); ZapBeam( -1 ); ZapBeam( 1 ); CPASAttenuationFilter filter4( this ); enginesound->EmitSound( filter4, entindex(), CHAN_WEAPON, "hassault/hw_shoot1.wav", 1, ATTN_NORM, 0, random->RandomInt( 130, 160 ) ); ApplyMultiDamage(); m_flNextAttack = gpGlobals->curtime + random->RandomFloat( 0.5, 4.0 ); } break; case ISLAVE_AE_ZAP_DONE: { ClearBeams(); } break; default: BaseClass::HandleAnimEvent( pEvent ); break; } }