From 26a116683bd08fe6705f12d6386068a801b702b9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 03 四月 2020 18:11:33 +0800
Subject: [PATCH] 4475 【主干】免费送的3个仙盟,概率随机重名导致无法创建(手动创建与系统随机仙盟名相同的默认当做创建该系统仙盟,防止重复)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py |   65 +++++++++++++++++++++++---------
 1 files changed, 46 insertions(+), 19 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 7ceffe5..73a3458 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
@@ -431,12 +431,10 @@
         # @return: atkPlayer, hurtID, hurtType
         
         curNPC = self.curNPC
-        if not self.__hurtDict:
-            return
         
         if not isDead:
             if refreshInterval and tick - curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_LastRefreshHurtTick) < refreshInterval:
-                return self.__GetAtkObjByHurtList()
+                return self.__GetAtkObjByHurtList(isDead)
             
         curNPC.SetDict(ChConfig.Def_NPC_Dict_LastRefreshHurtTick, tick)
         
@@ -472,7 +470,7 @@
             
         isInHurt = self.__hurtSortList != []
         curNPC.SetDict(ChConfig.Def_NPC_Dict_InHurtProtect, isInHurt)
-        return self.__GetAtkObjByHurtList()
+        return self.__GetAtkObjByHurtList(isDead)
     
     def __UnAssistPlayerHurtValidLogic(self, playerID, refreshPoint, tick):
         ## 非协助玩家伤血有效性检查逻辑
@@ -588,7 +586,7 @@
                 
         return
     
