瀏覽代碼

优化Handler

johnclot69 1 年之前
父節點
當前提交
c0bfe6f28c
共有 25 個文件被更改,包括 232 次插入198 次删除
  1. 0 138
      DotNet/Hotfix/Module/Actor/ActorHandleHelper.cs
  2. 6 2
      DotNet/Hotfix/Module/Actor/ActorMessageDispatcherComponentSystem.cs
  3. 1 1
      DotNet/Hotfix/Module/Actor/ActorMessageSenderComponentSystem.cs
  4. 5 1
      DotNet/Hotfix/Module/ActorLocation/ObjectAddRequestHandler.cs
  5. 2 1
      DotNet/Hotfix/Module/ActorLocation/ObjectGetRequestHandler.cs
  6. 5 1
      DotNet/Hotfix/Module/ActorLocation/ObjectLockRequestHandler.cs
  7. 3 1
      DotNet/Hotfix/Module/ActorLocation/ObjectRemoveRequestHandler.cs
  8. 3 1
      DotNet/Hotfix/Module/ActorLocation/ObjectUnLockRequestHandler.cs
  9. 103 5
      DotNet/Hotfix/Module/Session/NetInnerComponentOnReadEvent.cs
  10. 1 1
      DotNet/Hotfix/Scenes/Benchmark/C2G_BenchmarkHandler.cs
  11. 2 1
      DotNet/Hotfix/Scenes/Game/Handler/C2G_EnterMapHandler.cs
  12. 4 1
      DotNet/Hotfix/Scenes/Game/Handler/C2G_LoginGameHandler.cs
  13. 2 1
      DotNet/Hotfix/Scenes/Game/Handler/C2G_PingHandler.cs
  14. 3 2
      DotNet/Hotfix/Scenes/Game/Handler/R2G_GetLoginKeyHandler.cs
  15. 2 1
      DotNet/Hotfix/Scenes/Map/C2M_TestRobotCaseHandler.cs
  16. 3 2
      DotNet/Hotfix/Scenes/Map/Transfer/C2M_TransferMapHandler.cs
  17. 3 1
      DotNet/Hotfix/Scenes/Map/Transfer/M2M_UnitTransferRequestHandler.cs
  18. 2 1
      DotNet/Hotfix/Scenes/Realm/Handler/C2R_LoginHandler.cs
  19. 5 3
      DotNet/Model/Module/Actor/AMActorHandler.cs
  20. 14 8
      DotNet/Model/Module/Actor/AMActorRpcHandler.cs
  21. 1 1
      DotNet/Model/Module/Actor/IMActorHandler.cs
  22. 9 6
      DotNet/Model/Module/ActorLocation/AMActorLocationHandler.cs
  23. 14 7
      DotNet/Model/Module/ActorLocation/AMActorLocationRpcHandler.cs
  24. 16 11
      DotNet/Model/Module/Message/AMRpcHandler.cs
  25. 23 0
      Unity/Assets/Scripts/Core/Helper/MD5Helper.cs

+ 0 - 138
DotNet/Hotfix/Module/Actor/ActorHandleHelper.cs

