Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
DualSenseHaptics
DualSense rumble, adaptive triggers, lightbar and gyro aim without Steam Input, driven by game events: damage, fear heartbeat, walkie, explosions, jetpack, Cruiser. Rumble on any other pad. Client-side.
| Date uploaded | 2 weeks ago |
| Version | 0.2.2 |
| Download link | thatumi-DualSenseHaptics-0.2.2.zip |
| Downloads | 25 |
| Dependency string | thatumi-DualSenseHaptics-0.2.2 |
This mod requires the following mods to function
BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2100README
DualSenseHaptics
Controller feedback for Lethal Company, driven by what happens in game, plus gyro aim for the DualSense:
- Rumble on any gamepad: camera shakes (mines, shotgun blasts, Old Birds, the worm, ship travel...), damage scaled by the hit, a heavy thud for fall damage (and for being flung into something), a long pulse when you die, hard landings, ship landing / take-off, shovel and knife hits, shotgun recoil, jetpack thrust and the Cruiser (engine, ignition, gear shifts, turbo, destruction).
- One heartbeat, never two at once: in step with the game's own fear heartbeat sound when something scares you (also when drunk or poisoned, which play the same sound), the steady beat while critically injured, and a faint slow beat when you have been alone inside the facility long enough to go insane. Scared while critically injured beats 20 % harder. When the ghost girl stares at you, her heartbeat music drives it. The fear beat is on by default; the insanity beat is off by default.
- Immersion: a sharp jolt when your fear jumps (a scare; off by default), walkie-talkie crackle when someone keys up, faint static while you hear them and a squelch when they stop, a click on your own push-to-talk, and a high buzz that fades with your ringing ears after a stun grenade or a shotgun blast.
- Adaptive triggers on a DualSense (PS5 pad, also DualSense Edge): a "click" on the use trigger while holding a shovel or knife, a thrust buzz with the jetpack, and in the Cruiser a gas pedal whose resistance rises with RPM (and buzzes at idle) plus a brake that firms up from mid travel, where the brake engages, and shudders when you brake hard at speed.
- Lightbar on a DualSense: your health (green to red, red pulse when critically injured, fades out when you die), the Cruiser's health, the held jetpack's battery, or a static colour. The mic LED lights while you talk into a walkie.
- Gyro aim on a DualSense (off by default): turn the controller to aim, in real degrees, without Steam Input. See below.
Client-side only: nobody else in the lobby needs it. No hard dependencies.
Requirements for triggers and lightbar: turn Steam Input off
With Steam Input on (the Steam default for PlayStation pads) the game gets Steam's virtual Xbox pad. On Linux / Proton that is all it sees: you still get rumble, but not adaptive triggers or the lightbar. On Windows the real DualSense may be visible next to it; the mod then drives the DualSense directly, but Steam keeps writing to the pad too (lightbar, rumble). Either way, for the full feature set:
Steam > Lethal Company > Properties > Controller > Disable Steam Input.
The mod shows this tip once in game when it detects Steam Input (Steam's virtual pad, or a DualSense that also shows up
as an Xbox pad; a plain Xbox controller gets no tip), and logs which path it uses: backend=HID-USB, backend=HID-BT or
backend=XInput-fallback.
Linux / Proton: works through Proton's hidraw passthrough for the DualSense (on by default). Do not use the Proton
sdlinput compatibility option or PROTON_DISABLE_HIDRAW for this game.
Gyro aim ([Gyro] Mode, off by default)
Steam's gyro-to-mouse needs Steam Input on, and Steam Input on means no adaptive triggers or lightbar. This mod reads the DualSense's motion sensor itself (the same raw reports it already uses for the haptics, which is why gyro lives in a haptics mod) and turns it into camera motion:
- Modes:
Always,HoldToEnable(gyro while you hold the Gyro button),HoldToDisable(gyro on; hold the button to reposition the controller, a "ratchet"),Toggle(press to switch; a short tick confirms). - Binds: "Gyro" (default: touchpad click) and "Calibrate gyro" (unbound). With InputUtils installed, rebind them in
its keybind menu; without it, set
Button path without InputUtils/Calibrate button path without InputUtils. - Sensitivity 1.0 = turning the controller 1 degree turns the camera 1 degree (default 1.5), independent of the
game's look sensitivity and frame rate.
Vertical scale,Invert yaw,Invert pitch(the game's own Invert Y is compensated),Tightening threshold(steadies tiny motions),Max degrees per frame. - Drift: the mod calibrates automatically whenever the controller lies still for a second (the first time right after connecting: put it down on the table once). "Calibrate gyro" asks for it explicitly.
- Indicator: the middle player LED under the touchpad is on while gyro is active.
- Paused in menus, the terminal, chat and while inspecting an item, and nothing piles up meanwhile (no camera snap afterwards). Works with LethalControls' stick aim at the same time.
- USB works from the start. Over Bluetooth the controller only sends motion data after the first haptics report, so
keep
[Bluetooth] Enabled = true. Not available with Steam Input on, DS4Windows or DSX (no DualSense visible to the game): use Steam's own gyro there. The log saysgyro: transport=USB imu=ok rate≈250Hz ...when it works.
Cruiser triggers
This mod never changes how the Cruiser is driven (CruiserImproved and BetterVehicleControls own that). Vanilla has no
trigger driving (L2 is Sprint), and trigger resistance only makes sense if you drive with the triggers, so the Cruiser
profile is meant for BetterVehicleControls, which binds Gas to R2 and Brake to L2 by default. With
Cruiser triggers = Auto (default) the profile is on when BetterVehicleControls is loaded and its Gas or Brake is on a
trigger, following your rebinds in the InputUtils keybind menu; without it, the Cruiser still rumbles. On forces the
profile, Off disables it.
Config (BepInEx/config/dev.thatumi.DualSenseHaptics.cfg; changes apply while the game runs)
| Section | Setting | Default |
|---|---|---|
| General | Enabled, Backend (Auto / FallbackOnly / Off), Rumble intensity, Debug log | on, Auto, 0.8, off |
| Rumble | per event group: Camera shake, Damage, Death, Heartbeat, Landing, Ship, Items, Jetpack, Cruiser, Footsteps | all on, Footsteps off |
| Rumble | Fear, Fear jolt, Insanity, Walkie, Walkie static, Ears ringing, Ghost girl heartbeat | Fear, Walkie, Walkie static, Ears ringing, Ghost girl heartbeat on; Insanity, Fear jolt off |
| Rumble | Walkie static strength, Static follows voice | 0.5, off |
| Rumble | Rumble report flags (Classic / V2) | Classic (try V2 only if HID rumble does nothing) |
| Adaptive triggers | Enabled, Strength, Cruiser triggers (Auto / On / Off), Jetpack, Melee | on, 1.0, Auto, on, on |
| Lightbar | Mode (Off / Health / CruiserHp / Static), Static colour, Brightness, Critical pulse, Jetpack battery | Health, #0050FF, 1.0, on, on |
| Lightbar | Mic LED on walkie transmit | on |
| Gyro | Mode (Off / Always / HoldToEnable / HoldToDisable / Toggle), Sensitivity, Vertical scale, Invert yaw, Invert pitch | Off, 1.5, 1.0, off, off |
| Gyro | Tightening threshold, Auto calibrate, Max degrees per frame, LED indicator, Toggle rumble tick | 0, on, 30, on, on |
| Gyro | PatchLookInput (restart), Button path / Calibrate button path without InputUtils | on, touchpad click, unbound |
| Bluetooth | Enabled, Keepalive seconds, Report layout (Kernel / Compact) | on, 1.0, Kernel |
| Hints | Show Steam Input hint | on (turns itself off after showing) |
Stuck triggers after a crash
The controller keeps the last trigger effect until it gets a new one. The mod always releases the triggers on death, menus, alt-tab, leaving the Cruiser, disconnect and quit, but if the game crashes they can stay stiff: replug the controller, or start and quit the game once.
Known limits
-
Gyro axis directions are not verified on hardware yet: if turning the controller right turns left (or up looks down), flip
Invert yaw/Invert pitch. -
Bluetooth uses the mod's own report format (Unity's built-in one does not work over Bluetooth). It is implemented but not yet verified on hardware; if nothing happens over Bluetooth, try
Report layout = Compact, or use USB. -
DS4Windows / DSX users get rumble only (they present an Xbox pad to the game), unless the game also sees the real DualSense: then the mod drives it directly.
-
A DualSense on the rumble-only path (
Backend = FallbackOnly, Bluetooth with[Bluetooth] Enabled = false, or a report layout the mod does not recognise) can lose its lightbar: Unity's rumble command also sets the lightbar colour, black when nothing set one. -
With
Backend = Auto, a connected DualSense is preferred over an Xbox pad (Steam Input and DS4Windows mirror the DualSense as one). If you play with an Xbox pad while a DualSense is connected, setBackend = FallbackOnly. -
Other programs that write to the pad (Steam client, the Linux driver) may change the lightbar; the mod re-sends its full state when the game regains focus, its lightbar and rumble every 2 seconds over USB, and everything every second over Bluetooth.
Magyarul
DualSense (PS5) kontroller-visszajelzés a Lethal Company-hoz: rezgés a játék eseményeire (sérülés, halál, robbanások,
hajó, fegyverek, jetpack, Cruiser), adaptív ravaszok (lapát/kés "klikk", jetpack, Cruiser gáz és fék) és lightbar
(életerő, Cruiser-életerő, jetpack-akku vagy fix szín). Csak kliensoldali, más játékosnak nem kell telepítenie.
A félelemhez kötött szívverés (Fear) alapból be van kapcsolva, a Fear jolt és az Insanity kikapcsolva; a
Rumble intensity alapértéke 0,8.
Fontos: az adaptív ravaszokhoz és a lightbarhoz kapcsold ki a Steam Inputot (Steam > Lethal Company > Tulajdonságok >
Kontroller > Steam Input letiltása). Bekapcsolt Steam Inputtal Linuxon csak rezgés van, Windowson pedig a Steam is
írhat a kontrollerre. A Cruiser-ravaszokhoz a BetterVehicleControls kell: alapból a Gas R2-n, a Brake L2-n van, és
Cruiser triggers = Auto mellett a mod követi az InputUtils menüben beállított gombokat (vanilla játékban az L2 a
sprint, ott nincs ravaszos vezetés). Ha DualSense mellett Xbox-kontrollerrel játszol, állítsd a Backend értékét
FallbackOnly-ra. Ha a játék összeomlik és a ravasz kemény marad, húzd ki és dugd vissza a kontrollert.
Újdonságok (0.2.0): egyetlen szívverés-csatorna (félelem a játék saját szívverés-hangjával szinkronban, kritikus
sérülés, őrület egyedül a gyárban), ijedtség-rántás, walkie-talkie recsegés/zörej/zárás és saját adás kattanása (közben
világít a mikrofon-LED), csengő fül zümmögése, a szellemlány tekintete. Giroszkópos célzás Steam Input nélkül
([Gyro] Mode, alapból ki): Always / HoldToEnable / HoldToDisable / Toggle, a "Gyro" gomb alapból az érintőpad
kattintása, InputUtils menüben átállítható. Az érzékenység valódi fokban értendő (1.0 = 1:1). A sodródás-kalibráció
automatikus, amikor a kontroller egy másodpercig nyugton fekszik (csatlakoztatás után tedd le egyszer az asztalra).
Ha jobbra fordításra balra fordul a kamera, kapcsold a Invert yaw/Invert pitch beállítást.
CHANGELOG
Changelog
0.2.3
One-time config migration: installs that last ran 0.2.1 (or older) get the 0.2.2 defaults applied on first start —
Fear on, Insanity off — but only for values the user never changed. Tracked by the new internal
[General] Config version marker; fresh installs are unaffected.
0.2.2
Defaults changed, no code changes: Fear is now on by default — it only beats while the game itself plays its fear
heartbeat (scares, drunkenness, poison), so it is situational rather than constant. Insanity is now off by default
(the faint slow heartbeat after a long while alone inside the facility was easy to mistake for a stuck vibration).
Fear jolt stays off; turn it on in [Rumble] if you want a thud on every scare. The ghost girl's heartbeat is active
by default again (it needs Fear).
0.2.1
Defaults changed, no code changes:
Rumble intensityis now 0.8 (was 1.0).FearandFear joltare now off by default; turn them on in[Rumble]for the full immersive set (the ghost girl's heartbeat needsFeartoo).
0.2.0
Not verified in game yet (see TESTING.md in the source repo).
- Immersive haptics (B.7), all read from game state every frame, no new patches:
- One heartbeat for every source, so two never beat on top of each other: fear (in step with the game's own heartbeat sound; enemies, scares, also drunkenness and poison) > critical injury (the old 0.95 s beat) > insanity (a faint slow beat on the heavy motor when alone inside the facility). Fear beats are 1.2x stronger while critically injured.
- Fear jolt: a sharp thud when your fear level jumps (not right after a camera shake).
- Walkie-talkie: crackle when someone keys up, faint static while you hear them, squelch when they stop, and a click on your own push-to-talk. The mic LED is on while you transmit.
- Ringing ears (stun grenade, shotgun...): a high buzz that fades with the ringing.
- Ghost girl: when she stares at you, her heartbeat music drives the fear heartbeat.
- New switches in
[Rumble]: Fear, Fear jolt, Insanity, Walkie, Walkie static (+ strength), Static follows voice, Ears ringing, Ghost girl heartbeat;[Lightbar] Mic LED on walkie transmit.
- Gyro aim without Steam Input (B.8), off by default (
[Gyro] Mode): Always, HoldToEnable, HoldToDisable (ratchet) or Toggle, on a "Gyro" bind (default: touchpad click; rebindable in InputUtils when installed). Reads the DualSense's own motion data from the raw reports Unity already receives (USB; Bluetooth after the first haptics report), in real degrees (Sensitivity1.0 = 1:1), with automatic drift calibration when the pad lies still, a "Calibrate gyro" bind, a layout self-check, a tightening threshold, invert options, the middle player LED as an indicator and a rumble tick on toggle. No camera snap after menus or the terminal; paused while typing, inspecting or in the terminal. Works together with LethalControls' stick aim (shared look-input contract). Needs Steam Input off; with Steam Input on, use Steam's own gyro. - Harmony patches are now applied one class at a time, so one failing class only loses its own hooks.
0.1.0
First feature release (nothing of it verified in game yet; see TESTING.md in the source repo).
- Rumble mixer (attack/sustain/decay envelopes, summed and clamped, global intensity; paused in the pause menu and without focus; hard zero on death, disconnect, scene change and quit) fed by: camera shakes, damage (scaled; thud for fall and impact damage), death, critical-injury heartbeat, landings, ship landing / take-off / firing sequence, shovel and knife, shotgun recoil, jetpack thrust, Cruiser engine, ignition, gear shifts, turbo (real boosts only) and destruction.
- DualSense raw HID backend through Unity's own device handle (
'HIDO'command): USB report 0x02 and Bluetooth report 0x31 with CRC32 and keepalive; transport detected from the declared output report ids; one report per frame at most, only on change; trigger effects are not re-sent by lightbar-only updates or the USB refresh (only on change, focus regain and the Bluetooth keepalive). Resets that no later frame can retry (quit, focus loss) are retried up to 10 times, 3 ms apart. - Adaptive triggers: melee click, jetpack thrust buzz, Cruiser gas (resistance rising with RPM, idle buzz while standing) and brake (resistance from mid travel, shudder when braking hard). Cruiser profile only when BetterVehicleControls' Gas/Brake are on the triggers (Auto; BVC's defaults are R2/L2). Triggers are released on death, menus, focus loss, leaving the seat, scene change, disconnect and quit.
- Lightbar modes Off / Health / CruiserHp / Static, critical red pulse, fade-out on death, jetpack battery.
- Rumble-only fallback (
Gamepad.SetMotorSpeeds) for Steam Input / XInput / other pads, with a one-time "disable Steam Input" tip when Steam Input is detected (not for plain Xbox pads). A connected DualSense is preferred over an Xbox (mirror) pad, and the backend only switches between two pads after 2 s of steady use.