From e7a6f9f5439ed847fa7915de178dd743e51a61b1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 28 十二月 2018 15:11:10 +0800
Subject: [PATCH] 5424 【后端】【1.4】跨服竞技场开发(修复匹配中匹配状态结束后玩家还被视为匹配中的bug)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py |  327 ++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 289 insertions(+), 38 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
index e3fcff1..f9d5821 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
@@ -31,15 +31,34 @@
 import NPCCommon
 import FBLogic
 import PlayerVip
+import IPY_GameWorld
+import PlayerActivity
+
+import time
 
 def DoPlayerOnDay(curPlayer):
     checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount)
     checkInCount = checkInInfo / 10 # 累计登记
     todayIsCheckIn = checkInInfo % 10 # 今天是否已登记
     if todayIsCheckIn:
-        checkInInfo = (checkInCount + 1) * 10 + 0
+        checkInInfo = checkInCount * 10 + 0
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo)
         SyncCheckInState(curPlayer, 0, False)
+    
+    # 重置每日已获得仙缘币
+    ondaySetXianyuanCoin = 0
+    ondayLoginSetXianyuanCoin = curPlayer.GetDictByKey(ChConfig.Def_PDict_TodayXianyuanCoinOnLogin)
+    if ondayLoginSetXianyuanCoin:
+        # 这里做时间比较,预防玩家登录后就没有再切换地图,再次在该地图过天会导致设置值错误问题
+        loginAddCoinTime = curPlayer.GetDictByKey(ChConfig.Def_PDict_LoginAddTodayXianyuanCoinTime)
+        if GameWorld.CheckTimeIsSameServerDayEx(loginAddCoinTime):
+            ondaySetXianyuanCoin = ondayLoginSetXianyuanCoin
+            GameWorld.DebugLog("玩家过天时,登录增加仙缘币有值,仍然是同一天,仙缘币重置为登录时增加的仙缘币!ondayLoginSetXianyuanCoin=%s" % ondayLoginSetXianyuanCoin)
+        else:
+            GameWorld.DebugLog("玩家过天时,登录增加仙缘币有值,但是不是同一天了,仙缘币重置为0!")
+    PlayerControl.SetTodayXianyuanCoin(curPlayer, ondaySetXianyuanCoin)
+    GameWorld.DebugLog("玩家过天设置今日已获得仙缘币: ondaySetXianyuanCoin=%s,ondayLoginSetXianyuanCoin=%s" 
+                       % (ondaySetXianyuanCoin, ondayLoginSetXianyuanCoin))
     return
 
 def DoPlayerLogin(curPlayer):
@@ -69,13 +88,17 @@
         __OnHelpBattleCheckInResult(curPlayer, msgList, tick)
         
     # 刷新
-    if cmd == "Refresh":
+    elif cmd == "Refresh":
         __OnHelpBattleRefreshResult(curPlayer, msgList, tick)
         
     # 助战记录
-    if cmd == "HelpRecord":
+    elif cmd == "HelpRecord":
         __OnHelpBattleRecord(curPlayer, msgList, tick)
         
+    # 扫荡召唤
+    elif cmd == "SweepCall":
+        __OnHelpBattleSweepCallResult(curPlayer, msgList, tick)
+    
     return
 
 #// B1 05 助战登记 #tagCMHelpBattleCheckIn
@@ -103,6 +126,7 @@
     if isOK:
         checkInInfo = (checkInCount + 1) * 10 + 1
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo)
+        PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_HelpBattleCheckIn)
         
         # 没有数据缓存的话,马上同步一次
         if not haveViewCache:
@@ -146,6 +170,9 @@
     for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items():
         objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)
         if objID:
+            if helpPlayerID == calledPlayerID:
+                GameWorld.DebugLog("该助战机器人ID已经召唤过,不允许重复召唤!calledPlayerID=%s" % calledPlayerID)
+                return
             calledCount += 1
         # 统计免费的未召唤的
         elif not helpPlayerInfoDict.get("NeedGoldCall", 0):
@@ -215,8 +242,10 @@
         if not helpBattleNPC:
             continue
         objID = helpBattleNPC.GetID()
+        helpBattleNPC.SetIsNeedProcess(True)
         GameWorld.Log("召唤助战成功: calledPlayerID=%s,objID=%s,fightPower=%s" % (calledPlayerID, objID, fightPower), playerID)
         gameFB.SetGameFBDict(ChConfig.Def_FB_HelpBattleFBObjID % calledPlayerID, objID)
+        helpBattleNPC.SetDict(ChConfig.Def_NPC_Dict_AtkDelayTick, calledCount * 1000) # 按转换顺序每个延长1秒攻击,防止动作一致
         calledCount += 1
         # 设置助战属性
         npcControl = NPCCommon.NPCControl(helpBattleNPC)
@@ -227,6 +256,7 @@
         callResultPack = ChPyNetSendPack.tagMCHelpBattleCallResult()
         callResultPack.ObjID = objID
         callResultPack.PlayerID = calledPlayerID
+        callResultPack.Job = job
         NetPackCommon.SendFakePack(curPlayer, callResultPack)
         
     # 召唤满后
@@ -285,8 +315,8 @@
     costMoneyList = []
     calledPlayerIDDict = {} # 已经召唤的玩家ID字典 {playerID:[是否付费召唤, 职业], ...}
     
+    refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount)
     if isClientRefresh:
-        refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount)
         freeRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 1)
         goldRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 2)
         if refreshCount >= (freeRefreshCount + goldRefreshCount):
@@ -313,7 +343,8 @@
             
     # 非客户端刷新的视为重新开始,重置刷新次数 
     else:
-        gameFB.SetPlayerGameFBDict(playerID, ChConfig.FBPD_HelpBattleRefreshCount, 0)
+        if not refreshCount:
+            gameFB.SetPlayerGameFBDict(playerID, ChConfig.FBPD_HelpBattleRefreshCount, 0)
         gameFB.SetGameFBDict(ChConfig.FBPD_HelpBattleFBFightPower, ipyData.GetFightPowerMin())
         gameFB.SetGameFBDict(ChConfig.FBPD_HelpBattleFBBaseHurt, ipyData.GetRobotBaseHurt())
         GameWorld.DebugLog("设置副本战力=%s,保底伤害=%s" % (ipyData.GetFightPowerMin(), ipyData.GetRobotBaseHurt()))
@@ -367,9 +398,84 @@
     NetPackCommon.SendFakePack(curPlayer, helpPlayerListPack)
     return
 
+def SendGameServer_SweepCallHelpBattlePlayer(curPlayer, mapID, funcLineID):
+    ## 发送GameServer请求扫荡助战玩家
+    ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID)
+    if not ipyData:
+        return
+    playerID = curPlayer.GetPlayerID()
+    msgInfo = str(["SweepCall", mapID, funcLineID])
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))
+    GameWorld.Log("SendGameServer_SweepCallHelpBattlePlayer %s" % (msgInfo), playerID)
+    return
+
+def __OnHelpBattleSweepCallResult(curPlayer, msgList, tick):
+    ## 助战扫荡结果处理
+    cmd, mapID, funcLineID, helpBattlePlayerDict = msgList
+    playerID = curPlayer.GetPlayerID()
+    GameWorld.DebugLog("__OnHelpBattleSweepCallResult %s,mapID=%s,funcLineID=%s,helpBattlePlayerDict=%s" 
+                       % (cmd, mapID, funcLineID, helpBattlePlayerDict), playerID)
+    
+    fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID)
+    if not fbFuncIpyData:
+        return
+    
+    reason = 0
+    addCoinRate = 10000 # 基础倍率
+    baseFBPoint = fbFuncIpyData.GetFBPoint() # 过关 - 基础仙缘币
+    
+    xianyuanCoinUpper = IpyGameDataPY.GetFuncCfg("HelpBattlePoint", 1) # 每日仙缘币上限
+    relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # 社交关系加成 {"社交关系":[过关加成, 助战加成], ...} 
+    todayXianyuanCoin = PlayerControl.GetTodayXianyuanCoin(curPlayer) # 今日已获得仙缘币
+    playerXianyuanCoinUpper = xianyuanCoinUpper
+    if curPlayer.GetVIPLv():
+        playerXianyuanCoinUpper += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinUpperAdd)
+        addCoinRate += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinAddPer)
+        
+    relation, relationAdd = 0, 0
+    for helpPlayerInfoDict in helpBattlePlayerDict.values():
+        relation = helpPlayerInfoDict.get("Relation", 0)
+        if not relation:
+            continue
+        relationAddList = relationCoinAddDict.get(str(relation), [])
+        relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0
+        
+    coinAdd = 0
+    if baseFBPoint:
+        coinAdd = int((baseFBPoint + relationAdd) * addCoinRate / 10000.0)
+    canAddMax = max(playerXianyuanCoinUpper - todayXianyuanCoin, 0)
+    coinAddReal = min(coinAdd, canAddMax) # 实际加仙缘币
+    if canAddMax == 0 and not reason:
+        reason = 2
+        
+    GameWorld.DebugLog("扫荡副本增加仙缘币: baseFBPoint=%s,relationAdd=%s,addCoinRate=%s,coinAdd=%s,canAddMax=%s,coinAddReal=%s" 
+                       % (baseFBPoint, relationAdd, addCoinRate, coinAdd, canAddMax, coinAddReal), playerID)
+    if coinAddReal:
+        addDataDict = {"MapID":mapID, "FuncLineID":funcLineID, "IsSweep":1}
+        PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, coinAddReal, addDataDict=addDataDict)
+        PlayerControl.AddTodayXianyuanCoin(curPlayer, coinAddReal)
+        
+    #扫荡结果给奖励等
+    FBLogic.OnPlayerFBHelpBattleSweepResult(curPlayer, mapID, funcLineID, helpBattlePlayerDict, coinAddReal, reason)
+    
+    # 通知自己获得仙缘币
+    msgPack = ChPyNetSendPack.tagMCAddXianyuanCoinMsg()
+    msgPack.MapID = mapID
+    msgPack.FuncLineID = funcLineID
+    msgPack.Relation = relation
+    msgPack.RelationCoinAdd = relationAdd
+    msgPack.XianyuanCoinAdd = coinAddReal
+    msgPack.Reason = reason
+    #msgPack.CallPlayerID = relationPlayerID
+    #msgPack.CallPlayerName = relationPlayerName
+    msgPack.NameLen = len(msgPack.CallPlayerName)
+    msgPack.IsSweep = 1
+    NetPackCommon.SendFakePack(curPlayer, msgPack)
+    return
+
 def __OnHelpBattleRecord(curPlayer, msgList, tick):
     ## 助战记录同步
-    cmd, helpRecordList = msgList
+    cmd, helpRecordList, isLogin = msgList
     playerID = curPlayer.GetPlayerID()
     GameWorld.DebugLog("__OnHelpBattleRecord %s,helpRecordList=%s" % (cmd, helpRecordList), playerID)
     
@@ -407,28 +513,50 @@
     NetPackCommon.SendFakePack(curPlayer, recordPack)
     
     addDataDict = {"HelpList":drList}
-    GameWorld.DebugLog("    addXianyuanCoinTotal=%s,addXianyuanCoinTotalTotay=%s,totalHelpCount=%s" 
-                       % (addXianyuanCoinTotal, addXianyuanCoinTotalTotay, totalHelpCount), playerID)
+    GameWorld.DebugLog("    addXianyuanCoinTotal=%s,addXianyuanCoinTotalTotay=%s,totalHelpCount=%s,isLogin=%s" 
+                       % (addXianyuanCoinTotal, addXianyuanCoinTotalTotay, totalHelpCount, isLogin), playerID)
     PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, addXianyuanCoinTotal, addDataDict=addDataDict, isSysHint=False)
     if addXianyuanCoinTotalTotay:
         PlayerControl.AddTodayXianyuanCoin(curPlayer, addXianyuanCoinTotalTotay)
