MultiDupServer.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. using System;
  2. using System.Net;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using MultiDup;
  8. internal class MultiDupServer : MonoSingleton<MultiDupServer>
  9. {
  10. public enum State
  11. {
  12. /// <summary>
  13. /// 未连接,需要初始化(后自动连接)
  14. /// </summary>
  15. UnConnected = 0,
  16. /// <summary>
  17. /// 已连接, 需要登录
  18. /// </summary>
  19. Connected = 1,
  20. /// <summary>
  21. /// 已完成登录
  22. /// </summary>
  23. InLobby = 1,
  24. /// <summary>
  25. /// 已登录, 可以上报伤害以及自己的剩余血量
  26. /// </summary>
  27. InBattleRoom = 2,
  28. /// <summary>
  29. /// 离开房间, 不可以继续上报伤害和剩余血量
  30. /// </summary>
  31. Leaved = 3
  32. }
  33. TasPBSocketManager lobbySocket, battleSocket; // 大厅/战斗 socket
  34. /// <summary>
  35. /// 当前状态
  36. /// </summary>
  37. public State CurrentState { get; private set; }
  38. /// <summary>
  39. /// 先初始化
  40. /// </summary>
  41. public void Init()
  42. {
  43. var ip = "192.168.10.17";
  44. if (GlobalConfig.netType == eNetType.Online || GlobalConfig.netType == eNetType.TestOnline)
  45. {
  46. var uri = "ylsjtt.game7000.com";
  47. IPHostEntry entry = Dns.GetHostEntry(uri);
  48. if (entry != null && entry.AddressList != null && entry.AddressList.Length > 0)
  49. {
  50. IPAddress addr = entry.AddressList[0]; //使用时使用AddressList[0]即可
  51. ip = addr.ToString();
  52. }
  53. }
  54. var port = 6004; // 多人副本端口
  55. lobbySocket = new TasPBSocketManager();
  56. lobbySocket.Connect(ip, port);
  57. // 挂载 服务端消息回调处理函数
  58. MessageCenter.Instance.addObsever(eProtocalCommand.ScMdEnterLobby, On_EnterLobby); // 进入大厅返回此消息
  59. MessageCenter.Instance.addObsever(eProtocalCommand.ScMdGetRoomList, On_UpdateRoomList);
  60. MessageCenter.Instance.addObsever(eProtocalCommand.ScMdCreateRoom, On_CreateRoom); // 创建房间成功
  61. MessageCenter.Instance.addObsever(eProtocalCommand.ScMdEnterRoom, On_EnterRoom);
  62. MessageCenter.Instance.addObsever(eProtocalCommand.ScMdBeginDup, On_Start);
  63. MessageCenter.Instance.addObsever(eProtocalCommand.ScMdLeaveRoom, On_LeaveGame);
  64. lobbySocket.OnConnected = () => EnterLobby();
  65. }
  66. #region 向服务端发送消息
  67. public void EnterLobby()
  68. {
  69. if (CurrentState == State.UnConnected)
  70. {
  71. var p = UserProxy.Instance.player;
  72. var msg = new CS_MD_EnterLobby() { Uid = p.uid, Zoneid = p.zoneid };
  73. lobbySocket.SendMsg(eProtocalCommand.CsMdEnterLobby, msg);
  74. LogHelper.Log("多人副本,发送登录大厅请求");
  75. }
  76. }
  77. /// <summary>
  78. /// 拉取房间列表
  79. /// </summary>
  80. public void GetRoomList(int mapId = 1)
  81. {
  82. UnityEngine.Debug.Assert(CurrentState == State.InLobby, $"当前状态不可以执行拉取房间列表操作,({CurrentState})");
  83. if (CurrentState == State.InLobby)
  84. {
  85. var p = UserProxy.Instance.player;
  86. var msg = new CS_MD_GetRoomList() { Uid = p.uid, Zoneid = p.zoneid };
  87. lobbySocket.SendMsg(eProtocalCommand.CsMdGetRoomList, msg);
  88. UnityEngine.Debug.Log("多人副本,发送拉取房间列表请求");
  89. }
  90. }
  91. /// <summary>
  92. /// 创建房间
  93. /// </summary>
  94. /// <param name="mapId">使用的地图编号</param>
  95. public void CreateRoom(int mapId = 1)
  96. {
  97. UnityEngine.Debug.Assert(CurrentState == State.InLobby, $"当前状态不可以执行创建房间操作,({CurrentState})");
  98. if (CurrentState == State.InLobby)
  99. {
  100. var p = UserProxy.Instance.player;
  101. var msg = new CS_MD_CreateRoom() { Uid = p.uid, Mapid = mapId, Zoneid = p.zoneid };
  102. lobbySocket.SendMsg(eProtocalCommand.CsMdCreateRoom, msg);
  103. UnityEngine.Debug.Log("多人副本,发送创建房间请求");
  104. }
  105. }
  106. /// <summary>
  107. /// 进入房间
  108. /// </summary>
  109. /// <param name="roomId">房间编号</param>
  110. public void EnterRoom(int roomId = 1)
  111. {
  112. UnityEngine.Debug.Assert(CurrentState == State.InLobby, $"当前状态不可以执行加入房间操作,({CurrentState})");
  113. if (CurrentState == State.InLobby)
  114. {
  115. var p = UserProxy.Instance.player;
  116. var msg = new CS_MD_EnterRoom() { Uid = p.uid, RoomId = roomId, Zoneid = p.zoneid };
  117. lobbySocket.SendMsg(eProtocalCommand.CsMdEnterRoom, msg);
  118. UnityEngine.Debug.Log("多人副本,发送创建房间请求");
  119. }
  120. }
  121. /// <summary>
  122. /// 开始游戏
  123. /// </summary>
  124. public void StartGame()
  125. {
  126. UnityEngine.Debug.Assert(CurrentState == State.InBattleRoom, $"当前状态不可以执行上报操作,({CurrentState})");
  127. if (CurrentState == State.InBattleRoom)
  128. {
  129. var p = UserProxy.Instance.player;
  130. var msg = new CS_MD_BeginDup() { Uid = p.uid, Zoneid = p.zoneid };
  131. lobbySocket.SendMsg(eProtocalCommand.CsMdBeginDup, msg); // 这里应该切换使用战场socket发送消息
  132. }
  133. }
  134. /// <summary>
  135. /// 上报退出房间
  136. /// </summary>
  137. public void LeaveGame()
  138. {
  139. var p = UserProxy.Instance.player;
  140. var msg = new CS_MD_LeaveRoom() { Uid = p.uid, Zoneid = p.zoneid };
  141. battleSocket.SendMsg(eProtocalCommand.CsLeaveRoom, msg); // 这里也是战场socket
  142. }
  143. #endregion
  144. #region 服务端消息回调
  145. public void On_EnterLobby(byte[] _data)
  146. {
  147. LogHelper.Log("进入大厅");
  148. CurrentState = State.InLobby; // 修改状态为处于大厅中
  149. }
  150. /// <summary>
  151. /// 成功连接到大厅/从战场返回大厅主动查询
  152. /// </summary>
  153. /// <param name="_data"></param>
  154. public void On_UpdateRoomList(byte[] _data)
  155. {
  156. var msg = SC_MD_GetRoomList.Parser.ParseFrom(_data);
  157. LogHelper.Log($"最新房间列表: {msg.RoomInfos.Count}");
  158. // todo : 转接客户端逻辑
  159. if (CurrentState == State.InLobby)
  160. {
  161. var lobby = new MultiDupProxy.LobbyInfo();
  162. msg.RoomInfos.ToList().ForEach(l =>
  163. // 倒腾着转移一下格式
  164. lobby.RoomList.Add(new MultiDupProxy.LobbyInfo.RoomInfo()
  165. {
  166. BattleServerAddress = l.Battleserver,
  167. MapId = l.Mapid,
  168. PlayerUids = l.PlayerUids.ToList(),
  169. RoomId = l.RoomId
  170. }));
  171. MultiDupProxy.Instance.Lobby = lobby;
  172. MultiDupProxy.Instance.__On_GetRoomListCallBack?.Invoke(lobby);
  173. }
  174. }
  175. /// <summary>
  176. /// 创建房间返回值
  177. /// </summary>
  178. /// <param name="_data"></param>
  179. public void On_CreateRoom(byte[] _data)
  180. {
  181. // 创建房间返回值
  182. var msg = SC_MD_CreateRoom.Parser.ParseFrom(_data);
  183. LogHelper.Log($"创建房间: {msg.RoomId} .");
  184. // todo : 转接客户端逻辑
  185. MultiDupProxy.Instance.__On_CreateRoomCallBack?.Invoke(msg); // 调用回调
  186. }
  187. /// <summary>
  188. /// 加入房间消息
  189. /// </summary>
  190. /// <param name="_data"></param>
  191. public void On_EnterRoom(byte[] _data)
  192. {
  193. var msg = SC_MD_EnterRoom.Parser.ParseFrom(_data);
  194. if (msg != null)
  195. {
  196. var p = UserProxy.Instance.player;
  197. if (msg.Uid == p.uid)
  198. {
  199. CurrentState = State.InBattleRoom;
  200. LogHelper.Log($"连接战斗服务器: {msg.Ip}:{msg.Port}.");
  201. MultiBattleProxy.Instance.Init(msg.Ip, msg.Port);
  202. LogHelper.Log($"您已成功进入房间: {msg.Mapid}.");
  203. }
  204. else
  205. {
  206. UnityEngine.Debug.Log($"{msg.Uid} 来了.");
  207. }
  208. MultiDupProxy.Instance.__On_EnterRoomCallback?.Invoke(msg);
  209. }
  210. else
  211. {
  212. LogHelper.Log($"加入房间消息解析失败");
  213. }
  214. }
  215. /// <summary>
  216. /// 开始副本战斗
  217. /// </summary>
  218. /// <param name="_data"></param>
  219. public void On_Start(byte[] _data)
  220. {
  221. // 多人副本开始战斗
  222. var msg = SC_MD_BeginDup.Parser.ParseFrom(_data);
  223. LogHelper.Log($"开始副本战斗: {msg} .");
  224. MultiDupProxy.Instance.OnStartGame?.Invoke(msg);
  225. // todo : 转接客户端逻辑
  226. }
  227. public void On_LeaveGame(byte[] _data)
  228. {
  229. var msg = SC_MD_LeaveRoom.Parser.ParseFrom(_data);
  230. LogHelper.Log($"玩家 {msg.Uid} 已经离开游戏!"); //
  231. // todo:转接客户端逻辑
  232. }
  233. public void _close()
  234. {
  235. MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdGetRoomList, On_UpdateRoomList); // 进入大厅返回此消息
  236. MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdCreateRoom, On_CreateRoom); // 创建房间成功
  237. MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdEnterRoom, On_EnterRoom);
  238. MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdBeginDup, On_Start);
  239. MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdLeaveRoom, On_LeaveGame);
  240. if (null != lobbySocket)
  241. {
  242. LogHelper.Log("销毁lobbySocket");
  243. lobbySocket.Close();
  244. lobbySocket = null;
  245. }
  246. }
  247. public void Update()
  248. {
  249. lobbySocket?.Update();
  250. //battleSocket?.Update();
  251. }
  252. private void OnDisable()
  253. {
  254. _close();
  255. }
  256. protected override void DoOnDestroy()
  257. {
  258. _close();
  259. }
  260. #endregion
  261. }