Input Action System (IAS) misfires at random on the client (Server Authority)

The Input Action System seems to fire more than once on the client at random. The server is fine.

In the example, “GRAB STARTED” and “GRAB ENDED” should output in order each time. Sometimes, “GRAB STARTED” yields a bit before “GRAB ENDED” can run, otherwise “STARTED” will output either way.

Output on the server

Output on the client (Notice how there are extra inputs that don’t line up with the server’s output)

I havent tested if this is specific to server authority or if it also occurs on non-authorative games.

System info:
OS: Windows 11
CPU: Intel(R) Core™ Ultra 9 275HX
GPU: NVIDIA GeForce RTX 5070 Ti Laptop GPU
Memory: 16.0 GB DDR5

Reproduction RBXL: misfiringIAS.rbxl (348.5 KB)

Reproduction steps:

  1. Test the game.
  2. Press F on the block a few times (delay between the presses is recommended)
  3. Pay attention to the output. It might even error.

Expected behavior

The action presses should only fire once every press and should align with the server’s output.

1 Like

UPDATE: I was able to confirm that it does in-fact work as intended on the client. This seems to be a studio-exclusive bug.

This sounds like resimulation is re-firing the IAS events, which is intended behavior (inputs get replayed during resim so the simulation stays consistent). Can you attach a print statement to RunService.Misprediction and see if the client mispredicts before the IAS events fire again?

Edit: additionally, we recommend using InputAction:GetState() for the time being. See the docs for more details: Server authority model | Documentation - Roblox Creator Hub

1 Like

Hi, I’m experiencing the same issue.

I’m using:

inputs.Lights.Pressed:Connect(function()
    print("test")
end)

However, a single press sometimes fires the Pressed event 2 to 3 times. This makes it very difficult to test in Studio.

For actions like toggling lights or enabling sprint, polling InputAction:GetState() every frame just to detect a press feels like overkill. These are one-shot actions, so Pressed should ideally fire exactly once per key press.

Is anyone else experiencing this, or is there a known workaround?

For an easy workaround, put if not RunService:IsResimulating() then return end at the top of your connect function. This can cause mispredictions though, since your client won’t resimulate the results of the function

1 Like

Seems to have been the root cause. Although I’m not sure why the client would mispredict an input occuring on it’s own client where nothing happens, and I’d appreciate an explanation if you have the time. Until then, I think I’ll stick to using if not RunService:IsResimulating() then return end to resolve this issue. Thank you.

Edit: Also, here’s the print statement if you still need it for anything else, just in case;

2 Likes
inputs.Engine.Pressed:Connect(function()
	if not game:GetService("RunService"):IsResimulating() then
		print("miss")
		return
	end

	print("eh")
end)

Sometimes a single key press prints eh twice and miss, and other times it only prints miss . The behavior seems completely random and is very difficult to reproduce consistently.

Could this please be investigated?

The misprediction signal (see here) has information about which Instances mispredicted, and why. If you’ve got anything else going on in your game, it could be the cause of the mispredictions (even if it’s unrelated to the input you’re testing)

This is likely expected behavior (unless you’re seeing it in an empty baseplate). I also recommend using RunService.Misprediction to debug why you’re getting a rollback here