-    
+        if isLogin:
+            curPlayer.SetDict(ChConfig.Def_PDict_TodayXianyuanCoinOnLogin, addXianyuanCoinTotalTotay)
+            curPlayer.SetDict(ChConfig.Def_PDict_LoginAddTodayXianyuanCoinTime, int(time.time()))
+            GameWorld.Log("    登录时今日助战信息: addXianyuanCoinTotalTotay=%s" % (addXianyuanCoinTotalTotay), playerID)
+            
     # 更新总助战次数,更新排行榜
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleTotalCount, totalHelpCount)
     if totalHelpCount >= IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 4):
         PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FBHelpBattle, totalHelpCount)
     return
 
-def DoSingleFBAddXianyuanCoin(curPlayer, mapID, lineID):
-    ## 挑战单人副本增加仙缘币,仅适用于召唤镜像助战挑战的副本
+def DoFBAddXianyuanCoin(curPlayer, mapID, lineID, isHelp=False):
+    '''真人挑战副本增加仙缘币,包含过关或助战(不含镜像助战)
+    @param isHelp: 是否助战的
+    @return: 获得的仙缘币, 无法获得仙缘币原因(1-达到助战次数上限,2-达到每日获得仙缘币上限)
+    '''
     playerID = curPlayer.GetPlayerID()
     fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID)
-    fbHelpIpyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, lineID)
-    if not fbFuncIpyData or not fbHelpIpyData:
-        return
+    if not fbFuncIpyData:
+        return 0, 0
     
+    reason = 0
     addCoinRate = 10000 # 基础倍率
-    baseFBPoint = fbFuncIpyData.GetFBPoint() # 过关 - 基础仙缘币
+    if not isHelp:
+        baseFBPoint = fbFuncIpyData.GetFBPoint() # 过关 - 基础仙缘币
+    else:
+        baseFBPoint = fbFuncIpyData.GetHelpPoint() # 助战
+        dayHelpCountMax = fbFuncIpyData.GetDayHelpCountMax() # 真实助战每日可获得仙缘币次数
+        if dayHelpCountMax:
+            todayHelpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FBRealHelpCount % mapID)
+            if todayHelpCount >= dayHelpCountMax:
+                baseFBPoint = 0
+                reason = 1
+                GameWorld.DebugLog("达到每日助战可获得仙缘币次数上限!无法再获得!mapID=%s" % (mapID), playerID)
+            else:
+                todayHelpCount += 1
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FBRealHelpCount % mapID, todayHelpCount)
+                GameWorld.DebugLog("增加每日助战可获得仙缘币次数!mapID=%s,todayHelpCount=%s" % (mapID, todayHelpCount), playerID)
+                
     xianyuanCoinUpper = IpyGameDataPY.GetFuncCfg("HelpBattlePoint", 1) # 每日仙缘币上限
     relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # 社交关系加成 {"社交关系":[过关加成, 助战加成], ...} 
     todayXianyuanCoin = PlayerControl.GetTodayXianyuanCoin(curPlayer) # 今日已获得仙缘币
@@ -437,33 +565,156 @@
         playerXianyuanCoinUpper += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinUpperAdd)
         addCoinRate += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinAddPer)
         
-    if todayXianyuanCoin >= playerXianyuanCoinUpper:
-        GameWorld.DebugLog("玩家今日仙缘币已达上限!todayXianyuanCoin=%s,playerXianyuanCoinUpper=%s" 
-                           % (todayXianyuanCoin, playerXianyuanCoinUpper), playerID)
-        return
+    #达到上限也需要记录,所以这里暂不限制
+    #if todayXianyuanCoin >= playerXianyuanCoinUpper:
+    #    GameWorld.DebugLog("玩家今日仙缘币已达上限!todayXianyuanCoin=%s,playerXianyuanCoinUpper=%s" 
+    #                       % (todayXianyuanCoin, playerXianyuanCoinUpper), playerID)
+    #    return
     
