Procházet zdrojové kódy

【增加】玩家离线处理

johnclot69 před 1 rokem
rodič
revize
0c4bc1e71f

+ 1 - 9
DotNet/App/ConfigLoader.cs

@@ -20,15 +20,7 @@ namespace ET.Server
             HashSet<Type> configTypes = EventSystem.Instance.GetTypes(typeof (ConfigAttribute));
             foreach (Type configType in configTypes)
             {
-                string configFilePath;
-                if (startConfigs.Contains(configType.Name))
-                {
-                    configFilePath = $"../Config/GenFromExcel/s/{Options.Instance.StartConfig}/{configType.Name}.bytes";
-                }
-                else
-                {
-                    configFilePath = $"../Config/GenFromExcel/s/{configType.Name}.bytes";
-                }
+                string configFilePath = startConfigs.Contains(configType.Name)? $"../Config/GenFromExcel/s/{Options.Instance.StartConfig}/{configType.Name}.bytes" : $"../Config/GenFromExcel/s/{configType.Name}.bytes";
                 output[configType] = File.ReadAllBytes(configFilePath);
             }
 

+ 3 - 7
DotNet/Hotfix/Scenes/Game/Player/PlayerDataComponentSystem.cs

@@ -10,7 +10,8 @@ namespace ET.Server
         /// <param name="player"></param>
         protected override void Awake(PlayerDataComponent self, PlayerInfo info, WNPlayer player)
         {
-            self?.Init(info, player);
+            self.Player = player;
+            self.Data = info;
         }
     }
 
@@ -22,6 +23,7 @@ namespace ET.Server
         /// <param name="self"></param>
         protected override void Destroy(PlayerDataComponent self)
         {
+            Log.Debug($"玩家基础数据保存");
             self?.Save();
         }
     }
@@ -29,12 +31,6 @@ namespace ET.Server
     [FriendOf(typeof (PlayerDataComponent))]
     public static class PlayerDataComponentSystem
     {
-        public static void Init(this PlayerDataComponent self, PlayerInfo playerInfo, WNPlayer player)
-        {
-            self.Player = player;
-            self.Data = playerInfo;
-        }
-
         public static async ETTask Save(this PlayerDataComponent self)
         {
             if (self.Data != null)

+ 12 - 8
DotNet/Hotfix/Scenes/Game/Player/PlayerMoneyComponentSystem.cs

@@ -4,21 +4,25 @@
     {
         protected override void Awake(PlayerMoneyComponent self, WNPlayer player)
         {
-            self?.Init(player);
+            self.Player = player;
+        }
+    }
+
+    public class PlayerMoneyComponentDestroySystem: DestroySystem<PlayerMoneyComponent>
+    {
+        protected override void Destroy(PlayerMoneyComponent self)
+        {
+            Log.Debug($"玩家货币数据保存");
+            self?.Save();
         }
     }
 
     [FriendOf(typeof (PlayerMoneyComponent))]
     public static class PlayerMoneyComponentSystem
     {
-        /// <summary>
-        /// 初始化数据
-        /// </summary>
-        /// <param name="self"></param>
-        /// <param name="player"></param>
-        public static void Init(this PlayerMoneyComponent self, WNPlayer player)
+        public static async ETTask Save(this PlayerMoneyComponent self)
         {
-            self.Player = player;
+            await ETTask.CompletedTask;
         }
     }
 }

+ 26 - 13
DotNet/Hotfix/Scenes/Game/Player/PlayerSystem.cs

@@ -9,6 +9,9 @@ namespace ET.Server
         /// <summary>
         /// 玩家实体创建
         /// </summary>
+        /// <param name="self"></param>
+        /// <param name="session"></param>
+        /// <param name="playerInfo"></param>
         protected override void Awake(WNPlayer self, Session session, PlayerInfo playerInfo)
         {
             // 绑定sessionId
@@ -34,6 +37,7 @@ namespace ET.Server
         /// <param name="self"></param>
         protected override void Destroy(WNPlayer self)
         {
+            Log.Info($"玩家实体销毁...");
         }
     }
 
@@ -221,9 +225,26 @@ namespace ET.Server
                     AttackPer = 100,
                 },
                 effectsExt = new { },
