123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Net;
- using BossServer;
- class BossFight : MonoSingleton<BossFight>
- {
- public enum State
- {
- /// <summary>
- /// 未初始化, 需要初始化
- /// </summary>
- UnInited = 0,
- /// <summary>
- /// 已初始化, 需要登录
- /// </summary>
- Inited = 1,
- /// <summary>
- /// 已登录, 可以上报伤害以及自己的剩余血量
- /// </summary>
- Logined = 2,
- /// <summary>
- /// 离开房间, 不可以继续上报伤害和剩余血量
- /// </summary>
- Leaved = 3
- }
- TasPBSocketManager socket;
- /// <summary>
- /// 当前状态
- /// </summary>
- public State CurrentState { get; private set; }
- public int bossId = 1;
- /// <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();
- }
- }
- //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 向服务端发送消息
- /// <summary>
- /// 进入房间后发送第一条消息
- /// </summary>
- /// <param name="bossid">bossid(原有boss传1,新boss传2)</param>
- 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);
- }
- }
-
- /// <summary>
- /// 上报伤害
- /// </summary>
- /// <param name="damage"></param>
- 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);
- }
- }
- /// <summary>
- /// 上报玩家剩余血量
- /// </summary>
- /// <param name="hp"></param>
- 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);
- }
- }
- /// <summary>
- /// 上报退出
- /// </summary>
- 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}");
- }
- /// <summary>
- /// 延迟显示结果
- /// </summary>
- 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
- }
|