Quellcode durchsuchen

【优化】服务器优化登录,关闭客户端再次请求的报错

johnclot69 vor 1 Jahr
Ursprung
Commit
b4b9d49877

+ 7 - 9
DotNet/Hotfix/Helper/MapHelper.cs

@@ -154,18 +154,16 @@ namespace ET.Server
                 }
             }
 
-            if (map != null)
+            if (map == null)
             {
-                return map;
+                // 创建一个场景
+                JObject jsonObject = new JObject();
+                jsonObject.Add("id", player.GetId());
+                jsonObject.Add("logicServerId", player.GetLogicServerId());
+                jsonObject.Add("areaId", playerMapInfo.mapId);
+                map = CreateMap(player, jsonObject, false);
             }
 
-            // 创建一个场景
-            JObject jsonObject = new JObject();
-            jsonObject.Add("id", player.GetId());
-            jsonObject.Add("logicServerId", player.GetLogicServerId());
-            jsonObject.Add("areaId", playerMapInfo.mapId);
-            map = CreateMap(player, jsonObject, false);
-
             if (map != null)
             {
                 ChangeArea(player, new Struct.AreaData(10098, map.Id), false);

+ 1 - 1
DotNet/Hotfix/Scenes/Game/GameTokenInfoComponentSystem.cs

@@ -1,7 +1,7 @@
 namespace ET.Server
 {
     [FriendOf(typeof(GameTokenInfoComponent))]
-    public static class GateTokenInfoComponentSystem
+    public static class GameTokenInfoComponentSystem
     {
         public static void Add(this GameTokenInfoComponent self, string token, long userId)
         {

+ 46 - 28
DotNet/Hotfix/Scenes/Game/Handler/C2G_BindPlayerHandler.cs

@@ -1,4 +1,6 @@
 using System;
+using System.Collections.Generic;
+using System.Linq;
 
 namespace ET.Server
 {
@@ -10,43 +12,52 @@ namespace ET.Server
     {
         protected override async ETTask Run(Session session, C2G_BindPlayer request, G2C_BindPlayer response, Action reply)
         {
-            if (session.DomainScene().SceneType != SceneType.Game)
+            if (string.IsNullOrEmpty(request.UserId.ToString().Trim()))
             {
-                Log.Debug($"Game 请求的Scene错误...SceneType={session.DomainScene().SceneType}");
-                session.Dispose();
+                Log.Debug($"参数错误,账号id为空");
+                response.Error = ErrorCode.ERR_ParameterError;
+                reply();
                 return;
             }
 
-            // 移除session自动超时组件
-            session.RemoveComponent<SessionAcceptTimeoutComponent>();
-
             Scene scene = session.DomainScene();
-
-            PlayerInfo playerInfo;
-
+            // 预先创建数据
+            long _id = IdGenerater.Instance.GenerateUnitId(scene.DomainZone());
+            PlayerInfo playerInfo = new PlayerInfo();
+            playerInfo.Id = _id;
+            playerInfo.UserId = session.GetComponent<SessionPlayerComponent>().UserId;
+            playerInfo.Name = "玩家-" + _id;
+            playerInfo.Sex = 0;
+            playerInfo.Pro = (int)PlayerProType.CANG_LANG;
+            playerInfo.Level = 1;
+            playerInfo.Exp = 0;
+
+            // 简易版登录,直接创建一个player
             if (request.PlayerId <= 0)
             {
-                long _id = IdGenerater.Instance.GenerateUnitId(scene.DomainZone());
+                // 角色列表是否有数据
+                List<PlayerInfo> playerList = session.GetComponent<SessionPlayerComponent>().PlayerList;
 
-                // 简易版登录,直接创建一个player
-                using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.CreatePlayer, _id.ToString().Trim().GetHashCode()))
+                if (playerList is { Count: > 0 })
+                {
+                    foreach (PlayerInfo info in playerList.Where(info => info != null))
+                    {
+                        playerInfo = info;
+                        break;
+                    }
+                }
+                else
                 {
-                    playerInfo = new PlayerInfo();
-                    playerInfo.Id = _id;
-                    playerInfo.UserId = request.UserId;
-                    playerInfo.Name = "玩家-" + _id;
-                    playerInfo.Sex = 0;
-                    playerInfo.Pro = (int)PlayerProType.CANG_LANG;
-                    playerInfo.Level = 1;
-                    playerInfo.Exp = 0;
-
-                    await DBManagerComponent.Instance.GetZoneDB(session.DomainZone()).Save(playerInfo);
+                    using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.CreatePlayer, _id.ToString().Trim().GetHashCode()))
+                    {
+                        await DBManagerComponent.Instance.GetZoneDB(session.DomainZone()).Save(playerInfo);
+                    }
                 }
             }
             else
             {
                 // 正常选角,判断参数
-                if (!session.GetComponent<SessionPlayerComponent>().PlayerList.ContainsKey(request.PlayerId))
+                if (!session.GetComponent<SessionPlayerComponent>().IsExist(request.PlayerId))
                 {
                     Log.Debug($"选角出错,没有选择的角色");
                     response.Error = ErrorCode.ERR_BindPlayerError;
@@ -54,7 +65,7 @@ namespace ET.Server
                     return;
                 }
 
-                playerInfo = session.GetComponent<SessionPlayerComponent>().PlayerList[request.PlayerId];
+                playerInfo = session.GetComponent<SessionPlayerComponent>().Get(request.PlayerId);
 
                 if (playerInfo == null)
                 {
@@ -75,7 +86,12 @@ namespace ET.Server
                         return;
                     case > 0 when bindPlayerId != request.PlayerId:
                         // todo 老角色下线
-
+                        WNPlayer oldPlayer = scene.GetComponent<GamePlayerComponent>().Get(bindPlayerId);
+                        if (oldPlayer != null)
+                        {
+                            oldPlayer.Dispose();
+                            scene.GetComponent<GamePlayerComponent>().Remove(bindPlayerId);
+                        }
                         break;
                 }
             }
@@ -85,16 +101,18 @@ namespace ET.Server
             if (player != null)
             {
                 // todo 顶号
+                player.Dispose();
+                scene.GetComponent<GamePlayerComponent>().Remove(request.PlayerId);
             }
 
             player ??= scene.GetComponent<GamePlayerComponent>()
                     .AddChild<WNPlayer, Session, PlayerInfo>(session, playerInfo);
 
-            await player.GetComponent<PlayerTempDataComponent>().InitFromDB(player);
-
-            session.AddComponent<MailBoxComponent, MailboxType>(MailboxType.GateSession);
+            await player.GetComponent<PlayerTempDataComponent>().InitFromDB();
 
+            // 绑定选择的玩家
             session.GetComponent<SessionPlayerComponent>().PlayerId = request.PlayerId > 0 ? request.PlayerId : player.GetId();
+            session.AddComponent<MailBoxComponent, MailboxType>(MailboxType.GateSession);
 
             // todo 分配场景
             Map map = MapHelper.BindPlayerDispatch(player);

+ 5 - 3
DotNet/Hotfix/Scenes/Game/Handler/C2G_CreatePlayerHandler.cs

@@ -72,11 +72,13 @@ namespace ET.Server
             // 创建角色
             PlayerInfo playerInfo;
 
-            using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.CreatePlayer, request.Name.Trim().GetHashCode()))
+            long _id = IdGenerater.Instance.GenerateUnitId(scene.DomainZone());
+
+            using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.CreatePlayer, _id.ToString().Trim().GetHashCode()))
             {
                 playerInfo = new PlayerInfo();
-                playerInfo.Id = IdGenerater.Instance.GenerateUnitId(scene.DomainZone());
-                playerInfo.UserId = request.UserId;
+                playerInfo.Id = _id;
+                playerInfo.UserId = session.GetComponent<SessionPlayerComponent>().UserId;
                 playerInfo.Name = request.Name;
                 playerInfo.Sex = request.Sex;
                 playerInfo.Pro = request.Pro;

+ 11 - 1
DotNet/Hotfix/Scenes/Game/Handler/C2G_EnterMapHandler.cs

@@ -11,6 +11,16 @@ namespace ET.Server
     {
         protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply)
         {
+            if (session.DomainScene().SceneType != SceneType.Game)
+            {
+                Log.Debug($"Game 请求的Scene错误...SceneType={session.DomainScene().SceneType}");
+                session.Dispose();
+                return;
+            }
+
+            // 移除session自动超时组件
+            session.RemoveComponent<SessionAcceptTimeoutComponent>();
+
             WNPlayer player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
             if (player == null)
             {
@@ -49,7 +59,7 @@ namespace ET.Server
             reply();
 
             //等待client ready消息
-            await session.DomainScene().GetComponent<ObjectWait>().Wait<Wait_PlayerReady>();
+            // await session.DomainScene().GetComponent<ObjectWait>().Wait<Wait_PlayerReady>();
 
             player.OnEndEnterScene();
 

+ 5 - 1
DotNet/Hotfix/Scenes/Game/Handler/C2G_LoginGameHandler.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 
@@ -32,8 +33,11 @@ namespace ET.Server
 
             // 移除session自动超时组件
             session.RemoveComponent<SessionAcceptTimeoutComponent>();
-
+            // 添加session组件,用于绑定角色
             session.AddComponent<SessionPlayerComponent>();
+            session.GetComponent<SessionPlayerComponent>().UserId = request.UserId;
+
+            response.Players = new List<PlayerBasic>();
 
             // 获取角色列表
             List<PlayerInfo> list = await DBManagerComponent.Instance.GetZoneDB(session.DomainZone())

+ 6 - 7
DotNet/Hotfix/Scenes/Game/Player/PlayerTempDataComponentSystem.cs

@@ -12,6 +12,7 @@ namespace ET.Server
         /// <param name="player"></param>
         protected override void Awake(PlayerTempDataComponent self, WNPlayer player)
         {
+            self.Player = player;
         }
     }
 
@@ -30,21 +31,19 @@ namespace ET.Server
     [FriendOf(typeof (PlayerTempDataComponent))]
     public static class PlayerTempDataComponentSystem
     {
-        public static async ETTask InitFromDB(this PlayerTempDataComponent self, WNPlayer player)
+        public static async ETTask InitFromDB(this PlayerTempDataComponent self)
         {
-            self.Player = player;
-
             List<PlayerMapInfo> list = await DBManagerComponent.Instance.GetZoneDB(self.DomainZone())
-                    .Query<PlayerMapInfo>(p => p.Id == player.GetId());
+                    .Query<PlayerMapInfo>(p => p.Id == self.Player.GetId());
             if (list is { Count: > 0 })
             {
                 self.MapData = list[0];
             }
             else
             {
-                PlayerMapInfo info = new PlayerMapInfo();
-                info.mapId = 10098;
-                self.MapData = info;
+                self.MapData = new PlayerMapInfo();
+                self.MapData.mapId = 10098;
+                await self.Save();
             }
         }
 

+ 17 - 7
DotNet/Hotfix/Scenes/Game/Player/SessionPlayerComponentSystem.cs

@@ -1,4 +1,5 @@
 using System.Collections.Generic;
+using System.Linq;
 
 namespace ET.Server
 {
@@ -26,13 +27,23 @@ namespace ET.Server
         /// 初始化数据
         /// </summary>
         /// <param name="self"></param>
-        /// <param name="ids"></param>
         public static void Init(this SessionPlayerComponent self)
         {
-            self.PlayerList = new Dictionary<long, PlayerInfo>();
+            self.PlayerList = new List<PlayerInfo>();
             self.PlayerId = 0;
         }
 
+        /// <summary>
+        /// 是否存在
+        /// </summary>
+        /// <param name="self"></param>
+        /// <param name="playerId"></param>
+        /// <returns></returns>
+        public static bool IsExist(this SessionPlayerComponent self, long playerId)
+        {
+            return self.PlayerList.Any(info => info != null && info.Id == playerId);
+        }
+
         /// <summary>
         /// 获取
         /// </summary>
@@ -41,20 +52,19 @@ namespace ET.Server
         /// <returns></returns>
         public static PlayerInfo Get(this SessionPlayerComponent self, long playerId)
         {
-            self.PlayerList.TryGetValue(playerId, out PlayerInfo info);
-            return info;
+            return self.PlayerList.FirstOrDefault(info => info != null && info.Id == playerId);
         }
 
         /// <summary>
         /// 添加
         /// </summary>
         /// <param name="self"></param>
-        /// <param name="id"></param>
+        /// <param name="info"></param>
         public static void Add(this SessionPlayerComponent self, PlayerInfo info)
         {
-            if (!self.PlayerList.ContainsKey(info.Id))
+            if (info != null)
             {
-                self.PlayerList.Add(info.Id, info);
+                self.PlayerList.Add(info);
             }
         }
 

+ 1 - 1
DotNet/Hotfix/Scenes/Realm/Handler/C2R_LoginHandler.cs

@@ -123,7 +123,7 @@ namespace ET.Server
             session.AddChild(userInfo);
 
             // todo 生成token, 后期改成正式token
-            string token = TimeHelper.ServerNow().ToString() + RandomGenerator.RandomNumber(int.MinValue, int.MaxValue);
+            string token = userInfo.Id.ToString().Trim();
 
             // 服务器列表
             List<StartSceneConfig> gameList = RealmGateAddressHelper.GetAllGame(session.DomainZone());

+ 4 - 1
DotNet/Model/Scenes/Game/Player/SessionPlayerComponent.cs

@@ -5,10 +5,13 @@ namespace ET.Server
     [ComponentOf(typeof (Session))]
     public class SessionPlayerComponent: Entity, IAwake, IDestroy
     {
+        /** 账号id **/
+        public long UserId { get; set; }
+
         /** 选择的玩家id **/
         public long PlayerId { get; set; }
 
         /** 玩家列表 **/
-        public Dictionary<long, PlayerInfo> PlayerList { get; set; }
+        public List<PlayerInfo> PlayerList { get; set; }
     }
 }

+ 0 - 1
Unity/Assets/Scripts/Core/Module/CoroutineLock/CoroutineLockType.cs

@@ -12,7 +12,6 @@ namespace ET
         public const int ResourcesLoader = 7;
         public const int Login = 8;
         public const int CreatePlayer = 9;
-        public const int InitPlayerTempDataComponent = 10;
 
         public const int Max = 100; // 这个必须最大
     }