Просмотр исходного кода

限制ActorLocationSender的Call方法返回值类型必须是IActorLocationResponse

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

+ 16 - 5
Server/Hotfix/Module/ActorLocation/ActorLocationSenderSystem.cs

@@ -174,7 +174,18 @@ namespace ETHotfix
 					self.LastSendTime = TimeHelper.Now();
 					self.FailTimes = 0;
 					self.WaitingTasks.Dequeue();
-					task.Tcs?.SetResult(response);
+					
+					if (task.Tcs == null)
+					{
+						return;
+					}
+					
+					IActorLocationResponse actorLocationResponse = response as IActorLocationResponse;
+					if (actorLocationResponse == null)
+					{
+						task.Tcs.SetException(new Exception($"actor location respose is not IActorLocationResponse, but is: {response.GetType().Name}"));
+					}
+					task.Tcs.SetResult(actorLocationResponse);
 					return;
 			}
 		}
@@ -183,19 +194,19 @@ namespace ETHotfix
 	    {
 		    if (request == null)
 		    {
-			    throw new Exception($"actor send message is null");
+			    throw new Exception($"actor location send message is null");
 		    }
 		    ActorTask task = new ActorTask(request);
 		    self.Add(task);
 	    }
 
-		public static Task<IActorResponse> Call(this ActorLocationSender self, IActorLocationRequest request)
+		public static Task<IActorLocationResponse> Call(this ActorLocationSender self, IActorLocationRequest request)
 		{
 			if (request == null)
 			{
-				throw new Exception($"actor call message is null");
+				throw new Exception($"actor location call message is null");
 			}
-			TaskCompletionSource<IActorResponse> tcs = new TaskCompletionSource<IActorResponse>();
+			TaskCompletionSource<IActorLocationResponse> tcs = new TaskCompletionSource<IActorLocationResponse>();
 			ActorTask task = new ActorTask(request, tcs);
 			self.Add(task);
 			return task.Tcs.Task;

+ 9 - 9
Server/Hotfix/Module/Message/OuterMessageDispatcher.cs

@@ -27,23 +27,23 @@ namespace ETHotfix
 						actorLocationSender.Send(oneFrameMessage);
 						return;
 					}
-					case IActorLocationMessage clientActorMessage:
+					case IActorLocationRequest actorLocationRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
 					{
 						long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
 						ActorLocationSender actorLocationSender = Game.Scene.GetComponent<ActorLocationSenderComponent>().Get(unitId);
-						actorLocationSender.Send(clientActorMessage);
+
+						int rpcId = actorLocationRequest.RpcId; // 这里要保存客户端的rpcId
+						IResponse response = await actorLocationSender.Call(actorLocationRequest);
+						response.RpcId = rpcId;
+
+						session.Reply(response);
 						return;
 					}
-					case IActorLocationRequest clientActorRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
+					case IActorLocationMessage actorLocationMessage:
 					{
 						long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
 						ActorLocationSender actorLocationSender = Game.Scene.GetComponent<ActorLocationSenderComponent>().Get(unitId);
-
-						int rpcId = clientActorRequest.RpcId; // 这里要保存客户端的rpcId
-						IResponse response = await actorLocationSender.Call(clientActorRequest);
-						response.RpcId = rpcId;
-
-						session.Reply(response);
+						actorLocationSender.Send(actorLocationMessage);
 						return;
 					}
 				}

+ 2 - 2
Server/Model/Module/Actor/ActorMessageSender.cs

@@ -6,9 +6,9 @@ namespace ETModel
 	public struct ActorMessageSender
 	{
 		// actor的地址
-		public IPEndPoint Address;
+		public IPEndPoint Address { get; }
 
-		public long ActorId;
+		public long ActorId { get; }
 
 		public ActorMessageSender(long actorId, IPEndPoint address)
 		{

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

@@ -6,15 +6,15 @@ namespace ETModel
 	{
 		public IActorRequest ActorRequest;
 		
-		public TaskCompletionSource<IActorResponse> Tcs;
+		public TaskCompletionSource<IActorLocationResponse> Tcs;
 
-		public ActorTask(IActorRequest actorRequest)
+		public ActorTask(IActorLocationMessage actorRequest)
 		{
 			this.ActorRequest = actorRequest;
 			this.Tcs = null;
 		}
 		
-		public ActorTask(IActorRequest actorRequest, TaskCompletionSource<IActorResponse> tcs)
+		public ActorTask(IActorLocationRequest actorRequest, TaskCompletionSource<IActorLocationResponse> tcs)
 		{
 			this.ActorRequest = actorRequest;
 			this.Tcs = tcs;