thatumi-DualSenseHaptics icon

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.

Last updated an hour ago
Total downloads 4
Total rating 0 
Categories Tweaks & Quality Of Life Client-side Tools AI Generated
Dependency string thatumi-DualSenseHaptics-0.2.3
Dependants 0 other packages depend on this package

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2100 icon
BepInEx-BepInExPack

BepInEx pack for Mono Unity games. Preconfigured and ready to use.

Preferred version: 5.4.2100

README

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 says gyro: 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, Config version (internal) on, Auto, 0.8, off, 2
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, set Backend = 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.

Bug report/requests:

thatumi on Discord