You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.5 KiB

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityEngine.Networking;
  6. using Networking;
  7. namespace Networking.Client
  8. {
  9. [CreateAssetMenu(menuName = "Major Project/Networking/Client/OtherClientsList", order = 150)]
  10. public class ConnectedClients : ScriptableObject
  11. {
  12. #if UNITY_EDITOR
  13. [SerializeField]
  14. [Multiline]
  15. private string DevNotes;
  16. #endif
  17. /// <summary>
  18. /// All Clients which are Currently Connected;
  19. /// </summary>
  20. [SerializeField]
  21. public List<ClientData> AllClients;
  22. /// <summary>
  23. /// Called when a client connects or disconnet
  24. /// </summary>
  25. public System.Action<List<ClientData>> OnClientsChange;
  26. public void SetUp(ClientObject client)
  27. {
  28. Reset();
  29. client.client.RegisterHandler(LoginProtocols.OtherClientConnected, OnClientConnect);
  30. client.client.RegisterHandler(LoginProtocols.OtherClientDisconnected, OnClientDisconnect);
  31. }
  32. public void Reset()
  33. {
  34. AllClients = new List<ClientData>();
  35. OnClientsChange?.Invoke(AllClients);
  36. }
  37. public void OnClientConnect(NetworkMessage msg)
  38. {
  39. LoginProtocols.LoginMsg loginMsg;
  40. if (!msg.TryRead(out loginMsg))
  41. return;
  42. AllClients.Add(new ClientData(loginMsg));
  43. OnClientsChange?.Invoke(AllClients);
  44. }
  45. public void OnClientDisconnect(NetworkMessage msg)
  46. {
  47. LoginProtocols.LoginMsg loginMsg;
  48. if (!msg.TryRead(out loginMsg))
  49. return;
  50. AllClients.RemoveAll(p => (p.Name == loginMsg.Name) && (p.Color == loginMsg.Color) && (p.characterAnimal == loginMsg.Animal));
  51. OnClientsChange?.Invoke(AllClients);
  52. }
  53. }
  54. [System.Serializable]
  55. public class ClientData
  56. {
  57. /// <summary>
  58. /// Client Name
  59. /// </summary>
  60. public string Name;
  61. /// <summary>
  62. /// Color which represents player, picked by player
  63. /// </summary>
  64. public Color Color;
  65. /// <summary>
  66. /// Clients character animal - needed for instantiation
  67. /// </summary>
  68. public string characterAnimal = "Bear";
  69. public ClientData(LoginProtocols.LoginMsg msg)
  70. {
  71. this.Name = msg.Name;
  72. this.Color = msg.Color;
  73. this.characterAnimal = msg.Animal;
  74. }
  75. }
  76. }