BossFight.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Net;
  7. using BossServer;
  8. class BossFight : MonoSingleton<BossFight>
  9. {
  10. public enum State
  11. {
  12. /// <summary>
  13. /// 未初始化, 需要初始化
  14. /// </summary>
  15. UnInited = 0,
  16. /// <summary>
  17. /// 已初始化, 需要登录
  18. /// </summary>
  19. Inited = 1,
  20. /// <summary>
  21. /// 已登录, 可以上报伤害以及自己的剩余血量
  22. /// </summary>
  23. Logined = 2,
  24. /// <summary>
  25. /// 离开房间, 不可以继续上报伤害和剩余血量
  26. /// </summary>
  27. Leaved = 3
  28. }
  29. TasPBSocketManager socket;
  30. /// <summary>
  31. /// 当前状态
  32. /// </summary>
  33. public State CurrentState { get; private set; }
  34. public int bossId = 1;
  35. /// <summary>
  36. /// 先初始化
  37. /// </summary>
  38. public void Init()
  39. {
  40. var ip = "192.168.10.17";
  41. if (GlobalConfig.netType == eNetType.Online || GlobalConfig.netType == eNetType.TestOnline)
  42. {
  43. var uri = "ylsjtt.game7000.com";
  44. IPHostEntry entry = Dns.GetHostEntry(uri);
  45. if (entry != null && entry.AddressList != null && entry.AddressList.Length > 0)
  46. {
  47. IPAddress addr = entry.AddressList[0]; //使用时使用AddressList[0]即可
  48. ip = addr.ToString();
  49. }
  50. }
  51. //ip = "192.168.125.8";
  52. var port = 6002;
  53. socket = new TasPBSocketManager();
  54. socket.Connect(ip, port);
  55. //SocketManager.Instance.Connect(ip, port);
  56. // 挂载 服务端消息回调处理函数
  57. MessageCenter.Instance.addObsever(eProtocalCommand.ScUpdateProperties, On_UpdateHp);
  58. MessageCenter.Instance.addObsever(eProtocalCommand.ScGameOver, On_GameOver);
  59. MessageCenter.Instance.addObsever(eProtocalCommand.ScLogin, On_LoginOver);
  60. this.CurrentState = State.Inited;
  61. }
  62. #region 向服务端发送消息
  63. /// <summary>
  64. /// 进入房间后发送第一条消息
  65. /// </summary>
  66. /// <param name="bossid">bossid(原有boss传1,新boss传2)</param>
  67. public void Login(int bossid)
  68. {
  69. UnityEngine.Debug.Assert(CurrentState == State.Inited, $"当前状态不可以执行login,({CurrentState})");
  70. if (CurrentState == State.Inited)
  71. {
  72. bossId = bossid;
  73. var p = UserProxy.Instance.player;
  74. var msg = new CSEnterFight() { Uid = p.uid, Name = p.baseInfo.name, Zoneid = p.zoneid, BossId = bossid };
  75. socket.SendMsg(eProtocalCommand.CsLogin, msg);
  76. LogHelper.Log("Boss战发送登录");
  77. FightProxy.Instance.BossFight_Enter(bossId);
  78. }
  79. }
  80. /// <summary>
  81. /// 上报伤害
  82. /// </summary>
  83. /// <param name="damage"></param>
  84. public void ReportDamage(int damage)
  85. {
  86. UnityEngine.Debug.Assert(CurrentState == State.Logined, $"当前状态不可以执行上报操作,({CurrentState})");
  87. if (CurrentState == State.Logined)
  88. {
  89. var msg = new CSFightReportDamage() { Damage = damage };
  90. socket.SendMsg(eProtocalCommand.CsReportDamage, msg);
  91. }
  92. }
  93. /// <summary>
  94. /// 上报玩家剩余血量
  95. /// </summary>
  96. /// <param name="hp"></param>
  97. public void ReportUserHp(int hp)
  98. {
  99. UnityEngine.Debug.Assert(CurrentState == State.Logined, $"当前状态不可以执行上报操作,({CurrentState})");
  100. if (CurrentState == State.Logined)
  101. {
  102. var msg = new CSReportUserHP() { UserHP = hp };
  103. socket.SendMsg(eProtocalCommand.CsReportUserHp, msg);
  104. }
  105. }
  106. /// <summary>
  107. /// 上报退出
  108. /// </summary>
  109. public void LeaveGame()
  110. {
  111. BattleDefine.EBattleSceneType eBattleSceneType = (BattleDefine.EBattleSceneType)int.Parse(GameDateManager.Instance.GateVO.Mo.battleType);
  112. if (GameDateManager.Instance.GateVO != null && (eBattleSceneType == BattleDefine.EBattleSceneType.EBattleType_WorldBoss))
  113. {
  114. var msg = new CSLeaveFight() { No = 0 };
  115. socket.SendMsg(eProtocalCommand.CsLeaveRoom, msg);
  116. CoroutineWrapper.Instance.EXEDelaySecs(1, _close);
  117. }
  118. }
  119. #endregion
  120. #region 服务端消息回调
  121. public void On_LoginOver(byte[] _data)
  122. {
  123. var msg = SCEnterFight.Parser.ParseFrom(_data);
  124. if (msg != null)
  125. {
  126. CurrentState = State.Logined;
  127. LogHelper.Log($"登录成功,Boss: {msg.BossHp}/{msg.BossMaxHp}, UserHP:{msg.UserHP},倒计时: {msg.CountDown / 60}:{msg.CountDown % 60}");
  128. BattleCanvas.Instance.UpdateTime(msg.CountDown);
  129. BattleCanvas.Instance.WordBossHP(msg.BossHp, msg.BossMaxHp);
  130. if (msg.UserHP > 0)
  131. {
  132. RoleManager.Instance.GetPlayer().mData.SetBossHP(msg.UserHP, true);
  133. }
  134. }
  135. else
  136. {
  137. LogHelper.Log($"登录失败");
  138. }
  139. }
  140. public void On_UpdateHp(byte[] _data)
  141. {
  142. var msg = SCUpdateProperties.Parser.ParseFrom(_data);
  143. LogHelper.Log($"最新HP: {msg.BossHp}/{msg.BossMaxHp},倒计时: {msg.CountDown / 60}:{msg.CountDown % 60}");
  144. // todo : 转接客户端逻辑
  145. BattleCanvas.Instance.WordBossHP(msg.BossHp, msg.BossMaxHp);
  146. }
  147. bool bWin = false;
  148. public void On_GameOver(byte[] _data)
  149. {
  150. var msg = SCGameOver.Parser.ParseFrom(_data);
  151. LogHelper.Log($"Boss战,战斗已结束! {msg.BossHp},倒计时: {msg.CountDown / 60}:{msg.CountDown % 60}"); // Ps. 如果剩余血量Hp >0 代表超时结束.
  152. // todo:转接客户端逻辑
  153. // 时间结束
  154. if (msg.BossHp > 0)
  155. {
  156. bWin = false;
  157. }
  158. else
  159. {
  160. bWin = true;
  161. }
  162. Invoke("LateShowResult", 2.0f);
  163. CoroutineWrapper.Instance.EXEDelaySecs(1, _close);
  164. UI_CueDialog.Instance().Open($"副本关闭中,距离下次开启还剩:{msg.CountDown / 60}:{msg.CountDown % 60}");
  165. }
  166. /// <summary>
  167. /// 延迟显示结果
  168. /// </summary>
  169. private void LateShowResult()
  170. {
  171. RoleManager.Instance.ClearRoleRes();
  172. PanelHelper.Instance.ShowPanel("UI_WordBossResultWindow", null, bWin);
  173. }
  174. public void _close()
  175. {
  176. MessageCenter.Instance.removeObserver(eProtocalCommand.ScUpdateProperties, On_UpdateHp);
  177. MessageCenter.Instance.removeObserver(eProtocalCommand.ScGameOver, On_GameOver);
  178. MessageCenter.Instance.removeObserver(eProtocalCommand.ScLogin, On_LoginOver);
  179. if (null != socket)
  180. {
  181. LogHelper.Log("销毁socket");
  182. socket.Close();
  183. socket = null;
  184. }
  185. }
  186. public void Update()
  187. {
  188. if (null != socket)
  189. {
  190. socket.Update();
  191. }
  192. }
  193. private void OnDisable()
  194. {
  195. _close();
  196. }
  197. protected override void DoOnDestroy()
  198. {
  199. _close();
  200. }
  201. #endregion
  202. }