From b96575fc034c6f56273ee3a7346a10f489bd48a7 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 29 十一月 2018 02:08:48 +0800
Subject: [PATCH] 4762 【后端】混乱妖域社交关系加成取实时,离线玩家不算;增加同步社交总加成信息;

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py                                                  |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                                 |   34 ++++--
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py                                                    |   52 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                                      |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py           |  107 ++++++++++++++------
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                      |   34 ++++--
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py                                                  |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ChaosDemon.py   |   10 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFBTeamRelation.py |   47 ++++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py               |    1 
 10 files changed, 230 insertions(+), 62 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 3e87679..431d95b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -24487,11 +24487,13 @@
     Head = tagHead()
     MapID = 0    #(DWORD MapID)
     FuncLineID = 0    #(BYTE FuncLineID)
-    XianyuanCoinAdd = 0    #(WORD XianyuanCoinAdd)// 增加的仙缘币,0代表已达上限
+    Relation = 0    #(BYTE Relation)// 当时的关系:0-无,1-好友,2-盟友
+    RelationCoinAdd = 0    #(BYTE RelationCoinAdd)// 社交关系总加成
+    XianyuanCoinAdd = 0    #(WORD XianyuanCoinAdd)// 实际增加的仙缘币
+    Reason = 0    #(BYTE Reason)//仙缘币为0时的原因:1-助战次数上限;2-每日获得上限
     CallPlayerID = 0    #(DWORD CallPlayerID)// 助战的玩家ID,有值时代表真实助战,没有值时为自己打的
     NameLen = 0    #(BYTE NameLen)
     CallPlayerName = ""    #(String CallPlayerName)// 助战的玩家名,size = NameLen
-    Reason = 0    #(BYTE Reason)//仙缘币为0时的原因:1-助战次数上限;2-每日获得上限
     data = None
 
     def __init__(self):
@@ -24505,11 +24507,13 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FuncLineID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Relation,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RelationCoinAdd,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.XianyuanCoinAdd,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Reason,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.CallPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.CallPlayerName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
-        self.Reason,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -24519,11 +24523,13 @@
         self.Head.SubCmd = 0x08
         self.MapID = 0
         self.FuncLineID = 0
+        self.Relation = 0
+        self.RelationCoinAdd = 0
         self.XianyuanCoinAdd = 0
+        self.Reason = 0
         self.CallPlayerID = 0
         self.NameLen = 0
         self.CallPlayerName = ""
-        self.Reason = 0
         return
 
     def GetLength(self):
@@ -24531,11 +24537,13 @@
         length += self.Head.GetLength()
         length += 4
         length += 1
+        length += 1
+        length += 1
         length += 2
+        length += 1
         length += 4
         length += 1
         length += len(self.CallPlayerName)
-        length += 1
 
         return length
 
@@ -24544,11 +24552,13 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteDWORD(data, self.MapID)
         data = CommFunc.WriteBYTE(data, self.FuncLineID)
+        data = CommFunc.WriteBYTE(data, self.Relation)
+        data = CommFunc.WriteBYTE(data, self.RelationCoinAdd)
         data = CommFunc.WriteWORD(data, self.XianyuanCoinAdd)
+        data = CommFunc.WriteBYTE(data, self.Reason)
         data = CommFunc.WriteDWORD(data, self.CallPlayerID)
         data = CommFunc.WriteBYTE(data, self.NameLen)
         data = CommFunc.WriteString(data, self.NameLen, self.CallPlayerName)
-        data = CommFunc.WriteBYTE(data, self.Reason)
         return data
 
     def OutputString(self):
@@ -24556,21 +24566,25 @@
                                 Head:%s,
                                 MapID:%d,
                                 FuncLineID:%d,
+                                Relation:%d,
+                                RelationCoinAdd:%d,
                                 XianyuanCoinAdd:%d,
+                                Reason:%d,
                                 CallPlayerID:%d,
                                 NameLen:%d,
-                                CallPlayerName:%s,
-                                Reason:%d
+                                CallPlayerName:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.MapID,
                                 self.FuncLineID,
