Kaynağa Gözat

去掉AMRpcHandler中的reply

tanghai 3 yıl önce
ebeveyn
işleme
229a0454ef

+ 1 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Benchmark/C2G_BenchmarkHandler.cs

@@ -5,14 +5,13 @@ namespace ET.Server
     [MessageHandler(SceneType.BenchmarkServer)]
     public class C2G_BenchmarkHandler: AMRpcHandler<C2G_Benchmark, G2C_Benchmark>
     {
-        protected override async ETTask Run(Session session, C2G_Benchmark request, G2C_Benchmark response, Action reply)
+        protected override async ETTask Run(Session session, C2G_Benchmark request, G2C_Benchmark response)
         {            
             BenchmarkServerComponent benchmarkServerComponent = session.DomainScene().GetComponent<BenchmarkServerComponent>();
             if (benchmarkServerComponent.Count++ % 1000000 == 0)
             {
                 Log.Debug($"benchmark count: {benchmarkServerComponent.Count} {TimeHelper.ClientNow()}");
             }
-            reply();
             await ETTask.CompletedTask;
         }
     }

+ 6 - 10
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Gate/C2G_EnterMapHandler.cs

@@ -1,12 +1,9 @@
-using System;
-
-
-namespace ET.Server
+namespace ET.Server
 {
 	[MessageHandler(SceneType.Gate)]
 	public class C2G_EnterMapHandler : AMRpcHandler<C2G_EnterMap, G2C_EnterMap>
 	{
-		protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply)
+		protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response)
 		{
 			Player player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
 
@@ -17,15 +14,14 @@ namespace ET.Server
 			Scene scene = gateMapComponent.Scene;
 			
 			// 这里可以从DB中加载Unit
-			Unit unit = Server.UnitFactory.Create(scene, player.Id, UnitType.Player);
+			Unit unit = UnitFactory.Create(scene, player.Id, UnitType.Player);
 			unit.AddComponent<UnitGateComponent, long>(session.InstanceId);
 			
 			StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(session.DomainZone(), "Map1");
 			response.MyId = player.Id;
-			reply();
-			
-			// 开始传送
-			await TransferHelper.Transfer(unit, startSceneConfig.InstanceId, startSceneConfig.Name);
+
+			// 等到一帧的最后面再传送,先让G2C_EnterMap返回,否则传送消息可能比G2C_EnterMap还早
+			TransferHelper.TransferAtFrameFinish(unit, startSceneConfig.InstanceId, startSceneConfig.Name).Coroutine();
 		}
 	}
 }

+ 1 - 3
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Gate/C2G_LoginGateHandler.cs

@@ -6,7 +6,7 @@ namespace ET.Server
 	[MessageHandler(SceneType.Gate)]
 	public class C2G_LoginGateHandler : AMRpcHandler<C2G_LoginGate, G2C_LoginGate>
 	{
-		protected override async ETTask Run(Session session, C2G_LoginGate request, G2C_LoginGate response, Action reply)
+		protected override async ETTask Run(Session session, C2G_LoginGate request, G2C_LoginGate response)
 		{
 			Scene scene = session.DomainScene();
 			string account = scene.GetComponent<GateSessionKeyComponent>().Get(request.Key);
@@ -14,7 +14,6 @@ namespace ET.Server
 			{
 				response.Error = ErrorCore.ERR_ConnectGateKeyError;
 				response.Message = "Gate key验证失败!";
-				reply();
 				return;
 			}
 			
@@ -27,7 +26,6 @@ namespace ET.Server
 			session.AddComponent<MailBoxComponent, MailboxType>(MailboxType.GateSession);
 
 			response.PlayerId = player.Id;
-			reply();
 			await ETTask.CompletedTask;
 		}
 	}

+ 1 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Gate/C2G_PingHandler.cs

@@ -6,10 +6,9 @@ namespace ET.Server
 	[MessageHandler(SceneType.Gate)]
 	public class C2G_PingHandler : AMRpcHandler<C2G_Ping, G2C_Ping>
 	{
-		protected override async ETTask Run(Session session, C2G_Ping request, G2C_Ping response, Action reply)
+		protected override async ETTask Run(Session session, C2G_Ping request, G2C_Ping response)
 		{
 			response.Time = TimeHelper.ServerNow();
-			reply();
 			await ETTask.CompletedTask;
 		}
 	}

