Quellcode durchsuchen

修复一个bug,location消息发送失败会记录error在MessageLocationSender上。而MessageLocationSender保存时间太长,如果玩家下线飞快立即上线,会导致MessageLocationSender还是之前那个,结果发送消息失败

现在改成发送消息notfoundactor之后立即删除MessageLocationSender,这样队列中的消息在获取协程锁之后会发现MessageLocationSender的InstanceId跟之前不一样,照样返回notfoundactor错误。而新发送的消息会创建新的MessageLocationSender,这样会重新获取location
tanghai vor 2 Jahren
Ursprung
Commit
de22e4b6ff

+ 4 - 10
Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/MessageLocationSenderComponentSystem.cs

@@ -192,15 +192,9 @@ namespace ET.Server
             {
                 if (messageLocationSender.InstanceId != actorLocationSenderInstanceId)
                 {
-                    throw new RpcException(ErrorCore.ERR_MessageTimeout, $"{iRequest}");
+                    throw new RpcException(ErrorCore.ERR_NotFoundActor, $"{iRequest}");
                 }
 
-                // 队列中没处理的消息返回跟上个消息一样的报错
-                if (messageLocationSender.Error == ErrorCore.ERR_NotFoundActor)
-                {
-                    return MessageHelper.CreateResponse(iRequest, messageLocationSender.Error);
-                }
-                
                 try
                 {
                     return await self.CallInner(messageLocationSender, rpcId, iRequest);
@@ -239,7 +233,6 @@ namespace ET.Server
 
                 if (messageLocationSender.ActorId == default)
                 {
-                    messageLocationSender.Error = ErrorCore.ERR_NotFoundActor;
                     return MessageHelper.CreateResponse(iRequest, ErrorCore.ERR_NotFoundActor);
                 }
                 IResponse response = await root.GetComponent<MessageSender>().Call(messageLocationSender.ActorId, rpcId, iRequest, needException: false);
@@ -258,8 +251,9 @@ namespace ET.Server
                         if (failTimes > 20)
                         {
                             Log.Debug($"actor send message fail, actorid: {messageLocationSender.Id} {iRequest}");
-                            messageLocationSender.Error = ErrorCore.ERR_NotFoundActor;
-                            // 这里不能删除actor,要让后面等待发送的消息也返回ERR_NotFoundActor,直到超时删除
+                            
+                            // 这里删除actor,后面等待发送的消息会判断InstanceId,InstanceId不一致返回ERR_NotFoundActor
+                            self.Remove(messageLocationSender.Id);
                             return response;
                         }
 

+ 0 - 2
Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/MessageLocationSenderSystem.cs

@@ -11,7 +11,6 @@ namespace ET.Server
         {
             self.LastSendOrRecvTime = TimeInfo.Instance.ServerNow();
             self.ActorId = default;
-            self.Error = 0;
         }
         
         [EntitySystem]
@@ -20,7 +19,6 @@ namespace ET.Server
             Log.Debug($"actor location remove: {self.Id}");
             self.LastSendOrRecvTime = 0;
             self.ActorId = default;
-            self.Error = 0;
         }
     }
 }

+ 0 - 2
Unity/Assets/Scripts/Model/Server/Module/ActorLocation/MessageLocationSender.cs

@@ -10,7 +10,5 @@ namespace ET.Server
 
         // 最近接收或者发送消息的时间
         public long LastSendOrRecvTime;
-
-        public int Error;
     }
 }