void Shoot( void ) { // m_vecEnemyLKP should be center of enemy body Vector vecArmPos, vecArmDir; Vector vecDirToEnemy; Vector angDir; if (self.HasConditions( bits_COND_SEE_ENEMY)) { vecDirToEnemy = ( ( self.m_vecEnemyLKP ) - pev.origin ); angDir = Math.VecToAngles( vecDirToEnemy ); vecDirToEnemy = vecDirToEnemy.Normalize(); } /*else { angDir = pev.angles; Math.MakeAimVectors( angDir ); vecDirToEnemy = g_Engine.v_forward; }*/ pev.effects = EF_MUZZLEFLASH; // make angles +-180 if (angDir.x > 180) { angDir.x = angDir.x - 360; } self.SetBlending( 0, angDir.x ); self.GetAttachment( 0, vecArmPos, void ); vecArmPos = vecArmPos + vecDirToEnemy * 32; NetworkMessage message( MSG_PVS, NetworkMessages::SVC_TEMPENTITY, vecArmPos ); message.WriteByte(TE_SPRITE); message.WriteCoord(vecArmPos.x); message.WriteCoord(vecArmPos.y); message.WriteCoord(vecArmPos.z); message.WriteShort(m_iAgruntMuzzleFlash); message.WriteByte(6); message.WriteByte(128); message.End(); CBaseEntity@ pHornet = g_EntityFuncs.Create( "hornet", vecArmPos, self.pev.angles, false, self.edict() ); Math.MakeVectors( pHornet.pev.angles ); pHornet.pev.velocity = g_Engine.v_forward * 300; switch ( Math.RandomLong ( 0 , 2 ) ) { case 0: g_SoundSystem.EmitSoundDyn( self.edict(), CHAN_WEAPON, "agrunt/ag_fire1.wav", 1.0, ATTN_NORM, 0, 100 ); break; case 1: g_SoundSystem.EmitSoundDyn( self.edict(), CHAN_WEAPON, "agrunt/ag_fire2.wav", 1.0, ATTN_NORM, 0, 100 ); break; case 2: g_SoundSystem.EmitSoundDyn( self.edict(), CHAN_WEAPON, "agrunt/ag_fire3.wav", 1.0, ATTN_NORM, 0, 100 ); break; } CBaseMonster@ pHornetMonster = pHornet.MyMonsterPointer(); if ( pHornetMonster !is null ) { pHornetMonster.m_hEnemy = self.m_hEnemy; } if( self.pev.movetype != MOVETYPE_FLY && self.m_MonsterState != MONSTERSTATE_PRONE ) { self.m_flAutomaticAttackTime = g_Engine.time + Math.RandomFloat(0.2, 0.5); } }