-                skills = new List<SkillInfo>(){
-                    new SkillInfo {id = 100, level = 1, type = 1, skillTime = 10000, cdTime = 5000, flag = 0 },
-                    new SkillInfo { id = 101, level = 1, type = 1, skillTime = 10000, cdTime = 5000, flag = 0},
+                skills = new List<SkillInfo>()
+                {
+                    new SkillInfo
+                    {
+                        id = 100,
+                        level = 1,
+                        type = 1,
+                        skillTime = 10000,
+                        cdTime = 5000,
+                        flag = 0
+                    },
+                    new SkillInfo
+                    {
+                        id = 101,
+                        level = 1,
+                        type = 1,
+                        skillTime = 10000,
+                        cdTime = 5000,
+                        flag = 0
+                    },
                 },
                 tasks = new { },
                 flags = new { },
@@ -260,18 +281,10 @@ namespace ET.Server
                     hp = 1000,
                     mp = 0,
                 },
-                pkInfo = new
-                {
-                    mode = 0,
-                    value = 0,
-                    level = 1,
-                },
+                pkInfo = new { mode = 0, value = 0, level = 1, },
                 //petBase,
                 addTestPetData = 0,
-                sceneData = new
-                {
-                    allowAutoGuard = 3,
-                },
+                sceneData = new { allowAutoGuard = 3, },
             };
             var retjson = System.Text.Json.JsonSerializer.Serialize(json, new JsonSerializerOptions { IncludeFields = true });
             Log.Debug("===================================");

+ 1 - 0
DotNet/Hotfix/Scenes/Game/Player/PlayerTempDataComponentSystem.cs

@@ -24,6 +24,7 @@ namespace ET.Server
         /// <param name="self"></param>
         protected override void Destroy(PlayerTempDataComponent self)
         {
+            Log.Debug($"玩家临时数据保存");
             self?.Save();
         }
     }

+ 25 - 2
DotNet/Hotfix/Scenes/Game/Player/SessionPlayerComponentSystem.cs

@@ -15,8 +15,31 @@ namespace ET.Server
     {
         protected override void Destroy(SessionPlayerComponent self)
         {
-            // 发送断线消息
-            Log.Warning($"玩家断线了, plyerId={self.PlayerId}");
+            WNPlayer player = self.GetMyPlayer();
+            if (player == null)
+            {
+                return;
+            }
+
+            Log.Info($"玩家断线了, playerId={self.PlayerId}, name={player.GetName()}");
+
+            // 玩家离开
+            player.GetComponent<PlayerTempDataComponent>().MapData.ready = false;
+
+            Map map = player.Map;
+            if (map != null)
+            {
+                // 记录玩家历史
+                map.SyncPlayerHistoryData(player);
+                // 场景移除玩家
+                map.RemovePlayer(player, false);
+
+                map.PlayerLeaveRequest(player, false);
+            }
+
+            self.DomainScene().GetComponent<GamePlayerComponent>().Remove(player.GetId());
+
+            player.Dispose();
         }
     }
 

+ 1 - 1
DotNet/Model/Scenes/Game/Player/PlayerMoneyComponent.cs

@@ -1,7 +1,7 @@
 namespace ET.Server
 {
     [ComponentOf(typeof (WNPlayer))]
-    public class PlayerMoneyComponent: Entity, IAwake<WNPlayer>
+    public class PlayerMoneyComponent: Entity, IAwake<WNPlayer>, IDestroy
     {
         /** 玩家对象 **/
         public WNPlayer Player { get; set; }

+ 5 - 1
DotNet/Model/Scenes/Game/Player/WNPlayer.cs

@@ -3,7 +3,7 @@ namespace ET.Server
     /// <summary>
     /// 玩家实体
     /// </summary>
-    [ChildOf(typeof(GamePlayerComponent))]
+    [ChildOf(typeof (GamePlayerComponent))]
     public class WNPlayer: Entity, IAwake<Session, PlayerInfo>, IDestroy
     {
         /** 游戏服session InstanceId **/
@@ -13,12 +13,16 @@ namespace ET.Server
 
         /** 职业初始信息配置 **/
         public Character BasicProp { get; set; }
+
         /** 玩家场景信息 **/
         public Map Map { get; set; }
+
         /** 阵营 **/
         public int Force { get; set; }
+
         /** 出生类型 **/
         public int BornType { get; set; }
+
         public int EnterState { get; set; }
 
         /** 登录首次进入场景,用于onready,进行一次消息推送(只在登陆时候首次进场景推送)*/