using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using MultiDup; public class MultiBattleProxy : MonoSingleton { public enum State { /// /// 未连接,需要初始化(后自动连接) /// UnConnected = 0, /// /// 已连接, 需要登录 /// Connected = 1, /// /// 已完成登录(并自动进入组队) /// Logined = 2, /// /// 离开房间, 不可以继续上报位置同步和状态信息 /// Leaved = 3 } TasPBSocketManager battleSocket; // 战斗 socket /// /// 当前状态, Logined状态为正常状态,其他状态战场逻辑不可以用 /// public State CurrentState { get; private set; } = State.UnConnected; /// /// 队友列表 /// public List PlayerList = new List(); public MultiBattleProxy() { } public void Init(string ip, int port) { _close(); battleSocket = new TasPBSocketManager(); battleSocket.Connect(ip, port); // 挂载 服务端消息回调处理函数 MessageCenter.Instance.addObsever(eProtocalCommand.ScBtLogin, _SCLogin); // 登录返回消息 MessageCenter.Instance.addObsever(eProtocalCommand.ScBtPeopleList, _PeopleList); // 查询队友返回 MessageCenter.Instance.addObsever(eProtocalCommand.ScBtPostion, _Position); // 位置更新通知 MessageCenter.Instance.addObsever(eProtocalCommand.ScBtStatus, _Status); // 状态更新通知 MessageCenter.Instance.addObsever(eProtocalCommand.ScBtBroadCast, _BroadCast); // 广播消息 // MessageCenter.Instance.addObsever(eProtocalCommand.ScMdLeaveRoom, On_LeaveGame); battleSocket.OnDisconnected = () => { LogHelper.Log("与战斗服务端的连接已断开!"); this._close(); }; battleSocket.OnConnected = () => { this.CurrentState = State.Connected; // Login(); // 连接好后自动进行信息提交 }; } public Action On_PepoleLogin; public Action On_PeopleList; public Action On_BTStatus; public Action On_UpdatePosition; public Action On_BroadCast; //public Action On_PepoleLeave; //public Action On_BattleOver; public void Login() { if (CurrentState == State.Connected) { var p = UserProxy.Instance.player; var msg = new CS_BT_Login() { Uid = p.uid, Zoneid = p.zoneid, Msg = "登录战斗服务" }; battleSocket.SendMsg(eProtocalCommand.CsBtLogin, msg); LogHelper.Log("多人副本,向战斗服务器发送登录请求"); } } public void GetPeopleList() { if (CurrentState == State.Logined) { var p = UserProxy.Instance.player; var msg = new CS_BT_PeopleList() { Uid = p.uid, Zoneid = p.zoneid }; battleSocket.SendMsg(eProtocalCommand.CsBtPeopleList, msg); LogHelper.Log("多人副本,向战斗服务器发送队友列表请求"); } else { LogHelper.LogError("多人副本,当前状态不可发送此消息!"); } } public void BroadCast(string msg) { if (CurrentState == State.Logined) { var p = UserProxy.Instance.player; var _msg = new CS_BT_BroadCast() { SenderUid = p.uid, Zoneid = p.zoneid, Msg = msg }; battleSocket.SendMsg(eProtocalCommand.CsBtBroadCast, _msg); LogHelper.Log("多人副本, 战场内发送广播消息." + msg); } else { LogHelper.LogError("多人副本,当前状态不可发送广播消息!"); } } public void SendStatus(string propertiName, string value) { if (CurrentState == State.Logined) { var p = UserProxy.Instance.player; var _msg = new CS_BT_Status() { SenderUid = p.uid, Zoneid = p.zoneid, PropertyName = propertiName, Value = value }; battleSocket.SendMsg(eProtocalCommand.CsBtStatus, _msg); LogHelper.Log($" 战场内发送状态更新消息. [{propertiName}:{value}] "); } else { LogHelper.LogError("多人副本,当前状态不可发送状态更新消息!"); } } public void SendPostion(float x, float y, float z) { if (CurrentState == State.Logined) { var p = UserProxy.Instance.player; var _msg = new CS_BT_Position() { SenderUid = p.uid, Zoneid = p.zoneid, X = x, Y = y, Z = z }; battleSocket.SendMsg(eProtocalCommand.CsBtPosition, _msg); LogHelper.Log($" 战场内发送位置更新消息. "); } else { LogHelper.LogError("多人副本,当前状态不可发送位置更新消息!"); } } #region 接收消息回调 private void _SCLogin(byte[] _data) { var msg = SC_BT_Login.Parser.ParseFrom(_data); var ok = int.TryParse(msg.Msg, out var roomId); Debug.Log(ok ? "战斗服务器登录成功!" : msg.Msg); if (ok) { this.CurrentState = State.Logined; } this.On_PepoleLogin?.Invoke(); // 这个基本么有必要关注 } private void _PeopleList(byte[] _data) { var msg = SC_BT_PeopleList.Parser.ParseFrom(_data); Debug.Log("刷新队友列表!\n 新进:" + msg.NewerUid ?? ""); this.PlayerList = msg.PlayerUids.ToList(); // 更新队友列表 this.On_PeopleList?.Invoke(msg); } private void _Status(byte[] _data) { var msg = SC_BT_Status.Parser.ParseFrom(_data); Debug.Log("收到状态更新消息"); this.On_BTStatus?.Invoke(msg); } private void _Position(byte[] _data) { var msg = SC_BT_Position.Parser.ParseFrom(_data); Debug.Log("收到位置更新消息"); this.On_UpdatePosition?.Invoke(msg); } private void _BroadCast(byte[] _data) { var msg = SC_BT_BroadCast.Parser.ParseFrom(_data); Debug.Log("收到广播消息"); this.On_BroadCast?.Invoke(msg); } #endregion public void _close() { MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtLogin, _SCLogin); // 登录返回消息 MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtPeopleList, _PeopleList); // 查询队友返回 MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtPostion, _Position); // 位置更新通知 MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtStatus, _Status); // 状态更新通知 MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtBroadCast, _BroadCast); // 广播消息 // MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdLeaveRoom, On_LeaveGame); if (null != battleSocket) { LogHelper.Log("销毁battleSocket"); battleSocket.Close(); battleSocket = null; } } #region public void Update() { battleSocket?.Update(); } private void OnDisable() { _close(); } protected override void DoOnDestroy() { _close(); } #endregion }