RoomManager.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Threading.Channels;
  7. using ProtoDataBuff;
  8. using CSharpUtil;
  9. using MultiDup;
  10. namespace BattleRoom
  11. {
  12. /// <summary>
  13. /// 房间管理者, 负责 将连接上来的客户端转移到房间中
  14. /// </summary>
  15. internal class RoomManager : Singleton<RoomManager>
  16. {
  17. /// <summary>
  18. /// 服务器间的连接
  19. /// </summary>
  20. public ServerPeer ServerPeer;
  21. /// <summary>
  22. /// 客户端
  23. /// </summary>
  24. public Dictionary<int, Peer> ClientPeers = new Dictionary<int, Peer>();
  25. /// <summary>
  26. /// 消息分发
  27. /// </summary>
  28. private Dictionary<eProtocalCommand, Action<int, sSocketData>> callbacks = new Dictionary<eProtocalCommand, Action<int, sSocketData>>();
  29. /// <summary>
  30. /// 客户端消息队列
  31. /// </summary>
  32. public Channel<KeyValuePair<int, sSocketData>> MsgChannel = Channel.CreateBounded<KeyValuePair<int, sSocketData>>(1000);
  33. /// <summary>
  34. /// 房间列表
  35. /// </summary>
  36. Dictionary<int, Room> roomDic = new Dictionary<int, Room>();
  37. public RoomManager()
  38. {
  39. this.callbacks.Add(eProtocalCommand.CsBtLogin, On_BtLogin);
  40. this.callbacks.Add(eProtocalCommand.CsLeaveRoom, On_Leave);
  41. var t = Task.Run(MsgLoop);
  42. }
  43. private object lock_peers = new object();
  44. public void AddPeer(Peer p)
  45. {
  46. lock (lock_peers)
  47. {
  48. this.ClientPeers.Add(p.Id, p);
  49. Console.WriteLine(p.UID + " 连接上来了!");
  50. }
  51. }
  52. public void RemovePeer(int peerId)
  53. {
  54. lock (lock_peers)
  55. {
  56. if (this.ClientPeers.ContainsKey(peerId))
  57. {
  58. this.ClientPeers.Remove(peerId);
  59. }
  60. }
  61. }
  62. public void OnNewPeerConnected(Peer peer)
  63. {
  64. AddPeer(peer);
  65. }
  66. /// <summary>
  67. /// 进入大厅(登陆自己的uid)
  68. /// </summary>
  69. /// <param name="data"></param>
  70. void On_BtLogin(int peerId, sSocketData data)
  71. {
  72. var msg = CS_BT_Login.Parser.ParseFrom(data._data);
  73. if (this.ClientPeers.TryGetValue(peerId, out var peer))
  74. {
  75. roomDic.Values.ToList().ForEach(r => {
  76. if (r.PlayerUids.Contains(msg.Uid))
  77. {
  78. peer.room = r; // 设置自己的room
  79. r.AddPeer(peer);
  80. }
  81. });
  82. peer.Properties.Add(PropertyName.Uid, msg.Uid);
  83. peer.Properties.Add(PropertyName.Zoneid, msg.Zoneid);
  84. peer.CurrentState = ClientState.InGame;
  85. peer.SendEvent(eProtocalCommand.ScBtLogin, new SC_BT_Login() { });
  86. }
  87. }
  88. /// <summary>
  89. /// 创建一个房间(副本)
  90. /// </summary>
  91. /// <param name="data"></param>
  92. public void CreateRoom(sSocketData data)
  93. {
  94. var msg = SS_CreateBattleServer.Parser.ParseFrom(data._data);
  95. var room = new Room(msg.RoomId, msg.PlayerUids);
  96. roomDic.Add(room.Id, room);
  97. ServerPeer.SendEvent(eProtocalCommand.SsCreateBattleRoomOk, new SS_CreateBattleServerOK() { });
  98. // todo: 建立玩家列表, 当玩家登录进来以后, 将其连接转入房间
  99. }
  100. /// <summary>
  101. /// 离开房间(战斗结束)
  102. /// </summary>
  103. /// <param name="data"></param>
  104. void On_Leave(int peerId, sSocketData data)
  105. {
  106. if (this.ClientPeers.TryGetValue(peerId, out var peer))
  107. {
  108. peer.SendEvent(eProtocalCommand.ScMdLeaveRoom, new SC_MD_LeaveRoom() { });
  109. peer.Close();
  110. }
  111. }
  112. async void MsgLoop()
  113. {
  114. while (true)
  115. {
  116. var msg = await MsgChannel.Reader.ReadAsync();
  117. if (callbacks.ContainsKey(msg.Value._protocallType))
  118. {
  119. callbacks[msg.Value._protocallType](msg.Key, msg.Value);
  120. }
  121. else
  122. {
  123. // 未找到消息处理逻辑
  124. }
  125. }
  126. }
  127. }
  128. }