void UTIL_BubbleTrail( Vector from, Vector to, int count ) { float flHeight = UTIL_WaterLevel( from, from.z, from.z + 256 ); flHeight = flHeight - from.z; if (flHeight < 8) { flHeight = UTIL_WaterLevel( to, to.z, to.z + 256 ); flHeight = flHeight - to.z; if (flHeight < 8) return; // UNDONE: do a ploink sound flHeight = flHeight + to.z - from.z; } if (count > 255) count = 255; MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); WRITE_BYTE( TE_BUBBLETRAIL ); WRITE_COORD( from.x ); // mins WRITE_COORD( from.y ); WRITE_COORD( from.z ); WRITE_COORD( to.x ); // maxz WRITE_COORD( to.y ); WRITE_COORD( to.z ); WRITE_COORD( flHeight ); // height WRITE_SHORT( g_sModelIndexBubbles ); WRITE_BYTE( count ); // count WRITE_COORD( 8 ); // speed MESSAGE_END(); }
void UTIL_Bubbles( const Vector& mins, const Vector& maxs, int count ) { Vector mid = (mins + maxs) * 0.5; float flHeight = UTIL_WaterLevel( mid, mid.z, mid.z + 1024 ); flHeight = flHeight - mins.z; CPASFilter filter( mid ); int bubbles = modelinfo->GetModelIndex( "sprites/bubble.vmt" ); te->Bubbles( filter, 0.0, &mins, &maxs, flHeight, bubbles, count, 8.0 ); }
float CFlyingMonster::CeilingZ( const Vector &position ) { TraceResult tr; Vector minUp = position; Vector maxUp = position; maxUp.z += 4096.0; UTIL_TraceLine(position, maxUp, ignore_monsters, NULL, &tr); if (tr.flFraction != 1.0) maxUp.z = tr.vecEndPos.z; if ((pev->flags) & FL_SWIM) { return UTIL_WaterLevel( position, minUp.z, maxUp.z ); } return maxUp.z; }
void UTIL_Bubbles( Vector mins, Vector maxs, int count ) { Vector mid = (mins + maxs) * 0.5; float flHeight = UTIL_WaterLevel( mid, mid.z, mid.z + 1024 ); flHeight = flHeight - mins.z; MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, mid ); WRITE_BYTE( TE_BUBBLES ); WRITE_COORD( mins.x ); // mins WRITE_COORD( mins.y ); WRITE_COORD( mins.z ); WRITE_COORD( maxs.x ); // maxz WRITE_COORD( maxs.y ); WRITE_COORD( maxs.z ); WRITE_COORD( flHeight ); // height WRITE_SHORT( g_sModelIndexBubbles ); WRITE_BYTE( count ); // count WRITE_COORD( 8 ); // speed MESSAGE_END(); }
void CLeech::RecalculateWaterlevel( void ) { // Calculate boundaries Vector vecTest = pev->origin - Vector(0,0,400); TraceResult tr; UTIL_TraceLine(pev->origin, vecTest, missile, edict(), &tr); if ( tr.flFraction != 1.0 ) m_bottom = tr.vecEndPos.z + 1; else m_bottom = vecTest.z; m_top = UTIL_WaterLevel( pev->origin, pev->origin.z, pev->origin.z + 400 ) - 1; // Chop off 20% of the outside range float newBottom = m_bottom * 0.8 + m_top * 0.2; m_top = m_bottom * 0.2 + m_top * 0.8; m_bottom = newBottom; m_height = RANDOM_FLOAT( m_bottom, m_top ); m_waterTime = gpGlobals->time + RANDOM_FLOAT( 5, 7 ); }
/** * Initialize the fish pool */ void CFishPool::Spawn() { SetThink( &CFishPool::Update ); SetNextThink( gpGlobals->curtime ); m_waterLevel = UTIL_WaterLevel( GetAbsOrigin(), GetAbsOrigin().z, GetAbsOrigin().z + 1000.0f ); trace_t result; for( int i=0; i<m_fishCount; ++i ) { QAngle heading( 0.0f, RandomFloat( 0, 360.0f ), 0.0f ); CFish *fish = (CFish *)Create( "fish", GetAbsOrigin(), heading, this ); fish->Initialize( this, i ); if (fish) { CHandle<CFish> hFish; hFish.Set( fish ); m_fishes.AddToTail( hFish ); } } }
//----------------------------------------------------------------------------- // Purpose: // Input : &Steer - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CNPC_Ichthyosaur::SteerAvoidObstacles(Vector &Steer, const Vector &Velocity, const Vector &Forward, const Vector &Right, const Vector &Up) { trace_t tr; bool collided = false; Vector dir = Velocity; float speed = VectorNormalize( dir ); //Look ahead one second and avoid whatever is in our way. AI_TraceHull( GetAbsOrigin(), GetAbsOrigin() + (dir*speed), GetHullMins(), GetHullMaxs(), MASK_NPCSOLID, this, COLLISION_GROUP_NONE, &tr ); Vector forward; GetVectors( &forward, NULL, NULL ); //If we're hitting our enemy, just continue on if ( ( GetEnemy() != NULL ) && ( tr.m_pEnt == GetEnemy() ) ) return false; if ( tr.fraction < 1.0f ) { CBaseEntity *pBlocker = tr.m_pEnt; if ( ( pBlocker != NULL ) && ( pBlocker->MyNPCPointer() != NULL ) ) { DevMsg( 2, "Avoiding an NPC\n" ); Vector HitOffset = tr.endpos - GetAbsOrigin(); Vector SteerUp = CrossProduct( HitOffset, Velocity ); Steer = CrossProduct( SteerUp, Velocity ); VectorNormalize( Steer ); /*Vector probeDir = tr.endpos - GetAbsOrigin(); Vector normalToProbeAndWallNormal = probeDir.Cross( tr.plane.normal ); Steer = normalToProbeAndWallNormal.Cross( probeDir ); VectorNormalize( Steer );*/ if ( tr.fraction > 0 ) { Steer = (Steer * Velocity.Length()) / tr.fraction; //NDebugOverlay::Line( GetLocalOrigin(), GetLocalOrigin()+Steer, 255, 0, 0, false, 0.1f ); } else { Steer = (Steer * 1000 * Velocity.Length()); //NDebugOverlay::Line( GetLocalOrigin(), GetLocalOrigin()+Steer, 255, 0, 0, false, 0.1f ); } } else { if ( ( pBlocker != NULL ) && ( pBlocker == GetEnemy() ) ) { DevMsg( "Avoided collision\n" ); return false; } DevMsg( 2, "Avoiding the world\n" ); Vector steeringVector = tr.plane.normal; if ( tr.fraction == 0.0f ) return false; Steer = steeringVector * ( Velocity.Length() / tr.fraction ); //NDebugOverlay::Line( GetLocalOrigin(), GetLocalOrigin()+Steer, 255, 0, 0, false, 0.1f ); } //return true; collided = true; } //Try to remain 8 feet above the ground. AI_TraceLine( GetAbsOrigin(), GetAbsOrigin() + Vector(0, 0, -ICH_HEIGHT_PREFERENCE), MASK_NPCSOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr ); if ( tr.fraction < 1.0f ) { Steer += Vector( 0, 0, m_vecAccelerationMax.z / tr.fraction ); collided = true; } //Stay under the surface if ( m_bIgnoreSurface == false ) { float waterLevel = ( UTIL_WaterLevel( GetAbsOrigin(), GetAbsOrigin().z, GetAbsOrigin().z+ICH_DEPTH_PREFERENCE ) - GetAbsOrigin().z ) / ICH_DEPTH_PREFERENCE; if ( waterLevel < 1.0f ) { Steer += -Vector( 0, 0, m_vecAccelerationMax.z / waterLevel ); collided = true; } } return collided; }
Vector CNPC_Ichthyosaur::DoProbe( const Vector &probe ) { trace_t tr; float fraction = 1.0f; bool collided = false; Vector normal = Vector( 0, 0, -1 ); float waterLevel = UTIL_WaterLevel( GetAbsOrigin(), GetAbsOrigin().z, GetAbsOrigin().z+150 ); waterLevel -= GetAbsOrigin().z; waterLevel /= 150; if ( waterLevel < 1.0f ) { collided = true; fraction = waterLevel; } AI_TraceHull( GetAbsOrigin(), probe, GetHullMins(), GetHullMaxs(), MASK_NPCSOLID, this, COLLISION_GROUP_NONE, &tr ); if ( ( collided == false ) || ( tr.fraction < fraction ) ) { fraction = tr.fraction; normal = tr.plane.normal; } if ( ( fraction < 1.0f ) && ( GetEnemy() == NULL || tr.u.ent != GetEnemy()->pev ) ) { #if FEELER_COLLISION_VISUALIZE NDebugOverlay::Line( GetLocalOrigin(), probe, 255, 0, 0, false, 0.1f ); #endif Vector probeDir = probe - GetLocalOrigin(); Vector normalToProbeAndWallNormal = probeDir.Cross( normal ); Vector steeringVector = normalToProbeAndWallNormal.Cross( probeDir ); Vector velDir = GetAbsVelocity(); VectorNormalize( velDir ); float steeringForce = m_flGroundSpeed * ( 1.0f - fraction ) * normal.Dot( velDir ); if ( steeringForce < 0.0f ) { steeringForce = -steeringForce; } velDir = steeringVector; VectorNormalize( velDir ); steeringVector = steeringForce * velDir; return steeringVector; } #if FEELER_COLLISION_VISUALIZE NDebugOverlay::Line( GetLocalOrigin(), probe, 0, 255, 0, false, 0.1f ); #endif return Vector( 0.0f, 0.0f, 0.0f ); }