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;
}
示例#2
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;
}
示例#3
0
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;
}
示例#5
0
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);
}
示例#7
0
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);
}
示例#10
0
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;
}