+                                self.Relation,
+                                self.RelationCoinAdd,
                                 self.XianyuanCoinAdd,
+                                self.Reason,
                                 self.CallPlayerID,
                                 self.NameLen,
-                                self.CallPlayerName,
-                                self.Reason
+                                self.CallPlayerName
                                 )
         return DumpString
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
index 1d7b633..f93b284 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
@@ -41,6 +41,7 @@
 import PlayerViewCache
 import GameWorldBoss
 import PlayerTalk
+import PlayerTeam
 
 import copy
 import random
@@ -350,6 +351,7 @@
     __OnFamilyNameChange(jionPlayer.GetPlayerID(), curFamily.GetName())
     #玩家缓存
     PlayerViewCache.OnPlayerFamilyChange(jionPlayer.GetPlayerID(), curFamily.GetID(), curFamily.GetName())
+    PlayerTeam.OnTeamMemFamilyRefresh(jionPlayer, curFamily.GetID())
     #加入仙盟联赛成员
     GameWorldFamilyWar.AddFamilyWarMem(jionPlayer.GetPlayerID(), curFamily.GetID())
     GameWorldFamilyWar.CheckPlayerJoinFamilyWarInfo(jionPlayer)
@@ -1803,6 +1805,7 @@
     
     #弹劾信息封包
     SendPackClientImpeachMsg(curPlayer, 0, 0)
+    PlayerTeam.OnTeamMemFamilyRefresh(curPlayer, 0)
     return
 
 #---------------------------------------------------------------------
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py
index d88e04a..ef6881f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py
@@ -27,6 +27,7 @@
 import PlayerSocial
 import copy
 import PlayerViewCache
+import PlayerTeam
 
 #---------------------------------------------------------------------
 
@@ -223,6 +224,7 @@
     tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(friendID)
     if tagPlayer != None:
         PlayerControl.NotifyCode(tagPlayer, 'Friend_DeleteFriend2', [curPlayer.GetName()])
+    PlayerTeam.OnTeamMemFriendChange(curPlayer, friendID, False)
     return
 
 
@@ -325,6 +327,7 @@
         PlayerControl.NotifyCode(curPlayer, 'Friend_MakeFriend', [cacheDict['Name']])  
         # 记录等对方上线通知地图,任务等会用到触发逻辑,通用记录次数即可, MapServer_SyncFriendInfo为具体的好友数量,根据策划需求制作
         pass
+    PlayerTeam.OnTeamMemFriendChange(curPlayer, srcPlayerID, True)
     return
 
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py
index 3f00186..5d7ffba 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py
@@ -1877,6 +1877,7 @@
     #如果队伍正在匹配中,则通知状态
     if IsTeamMatchingPlayer(curTeamID):
         Sync_TeamMatchState(curPlayer, True)
+    OnTeamMemFamilyRefresh(curPlayer, curPlayer.GetFamilyID())
     return True
 
 #---------------------------------------------------------------------
@@ -2953,10 +2954,59 @@
     PyGameData.g_prepareTeamDict.pop(teamID)
     
     # 同步进入组队副本的队员关系到目标地图
-    relationInfo = str([teamID, friendList, memFamilyIDDict, memNameDict])
+    relationInfo = str(["InitRelation", teamID, friendList, memFamilyIDDict, memNameDict])
     leader.MapServer_QueryPlayerResult(0, 0, "EnterFBTeamRelation", relationInfo, len(relationInfo))
     return
 
