From 4e990f34d65d68077110cb04a00c2451c6377b72 Mon Sep 17 00:00:00 2001 From: Jaredl-Dev <260281143+Jaredl-Dev@users.noreply.github.com> Date: Mon, 24 Aug 2026 14:06:17 -0700 Subject: [PATCH] Fix projectile launch orientation at 60Hz --- .../Object/Behavior/DumbProjectileBehavior.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/DumbProjectileBehavior.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/DumbProjectileBehavior.cpp index 72dfd1e705d..854e069db82 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/DumbProjectileBehavior.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/DumbProjectileBehavior.cpp @@ -661,7 +661,18 @@ UpdateSleepTime DumbProjectileBehavior::update() if (m_flightPath.size() >= 2) { prevPos = m_flightPath[0]; +#if defined(GENERALS_ONLINE_HIGH_FPS_SERVER) + // Info: Look one legacy frame ahead so launch orientation matches the retail 30Hz path. + const Int highFpsPathPointCount = (Int)m_flightPath.size(); + const Int legacyPathPointCount = (highFpsPathPointCount + GENERALS_ONLINE_HIGH_FPS_FRAME_MULTIPLIER - 1) + / GENERALS_ONLINE_HIGH_FPS_FRAME_MULTIPLIER; + const Int legacyPathIntervalCount = max(legacyPathPointCount - 1, 1); + const Int orientationStep = (highFpsPathPointCount - 1 + legacyPathIntervalCount / 2) + / legacyPathIntervalCount; + curPos = m_flightPath[orientationStep]; +#else curPos = m_flightPath[1]; +#endif } else {