[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-76388":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":16,"starSnapshotCount":16,"syncStatus":29,"lastSyncTime":30,"discoverSource":31},76388,"Forza-Horizon-DualSense-Python","HamzaYslmn\u002FForza-Horizon-DualSense-Python","HamzaYslmn","Forza Horizon DualSense Adaptive Triggers","",null,"Python",347,21,46,4,0,13,32,286,39,4.03,"GNU Affero General Public License v3.0",false,"main",[],"2026-06-12 02:03:41","\u003Cdiv align=\"center\">\n  \u003Ch1>🏎️ Forza Horizon — DualSense Adaptive Triggers\u003C\u002Fh1>\n  \u003Cp>\u003Cstrong>Real trigger feedback for Forza Horizon on PC.\u003C\u002Fstrong>\u003C\u002Fp>\n  \u003Cp>\u003Cem>Feel the brakes. Feel the engine. No setup juggling.\u003C\u002Fem>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n> My Steam profile: \u003Chttps:\u002F\u002Fsteamcommunity.com\u002Fid\u002Fteccno\u002F>\n> \n> For CS:GO item Sponsorship :D : \u003Chttps:\u002F\u002Fsteamcommunity.com\u002Ftradeoffer\u002Fnew\u002F?partner=291638630&token=Xyg4vITU>\n\n\u003Cdiv align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=-3Cp0PfL52Y\">\n    \u003Cimg src=\"img\u002Ftuiyoutube.png\" alt=\"Forza Horizon DualSense Adaptive Trigger Mod\" style=\"width:100%;\">\n  \u003C\u002Fa>\n\u003C\u002Fdiv>\n\n> 💛 Huge thanks to **[Jared (jmac122)](https:\u002F\u002Fgithub.com\u002Fjmac122)** for sponsoring this project by gifting me Forza Horizon 6.\n\n---\n\n## 📜 Contents\n1. [What it does](#-what-it-does)\n2. [Install](#-install)\n3. [In-game setup](#-in-game-setup)\n4. [Enable Steam Haptics](#-enable-steam-haptics)\n5. [Run it](#-run-it)\n6. [Auto-launch with Steam](#-auto-launch-with-steam)\n7. [Tuning the feel](#-tuning-the-feel)\n8. [Troubleshooting](#-troubleshooting)\n9. [Credits](#-credits)\n\n\n\n---\n\n## 💡 What it does\n\nForza Horizon sends car telemetry over UDP, but Steam Input doesn't use the DualSense's **adaptive triggers**. This tiny app fills the gap:\n\n- **Left trigger (brake)** — pushes back harder the more you press. Buzzes like ABS when tires slip. Extra resistance when handbraking.\n- **Right trigger (throttle)** — soft progressive resistance. Thumps on gear shifts. Buzzes at the rev limiter.\n\n### How it talks to your controller without fighting Steam\n\n```\n┌──────────────────┐    UDP 5300     ┌──────────────────┐    HID write    ┌─────────────┐\n│  Forza Horizon   │ ──────────────► │  This app        │ ──────────────► │  DualSense  │\n│  (Data Out)      │  telemetry      │  (trigger bits   │  triggers only  │  controller │\n└──────────────────┘  324 bytes      │   only)          │                 └─────────────┘\n                                     └──────────────────┘                        ▲\n                                                                                 │\n                                     ┌──────────────────┐    HID write           │\n                                     │  Steam Input     │ ──────────────────────►│\n                                     │  (rumble bits)   │  rumble + buttons      │\n                                     └──────────────────┘\n```\n\nBoth the app and Steam write to the same controller — but they touch **different bytes**:\n\n- Steam owns the **rumble motors** and button mapping.\n- This app only flips the **adaptive trigger** bits (`valid_flag0` bits `0x04` and `0x08`).\n- The HID device is opened in **non-blocking mode**, so writes fire immediately instead of waiting on the controller. Nothing gets queued, nothing blocks Steam.\n\nThat's why you can run both at the same time and neither one breaks the other.\n\n---\n\n## 🛠️ Install\n\n**You need:** Windows 10\u002F11 or Linux, and a DualSense controller (USB or Bluetooth).\n\n1. Go to the [latest release](https:\u002F\u002Fgithub.com\u002FHamzaYslmn\u002FForza-Horizon-DualSense-Python\u002Freleases\u002Flatest).\n2. Download **`win_start.bat`** (Windows) or **`linux_start.sh`** (Linux).\n3. Put it in any empty folder.\n4. **Important:** We highly recommend installing **`uv`** manually first. Open PowerShell and run this command:\n   ```powershell\n   powershell -ExecutionPolicy ByPass -c \"irm https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.ps1 | iex\"\n   ```\n   - If you skip this, `win_start.bat` will try to install `uv` automatically. However, Windows might block this auto-install with an \"Execution Policy\" error in PowerShell.\n   - **If you get the Execution Policy error:** Hold **Shift + Right-Click** in the folder, click **\"Open PowerShell window here\"**, paste `Set-ExecutionPolicy RemoteSigned -scope CurrentUser` and hit Enter, then type `Y` and Enter.\n5. Double-click `win_start.bat` (or `linux_start.sh`).\n\nThe launcher handles downloading the app, preparing the environment, and running it. Next time you run it, it will also check for updates.\n\n> **Linux extras:** install `libhidapi` (`sudo apt install libhidapi-hidraw0` \u002F `sudo pacman -S hidapi` \u002F `sudo dnf install hidapi`) and the udev rule from `app\u002Fpackaging\u002Flinux\u002F70-dualsense.rules`. Then unplug\u002Freplug the controller once.\n\n### 🎮 Playing with DS4Windows (Xbox App \u002F Windows Store users)\n\nIf you are playing the game via the Xbox App or Microsoft Store, you will need **DS4Windows** for the game to recognize your controller as an Xbox controller. \n\nBecause DS4Windows uses **HidHide**, it can hide the DualSense controller from this app and prevent a successful connection. To avoid this, **you must start the programs in this exact order**:\n\n1. **First, launch THIS APP** (`win_start.bat`) and wait for the short pulse on the triggers.\n2. **Second, launch DS4Windows.**\n3. **Finally, launch Forza Horizon.**\n\n*(Note: If your controller disconnects while playing, you will have to close DS4Windows, restart this app, and then open DS4Windows again. **If you want the app to reconnect automatically upon controller disconnection, you must keep the \"Hide DS4 Controller\" setting OFF in DS4Windows.**)*\n\n\u003Cdetails>\n\u003Csummary>Manual install (for developers)\u003C\u002Fsummary>\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FHamzaYslmn\u002FForza-Horizon-DualSense-Python\ncd Forza-Horizon-DualSense-Python\u002Fsrc\nuv sync\nuv run main.py\n```\n\nNeed `uv`? `pip install uv` or [astral.sh\u002Fuv](https:\u002F\u002Fastral.sh\u002Fuv\u002F).\n\u003C\u002Fdetails>\n\n---\n\n## 🎯 In-game setup\n\nIn Forza Horizon, open **Settings → HUD and Gameplay** and scroll to the bottom:\n\n| Setting | Value |\n|---------|-------|\n| Data Out | **ON** |\n| Data Out IP Address | **127.0.0.1** |\n| Data Out IP Port | **5300** |\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"img\u002Fen.png\" alt=\"English Settings\" width=\"48%\" style=\"border-radius: 8px;\">\n  &nbsp;\n  \u003Cimg src=\"img\u002Ftr.png\" alt=\"Turkish Settings\" width=\"48%\" style=\"border-radius: 8px;\">\n\u003C\u002Fp>\n\n---\n\n## 🔊 Enable Steam Haptics\n\n**Steam** can vibrate the left and right rumble motors on your DualSense controller. To enable them:\n\n### In Steam:\n1. Right-click **Forza Horizon** in your library → **Properties**.\n2. Go to **Controller → Additional Settings**.\n3. Make sure **DualSense vibration** is turned **ON**.\n\n### In-game (Forza Horizon):\n1. Open **Settings → Advanced Controls**.\n2. Find the **Vibration** option and enable it.\n\n### DualSense software:\nFor best results, install the official **PlayStation® Accessories** software:\n- Download: [PlayStation® Accessories](https:\u002F\u002Ffwupdater.dl.playstation.net\u002Ffwupdater\u002FPlayStationAccessoriesInstaller.exe)\n\nThis ensures your DualSense firmware is up to date for windows.\n\n> ℹ️ **About Adaptive Triggers:** Steam doesn't support DualSense adaptive triggers for this game. That's what **this app** does — it adds realistic trigger feedback (brake resistance, engine feedback, ABS pulses, gear thumps, rev limiter buzz) on top of the rumble that Steam provides.\n\n---\n\n## ▶️ Run it\n\nDouble-click **`win_start.bat`** (Windows) or **`linux_start.sh`** (Linux).\n\nYou'll feel a short pulse on both triggers — that means it's working. Now launch Forza Horizon and drive.\n\n> Start the launcher **before** Forza Horizon. If you use HidHide, allowlist `python.exe`.\n\n---\n\n## 🎮 Auto-launch with Steam\n\nWant the triggers to turn on automatically when you press **Play**? Tell Steam to run the launcher first.\n> ⚠️ **Warning:** Sometimes auto-launching this way can cause issues with the application. For the most stable experience, it is recommended to launch the app manually by double-clicking the script.\n\n1. In Steam, right-click **Forza Horizon** → **Properties**.\n2. Open the **General** tab and find **Launch Options**.\n3. Choose one of the following commands based on your preference (change the path to where your `win_start.bat` actually is):\n\n   * **Option A: Keeping Steam Overlay & Playtime Tracking (Recommended)**\n     This wraps the script in `cmd.exe \u002Fc` so Steam can properly monitor the process, keeping your **Steam Overlay (Shift+Tab)** and **Playtime Tracking** fully functional while automatically closing the console window afterwards:\n     ```text\n     \"C:\\Windows\\System32\\cmd.exe\" \u002Fc \"\"C:\\Your\\Path\\To\\Forza-Horizon-DualSense-Python\\win_start.bat\" %command%\"\n     ```\n\n   * **Option B: Simpler Method**\n     A direct way to launch, though the Steam Overlay and playtime tracking may stop working:\n     ```text\n     \"C:\\Your\\Path\\To\\Forza-Horizon-DualSense-Python\\win_start.bat\" %command%\n     ```\n\nThat's it. Press **Play** — the launcher runs, then the game opens.\n\n![Steam launch options](img\u002Fsteaming.png)\n\n\u003Cdetails>\n\u003Csummary>Advanced — run the Python script directly (no BAT file)\u003C\u002Fsummary>\n\nIf you cloned the repo and use `uv`, paste this into **Launch Options** instead:\n\n```text\ncmd \u002Fc \"start \u002FMIN \u002FD C:\\Your\\Path\\To\\Forza-Horizon-DualSense-Python\\src uv run main.py\" && %command%\n```\n\u003C\u002Fdetails>\n\n---\n\n## 🎚️ Tuning the feel\n\nEvery effect (brake force, ABS buzz, gear thump, rev limiter, etc.) can be tweaked or turned off from the **Settings page in the app** — no file editing needed. Changes apply on next launch.\n\n> ⚠️ The rev limiter fires based on `rpm \u002F max_rpm`, not a fixed RPM. Different cars hit redline at different ratios, so it may need per-car tweaking.\n\n---\n\n## 🩺 Troubleshooting\n\n| Symptom | Fix |\n|---------|-----|\n| `DualSense gamepad interface not found` | Controller not connected, or HidHide is hiding it — allowlist `python.exe`. |\n| `No UDP packets yet` | Forza's Data Out is off, IP\u002Fport is wrong, or Windows Firewall is blocking. |\n| Windows Defender \u002F SmartScreen blocks `win_start.bat` | 1. On the blue \"Windows protected your PC\" screen, click **\"More info\"**.\u003Cbr>2. Click the **\"Run anyway\"** button that appears at the bottom. (The script only downloads required dependencies.) |\n| Triggers feel weak | Raise `brake_max_force` \u002F `throttle_max_force`, or lower the matching `curve`. |\n| Triggers feel like a brick wall | Lower `brake_max_force` \u002F `throttle_max_force`, or raise the matching `curve`. |\n| Triggers feel stiff at a light press | Lower the baseline force, or raise the `curve`. |\n| No vibration on gear shift | Car must be moving faster than 3 km\u002Fh and changing between valid gears. |\n| Console window is blank after the startup pulse | Run from a terminal with `cd src && uv run main.py --headless` to skip the TUI. |\n\n---\n\n## 📁 Project layout\n\n```\nsrc\u002F\n├── main.py                          # Entry point\n└── modules\u002F\n    ├── settings.py                  # 👈 the file you edit\n    ├── dualsense\u002F\n    │   ├── main.py                  # HID layer\n    │   └── triggers.py              # Effect logic\n    └── udplistener\u002F\n        └── main.py                  # UDP parser\n```\n\n---\n\n## 🙏 Credits\n\nBuilt by **[HamzaYslmn](https:\u002F\u002Fgithub.com\u002FHamzaYslmn)**.\n\n### 💛 Sponsors\n\n- **[Jared (jmac122)](https:\u002F\u002Fgithub.com\u002Fjmac122)** — gifted me Forza Horizon 6 so this project could keep moving forward. Thank you, Jared!\n\n- **[BeaudinSan](https:\u002F\u002Fgithub.com\u002FBeaudinSan)** — thank you for your incredibly generous support! It truly means a lot to me. \n\n- **[BambinoPinguino](https:\u002F\u002Fgithub.com\u002FBambinoPinguino)** — thank you for your Tea!\n\n- **[Ereldun](https:\u002F\u002Fsteamcommunity.com\u002F)** — thank you for your Coffee!\n\n---\n*Built for an immersive racing experience*\n","Forza Horizon DualSense Adaptive Triggers 是一个为PC版《极限竞速：地平线》提供真实扳机反馈的Python项目。它通过UDP协议接收游戏中的车辆遥测数据，并将这些数据转化为DualSense手柄自适应扳机的反馈，从而让玩家在刹车和加速时体验到真实的阻力和震动效果。项目巧妙地与Steam输入系统共存，确保两者不会相互干扰。适合那些希望在PC上使用DualSense手柄游玩《极限竞速：地平线》并追求更沉浸式驾驶体验的玩家。",2,"2026-06-11 03:55:00","CREATED_QUERY"]