+ 0 - 1
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/Move/C2M_PathfindingResultHandler.cs

@@ -7,7 +7,6 @@ namespace ET.Server
 		protected override async ETTask Run(Unit unit, C2M_PathfindingResult message)
 		{
 			unit.FindPathMoveToAsync(message.Position).Coroutine();
-			
 			await ETTask.CompletedTask;
 		}
 	}

+ 2 - 1
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/Transfer/C2M_TransferMapHandler.cs

@@ -21,7 +21,8 @@ namespace ET.Server
 			}
 
 			StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(unit.DomainScene().Zone, toMap);
-			TransferHelper.Transfer(unit, startSceneConfig.InstanceId, toMap).Coroutine();
+			
+			TransferHelper.TransferAtFrameFinish(unit, startSceneConfig.InstanceId, toMap).Coroutine();
 		}
 	}
 }

+ 8 - 0
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/Transfer/TransferHelper.cs

@@ -5,6 +5,14 @@ namespace ET.Server
 {
     public static class TransferHelper
     {
+        public static async ETTask TransferAtFrameFinish(Unit unit, long sceneInstanceId, string sceneName)
+        {
+            await Game.WaitFrameFinish();
+
+            await TransferHelper.Transfer(unit, sceneInstanceId, sceneName);
+        }
+        
+
         public static async ETTask Transfer(Unit unit, long sceneInstanceId, string sceneName)
         {
             // location加锁

+ 1 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Realm/C2R_LoginHandler.cs

@@ -7,7 +7,7 @@ namespace ET.Server
 	[MessageHandler(SceneType.Realm)]
 	public class C2R_LoginHandler : AMRpcHandler<C2R_Login, R2C_Login>
 	{
-		protected override async ETTask Run(Session session, C2R_Login request, R2C_Login response, Action reply)
+		protected override async ETTask Run(Session session, C2R_Login request, R2C_Login response)
 		{
 			// 随机分配一个Gate
 			StartSceneConfig config = RealmGateAddressHelper.GetGate(session.DomainZone());
@@ -20,7 +20,6 @@ namespace ET.Server
 			response.Address = config.InnerIPOutPort.ToString();
 			response.Key = g2RGetLoginKey.Key;
 			response.GateId = g2RGetLoginKey.GateId;
-			reply();
 		}
 	}
 }

+ 4 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/AMActorRpcHandler.cs

@@ -23,9 +23,9 @@ namespace ET.Server
                     return;
                 }
 
+                int rpcId = request.RpcId;
                 Response response = Activator.CreateInstance<Response>();
-                response.RpcId = request.RpcId;
-
+                
                 try
                 {
                     await this.Run(ee, request, response);
@@ -36,6 +36,8 @@ namespace ET.Server
                     response.Error = ErrorCore.ERR_RpcFail;
                     response.Message = exception.ToString();
                 }
+                
+                response.RpcId = rpcId;
                 ActorHandleHelper.Reply(fromProcess, response);
             }
             catch (Exception e)

+ 9 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorHandleHelper.cs

@@ -1,4 +1,6 @@
-namespace ET.Server
+using System;
+
+namespace ET.Server
 {
     public static class ActorHandleHelper
     {
@@ -69,6 +71,9 @@
                     await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorRequest);
                     break;
                 }
+                case MailboxType.GateSession:
+                default:
+                    throw new Exception($"no mailboxtype: {mailBoxComponent.MailboxType} {iActorRequest}");
             }
         }
         
@@ -121,10 +126,12 @@
                     if (entity is Session gateSession)
                     {
                         // 发送给客户端
-                        gateSession.Send(0, iActorMessage);
+                        gateSession.Send(iActorMessage);
                     }
                     break;
                 }
+                default:
+                    throw new Exception($"no mailboxtype: {mailBoxComponent.MailboxType} {iActorMessage}");
             }
         }
     }

+ 3 - 3
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorMessageDispatcherComponentSystem.cs

@@ -38,12 +38,12 @@ namespace ET.Server
             }
         }
         
