tanghai 7 лет назад
Родитель
Сommit
cad891d5fd

+ 9 - 6
Server/Hotfix/Module/Actor/EntityActorHandler.cs

@@ -12,6 +12,8 @@ namespace ETHotfix
         public async Task Handle(Session session, Entity entity, ActorRequest actorRequest)
         {
 			ActorResponse actorResponse = new ActorResponse();
+	        actorResponse.RpcId = actorRequest.RpcId;
+
 			try
 	        {
 		        OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
@@ -21,8 +23,7 @@ namespace ETHotfix
 				// 发送给客户端
 				Session clientSession = entity as Session;
 		        clientSession.Send(actorResponse.Flag, message);
-
-				actorResponse.RpcId = actorRequest.RpcId;
+				
 		        session.Reply(actorResponse);
 		        await Task.CompletedTask;
 	        }
@@ -30,7 +31,6 @@ namespace ETHotfix
 	        {
 		        actorResponse.Error = ErrorCode.ERR_SessionActorError;
 		        actorResponse.Message = $"session actor error {e}";
-		        actorResponse.RpcId = actorRequest.RpcId;
 				session.Reply(actorResponse);
 				throw;
 	        }
@@ -44,6 +44,7 @@ namespace ETHotfix
 	        OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
 	        Type type = opcodeTypeComponent.GetType(actorRequest.Op);
 	        IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
+
 			await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message);
         }
     }
@@ -63,9 +64,11 @@ namespace ETHotfix
             {
 				Game.Scene.GetComponent<ServerFrameComponent>().Add(aFrameMessage);
 
-	            ActorResponse actorResponse = new ActorResponse();
-	            actorResponse.RpcId = actorRequest.RpcId;
-	            session.Reply(actorResponse);
+				ActorResponse actorResponse = new ActorResponse
+				{
+					RpcId = actorRequest.RpcId
+				};
+				session.Reply(actorResponse);
 				return;
             }
             await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message);

+ 33 - 39
Server/Hotfix/Module/Message/OuterMessageDispatcher.cs

@@ -8,43 +8,42 @@ namespace ETHotfix
 		public async void Dispatch(Session session, Packet packet)
 		{
 			ushort opcode = packet.Opcode();
-			Type messageType = Game.Scene.GetComponent<OpcodeTypeComponent>().GetType(opcode);
+			Type messageType = session.Network.Entity.GetComponent<OpcodeTypeComponent>().GetType(opcode);
 			object message = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);
 			
-			// 如果是帧指令消息,构造成OneFrameMessage发给对应的unit
-			if (message is IFrameMessage)
+			switch (message)
 			{
-				long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
-				ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
-
-				// 这里设置了帧消息的id,防止客户端伪造
-				IFrameMessage iFrameMessage = (IFrameMessage)message;
-				iFrameMessage.Id = unitId;
-
-				OneFrameMessage oneFrameMessage = new OneFrameMessage();
-				oneFrameMessage.Op = opcode;
-				oneFrameMessage.AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage);
-				actorProxy.Send(oneFrameMessage);
-				return;
-			}
-
-			// gate session收到actor消息直接转发给actor自己去处理
-			if (message is IActorMessage)
-			{
-				long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
-				ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
-				actorProxy.Send((IMessage)message);
-				return;
-			}
-
-			// gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
-			if (message is IActorRequest aActorRequest)
-			{
-				long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
-				ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
-				IResponse response = await actorProxy.Call(aActorRequest);
-				session.Reply(response);
-				return;
+				case IFrameMessage iFrameMessage: // 如果是帧消息,构造成OneFrameMessage发给对应的unit
+				{
+					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
+					ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
+
+					// 这里设置了帧消息的id,防止客户端伪造
+					iFrameMessage.Id = unitId;
+
+					OneFrameMessage oneFrameMessage = new OneFrameMessage
+					{
+						Op = opcode,
+						AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage)
+					};
+					actorProxy.Send(oneFrameMessage);
+					return;
+				}
+				case IActorMessage _: // gate session收到actor消息直接转发给actor自己去处理
+				{
+					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
+					ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
+					actorProxy.Send((IMessage)message);
+					return;
+				}
+				case IActorRequest aActorRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
+				{
+					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
+					ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
+					IResponse response = await actorProxy.Call(aActorRequest);
+					session.Reply(response);
+					return;
+				}
 			}
 
 			if (message != null)
