/** Localize the ball on the navigation mesh. */ void SoccerWorld::updateBallPosition(int ticks) { if (isRaceOver()) return; if (!ballNotMoving()) { // Only update heading if the ball is moving m_ball_heading = atan2f(m_ball_body->getLinearVelocity().getX(), m_ball_body->getLinearVelocity().getZ()); } if (Track::getCurrentTrack()->hasNavMesh()) { m_ball_track_sector ->update(getBallPosition(), true/*ignore_vertical*/); if (!m_ball_track_sector->isOnRoad() && getPhase() == RACE_PHASE) { m_ball_invalid_timer += ticks; // Reset the ball and karts if out of navmesh after 2 seconds if (m_ball_invalid_timer >= stk_config->time2Ticks(2.0f)) { m_ball_invalid_timer = 0; m_ball->reset(); for (unsigned int i = 0; i < m_karts.size(); i++) moveKartAfterRescue(m_karts[i]); if (UserConfigParams::m_arena_ai_stats) getKart(8)->flyUp(); } } else m_ball_invalid_timer = 0; } } // updateBallPosition
/** Localize the ball on the navigation mesh. */ void SoccerWorld::updateBallPosition(float dt) { if (isRaceOver()) return; if (!ballNotMoving()) { // Only update heading if the ball is moving m_ball_heading = atan2f(m_ball_body->getLinearVelocity().getX(), m_ball_body->getLinearVelocity().getZ()); } if (m_track->hasNavMesh()) { m_ball_on_node = BattleGraph::get()->pointToNode(m_ball_on_node, getBallPosition(), true/*ignore_vertical*/); if (m_ball_on_node == BattleGraph::UNKNOWN_POLY && getPhase() == RACE_PHASE) { m_ball_invalid_timer += dt; // Reset the ball and karts if out of navmesh after 2 seconds if (m_ball_invalid_timer >= 2.0f) { m_ball_invalid_timer = 0.0f; m_ball->reset(); for (unsigned int i = 0; i < m_karts.size(); i++) moveKartAfterRescue(m_karts[i]); if (UserConfigParams::m_arena_ai_stats) getKart(8)->flyUp(); } } else m_ball_invalid_timer = 0.0f; } } // updateBallPosition