BOOL CLocalNav::PathClear(Vector &vecOrigin, Vector &vecDest, int fNoMonsters, TraceResult &tr) { TRACE_MONSTER_HULL(m_pOwner->edict(), vecOrigin, vecDest, fNoMonsters, m_pOwner->edict(), &tr); if (tr.fStartSolid) return FALSE; if (tr.flFraction == 1.0f) return TRUE; if (tr.pHit == m_pTargetEnt) { m_fTargetEntHit = TRUE; return TRUE; } return FALSE; }
int CLocalNav::PathClear(Vector &vecSource, Vector &vecDest, BOOL fNoMonsters, TraceResult &tr) { TRACE_MONSTER_HULL(m_pOwner->edict(), vecSource, vecDest, fNoMonsters, m_pOwner->edict(), &tr); if (tr.fStartSolid) return 0; if (tr.flFraction == 1) return 1; if (tr.pHit == m_pTargetEnt) { #ifdef _DEBUG CONSOLE_ECHO("target edict hit!\n"); #endif m_fTargetEntHit = TRUE; return 1; } return 0; }
Vector CIchthyosaur::DoProbe(const Vector &Probe) { Vector WallNormal = Vector(0,0,-1); // WATER normal is Straight Down for fish. float frac; BOOL bBumpedSomething = ProbeZ(pev->origin, Probe, &frac); TraceResult tr; TRACE_MONSTER_HULL(edict(), pev->origin, Probe, dont_ignore_monsters, edict(), &tr); if ( tr.fAllSolid || tr.flFraction < 0.99 ) { if (tr.flFraction < 0.0) tr.flFraction = 0.0; if (tr.flFraction > 1.0) tr.flFraction = 1.0; if (tr.flFraction < frac) { frac = tr.flFraction; bBumpedSomething = TRUE; WallNormal = tr.vecPlaneNormal; } } if (bBumpedSomething && (m_hEnemy == NULL || tr.pHit != m_hEnemy->edict())) { Vector ProbeDir = Probe - pev->origin; Vector NormalToProbeAndWallNormal = CrossProduct(ProbeDir, WallNormal); Vector SteeringVector = CrossProduct( NormalToProbeAndWallNormal, ProbeDir); float SteeringForce = m_flightSpeed * (1-frac) * (DotProduct(WallNormal.Normalize(), m_SaveVelocity.Normalize())); if (SteeringForce < 0.0) { SteeringForce = -SteeringForce; } SteeringVector = SteeringForce * SteeringVector.Normalize(); return SteeringVector; } return Vector(0, 0, 0); }
void CHostage::PreThink(void) { Vector vecSrc; Vector vecDest; TraceResult tr; float flOrigDist; float flRaisedDist; if (m_improv) return; if (!FBitSet(pev->flags, FL_ONGROUND)) return; if (pev->velocity.Length2D() < 1) return; vecSrc = pev->origin; vecDest = vecSrc + pev->velocity * gpGlobals->frametime; vecDest.z = vecSrc.z; TRACE_MONSTER_HULL(edict(), vecSrc, vecDest, dont_ignore_monsters, edict(), &tr); if (tr.fStartSolid) return; if (tr.flFraction == 1) return; if (tr.vecPlaneNormal.z > 0.7) return; flOrigDist = (tr.vecEndPos - pev->origin).Length2D(); vecSrc.z += m_LocalNav->s_flStepSize; vecDest = vecSrc + (pev->velocity.Normalize() * 0.1); vecDest.z = vecSrc.z; TRACE_MONSTER_HULL(edict(), vecSrc, vecDest, dont_ignore_monsters, edict(), &tr); if (tr.fStartSolid) return; vecSrc = tr.vecEndPos; vecDest = tr.vecEndPos; vecDest.z -= m_LocalNav->s_flStepSize; TRACE_MONSTER_HULL(edict(), vecSrc, vecDest, dont_ignore_monsters, edict(), &tr); if (tr.vecPlaneNormal.z < 0.7) return; flRaisedDist = (tr.vecEndPos - pev->origin).Length2D(); if (flRaisedDist > flOrigDist) { Vector vecOrigin = pev->origin; vecOrigin.z = tr.vecEndPos.z; UTIL_SetOrigin(pev, vecOrigin); pev->velocity.z += pev->gravity * g_psv_gravity->value * gpGlobals->frametime; } }