using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using BossServer; class BossFight : MonoSingleton { public enum State { /// /// 未初始化, 需要初始化 /// UnInited = 0, /// /// 已初始化, 需要登录 /// Inited = 1, /// /// 已登录, 可以上报伤害以及自己的剩余血量 /// Logined = 2, /// /// 离开房间, 不可以继续上报伤害和剩余血量 /// Leaved = 3 } TasPBSocketManager socket; /// /// 当前状态 /// public State CurrentState { get; private set; } public int bossId = 1; /// /// 先初始化 /// 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(); } } //ip = "192.168.125.8"; var port = 6002; socket = new TasPBSocketManager(); socket.Connect(ip, port); //SocketManager.Instance.Connect(ip, port); // 挂载 服务端消息回调处理函数 MessageCenter.Instance.addObsever(eProtocalCommand.ScUpdateProperties, On_UpdateHp); MessageCenter.Instance.addObsever(eProtocalCommand.ScGameOver, On_GameOver); MessageCenter.Instance.addObsever(eProtocalCommand.ScLogin, On_LoginOver); this.CurrentState = State.Inited; } #region 向服务端发送消息 /// /// 进入房间后发送第一条消息 /// /// bossid(原有boss传1,新boss传2) public void Login(int bossid) { UnityEngine.Debug.Assert(CurrentState == State.Inited, $"当前状态不可以执行login,({CurrentState})"); if (CurrentState == State.Inited) { bossId = bossid; var p = UserProxy.Instance.player; var msg = new CSEnterFight() { Uid = p.uid, Name = p.baseInfo.name, Zoneid = p.zoneid, BossId = bossid }; socket.SendMsg(eProtocalCommand.CsLogin, msg); LogHelper.Log("Boss战发送登录"); FightProxy.Instance.BossFight_Enter(bossId); } } /// /// 上报伤害 /// /// public void ReportDamage(int damage) { UnityEngine.Debug.Assert(CurrentState == State.Logined, $"当前状态不可以执行上报操作,({CurrentState})"); if (CurrentState == State.Logined) { var msg = new CSFightReportDamage() { Damage = damage }; socket.SendMsg(eProtocalCommand.CsReportDamage, msg); } } /// /// 上报玩家剩余血量 /// /// public void ReportUserHp(int hp) { UnityEngine.Debug.Assert(CurrentState == State.Logined, $"当前状态不可以执行上报操作,({CurrentState})"); if (CurrentState == State.Logined) { var msg = new CSReportUserHP() { UserHP = hp }; socket.SendMsg(eProtocalCommand.CsReportUserHp, msg); } } /// /// 上报退出 /// public void LeaveGame() { BattleDefine.EBattleSceneType eBattleSceneType = (BattleDefine.EBattleSceneType)int.Parse(GameDateManager.Instance.GateVO.Mo.battleType); if (GameDateManager.Instance.GateVO != null && (eBattleSceneType == BattleDefine.EBattleSceneType.EBattleType_WorldBoss)) { var msg = new CSLeaveFight() { No = 0 }; socket.SendMsg(eProtocalCommand.CsLeaveRoom, msg); CoroutineWrapper.Instance.EXEDelaySecs(1, _close); } } #endregion #region 服务端消息回调 public void On_LoginOver(byte[] _data) { var msg = SCEnterFight.Parser.ParseFrom(_data); if (msg != null) { CurrentState = State.Logined; LogHelper.Log($"登录成功,Boss: {msg.BossHp}/{msg.BossMaxHp}, UserHP:{msg.UserHP},倒计时: {msg.CountDown / 60}:{msg.CountDown % 60}"); BattleCanvas.Instance.UpdateTime(msg.CountDown); BattleCanvas.Instance.WordBossHP(msg.BossHp, msg.BossMaxHp); if (msg.UserHP > 0) { RoleManager.Instance.GetPlayer().mData.SetBossHP(msg.UserHP, true); } } else { LogHelper.Log($"登录失败"); } } public void On_UpdateHp(byte[] _data) { var msg = SCUpdateProperties.Parser.ParseFrom(_data); LogHelper.Log($"最新HP: {msg.BossHp}/{msg.BossMaxHp},倒计时: {msg.CountDown / 60}:{msg.CountDown % 60}"); // todo : 转接客户端逻辑 BattleCanvas.Instance.WordBossHP(msg.BossHp, msg.BossMaxHp); } bool bWin = false; public void On_GameOver(byte[] _data) { var msg = SCGameOver.Parser.ParseFrom(_data); LogHelper.Log($"Boss战,战斗已结束! {msg.BossHp},倒计时: {msg.CountDown / 60}:{msg.CountDown % 60}"); // Ps. 如果剩余血量Hp >0 代表超时结束. // todo:转接客户端逻辑 // 时间结束 if (msg.BossHp > 0) { bWin = false; } else { bWin = true; } Invoke("LateShowResult", 2.0f); CoroutineWrapper.Instance.EXEDelaySecs(1, _close); UI_CueDialog.Instance().Open($"副本关闭中,距离下次开启还剩:{msg.CountDown / 60}:{msg.CountDown % 60}"); } /// /// 延迟显示结果 /// private void LateShowResult() { RoleManager.Instance.ClearRoleRes(); PanelHelper.Instance.ShowPanel("UI_WordBossResultWindow", null, bWin); } public void _close() { MessageCenter.Instance.removeObserver(eProtocalCommand.ScUpdateProperties, On_UpdateHp); MessageCenter.Instance.removeObserver(eProtocalCommand.ScGameOver, On_GameOver); MessageCenter.Instance.removeObserver(eProtocalCommand.ScLogin, On_LoginOver); if (null != socket) { LogHelper.Log("销毁socket"); socket.Close(); socket = null; } } public void Update() { if (null != socket) { socket.Update(); } } private void OnDisable() { _close(); } protected override void DoOnDestroy() { _close(); } #endregion }