Mods / GamepadCompanionVS
- Tags:
- Author:
- ElSublimePeluca
- Side:
- Client
- Created:
- May 11th at 12:13 AM
- Last modified:
- 5 days ago
- Downloads:
- 748
-
Recommended download (for Vintage Story 1.4.4-dev.2 - 1.22.6):
gamepadcompanion-1.9.0.zip 1-click install
Full native gamepad support for Vintage Story 1.22+, designed as a client-side mod. No Steam Input, AntiMicro, or external key mappers required — the mod reads the gamepad directly via GLFW and integrates with VS hotkeys, dialogs, and inventory UIs.
> **Language**: the in-game UI is localized in **English** and **Spanish** (Latin American and European), following your VS client language, with English as fallback for everything else. Want it in your language? PRs are welcome at the GitHub repo — it's just one JSON file in `assets/gamepadcompanion/lang/`, no code changes needed.
## Features
- **Movement and camera** via sticks, with configurable sensitivity (horizontal/vertical), dead zone, and pitch inversion.
- **12-slot radial menu** (LB + right stick). Defaults to Character, Chat, Handbook, Settings, and Virtual Keyboard; the remaining slots are assignable from the in-game dialog.
- **Contextual button mapping**: B closes the open dialog or drops the active item depending on context; A jumps; X/Y/Back/Start mapped to tool mode, inventory, map, and pause menu.
- **Virtual cursor over GUIs**: when a modal dialog is open, a yellow cursor appears. Hold RB for smooth right-stick movement; DPad without RB steps it slot-by-slot for fast inventory navigation. RT/LT click left/right.
- **World map zoom with the D-Pad**: with the fullscreen map open, D-Pad ↑/↓ zooms in/out (one mouse-wheel notch per press) while ←/→ keeps moving the cursor for clicking waypoints.
- **Ctrl and Shift toggles** via L3/R3 with a HUD indicator in the top-right corner. Enables shift-click in inventory, ctrl-click placement, etc.
- **Precision mode** (DPad Up) reduces camera sensitivity by a configurable factor for aiming at specific blocks.
- **Composite actions**: a single radial slot can execute several actions in sequence.
- **Per-key injection** (`KeyPressAction`): bind any keyboard key to a slot or gamepad button — useful for hotkeys not in the vanilla list.
- **On-screen virtual keyboard** for typing commands and chat with the gamepad. QWERTY + `/` and `.` for slash commands.
- **In-game editor** (`/gpconfig` or `Insert` by default): three tabs (Wheel, Buttons, Sensitivity) with automatic JSON persistence to `ModConfig/gamepadcompanion.json`.
- **Localized UI** (English/Spanish): dialogs, pickers, HUD indicators, and radial labels follow the game language — including labels of already-saved bindings.
## Compatibility
| Platform | Status |
|----------|--------|
| Linux | ✅ Thoroughly tested (CachyOS X11 + GameSir Cyclone 2) |
| Windows | ✅ Verified by user reports (XInput controllers: Xbox 360, 8BitDo Ultimate 2C) |
| macOS | ⚠️ Untested — cross-platform stack (GLFW / OpenTK / VS API), should work in theory |
The mod bypasses GLFW's SDL gamepad-mapping database and reads the joystick raw, auto-detecting one of five layouts on first poll (check the client log for `detected ... layout`):
| Controller | Status |
|------------|--------|
| Xbox 360 / One / Series (Linux and Windows) | ✅ xpad / WinXInput layouts |
| GameSir Cyclone 2 (Xbox and PS4 modes) | ✅ Thoroughly tested |
| 8BitDo, generic XInput-compatible | ✅ Same XInput layouts |
| Generic PS4-like DirectInput (Wired Controller, etc.) | ✅ Auto-detected by signed-trigger signature |
| X-D GamePad / SHANWAN PS3-DInput mode | ✅ Experimental — button map inferred, report issues |
| DualSense / DualShock 4 (official) | ⚠️ Driver-dependent — some firmwares match a heuristic, others need xpad emulation |
| Switch Pro | ⚠️ Depends on driver mode |
| Other non-xpad joysticks | ❌ Unknown layout, mappings will be off |
If your controller is not recognized, the `/gpaxes` command dumps raw axes to help diagnose.
## Steam Input
If you launch Vintage Story through Steam, **disable Steam Input for this game** — otherwise you'll get double input (Steam sends synthetic keyboard/mouse + the mod reads the gamepad raw → camera at double speed, duplicated clicks).
Steam → right-click Vintage Story → Properties → Controller → "Disable Steam Input". The rest of Steam (overlay, friends, playtime, screenshots) keeps working — only the gamepad remapping layer is turned off.
If your controller only shows up as a gamepad when Steam Input emulates it (typical for DualSense / DualShock 4 / Switch Pro), either use Steam Input in plain "Gamepad / X360 passthrough" mode (no kb/m remapping — the mod reads the virtual Xbox controller fine), or use an alternative driver (DS4Windows on Windows, `hid-playstation` on Linux) and disable Steam Input entirely.
This mod is essentially an alternative to Steam Input *specific to VS*, with knowledge of vanilla hotkeys and dialogs that a generic mapper cannot have. Use one or the other, not both.
## How it works internally (disclaimer)
To make vanilla GUIs react to the gamepad without per-dialog patches, the mod injects synthetic mouse and keyboard events into the VS engine: it writes `ClientMain.MouseCurrentX/Y`, calls `OnMouseDown` / `OnKeyDown` / `OnKeyPress` directly, and writes Ctrl/Shift state into `KeyboardState[]`. This is the legitimate VS modding API, but worth disclosing — the mod has access to the client input stack and generates events the game treats as if they came from the user. Nothing is sent over the network; no files are touched outside `ModConfig/gamepadcompanion.json`; no `unsafe` blocks. If that pattern makes you uncomfortable, don't install it.
| Mod Version | Mod Identifier | For Game version | Downloads | Released | Changelog | Download | 1-click mod install* |
|---|---|---|---|---|---|---|---|
| 1.9.0 | gamepadcompanion | 46 | 5 days ago | gamepadcompanion-1.9.0.zip | 1-click install | ||
|
GamepadCompanion v1.9.0 Compatibility - Hydrate or Diedrate now works with the gamepad. Reported by pngwn: Ctrl + Vintage Story keeps a layer of input state that this mod had never touched. Gamepad input is now mirrored into that layer: the triggers report their Two notes for the water case specifically. Drinking takes a full second of - Hotkeys that other mods bind to a mouse button now also answer correctly when Reliability All of the above is state that nothing in the game ever resets — it outlives - Everything this mod injects is now recomputed from scratch every frame, and - Leaving the world (escape menu, death screen, kick, lost connection) now - Unplugging the controller — or its battery dying — while a trigger was held Fixes - The settings window highlighted the wrong tab: choosing Sensitivity showed - The "choose action" list could end up drawn outside its own window, floating - The Sensitivity tab has a "Restore defaults" button, like the Wheel tab. | |||||||
| 1.8.1 | gamepadcompanion | 53 | Aug 2nd at 7:32 PM | gamepadcompanion-1.8.1.zip | 1-click install | ||
|
GamepadCompanion v1.8.1 Fixes - RKN Crafting now works with the hold-key binding added in 1.8.0. Reported by The cause was mine, not RKN's. Vintage Story binds "Lock/Unlock Mouse Cursor" The repair routine now leaves a key alone when something owns it: either a - Holding a modifier and pulling a trigger on the same frame no longer drops the - Assigning a bare modifier (Alt, Ctrl, Shift) always creates a hold binding Notes - While you hold Alt, the right stick will not turn the camera and the mouse Other - The two key rows in the action picker now describe what they do instead of | |||||||
| 1.8.0 | gamepadcompanion | 32 | Jul 28th at 10:55 PM | gamepadcompanion-1.8.0.zip | 1-click install | ||
|
Fixes - The "left trigger curse" is fixed for real this time — and the actual cause What was happening: Vintage Story keeps an internal flag while you interact Gamepad triggers now go through the engine's own click routine — the exact - Same fix resolves the CombatOverhaul auto-swing: weapons no longer keep New - Button bindings can now HOLD a key down. Pick "[Assign a key to hold down...]" - Modifier keys (Alt, Ctrl, Shift) can now be assigned on their own. They were Diagnostics - .gptrace now also records the block you are aiming at, the item in your Compatible with Vintage Story 1.22.0. Supported layouts: Linux xpad, | |||||||
| 1.7.1 | gamepadcompanion | 25 | Jul 27th at 1:32 AM | gamepadcompanion-1.7.1.zip | 1-click install | ||
|
Fixes - The "left trigger curse" — triggers (and jump) suddenly dying mid-session - Triggers now follow the engine's own interaction rule exactly, so they - Pressing a trigger while the mouse is un-grabbed with no dialog open and Diagnostics - .gptrace now records, on every frame, the engine state that gates in-world Compatible with Vintage Story 1.22.0. Supported layouts: Linux xpad, | |||||||
| 1.7.0 | gamepadcompanion | 32 | Jul 24th at 10:11 PM | gamepadcompanion-1.7.0.zip | 1-click install | ||
|
# v1.7.0 — Multiplayer animation fix + no longer needed on the host ## Fixes **Your character now animates correctly for other players in **The mod no longer has to be installed on the host to work.** It was ## Notes - Because jump is now routed through the engine's normal path, the - The Share / screenshot button on Xbox controllers over Bluetooth Compatible with Vintage Story 1.22.0. Supported layouts: Linux xpad, | |||||||
| 1.6.0 | gamepadcompanion | 12 | Jul 24th at 1:57 AM | gamepadcompanion-1.6.0.zip | 1-click install | ||
|
GamepadCompanion v1.6.0 Fixes - Bluetooth Xbox controllers: the triggers were swapped over Bluetooth — the - The virtual cursor no longer locks your physical mouse. With a GUI open you - Fixed the mouse being dragged back into Vintage Story while the game was in the New - "Swap triggers (LT/RT)" option, for any controller that ever reports its | |||||||
| 1.5.0 | gamepadcompanion | 43 | Jul 18th at 9:19 PM | gamepadcompanion-1.5.0.zip | 1-click install | ||
|
Adds a dedicated button layout for Xbox One / Series controllers connected over Bluetooth on Linux (including Steam Deck). Why: over USB Linux uses the xpad driver, but over Bluetooth it falls back to the generic HID driver, which reports the buttons in a different order. The mod was matching it to the Windows XInput layout, which has the same axis order but a different button order. Sticks, triggers and the D-pad were already working correctly and are unchanged. No config changes needed — the new layout is detected automatically. If you had rebound buttons to work around the scrambled mapping, you'll want to reset those bindings. | |||||||
| 1.4.0 | gamepadcompanion | 59 | Jul 12th at 1:33 AM | gamepadcompanion-1.4.0.zip | 1-click install | ||
|
# v1.4.0 — UI in English and Spanish The mod's UI is no longer hardcoded Spanish: it's now localized through Vintage Story's language system (`Lang.Get`), following your client language automatically. - **English** (`en.json`) — also the fallback for any other language. Covers the settings editor (Wheel/Buttons/Sensitivity tabs), action pickers, the composite-action builder, key capture, the virtual keyboard, the HUD toggle indicators, and the radial wheel labels. **Saved bindings translate too.** Action labels stored in `ModConfig/gamepadcompanion.json` used to be a snapshot of the language they were created in (they stayed Spanish even after switching the game to English). They are now re-resolved to the active language on every load: the mod's default slots use short localized labels, hotkeys from other mods show whatever name the owning mod registers, and key-press/builtin/composite actions regenerate their label localized. Existing configs work as-is, no migration needed. Want the mod in your language? It's now just one JSON file in `assets/gamepadcompanion/lang/` — PRs welcome on GitHub. Compatible with Vintage Story 1.22.0. Supported layouts: Linux xpad, DS4-DInput, GameSir Cyclone 2 (PS4 mode), Windows XInput (Xbox 360, 8BitDo Ultimate 2C), SHANWAN PS3-DInput (X-D GamePad). | |||||||
| 1.3.1 | gamepadcompanion | 118 | Jun 20th at 9:46 PM | gamepadcompanion-1.3.1.zip | 1-click install | ||
|
## v1.3.1 | |||||||
| 1.3.0 | gamepadcompanion | 91 | May 19th at 11:03 PM | gamepadcompanion-1.3.0.zip | 1-click install | ||
|
v1.3.0 — Worldmap zoom + sit-walking fix New features - D-Pad map zoom: when the worldmap is open in full-screen mode (default M), use D-Pad ↑ to zoom in and D-Pad ↓ to zoom out. Each press is - Stray "G" key when GUIs were open: pressing D-Pad ↓ with any modal dialog open (inventory, chat, container, etc.) was injecting the G key | |||||||
| 1.2.0 | gamepadcompanion | 51 | May 16th at 12:04 PM | gamepadcompanion-1.2.0.zip | 1-click install | ||
|
● ## v1.2.0 — Windows XInput and X-D GamePad (SHANWAN DInput) support Fixes the jumbled controls bug reported on Windows. Before this version, in Windows the right trigger would move the camera vertically while ### What's new - **Automatic Windows XInput support.** New `WinXInput` layout, auto-detected by axis signature. Covers any Xbox / XInput controller on Windows. ### Notes - The X-D GamePad button mapping is inferred without test hardware (assumed Xbox-style order: A=b0, B=b1, X=b2, Y=b3). If you notice A/B or X/Y | |||||||
| 1.1.1-dev.1 | gamepadcompanion | 33 | May 14th at 10:19 PM | gamepadcompanion-1.1.1-dev.1.zip | 1-click install | ||
|
v1.1.1-dev.1 — Diagnostic build (not a general release) This is a debugging build to investigate a "random walking speed" bug New diagnostic command: Logs the full gamepad state every render frame to client-main.log for the Re-running .gptrace while a trace is active restarts the timer with the new No other changes. Existing config, bindings, and toggles behave exactly as | |||||||
| 1.1.0 | gamepadcompanion | 58 | May 12th at 10:46 PM | gamepadcompanion-1.1.0.zip | 1-click install | ||
|
▎ v1.1.0 — Automatic support for PS4-style controllers: DualShock 4 (DirectInput) and GameSir Cyclone 2 in PS4 mode are now detected without | |||||||
| 1.0.0 | gamepadcompanion | 52 | May 11th at 1:09 AM | gamepadcompanion-1.0.0.zip | 1-click install | ||
|
Fixed a problem that made the left bumper infinetly loop when opening a container. | |||||||
| 0.1.0 | gamepadcompanion | 43 | May 11th at 12:16 AM | Empty | gamepadcompanion-0.1.0.zip | 1-click install | |