-    relationAdd = 0
-    helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})
-    for helpPlayerInfoDict in helpBattlePlayerDict.values():
-        relation = helpPlayerInfoDict.get("Relation", 0)
-        if not relation:
-            continue
-        relationAddList = relationCoinAddDict.get(str(relation), [])
-        relationAdd += relationAddList[1] if len(relationAddList) == 2 else 0
-        
-    coinAdd = int((baseFBPoint + relationAdd) * addCoinRate / 10000.0)
+    relation, relationAdd, relationPlayerID, relationPlayerName = 0, 0, 0, ""
+    
+    fbType = GameWorld.GetMap().GetMapFBType()
+    if fbType == IPY_GameWorld.fbtSingle:
+        gameFB = GameWorld.GetGameFB()
+        helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})
+        for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items():
+            objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)
+            if not objID:
+                continue
+            relation = helpPlayerInfoDict.get("Relation", 0)
+            if not relation:
+                continue
+            relationAddList = relationCoinAddDict.get(str(relation), [])
+            relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0
+    elif fbType == IPY_GameWorld.fbtTeam:
+        if playerID in PyGameData.g_teamFBMemRelationAddDict:
+            relation, relationAdd, relationPlayerID, relationPlayerName = PyGameData.g_teamFBMemRelationAddDict.pop(playerID)
+            
+    coinAdd = 0
+    if baseFBPoint:
+        coinAdd = int((baseFBPoint + relationAdd) * addCoinRate / 10000.0)
     canAddMax = max(playerXianyuanCoinUpper - todayXianyuanCoin, 0)
     coinAddReal = min(coinAdd, canAddMax) # 实际加仙缘币
+    if canAddMax == 0 and not reason:
+        reason = 2
+        
+    if isHelp and not relationPlayerID:
+        relationPlayerID = 1
+        #GameWorld.DebugLog("没有助战目标则设置relationPlayerID为1,标记是助战的!")
+        
+    GameWorld.DebugLog("挑战副本增加仙缘币: baseFBPoint=%s,relationAdd=%s,addCoinRate=%s,coinAdd=%s,canAddMax=%s,coinAddReal=%s,relationPlayerID=%s" 
+                       % (baseFBPoint, relationAdd, addCoinRate, coinAdd, canAddMax, coinAddReal, relationPlayerID), playerID)
+    if coinAddReal:
+        addDataDict = {"MapID":mapID, "FuncLineID":lineID}
+        PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, coinAddReal, addDataDict=addDataDict)
+        PlayerControl.AddTodayXianyuanCoin(curPlayer, coinAddReal)
+        
+    # 通知自己获得仙缘币
+    msgPack = ChPyNetSendPack.tagMCAddXianyuanCoinMsg()
+    msgPack.MapID = mapID
+    msgPack.FuncLineID = lineID
+    msgPack.Relation = relation
+    msgPack.RelationCoinAdd = relationAdd
+    msgPack.XianyuanCoinAdd = coinAddReal
+    msgPack.Reason = reason
+    msgPack.CallPlayerID = relationPlayerID
+    msgPack.CallPlayerName = relationPlayerName
+    msgPack.NameLen = len(msgPack.CallPlayerName)
+    NetPackCommon.SendFakePack(curPlayer, msgPack)
+    return coinAddReal, reason
+
+def __GetTeamFBMemRelationInfo(curPlayer, isHelp, leavePlayerID):
+    ## 计算队员间相互加成信息,离线玩家不算
+    relation = 0
+    relationAdd = 0 # 社交关系加成
+    relationPlayerID = 0
+    relationPlayerName = ""
+    teamID = curPlayer.GetTeamID()
+    if teamID not in PyGameData.g_teamFBMemRelationDict:
+        return relation, relationAdd, relationPlayerID, relationPlayerName
     
