Advertisement
Guest User

Untitled

a guest
Nov 28th, 2022
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.06 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityEngine.Events;
  6. using UnityEngine.SceneManagement;
  7. using PlayFab;
  8. using PlayFab.MultiplayerAgent.Model;
  9. using Mirror;
  10.  
  11.  
  12. public class NetworkManagerLobby : NetworkManager {
  13.  
  14. [SerializeField] private int minPlayers = 2;
  15. [Scene] [SerializeField] private string menuScene = string.Empty;
  16. [Scene] [SerializeField] private string mapScene = string.Empty;
  17.  
  18. [SerializeField] private NetworkRoomPlayer roomPlayerPrefab = default;
  19.  
  20. [SerializeField] private NetworkInGamePlayer inGamePlayerPrefab = default;
  21. [SerializeField] private GameObject playerSpawnSystem = default;
  22. public string PlayerSide = "";
  23. [SerializeField] public string whichSideLost = "";
  24.  
  25. public static NetworkManagerLobby Instance { get; private set; }
  26. //event Action nie działa tutaj
  27. public PlayerEvent OnPlayerAdded = new PlayerEvent();
  28. public PlayerEvent OnPlayerRemoved = new PlayerEvent();
  29.  
  30. public class PlayerEvent : UnityEvent<string> { }
  31.  
  32. public static event Action OnClientConnected;
  33. public static event Action OnClientDisconnected;
  34. public static event Action OnLobbyIsReady;
  35. public static event Action OnServerNotReady;
  36. public static event EventHandler<OnPlayerSpawnArgs> OnServerReadied;
  37. public static event Action OnGameWon;
  38. public static event Action OnGameLost;
  39.  
  40. public List<NetworkRoomPlayer> RoomPlayers = new List<NetworkRoomPlayer>();
  41. public List<NetworkInGamePlayer> InGamePlayers = new List<NetworkInGamePlayer>();
  42. public List<NetworkIdentity> PlayersLoadedToScene = new List<NetworkIdentity>();
  43. public List<PlayerConnection> playerConnections = new List<PlayerConnection>();
  44.  
  45. public string connType = "remoteServer";
  46.  
  47. public override void Awake()
  48. {
  49. base.Awake();
  50. Instance = this;
  51. NetworkServer.RegisterHandler<AuthenticateMessage>(OnReceiveAuthenticateMessage);
  52. OnServerNotReady += OnApplicationQuit;
  53. UnitStats.onWinConditionMet += OnGameEnd;
  54. }
  55. //jak wywali na lokal to nie da sie znowu shostować
  56. public override void OnApplicationQuit()
  57. {
  58. NetworkServer.Shutdown();
  59. base.OnApplicationQuit();
  60. }
  61.  
  62. private void OnReceiveAuthenticateMessage(NetworkConnection nconn, AuthenticateMessage message) {
  63. Debug.Log("Authenticate message received--------------------------------PlayfabId: " + message.PlayfabId);
  64. var conn = Instance.playerConnections.Find(c => c.ConnectionId == nconn.connectionId);
  65. if(conn == null) {
  66. conn.PlayfabId = message.PlayfabId;
  67. conn.Authenticated = true;
  68. OnPlayerAdded.Invoke(message.PlayfabId);
  69. }
  70. }
  71.  
  72. public override void OnStartServer() => spawnPrefabs = Resources.LoadAll<GameObject>("SpawnablePrefabs").ToList();
  73. //możliwy podział OnStartClient, OnClientConnect i OnClientDisconnect do osobnego NetworkManagera
  74. //komunikacja zamiast Event przy użyciu messages
  75. public override void OnStartClient() {
  76. var spawnablePrefabs = Resources.LoadAll<GameObject>("SpawnablePrefabs");
  77.  
  78. foreach (var prefab in spawnablePrefabs)
  79. {
  80. NetworkClient.RegisterPrefab(prefab);
  81. }
  82. }
  83. //Ewentualnie do zmiany Invoke jeżeli będzie podzial NetworkManagera na klienta i serwer
  84. public override void OnClientConnect() {
  85. Debug.Log("Client connected-------------------------");
  86. base.OnClientConnect();
  87. OnClientConnected?.Invoke();
  88. }
  89.  
  90. public override void OnClientDisconnect() {
  91. base.OnClientDisconnect();
  92.  
  93. OnClientDisconnected?.Invoke();
  94. }
  95. //odpowiedź serwera na połączenie klienta
  96. public override void OnServerConnect(NetworkConnectionToClient conn) {
  97. Debug.Log("Client connected-------------------------");
  98. if(numPlayers >= maxConnections) {
  99. conn.Disconnect();
  100. return;
  101. }
  102.  
  103. if (SceneManager.GetActiveScene().path != menuScene) {
  104. conn.Disconnect();
  105. return;
  106. }
  107.  
  108. var playerConn = Instance.playerConnections.Find(c => c.ConnectionId == conn.connectionId);
  109. //customowe atrybuty połączenia do listy połączeń
  110. if(playerConn == null) {
  111. Instance.playerConnections.Add(new PlayerConnection() {
  112. Connection = conn,
  113. ConnectionId = conn.connectionId,
  114. LobbyId = PlayFabMultiplayerAgentAPI.SessionConfig.SessionId
  115. });
  116. }
  117. }
  118.  
  119. public override void OnServerAddPlayer(NetworkConnectionToClient conn) {
  120. Debug.Log("Player added on server------------------------- Scene: " + SceneManager.GetActiveScene().path);
  121. if (SceneManager.GetActiveScene().path == menuScene) {
  122.  
  123. NetworkRoomPlayer roomPlayerInstance = Instantiate(roomPlayerPrefab);
  124.  
  125. NetworkServer.AddPlayerForConnection(conn, roomPlayerInstance.gameObject);
  126. //klient nie może tego dodać, musi to być serwer, OnServerRemovePlayer powinien usuwać ale nie wiem jak dać call dla ClientScene.RemovePlayer().
  127. if(Instance.connType == "remoteServer") {
  128. Instance.RoomPlayers.Add(conn.identity.GetComponent<NetworkRoomPlayer>());
  129. }
  130.  
  131. Debug.Log("Player added for connection, player count-------------------------" + Instance.RoomPlayers.Count.ToString());
  132. Debug.Log("List of players-------------------------");
  133. foreach(NetworkRoomPlayer rplayer in Instance.RoomPlayers) {
  134. Debug.Log(rplayer.DisplayName);
  135. }
  136. }
  137. if (SceneManager.GetActiveScene().name == "AfterGameScene") {
  138.  
  139. var inGamePlayer = Instantiate(inGamePlayerPrefab);
  140. NetworkServer.AddPlayerForConnection(conn, inGamePlayer.gameObject);
  141. }
  142. }
  143. //uusnięcie obiektu gracza i połączenia z listy przy evencie rozłączenia
  144. public override void OnServerDisconnect(NetworkConnectionToClient conn) {
  145. if(conn.identity != null) {
  146. var player = conn.identity.GetComponent<NetworkRoomPlayer>();
  147.  
  148. Instance.RoomPlayers.Remove(player);
  149.  
  150. NotifyPlayersOfReadyState();
  151. }
  152. var playerConn = playerConnections.Find(c => c.ConnectionId == conn.connectionId);
  153.  
  154. if(playerConn != null) {
  155. if(!string.IsNullOrEmpty(playerConn.PlayfabId)) {
  156. OnPlayerRemoved.Invoke(playerConn.PlayfabId);
  157. }
  158. Instance.playerConnections.Remove(playerConn);
  159. }
  160. base.OnServerDisconnect(conn);
  161. }
  162. //wyczyszczenie listy na wypadek gdy serwer sie wywali
  163. public override void OnStopServer() {
  164. Instance.RoomPlayers.Clear();
  165. }
  166. //można zmienić przycisk na countdown, na razie do testowania przycisk jest ok
  167. public void NotifyPlayersOfReadyState() {
  168.  
  169. }
  170. //dobry check na akceptacje meczu, można dać OnApplicationQuit() NetworkServer.Shutdown() jeżeli nie będzie ready w odpowiednim czasie i powrócić do menu
  171. public bool IsReadyToStart() {
  172. if (Instance.numPlayers < Instance.minPlayers) {
  173. return false;
  174. }
  175.  
  176. foreach (var player in Instance.RoomPlayers) {
  177. if (!player.IsReady) { return false; }
  178. }
  179.  
  180. return true;
  181. }
  182.  
  183. public override void ServerChangeScene(string mapName)
  184. {
  185. if (SceneManager.GetActiveScene().path == menuScene)
  186. {
  187. for (int i = Instance.RoomPlayers.Count - 1; i >= 0; i--)
  188. {
  189. var conn = Instance.RoomPlayers[i].connectionToClient;
  190. var playerConn = Instance.playerConnections.Find(c => c.Connection == conn);
  191. playerConn.ConnectionToClient = conn;
  192. Debug.Log(conn);
  193. if (playerConn != null)
  194. {
  195. playerConn.inGamePlayerId = i;
  196. }
  197. else
  198. {
  199. Instance.playerConnections.Add(new PlayerConnection()
  200. {
  201. Connection = conn,
  202. ConnectionId = conn.connectionId,
  203. inGamePlayerId = i,
  204. });
  205. }
  206. }
  207. }
  208. base.ServerChangeScene(mapName);
  209. }
  210.  
  211. //zmiana sceny po ready check
  212. public void StartGame() {
  213. if(SceneManager.GetActiveScene().path == menuScene) {
  214. if(!IsReadyToStart()) { return; }
  215.  
  216. ServerChangeScene("Map");
  217. }
  218. }
  219.  
  220. //po zmianie sceny spawn graczy, tutaj można też dodać cooldown na spawn minionów itp.
  221. public override void OnServerSceneChanged(string newSceneName)
  222. {
  223. if(newSceneName.StartsWith("Map")) {
  224. GameObject playerSpawnSystemInstance = Instantiate(playerSpawnSystem);
  225. NetworkServer.Spawn(playerSpawnSystemInstance);
  226. }
  227. }
  228.  
  229. private void OnGameEnd() {
  230.  
  231.  
  232. ServerChangeScene("AfterGameScene");
  233. }
  234.  
  235. public override void OnServerReady(NetworkConnectionToClient conn)
  236. {
  237. base.OnServerReady(conn);
  238. OnServerReadied?.Invoke(Instance, new OnPlayerSpawnArgs(Instance.playerConnections.Find(c => c.Connection == conn).inGamePlayerId, conn));
  239. }
  240. }
  241.  
  242. [Serializable]
  243. public class PlayerConnection {
  244. public bool Authenticated;
  245. public string PlayfabId;
  246. public string LobbyId;
  247. public int ConnectionId;
  248. public NetworkConnection Connection;
  249. public NetworkConnectionToClient ConnectionToClient;
  250. public int inGamePlayerId;
  251. }
  252. //musi być struct bo NonNullable
  253. public struct AuthenticateMessage : NetworkMessage {
  254. public string PlayfabId;
  255. }
  256.  
  257. public class OnPlayerSpawnArgs : EventArgs
  258. {
  259. public int PlayerId;
  260. public NetworkConnectionToClient conn;
  261.  
  262. public OnPlayerSpawnArgs(int playerId, NetworkConnectionToClient networkConnectionToClient) {
  263. PlayerId = playerId;
  264. conn = networkConnectionToClient;
  265. }
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement