From 9684c4b7c4fdad50a85e506207239ac89545d06c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 20 五月 2021 18:22:45 +0800
Subject: [PATCH] 5071 【BT2】【主干】【gt_1.100.6】外网出现boss无法死亡。(添加死亡检查日志明细)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py |   49 +++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
index 6147fab..916e36e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
@@ -79,6 +79,7 @@
         
         self.__assistAwardItemID = 0 # 协助奖励礼盒ID
         self.__assistAwardResult = {} # {playerID:{assistPlayerID:{协助玩家信息数据字典}, ...}}
+        self.logDetail = False # 是否输出日志明细
         return
     
     def Clear(self):
@@ -450,12 +451,13 @@
                 
         return
     
-    def RefreshHurtList(self, tick, refreshInterval=3000, isDead=False):
+    def RefreshHurtList(self, tick, refreshInterval=3000, isDead=False, checkCanDead=False):
         ## 刷新伤血列表
         # @return: atkPlayer, hurtID, hurtType
         
         curNPC = self.curNPC
-        
+        self.logDetail = (isDead or checkCanDead)
+            
         if not isDead:
             if refreshInterval and tick - curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_LastRefreshHurtTick) < refreshInterval:
                 return self.__GetAtkObjByHurtList(isDead)
@@ -467,6 +469,9 @@
         for hurtKey in self.__hurtDict.keys():
             #获得伤血对象
             hurtID, hurtType = hurtKey
+            if self.logDetail:
+                GameWorld.Log("    hurtID=%s, hurtType=%s" % (hurtID, hurtType))
+                
             if not hurtID:
                 continue
             
@@ -483,6 +488,9 @@
                     if self.__UnAssistPlayerHurtValidLogic(teamPlayerID, refreshPoint, tick):
                         hurtPlayerDict[teamPlayerID] = teamID
                         
+        if self.logDetail:
+            GameWorld.Log("    hurtPlayerDict=%s" % str(hurtPlayerDict))
+            
         mapID = GameWorld.GetMap().GetMapID()
         if NPCCommon.IsMapNeedBossShunt(mapID):
             self.__UpdBossShuntInfo(mapID, hurtPlayerDict, tick)
@@ -513,11 +521,15 @@
         ## 玩家伤血是否还有效
         
         if playerID not in self.__hurtPlayerDict:
+            if self.logDetail:
+                GameWorld.Log("        playerID=%s not in self.__hurtPlayerDict" % playerID)
             return False
         
         hurtPlayer = self.__GetHurtPlayer(playerID)
         hurtValue = hurtPlayer.GetHurtValue()
         if not hurtValue:
+            if self.logDetail:
+                GameWorld.Log("        playerID=%s not hurtValue" % playerID)
             return False
         
         player = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(playerID)
@@ -525,20 +537,28 @@
             if playerID in self.__noAssitPlayerIDDict:
                 if not AttackCommon.CheckKillNPCByCnt(player, self.curNPC, False):
                     GameWorld.DebugLog("非协助伤血玩家没有攻击boss次数,不计!playerID=%s" % playerID, self.npcID, self.lineID)
+                    if self.logDetail:
+                        GameWorld.Log("        非协助伤血玩家没有攻击boss次数,不计!playerID=%s" % playerID, self.npcID, self.lineID)
                     return False
                 
             if player.GetInitOK() and (not player.GetVisible() or player.GetSightLevel() != self.curNPC.GetSightLevel()):
                 GameWorld.DebugLog("伤血玩家不可见,不计!playerID=%s" % playerID, self.npcID, self.lineID)
+                if self.logDetail:
+                    GameWorld.Log("        伤血玩家不可见,不计!playerID=%s" % playerID, self.npcID, self.lineID)
                 return False
             
             if GameObj.GetHP(player) <= 0 or player.GetPlayerAction() == IPY_GameWorld.paDie:
                 deadTime = player.NomalDictGetProperty(ChConfig.Def_Player_Dict_DeadTime)
                 if time.time() - deadTime >= IpyGameDataPY.GetFuncCfg("BossHurtValue", 1):
                     GameWorld.DebugLog("伤血玩家死亡超过伤血保护时长,不计!playerID=%s" % playerID, self.npcID, self.lineID)
+                    if self.logDetail:
+                        GameWorld.Log("        伤血玩家死亡超过伤血保护时长,不计!playerID=%s" % playerID, self.npcID, self.lineID)
                     return False
                 
             if not self.__GetIsInRefreshPoint(player.GetPosX(), player.GetPosY(), refreshPoint):
                 GameWorld.DebugLog("伤血玩家不在boss范围内,不计!playerID=%s" % playerID, self.npcID, self.lineID)
+                if self.logDetail:
+                    GameWorld.DebugLog("        伤血玩家不在boss范围内,不计!playerID=%s" % playerID, self.npcID, self.lineID)                    
                 return False
             
             return True
@@ -550,14 +570,20 @@
             leavePos = PlayerControl.GetPlayerLeaveServerPos(playerID)
             if not leaveTick or not leavePos:
                 GameWorld.DebugLog("伤血玩家不在本地图或已长久离线,不计!playerID=%s" % playerID, self.npcID, self.lineID)
+                if self.logDetail:
+                    GameWorld.DebugLog("        伤血玩家不在本地图或已长久离线,不计!playerID=%s" % playerID, self.npcID, self.lineID)
                 return False
             
             if tick - leaveTick > ChConfig.Def_PlayerOfflineProtectTime:
                 GameWorld.DebugLog("伤血离线玩家超过保护时长,不计!playerID=%s,tick=%s,leaveTick=%s" % (playerID, tick, leaveTick), self.npcID, self.lineID)
+                if self.logDetail:
+                    GameWorld.DebugLog("        伤血离线玩家超过保护时长,不计!playerID=%s,tick=%s,leaveTick=%s" % (playerID, tick, leaveTick), self.npcID, self.lineID)
                 return False
             
             if not self.__GetIsInRefreshPoint(leavePos[0], leavePos[1], refreshPoint):
                 GameWorld.DebugLog("伤血离线玩家不在保护区域内,不计!playerID=%s,leavePos=%s" % (playerID, leavePos), self.npcID, self.lineID)
+                if self.logDetail:
+                    GameWorld.DebugLog("        伤血离线玩家不在保护区域内,不计!playerID=%s,leavePos=%s" % (playerID, leavePos), self.npcID, self.lineID)
                 return False
             
             return True
@@ -620,11 +646,18 @@
         atkPlayer, atkHurtType, atkHurtID = None, 0, 0
         curNPC = self.curNPC
         refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
+        
+        if self.logDetail:
+            GameWorld.Log("__GetAtkObjByHurtList: %s" % len(self.__hurtSortList))
+            
         for rank, hurtObj in enumerate(self.__hurtSortList, 1):
             
             hurtID = hurtObj.GetValueID()
             hurtType = hurtObj.GetValueType()
             
+            if self.logDetail:
+                GameWorld.Log("    hurtID=%s,hurtType=%s" % (hurtID, hurtType))
+                
             playerIDList = []
             if hurtType == ChConfig.Def_NPCHurtTypePlayer:
                 assistPlayerIDList = self.__noAssitPlayerIDDict.get(hurtID, [])
@@ -649,6 +682,7 @@
                 
                 player = GameWorld.GetObj(playerID, IPY_GameWorld.gotPlayer)
                 if player == None:
+                    playerDisableReason[playerID] = "none"
                     continue
                 
                 if GameObj.GetHP(player) <= 0 or player.GetPlayerAction() == IPY_GameWorld.paDie:
@@ -672,11 +706,18 @@
                     maxHurtValue = hurtValue
                     atkPlayer, atkHurtType, atkHurtID = player, hurtType, hurtID
                     
+            if self.logDetail:
+                GameWorld.Log("    atkHurtType=%s,atkHurtID=%s,playerDisableReason=%s" % (atkHurtType, atkHurtID, str(playerDisableReason)))
+                
             if maxHurtValue:
                 return atkPlayer, atkHurtType, atkHurtID
             
             if rank == 1 and isDead:
                 GameWorld.Log("boss死亡时,第一名团队没有归属权! playerDisableReason=%s" % playerDisableReason)
+                
+            if self.logDetail:
+                GameWorld.Log("    团队没有归属权! rank=%s,hurtID=%s,hurtType=%s,playerDisableReason=%s" 
+                              % (rank, hurtID, hurtType, playerDisableReason))
                 
         return atkPlayer, atkHurtType, atkHurtID
     
@@ -1046,13 +1087,13 @@
     defendHurtList.AddPlayerHurtValue(atkPlayerID, atkPlayer.GetPlayerName(), value, atkPlayer.GetTeamID())
     return True
 
-def RefreshHurtList(curNPC, tick, refreshInterval=3000, isDead=False):
+def RefreshHurtList(curNPC, tick, refreshInterval=3000, isDead=False, checkCanDead=False):
     ## 刷新伤血列表
     # @return: atkPlayer, ownerType, ownerID
     defendHurtList = GetPlayerHurtList(curNPC)
     if not defendHurtList:
         return
-    return defendHurtList.RefreshHurtList(tick, refreshInterval, isDead)
+    return defendHurtList.RefreshHurtList(tick, refreshInterval, isDead, checkCanDead)
 
 def IsAssistPlayer(playerID, defNPC):
     ## 是否协助中的玩家

--
Gitblit v1.8.0