@@ -1,138 +0,0 @@
-using System;
-
-namespace ET.Server
-{
-    public static class ActorHandleHelper
-    {
-        public static void Reply(int fromProcess, IActorResponse response)
-        {
-            if (fromProcess == Options.Instance.Process) // 返回消息是同一个进程
-            {
-                // NetInnerComponent.Instance.HandleMessage(realActorId, response); 等同于直接调用下面这句
-                ActorMessageSenderComponent.Instance.HandleIActorResponse(response);
-                return;
-            }
-
-            Session replySession = NetInnerComponent.Instance.Get(fromProcess);
-            replySession.Send(response);
-        }
-        
-        public static void HandleIActorResponse(IActorResponse response)
-        {
-            ActorMessageSenderComponent.Instance.HandleIActorResponse(response);
-        }
-        
-        /// <summary>
-        /// 分发actor消息
-        /// </summary>
-        [EnableAccessEntiyChild]
-        public static async ETTask HandleIActorRequest(long actorId, IActorRequest iActorRequest)
-        {
-            InstanceIdStruct instanceIdStruct = new(actorId);
-            int fromProcess = instanceIdStruct.Process;
-            instanceIdStruct.Process = Options.Instance.Process;
-            long realActorId = instanceIdStruct.ToLong();
-
-            Entity entity = Root.Instance.Get(realActorId);
-            if (entity == null)
-            {
-                IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
-                Reply(fromProcess, response);
-                return;
-            }
-
-            MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
-            if (mailBoxComponent == null)
-            {
-                Log.Warning($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorRequest}");
-                IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
-                Reply(fromProcess, response);
-                return;
-            }
-            
-            switch (mailBoxComponent.MailboxType)
-            {
-                case MailboxType.MessageDispatcher:
-                {
-                    using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId))
-                    {
-                        if (entity.InstanceId != realActorId)
-                        {
-                            IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
-                            Reply(fromProcess, response);
-                            break;
-                        }
-                        await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorRequest);
-                    }
-                    break;
-                }
-                case MailboxType.UnOrderMessageDispatcher:
-                {
-                    await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorRequest);
-                    break;
-                }
-                case MailboxType.GateSession:
-                default:
-                    throw new Exception($"no mailboxtype: {mailBoxComponent.MailboxType} {iActorRequest}");
-            }
-        }
-        
-        /// <summary>
-        /// 分发actor消息
-        /// </summary>
-        [EnableAccessEntiyChild]
-        public static async ETTask HandleIActorMessage(long actorId, IActorMessage iActorMessage)
-        {
-            InstanceIdStruct instanceIdStruct = new(actorId);
-            int fromProcess = instanceIdStruct.Process;
-            instanceIdStruct.Process = Options.Instance.Process;
-            long realActorId = instanceIdStruct.ToLong();
-            
-            Entity entity = Root.Instance.Get(realActorId);
-            if (entity == null)
-            {
-                Log.Error($"not found actor: {realActorId} {iActorMessage}");
-                return;
-            }
-            
-            MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
-            if (mailBoxComponent == null)
-            {
-                Log.Error($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorMessage}");
-                return;
-            }
-
-            switch (mailBoxComponent.MailboxType)
-            {
-                case MailboxType.MessageDispatcher:
-                {
-                    using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId))
-                    {
-                        if (entity.InstanceId != realActorId)
-                        {
-                            break;
-                        }
-                        await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorMessage);
-                    }
-                    break;
-                }
-                case MailboxType.UnOrderMessageDispatcher:
-                {
-                    await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorMessage);
-                    break;
-                }
-                case MailboxType.GateSession:
-                {
-                    if (entity is Session gateSession)
-                    {
-                        // 发送给客户端
-                        gateSession.Send(iActorMessage);
-                    }
-                    break;
-                }
-                default:
-                    throw new Exception($"no mailboxtype: {mailBoxComponent.MailboxType} {iActorMessage}");
-            }
-        }
-    }
-}

+ 6 - 2
DotNet/Hotfix/Module/Actor/ActorMessageDispatcherComponentSystem.cs

@@ -93,7 +93,11 @@ namespace ET.Server
             self.ActorMessageHandlers[type].Add(handler);
         }
 
-        public static async ETTask Handle(this ActorMessageDispatcherComponent self, Entity entity, int fromProcess, object message)
+        /// <summary>
+        /// 分发actor消息
+        /// </summary>
+        public static async ETTask Handle(
+        this ActorMessageDispatcherComponent self, Entity entity, object message, Action<IActorResponse> reply)
         {
             List<ActorMessageDispatcherInfo> list;
             if (!self.ActorMessageHandlers.TryGetValue(message.GetType(), out list))
@@ -108,7 +112,7 @@ namespace ET.Server
                 {
                     continue;
                 }
-                await actorMessageDispatcherInfo.IMActorHandler.Handle(entity, fromProcess, message);   
+                await actorMessageDispatcherInfo.IMActorHandler.Handle(entity, message, reply);  
             }
         }
     }

+ 1 - 1
DotNet/Hotfix/Module/Actor/ActorMessageSenderComponentSystem.cs

@@ -168,7 +168,7 @@ namespace ET.Server
             return response;
         }
 
