-
Notifications
You must be signed in to change notification settings - Fork 2
/
NetPlayerList.cs
140 lines (123 loc) · 4.66 KB
/
NetPlayerList.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
using System;
using System.Collections.Generic;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.UI;
public class NetPlayerList : NetworkBehaviour
{
public static NetPlayerList instance { get; private set; }
[SerializeField]
public TMP_Text LobbyText;
private Dictionary<ulong, bool> m_ClientsInLobby;
private string m_UserLobbyStatusText;
public Dictionary<ulong, NetworkBicycle> players;
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
m_ClientsInLobby = new Dictionary<ulong, bool>();
players = new Dictionary<ulong, NetworkBicycle>();
}
public override void OnNetworkSpawn()
{
// m_ClientsInLobby = new Dictionary<ulong, bool>();
//Always add ourselves to the list at first
m_ClientsInLobby.Add(NetworkManager.LocalClientId, false);
//If we are hosting, then handle the server side for detecting when clients have connected
//and when their lobby scenes are finished loading.
if (IsServer)
{
//Server will be notified when a client connects
NetworkManager.OnClientConnectedCallback += OnClientConnectedCallback;
NetworkManager.OnClientDisconnectCallback += OnClientDisconnectCallback;
UpdateAndCheckPlayersInLobby();
}
//Update our lobby
GenerateUserStatsForLobby();
}
private void OnGUI()
{
if (LobbyText != null) LobbyText.text = m_UserLobbyStatusText;
}
private void GenerateUserStatsForLobby()
{
m_UserLobbyStatusText = string.Empty;
foreach (var clientLobbyStatus in m_ClientsInLobby)
{
if (players.ContainsKey(clientLobbyStatus.Key))
{
Debug.Log("Key is " + clientLobbyStatus.Key + " Value is " + players[clientLobbyStatus.Key].playerName.Value);
m_UserLobbyStatusText += $"{clientLobbyStatus.Key}: {players[clientLobbyStatus.Key].playerName.Value}\n";
}
/*
if (IsLocalPlayer)
{
m_UserLobbyStatusText += PlayerPrefs.GetString("BikerName") + "\n";
}*/
// m_UserLobbyStatusText += networkBicyle.nameTag.GetComponent<TextMeshPro>().text;
}
}
/// <summary>
/// UpdateAndCheckPlayersInLobby
/// Checks to see if we have at least 2 or more people to start
/// </summary>
private void UpdateAndCheckPlayersInLobby()
{
foreach (var clientLobbyStatus in m_ClientsInLobby)
{
SendClientReadyStatusUpdatesClientRpc(clientLobbyStatus.Key); // clientLobbyStatus.Value);
}
}
/// <summary>
/// OnClientConnectedCallback
/// Since we are entering a lobby and Netcode's NetworkManager is spawning the player,
/// the server can be configured to only listen for connected clients at this stage.
/// </summary>
private void OnClientConnectedCallback(ulong clientId)
{
if (IsServer)
{
if (!m_ClientsInLobby.ContainsKey(clientId))
{
Debug.Log("Client added to lobby on Server " + clientId.ToString());
m_ClientsInLobby.Add(clientId, false);
}
GenerateUserStatsForLobby();
UpdateAndCheckPlayersInLobby();
}
}
private void OnClientDisconnectCallback(ulong clientId)
{
if (IsServer)
{
if (m_ClientsInLobby.ContainsKey(clientId)) m_ClientsInLobby.Remove(clientId);
Debug.Log("Removed: " + clientId);
m_UserLobbyStatusText = "";
GenerateUserStatsForLobby();
UpdateAndCheckPlayersInLobby();
}
}
/// <summary>
/// SendClientReadyStatusUpdatesClientRpc
/// Sent from the server to the client when a player's status is updated.
/// This also populates the connected clients' (excluding host) player state in the lobby
/// </summary>
/// <param name="clientId"></param>
[ClientRpc]
// private void SendClientReadyStatusUpdatesClientRpc(ulong clientId, bool isReady)
private void SendClientReadyStatusUpdatesClientRpc(ulong clientId)
{
if (!IsServer)
{
if (!m_ClientsInLobby.ContainsKey(clientId))
{
Debug.Log("Client added to lobby on client " + clientId.ToString());
m_ClientsInLobby.Add(clientId, false);
}
GenerateUserStatsForLobby();
}
}
}