From 1649f91318f2d4898d80bc494600274bdbd2a5cf Mon Sep 17 00:00:00 2001 From: AskaEth Date: Sat, 25 Jul 2026 16:19:53 +0800 Subject: [PATCH] fix: correct Forza FH5/FH6 UDP packet parser offsets per official spec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Speed: offset 256 (m/s * 3.6 = km/h), was incorrectly at 244 (PositionX) - Gear: offset 319 (U8), was at 264/298 - Throttle/Brake: offsets 315/316 (U8, 0-255) - Steering: offset 320 (S8, -127~127) - RPM: offset 16 ✓, MaxRPM: offset 8 ✓ - Lap times: BestLap=296, LastLap=300, CurrentLap=304 - LapNumber: offset 312 (U16) - Boost: 284, Fuel: 288, Position: 244/248/252 - Updated all Forza parsers (FH4, FH5) and fallback parser - Ref: Forza Data Out official format (324 bytes) --- games/builtin/forza_horizon_4/parser.py | 55 ++++++++-------- games/builtin/forza_horizon_5/parser.py | 84 ++++++++++++++++--------- server/telemetry/parsers/__init__.py | 63 ++++++++----------- 3 files changed, 109 insertions(+), 93 deletions(-) diff --git a/games/builtin/forza_horizon_4/parser.py b/games/builtin/forza_horizon_4/parser.py index c12e76a..fa1652a 100644 --- a/games/builtin/forza_horizon_4/parser.py +++ b/games/builtin/forza_horizon_4/parser.py @@ -15,37 +15,36 @@ class ForzaHorizon4Parser: td = TelemetryData(game_id="forza_horizon_4", timestamp=time.time()) td.raw = {"raw_hex": data.hex(), "length": len(data), "addr": f"{addr[0]}:{addr[1]}"} - if len(data) < 323: + if len(data) < 312: return td try: - offset = 12 - td.rpm = struct.unpack_from(" TelemetryData: td = TelemetryData(game_id="forza_horizon_5", timestamp=time.time()) - td.raw = {"raw_hex": data.hex(), "length": len(data), "addr": f"{addr[0]}:{addr[1]}"} + td.raw = { + "raw_hex": data.hex(), + "length": len(data), + "addr": f"{addr[0]}:{addr[1]}", + } - if len(data) < 323: + if len(data) < 312: return td try: - td.rpm = struct.unpack_from("