Please select what you are reporting on:
Verse
What Type of Bug are you experiencing?
Verse
Summary
There is an issue when using multiple input trigger devices to listen to the same input action. If multiple input trigger devices have the same player registered, each device will propagate their PressedEvent multiple times. Additionally, when subscribing a function to the pressed event of an input trigger device, the function will be subscribed to that event for all devices, not just the one specified.
Ideally, each Input Trigger Device only propagates 1 PressedEvent per press of that input per device. Right now, a PressedEvent is propagated once per number of InputDevices listening to that input, from each device.
Additionally, each Input Trigger Device should only propagate events to functions that are subscribed to that device. Right now, if multiple devices listen to the same input, its pressed events propagate to any function subscribed to the pressed event of anyof the devices
Steps to Reproduce
For this verse code:
@editable Trigger1: trigger_device = trigger_device{}
@editable InputTrigger1: input_trigger_device = input_trigger_device{}
@editable InputTrigger2: input_trigger_device = input_trigger_device{}
OnBegin<override>()<suspends>:void=
Trigger1.TriggeredEvent.Subscribe(OnTrigger)
OnTrigger(TriggeringAgent: ?agent): void =
if(ValidAgent:=TriggeringAgent?):
InputTrigger1.Register(ValidAgent)
InputTrigger2.Register(ValidAgent)
InputTrigger1.PressedEvent.Subscribe(OnTrigger1)
InputTrigger2.PressedEvent.Subscribe(OnTrigger2)
OnTrigger1(PressingAgent:agent): void=
Print("Trigger1 Activated!")
OnTrigger2(PressingAgent:agent): void=
Print("Trigger2 Activated!")
- Create a map with the above custom verse device
- Add a trigger device, and 2 input trigger devices, and set them as editables on debug_device
- Ensure both input trigger devices are listening for the same input
- Start game
- Activate trigger to register and subscribe the input trigger devices
- Activate the input the input trigger devices are looking for
- Observe 8 print statements
Similarly, for this verse code:
debug_device := class(creative_device):
@editable Trigger1: trigger_device = trigger_device{}
@editable InputTrigger1: input_trigger_device = input_trigger_device{}
@editable InputTrigger2: input_trigger_device = input_trigger_device{}
OnBegin<override>()<suspends>:void=
Trigger1.TriggeredEvent.Subscribe(OnTrigger)
OnTrigger(TriggeringAgent: ?agent): void =
if(ValidAgent:=TriggeringAgent?):
InputTrigger1.Register(ValidAgent)
InputTrigger2.Register(ValidAgent)
InputTrigger1.PressedEvent.Subscribe(OnTrigger1)
OnTrigger1(PressingAgent:agent): void=
Print("Trigger1 Activated!")
Results in 4 print statements, even though nothing is subscribing to the Trigger2 Pressed Event.
And finally for this verse code:
debug_device := class(creative_device):
@editable Trigger1: trigger_device = trigger_device{}
@editable InputTrigger1: input_trigger_device = input_trigger_device{}
@editable InputTrigger2: input_trigger_device = input_trigger_device{}
OnBegin<override>()<suspends>:void=
Trigger1.TriggeredEvent.Subscribe(OnTrigger)
OnTrigger(TriggeringAgent: ?agent): void =
if(ValidAgent:=TriggeringAgent?):
InputTrigger1.Register(ValidAgent)
InputTrigger1.PressedEvent.Subscribe(OnTrigger1)
OnTrigger1(PressingAgent:agent): void=
Print("Trigger1 Activated!")
Results in 1 print statement.
Expected Result
Each Input Trigger Device only propagates 1 PressedEvent per press of that input per device.
Each Input Trigger Device should only propagate events to functions that are subscribed to that device.
Observed Result
A PressedEvent is propagated once per number of InputDevices listening to that input, from each device.
If multiple devices listen to the same input, its pressed events propagate to any function subscribed to the pressed event of any of the devices.
Platform(s)
Windows
Additional Notes
I have a minimum reproduction project for this issue, as it is quite confusing to describe. If I can share a private version somehow, and that will be helpful, just let me know.