-        public static void HandleIActorResponse(this ActorMessageSenderComponent self, IActorResponse response)
+        public static void RunMessage(this ActorMessageSenderComponent self, long actorId, IActorResponse response)
         {
             ActorMessageSender actorMessageSender;
             if (!self.requestCallback.TryGetValue(response.RpcId, out actorMessageSender))

+ 5 - 1
DotNet/Hotfix/Module/ActorLocation/ObjectAddRequestHandler.cs

@@ -5,9 +5,13 @@ namespace ET.Server
     [ActorMessageHandler(SceneType.Location)]
     public class ObjectAddRequestHandler: AMActorRpcHandler<Scene, ObjectAddRequest, ObjectAddResponse>
     {
-        protected override async ETTask Run(Scene scene, ObjectAddRequest request, ObjectAddResponse response)
+        protected override async ETTask Run(Scene scene, ObjectAddRequest request, ObjectAddResponse response, Action reply)
         {
             await scene.GetComponent<LocationComponent>().Add(request.Key, request.InstanceId);
+
+            reply();
+
+            await ETTask.CompletedTask;
         }
     }
 }

+ 2 - 1
DotNet/Hotfix/Module/ActorLocation/ObjectGetRequestHandler.cs

@@ -5,10 +5,11 @@ namespace ET.Server
     [ActorMessageHandler(SceneType.Location)]
     public class ObjectGetRequestHandler: AMActorRpcHandler<Scene, ObjectGetRequest, ObjectGetResponse>
     {
-        protected override async ETTask Run(Scene scene, ObjectGetRequest request, ObjectGetResponse response)
+        protected override async ETTask Run(Scene scene, ObjectGetRequest request, ObjectGetResponse response, Action reply)
         {
             long instanceId = await scene.GetComponent<LocationComponent>().Get(request.Key);
             response.InstanceId = instanceId;
+            reply();
         }
     }
 }

+ 5 - 1
DotNet/Hotfix/Module/ActorLocation/ObjectLockRequestHandler.cs

@@ -5,9 +5,13 @@ namespace ET.Server
     [ActorMessageHandler(SceneType.Location)]
     public class ObjectLockRequestHandler: AMActorRpcHandler<Scene, ObjectLockRequest, ObjectLockResponse>
     {
-        protected override async ETTask Run(Scene scene, ObjectLockRequest request, ObjectLockResponse response)
+        protected override async ETTask Run(Scene scene, ObjectLockRequest request, ObjectLockResponse response, Action reply)
         {
             await scene.GetComponent<LocationComponent>().Lock(request.Key, request.InstanceId, request.Time);
+
+            reply();
+
+            await ETTask.CompletedTask;
         }
     }
 }

+ 3 - 1
DotNet/Hotfix/Module/ActorLocation/ObjectRemoveRequestHandler.cs

@@ -5,9 +5,11 @@ namespace ET.Server
     [ActorMessageHandler(SceneType.Location)]
     public class ObjectRemoveRequestHandler: AMActorRpcHandler<Scene, ObjectRemoveRequest, ObjectRemoveResponse>
     {
-        protected override async ETTask Run(Scene scene, ObjectRemoveRequest request, ObjectRemoveResponse response)
+        protected override async ETTask Run(Scene scene, ObjectRemoveRequest request, ObjectRemoveResponse response, Action reply)
         {
             await scene.GetComponent<LocationComponent>().Remove(request.Key);
+
+            reply();
         }
     }
 }

+ 3 - 1
DotNet/Hotfix/Module/ActorLocation/ObjectUnLockRequestHandler.cs

@@ -5,10 +5,12 @@ namespace ET.Server
     [ActorMessageHandler(SceneType.Location)]
     public class ObjectUnLockRequestHandler: AMActorRpcHandler<Scene, ObjectUnLockRequest, ObjectUnLockResponse>
     {
-        protected override async ETTask Run(Scene scene, ObjectUnLockRequest request, ObjectUnLockResponse response)
+        protected override async ETTask Run(Scene scene, ObjectUnLockRequest request, ObjectUnLockResponse response, Action reply)
         {
             scene.GetComponent<LocationComponent>().UnLock(request.Key, request.OldInstanceId, request.InstanceId);
 
+            reply();
+            
             await ETTask.CompletedTask;
         }
     }

+ 103 - 5
DotNet/Hotfix/Module/Session/NetInnerComponentOnReadEvent.cs