+def OnTeamMemFriendChange(curPlayer, tagPlayerID, isFriend):
+    ## 队员好友关系变更,离线也同步
+    teamID = curPlayer.GetTeamID()
+    if not teamID:
+        GameWorld.DebugLog("好友变更,无队伍不管!")
+        return
+    curMapData = GameWorld.GetMap(curPlayer.GetMapID())
+    if not curMapData or curMapData.GetMapFBType() != ChConfig.fbtTeam:
+        GameWorld.DebugLog("好友变更,不在组队副本不管!")
+        return
+    
+    isSameTeam = False
+    playerID = curPlayer.GetPlayerID()
+    curTeam = curPlayer.GetTeam()
+    for index in xrange(curTeam.GetMemberCount()):
+        memberInfo = curTeam.GetMemberInfo(index)
+        if not memberInfo:
+            continue
+        memPlayerID = memberInfo.GetPlayerID()
+        if tagPlayerID == memPlayerID:
+            isSameTeam = True
+            break
+        
+    if not isSameTeam:
+        GameWorld.DebugLog("好友关系变更,不是同队伍不管!")
+        return
+    
+    relationInfo = str(["FriendChange", teamID, playerID, tagPlayerID, isFriend])
+    curPlayer.MapServer_QueryPlayerResult(0, 0, "EnterFBTeamRelation", relationInfo, len(relationInfo))
+    return
+
+def OnTeamMemFamilyRefresh(curPlayer, familyID):
+    ## 队员仙盟变更,仅在线同步,上线同步
+    if not curPlayer:
+        return
+    teamID = curPlayer.GetTeamID()
+    if not teamID:
+        GameWorld.DebugLog("家族变更,无队伍不管!")
+        return
+    curMapData = GameWorld.GetMap(curPlayer.GetMapID())
+    if not curMapData or curMapData.GetMapFBType() != ChConfig.fbtTeam:
+        GameWorld.DebugLog("家族变更,不在组队副本不管!")
+        return
+    playerID = curPlayer.GetPlayerID()
+    familyID = curPlayer.GetFamilyID()
+    relationInfo = str(["FamilyChange", teamID, playerID, familyID])
+    curPlayer.MapServer_QueryPlayerResult(0, 0, "EnterFBTeamRelation", relationInfo, len(relationInfo))
+    return
+
 def __CheckTeamFBPlayerExist(curTeam):
     ##玩家离开副本
     # @param curTeam 队伍实例
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 3e87679..431d95b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -24487,11 +24487,13 @@
     Head = tagHead()
     MapID = 0    #(DWORD MapID)
     FuncLineID = 0    #(BYTE FuncLineID)
-    XianyuanCoinAdd = 0    #(WORD XianyuanCoinAdd)// 增加的仙缘币,0代表已达上限
+    Relation = 0    #(BYTE Relation)// 当时的关系:0-无,1-好友,2-盟友
+    RelationCoinAdd = 0    #(BYTE RelationCoinAdd)// 社交关系总加成
+    XianyuanCoinAdd = 0    #(WORD XianyuanCoinAdd)// 实际增加的仙缘币
+    Reason = 0    #(BYTE Reason)//仙缘币为0时的原因:1-助战次数上限;2-每日获得上限
     CallPlayerID = 0    #(DWORD CallPlayerID)// 助战的玩家ID,有值时代表真实助战,没有值时为自己打的
     NameLen = 0    #(BYTE NameLen)
     CallPlayerName = ""    #(String CallPlayerName)// 助战的玩家名,size = NameLen
-    Reason = 0    #(BYTE Reason)//仙缘币为0时的原因:1-助战次数上限;2-每日获得上限
     data = None
 
     def __init__(self):
@@ -24505,11 +24507,13 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FuncLineID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Relation,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RelationCoinAdd,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.XianyuanCoinAdd,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Reason,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.CallPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.CallPlayerName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
-        self.Reason,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -24519,11 +24523,13 @@
         self.Head.SubCmd = 0x08
         self.MapID = 0
         self.FuncLineID = 0
+        self.Relation = 0
+        self.RelationCoinAdd = 0
         self.XianyuanCoinAdd = 0
+        self.Reason = 0
         self.CallPlayerID = 0
         self.NameLen = 0
         self.CallPlayerName = ""
-        self.Reason = 0
         return
 
     def GetLength(self):
@@ -24531,11 +24537,13 @@
         length += self.Head.GetLength()
         length += 4
         length += 1
+        length += 1
+        length += 1
         length += 2
+        length += 1
         length += 4
         length += 1
         length += len(self.CallPlayerName)