-    GameWorld.DebugLog("挑战单人副本增加仙缘币: coinAdd=%s,canAddMax=%s,coinAddReal=%s" % (coinAdd, canAddMax, coinAddReal), playerID)
-    addDataDict = {"MapID":mapID, "FuncLineID":lineID}
-    PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, coinAddReal, addDataDict=addDataDict)
-    PlayerControl.AddTodayXianyuanCoin(curPlayer, coinAddReal)
+    playerManager = GameWorld.GetMapCopyPlayerManager()
+    friendList, memFamilyIDDict, memNameDict = PyGameData.g_teamFBMemRelationDict[teamID]
+    relationList = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 3, []) # 社交关系优先级
+    relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # 社交关系加成 {"社交关系":[过关加成, 助战加成], ...} 
+    playerID = curPlayer.GetPlayerID()
+    familyID = curPlayer.GetFamilyID()
+    if isHelp:
+        # 助战的随便取一位优先级最高的即可
+        defaultRelationPlayerID = 0
+        for memPlayerID, memFamilyID in memFamilyIDDict.items():
+            memRelation, relationPlayerID = __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID)
+            if not memRelation:
+                if not defaultRelationPlayerID and relationPlayerID:
+                    defaultRelationPlayerID = relationPlayerID
+                continue
+            relation = memRelation
+            relationAddList = relationCoinAddDict.get(str(memRelation), [])
+            relationAdd += relationAddList[1] if len(relationAddList) == 2 else 0
+            relationPlayerName = memNameDict[relationPlayerID]
+            return relation, relationAdd, relationPlayerID, relationPlayerName
+        
+        relationPlayerID = defaultRelationPlayerID
+        relationPlayerName = memNameDict.get(relationPlayerID, "")
+        GameWorld.DebugLog("助战默认无关系队员: relationPlayerID=%s,relationPlayerName=%s" % (relationPlayerID, relationPlayerName), playerID)
+    else:
+        # 非助战享受所有队员加成
+        for memPlayerID, memFamilyID in memFamilyIDDict.items():
+            memRelation = __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID)[0]
+            if not memRelation:
+                continue
+            if memRelation == relationList[0]:
+                relation = memRelation
+            elif relation:
+                relation = memRelation
+            relationAddList = relationCoinAddDict.get(str(memRelation), [])
+            relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0
+            
+    return relation, relationAdd, relationPlayerID, relationPlayerName
+
+def __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID):
+    ## 离线玩家不算社交关系
+    if leavePlayerID and memPlayerID == leavePlayerID:
+        return 0, 0
+    if playerID == memPlayerID:
+        return 0, 0
+    memPlayer = playerManager.FindPlayerByID(memPlayerID)
+    if memPlayer == None or memPlayer.IsEmpty():
+        return 0, 0
+    for checkRelation in relationList:
+        if checkRelation == 1:
+            if [playerID, memPlayerID] in friendList:
+                return checkRelation, memPlayerID
+        if checkRelation == 2:
+            if playerID != memPlayerID and familyID and familyID == memFamilyID:
+                return checkRelation, memPlayerID            
+    return 0, memPlayerID
+
+def RefershTeamFBMemRelation(tick, leavePlayerID=0):
+    ## 刷新组队副本队员关系
+    playerManager = GameWorld.GetMapCopyPlayerManager()
+    for i in xrange(playerManager.GetPlayerCount()):
+        player = playerManager.GetPlayerByIndex(i)
+        if player == None or player.IsEmpty():
+            continue
+        if leavePlayerID and player.GetPlayerID() == leavePlayerID:
+            PyGameData.g_teamFBMemRelationAddDict.pop(leavePlayerID, 0)
+            continue
+        relation, relationAdd, relationPlayerID, relationPlayerName = __GetTeamFBMemRelationInfo(player, FBCommon.GetIsHelpFight(player), leavePlayerID)
+        PyGameData.g_teamFBMemRelationAddDict[player.GetPlayerID()] = [relation, relationAdd, relationPlayerID, relationPlayerName]
+        
+    for index in xrange(playerManager.GetPlayerCount()):
+        player = playerManager.GetPlayerByIndex(index)
+        if player == None or player.IsEmpty():
+            continue
+        if leavePlayerID and player.GetPlayerID() == leavePlayerID:
+            continue
+        FBLogic.DoFBHelp(player, tick)
+        
     return
 
-def DoTeamFBAddXianyuanCoin(curPlayer, mapID, lineID, callPlayerID, callPlayerName, relation):
-    ## 挑战组队副本增加仙缘币
-    return
-
-
+def GetTeamFBMemRelationInfo(playerID):
+    if playerID not in PyGameData.g_teamFBMemRelationAddDict:
+        return 0, 0
+    return PyGameData.g_teamFBMemRelationAddDict[playerID][:2]
 

--
Gitblit v1.8.0