@@ -55,10 +54,5 @@ namespace ETHotfix
 
 			throw new Exception($"message type error: {message.GetType().FullName}");
 		}
-
-		public void Dispatch(Session session, ushort opcode, object message)
-		{
-			throw new NotImplementedException();
-		}
 	}
 }

+ 1 - 1
Server/Model/Module/Actor/ActorMessageDispatherComponent.cs

@@ -75,7 +75,7 @@ namespace ETModel
 			return actorHandler;
 		}
 
-		public async Task Handle(Session session, Entity entity, ActorRequest actorRequest, object message)
+		public async Task Handle(Session session, Entity entity, ActorRequest actorRequest, IMessage message)
 		{
 			if (!this.handlers.TryGetValue(message.GetType(), out IMActorHandler handler))
 			{

+ 11 - 24
Server/Model/Module/Actor/ActorProxy.cs

@@ -208,39 +208,26 @@ namespace ETModel
 
 		public void Send(IMessage message)
 		{
-			ActorTask task = new ActorTask();
-			task.message = message;
-			task.proxy = this;
+			ActorTask task = new ActorTask
+			{
+				message = message,
+				proxy = this
+			};
 			this.Add(task);
 		}
 
 		public Task<IResponse> Call(IRequest request)
 		{
-			ActorTask task = new ActorTask();
-			task.message = request;
-			task.proxy = this;
-			task.Tcs = new TaskCompletionSource<IResponse>();
+			ActorTask task = new ActorTask
+			{
+				message = request,
+				proxy = this,
+				Tcs = new TaskCompletionSource<IResponse>()
+			};
 			this.Add(task);
 			return task.Tcs.Task;
 		}
 
-		public async Task<IResponse> RealCall(ActorRequest request, CancellationToken cancellationToken)
-		{
-			try
-			{
-				//Log.Debug($"realcall {MongoHelper.ToJson(request)} {this.Address}");
-				request.Id = this.Id;
-				Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(this.Address);
-				IResponse response = await session.Call(request, cancellationToken);
-				return response;
-			}
-			catch (RpcException e)
-			{
-				Log.Error($"{this.Address} {e}");
-				throw;
-			}
-		}
-
 		public string DebugQueue(Queue<ActorTask> tasks)
 		{
 			string s = "";

+ 1 - 1
Server/Model/Module/Actor/ActorTask.cs

@@ -7,7 +7,7 @@ namespace ETModel
 	{
 		public ActorProxy proxy;
 		
-		public object message;
+		public IMessage message;
 		
 		public TaskCompletionSource<IResponse> Tcs;
 

+ 0 - 1
Unity/Assets/Scripts/Module/Message/MessageDispatherComponent.cs

@@ -28,7 +28,6 @@ namespace ETModel
 	{
 		private readonly Dictionary<ushort, List<IMHandler>> handlers = new Dictionary<ushort, List<IMHandler>>();
 
-
 		public void Awake()
 		{
 			this.Load();

+ 1 - 1
Unity/Assets/Scripts/Module/Message/Session.cs

@@ -240,7 +240,7 @@ namespace ETModel
 			this.Send(0x01, message);
 		}
 
-		public void Send(byte flag, object message)
+		public void Send(byte flag, IMessage message)
 		{
 			OpcodeTypeComponent opcodeTypeComponent = this.Network.Entity.GetComponent<OpcodeTypeComponent>();
 			ushort opcode = opcodeTypeComponent.GetOpcode(message.GetType());

+ 0 - 8
Unity/Hotfix/Module/Message/SessionWrap.cs

@@ -78,10 +78,6 @@ namespace ETHotfix
 			{
 				try
 				{
-					if (response.RpcId != rpcId)
-					{
-						return;
-					}
 					if (response.Error > ErrorCode.ERR_Exception)
 					{
 						throw new RpcException(response.Error, response.Message);
@@ -110,10 +106,6 @@ namespace ETHotfix
 			{
 				try
 				{
-					if (response.RpcId != rpcId)
-					{
-						return;
-					}
 					if (response.Error > ErrorCode.ERR_Exception)
 					{
 						throw new RpcException(response.Error, response.Message);