//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_BaseEntity::PhysicsCustom() { PhysicsCheckWater(); // regular thinking if ( !PhysicsRunThink() ) return; // Moving upward, off the ground, or resting on something that isn't ground if ( m_vecVelocity[2] > 0 || !GetGroundEntity() || !GetGroundEntity()->IsStandable() ) { SetGroundEntity( NULL ); } // NOTE: The entity must set the position, angles, velocity in its custom movement Vector vecNewPosition = GetAbsOrigin(); if ( vecNewPosition == vec3_origin ) { // Shouldn't be at world origin Assert( 0 ); } Vector vecNewVelocity = m_vecVelocity; QAngle angNewAngles = GetAbsAngles(); QAngle angNewAngVelocity = m_vecAngVelocity; PerformCustomPhysics( &vecNewPosition, &vecNewVelocity, &angNewAngles, &angNewAngVelocity ); // Store off all of the new state information... m_vecVelocity = vecNewVelocity; SetAbsAngles( angNewAngles ); m_vecAngVelocity = angNewAngVelocity; Vector move; VectorSubtract( vecNewPosition, GetAbsOrigin(), move ); // move origin trace_t trace; PhysicsPushEntity( move, &trace ); PhysicsCheckVelocity(); if (trace.allsolid) { // entity is trapped in another solid // UNDONE: does this entity needs to be removed? VectorCopy (vec3_origin, m_vecVelocity); VectorCopy (vec3_angle, m_vecAngVelocity); return; } #if !defined( CLIENT_DLL ) if (pev->free) return; #endif // check for in water PhysicsCheckWaterTransition(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CNPC_Bullseye::Spawn( void ) { Precache(); // This is a dummy model that is never used! UTIL_SetSize(this, Vector(-16,-16,-16), Vector(16,16,16)); SetMoveType( MOVETYPE_NONE ); SetBloodColor( BLOOD_COLOR_RED ); ClearEffects(); SetGravity( 0.0 ); m_flFieldOfView = cos( DEG2RAD(m_flFieldOfView) / 2.0 ); //Got blood? if ( m_spawnflags & SF_BULLSEYE_BLEED ) { SetBloodColor(BLOOD_COLOR_RED); } else { SetBloodColor(DONT_BLEED); } AddFlag( FL_NPC ); AddEFlags( EFL_NO_DISSOLVE ); SetThink( &CNPC_Bullseye::BullseyeThink ); SetNextThink( gpGlobals->curtime + 0.1f ); SetSolid( SOLID_BBOX ); AddSolidFlags( FSOLID_NOT_STANDABLE ); if( m_spawnflags & SF_BULLSEYE_NONSOLID ) { AddSolidFlags( FSOLID_NOT_SOLID ); } if ( m_spawnflags & SF_BULLSEYE_VPHYSICSSHADOW ) { VPhysicsInitShadow( false, false ); } if( m_spawnflags & SF_BULLSEYE_NODAMAGE ) { m_takedamage = DAMAGE_NO; } else { m_takedamage = DAMAGE_YES; } AddEffects( EF_NODRAW ); //Check our water level PhysicsCheckWater(); CapabilitiesAdd( bits_CAP_SIMPLE_RADIUS_DAMAGE ); m_iMaxHealth = GetHealth(); if( m_fAutoaimRadius > 0.0f ) { // Make this an aimtarget, since it has some autoaim influence. AddFlag(FL_AIMTARGET); } }