using Mirror; using OWML.Common; using QSB.API.Messages; using QSB.Messaging; using QSB.Player; using System; using System.Linq; 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 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 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.GetStableHashCode(), data, receiveLocally) { To = to }.Send(); public void RegisterHandler(string messageType, Action handler) => AddonDataManager.RegisterHandler(messageType.GetStableHashCode(), handler); } internal static class QSBAPIEvents { static QSBAPIEvents() { QSBPlayerManager.OnAddPlayer += player => OnPlayerJoinEvent.Invoke(player.PlayerId); QSBPlayerManager.OnRemovePlayer += player => OnPlayerLeaveEvent.Invoke(player.PlayerId); } internal class PlayerEvent : UnityEvent { } internal static readonly PlayerEvent OnPlayerJoinEvent = new(); internal static readonly PlayerEvent OnPlayerLeaveEvent = new(); }