Untitled
unknown
csharp
2 years ago
6.6 kB
6
Indexable
using System; using System.Collections; using System.Collections.Generic; using Unity.Netcode; using Unity.Services.Authentication; using UnityEngine; using UnityEngine.SceneManagement; public class PmGameMultiplayer : NetworkBehaviour { public const int MAX_PLAYER_AMOUNT = 8; private const string PLAYER_PREFS_PLAYER_NAME_MULTIPLAYER = "PlayerNameMultiplayer"; public static PmGameMultiplayer Instance { get; private set; } public static bool playMultiplayer = true; public event EventHandler OnTryingToJoinGame; public event EventHandler OnFailedToJoinGame; public event EventHandler OnPlayerDataNetworkListChanged; [SerializeField] private List<Color> playerColorList; public NetworkList<PlayerData> playerDataNetworkList; private string playerName; //public GameObject[] lobbyReadyPlayers; private void Awake() { Instance = this; DontDestroyOnLoad(gameObject); playerName = PlayerPrefs.GetString(PLAYER_PREFS_PLAYER_NAME_MULTIPLAYER, "PlayerName" + UnityEngine.Random.Range(100, 1000)); playerDataNetworkList = new NetworkList<PlayerData>(); playerDataNetworkList.OnListChanged += PlayerDataNetworkList_OnListChanged; } private void Start() { if (!playMultiplayer) { // Singleplayer StartHost(); Loader.LoadNetwork(Loader.Scene.GameScene); } } public string GetPlayerName() { return playerName; } public void SetPlayerName(string playerName) { this.playerName = playerName; PlayerPrefs.SetString(PLAYER_PREFS_PLAYER_NAME_MULTIPLAYER, playerName); } private void PlayerDataNetworkList_OnListChanged(NetworkListEvent<PlayerData> changeEvent) { OnPlayerDataNetworkListChanged?.Invoke(this, EventArgs.Empty); } public void StartHost() { NetworkManager.Singleton.ConnectionApprovalCallback += NetworkManager_ConnectionApprovalCallback; NetworkManager.Singleton.OnClientConnectedCallback += NetworkManager_OnClientConnectedCallback; NetworkManager.Singleton.OnClientDisconnectCallback += NetworkManager_Server_OnClientDisconnectCallback; NetworkManager.Singleton.StartHost(); } private void NetworkManager_Server_OnClientDisconnectCallback(ulong clientId) { for (int i = 0; i < playerDataNetworkList.Count; i++) { PlayerData playerData = playerDataNetworkList[i]; if (playerData.clientId == clientId) { // Disconnected! playerDataNetworkList.RemoveAt(i); } } } private void NetworkManager_OnClientConnectedCallback(ulong clientId) { playerDataNetworkList.Add(new PlayerData { clientId = clientId, }); SetPlayerNameServerRpc(GetPlayerName()); SetPlayerIdServerRpc(AuthenticationService.Instance.PlayerId); } private void NetworkManager_ConnectionApprovalCallback(NetworkManager.ConnectionApprovalRequest connectionApprovalRequest, NetworkManager.ConnectionApprovalResponse connectionApprovalResponse) { if (SceneManager.GetActiveScene().name != Loader.Scene.LobbyReadyScene.ToString()) { connectionApprovalResponse.Approved = false; return; } if (NetworkManager.Singleton.ConnectedClientsIds.Count >= MAX_PLAYER_AMOUNT) { connectionApprovalResponse.Approved = false; return; } connectionApprovalResponse.Approved = true; } public void StartClient() { OnTryingToJoinGame?.Invoke(this, EventArgs.Empty); NetworkManager.Singleton.OnClientDisconnectCallback += NetworkManager_Client_OnClientDisconnectCallback; NetworkManager.Singleton.OnClientConnectedCallback += NetworkManager_Client_OnClientConnectedCallback; NetworkManager.Singleton.StartClient(); } private void NetworkManager_Client_OnClientConnectedCallback(ulong clientId) { SetPlayerNameServerRpc(GetPlayerName()); SetPlayerIdServerRpc(AuthenticationService.Instance.PlayerId); } [ServerRpc(RequireOwnership = false)] private void SetPlayerNameServerRpc(string playerName, ServerRpcParams serverRpcParams = default) { int playerDataIndex = GetPlayerDataIndexFromClientId(serverRpcParams.Receive.SenderClientId); PlayerData playerData = playerDataNetworkList[playerDataIndex]; playerData.playerName = playerName; playerDataNetworkList[playerDataIndex] = playerData; MinigameScoreTracker.Instance.SetPlayerNameServerRpc(playerName, serverRpcParams.Receive.SenderClientId); } [ServerRpc(RequireOwnership = false)] private void SetPlayerIdServerRpc(string playerId, ServerRpcParams serverRpcParams = default) { int playerDataIndex = GetPlayerDataIndexFromClientId(serverRpcParams.Receive.SenderClientId); PlayerData playerData = playerDataNetworkList[playerDataIndex]; playerData.playerId = playerId; playerDataNetworkList[playerDataIndex] = playerData; } private void NetworkManager_Client_OnClientDisconnectCallback(ulong clientId) { OnFailedToJoinGame?.Invoke(this, EventArgs.Empty); } public bool IsPlayerIndexConnected(int playerIndex) { return playerIndex < playerDataNetworkList.Count; } public int GetPlayerDataIndexFromClientId(ulong clientId) { for (int i = 0; i < playerDataNetworkList.Count; i++) { if (playerDataNetworkList[i].clientId == clientId) { return i; } } return -1; } public PlayerData GetPlayerDataFromClientId(ulong clientId) { foreach (PlayerData playerData in playerDataNetworkList) { if (playerData.clientId == clientId) { return playerData; } } return default; } public PlayerData GetPlayerData() { return GetPlayerDataFromClientId(NetworkManager.Singleton.LocalClientId); } public PlayerData GetPlayerDataFromPlayerIndex(int playerIndex) { return playerDataNetworkList[playerIndex]; } }
Editor is loading...