using System; using System.Linq; using OWML.Common; using QSB.API.Messages; using QSB.Messaging; using QSB.Player; using UnityEngine.Events; namespace QSB.API; public class QSBAPI : IQSBAPI { public void RegisterRequiredForAllPlayers(IModBehaviour mod) { var uniqueName = mod.ModHelper.Manifest.UniqueName; QSBCore.Addons.Add(uniqueName, mod); } public bool GetIsHost() => QSBCore.IsHost; public bool GetIsInMultiplayer() => QSBCore.IsInMultiplayer; public UnityEvent OnStartHost() => QSBAPIEvents.OnStartHostEvent; public UnityEvent OnStopHost() => QSBAPIEvents.OnStopHostEvent; public uint GetLocalPlayerID() => QSBPlayerManager.LocalPlayerId; public string GetPlayerName(uint playerId) => QSBPlayerManager.GetPlayer(playerId).Name; public uint[] GetPlayerIDs() => QSBPlayerManager.PlayerList.Select(x => x.PlayerId).ToArray(); public UnityEvent OnPlayerJoin() => QSBAPIEvents.OnPlayerJoinEvent; public UnityEvent OnPlayerLeave() => QSBAPIEvents.OnPlayerLeaveEvent; public UnityEvent OnLocalJoin() => QSBAPIEvents.OnLocalJoinEvent; public UnityEvent OnLocalLeave() => QSBAPIEvents.OnLocalLeaveEvent; public UnityEvent OnPeerJoin() => QSBAPIEvents.OnPeerJoinEvent; public UnityEvent OnPeerLeave() => QSBAPIEvents.OnPeerLeaveEvent; public void SetCustomData(uint playerId, string key, T data) => QSBPlayerManager.GetPlayer(playerId).SetCustomData(key, data); public T GetCustomData(uint playerId, string key) => QSBPlayerManager.GetPlayer(playerId).GetCustomData(key); public void SendMessage(string messageType, T data, uint to = uint.MaxValue, bool receiveLocally = false) => new AddonDataMessage(messageType, data, receiveLocally) { To = to }.Send(); public void RegisterHandler(string messageType, Action handler) => AddonDataManager.RegisterHandler(messageType, handler); } internal static class QSBAPIEvents { static QSBAPIEvents() { QSBPlayerManager.OnAddPlayer += (player) => { OnPlayerJoinEvent.Invoke(player.PlayerId); if (player.IsLocalPlayer) { OnLocalJoinEvent.Invoke(); } else { OnPeerJoinEvent.Invoke(player.PlayerId); } }; QSBPlayerManager.OnRemovePlayer += (player) => { OnPlayerLeaveEvent.Invoke(player.PlayerId); if (player.IsLocalPlayer) { OnLocalLeaveEvent.Invoke(); } else { OnPeerLeaveEvent.Invoke(player.PlayerId); } }; } internal class PlayerEvent : UnityEvent { } internal static PlayerEvent OnPlayerJoinEvent = new(); internal static PlayerEvent OnPlayerLeaveEvent = new(); internal static UnityEvent OnLocalJoinEvent = new(); internal static UnityEvent OnLocalLeaveEvent = new(); internal static PlayerEvent OnPeerJoinEvent = new(); internal static PlayerEvent OnPeerLeaveEvent = new(); internal static UnityEvent OnStartHostEvent = new(); internal static UnityEvent OnStopHostEvent = new(); }