@@ -5,29 +5,129 @@ namespace ET.Server
     [Event(SceneType.Process)]
     public class NetInnerComponentOnReadEvent: AEvent<NetInnerComponentOnRead>
     {
+        [EnableAccessEntiyChild]
         protected override async ETTask Run(Scene scene, NetInnerComponentOnRead args)
         {
             try
             {
                 long actorId = args.ActorId;
                 object message = args.Message;
+
+                InstanceIdStruct instanceIdStruct = new(actorId);
+                int fromProcess = instanceIdStruct.Process;
+                instanceIdStruct.Process = Options.Instance.Process;
+                long realActorId = instanceIdStruct.ToLong();
                 
                 // 收到actor消息,放入actor队列
                 switch (message)
                 {
                     case IActorResponse iActorResponse:
                     {
-                        ActorHandleHelper.HandleIActorResponse(iActorResponse);
+                        ActorMessageSenderComponent.Instance.RunMessage(realActorId, iActorResponse);
                         break;
                     }
                     case IActorRequest iActorRequest:
                     {
-                        await ActorHandleHelper.HandleIActorRequest(actorId, iActorRequest);
+                        void Reply(IActorResponse response)
+                        {
+                            if (fromProcess == Options.Instance.Process) // 返回消息是同一个进程
+                            {
+                                // NetInnerComponent.Instance.HandleMessage(realActorId, response); 等同于直接调用下面这句
+                                ActorMessageSenderComponent.Instance.RunMessage(realActorId, response);
+                                return;
+                            }
+                            
+                            Session replySession = NetInnerComponent.Instance.Get(fromProcess);
+                            // 发回真实的actorId 做查问题使用
+                            replySession.Send(realActorId, response);
+                        }
+                        
+                        Entity entity = Root.Instance.Get(realActorId);
+                        if (entity == null)
+                        {
+                            IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
+                            Reply(response);
+                            break;
+                        }
+
+                        MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
+                        if (mailBoxComponent == null)
+                        {
+                            Log.Warning($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorRequest}");
+                            IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
+                            Reply(response);
+                            break;
+                        }
+
+                        switch (mailBoxComponent.MailboxType)
+                        {
+                            case MailboxType.MessageDispatcher:
+                            {
+                                using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId))
+                                {
+                                    if (entity.InstanceId != realActorId)
+                                    {
+                                        IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
+                                        Reply(response);
+                                        break;
+                                    }
+                                    await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorRequest, Reply);
+                                }
+                                break;
+                            }
+                            case MailboxType.UnOrderMessageDispatcher:
+                            {
+                                await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorRequest, Reply);
+                                break;
+                            }
+                        }
                         break;
                     }
                     case IActorMessage iActorMessage:
                     {
-                        await ActorHandleHelper.HandleIActorMessage(actorId, iActorMessage);
+                        Entity entity = Root.Instance.Get(realActorId);
+                        if (entity == null)
+                        {
+                            Log.Error($"not found actor: {scene.Name} {realActorId} {message}");
+                            break;
+                        }
+                        
+                        MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
+                        if (mailBoxComponent == null)
+                        {
+                            Log.Error($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorMessage}");
+                            break;
+                        }
+
+                        switch (mailBoxComponent.MailboxType)
+                        {
+                            case MailboxType.MessageDispatcher:
+                            {
+                                using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId))
+                                {
+                                    if (entity.InstanceId != realActorId)
+                                    {
+                                        break;
+                                    }
+                                    await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorMessage, null);
+                                }
+                                break;
+                            }
+                            case MailboxType.UnOrderMessageDispatcher:
+                            {
+                                await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorMessage, null);
+                                break;
+                            }
+                            case MailboxType.GateSession:
+                            {
+                                if (entity is Session gateSession)
+                                {
+                                    // 发送给客户端
+                                    gateSession.Send(0, iActorMessage);
+                                }
+                                break;
+                            }
+                        }
                         break;
                     }
                 }
@@ -36,8 +136,6 @@ namespace ET.Server
             {
                 Log.Error($"InnerMessageDispatcher error: {args.Message.GetType().Name}\n{e}");
             }
-
-            await ETTask.CompletedTask;
         }
     }
 }

+ 1 - 1
DotNet/Hotfix/Scenes/Benchmark/C2G_BenchmarkHandler.cs

