From c8f2c95ce63274b6b4864103901b242fddeeed83 Mon Sep 17 00:00:00 2001 From: jeefo Date: Mon, 6 May 2019 19:59:50 +0300 Subject: [PATCH] Reworked facing waypoint index detection. (ty to pbmm). --- source/combat.cpp | 3 ++ source/waypoint.cpp | 73 +++++++++++++++++++++++++-------------------- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/source/combat.cpp b/source/combat.cpp index 074bcee..b1fccf9 100644 --- a/source/combat.cpp +++ b/source/combat.cpp @@ -429,6 +429,9 @@ const Vector &Bot::getEnemyBodyOffset (void) { if ((m_visibility & VISIBLE_BODY) && !usesSniper () && distance > (m_difficulty > 2 ? 2000.0f : 1000.0f)) { m_visibility &= ~VISIBLE_HEAD; } + else if (distance < 800.0f && usesSniper ()) { + m_visibility &= ~VISIBLE_HEAD; + } Vector aimPos = m_enemy->v.origin; if (m_difficulty > 2 && !(m_visibility & VISIBLE_OTHER)) { diff --git a/source/waypoint.cpp b/source/waypoint.cpp index c719195..8abcf1d 100644 --- a/source/waypoint.cpp +++ b/source/waypoint.cpp @@ -568,32 +568,36 @@ bool Waypoint::isConnected (int pointA, int pointB) { int Waypoint::getFacingIndex (void) { // this function finds waypoint the user is pointing at. - int pointedIndex = INVALID_WAYPOINT_INDEX; - float viewCone[3] = {0.0f, 0.0f, 0.0f}; + int indexToPoint = INVALID_WAYPOINT_INDEX; + + Array cones; + float maxCone = 0.0f; // find the waypoint the user is pointing at for (int i = 0; i < m_numWaypoints; i++) { - if ((m_paths[i]->origin - g_hostEntity->v.origin).lengthSq () > 250000.0f) { + auto path = m_paths[i]; + + if ((path->origin - g_hostEntity->v.origin).lengthSq () > cr::square (500.0f)) { continue; } - // get the current view cone - viewCone[0] = getShootingConeDeviation (g_hostEntity, m_paths[i]->origin); - Vector bound = m_paths[i]->origin - Vector (0.0f, 0.0f, (m_paths[i]->flags & FLAG_CROUCH) ? 8.0f : 15.0f); + cones.clear (); - // get the current view cone - viewCone[1] = getShootingConeDeviation (g_hostEntity, bound); - bound = m_paths[i]->origin + Vector (0.0f, 0.0f, (m_paths[i]->flags & FLAG_CROUCH) ? 8.0f : 15.0f); - - // get the current view cone - viewCone[2] = getShootingConeDeviation (g_hostEntity, bound); + // get the current view cones + cones.push (getShootingConeDeviation (g_hostEntity, path->origin)); + cones.push (getShootingConeDeviation (g_hostEntity, path->origin - Vector (0.0f, 0.0f, (path->flags & FLAG_CROUCH) ? 6.0f : 12.0f))); + cones.push (getShootingConeDeviation (g_hostEntity, path->origin - Vector (0.0f, 0.0f, (path->flags & FLAG_CROUCH) ? 12.0f : 24.0f))); + cones.push (getShootingConeDeviation (g_hostEntity, path->origin + Vector (0.0f, 0.0f, (path->flags & FLAG_CROUCH) ? 6.0f : 12.0f))); + cones.push (getShootingConeDeviation (g_hostEntity, path->origin + Vector (0.0f, 0.0f, (path->flags & FLAG_CROUCH) ? 12.0f : 24.0f))); // check if we can see it - if (viewCone[0] < 0.998f && viewCone[1] < 0.997f && viewCone[2] < 0.997f) { - continue; + for (auto &cone : cones) { + if (cone > 1.000f && cone > maxCone) { + maxCone = cone; + indexToPoint = i; + } } - pointedIndex = i; } - return pointedIndex; + return indexToPoint; } void Waypoint::pathCreate (char dir) { @@ -1578,7 +1582,7 @@ void Waypoint::frame (void) { } else { nodeColor = Vector (0, 255, 0); - } + } // colorize additional flags Vector nodeFlagColor = Vector (-1, -1, -1); @@ -1596,16 +1600,21 @@ void Waypoint::frame (void) { else if (m_paths[i]->flags & FLAG_CF_ONLY) { nodeFlagColor = Vector (0, 0, 255); } + int nodeWidth = 14; + + if (exists (m_facingAtIndex) && i == m_facingAtIndex) { + nodeWidth *= 2; + } // draw node without additional flags if (nodeFlagColor.x == -1) { - engine.drawLine (g_hostEntity, m_paths[i]->origin - Vector (0, 0, nodeHalfHeight), m_paths[i]->origin + Vector (0, 0, nodeHalfHeight), 15, 0, static_cast (nodeColor.x), static_cast (nodeColor.y), static_cast (nodeColor.z), 250, 0, 10); + engine.drawLine (g_hostEntity, m_paths[i]->origin - Vector (0, 0, nodeHalfHeight), m_paths[i]->origin + Vector (0, 0, nodeHalfHeight), nodeWidth + 1, 0, static_cast (nodeColor.x), static_cast (nodeColor.y), static_cast (nodeColor.z), 250, 0, 10); } // draw node with flags else { - engine.drawLine (g_hostEntity, m_paths[i]->origin - Vector (0, 0, nodeHalfHeight), m_paths[i]->origin - Vector (0, 0, nodeHalfHeight - nodeHeight * 0.75f), 14, 0, static_cast (nodeColor.x), static_cast (nodeColor.y), static_cast (nodeColor.z), 250, 0, 10); // draw basic path - engine.drawLine (g_hostEntity, m_paths[i]->origin - Vector (0, 0, nodeHalfHeight - nodeHeight * 0.75f), m_paths[i]->origin + Vector (0, 0, nodeHalfHeight), 14, 0, static_cast (nodeFlagColor.x), static_cast (nodeFlagColor.y), static_cast (nodeFlagColor.z), 250, 0, 10); // draw additional path + engine.drawLine (g_hostEntity, m_paths[i]->origin - Vector (0, 0, nodeHalfHeight), m_paths[i]->origin - Vector (0, 0, nodeHalfHeight - nodeHeight * 0.75f), nodeWidth, 0, static_cast (nodeColor.x), static_cast (nodeColor.y), static_cast (nodeColor.z), 250, 0, 10); // draw basic path + engine.drawLine (g_hostEntity, m_paths[i]->origin - Vector (0, 0, nodeHalfHeight - nodeHeight * 0.75f), m_paths[i]->origin + Vector (0, 0, nodeHalfHeight), nodeWidth, 0, static_cast (nodeFlagColor.x), static_cast (nodeFlagColor.y), static_cast (nodeFlagColor.z), 250, 0, 10); // draw additional path } m_waypointDisplayTime[i] = engine.timebase (); } @@ -1691,25 +1700,25 @@ void Waypoint::frame (void) { // if radius is nonzero, draw a full circle if (path->radius > 0.0f) { - float squareRoot = cr::sqrtf (path->radius * path->radius * 0.5f); + float sqr = cr::sqrtf (path->radius * path->radius * 0.5f); - engine.drawLine (g_hostEntity, origin + Vector (path->radius, 0.0f, 0.0f), origin + Vector (squareRoot, -squareRoot, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); - engine.drawLine (g_hostEntity, origin + Vector (squareRoot, -squareRoot, 0.0f), origin + Vector (0.0f, -path->radius, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); + engine.drawLine (g_hostEntity, origin + Vector (path->radius, 0.0f, 0.0f), origin + Vector (sqr, -sqr, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); + engine.drawLine (g_hostEntity, origin + Vector (sqr, -sqr, 0.0f), origin + Vector (0.0f, -path->radius, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); - engine.drawLine (g_hostEntity, origin + Vector (0.0f, -path->radius, 0.0f), origin + Vector (-squareRoot, -squareRoot, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); - engine.drawLine (g_hostEntity, origin + Vector (-squareRoot, -squareRoot, 0.0f), origin + Vector (-path->radius, 0.0f, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); + engine.drawLine (g_hostEntity, origin + Vector (0.0f, -path->radius, 0.0f), origin + Vector (-sqr, -sqr, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); + engine.drawLine (g_hostEntity, origin + Vector (-sqr, -sqr, 0.0f), origin + Vector (-path->radius, 0.0f, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); - engine.drawLine (g_hostEntity, origin + Vector (-path->radius, 0.0f, 0.0f), origin + Vector (-squareRoot, squareRoot, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); - engine.drawLine (g_hostEntity, origin + Vector (-squareRoot, squareRoot, 0.0f), origin + Vector (0.0f, path->radius, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); + engine.drawLine (g_hostEntity, origin + Vector (-path->radius, 0.0f, 0.0f), origin + Vector (-sqr, sqr, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); + engine.drawLine (g_hostEntity, origin + Vector (-sqr, sqr, 0.0f), origin + Vector (0.0f, path->radius, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); - engine.drawLine (g_hostEntity, origin + Vector (0.0f, path->radius, 0.0f), origin + Vector (squareRoot, squareRoot, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); - engine.drawLine (g_hostEntity, origin + Vector (squareRoot, squareRoot, 0.0f), origin + Vector (path->radius, 0.0f, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); + engine.drawLine (g_hostEntity, origin + Vector (0.0f, path->radius, 0.0f), origin + Vector (sqr, sqr, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); + engine.drawLine (g_hostEntity, origin + Vector (sqr, sqr, 0.0f), origin + Vector (path->radius, 0.0f, 0.0f), 5, 0, 0, 0, 255, 200, 0, 10); } else { - float squareRoot = cr::sqrtf (32.0f); + float sqr = cr::sqrtf (32.0f); - engine.drawLine (g_hostEntity, origin + Vector (squareRoot, -squareRoot, 0.0f), origin + Vector (-squareRoot, squareRoot, 0.0f), 5, 0, 255, 0, 0, 200, 0, 10); - engine.drawLine (g_hostEntity, origin + Vector (-squareRoot, -squareRoot, 0.0f), origin + Vector (squareRoot, squareRoot, 0.0f), 5, 0, 255, 0, 0, 200, 0, 10); + engine.drawLine (g_hostEntity, origin + Vector (sqr, -sqr, 0.0f), origin + Vector (-sqr, sqr, 0.0f), 5, 0, 255, 0, 0, 200, 0, 10); + engine.drawLine (g_hostEntity, origin + Vector (-sqr, -sqr, 0.0f), origin + Vector (sqr, sqr, 0.0f), 5, 0, 255, 0, 0, 200, 0, 10); } // draw the danger directions