int CLocalNav::StepJumpable(Vector &vecSource, Vector &vecDest, BOOL fNoMonsters, TraceResult &tr) { Vector vecStepStart; Vector vecStepDest; BOOL fFwdTrace; float flFwdFraction; float flJumpHeight; BOOL fJumpClear; flJumpHeight = s_flStepSize + 1; vecStepStart = vecSource; vecStepStart.z += flJumpHeight; fFwdTrace = FALSE; fJumpClear = FALSE; while (vecStepStart.z < 40) { vecStepDest = vecDest; vecStepDest.z = vecStepStart.z; if (!PathClear(vecStepStart, vecStepDest, fNoMonsters, tr)) { if (tr.fStartSolid) return 0; flFwdFraction = (tr.vecEndPos - vecStepStart).Length(); if (flFwdFraction < 1) { flJumpHeight += 10; vecStepStart.z += 10; continue; } } vecStepStart = tr.vecEndPos; vecStepDest = vecStepStart; vecStepDest.z -= s_flStepSize; if (!PathClear(vecStepStart, vecStepDest, fNoMonsters, tr)) { if (tr.fStartSolid) { vecDest = vecStepStart; return 1; } } vecDest = tr.vecEndPos; return 1; } return 0; }
BOOL CLocalNav::StepJumpable(Vector &vecSource, Vector &vecDest, int fNoMonsters, TraceResult &tr) { Vector vecStepStart; Vector vecStepDest; //BOOL fFwdTrace = FALSE; // unused? float flFwdFraction; float flJumpHeight = s_flStepSize + 1.0f; //BOOL fJumpClear = FALSE; // unused? //edict_t *hit = NULL; // unused? vecStepStart = vecSource; vecStepStart.z += flJumpHeight; while (flJumpHeight < 40.0f) { vecStepDest = vecDest; vecStepDest.z = vecStepStart.z; if (!PathClear(vecStepStart, vecStepDest, fNoMonsters, tr)) { if (tr.fStartSolid) break; flFwdFraction = (tr.vecEndPos - vecStepStart).Length2D(); if (flFwdFraction < 1.0f) { flJumpHeight += 10.0f; vecStepStart.z += 10.0f; continue; } } vecStepStart = tr.vecEndPos; vecStepDest = vecStepStart; vecStepDest.z -= s_flStepSize; if (!PathClear(vecStepStart, vecStepDest, fNoMonsters, tr)) { if (tr.fStartSolid) { vecDest = vecStepStart; return TRUE; } } vecDest = tr.vecEndPos; return TRUE; } return FALSE; }
BOOL CLocalNav::StepTraversable(Vector &vecSource, Vector &vecDest, int fNoMonsters, TraceResult &tr) { Vector vecStepStart; Vector vecStepDest; //BOOL fFwdTrace = FALSE; // unused? float flFwdFraction; vecStepStart = vecSource; vecStepDest = vecDest; vecStepStart.z += s_flStepSize; vecStepDest.z = vecStepStart.z; if (!PathClear(vecStepStart, vecStepDest, fNoMonsters, tr)) { if (tr.fStartSolid) return FALSE; flFwdFraction = (tr.vecEndPos - vecStepStart).Length(); if (flFwdFraction < 1.0f) return FALSE; } vecStepStart = tr.vecEndPos; vecStepDest = vecStepStart; vecStepDest.z -= s_flStepSize; if (!PathClear(vecStepStart, vecStepDest, fNoMonsters, tr)) { if (tr.fStartSolid) { vecDest = vecStepStart; return TRUE; } } vecDest = tr.vecEndPos; return TRUE; }
int CLocalNav::SlopeTraversable(Vector &vecSource, Vector &vecDest, BOOL fNoMonsters, TraceResult &tr) { Vector vecSlopeStart; Vector vecSlopeEnd; Vector vecDown; Vector vecAngles; vecSlopeStart = vecSource; vecSlopeEnd = vecDest; vecDown = vecDest - vecSource; vecAngles = UTIL_VecToAngles(tr.vecPlaneNormal); vecSlopeEnd.z = vecDown.Length2D() * tan((90 - vecAngles.x) * (M_PI / 180)) + vecSource.z; if (!PathClear(vecSlopeStart, vecSlopeEnd, fNoMonsters, tr)) { if (tr.fStartSolid) return 0; if ((tr.vecEndPos - vecSlopeStart).Length() < 1) return 0; } vecSlopeStart = tr.vecEndPos; vecSlopeEnd = vecSlopeStart; vecSlopeEnd.z -= s_flStepSize; if (!PathClear(vecSlopeStart, vecSlopeEnd, fNoMonsters, tr)) { if (tr.fStartSolid) { vecDest = vecSlopeStart; return 1; } } vecDest = tr.vecEndPos; return 1; }
BOOL CLocalNav::SlopeTraversable(Vector &vecSource, Vector &vecDest, int fNoMonsters, TraceResult &tr) { Vector vecSlopeEnd; Vector vecDown; Vector vecAngles; vecSlopeEnd = vecDest; vecDown = vecDest - vecSource; vecAngles = UTIL_VecToAngles(tr.vecPlaneNormal); vecSlopeEnd.z = vecDown.Length2D() * Q_tan(float_precision((90.0 - vecAngles.x) * (M_PI / 180))) + vecSource.z; if (!PathClear(vecSource, vecSlopeEnd, fNoMonsters, tr)) { if (tr.fStartSolid) return FALSE; if ((tr.vecEndPos - vecSource).Length2D() < 1.0f) return FALSE; } vecSlopeEnd = tr.vecEndPos; vecDown = vecSlopeEnd; vecDown.z -= s_flStepSize; if (!PathClear(vecSlopeEnd, vecDown, fNoMonsters, tr)) { if (tr.fStartSolid) { vecDest = vecSlopeEnd; return TRUE; } } vecDest = tr.vecEndPos; return TRUE; }
int CLocalNav::LadderTraversable(Vector &vecSource, Vector &vecDest, BOOL fNoMonsters, TraceResult &tr) { Vector vecStepStart; Vector vecStepDest; vecStepStart = tr.vecEndPos; vecStepDest = vecStepStart; vecStepDest.z += HOSTAGE_STEPSIZE; if (!PathClear(vecStepStart, vecStepDest, fNoMonsters, tr)) { if (tr.fStartSolid) return 0; if ((tr.vecEndPos - vecStepStart).Length() < 1) return 0; } vecStepStart = tr.vecEndPos; vecDest.z = tr.vecEndPos.z; return PathTraversable(vecStepStart, vecDest, fNoMonsters); }
void CheckLists (TowerList *TL, UnitList *UL, UnitList *SQ, PathList *PL, FunctionQueue *FQ) { if (!TowerEmpty(TL)) { TowerClear(TL); } if (!UnitEmpty(UL)) { UnitClear(UL); } if (!UnitEmpty(SQ)) { UnitClear(SQ); } if (!PathEmpty(PL)) { PathClear(PL); } if (!FunctionEmpty(FQ)) { FunctionClear(FQ); } }
int CLocalNav::PathTraversable(Vector &vecSource, Vector &vecDest, BOOL fNoMonsters) { TraceResult tr; Vector vecSrcTmp; Vector vecDestTmp; Vector vecDir; Vector vecTmp; float flTotal; int retval; retval = TRAVERSABLE_NO; vecSrcTmp = vecSource; vecDestTmp = vecDest - vecSource; vecDir = vecDestTmp.Normalize(); vecDir.z = 0; flTotal = vecDestTmp.Length2D(); while (flTotal > 1) { if (flTotal >= s_flStepSize) vecDestTmp = vecSrcTmp + (vecDir * s_flStepSize); else vecDestTmp = vecDest; m_fTargetEntHit = FALSE; if (PathClear(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) { vecDestTmp = tr.vecEndPos; if (retval == TRAVERSABLE_NO) retval = TRAVERSABLE_SLOPE; } else { if (tr.fStartSolid) return TRAVERSABLE_NO; if (tr.pHit && !fNoMonsters && !FStringNull(tr.pHit->v.classname) && FClassnameIs(tr.pHit, "hostage_entity")) return TRAVERSABLE_NO; vecSrcTmp = tr.vecEndPos; if (tr.vecPlaneNormal.z > 0.7) { if (SlopeTraversable(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) { if (retval == TRAVERSABLE_NO) retval = TRAVERSABLE_SLOPE; } else return TRAVERSABLE_NO; } else { if (StepTraversable(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) { if (retval == TRAVERSABLE_NO) retval = TRAVERSABLE_STEP; } else if (StepJumpable(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) { if (retval == TRAVERSABLE_NO) retval = TRAVERSABLE_STEPJUMPABLE; } else return TRAVERSABLE_NO; } } vecTmp = vecDestTmp - Vector(0, 0, 300); if (PathClear(vecDestTmp, vecTmp, fNoMonsters, tr)) return TRAVERSABLE_NO; if (!tr.fStartSolid) vecDestTmp = tr.vecEndPos; vecSrcTmp = vecDestTmp; if (!m_fTargetEntHit) flTotal = (vecDest - vecDestTmp).Length2D(); else flTotal = 0; } vecDest = vecDestTmp; return retval; }
int CLocalNav::PathClear(Vector &vecSource, Vector &vecDest, BOOL fNoMonsters) { TraceResult tr; return PathClear(vecSource, vecDest, fNoMonsters, tr); }
int CLocalNav::PathTraversable(Vector &vecSource, Vector &vecDest, int fNoMonsters) { TraceResult tr; Vector vecSrcTmp; Vector vecDestTmp; Vector vecDir; float_precision flTotal; int retval = PATH_TRAVERSABLE_EMPTY; vecSrcTmp = vecSource; vecDestTmp = vecDest - vecSource; vecDir = vecDestTmp.NormalizePrecision(); vecDir.z = 0; flTotal = vecDestTmp.Length2D(); while (flTotal > 1.0f) { if (flTotal >= s_flStepSize) { #ifndef PLAY_GAMEDLL vecDestTmp = vecSrcTmp + (vecDir * s_flStepSize); #else // TODO: fix test demo vecDestTmp[0] = vecSrcTmp[0] + (vecDir[0] * s_flStepSize); vecDestTmp[1] = vecSrcTmp[1] + float(vecDir[1] * s_flStepSize); vecDestTmp[2] = vecSrcTmp[2] + (vecDir[2] * s_flStepSize); #endif } else vecDestTmp = vecDest; m_fTargetEntHit = FALSE; if (PathClear(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) { vecDestTmp = tr.vecEndPos; if (retval == PATH_TRAVERSABLE_EMPTY) { retval = PATH_TRAVERSABLE_SLOPE; } } else { if (tr.fStartSolid) { return PATH_TRAVERSABLE_EMPTY; } if (tr.pHit && !fNoMonsters && tr.pHit->v.classname) { if (FClassnameIs(tr.pHit, "hostage_entity")) { return PATH_TRAVERSABLE_EMPTY; } } vecSrcTmp = tr.vecEndPos; if (tr.vecPlaneNormal.z <= MaxUnitZSlope) { if (StepTraversable(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) { if (retval == PATH_TRAVERSABLE_EMPTY) { retval = PATH_TRAVERSABLE_STEP; } } else { if (!StepJumpable(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) { return PATH_TRAVERSABLE_EMPTY; } if (retval == PATH_TRAVERSABLE_EMPTY) { retval = PATH_TRAVERSABLE_STEPJUMPABLE; } } } else { if (!SlopeTraversable(vecSrcTmp, vecDestTmp, fNoMonsters, tr)) { return PATH_TRAVERSABLE_EMPTY; } if (retval == PATH_TRAVERSABLE_EMPTY) { retval = PATH_TRAVERSABLE_SLOPE; } } } Vector vecDropDest = vecDestTmp - Vector(0, 0, 300); if (PathClear(vecDestTmp, vecDropDest, fNoMonsters, tr)) { return PATH_TRAVERSABLE_EMPTY; } if (!tr.fStartSolid) vecDestTmp = tr.vecEndPos; vecSrcTmp = vecDestTmp; BOOL fProgressThisTime = m_fTargetEntHit; Vector vecSrcThisTime = vecDest - vecDestTmp; if (fProgressThisTime) break; flTotal = vecSrcThisTime.Length2D(); } vecDest = vecDestTmp; return retval; }