-        length += 1
 
         return length
 
@@ -24544,11 +24552,13 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteDWORD(data, self.MapID)
         data = CommFunc.WriteBYTE(data, self.FuncLineID)
+        data = CommFunc.WriteBYTE(data, self.Relation)
+        data = CommFunc.WriteBYTE(data, self.RelationCoinAdd)
         data = CommFunc.WriteWORD(data, self.XianyuanCoinAdd)
+        data = CommFunc.WriteBYTE(data, self.Reason)
         data = CommFunc.WriteDWORD(data, self.CallPlayerID)
         data = CommFunc.WriteBYTE(data, self.NameLen)
         data = CommFunc.WriteString(data, self.NameLen, self.CallPlayerName)
-        data = CommFunc.WriteBYTE(data, self.Reason)
         return data
 
     def OutputString(self):
@@ -24556,21 +24566,25 @@
                                 Head:%s,
                                 MapID:%d,
                                 FuncLineID:%d,
+                                Relation:%d,
+                                RelationCoinAdd:%d,
                                 XianyuanCoinAdd:%d,
+                                Reason:%d,
                                 CallPlayerID:%d,
                                 NameLen:%d,
-                                CallPlayerName:%s,
-                                Reason:%d
+                                CallPlayerName:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.MapID,
                                 self.FuncLineID,
+                                self.Relation,
+                                self.RelationCoinAdd,
                                 self.XianyuanCoinAdd,
+                                self.Reason,
                                 self.CallPlayerID,
                                 self.NameLen,
-                                self.CallPlayerName,
-                                self.Reason
+                                self.CallPlayerName
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
index 5e85a7e..71649ca 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -65,6 +65,7 @@
 Help_leaderID = 'leaderID' #渡劫玩家ID
 Help_isHelp = 'isHelp' #本次是否是助战
 Help_helpCount = 'helpCount' #该副本今日已助战次数
+Help_relation = 'relation' #该副本关系加成信息 [优先关系, 总加成]
 
 #副本结算信息通用key
 Over_dataMapID = 'dataMapID' #数据地图ID
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 e766f97..5c74fc2 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
@@ -474,7 +474,7 @@
     #                       % (todayXianyuanCoin, playerXianyuanCoinUpper), playerID)
     #    return
     
-    relationAdd, relationPlayerID, relationPlayerName = 0, 0, ""
+    relation, relationAdd, relationPlayerID, relationPlayerName = 0, 0, 0, ""
     
     fbType = GameWorld.GetMap().GetMapFBType()
     if fbType == IPY_GameWorld.fbtSingle:
@@ -486,8 +486,9 @@
             relationAddList = relationCoinAddDict.get(str(relation), [])
             relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0
     elif fbType == IPY_GameWorld.fbtTeam:
-        relationAdd, relationPlayerID, relationPlayerName = __GetTeamFBMemRelationInfo(curPlayer, relationCoinAddDict, isHelp)
-        
+        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)
@@ -507,62 +508,100 @@
     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)
-    msgPack.Reason = reason
     NetPackCommon.SendFakePack(curPlayer, msgPack)
     return coinAddReal, reason
 
-def __GetTeamFBMemRelationInfo(curPlayer, relationCoinAddDict, isHelp):
+def __GetTeamFBMemRelationInfo(curPlayer, isHelp, leavePlayerID):
+    ## 计算队员间相互加成信息,离线玩家不算
+    relation = 0
     relationAdd = 0 # 社交关系加成
     relationPlayerID = 0
     relationPlayerName = ""
     teamID = curPlayer.GetTeamID()
     if teamID not in PyGameData.g_teamFBMemRelationDict:
-        return relationAdd, relationPlayerID, relationPlayerName
+        return relation, relationAdd, relationPlayerID, relationPlayerName
     
+    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:
         # 助战的随便取一位优先级最高的即可
