Untitled
unknown
csharp
3 years ago
6.6 kB
11
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...