-    def __GetAtkObjByHurtList(self):
+    def __GetAtkObjByHurtList(self, isDead):
         '''第一个可攻击的最大伤血对象,也是实际的归属者或队伍
         因为玩家伤血掉线、死亡有一定时间的保留机制,故最大伤血不一定是可攻击目标(归属者)
         注意: 该规则必须与最终算归属的规则一致,不然可能导致归属错乱
@@ -598,7 +596,7 @@
         atkPlayer, atkHurtType, atkHurtID = None, 0, 0
         curNPC = self.curNPC
         refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
-        for hurtObj in self.__hurtSortList:
+        for rank, hurtObj in enumerate(self.__hurtSortList, 1):
             
             hurtID = hurtObj.GetValueID()
             hurtType = hurtObj.GetValueType()
@@ -621,6 +619,7 @@
             else:
                 continue
             
+            playerDisableReason = {}
             maxHurtValue = 0
             for playerID in playerIDList:
                 
@@ -629,15 +628,19 @@
                     continue
                 
                 if player.GetHP() <= 0 or player.GetPlayerAction() == IPY_GameWorld.paDie:
+                    playerDisableReason[playerID] = "dead"
                     continue
                 
                 if not player.GetVisible() or player.GetSightLevel() != curNPC.GetSightLevel():
+                    playerDisableReason[playerID] = "no visible or sightLevel different"
                     continue
                 
                 if not self.__GetIsInRefreshPoint(player.GetPosX(), player.GetPosY(), refreshPoint):
+                    playerDisableReason[playerID] = "not in boss area"
                     continue
                 
                 if playerID not in self.__hurtPlayerDict:
+                    playerDisableReason[playerID] = "no hurt"
                     continue
                 hurtPlayer = self.__hurtPlayerDict[playerID]
                 hurtValue = hurtPlayer.GetHurtValue()                
@@ -648,6 +651,9 @@
             if maxHurtValue:
                 return atkPlayer, atkHurtType, atkHurtID
             
+            if rank == 1 and isDead:
+                GameWorld.Log("boss死亡时,第一名团队没有归属权! playerDisableReason=%s" % playerDisableReason)
+                
         return atkPlayer, atkHurtType, atkHurtID
     
     def __GetIsInRefreshPoint(self, curPosX, curPosY, refreshPoint):
@@ -723,18 +729,18 @@
         liheItemID, assistMoney = 0, 0
         mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})
         mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
-        if mapID in mapAssistGiftDict:
-            liheItemID, assistMoney = mapAssistGiftDict[mapID]
+        if str(mapID) in mapAssistGiftDict:
+            liheItemID, assistMoney = mapAssistGiftDict[str(mapID)]
         else:
             killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit') 
             index = GameWorld.GetDictValueByKey(killBossCntLimitDict, self.npcID)
             if index == None:
                 return
             bossAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 1, {})
-            if index not in bossAssistGiftDict:
+            if str(index) not in bossAssistGiftDict:
                 GameWorld.DebugLog("该boss没有协助额外奖励!index=%s" % index, self.npcID)
                 return
-            liheItemID, assistMoney = bossAssistGiftDict[index]
+            liheItemID, assistMoney = bossAssistGiftDict[str(index)]
             
         if not liheItemID or not assistMoney:
             GameWorld.DebugLog("该副本或boss没有协助额外奖励!mapID=%s" % (mapID), self.npcID)
@@ -742,7 +748,6 @@
         self.__assistAwardItemID = liheItemID
         
         fbType = GameWorld.GetMap().GetMapFBTypeByMapID(mapID)
-        friendAddAssistMoneyPer = IpyGameDataPY.GetFuncCfg("AssistAward", 3)
         GameWorld.DebugLog("执行协助奖励逻辑", self.npcID, self.lineID)
         copyPlayerManager = GameWorld.GetMapCopyPlayerManager()
         for playerID, assistPlayerIDList in self.__noAssitPlayerIDDict.items():
@@ -764,24 +769,26 @@
                     GameWorld.DebugLog("协助方离线或不在本地图,不给活跃令奖励: assistPlayerID=%s" % assistPlayerID, self.npcID, self.lineID)
                     continue
                 isFriend = assistHurtPlayer.GetIsFriend()
-                addAssistMoney = assistMoney
-                if isFriend and friendAddAssistMoneyPer:
-                    addAssistMoney += int(assistMoney * friendAddAssistMoneyPer / 100.0)
+                assistMoneyType = ShareDefine.TYPE_Price_FamilyActivity
+                addAssistMoney = PlayerAssist.AddTodayAssistMoney(assistPlayer, assistMoneyType, assistMoney, isFriend)
                 GameWorld.DebugLog("协助方给活跃令奖励: assistPlayerID=%s,assistMoney=%s,isFriend=%s,addAssistMoney=%s" 
                                    % (assistPlayerID, assistMoney, isFriend, addAssistMoney), self.npcID, self.lineID)
-                PlayerControl.GiveMoney(assistPlayer, ShareDefine.TYPE_Price_FamilyActivity, addAssistMoney) # 给活跃令无视发布方是否在线
                 if fbType == IPY_GameWorld.fbtNull:
                     PlayerControl.NotifyCode(assistPlayer, "AssistSuccess")
                 else:
-                    overDict = {FBCommon.Over_isAssist:1, FBCommon.Over_money:FBCommon.GetJsonMoneyList({ShareDefine.TYPE_Price_FamilyActivity:addAssistMoney}),
+                    overDict = {FBCommon.Over_isAssist:1, FBCommon.Over_money:FBCommon.GetJsonMoneyList({assistMoneyType:addAssistMoney}),
                                 FBCommon.Over_itemInfo:[]}
                     FBCommon.NotifyFBOver(assistPlayer, mapID, PlayerControl.GetFBFuncLineID(assistPlayer), 1, overDict)
+                    assistPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, 10000, True)
                     
                 if noAssistPlayer:
                     todayGiftCount = assistPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GetThanksGiftCount % liheItemID)
                     assistAwardPlayerDict[assistPlayerID] = {"PlayerName":assistPlayer.GetPlayerName(), "Job":assistPlayer.GetJob(), 
                                                              "LV":assistPlayer.GetLV(), "RealmLV":assistPlayer.GetOfficialRank(),
                                                              "TodayGiftCount":todayGiftCount}
+                    
+                    notifyParam = [assistPlayer.GetPlayerName(), noAssistPlayer.GetPlayerName(), mapID, self.curNPC.GetLV(), self.npcID]
+                    PlayerControl.FamilyNotify(assistPlayer.GetFamilyID(), "AssistBossFinish", notifyParam)
                     
             if not noAssistPlayer or not assistAwardPlayerDict:
                 GameWorld.DebugLog("发布方离线或无有效协助玩家在线,不给感谢礼盒奖励: playerID=%s" % playerID, self.npcID, self.lineID)
@@ -831,13 +838,15 @@
         bossHurtInfoPack.HurtValueList = hurtValueList
         bossHurtInfoPack.HurtCount = len(hurtValueList)
         
+        curNPC = self.curNPC
         assistHurtValueListDict = {}
         copyPlayerManager = GameWorld.GetMapCopyPlayerManager()
         for playerID in syncPlayerIDList:
             player = copyPlayerManager.FindPlayerByID(playerID)
             if not player:
                 continue
-            
+            if not player.CanSeeOther(curNPC):
+                continue
             if playerID in self.__noAssitPlayerIDDict:
                 assTagPlayerID = playerID
             elif playerID in self.__assistPlayerIDDict:
@@ -878,9 +887,17 @@
 def OnPlayerLeaveMap(curPlayer):
     ## 玩家离开地图处理
     
+    mapID = curPlayer.GetMapID()
+    mapType = GameWorld.GetMap().GetMapFBType()
+    changeMapID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ChangeMapID)
+    changeLineID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ChangeLineID)
+    
     playerID = curPlayer.GetPlayerID()
     for hurtList in PyGameData.g_npcHurtDict.values():
         if hurtList.IsNoAssistPlayer(playerID) or hurtList.IsAssistPlayer(playerID):
+            if mapType == IPY_GameWorld.fbtNull and mapID == changeMapID and changeLineID == hurtList.lineID:
+                #GameWorld.DebugLog("玩家同地图切线,当前伤血lineID为目标线路,不清伤血!changeLineID=%s" % changeLineID, playerID)
+                continue
             GameWorld.DebugLog("玩家离开地图, 删除boss伤血玩家!npcID=%s" % (hurtList.npcID), playerID)
             hurtList.DelHurtPlayer(playerID, "LeaveMap")
             break
@@ -916,11 +933,19 @@
     defendHurtList.Clear()
     return
 
+def GetBossLineID(npcID):
+    sealDemonIpyData = IpyGameDataPY.GetIpyGameDataNotLog("SealDemon", npcID)
+    if sealDemonIpyData:
+        lineID = sealDemonIpyData.GetLineID()
+    else:
+        lineID = GameWorld.GetGameWorld().GetLineID()
+    return lineID
+
 def DeletePlayerHurtList(curNPC):
     ## 删除伤血列表
-    lineID = GameWorld.GetGameWorld().GetLineID()
     objID = curNPC.GetID()
     npcID = curNPC.GetNPCID()
+    lineID = GetBossLineID(npcID)
     key = (lineID, objID, npcID)
     if key in PyGameData.g_npcHurtDict:
         hurtList =PyGameData.g_npcHurtDict.pop(key)
@@ -930,9 +955,9 @@
 
 def GetPlayerHurtList(curNPC):
     ## 获取伤血列表,可能为None
-    lineID = GameWorld.GetGameWorld().GetLineID()
     objID = curNPC.GetID()
     npcID = curNPC.GetNPCID()
+    lineID = GetBossLineID(npcID)
     return GetPlayerHurtListEx(lineID, objID, npcID)
 def GetPlayerHurtListEx(lineID, objID, npcID):
     ## 获取伤血列表,可能为None
@@ -994,6 +1019,8 @@
     return True
 
 def RefreshHurtList(curNPC, tick, refreshInterval=3000, isDead=False):
+    ## 刷新伤血列表
+    # @return: atkPlayer, ownerType, ownerID
     defendHurtList = GetPlayerHurtList(curNPC)
     if not defendHurtList:
         return

--
Gitblit v1.8.0