-        for checkRelation in relationList:
-            memRelation, relationPlayerID = 0, 0
-            if checkRelation == 1:
-                for memPlayerID in memFamilyIDDict.keys():
-                    if [playerID, memPlayerID] in friendList:
-                        memRelation = checkRelation
-                        relationPlayerID = memPlayerID
-                        break
-            if checkRelation == 2:
-                for memPlayerID, memFamilyID in memFamilyIDDict.items():
-                    if playerID != memPlayerID and familyID and familyID == memFamilyID:
-                        memRelation = checkRelation
-                        relationPlayerID = memPlayerID
-                        break
-            if memRelation and relationPlayerID:
-                relationAddList = relationCoinAddDict.get(str(memRelation), [])
-                relationAdd += relationAddList[1] if len(relationAddList) == 2 else 0
-                relationPlayerName = memNameDict[relationPlayerID]
-                return relationAdd, relationPlayerID, relationPlayerName
+        for memPlayerID, memFamilyID in memFamilyIDDict.items():
+            memRelation, relationPlayerID = __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID)
+            if not memRelation:
+                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
+        
     else:
         # 非助战享受所有队员加成
         for memPlayerID, memFamilyID in memFamilyIDDict.items():
-            memRelation = 0
-            for checkRelation in relationList:
-                if [playerID, memPlayerID] in friendList:
-                    memRelation = checkRelation
-                    break
-                if playerID != memPlayerID and familyID and familyID == memFamilyID:
-                    memRelation = checkRelation
-                    break
+            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 relationAdd, relationPlayerID, relationPlayerName
+    return relation, relationAdd, relationPlayerID, relationPlayerName
+
+def __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID):
+    ## 离线玩家不算社交关系
+    if leavePlayerID and memPlayerID == leavePlayerID:
+        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, 0
+
+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 GetTeamFBMemRelationInfo(playerID):
+    if playerID not in PyGameData.g_teamFBMemRelationAddDict:
+        return 0, 0
+    return PyGameData.g_teamFBMemRelationAddDict[playerID][:2]
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ChaosDemon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ChaosDemon.py
index 865339c..d6fbb77 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ChaosDemon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ChaosDemon.py
@@ -175,7 +175,8 @@
         curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)
         __UpdChaosDemonFBStar(tick, True, curPlayer)
         
-    DoFBHelp(curPlayer, tick)
+    FBHelpBattle.RefershTeamFBMemRelation(tick)
+    #DoFBHelp(curPlayer, tick)
     return
 
 ## 诅咒城堡刷怪
@@ -220,6 +221,9 @@
 # @return 返回值无意义
 def DoExitFB(curPlayer, tick):
     GameWorld.DebugLog("ChaosDemon DoExitFB...", curPlayer.GetPlayerID())
+    fbStep = GameWorld.GetGameFB().GetFBStep()
+    if fbStep <= FB_Step_Fight:
+        FBHelpBattle.RefershTeamFBMemRelation(tick, curPlayer.GetPlayerID())
     return
 
 ##玩家主动离开副本.
@@ -511,6 +515,7 @@
 # @return 无意义
 # @remarks 用于通知阵营比分条
 def DoFBHelp(curPlayer, tick):
+    playerID = curPlayer.GetPlayerID()
     gameFB = GameWorld.GetGameFB()
     star = gameFB.GetGameFBDictByKey(ChaosDemon_FBStar)
     wheelNum = gameFB.GetGameFBDictByKey(ChaosDemon_FBNextRefreshStep)
@@ -522,8 +527,9 @@
     isHelp = FBCommon.GetIsHelpFight(curPlayer)
     helpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FBRealHelpCount % ChConfig.Def_FBMapID_ChaosDemon)
     fbHelpDict = {FBCommon.Help_step:wheelNum, FBCommon.Help_grade:star, FBCommon.Help_npcTotal:KillNPCCnt, FBCommon.Help_lineID:lineID, 
-                  FBCommon.Help_isHelp:isHelp, FBCommon.Help_helpCount:helpCount}
+                  FBCommon.Help_isHelp:isHelp, FBCommon.Help_helpCount:helpCount, FBCommon.Help_relation:FBHelpBattle.GetTeamFBMemRelationInfo(playerID)}
     FBCommon.Notify_FBHelp(curPlayer, fbHelpDict)
