overmelted/Assets/MenuInputManager.cs
2023-11-04 23:04:02 -04:00

85 lines
2.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Conjure.Input;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.UI;
using UnityEngine.InputSystem.Utilities;
using InputDevice = UnityEngine.InputSystem.InputDevice;
public class MenuInputManager : SerializedMonoBehaviour
{
[SerializeField, Required] private InputSystemUIInputModule inputSystemUIInputModule;
[SerializeField, Required] private InputServerReference inputServerReference;
// Start is called before the first frame update
void Start()
{
inputSystemUIInputModule.actionsAsset.devices = new ReadOnlyArray<InputDevice>();
}
public void OnJoin(int playerSeat)
{
if (inputSystemUIInputModule.actionsAsset.devices == null)
{
return;
}
InputManagerServer inputManagerServer = inputServerReference.Value.GetComponent<InputManagerServer>();
List<InputDevice> devices =
new List<InputDevice>(inputSystemUIInputModule.actionsAsset.devices.Value.ToArray());
PlayerEnum player = inputManagerServer.GetPlayerFromInt(playerSeat);
// shouldn't be reachable
if (player == PlayerEnum.None)
{
return;
}
InputDevice currentDevice = FindDeviceById(inputManagerServer.GetDeviceIdFromPlayerEnum(player));
// shouldn't be reachable
if (currentDevice is not null)
{
devices.Add(currentDevice);
}
inputSystemUIInputModule.actionsAsset.devices = new ReadOnlyArray<InputDevice>(devices.ToArray());
}
public void OnLeave(int playerSeat)
{
if (inputSystemUIInputModule.actionsAsset.devices == null)
{
return;
}
InputManagerServer inputManagerServer = inputServerReference.Value.GetComponent<InputManagerServer>();
if (playerSeat == 0 && inputManagerServer.GetNumberPlayers() == 0)
{
inputSystemUIInputModule.actionsAsset.devices = new ReadOnlyArray<InputDevice>();
return;
}
InputDevice currentDevice = FindDeviceById(inputManagerServer.GetDeviceIdFromPlayerEnum(PlayerEnum.Player1));
inputSystemUIInputModule.actionsAsset.devices = new ReadOnlyArray<InputDevice>(new []{currentDevice});
}
private InputDevice FindDeviceById(int deviceId)
{
foreach (InputDevice currentDevice in InputSystem.devices)
{
if (currentDevice.deviceId == deviceId)
{
return currentDevice;
}
}
return null;
}
}