using Mirror; using OWML.Common; using QSB.API.Messages; using QSB.Messaging; using QSB.Player; using System; using System.Linq; using QSB.HUD; using QSB.HUD.Messages; using UnityEngine.Events; using UnityEngine; 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); public UnityEvent OnChatMessage() => MultiplayerHUDManager.OnChatMessageEvent; public void SendChatMessage(string message, bool systemMessage, Color color) { var fromName = systemMessage ? "QSB" : QSBPlayerManager.LocalPlayer.Name; new ChatMessage($"{fromName}: {message}", color).Send(); } } 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(); }