@@ -5,7 +5,7 @@ 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)
+        protected override async ETTask Run(Session session, C2G_Benchmark request, G2C_Benchmark response, Action reply)
         {            
             BenchmarkServerComponent benchmarkServerComponent = session.DomainScene().GetComponent<BenchmarkServerComponent>();
             if (benchmarkServerComponent.Count++ % 1000000 == 0)

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

@@ -5,7 +5,7 @@ namespace ET.Server
 	[MessageHandler(SceneType.Game)]
 	public class C2G_EnterMapHandler : AMRpcHandler<C2G_EnterMap, G2C_EnterMap>
 	{
-		protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response)
+		protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply)
 		{
 			Player player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
 
@@ -21,6 +21,7 @@ namespace ET.Server
 			
 			StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(session.DomainZone(), "Map1");
 			response.MyId = player.Id;
+			reply();
 
 			// 等到一帧的最后面再传送,先让G2C_EnterMap返回,否则传送消息可能比G2C_EnterMap还早
 			TransferHelper.TransferAtFrameFinish(unit, startSceneConfig.InstanceId, startSceneConfig.Name).Coroutine();

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

@@ -8,7 +8,7 @@ namespace ET.Server
 	[MessageHandler(SceneType.Game)]
 	public class C2G_LoginGameHandler : AMRpcHandler<C2G_LoginGame, G2C_LoginGame>
 	{
-		protected override async ETTask Run(Session session, C2G_LoginGame request, G2C_LoginGame response)
+		protected override async ETTask Run(Session session, C2G_LoginGame request, G2C_LoginGame response, Action reply)
 		{
 			if (session.DomainScene().SceneType != SceneType.Game)
 			{
@@ -21,6 +21,7 @@ namespace ET.Server
 			if (session.GetComponent<SessionLockComponent>() != null)
 			{
 				response.Error = ErrorCode.ERR_RequestRepeatedly;
+				reply();
 				return;
 			}
 			
@@ -30,6 +31,7 @@ namespace ET.Server
 			{
 				response.Error = ErrorCore.ERR_ConnectGateKeyError;
 				response.Message = "Game key验证失败!";
+				reply();
 				return;
 			}
 			
@@ -43,6 +45,7 @@ namespace ET.Server
 			session.AddComponent<MailBoxComponent, MailboxType>(MailboxType.GateSession);
 
 			response.PlayerId = player.Id;
+			reply();
 			await ETTask.CompletedTask;
 		}
 	}

+ 2 - 1
DotNet/Hotfix/Scenes/Game/Handler/C2G_PingHandler.cs

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

+ 3 - 2
DotNet/Hotfix/Scenes/Game/Handler/R2G_GetLoginKeyHandler.cs

@@ -3,17 +3,18 @@
 namespace ET.Server
 {
 	/// <summary>
-	/// 获取登录key
+	/// 获取游戏服登录key
 	/// </summary>
 	[ActorMessageHandler(SceneType.Game)]
 	public class R2G_GetLoginKeyHandler : AMActorRpcHandler<Scene, R2G_GetLoginKey, G2R_GetLoginKey>
 	{
-		protected override async ETTask Run(Scene scene, R2G_GetLoginKey request, G2R_GetLoginKey response)
+		protected override async ETTask Run(Scene scene, R2G_GetLoginKey request, G2R_GetLoginKey response, Action reply)
 		{
 			long key = RandomGenerator.RandInt64();
 			scene.GetComponent<GameSessionKeyComponent>().Add(key, request.Account);
 			response.Key = key;
 			response.GameId = scene.Id;
+			reply();
 			await ETTask.CompletedTask;
 		}
 	}

+ 2 - 1
DotNet/Hotfix/Scenes/Map/C2M_TestRobotCaseHandler.cs

@@ -5,9 +5,10 @@ namespace ET.Server
 	[ActorMessageHandler(SceneType.Map)]
 	public class C2M_TestRobotCaseHandler : AMActorLocationRpcHandler<Unit, C2M_TestRobotCase, M2C_TestRobotCase>
 	{
-		protected override async ETTask Run(Unit unit, C2M_TestRobotCase request, M2C_TestRobotCase response)
+		protected override async ETTask Run(Unit unit, C2M_TestRobotCase request, M2C_TestRobotCase response, Action reply)
 		{
 			response.N = request.N;
+			reply();
 			await ETTask.CompletedTask;
 		}
 	}

+ 3 - 2
DotNet/Hotfix/Scenes/Map/Transfer/C2M_TransferMapHandler.cs

@@ -5,7 +5,7 @@ namespace ET.Server
 	[ActorMessageHandler(SceneType.Map)]
 	public class C2M_TransferMapHandler : AMActorLocationRpcHandler<Unit, C2M_TransferMap, M2C_TransferMap>
 	{
-		protected override async ETTask Run(Unit unit, C2M_TransferMap request, M2C_TransferMap response)
+		protected override async ETTask Run(Unit unit, C2M_TransferMap request, M2C_TransferMap response, Action reply)
 		{
 			await ETTask.CompletedTask;
 
@@ -21,8 +21,9 @@ namespace ET.Server
 			}
 
 			StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(unit.DomainScene().Zone, toMap);
-			
 			TransferHelper.TransferAtFrameFinish(unit, startSceneConfig.InstanceId, toMap).Coroutine();
+
+			reply();
 		}
 	}
 }

+ 3 - 1
DotNet/Hotfix/Scenes/Map/Transfer/M2M_UnitTransferRequestHandler.cs

@@ -6,8 +6,10 @@ namespace ET.Server
 	[ActorMessageHandler(SceneType.Map)]
 	public class M2M_UnitTransferRequestHandler : AMActorRpcHandler<Scene, M2M_UnitTransferRequest, M2M_UnitTransferResponse>
 	{
-		protected override async ETTask Run(Scene scene, M2M_UnitTransferRequest request, M2M_UnitTransferResponse response)
+		protected override async ETTask Run(Scene scene, M2M_UnitTransferRequest request, M2M_UnitTransferResponse response, Action reply)
 		{
+			reply();
+			
 			UnitComponent unitComponent = scene.GetComponent<UnitComponent>();
 			Unit unit = MongoHelper.Deserialize<Unit>(request.Unit);
 			

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

@@ -9,7 +9,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)
+		protected override async ETTask Run(Session session, C2R_Login request, R2C_Login response, Action reply)
 		{
 			if (session.DomainScene().SceneType != SceneType.Realm)
 			{
@@ -38,6 +38,7 @@ namespace ET.Server
 			response.Address = config.InnerIPOutPort.ToString();
 			response.Key = g2RGetLoginKey.Key;
 			response.GameId = g2RGetLoginKey.GameId;
+			reply();
 		}
 	}
 }

+ 5 - 3
DotNet/Hotfix/Module/Actor/AMActorHandler.cs → DotNet/Model/Module/Actor/AMActorHandler.cs

@@ -7,15 +7,17 @@ namespace ET.Server
     {
         protected abstract ETTask Run(E entity, Message message);
 
-        public async ETTask Handle(Entity entity, int fromProcess, object actorMessage)
+        public async ETTask Handle(Entity entity, object actorMessage, Action<IActorResponse> reply)
         {
-            if (actorMessage is not Message msg)
+            Message msg = actorMessage as Message;
+            if (msg == null)
             {
                 Log.Error($"消息类型转换错误: {actorMessage.GetType().FullName} to {typeof (Message).Name}");
                 return;
             }
 
-            if (entity is not E e)
+            E e = entity as E;
+            if (e == null)
             {
                 Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof (E).Name} --{typeof (Message).Name}");
                 return;

+ 14 - 8
DotNet/Hotfix/Module/Actor/AMActorRpcHandler.cs → DotNet/Model/Module/Actor/AMActorRpcHandler.cs

@@ -5,19 +5,21 @@ namespace ET.Server
     [EnableClass]
     public abstract class AMActorRpcHandler<E, Request, Response>: IMActorHandler where E : Entity where Request : class, IActorRequest where Response : class, IActorResponse
     {
-        protected abstract ETTask Run(E unit, Request request, Response response);
+        protected abstract ETTask Run(E unit, Request request, Response response, Action reply);
 
-        public async ETTask Handle(Entity entity, int fromProcess, object actorMessage)
+        public async ETTask Handle(Entity entity, object actorMessage, Action<IActorResponse> reply)
         {
             try
             {
-                if (actorMessage is not Request request)
+                Request request = actorMessage as Request;
+                if (request == null)
                 {
                     Log.Error($"消息类型转换错误: {actorMessage.GetType().FullName} to {typeof (Request).Name}");
                     return;
                 }
 
-                if (entity is not E ee)
+                E ee = entity as E;
+                if (ee == null)
                 {
                     Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof (E).Name} --{typeof (Request).Name}");
                     return;
@@ -26,19 +28,23 @@ namespace ET.Server
                 int rpcId = request.RpcId;
                 Response response = Activator.CreateInstance<Response>();
                 
+                void Reply()
+                {
+                    response.RpcId = rpcId;
+                    reply.Invoke(response);
+                }
+                
                 try
                 {
-                    await this.Run(ee, request, response);
+                    await this.Run(ee, request, response, Reply);
                 }
                 catch (Exception exception)
                 {
                     Log.Error(exception);
                     response.Error = ErrorCore.ERR_RpcFail;
                     response.Message = exception.ToString();
+                    Reply();
                 }
-                
-                response.RpcId = rpcId;
-                ActorHandleHelper.Reply(fromProcess, response);
             }
             catch (Exception e)
             {

+ 1 - 1
DotNet/Model/Module/Actor/IMActorHandler.cs

@@ -4,7 +4,7 @@ namespace ET.Server
 {
     public interface IMActorHandler
     {
-        ETTask Handle(Entity entity, int fromProcess, object actorMessage);
+        ETTask Handle(Entity entity, object actorMessage, Action<IActorResponse> reply);
         Type GetRequestType();
         Type GetResponseType();
     }

+ 9 - 6
DotNet/Hotfix/Module/ActorLocation/AMActorLocationHandler.cs → DotNet/Model/Module/ActorLocation/AMActorLocationHandler.cs

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

+ 14 - 7
DotNet/Hotfix/Module/ActorLocation/AMActorLocationRpcHandler.cs → DotNet/Model/Module/ActorLocation/AMActorLocationRpcHandler.cs

@@ -5,19 +5,21 @@ namespace ET.Server
     [EnableClass]
     public abstract class AMActorLocationRpcHandler<E, Request, Response>: IMActorHandler where E : Entity where Request : class, IActorLocationRequest where Response : class, IActorLocationResponse
     {
-        protected abstract ETTask Run(E unit, Request request, Response response);
+        protected abstract ETTask Run(E unit, Request request, Response response, Action reply);
 
-        public async ETTask Handle(Entity entity, int fromProcess, object actorMessage)
+        public async ETTask Handle(Entity entity, object actorMessage, Action<IActorResponse> reply)
         {
             try
             {
-                if (actorMessage is not Request request)
+                Request request = actorMessage as Request;
+                if (request == null)
                 {
                     Log.Error($"消息类型转换错误: {actorMessage.GetType().FullName} to {typeof (Request).Name}");
                     return;
                 }
 
-                if (entity is not E ee)
+                E ee = entity as E;
+                if (ee == null)
                 {
                     Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof (E).Name} --{typeof (Request).Name}");
                     return;
@@ -26,18 +28,23 @@ namespace ET.Server
                 int rpcId = request.RpcId;
                 Response response = Activator.CreateInstance<Response>();
                 
+                void Reply()
+                {
+                    response.RpcId = rpcId;
+                    reply.Invoke(response);
+                }
+                
                 try
                 {
-                    await this.Run(ee, request, response);
+                    await this.Run(ee, request, response, Reply);
                 }
                 catch (Exception exception)
                 {
                     Log.Error(exception);
                     response.Error = ErrorCore.ERR_RpcFail;
                     response.Message = exception.ToString();
+                    Reply();
                 }
-                response.RpcId = rpcId;
-                ActorHandleHelper.Reply(fromProcess, response);
             }
             catch (Exception e)
             {

+ 16 - 11
DotNet/Model/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);
+        protected abstract ETTask Run(Session session, Request request, Response response, Action reply);
 
         public void Handle(Session session, object message)
         {
@@ -22,29 +22,34 @@ 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);
+                    await this.Run(session, request, response, Reply);
                 }
                 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)
             {

+ 23 - 0
Unity/Assets/Scripts/Core/Helper/MD5Helper.cs

@@ -1,10 +1,16 @@
 using System.IO;
 using System.Security.Cryptography;
+using System.Text;
 
 namespace ET
 {
 	public static class MD5Helper
 	{
+		/// <summary>
+		/// 获取文件md5
+		/// </summary>
+		/// <param name="filePath"></param>
+		/// <returns></returns>
 		public static string FileMD5(string filePath)
 		{
 			byte[] retVal;
@@ -15,5 +21,22 @@ namespace ET
 			}
 			return retVal.ToHex("x2");
 		}
+		
+		/// <summary>
+		/// 获取字符串md5
+		/// </summary>
+		/// <param name="str"></param>
+		/// <returns></returns>
+		public static string StringMD5(string str)
+		{
+			byte[] retVal = Encoding.GetEncoding("UTF-8").GetBytes(str);
+			byte[] hashValue = MD5.Create().ComputeHash(retVal);
+			StringBuilder tmp = new StringBuilder();
+			foreach (byte i in hashValue)
+			{
+				tmp.Append(i.ToString("x2"));
+			}
+			return tmp.ToString();
+		}
 	}
 }