-        public static void Awake(this ActorMessageDispatcherComponent self)
+        private static void Awake(this ActorMessageDispatcherComponent self)
         {
             self.Load();
         }
 
-        public static void Load(this ActorMessageDispatcherComponent self)
+        private static void Load(this ActorMessageDispatcherComponent self)
         {
             self.ActorMessageHandlers.Clear();
 
@@ -76,7 +76,7 @@ namespace ET.Server
                         }
                     }
 
-                    ActorMessageDispatcherInfo actorMessageDispatcherInfo = new ActorMessageDispatcherInfo(actorMessageHandlerAttribute.SceneType, imHandler);
+                    ActorMessageDispatcherInfo actorMessageDispatcherInfo = new(actorMessageHandlerAttribute.SceneType, imHandler);
 
                     self.RegisterHandler(messageType, actorMessageDispatcherInfo);
                 }

+ 4 - 6
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/AMActorLocationHandler.cs

@@ -9,8 +9,7 @@ namespace ET.Server
 
         public async ETTask Handle(Entity entity, int fromProcess, object actorMessage)
         {
-            Message msg = actorMessage as Message;
-            if (msg == null)
+            if (actorMessage is not Message message)
             {
                 Log.Error($"消息类型转换错误: {actorMessage.GetType().FullName} to {typeof (Message).Name}");
                 return;
@@ -21,12 +20,11 @@ namespace ET.Server
                 Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof (E).Name} --{typeof (Message).Name}");
                 return;
             }
-
-            IActorResponse response = (IActorResponse) Activator.CreateInstance(GetResponseType());
-            response.RpcId = msg.RpcId;
+            
+            ActorResponse response = new() {RpcId = message.RpcId};
             ActorHandleHelper.Reply(fromProcess, response);
 
-            await this.Run(e, msg);
+            await this.Run(e, message);
         }
 
         public Type GetRequestType()

+ 3 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/AMActorLocationRpcHandler.cs

@@ -23,9 +23,9 @@ namespace ET.Server
                     return;
                 }
 
+                int rpcId = request.RpcId;
                 Response response = Activator.CreateInstance<Response>();
-                response.RpcId = request.RpcId;
-
+                
                 try
                 {
                     await this.Run(ee, request, response);
@@ -36,6 +36,7 @@ namespace ET.Server
                     response.Error = ErrorCore.ERR_RpcFail;
                     response.Message = exception.ToString();
                 }
+                response.RpcId = rpcId;
                 ActorHandleHelper.Reply(fromProcess, response);
             }
             catch (Exception e)

+ 11 - 16
Unity/Assets/Scripts/Codes/Model/Server/Module/Message/AMRpcHandler.cs

@@ -4,7 +4,7 @@ namespace ET.Server
 {
     public abstract class AMRpcHandler<Request, Response>: IMHandler where Request : class, IRequest where Response : class, IResponse
     {
-        protected abstract ETTask Run(Session session, Request request, Response response, Action reply);
+        protected abstract ETTask Run(Session session, Request request, Response response);
 
         public void Handle(Session session, object message)
         {
@@ -22,34 +22,29 @@ namespace ET.Server
                 }
 
                 int rpcId = request.RpcId;
-
                 long instanceId = session.InstanceId;
 
                 Response response = Activator.CreateInstance<Response>();
 
-                void Reply()
-                {
-                    // 等回调回来,session可以已经断开了,所以需要判断session InstanceId是否一样
-                    if (session.InstanceId != instanceId)
-                    {
-                        return;
-                    }
-
-                    response.RpcId = rpcId;
-                    session.Send(response);
-                }
-
                 try
                 {
-                    await this.Run(session, request, response, Reply);
+                    await this.Run(session, request, response);
                 }
                 catch (Exception exception)
                 {
                     Log.Error(exception);
                     response.Error = ErrorCore.ERR_RpcFail;
                     response.Message = exception.ToString();
-                    Reply();
                 }
+                
+                // 等回调回来,session可以已经断开了,所以需要判断session InstanceId是否一样
+                if (session.InstanceId != instanceId)
+                {
+                    return;
+                }
+                
+                response.RpcId = rpcId; // 在这里设置rpcId是为了防止在Run中不小心修改rpcId字段
+                session.Send(response);
             }
             catch (Exception e)
             {