Having a strange issue with the Steam Controller on SteamOS, I appear to be stuck spinning in a circle while looking up and left with no controller input. At first I was able to get controller input working by using flatseal (although I was still stuck spinning in a circle) but after relaunching that stopped working. I'm using the "gamepad with joystick trackpad" preset with Steam Input otherwise turned off (it can't be disabled for the Steam Controller.)
Edit: It did take my input again after relaunching.. then didn't after. Seems to arbitrarily decide if it wants to accept my controller input or not but always stuck spinning regardless.
The steam controller uses different drivers depending on the mode, gecko if I remember correctly outside of steam, I need you to run the commands .gptrace on the chat and send me the logs that appear
Does this work?
Pastebin tells me it's too large. This is while playing it through Steam in game mode but behavior seems to be identical as in desktop mode.
Running into a strange Issue, Movement isn't locked when using chat.
I am on Ver 1.22.2
That's how I made it, since the virtual keyboard is controlled using the d-pad, not the joystick, this because it let's me move while typing using my ring for the joystick and my thumb for the d-pad
Understood!
submitted some issue on github
Fixed and added on the new release
I'm enjoying this! I wanted to get it compatible with https://mods.vintagestory.at/rkncrafting though, and haven't been able.
I am not able to assign a button to the Alt key, which is the default modifier key for RKN Crafting. I go to the Buttons tab in the Settings, click the button next to the "Y", click "Assign a single key", and it does not do anything after pressing Alt.
So, I thought I could get around it by assigning the RKN modifier to something like "E". After doing that, I perform the same steps in the Buttons tab except I assign "Y" to the "E" key. This completes, however holding "E" and right clicking on the ground does not perform the crafting action like I'd expect. I'm guessing that your system does not yet support binding custom modifier keys?
Glad your liking it, the new release should fix both problems, since both cases were not considered.
Thanks! I was able to bind LAlt to "A", but holding A and pressing LT (right-click) did not work to perform the crafting like on my mouse and keyboard.
The new release should fix it, be advised though, I haven't tested it myself since I didn't understand RKN Crafting mechanics
I can RKN Craft now, awesome!!
Next I would love if it was compatible with Hydrate or Diedrate. Ctrl+Hold Rightclick is used to drink from a block of water, like from a pond or lake. I press LStick to activate CTRL, and hold LT (right-click) but do not drink like I am able to using mouse and keyboard.
The new release should let you interact with water while HoD now
It does! Amazing, thanks!
This is pretty amazing.
One Small problems, Sometimes I want to just reach over and use my mouse anyway. But the "Yellow Virtual cursor" locks down the actual Mouse. Something to let me just use the normal Mouse in the middle of everything
Hello, are you holding your top left bumper while trying to use your mouse? that should be the only moment the mouse gets locked, if not, can you type on the chat .gptraces and send the results?
It 'locks' on to the Yellow Cursor whenever a UI element comes up.
The behavior of the controller stuff is fine. Course D-Pad movements work. Hold down RB and detailed R-Thumbstick mouse movement works. .gptraces is clean, the controller input and behavior is exactly as expected.
The 'problem' is when touching the actual physical mouse. Controller set down, no buttons pressed. Any time the Yellow Cursor is active, any time any UI element is up, The actual mouse can move away from the yellow cursor, but it is immediately reset back to the yellow cursor. This happens both when RB is down or up.
It looks like your calling.. something .SetCursorPosition(YellowCursor.position) every frame. And that means any time the real mouse tries to move away, it can't.
This last part is a little more uncertain. Sometimes this mouse snagging keeps happening, when I alt-tab out of VS. Not always, most of the time its fine, but sometimes, if the Yellow Cursor is up in VS, and I alt-tab out to this browser, the Mouse-snapping behavior continues. VS isnt visible, but the mouse is still being snapped back to VS's position every frame.
I dont have any other mods installed.Its just this. No Steam.
Ah, I understand, yes, you're correct about the reason this happens and yes is a symptom of my method, I did it so you could navigate using the d-pad otherwise it would make jumps to the corners of the screens, sadly, I didn't manage to find a work around, I'll maybe look into it again but unfortunately my keyboard gave out on me last weekend so I'll only be able to work on the mod again somewhere after my next paycheck next month
Update: this is fixed in v1.6.0.
You can now just reach over and grab the mouse mid-game. The moment the mod
sees the physical mouse move, it hides the yellow cursor and gets out of the
way — the real mouse works normally until you touch the right stick or D-pad
again, at which point the gamepad cursor takes back over (right where your
mouse is, so nothing jumps around).
The alt-tab issue is fixed too: while Vintage Story doesn't have window focus,
the mod no longer touches the OS mouse at all, so it won't drag your cursor
back into a background VS window anymore.
Grab the update and let me know if anything still feels sticky.
(Heads up: my keyboard is still dead, so I put this update together — and wrote
this reply — with AI assistance. Apologies if the wording reads a little off.)
do you have a kofi or anything?
I don't, why?
he wanna pay you
buy you a keyboard?
Oh, no need to, is not that I don't have money, I just want to wait to my next paycheck to be able to have some spare money since I had to buy a new laptop too, thanks for the wish to help though, besides, in my country receiving money internationally is complicated enough.
First and foremost, I want to thank you for making this mod. My wife has an old hand injury that makes using keyboard and mouse difficult, and I really wanted to play Vintage Story with her. Where alot of the other controller support mods don't really add full functionality, this seems to do most of it. (The only thing I've noticed is that she slides around on the ground when moving instead of running or jumping. It's not that big of a deal.)
We've been mostly fine, but we made a custom modpack. Whenever she pulls out a weapon, it swings non-stop without her pulling any triggers. We have a feeling this is because of the "Combat Overhaul" mod we have installed. Do you know if there is any way to make it stop, so she can use the weapons normally? Is there a setting she can mess with?
Speaking as someone who does use keyboard and mouse I can tell you that I haven't really noticed any particularly complex mechanics with Combat Overhaul it as of yet, especially since we dont PvP or anything. I'm not sure if it's better to just uninstall it but we liked the added weapon variety. The only way we've found to get her to stop swinging is to put something in her offhand when shes holding a two-handed weapon.
Hello, I'm glad this mod helps you, and yes, it's most likely that the problem is combat overhaul since it changes the library that my mod uses to translate the inputs, I need you to connect the controller and while the swinging is happening run the commands .gpaxes and .gptrace on the in-game chat and paste the results here so I can pin point where the incompatibility is
It was a rather large wall of text, so I'm not sure if I can post it here. Its in a pastebin, but here is the result of from client-main.log.
Thanks for the tracem, it actually clears my mod: during the whole
capture the triggers read 0.00 and no input was mapped, yet the weapon
was swinging. That means GamepadCompanion isn't sending the attack;
Combat Overhaul is generating the swing on its own. Two things confirm
it: 1: the mod delivers attacks through the vanilla in-world
mouse channel, and Combat Overhaul replaces the melee system entirely,
so they're on different rails. 2: your own workaround (an item in the
offhand stops it) is a Combat Overhaul two-handed-weapon behavior.
Quick check to be 100% sure: draw a two-handed weapon, disable
GamepadCompanion (or unplug the controller) and see if it still swings
with keyboard+mouse while you touch nothing, which
points to a Combat Overhaul bug to report to them. Full gamepad-attack
support inside Combat Overhaul would need me to hook their input API,
which I'm looking into.
The latest release fixed a problem with how the mouse click flag is handled, this may have fixed your problem, please, give it a try.
Hi i'm having an issue where i cannot actually get the mod to function on my steam deck, its installed, shows as needing no dependencies, yet i get no indication that the game is picking up the inputs as it should, i've tried with steam input on and off numerous times with both my Xbox one controller and the deck itself and no luck, the controller defintely functions as i tested it on my windows PC with the Mod to see if it would be good enough for my partner and everything was fine, but obviously Linux SteamOS is a different ball park. i have tried it via bluetooth and direct usb connection in both desktop and gaming mode with no luck whatsoever
Hello, it's most likely the profile you're using with steam input, you need to use the standard steam input profile called gamepad and trackpad, if it still doesn't work I'll need you to run .gpaxes and .gptrace in the chat and paste the result here, I know this works on steam deck since I use it to play too, also, is your steam deck the LCD versión or the OLED version?
Hi it's the LCD model, i don't see any option for gamepad and trackpad where the xbox controller is concerned, just the steam deck controller itself, i was trying the standard gamepad steam input profile on the xbox controller, let me just get those logs (this is my account, i used my partners account for the first post)
I missed the Xbox controller part, I will look into that, I can confirm it should work with Xbox based controllers and ps4 based controllers, but can't on pure xbox one controllers, but the steam deck controls should work with the gamepad and trackpad layout, I'll only be only to look into that with the logs
https://pastebin.com/izmaSy2N
the log file was apparently too big even when cut in half to post so i had to make a pastebin link
Ah, I see the problem, you're running the flatpak version, by default flatpak packages have no access to external input, but you can fix this with the app Flatseal and then search for the toggle that allows it to read external devices input outside the sandbox, after that it should work.
Fantastic it is finally functional, thank you, but not properly of course, 1 step forward, 2 back 😂 now the inputs are all muddled, the start and backbutton keys do nothing, right bumper is start, pressing is L3 and R3 (The analog stick) does not engage shift or control, nothing does for that matter, i can't engage the precision cursor for menus with right bumper, i have no idea how its all so mix and match but heres the pastebin after running .gpaxes and .gptrace
https://pastebin.com/0dRvM5B2
AHA, the issue is either the bluetooth input, or the steam input, because in my curiosity i plugged the deck into our tv dock and the controller directly into the dock, disabled bluetooth and steam input and presto, it works flawlessly, but if you want help ironing out the issues i had prior to this discovery please let me know i can do anything to help
Found the problem and it's not Bluetooth interference or Steam Input. Over USB your controller uses the xpad driver; over Bluetooth Linux uses the generic HID driver, which reports the buttons in a completely different order (with gaps). The mod was reading raw button 7 as Start that's physically your right bumper, exactly what you saw. L3/R3 sit at 13/14 but the mod was reading 8/9. Your sticks, triggers and D-pad were fine. v1.5.0 adds a dedicated layout for Bluetooth Xbox pads. One thing I couldn't verify from your log: Start and Back never showed up in the 15s trace at all. Could you run .gptrace again over Bluetooth and press only Start, Back, L3 and R3? If they still don't register, that's Steam Input grabbing them and I'll need a different fix for those. Also worth knowing: you changed three things at once (dock/USB, Bluetooth off, Steam Input off). The USB switch alone explains why it worked, so you don't need to keep Steam Input disabled.
I did not detect this problem because I used my gamesir cyclone with the USB dongle, which reports as xpad.
Hi there, sorry for the late reply, i'm guessing maybe you don't need those stack traces as i just saw the 1.5 changelog, will update the mod for our next session likely tomorrow, we've been running into an issue where the left trigger isn't correctly picking up things from the ground (Bowls, crocks, stacked firewood, coal, leaning tools) i just decideds it doesn't want to work, the only solution i found (this was using the USB connected xbox controller) was pressing the left trigger on the steam deck which is actually binded as right click through steam input, which fixed the issue, will running .gptrace help find the route of an issue like that, be happy to help if thats the case, and if you still need those stack traces for the buttons you previously mentioned let me know and i'll provide those too.
also it could be entirely unrelated, but since getting the mod working, in our lan world my partners character doesn't animate correctly, they just kind of like around, not moving their legs, wondering if maybe its a quirk with how the mod behaves in a multiplayer settings
actually ran into another issue today, when using bluetooth, the left and right trigger are now backwards to what they were previously, left trigger is now left click and right trigger is now right click, instead of the other way around, i tried enabling steam input to rebind left trigger to right and right trigger to left, but it caused double inputs, swapped back the ol reliable USB cable again as that still works just fine
That's actually how is supposed to work for picking up things from the ground, something tells me that your steam input is somehow compromised, because to pick up things from the ground the actions are crouch with right stick->right trigger to pick up, or am I not understanding your problem? (even though I understand English I still struggle with "common" talk outside work) And the Bluetooth problem I'll the tracem again, I need to make adjustments manually since Bluetooth wasn't contemplated for the mod, only USB method (either cable or dongle), unfortunately though my keyboard gave out on me so I wouldn't be able to deliver you a fix until somewhere next month after receiving my paycheck
I will try to clarify, i don't know how my steam input could be compromised, i should have mentioned now looking back, that it works perfectly fine without steam input and reads the raw input of the xbox controller over bluetooth just fine without steam input, enabling just creates double inputs.
The issue, is that before using the bluetooth mode the controls (Via USB connection) where Right trigger to break blocks and other breakables, Left trigger to pick up/interact with things (which even with 1.5, this is still the case for controls via USB connection), which is familiar to anyone who would've played minecraft on console or via controller mods for java, to have them swapped around to Right trigger to interact and Left Trigger to break blocks is too much of a shift for the average controller user, in this case my partner, it makes sense to someone who can think of them (the triggers) as replacements for the left and right click of a mouse, but not to your average controller user.
If there is a way for me to change them around myself i will happily do so, but there is no option for the triggers in the mod's config menu
a small side note, xbox series S and X controllers have a little button inbetween the Start and Back button which typically functions and the screenshot button on xbox's and even works on steam, however it seems to have defaulted to A/spacebar for the control scheme and just makes you jump, in a game like vintage story, having the extra button could be put to good use, maybe as the Handbook button, i have the stack trace here for the bluetooth control scheme showing the use of the triggers, and for the A button and the screenshot button sharing the same function (jumping)
https://pastebin.com/dCfmFAbF
Thanks for the detailed reports and the trace — huge help. v1.6.0 covers most
of it:
Triggers over Bluetooth (fixed). You were right, they were backwards. Your Xbox
pad over Bluetooth reports the right trigger on the axis my code assumed was the
left one (the opposite of how it comes in over USB/xpad), so RT and LT ended up
swapped. Fixed — over Bluetooth it's back to RT = break/attack, LT = interact/
pick up, same as USB.
Manual trigger swap (new). In case any controller ever comes in reversed again,
there's now a toggle: Settings → GamepadCompanion → Sensitivity → "Swap triggers
(LT/RT)", or type /gpswaptriggers in chat. You shouldn't need it on your pad
anymore, but it's there.
The Share/Capture button. From your trace, that little button seems to send the
exact same code as A (raw button 0) — which is why it makes you jump; as far as
the game is concerned it literally is A. If that's really the case I can't bind
it to anything separate. Could you run .gptrace and press only the Share button
for ~5 seconds? If it shows a distinct button number I'll gladly map it to the
Handbook. If it still comes through as A, it's a Bluetooth/hardware quirk I can't
work around.
LT not picking up bowls/crocks/firewood (USB). I want to look closer at this one.
LT is right-click (interact) and those pickups are right-click actions, so it
should work. Could you run .gptrace while a pickup is failing? I want to see
whether the right-click is actually firing at that moment — that'll tell me if
it's the mod or something else.
Partner not animating in LAN. The mod is client-side only and drives your own
character's controls the same way the keyboard does, so it shouldn't change how
your partner's character animates on your screen. To rule it out: is your partner
also running GamepadCompanion, and are they on a controller or keyboard? That'll
help me narrow it down.
(Heads up: my keyboard is still out of commission, so I built this update and
wrote this reply with AI assistance — apologies if the tone reads a bit off.
Thanks again for testing, it genuinely helps.)
I appreciate the disclosure for use of AI
i will run a stack trace the next time the triggers fail in that manner
as for the mod being client side, doesn't that mean it should work whether or not the host has the mod installed, because as far as we saw, the mod did not function until i also installed it as well (as my partner is the controller user i figured only they'd need it)
they are the one that is not properly animated in this way, as the actual controller user, this isn't really that big of a deal honestly, we got over it ages ago, just thought it was worth mentioning encase it was related to your mod, i didn't happen until we started using it, as previously we were using steam input to fully mimic mouse and keyboard and my partners character was animated as it should be
Here is a stack trace, i typed .gptrace, i then held the screenshot button for a few seconds, and afterword held the actual A button for a few as well, hopefully there can be some distinction between them
thank you again https://pastebin.com/GcEF3Sq9
Thanks for the trace — it answered all three questions, and two of them
turned out to be real bugs in my mod. Both are fixed in v1.7.0.
Share vs A: no fix possible, and the trace is conclusive. I collapsed
it to the transitions and your two presses look like this:
Share held 5.6s -> rawBtn=[1000000000000000000] mapBtn=A
A held 2.6s -> rawBtn=[1000000000000000000] mapBtn=A
Identical, byte for byte — only the stick noise differs. Over Bluetooth
your controller reports the Share/screenshot button as the exact same
raw button as A, so there is nothing for the mod to tell apart. That's
also why they share the jump function. Binding Share to the Handbook
isn't possible while the pad enumerates itself that way.
The mod being client-side: you were right, and it was my fault. The
code was client-only, but the mod's metadata didn't declare it, so
Vintage Story defaulted it to "universal mod, also required on the
server" — and when you joined a server that didn't have it, the client
silently disabled it. That's exactly why it only started working once
your partner installed it too. v1.7.0 declares it client-side properly:
install it only on the machines that actually use a controller, and it
works on any server, vanilla host included.
The gliding character: that one was my mod, and your detail about
Steam Input is what gave it away. The mod was writing movement straight
into the player's control flags. That moves you on your own screen, but
the game only tells the server about movement by diffing those same
flags on a 20ms tick — and it reassigns them from the keyboard state
right before diffing. My value was written between two ticks, so at the
moment of the diff it had already been wiped and the "moving forward"
packet never went out. The server kept believing your partner was
standing still and relayed that to you, and animations for other
players are driven entirely by what the server says. Hence the glide,
and the same for jumps. With Steam Input it worked because the keyboard
really was pressed. v1.7.0 routes movement and jump through the same
channel the keyboard uses, so the server sees them and everyone gets
the animations. If you can, please confirm it in LAN — that's the one
thing I couldn't test on my end.
One behaviour change from that fix: jump now goes through the engine's
normal path, so it also obeys the engine's rules — A no longer jumps
while an inventory or other dialog is open, and it won't fire when
there's no room to stand up. That matches what the spacebar does.
Two small things from your log: you have gamepadcompanion 1.4.0, 1.5.0
and 1.6.0 sitting in your Mods folder at the same time. The game only
loads the newest one, so it's harmless, but it's worth deleting the old
zips so you don't end up testing a version you didn't mean to. And yes
— please do send the stack trace next time the triggers fail, that's
still the missing piece for that one.
Again this was written using AI, btw, did ythe bumpers work as intended? the trace only shows A for input
Great work!
yes the bumpers seem to be working just fine
i was just curious, i found the steam deck's bluetooth signal not good enough, the controller disconnects too often and messes up the controls, so i swapped my partner to the xbox elite controller dongle we had and installed the Xone drivers for linux https://github.com/medusalix/xone
i have another stack trace of holding the A and Screenshot button here, maybe it will be different with these drivers and method https://pastebin.com/6wHfY16B
also the triggers haven't failed since updating the mod to 1.6, i'm wondering if these changes
"- The virtual cursor no longer locks your physical mouse. With a GUI open you
can just reach over and use the real mouse — the yellow cursor steps aside the
moment you move the mouse, and the gamepad takes back over as soon as you touch
the right stick or the D-pad (it reappears right where your mouse is, so nothing
jumps).
background. When the window isn't focused (alt-tab), the mod no longer touches
the OS mouse at all."
are the reason for this, who knows
I'll look into that some time tomorrow, and no, that change is because a user found it annoying that the mouse was locked to the yellow cursor, it didn't have a real impact besides not allowing you to jump when on an interface so I applied the fix, the bump being incorrectly assigned are because of the drivers
Looked at the trace and sadly there is nothing I can do, the button you were pressing still reported as A since xone still reports as xpad at OS level.
well it was worth a shot
meanwhile, the dreaded left trigger curse happened again, couldn't pick up anything, and this time i have the stack trace for you, hopefully it can help you fix the problem
https://pastebin.com/qdjXAamm
No exception in that log — but what you captured turned out to be better than
a stack trace: the gptrace caught the curse red-handed.
Here's what it shows: the mod was reading your left trigger perfectly. I can
see every one of your ~20 (increasingly desperate, I imagine) presses arriving
as clean 0.00 → 1.00 → 0.00 edges. The input side was fine — the game itself
was refusing the interaction.
Root cause: Vintage Story has a "free mouse" key (Alt by default) that
releases the mouse cursor while you hold it. The game never clears its
keyboard state when the window loses focus, so if an alt-tab, the Steam
overlay or an on-screen keyboard eats that key's release event, the game is
left forever believing the key is held. That silently un-grabs the mouse,
which kills trigger actions — while camera, movement and buttons keep working.
Which is exactly the curse.
One question to confirm it 100%: was jumping ALSO dead while the curse was
active? The theory predicts it should have been.
v1.7.1 is up with the fix:
- Triggers now follow the game's own interaction rule, so they keep working
even in that un-grabbed state.
- Pressing a trigger during the curse now auto-clears the stuck key and heals
the whole thing — no more restarting the world.
- And if it ever comes back anyway: run .gptrace 5 while it's happening. The
trace now records the exact game state that decides this, so one capture
will end the mystery for good.
Thanks for the log — this one had been haunting us for a while, and your
capture is what finally cornered it.
Sure enough, the curse hasn't been lifted, heres a log of it happening again, interestingly it allowed us to pick up some clay ingot molds, but nothing else, we tried it on tools and a placed crucible with no luck, just the ingot molds got picked up
https://pastebin.com/Snjh37ZZ
New release launched, since the last two releases I was not able to replicate the problem but the clue of not being able to pick up tools gave an idea, maybe it was the mouse click flag, hope this one fixes it.
Had this same issue, took me a bit to dig for it. Since most users on Steam Deck/Linux are probably using the Flatpak version definitely think this should be in the description! Ty for the mod.
Not sure if i am doing something wrong or not but everything works great except L3 isnt registering so I am unable to do anything requiring the shift key :/
What controller do you have? And can you run .gpaxes and .gptrace commands on the in-game chat and send me what they return?
hi, i have an 8bitdo xinput wired controller, and have put the files into the vintagestorydata mods folder, still doesn't work. i'm on windows 11. is there anything else i have to do?
Hello, did you manually turn on the mod in the mod menu? If you did I need you to run the command .gpaxes and .gptrace on the ingame chat
joder, que buen nombre de usuario
crasheó :c
Hola, perdón por no responder antes, no suelo entrar seguido en la mod db y tampoco hay notificación por correo, voy a estar mirando que paso en unos dias apenas pueda.
vale, gracias
Arreglado, la nueva versión debería ser compatible con la libreria que usaste a partir de ahora
god hermano, mushas gracias
This is my first comment haven't even tested the mod but now having to take care of my newborn daughter and wanting to port VS to my steamdeck while I'm watching her with this will now be complete,
peluca sabe.
you're the goat,big hug if i run into a trouble i will come yelling like a gurl
Jajaja, glad to hear it can help you, yes, I myself use this mod with my steam deck when I don't want to turn on the desktop, you just need to put steam input with the "Gamepad and trackpad" mode and it will work perfectly, saludos compañero
Hello! Thank you for showing us English folks this mod.
Can you link the Github repo please?
You can go to it if you clikc on the "Source" button, here's the direct link https://github.com/ElSublimePeluca/GamepadCompanionVS
... I am blind.
Thank you!
hi. the control scheme is very jumbled for me on windows 10 with an 8bitdo ultimate 2c wireless controller. this controller uses xinput and has the same layout as an xbox controller with the addition of two extra Back/Start-style buttons and two extra shoulder bumpers.
here is an example of the jumbled control scheme:
Right Trigger | camera vertical axis (in the normal trigger position, the camera is constantly moving up)
Right Stick left | camera left and right mouse click (i can place blocks by moving the stick left)
Right Stick right | camera right and some mouse button (i can click on menu buttons by moving the stick right)
most of the controls are similarly mixed up. if there's something i can do to help fix the issue then please tell me 😃
The mod did not support Xinput because I thought it used the same protocol for Linux (xpad), the new version should fix that.
thank you, everything in the new version works as it should!
Hello! I am curious whether you are on the official Discord? I had some questions I was wanting to ask you about your mod that it would be better to ask more privately.
Yes, I am, you can find me with the same ID as here (ElSublimePeluca)
Also CaringNickel240 in case you can't find by that name
will this work / be redundant on Steam Deck? might consider using this on there if it has stuff that the Steam Deck doesn't offer...
Yes, it works on steam deck, I tested it myself and it works with the xbox layout perfectly, I actually made this mod with help of Claude Code because I wanted a more analog feeling
Issue on Windows: My camera is forced upward and continues spinning to the left. I'm not able to control my camera. All other buttons and movement seem to work.
Ah, I know exactly what the problem is, what controller are you using?
I'm using this one (just a cheap knockoff) https://a.co/d/0g3E0OKf
And these are the logs I see:
Ok, It was half what I suspected, your controller uses DirectInput instead of Xpad, since I don't have a DirectInput controller, please test it, there's a chance the buttons and axis are inverted for some inputs, if that the case tell me what action each button trigger and what direction each axi points to but with the changes it should work.
Great! The right stick controlls the camera as expected now. The next issue I noticed is with movement, the left stick. I will hold left stick fully up and start moving forward. But after 4-5 seconds, my pace will suddenly change. It will be an entirely random walk speed. It may be sprinting, or it may be inching forward at a snail's pace. I don't press any other buttons, and keep the left stick exactly in place, but my speed will change randomly every 4-5 seconds.
Huh, that's new, I need you to use .gpaxes while walking and when you notice the chage in pace use .gpaxes again and send me the logs of both, I'm suspecting a frame desynchronization, happened during my testings but with the right stick.
Sure! I ran around a bit and typed .gpaxes every time speed changed. Here are the logs:
GamepadCompanion: gamepad connected on jid=0: Wired Controller (buttons=18, axes=6)
GamepadCompanion: detected Ds4Amazon layout by signed triggers (a3=-1.00, a4=-1.00, btnCount=18)
GamepadCompanion: raw axes: a0=+0.14 a1=-1.00 a2=0.00 a3=-1.00 a4=-1.00 a5=+0.03
Ok, that's actually strange, the logs are normal, tell me, when you slow down, the "ctrl" text in the top right corner gets lit up on yellow? If that's the case it means your controller is triggering the sneak command which should be maped to the right stick, also, when do you press any other button on your controller when slowing down? it could be that another button is triggering the command too
The "CTRL" does not light up yellow while just holding left stick up, no. When I click the right stick, it does light up, and my movement speed about doubles. If I am moving slowly, then lighting up "CTRL" makes me go at about walking pace. If I am moving quickly, then lighting up "CTRL" makes me go VERY fast.
Ok, I made a diagnostic build (gamepadcompanion-1.1.1-trace.zip attached) that adds a new chat command .gptrace. It logs the gamepad state every single frame so I can see exactly what your controller is reporting when the speed change happens.
Setup
1. Remove your current gamepadcompanion-1.1.0.zip from your Mods/ folder.
2. Drop the attached gamepadcompanion-1.1.1-trace.zip in its place.
3. Launch Vintage Story. The mod should work exactly like before, with one extra command.
Send me the answers before doing the trace.
Then, the trace itself. This is what will help me find the speed-change bug:
1. Load a world, find an open area, and let the camera settle.
2. Open chat and type: .gptrace 30 (this starts logging for 30 seconds).
3. Immediately start walking by holding the left stick fully up. Don't press anything else.
4. Keep walking in a straight line for the full 30 seconds. If the speed changes at some point, let it happen — that's exactly what we want to capture. Keep the stick steady.
5. After the 30 seconds, please send me the file at: /Logs/client-main.log
If you happen to not see the speed change during those 30 seconds, just run .gptrace 30 again and try once more — but tell me either way.
Sorry and thanks and for the patience with this one.
Unfortunately, after swapping the current version of the mod with gamepadcompanion-1.1.1-dev.1.zip, my controller does not seem to get recognized, and does not control the game. The log says this many times:
Can you check if you have the 1.1.0 with the 1.1.1? The detection method did not change so it can't be that, also, while having VS open but not in a world disconect and conect again your controller, if none of these work I'll check again, also, do you use program to allow windows to use your controller? Like AntimicroX or DS4Windows?
I checked my mods folder, and only the 1.1.1 version of the mod is in there. I disconnected and reconnected the controller as you said, but now it seems to think it is an Xbox controller:
GamepadCompanion: gamepad connected on jid=0: Xbox Controller (buttons=14, axes=6)
That's strange, this is a sign the controller switched from PS4/DirectInput mode into Xbox/XInput mode — some PS4-compatible clones (maybe yours included) can present themselves either way to Windows, even though the listing only mentions PS4 support.
Before I make you another build, I'd like you to run two quick checks so I know exactly what Windows is seeing right now. Both are safe,
read-only, and take less than a minute total.
Check 1 — joy.cpl
1. Press Win + R, type joy.cpl, hit Enter.
2. Tell me what controller names show up in that window (a screenshot works too).
That window only lists controllers in DirectInput / PS4-style mode. So:
- If your controller appears there (likely as Wired Controller or similar) → it's in PS4 mode and something else weird is going on.
- If it does NOT appear there → it's purely in Xbox/XInput mode right now.
Check 2 — PowerShell
1. Press the Windows key, type PowerShell, open "Windows PowerShell" (regular one, no admin needed).
2. Paste this command and press Enter:
Get-PnpDevice -PresentOnly | Where-Object {
$_.FriendlyName -match 'controller|xbox|wireless|ps4|hid-compliant game'
} | Select-Object FriendlyName, Class, Status, InstanceId | Format-Table -AutoSize
3. Copy the text it prints and paste it into your reply.
The Class column is what I care about: HIDClass means DirectInput / PS4-style, while XnaComposite or XboxComposite means Xbox/XInput.
Bonus question: does your controller's lightbar (the LED strip on the front) change color in any game? Have you ever used the motion sensor /
gyro? Motion controls and the lightbar are PS4-only features — the Xbox protocol doesn't have them — so they're a passive way to tell which mode
the controller has been in.
Why I'm asking before sending a new build: if you accidentally ended up in Xbox mode, there might be a button combo on your controller to switch
back to PS4 mode (common ones on clones are Home + Share, Home + A, Home + B, or a small switch on the back). If we can flip it back, everything
goes back to working with the current version. If we can't, I'll need to add separate Xbox-mode support to the mod, which is doable but takes
another round of diagnostic data from you.
Thanks again for the patience.
Lots to report!
After joy.cpl, it had one listing, "Controller (XBOX 360 for Windows)". Then, I tried a bunch of different button combinations to see if any switched the mode. Turns out, after holding down Home for 5 seconds, "Controller (XBOX 360 for Windows)" disappeared, and then "X-D GamePad" appeared. I booted up my VS world to see if it was back to before. The logs are spammed with this over and over:
Not gonna lie, that's the strangest behaviour I've seen in a controller, the new version adds support for X-D GamePad and Xinput, try it and tell me if everything works on both green and red mode
Xbox mode mapping is great, from what I can tell so far! But still the issue with varying move speeds. Here is the results of a 30 second trace session as instructed: https://pastebin.com/hM28cbn7
Let me know if you want one in X-D GamePad mode as well.
Ok, the trace shows normal results. Every single line shows:
- No buttons pressed (rawBtn=[00000000000000])
- No toggles active (tog=c0/s0/p0 — CTRL/SHIFT/Precision all off)
- Sprint and Sneak both OFF, Forward stays ON, nothing else changes (ec=spr0/sn0/fwd1/...)
The ec= field shows what the engine reads on its next physics tick, captured after the mod applies its inputs. So during those 30 seconds, the mod
is feeding the engine an absolutely constant "walking forward, no modifiers" signal — no flicker, no momentary sprint, nothing the mod is doing
changes.
Maybe another mod is touching entity stats
Could you check a couple of things?
1. Did the speed actually change during this specific 30-second trace? If yes, roughly when (e.g. "around the 10-second mark")? I can pinpoint it in the log.
2. Any other mods active?
3. If you walk in a straight line on the same surface using only W on the keyboard (with the gamepad untouched), does the speed still vary? If yes, then it's definitely not the mod.
And yes, a trace in X-D GamePad mode would be great as a sanity check on that layout's button map (especially A/B and X/Y, which I had to infer
without hardware to test). No need to reproduce the speed bug for that one, just a few seconds of pressing each button so I can confirm the
mapping.
Okay, hold up. After a long, long period of incremental testing different mods being enabled, I realized why my movespeed was constantly changing. I was being trolled by this mod: https://mods.vintagestory.at/temporalityplus
When a player has a low temporal stability, the default setting is to randomize movement speeds...
I didn't even realize that was a feature of the mod. The description just says: "When a players stability is less than 21%, all their stats become randomized every few seconds."
Now, the worlds I was testing your mod in did not even have temporal stability enabled, so that also really confused me. But it seems like having stability disabled is equal to having 0% stability, in the eyes of that mod. So I will make a comment over there about that.
In that case, I am relieved that I have resolved that issue and we are good with your mod! Thanks so much for your time and I apologize for not trying with all other mods disabled sooner, I may have figured out the issue before you spent time creating the trace feature.
Makes sense, perfect, then everything is working as intended, thanks for the help for troubleshooting the other bugs, really appreciate it.
Also, send me your logs after writing in the chat .gpaxes, you can find them at %appdata%\VintagestoryData\Logs\client-main.log, this way I can know if its the injection or the OS that's sending the wrong input to the game, without them it's hard to diagnose since I tried to replicate it on my windows boot but I can't seem to replicate it.