SessionPlayerComponentSystem.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. namespace ET.Server
  4. {
  5. [FriendOf(typeof (SessionPlayerComponent))]
  6. public static class SessionPlayerComponentSystem
  7. {
  8. public class SessionPlayerComponentAwakeSystem: AwakeSystem<SessionPlayerComponent, PlayerInfo>
  9. {
  10. protected override void Awake(SessionPlayerComponent self, PlayerInfo playerInfo)
  11. {
  12. Log.Info($"创建session玩家绑定组件...");
  13. self.PlayerInfo = playerInfo;
  14. self.PlayerId = playerInfo.Id;
  15. }
  16. }
  17. public class SessionPlayerComponentDestroySystem: DestroySystem<SessionPlayerComponent>
  18. {
  19. protected override void Destroy(SessionPlayerComponent self)
  20. {
  21. WNPlayer player = self.GetMyPlayer();
  22. if (player == null)
  23. {
  24. return;
  25. }
  26. Log.Info($"玩家断线了, playerId={self.PlayerId}, name={player.GetName()}");
  27. Map map = player.Map;
  28. if (map != null)
  29. {
  30. // 玩家离开
  31. player.GetComponent<PlayerTempDataComponent>().MapData.ready = false;
  32. // 记录玩家历史
  33. map.SyncPlayerHistoryData(player);
  34. // 战斗服场景玩家离开
  35. map.PlayerLeaveRequest(player, false);
  36. // 本地场景移除玩家
  37. map.RemovePlayer(player, false);
  38. // 移除本地玩家数据
  39. self.DomainScene().GetComponent<GamePlayerComponent>().Remove(player.GetId());
  40. // 战斗服结束场景
  41. map.DestroyZoneRequest();
  42. // 移除本地场景数据
  43. map.DomainScene().GetComponent<GameMapComponent>().Remove(map.Id);
  44. map.Dispose();
  45. }
  46. player.Dispose();
  47. }
  48. }
  49. /// <summary>
  50. /// 绑定玩家id
  51. /// </summary>
  52. /// <param name="self"></param>
  53. /// <param name="player"></param>
  54. public static void BindPlayerId(this SessionPlayerComponent self, WNPlayer player)
  55. {
  56. Log.Debug($"session玩家绑定组件 绑定玩家id={player.GetId()}");
  57. self.PlayerId = player.GetId();
  58. // 添加本地玩家数据
  59. self.DomainScene().GetComponent<GamePlayerComponent>().Add(player.GetId(), player);
  60. }
  61. /// <summary>
  62. /// 获取当前玩家实体
  63. /// </summary>
  64. /// <param name="self"></param>
  65. /// <returns></returns>
  66. public static WNPlayer GetMyPlayer(this SessionPlayerComponent self)
  67. {
  68. return self.DomainScene().GetComponent<GamePlayerComponent>().Get(self.PlayerId);
  69. }
  70. }
  71. }