+    GameWorld.DebugLog("DoFBHelp %s" % str(fbHelpDict), playerID)
     return
 
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFBTeamRelation.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFBTeamRelation.py
index 49de67a..0d1db66 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFBTeamRelation.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFBTeamRelation.py
@@ -17,6 +17,8 @@
 #导入
 import PyGameData
 import GameWorld
+import FBHelpBattle
+import traceback
 
 #---------------------------------------------------------------------
 
@@ -44,11 +46,46 @@
 #  @remarks 函数详细说明.
 def DoResult(curPlayer, callFunName, funResult, tick):
     try:
-        teamID, friendList, memFamilyIDDict, memNameDict = eval(funResult)
-        PyGameData.g_teamFBMemRelationDict[teamID] = [friendList, memFamilyIDDict, memNameDict]
-        GameWorld.Log("队员关系信息: teamID=%s,friendList=%s,memFamilyIDDict=%s" % (teamID, friendList, memFamilyIDDict))
-    except:
-        pass
+        msgList = eval(funResult)
+        msgType = msgList[0]
+        if msgType == "InitRelation":
+            teamID, friendList, memFamilyIDDict, memNameDict = msgList[1:]
+            PyGameData.g_teamFBMemRelationDict[teamID] = [friendList, memFamilyIDDict, memNameDict]
+            GameWorld.Log("队员初始关系信息: teamID=%s,friendList=%s,memFamilyIDDict=%s" % (teamID, friendList, memFamilyIDDict))
+            return
+        
+        if msgType == "FriendChange":
+            teamID, playerID, tagPlayerID, isFriend = msgList[1:]
+            GameWorld.Log("队员好友变更: teamID=%s,playerID=%s,tagPlayerID=%s,isFriend=%s" % (teamID, playerID, tagPlayerID, isFriend))
+            if teamID not in PyGameData.g_teamFBMemRelationDict:
+                return
+            friendList = PyGameData.g_teamFBMemRelationDict[teamID][0]
+            if isFriend:
+                friendList.append([playerID, tagPlayerID])
+                friendList.append([tagPlayerID, playerID])
+            else:
+                if [playerID, tagPlayerID] in friendList:
+                    friendList.remove([playerID, tagPlayerID])
+                if [tagPlayerID, playerID] in friendList:
+                    friendList.remove([tagPlayerID, playerID])
+                    
+        elif msgType == "FamilyChange":
+            teamID, playerID, familyID = msgList[1:]
+            GameWorld.Log("队员家族变更: teamID=%s,playerID=%s,familyID=%s" % (teamID, playerID, familyID))
+            if teamID not in PyGameData.g_teamFBMemRelationDict:
+                GameWorld.Log("teamID=%s, not in PyGameData.g_teamFBMemRelationDict %s" % (teamID, PyGameData.g_teamFBMemRelationDict))
+                return
+            memFamilyIDDict = PyGameData.g_teamFBMemRelationDict[teamID][1]
+            memFamilyIDDict[playerID] = familyID
+            
+        else:
+            return
+        
+        # 关系变更刷新
+        FBHelpBattle.RefershTeamFBMemRelation(tick)
+    except BaseException:
+        errorMsg = str(traceback.format_exc())
+        GameWorld.ErrLog("%s" % errorMsg)
     
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index 3869e0f..45f508b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -72,5 +72,6 @@
 g_fbHelpBattlePlayerDict = {} # 助战玩家信息 {playerID:{助战玩家ID:{助战玩家简要信息字典} ...}, ...}
 
 g_teamFBMemRelationDict = {} # 组队副本队员关系信息 {teamID:[[好友组合列表], {队员ID:家族ID, ...}], }
+g_teamFBMemRelationAddDict = {} # 组队副本队员关系加成信息 {playerID:[relation, relationAdd, relationPlayerID, relationPlayerName], ...}    
 
 

--
Gitblit v1.8.0