void CNPC_GMan::RunTask( const Task_t *pTask ) { switch( pTask->iTask ) { case TASK_WAIT: // look at who I'm talking to if (m_flTalkTime > gpGlobals->curtime && m_hTalkTarget != NULL) { AddLookTarget( m_hTalkTarget->GetAbsOrigin(), 1.0, 2.0 ); } // look at player, but only if playing a "safe" idle animation else if (m_hPlayer != NULL && (GetSequence() == 0 || IsInC5A1()) ) { AddLookTarget( m_hPlayer->EyePosition(), 1.0, 3.0 ); } else { // Just center the head forward. Vector forward; GetVectors( &forward, NULL, NULL ); AddLookTarget( GetAbsOrigin() + forward * 12.0f, 1.0, 1.0 ); SetBoneController( 0, 0 ); } BaseClass::RunTask( pTask ); break; } SetBoneController( 0, 0 ); BaseClass::RunTask( pTask ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponGaussGun::ItemPostFrame() { //Get the view kick CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( !pPlayer ) return; if ( pPlayer->m_afButtonReleased & IN_ATTACK2 ) { if ( m_bCharging ) ChargedFire(); } #ifndef CLIENT_DLL m_flCoilVelocity = UTIL_Approach( m_flCoilMaxVelocity, m_flCoilVelocity, 10.0f ); m_flCoilAngle = UTIL_AngleMod( m_flCoilAngle + ( m_flCoilVelocity * gpGlobals->frametime ) ); static float fanAngle = 0.0f; fanAngle = UTIL_AngleMod( fanAngle + 2 ); //Update spinning bits SetBoneController( 0, fanAngle ); SetBoneController( 1, m_flCoilAngle ); #endif BaseClass::ItemPostFrame(); }
void C_SDKPlayer::LookAtBall(void) { const QAngle camAngles = IsLocalPlayer() ? ::input->GetCameraAngles() : m_angCamViewAngles; float yaw = camAngles[YAW] - EyeAngles()[YAW]; float pitch = camAngles[PITCH]; if (yaw > 180) yaw -= 360; if (yaw < -180) yaw += 360; if (pitch > 180) pitch -= 360; if (pitch < -180) pitch += 360; //if (yaw > 90) yaw = 180 - yaw; //if (yaw < -90) yaw = -180 - yaw; pitch = clamp(pitch, -60, 60); yaw = clamp(yaw, -120, 120); float neckVal = clamp(yaw, -50, 50); SetBoneController(2, neckVal); // Neck yaw -= neckVal; float upperSpineVal = clamp(yaw, -40, 40); SetBoneController(1, upperSpineVal); // Upper spine yaw -= upperSpineVal; float lowerSpineVal = clamp(yaw, -30, 30); SetBoneController(0, lowerSpineVal); // Lower spine SetBoneController(3, pitch); }
void CBaseTurret::Spawn() { Precache( ); pev->nextthink = gpGlobals->time + 1; pev->movetype = MOVETYPE_FLY; pev->sequence = 0; pev->frame = 0; pev->solid = SOLID_SLIDEBOX; pev->takedamage = DAMAGE_AIM; SetBits (pev->flags, FL_MONSTER); SetUse( &CBaseTurret::TurretUse ); if (( pev->spawnflags & SF_MONSTER_TURRET_AUTOACTIVATE ) && !( pev->spawnflags & SF_MONSTER_TURRET_STARTINACTIVE )) { m_iAutoStart = TRUE; } ResetSequenceInfo( ); SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); m_flFieldOfView = VIEW_FIELD_FULL; // m_flSightRange = TURRET_RANGE; }
void CBaseTurret::Initialize(void) { m_iOn = 0; m_fBeserk = 0; m_iSpin = 0; SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); if (m_iBaseTurnRate == 0) m_iBaseTurnRate = TURRET_TURNRATE; if (m_flMaxWait == 0) m_flMaxWait = TURRET_MAXWAIT; m_flStartYaw = pev->angles.y; if (m_iOrientation == 1) { pev->idealpitch = 180; pev->angles.x = 180; pev->view_ofs.z = -pev->view_ofs.z; pev->effects |= EF_INVLIGHT; pev->angles.y = pev->angles.y + 180; if (pev->angles.y > 360) pev->angles.y = pev->angles.y - 360; } m_vecGoalAngles.x = 0; if (m_iAutoStart) { m_flLastSight = gpGlobals->time + m_flMaxWait; SetThink(&CBaseTurret::AutoSearchThink); pev->nextthink = gpGlobals->time + .1; } else SetThink(&CBaseTurret::SUB_DoNothing); }
void CVehicleMortar::UpdateElevation( const Vector &vecTargetVel ) { QAngle angles; VectorAngles( vecTargetVel, angles ); m_flMortarPitch = anglemod( -angles[PITCH] ); SetBoneController( 0, m_flMortarYaw ); SetBoneController( 1, m_flMortarPitch ); }
void Spawn( void ) { SET_MODEL(ENT(pev), "models/player/player_harmor/player_harmor.mdl"); ResetSequenceInfo(); SetBoneController(0, 0); SetBoneController(1, 0); SetBoneController(2, 0); SetBoneController(3, 0); pev->sequence = 152; CItem::Spawn( ); }
//========================================================= // RunTask //========================================================= void CMGargantua::RunTask( Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_FLAME_SWEEP: if ( gpGlobals->time > m_flWaitFinished ) { FlameDestroy(); TaskComplete(); FlameControls( 0, 0 ); SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); } else { BOOL cancel = FALSE; Vector angles = g_vecZero; FlameUpdate(); edict_t *pEnemy = m_hEnemy; if ( pEnemy ) { Vector org = pev->origin; org.z += 64; Vector dir = UTIL_BodyTarget(pEnemy,org) - org; angles = UTIL_VecToAngles( dir ); angles.x = -angles.x; angles.y -= pev->angles.y; if ( dir.Length() > 400 ) cancel = TRUE; } if ( fabs(angles.y) > 60 ) cancel = TRUE; if ( cancel ) { m_flWaitFinished -= 0.5; m_flameTime -= 0.5; } // FlameControls( angles.x + 2 * sin(gpGlobals->time*8), angles.y + 28 * sin(gpGlobals->time*8.5) ); FlameControls( angles.x, angles.y ); } break; default: CMBaseMonster::RunTask( pTask ); break; } }
//========================================================= // Killed. //========================================================= void CBarnacle :: Killed( entvars_t *pevAttacker, int iGib ) { CBaseMonster *pVictim; pev->solid = SOLID_NOT; pev->takedamage = DAMAGE_NO; if ( m_hEnemy != NULL ) { pVictim = m_hEnemy->MyMonsterPointer(); if ( pVictim ) { pVictim->BarnacleVictimReleased(); } } // CGib::SpawnRandomGibs( pev, 4, 1 ); switch ( RANDOM_LONG ( 0, 1 ) ) { case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die1.wav", 1, ATTN_NORM ); break; case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die3.wav", 1, ATTN_NORM ); break; } SetActivity ( ACT_DIESIMPLE ); SetBoneController( 0, 0 ); StudioFrameAdvance( 0.1 ); SetNextThink( 0.1 ); SetThink(&CBarnacle :: WaitTillDead ); }
void CMGargantua :: FlameControls( float angleX, float angleY ) { if ( angleY < -180 ) angleY += 360; else if ( angleY > 180 ) angleY -= 360; if ( angleY < -45 ) angleY = -45; else if ( angleY > 45 ) angleY = 45; m_flameX = UTIL_ApproachAngle( angleX, m_flameX, 4 ); m_flameY = UTIL_ApproachAngle( angleY, m_flameY, 8 ); SetBoneController( 0, m_flameY ); SetBoneController( 1, m_flameX ); }
//========================================================= // Initialize - set up the turret, initial think //========================================================= void CNPC_BaseTurret::Initialize(void) { m_iOn = 0; m_fBeserk = 0; m_iSpin = 0; SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); if (m_iBaseTurnRate == 0) m_iBaseTurnRate = TURRET_TURNRATE; if (m_flMaxWait == 0) m_flMaxWait = TURRET_MAXWAIT; QAngle angles = GetAbsAngles(); m_flStartYaw = angles.y; if (m_iOrientation == TURRET_ORIENTATION_CEILING) { angles.x = 180; angles.y += 180; if( angles.y > 360 ) angles.y -= 360; SetAbsAngles( angles ); // pev->idealpitch = 180; //not used? Vector view_ofs = GetViewOffset(); view_ofs.z = -view_ofs.z; SetViewOffset( view_ofs ); // pev->effects |= EF_INVLIGHT; //no need } m_vecGoalAngles.x = 0; if (m_iAutoStart) { m_flLastSight = gpGlobals->curtime + m_flMaxWait; SetThink(&CNPC_BaseTurret::AutoSearchThink); SetNextThink( gpGlobals->curtime + 0.1 ); } else { SetThink( &CBaseEntity::SUB_DoNothing ); } }
void CGMan::RunTask(Task_t *pTask) { switch(pTask->iTask) { case TASK_WAIT: // look at who I'm talking to if(m_flTalkTime > gpGlobals->time && m_hTalkTarget != NULL) { float yaw = VecToYaw(m_hTalkTarget->pev->origin - pev->origin) - pev->angles.y; if(yaw > 180) yaw -= 360; if(yaw < -180) yaw += 360; // turn towards vector SetBoneController(0, yaw); } // look at player, but only if playing a "safe" idle animation else if(m_hPlayer != NULL && pev->sequence == 0) { float yaw = VecToYaw(m_hPlayer->pev->origin - pev->origin) - pev->angles.y; if(yaw > 180) yaw -= 360; if(yaw < -180) yaw += 360; // turn towards vector SetBoneController(0, yaw); } else { SetBoneController(0, 0); } CBaseMonster::RunTask(pTask); break; default: SetBoneController(0, 0); CBaseMonster::RunTask(pTask); break; } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_ObjectBaseMannedGun::OnDataChanged( DataUpdateType_t updateType ) { BaseClass::OnDataChanged(updateType); if ( updateType == DATA_UPDATE_CREATED ) { // FIXME: Will this work with build animations models? m_nBarrelAttachment = LookupAttachment( "barrel" ); m_nBarrelPivotAttachment = LookupAttachment( "barrelpivot" ); m_nStandAttachment = LookupAttachment( "vehicle_feet_passenger0" ); // Find the barrel height in its quiescent state... Vector vBarrel; QAngle vBarrelAngles; GetAttachmentLocal(m_nBarrelAttachment, vBarrel, vBarrelAngles); m_flBarrelHeight = vBarrel.z; // HACK HACK: This should be read from a .txt file at some point!!!! CHudTexture newTexture; Q_strcpy( newTexture.szTextureFile, "sprites/crosshairs" ); newTexture.rc.left = 0; newTexture.rc.top = 48; newTexture.rc.right = newTexture.rc.left + 24; newTexture.rc.bottom = newTexture.rc.top + 24; iconCrosshair = gHUD.AddUnsearchableHudIconToList( newTexture ); } else { // Set the bone state.. SetBoneController( 0, m_flGunYaw ); SetBoneController( 1, m_flGunPitch ); if ( m_nMoveStyle == MOVEMENT_STYLE_BARREL_PIVOT ) { SetBoneController( 2, m_flBarrelPitch ); } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CObjectBaseMannedGun::FinishMove( CBasePlayer *player, CUserCmd *ucmd, CMoveData *move ) { BaseClass::FinishMove( player, ucmd, move ); CTFMoveData *pMoveData = (CTFMoveData*)move; Assert( sizeof(MannedPlasmagunData_t) <= pMoveData->VehicleDataMaxSize() ); MannedPlasmagunData_t *pVehicleData = (MannedPlasmagunData_t*)pMoveData->VehicleData(); m_flGunYaw = pVehicleData->m_flGunYaw; m_flGunPitch = pVehicleData->m_flGunPitch; m_flBarrelPitch = pVehicleData->m_flBarrelPitch; // Set the bone state.. SetBoneController( 0, m_flGunYaw ); SetBoneController( 1, m_flGunPitch ); if ( m_nMoveStyle == MOVEMENT_STYLE_BARREL_PIVOT ) { SetBoneController( 2, m_flBarrelPitch ); } NetworkStateChanged(); }
//--------------------------------------------------------- //--------------------------------------------------------- void CNPC_MissileDefense::Spawn( void ) { Precache(); SetModel( "models/missile_defense.mdl" ); UTIL_SetSize( this, Vector( -36, -36 , 0 ), Vector( 36, 36, 64 ) ); SetSolid( SOLID_BBOX ); SetMoveType( MOVETYPE_NONE ); m_takedamage = DAMAGE_YES; SetBloodColor( DONT_BLEED ); m_iHealth = 10; m_flFieldOfView = 0.1; m_NPCState = NPC_STATE_NONE; CapabilitiesClear(); CapabilitiesAdd ( bits_CAP_INNATE_RANGE_ATTACK1 ); // Hate missiles AddClassRelationship( CLASS_MISSILE, D_HT, 5 ); m_spawnflags |= SF_NPC_LONG_RANGE; m_flReloadedTime = gpGlobals->curtime; InitBoneControllers(); NPCInit(); SetBoneController( MD_BC_YAW, 10 ); SetBoneController( MD_BC_PITCH, 0 ); SetBodygroup( 1, 1 ); SetBodygroup( 2, 1 ); SetBodygroup( 3, 1 ); SetBodygroup( 4, 1 ); m_NPCState = NPC_STATE_IDLE; }
void CNPC_BaseTurret::Spawn() { Precache( ); SetNextThink( gpGlobals->curtime + 1 ); SetMoveType( MOVETYPE_FLY ); SetSequence( 0 ); SetCycle( 0 ); SetSolid( SOLID_BBOX ); AddSolidFlags( FSOLID_NOT_STANDABLE ); m_takedamage = DAMAGE_YES; AddFlag( FL_AIMTARGET ); AddFlag( FL_NPC ); SetUse( &CNPC_BaseTurret::TurretUse ); if (( m_spawnflags & SF_MONSTER_TURRET_AUTOACTIVATE ) && !( m_spawnflags & SF_MONSTER_TURRET_STARTINACTIVE )) { m_iAutoStart = true; } ResetSequenceInfo( ); SetBoneController(0, 0); SetBoneController(1, 0); m_flFieldOfView = VIEW_FIELD_FULL; m_bloodColor = DONT_BLEED; m_flDamageTime = 0; if ( GetSpawnFlags() & SF_MONSTER_TURRET_STARTINACTIVE ) { SetTurretAnim( TURRET_ANIM_RETIRE ); SetCycle( 0.0f ); m_flPlaybackRate = 0.0f; } }
void CNPC_GMan :: RunTask( const Task_t *pTask ) { switch( pTask->iTask ) { case TASK_WAIT: // look at who I'm talking to if (m_flTalkTime > gpGlobals->curtime && m_hTalkTarget != NULL) { float yaw = VecToYaw(m_hTalkTarget->GetAbsOrigin() - GetAbsOrigin()) - GetAbsAngles().y; if (yaw > 180) yaw -= 360; if (yaw < -180) yaw += 360; // turn towards vector SetBoneController( 0, yaw ); } // look at player, but only if playing a "safe" idle animation else if (m_hPlayer != NULL && GetSequence() == 0) { float yaw = VecToYaw(m_hPlayer->GetAbsOrigin() - GetAbsOrigin()) - GetAbsAngles().y; if (yaw > 180) yaw -= 360; if (yaw < -180) yaw += 360; // turn towards vector SetBoneController( 0, yaw ); } else { SetBoneController( 0, 0 ); } BaseClass::RunTask( pTask ); break; } SetBoneController( 0, 0 ); BaseClass::RunTask( pTask ); }
//----------------------------------------------------------------------------- // Purpose: // Input : // Output : //----------------------------------------------------------------------------- void CAI_BaseFlyingBot::TurnHeadToTarget(float flInterval, const Vector &MoveTarget ) { float flDestYaw = VecToYaw( MoveTarget - GetLocalOrigin() ); float newYaw = AI_ClampYaw( GetHeadTurnRate() * 10.0f, m_fHeadYaw, flDestYaw, gpGlobals->curtime - GetLastThink() ); if ( newYaw != m_fHeadYaw ) { m_fHeadYaw = newYaw; } // Set us to face that way SetBoneController( 0, m_fHeadYaw ); }
// turn head towards supplied origin void CTalkMonster :: IdleHeadTurn( const Vector &vecFriend ) { // turn head in desired direction only if ent has a turnable head if (m_afCapability & bits_CAP_TURN_HEAD) { float yaw = VecToYaw(vecFriend - GetAbsOrigin()) - GetAbsAngles().y; if (yaw > 180) yaw -= 360; if (yaw < -180) yaw += 360; // turn towards vector SetBoneController( 0, yaw ); } }
//------------------------------------------------------------------------------ // Purpose : // Input : // Output : //------------------------------------------------------------------------------ void CNPC_MissileDefense::AimGun( void ) { if (GetEnemy() == NULL) { StopSound( "NPC_MissileDefense.Turn" ); return; } Vector forward, right, up; AngleVectors( GetLocalAngles(), &forward, &right, &up ); // Get gun attachment points Vector vBasePos; QAngle vBaseAng; GetAttachment( MD_AP_LGUN, vBasePos, vBaseAng ); Vector vTargetPos; EnemyShootPosition(GetEnemy(),&vTargetPos); Vector vTargetDir = vTargetPos - vBasePos; VectorNormalize( vTargetDir ); Vector vecOut; vecOut.x = DotProduct( forward, vTargetDir ); vecOut.y = -DotProduct( right, vTargetDir ); vecOut.z = DotProduct( up, vTargetDir ); QAngle angles; VectorAngles(vecOut, angles); if (angles.y > 180) angles.y = angles.y - 360; if (angles.y < -180) angles.y = angles.y + 360; if (angles.x > 180) angles.x = angles.x - 360; if (angles.x < -180) angles.x = angles.x + 360; float flOldX = m_vGunAng.x; float flOldY = m_vGunAng.y; if (angles.x > m_vGunAng.x) m_vGunAng.x = MIN( angles.x, m_vGunAng.x + MD_PITCH_SPEED ); if (angles.x < m_vGunAng.x) m_vGunAng.x = MAX( angles.x, m_vGunAng.x - MD_PITCH_SPEED ); if (angles.y > m_vGunAng.y) m_vGunAng.y = MIN( angles.y, m_vGunAng.y + MD_YAW_SPEED ); if (angles.y < m_vGunAng.y) m_vGunAng.y = MAX( angles.y, m_vGunAng.y - MD_YAW_SPEED ); m_vGunAng.y = SetBoneController( MD_BC_YAW, m_vGunAng.y ); m_vGunAng.x = SetBoneController( MD_BC_PITCH, m_vGunAng.x ); if (flOldX != m_vGunAng.x || flOldY != m_vGunAng.y) { EmitSound( "NPC_MissileDefense.Turn" ); } else { StopSound( "NPC_MissileDefense.Turn" ); } }
void CTalkMonster :: RunTask( const Task_t& task ) { switch( task.iTask ) { case TASK_TLK_CLIENT_STARE: case TASK_TLK_LOOK_AT_CLIENT: { edict_t *pPlayer; // track head to the client for a while. if( m_MonsterState == MONSTERSTATE_IDLE && !IsMoving() && !IsTalking() ) { // Get edict for one player pPlayer = g_engfuncs.pfnPEntityOfEntIndex( 1 ); if( pPlayer ) { IdleHeadTurn( pPlayer->v.origin ); } } else { // started moving or talking TaskFail(); return; } if( pPlayer ) { if( task.iTask == TASK_TLK_CLIENT_STARE ) { // fail out if the player looks away or moves away. if( ( pPlayer->v.origin - GetAbsOrigin() ).Length2D() > TLK_STARE_DIST ) { // player moved away. TaskFail(); } UTIL_MakeVectors( pPlayer->v.angles ); if( UTIL_DotPoints( pPlayer->v.origin, GetAbsOrigin(), gpGlobals->v_forward ) < m_flFieldOfView ) { // player looked away TaskFail(); } } } else { TaskFail(); } if( gpGlobals->time > m_flWaitFinished ) { TaskComplete(); } break; } case TASK_FACE_PLAYER: { // Get edict for one player edict_t *pPlayer = g_engfuncs.pfnPEntityOfEntIndex( 1 ); if( pPlayer ) { MakeIdealYaw( pPlayer->v.origin ); ChangeYaw( GetYawSpeed() ); IdleHeadTurn( pPlayer->v.origin ); if( gpGlobals->time > m_flWaitFinished && FlYawDiff() < 10 ) { TaskComplete(); } } else { TaskFail(); } break; } case TASK_TLK_EYECONTACT: { if( !IsMoving() && IsTalking() && m_hTalkTarget != NULL ) { // ALERT( at_console, "waiting %f\n", m_flStopTalkTime - gpGlobals->time ); IdleHeadTurn( m_hTalkTarget->GetAbsOrigin() ); } else { TaskComplete(); } break; } case TASK_WALK_PATH_FOR_UNITS: { float distance; distance = (m_vecLastPosition - GetAbsOrigin()).Length2D(); // Walk path until far enough away if ( distance > task.flData || MovementIsComplete() ) { TaskComplete(); RouteClear(); // Stop moving } break; } case TASK_WAIT_FOR_MOVEMENT: { if( IsTalking() && m_hTalkTarget != NULL ) { // ALERT(at_console, "walking, talking\n"); IdleHeadTurn( m_hTalkTarget->GetAbsOrigin() ); } else { IdleHeadTurn( GetAbsOrigin() ); // override so that during walk, a scientist may talk and greet player FIdleHello(); if( RANDOM_LONG( 0, m_nSpeak * 20 ) == 0 ) { FIdleSpeak(); } } CBaseMonster::RunTask( task ); if( TaskIsComplete() ) IdleHeadTurn( GetAbsOrigin() ); break; } default: { if( IsTalking() && m_hTalkTarget != NULL ) { IdleHeadTurn( m_hTalkTarget->GetAbsOrigin() ); } else { SetBoneController( 0, 0 ); } CBaseMonster::RunTask( task ); break; } } }
BOOL CApache :: FireGun( ) { UTIL_MakeAimVectors( pev->angles ); Vector posGun, angGun; GetAttachment( 1, posGun, angGun ); Vector vecTarget = (m_posTarget - posGun).Normalize( ); Vector vecOut; vecOut.x = DotProduct( gpGlobals->v_forward, vecTarget ); vecOut.y = -DotProduct( gpGlobals->v_right, vecTarget ); vecOut.z = DotProduct( gpGlobals->v_up, vecTarget ); Vector angles = UTIL_VecToAngles (vecOut); angles.x = -angles.x; if (angles.y > 180) angles.y = angles.y - 360; if (angles.y < -180) angles.y = angles.y + 360; if (angles.x > 180) angles.x = angles.x - 360; if (angles.x < -180) angles.x = angles.x + 360; if (angles.x > m_angGun.x) m_angGun.x = min( angles.x, m_angGun.x + 12 ); if (angles.x < m_angGun.x) m_angGun.x = max( angles.x, m_angGun.x - 12 ); if (angles.y > m_angGun.y) m_angGun.y = min( angles.y, m_angGun.y + 12 ); if (angles.y < m_angGun.y) m_angGun.y = max( angles.y, m_angGun.y - 12 ); m_angGun.y = SetBoneController( 0, m_angGun.y ); m_angGun.x = SetBoneController( 1, m_angGun.x ); Vector posBarrel, angBarrel; GetAttachment( 0, posBarrel, angBarrel ); Vector vecGun = (posBarrel - posGun).Normalize( ); if (DotProduct( vecGun, vecTarget ) > 0.98) { #if 1 FireBullets( 1, posGun, vecGun, VECTOR_CONE_4DEGREES, 8192, BULLET_MONSTER_12MM, 1 ); EMIT_SOUND(ENT(pev), CHAN_WEAPON, "turret/tu_fire1.wav", 1, 0.3); #else static float flNext; TraceResult tr; UTIL_TraceLine( posGun, posGun + vecGun * 8192, dont_ignore_monsters, ENT( pev ), &tr ); if (!m_pBeam) { m_pBeam = CBeam::BeamCreate( "sprites/lgtning.spr", 80 ); m_pBeam->PointEntInit( pev->origin, entindex( ) ); m_pBeam->SetEndAttachment( 1 ); m_pBeam->SetColor( 255, 180, 96 ); m_pBeam->SetBrightness( 192 ); } if (flNext < gpGlobals->time) { flNext = gpGlobals->time + 0.5; m_pBeam->SetStartPos( tr.vecEndPos ); } #endif return TRUE; } else { if (m_pBeam) { UTIL_Remove( m_pBeam ); m_pBeam = NULL; } } return FALSE; }
//========================================================= // MoveTurret - handle turret rotation // returns 1 if the turret moved. //========================================================= int CNPC_BaseTurret::MoveTurret(void) { int bMoved = 0; if (m_vecCurAngles.x != m_vecGoalAngles.x) { float flDir = m_vecGoalAngles.x > m_vecCurAngles.x ? 1 : -1 ; m_vecCurAngles.x += 0.1 * m_fTurnRate * flDir; // if we started below the goal, and now we're past, peg to goal if (flDir == 1) { if (m_vecCurAngles.x > m_vecGoalAngles.x) m_vecCurAngles.x = m_vecGoalAngles.x; } else { if (m_vecCurAngles.x < m_vecGoalAngles.x) m_vecCurAngles.x = m_vecGoalAngles.x; } if (m_iOrientation == TURRET_ORIENTATION_FLOOR) SetBoneController(1, m_vecCurAngles.x); else SetBoneController(1, -m_vecCurAngles.x); bMoved = 1; } if (m_vecCurAngles.y != m_vecGoalAngles.y) { float flDir = m_vecGoalAngles.y > m_vecCurAngles.y ? 1 : -1 ; float flDist = fabs(m_vecGoalAngles.y - m_vecCurAngles.y); if (flDist > 180) { flDist = 360 - flDist; flDir = -flDir; } if (flDist > 30) { if (m_fTurnRate < m_iBaseTurnRate * 10) { m_fTurnRate += m_iBaseTurnRate; } } else if (m_fTurnRate > 45) { m_fTurnRate -= m_iBaseTurnRate; } else { m_fTurnRate += m_iBaseTurnRate; } m_vecCurAngles.y += 0.1 * m_fTurnRate * flDir; if (m_vecCurAngles.y < 0) m_vecCurAngles.y += 360; else if (m_vecCurAngles.y >= 360) m_vecCurAngles.y -= 360; if (flDist < (0.05 * m_iBaseTurnRate)) m_vecCurAngles.y = m_vecGoalAngles.y; QAngle angles = GetAbsAngles(); //ALERT(at_console, "%.2f -> %.2f\n", m_vecCurAngles.y, y); if (m_iOrientation == TURRET_ORIENTATION_FLOOR) SetBoneController(0, m_vecCurAngles.y - angles.y ); else SetBoneController(0, angles.y - 180 - m_vecCurAngles.y ); bMoved = 1; } if (!bMoved) m_fTurnRate = m_iBaseTurnRate; //DevMsg(1, "(%.2f, %.2f)->(%.2f, %.2f)\n", m_vecCurAngles.x, // m_vecCurAngles.y, m_vecGoalAngles.x, m_vecGoalAngles.y); return bMoved; }
//========================================================= // RunTask //========================================================= void CGargantua::RunTask( Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_DIE: if ( gpGlobals->time > m_flWaitFinished ) { pev->renderfx = kRenderFxExplode; pev->rendercolor.x = 255; pev->rendercolor.y = 0; pev->rendercolor.z = 0; StopAnimation(); pev->nextthink = gpGlobals->time + 0.15; SetThink( SUB_Remove ); int i; int parts = MODEL_FRAMES( gGargGibModel ); for ( i = 0; i < 10; i++ ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( GARG_GIB_MODEL ); int bodyPart = 0; if ( parts > 1 ) bodyPart = RANDOM_LONG( 0, pev->body-1 ); pGib->pev->body = bodyPart; pGib->m_bloodColor = BLOOD_COLOR_YELLOW; pGib->m_material = matNone; pGib->SetAbsOrigin( GetAbsOrigin() ); pGib->SetAbsVelocity( UTIL_RandomBloodVector() * RANDOM_FLOAT( 300, 500 )); pGib->SetNextThink( 1.25 ); pGib->SetThink( SUB_FadeOut ); } Vector vecOrigin = GetAbsOrigin(); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecOrigin ); WRITE_BYTE( TE_BREAKMODEL); // position WRITE_COORD( vecOrigin.x ); WRITE_COORD( vecOrigin.y ); WRITE_COORD( vecOrigin.z ); // size WRITE_COORD( 200 ); WRITE_COORD( 200 ); WRITE_COORD( 128 ); // velocity WRITE_COORD( 0 ); WRITE_COORD( 0 ); WRITE_COORD( 0 ); // randomization WRITE_BYTE( 200 ); // Model WRITE_SHORT( gGargGibModel ); //model id# // # of shards WRITE_BYTE( 50 ); // duration WRITE_BYTE( 20 );// 3.0 seconds // flags WRITE_BYTE( BREAK_FLESH ); MESSAGE_END(); return; } else CBaseMonster::RunTask(pTask); break; case TASK_FLAME_SWEEP: if ( gpGlobals->time > m_flWaitFinished ) { FlameDestroy(); TaskComplete(); FlameControls( 0, 0 ); SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); } else { BOOL cancel = FALSE; Vector angles = g_vecZero; FlameUpdate(); CBaseEntity *pEnemy = m_hEnemy; if ( pEnemy ) { Vector org = GetAbsOrigin(); org.z += 64; Vector dir = pEnemy->BodyTarget(org) - org; angles = UTIL_VecToAngles( dir ); angles.y -= GetAbsAngles().y; if ( dir.Length() > 400 ) cancel = TRUE; } if ( fabs(angles.y) > 60 ) cancel = TRUE; if ( cancel ) { m_flWaitFinished -= 0.5; m_flameTime -= 0.5; } // FlameControls( angles.x + 2 * sin(gpGlobals->time*8), angles.y + 28 * sin(gpGlobals->time*8.5) ); FlameControls( angles.x, angles.y ); } break; default: CBaseMonster::RunTask( pTask ); break; } }
void COsprey::Flight( ) { float t = (gpGlobals->time - m_startTime); float scale = 1.0 / m_dTime; float f = UTIL_SplineFraction( t * scale, 1.0 ); Vector pos = (m_pos1 + m_vel1 * t) * (1.0 - f) + (m_pos2 - m_vel2 * (m_dTime - t)) * f; Vector ang = (m_ang1) * (1.0 - f) + (m_ang2) * f; m_velocity = m_vel1 * (1.0 - f) + m_vel2 * f; SetAbsOrigin( pos ); SetAbsAngles( ang ); UTIL_MakeAimVectors( GetAbsAngles() ); float flSpeed = DotProduct( gpGlobals->v_forward, m_velocity ); // float flSpeed = DotProduct( gpGlobals->v_forward, GetAbsVelocity() ); float m_flIdealtilt = (160 - flSpeed) / 10.0; // ALERT( at_console, "%f %f\n", flSpeed, flIdealtilt ); if (m_flRotortilt < m_flIdealtilt) { m_flRotortilt += 0.5; if (m_flRotortilt > 0) m_flRotortilt = 0; } if (m_flRotortilt > m_flIdealtilt) { m_flRotortilt -= 0.5; if (m_flRotortilt < -90) m_flRotortilt = -90; } SetBoneController( 0, m_flRotortilt ); if (m_iSoundState == 0) { EMIT_SOUND_DYN(ENT(pev), CHAN_STATIC, "apache/ap_rotor4.wav", 1.0, 0.15, 0, 110 ); // EMIT_SOUND_DYN(ENT(pev), CHAN_STATIC, "apache/ap_whine1.wav", 0.5, 0.2, 0, 110 ); m_iSoundState = SND_CHANGE_PITCH; // hack for going through level transitions } else { CBaseEntity *pPlayer = NULL; pPlayer = UTIL_FindEntityByClassname( NULL, "player" ); // UNDONE: this needs to send different sounds to every player for multiplayer. if (pPlayer) { float pitch = DotProduct( m_velocity - pPlayer->GetAbsVelocity(), (pPlayer->GetAbsOrigin() - GetAbsOrigin()).Normalize() ); pitch = (int)(100 + pitch / 75.0); if (pitch > 250) pitch = 250; if (pitch < 50) pitch = 50; if (pitch == 100) pitch = 101; if (pitch != m_iPitch) { m_iPitch = pitch; EMIT_SOUND_DYN(ENT(pev), CHAN_STATIC, "apache/ap_rotor4.wav", 1.0, 0.15, SND_CHANGE_PITCH | SND_CHANGE_VOL, pitch); // ALERT( at_console, "%.0f\n", pitch ); } } // EMIT_SOUND_DYN(ENT(pev), CHAN_STATIC, "apache/ap_whine1.wav", flVol, 0.2, SND_CHANGE_PITCH | SND_CHANGE_VOL, pitch); } }
int CBaseTurret::MoveTurret(void) { int state = 0; // any x movement? if (m_vecCurAngles.x != m_vecGoalAngles.x) { float flDir = m_vecGoalAngles.x > m_vecCurAngles.x ? 1 : -1 ; m_vecCurAngles.x += 0.1 * m_fTurnRate * flDir; // if we started below the goal, and now we're past, peg to goal if (flDir == 1) { if (m_vecCurAngles.x > m_vecGoalAngles.x) m_vecCurAngles.x = m_vecGoalAngles.x; } else { if (m_vecCurAngles.x < m_vecGoalAngles.x) m_vecCurAngles.x = m_vecGoalAngles.x; } if (m_iOrientation == 0) SetBoneController(1, -m_vecCurAngles.x); else SetBoneController(1, m_vecCurAngles.x); state = 1; } if (m_vecCurAngles.y != m_vecGoalAngles.y) { float flDir = m_vecGoalAngles.y > m_vecCurAngles.y ? 1 : -1 ; float flDist = fabs(m_vecGoalAngles.y - m_vecCurAngles.y); if (flDist > 180) { flDist = 360 - flDist; flDir = -flDir; } if (flDist > 30) { if (m_fTurnRate < m_iBaseTurnRate * 10) { m_fTurnRate += m_iBaseTurnRate; } } else if (m_fTurnRate > 45) { m_fTurnRate -= m_iBaseTurnRate; } else { m_fTurnRate += m_iBaseTurnRate; } m_vecCurAngles.y += 0.1 * m_fTurnRate * flDir; if (m_vecCurAngles.y < 0) m_vecCurAngles.y += 360; else if (m_vecCurAngles.y >= 360) m_vecCurAngles.y -= 360; if (flDist < (0.05 * m_iBaseTurnRate)) m_vecCurAngles.y = m_vecGoalAngles.y; //ALERT(at_console, "%.2f -> %.2f\n", m_vecCurAngles.y, y); if (m_iOrientation == 0) SetBoneController(0, m_vecCurAngles.y - pev->angles.y ); else SetBoneController(0, pev->angles.y - 180 - m_vecCurAngles.y ); state = 1; } if (!state) m_fTurnRate = m_iBaseTurnRate; //ALERT(at_console, "(%.2f, %.2f)->(%.2f, %.2f)\n", m_vecCurAngles.x, // m_vecCurAngles.y, m_vecGoalAngles.x, m_vecGoalAngles.y); return state; }
void CSentry :: SentryDeath( void ) { BOOL iActive = FALSE; StudioFrameAdvance( ); pev->nextthink = gpGlobals->time + 0.1; if (pev->deadflag != DEAD_DEAD) { pev->deadflag = DEAD_DEAD; float flRndSound = RANDOM_FLOAT ( 0 , 1 ); if ( flRndSound <= 0.33 ) EMIT_SOUND(ENT(pev), CHAN_BODY, "turret/tu_die.wav", 1.0, ATTN_NORM); else if ( flRndSound <= 0.66 ) EMIT_SOUND(ENT(pev), CHAN_BODY, "turret/tu_die2.wav", 1.0, ATTN_NORM); else EMIT_SOUND(ENT(pev), CHAN_BODY, "turret/tu_die3.wav", 1.0, ATTN_NORM); EMIT_SOUND_DYN(ENT(pev), CHAN_STATIC, "turret/tu_active2.wav", 0, 0, SND_STOP, 100); SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); SetTurretAnim(TURRET_ANIM_DIE); pev->solid = SOLID_NOT; pev->angles.y = UTIL_AngleMod( pev->angles.y + RANDOM_LONG( 0, 2 ) * 120 ); EyeOn( ); } EyeOff( ); Vector vecSrc, vecAng; GetAttachment( 1, vecSrc, vecAng ); if (pev->dmgtime + RANDOM_FLOAT( 0, 2 ) > gpGlobals->time) { // lots of smoke MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); WRITE_BYTE( TE_SMOKE ); WRITE_COORD( vecSrc.x + RANDOM_FLOAT( -16, 16 ) ); WRITE_COORD( vecSrc.y + RANDOM_FLOAT( -16, 16 ) ); WRITE_COORD( vecSrc.z - 32 ); WRITE_SHORT( g_sModelIndexSmoke ); WRITE_BYTE( 15 ); // scale * 10 WRITE_BYTE( 8 ); // framerate MESSAGE_END(); } if (pev->dmgtime + RANDOM_FLOAT( 0, 8 ) > gpGlobals->time) { UTIL_Sparks( vecSrc ); } if (m_fSequenceFinished && pev->dmgtime + 5 < gpGlobals->time) { pev->framerate = 0; SetThink( NULL ); } }
void CHostage::Spawn(void) { Precache(); if (pev->classname) RemoveEntityHashValue(pev, STRING(pev->classname), CLASSNAME); pev->classname = MAKE_STRING("hostage_entity"); AddEntityHashValue(pev, STRING(pev->classname), CLASSNAME); pev->movetype = MOVETYPE_STEP; pev->solid = SOLID_SLIDEBOX; pev->takedamage = DAMAGE_YES; pev->flags |= FL_MONSTER; pev->deadflag = DEAD_NO; pev->max_health = 100; pev->health = pev->max_health; pev->gravity = 1; pev->view_ofs = VEC_HOSTAGE_VIEW; pev->velocity = Vector(0, 0, 0); if (pev->spawnflags & SF_MONSTER_HITMONSTERCLIP) pev->flags |= FL_MONSTERCLIP; if (pev->skin < 0) pev->skin = 0; SET_MODEL(ENT(pev), STRING(pev->model)); SetActivity(ACT_IDLE); m_flNextChange = 0; m_State = STAND; m_hTargetEnt = NULL; m_hStoppedTargetEnt = NULL; m_vPathToFollow[0] = Vector(0, 0, 0); m_flFlinchTime = 0; m_bRescueMe = 0; UTIL_SetSize(pev, VEC_HOSTAGE_HULL_MIN, VEC_HOSTAGE_HULL_MAX); UTIL_MakeVectors(pev->v_angle); SetBoneController(0, UTIL_VecToYaw(gpGlobals->v_forward)); SetBoneController(1, 0); SetBoneController(2, 0); SetBoneController(3, 0); SetBoneController(4, 0); DROP_TO_FLOOR(ENT(pev)); SetThink(&CHostage::IdleThink); pev->nextthink = gpGlobals->time + RANDOM_FLOAT(0.1, 0.2); m_flNextFullThink = gpGlobals->time + RANDOM_FLOAT(0.1, 0.2); m_vStart = pev->origin; m_vStartAngles = pev->angles; m_vOldPos = Vector(9999, 9999, 9999); m_iHostageIndex = ++g_iHostageNumber; nTargetNode = -1; m_fHasPath = FALSE; m_flLastPathCheck = -1; m_flPathAcquired = -1; m_flPathCheckInterval = 0.1; m_flNextRadarTime = gpGlobals->time + RANDOM_FLOAT(0, 1); m_LocalNav = new CLocalNav(this); m_bStuck = FALSE; m_flStuckTime = 0; m_improv = NULL; }
void CIchthyosaur::Swim( ) { int retValue = 0; Vector start = pev->origin; Vector Angles; Vector Forward, Right, Up; if (FBitSet( pev->flags, FL_ONGROUND)) { pev->angles.x = 0; pev->angles.y += RANDOM_FLOAT( -45, 45 ); ClearBits( pev->flags, FL_ONGROUND ); Angles = Vector( -pev->angles.x, pev->angles.y, pev->angles.z ); UTIL_MakeVectorsPrivate(Angles, Forward, Right, Up); pev->velocity = Forward * 200 + Up * 200; return; } if (m_bOnAttack && m_flightSpeed < m_flMaxSpeed) { m_flightSpeed += 40; } if (m_flightSpeed < 180) { if (m_IdealActivity == ACT_RUN) SetActivity( ACT_WALK ); if (m_IdealActivity == ACT_WALK) pev->framerate = m_flightSpeed / 150.0; // ALERT( at_console, "walk %.2f\n", pev->framerate ); } else { if (m_IdealActivity == ACT_WALK) SetActivity( ACT_RUN ); if (m_IdealActivity == ACT_RUN) pev->framerate = m_flightSpeed / 150.0; // ALERT( at_console, "run %.2f\n", pev->framerate ); } /* if (!m_pBeam) { m_pBeam = CBeam::BeamCreate( "sprites/laserbeam.spr", 80 ); m_pBeam->PointEntInit( pev->origin + m_SaveVelocity, entindex( ) ); m_pBeam->SetEndAttachment( 1 ); m_pBeam->SetColor( 255, 180, 96 ); m_pBeam->SetBrightness( 192 ); } */ #define PROBE_LENGTH 150 Angles = UTIL_VecToAngles( m_SaveVelocity ); Angles.x = -Angles.x; UTIL_MakeVectorsPrivate(Angles, Forward, Right, Up); Vector f, u, l, r, d; f = DoProbe(start + PROBE_LENGTH * Forward); r = DoProbe(start + PROBE_LENGTH/3 * Forward+Right); l = DoProbe(start + PROBE_LENGTH/3 * Forward-Right); u = DoProbe(start + PROBE_LENGTH/3 * Forward+Up); d = DoProbe(start + PROBE_LENGTH/3 * Forward-Up); Vector SteeringVector = f+r+l+u+d; m_SaveVelocity = (m_SaveVelocity + SteeringVector/2).Normalize(); Angles = Vector( -pev->angles.x, pev->angles.y, pev->angles.z ); UTIL_MakeVectorsPrivate(Angles, Forward, Right, Up); // ALERT( at_console, "%f : %f\n", Angles.x, Forward.z ); float flDot = DotProduct( Forward, m_SaveVelocity ); if (flDot > 0.5) pev->velocity = m_SaveVelocity = m_SaveVelocity * m_flightSpeed; else if (flDot > 0) pev->velocity = m_SaveVelocity = m_SaveVelocity * m_flightSpeed * (flDot + 0.5); else pev->velocity = m_SaveVelocity = m_SaveVelocity * 80; // ALERT( at_console, "%.0f %.0f\n", m_flightSpeed, pev->velocity.Length() ); // ALERT( at_console, "Steer %f %f %f\n", SteeringVector.x, SteeringVector.y, SteeringVector.z ); /* m_pBeam->SetStartPos( pev->origin + pev->velocity ); m_pBeam->RelinkBeam( ); */ // ALERT( at_console, "speed %f\n", m_flightSpeed ); Angles = UTIL_VecToAngles( m_SaveVelocity ); // Smooth Pitch // if (Angles.x > 180) Angles.x = Angles.x - 360; pev->angles.x = UTIL_Approach(Angles.x, pev->angles.x, 50 * 0.1 ); if (pev->angles.x < -80) pev->angles.x = -80; if (pev->angles.x > 80) pev->angles.x = 80; // Smooth Yaw and generate Roll // float turn = 360; // ALERT( at_console, "Y %.0f %.0f\n", Angles.y, pev->angles.y ); if (fabs(Angles.y - pev->angles.y) < fabs(turn)) { turn = Angles.y - pev->angles.y; } if (fabs(Angles.y - pev->angles.y + 360) < fabs(turn)) { turn = Angles.y - pev->angles.y + 360; } if (fabs(Angles.y - pev->angles.y - 360) < fabs(turn)) { turn = Angles.y - pev->angles.y - 360; } float speed = m_flightSpeed * 0.1; // ALERT( at_console, "speed %.0f %f\n", turn, speed ); if (fabs(turn) > speed) { if (turn < 0.0) { turn = -speed; } else { turn = speed; } } pev->angles.y += turn; pev->angles.z -= turn; pev->angles.y = fmod((pev->angles.y + 360.0), 360.0); static float yaw_adj; yaw_adj = yaw_adj * 0.8 + turn; // ALERT( at_console, "yaw %f : %f\n", turn, yaw_adj ); SetBoneController( 0, -yaw_adj / 4.0 ); // Roll Smoothing // turn = 360; if (fabs(Angles.z - pev->angles.z) < fabs(turn)) { turn = Angles.z - pev->angles.z; } if (fabs(Angles.z - pev->angles.z + 360) < fabs(turn)) { turn = Angles.z - pev->angles.z + 360; } if (fabs(Angles.z - pev->angles.z - 360) < fabs(turn)) { turn = Angles.z - pev->angles.z - 360; } speed = m_flightSpeed/2 * 0.1; if (fabs(turn) < speed) { pev->angles.z += turn; } else { if (turn < 0.0) { pev->angles.z -= speed; } else { pev->angles.z += speed; } } if (pev->angles.z < -20) pev->angles.z = -20; if (pev->angles.z > 20) pev->angles.z = 20; UTIL_MakeVectorsPrivate( Vector( -Angles.x, Angles.y, Angles.z ), Forward, Right, Up); // UTIL_MoveToOrigin ( ENT(pev), pev->origin + Forward * speed, speed, MOVE_STRAFE ); }
//========================================================= // sit, do stuff //========================================================= void CSittingScientist :: SittingThink( void ) { CBaseEntity *pent; StudioFrameAdvance( ); // try to greet player if (FIdleHello()) { pent = FindNearestFriend(TRUE); if (pent) { float yaw = VecToYaw(pent->pev->origin - pev->origin) - pev->angles.y; if (yaw > 180) yaw -= 360; if (yaw < -180) yaw += 360; if (yaw > 0) pev->sequence = m_baseSequence + SITTING_ANIM_sitlookleft; else pev->sequence = m_baseSequence + SITTING_ANIM_sitlookright; ResetSequenceInfo( ); pev->frame = 0; SetBoneController( 0, 0 ); } } else if (m_fSequenceFinished) { int i = RANDOM_LONG(0,99); m_headTurn = 0; if (m_flResponseDelay && gpGlobals->time > m_flResponseDelay) { // respond to question IdleRespond(); pev->sequence = m_baseSequence + SITTING_ANIM_sitscared; m_flResponseDelay = 0; } else if (i < 30) { pev->sequence = m_baseSequence + SITTING_ANIM_sitting3; // turn towards player or nearest friend and speak if (!FBitSet(m_bitsSaid, bit_saidHelloPlayer)) pent = FindNearestFriend(TRUE); else pent = FindNearestFriend(FALSE); if (!FIdleSpeak() || !pent) { m_headTurn = RANDOM_LONG(0,8) * 10 - 40; pev->sequence = m_baseSequence + SITTING_ANIM_sitting3; } else { // only turn head if we spoke float yaw = VecToYaw(pent->pev->origin - pev->origin) - pev->angles.y; if (yaw > 180) yaw -= 360; if (yaw < -180) yaw += 360; if (yaw > 0) pev->sequence = m_baseSequence + SITTING_ANIM_sitlookleft; else pev->sequence = m_baseSequence + SITTING_ANIM_sitlookright; //ALERT(at_console, "sitting speak\n"); } } else if (i < 60) { pev->sequence = m_baseSequence + SITTING_ANIM_sitting3; m_headTurn = RANDOM_LONG(0,8) * 10 - 40; if (RANDOM_LONG(0,99) < 5) { //ALERT(at_console, "sitting speak2\n"); FIdleSpeak(); } } else if (i < 80) { pev->sequence = m_baseSequence + SITTING_ANIM_sitting2; } else if (i < 100) { pev->sequence = m_baseSequence + SITTING_ANIM_sitscared; } ResetSequenceInfo( ); pev->frame = 0; SetBoneController( 0, m_headTurn ); } SetNextThink( 0.1 ); }