123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- using System;
- using System.Net;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using MultiDup;
- internal class MultiDupServer : MonoSingleton<MultiDupServer>
- {
- public enum State
- {
- /// <summary>
- /// 未连接,需要初始化(后自动连接)
- /// </summary>
- UnConnected = 0,
- /// <summary>
- /// 已连接, 需要登录
- /// </summary>
- Connected = 1,
- /// <summary>
- /// 已完成登录
- /// </summary>
- InLobby = 1,
- /// <summary>
- /// 已登录, 可以上报伤害以及自己的剩余血量
- /// </summary>
- InBattleRoom = 2,
- /// <summary>
- /// 离开房间, 不可以继续上报伤害和剩余血量
- /// </summary>
- Leaved = 3
- }
- TasPBSocketManager lobbySocket, battleSocket; // 大厅/战斗 socket
- /// <summary>
- /// 当前状态
- /// </summary>
- public State CurrentState { get; private set; }
- /// <summary>
- /// 先初始化
- /// </summary>
- public void Init()
- {
- var ip = "192.168.10.17";
- if (GlobalConfig.netType == eNetType.Online || GlobalConfig.netType == eNetType.TestOnline)
- {
- var uri = "ylsjtt.game7000.com";
- IPHostEntry entry = Dns.GetHostEntry(uri);
- if (entry != null && entry.AddressList != null && entry.AddressList.Length > 0)
- {
- IPAddress addr = entry.AddressList[0]; //使用时使用AddressList[0]即可
- ip = addr.ToString();
- }
- }
- var port = 6004; // 多人副本端口
- lobbySocket = new TasPBSocketManager();
- lobbySocket.Connect(ip, port);
- // 挂载 服务端消息回调处理函数
- MessageCenter.Instance.addObsever(eProtocalCommand.ScMdEnterLobby, On_EnterLobby); // 进入大厅返回此消息
- MessageCenter.Instance.addObsever(eProtocalCommand.ScMdGetRoomList, On_UpdateRoomList);
- MessageCenter.Instance.addObsever(eProtocalCommand.ScMdCreateRoom, On_CreateRoom); // 创建房间成功
- MessageCenter.Instance.addObsever(eProtocalCommand.ScMdEnterRoom, On_EnterRoom);
- MessageCenter.Instance.addObsever(eProtocalCommand.ScMdBeginDup, On_Start);
- MessageCenter.Instance.addObsever(eProtocalCommand.ScMdLeaveRoom, On_LeaveGame);
- lobbySocket.OnConnected = () => EnterLobby();
- }
- #region 向服务端发送消息
- public void EnterLobby()
- {
- if (CurrentState == State.UnConnected)
- {
- var p = UserProxy.Instance.player;
- var msg = new CS_MD_EnterLobby() { Uid = p.uid, Zoneid = p.zoneid };
- lobbySocket.SendMsg(eProtocalCommand.CsMdEnterLobby, msg);
- LogHelper.Log("多人副本,发送登录大厅请求");
- }
- }
- /// <summary>
- /// 拉取房间列表
- /// </summary>
- public void GetRoomList(int mapId = 1)
- {
- UnityEngine.Debug.Assert(CurrentState == State.InLobby, $"当前状态不可以执行拉取房间列表操作,({CurrentState})");
- if (CurrentState == State.InLobby)
- {
- var p = UserProxy.Instance.player;
- var msg = new CS_MD_GetRoomList() { Uid = p.uid, Zoneid = p.zoneid };
- lobbySocket.SendMsg(eProtocalCommand.CsMdGetRoomList, msg);
- UnityEngine.Debug.Log("多人副本,发送拉取房间列表请求");
- }
- }
- /// <summary>
- /// 创建房间
- /// </summary>
- /// <param name="mapId">使用的地图编号</param>
- public void CreateRoom(int mapId = 1)
- {
- UnityEngine.Debug.Assert(CurrentState == State.InLobby, $"当前状态不可以执行创建房间操作,({CurrentState})");
- if (CurrentState == State.InLobby)
- {
- var p = UserProxy.Instance.player;
- var msg = new CS_MD_CreateRoom() { Uid = p.uid, Mapid = mapId, Zoneid = p.zoneid };
- lobbySocket.SendMsg(eProtocalCommand.CsMdCreateRoom, msg);
- UnityEngine.Debug.Log("多人副本,发送创建房间请求");
- }
- }
- /// <summary>
- /// 进入房间
- /// </summary>
- /// <param name="roomId">房间编号</param>
- public void EnterRoom(int roomId = 1)
- {
- UnityEngine.Debug.Assert(CurrentState == State.InLobby, $"当前状态不可以执行加入房间操作,({CurrentState})");
- if (CurrentState == State.InLobby)
- {
- var p = UserProxy.Instance.player;
- var msg = new CS_MD_EnterRoom() { Uid = p.uid, RoomId = roomId, Zoneid = p.zoneid };
- lobbySocket.SendMsg(eProtocalCommand.CsMdEnterRoom, msg);
- UnityEngine.Debug.Log("多人副本,发送创建房间请求");
- }
- }
- /// <summary>
- /// 开始游戏
- /// </summary>
- public void StartGame()
- {
- UnityEngine.Debug.Assert(CurrentState == State.InBattleRoom, $"当前状态不可以执行上报操作,({CurrentState})");
- if (CurrentState == State.InBattleRoom)
- {
- var p = UserProxy.Instance.player;
- var msg = new CS_MD_BeginDup() { Uid = p.uid, Zoneid = p.zoneid };
- lobbySocket.SendMsg(eProtocalCommand.CsMdBeginDup, msg); // 这里应该切换使用战场socket发送消息
- }
- }
- /// <summary>
- /// 上报退出房间
- /// </summary>
- public void LeaveGame()
- {
- var p = UserProxy.Instance.player;
- var msg = new CS_MD_LeaveRoom() { Uid = p.uid, Zoneid = p.zoneid };
- battleSocket.SendMsg(eProtocalCommand.CsLeaveRoom, msg); // 这里也是战场socket
- }
- #endregion
- #region 服务端消息回调
- public void On_EnterLobby(byte[] _data)
- {
- LogHelper.Log("进入大厅");
- CurrentState = State.InLobby; // 修改状态为处于大厅中
- }
- /// <summary>
- /// 成功连接到大厅/从战场返回大厅主动查询
- /// </summary>
- /// <param name="_data"></param>
- public void On_UpdateRoomList(byte[] _data)
- {
- var msg = SC_MD_GetRoomList.Parser.ParseFrom(_data);
- LogHelper.Log($"最新房间列表: {msg.RoomInfos.Count}");
- // todo : 转接客户端逻辑
- if (CurrentState == State.InLobby)
- {
- var lobby = new MultiDupProxy.LobbyInfo();
- msg.RoomInfos.ToList().ForEach(l =>
- // 倒腾着转移一下格式
- lobby.RoomList.Add(new MultiDupProxy.LobbyInfo.RoomInfo()
- {
- BattleServerAddress = l.Battleserver,
- MapId = l.Mapid,
- PlayerUids = l.PlayerUids.ToList(),
- RoomId = l.RoomId
- }));
- MultiDupProxy.Instance.Lobby = lobby;
- MultiDupProxy.Instance.__On_GetRoomListCallBack?.Invoke(lobby);
- }
- }
- /// <summary>
- /// 创建房间返回值
- /// </summary>
- /// <param name="_data"></param>
- public void On_CreateRoom(byte[] _data)
- {
- // 创建房间返回值
- var msg = SC_MD_CreateRoom.Parser.ParseFrom(_data);
- LogHelper.Log($"创建房间: {msg.RoomId} .");
- // todo : 转接客户端逻辑
- MultiDupProxy.Instance.__On_CreateRoomCallBack?.Invoke(msg); // 调用回调
- }
- /// <summary>
- /// 加入房间消息
- /// </summary>
- /// <param name="_data"></param>
- public void On_EnterRoom(byte[] _data)
- {
- var msg = SC_MD_EnterRoom.Parser.ParseFrom(_data);
- if (msg != null)
- {
- var p = UserProxy.Instance.player;
- if (msg.Uid == p.uid)
- {
- CurrentState = State.InBattleRoom;
- LogHelper.Log($"连接战斗服务器: {msg.Ip}:{msg.Port}.");
- MultiBattleProxy.Instance.Init(msg.Ip, msg.Port);
- LogHelper.Log($"您已成功进入房间: {msg.Mapid}.");
- }
- else
- {
- UnityEngine.Debug.Log($"{msg.Uid} 来了.");
- }
- MultiDupProxy.Instance.__On_EnterRoomCallback?.Invoke(msg);
- }
- else
- {
- LogHelper.Log($"加入房间消息解析失败");
- }
- }
- /// <summary>
- /// 开始副本战斗
- /// </summary>
- /// <param name="_data"></param>
- public void On_Start(byte[] _data)
- {
- // 多人副本开始战斗
- var msg = SC_MD_BeginDup.Parser.ParseFrom(_data);
- LogHelper.Log($"开始副本战斗: {msg} .");
- MultiDupProxy.Instance.OnStartGame?.Invoke(msg);
- // todo : 转接客户端逻辑
- }
- public void On_LeaveGame(byte[] _data)
- {
- var msg = SC_MD_LeaveRoom.Parser.ParseFrom(_data);
- LogHelper.Log($"玩家 {msg.Uid} 已经离开游戏!"); //
- // todo:转接客户端逻辑
- }
- public void _close()
- {
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdGetRoomList, On_UpdateRoomList); // 进入大厅返回此消息
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdCreateRoom, On_CreateRoom); // 创建房间成功
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdEnterRoom, On_EnterRoom);
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdBeginDup, On_Start);
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdLeaveRoom, On_LeaveGame);
- if (null != lobbySocket)
- {
- LogHelper.Log("销毁lobbySocket");
- lobbySocket.Close();
- lobbySocket = null;
- }
- }
- public void Update()
- {
- lobbySocket?.Update();
- //battleSocket?.Update();
- }
- private void OnDisable()
- {
- _close();
- }
- protected override void DoOnDestroy()
- {
- _close();
- }
- #endregion
- }
|