ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
@@ -263,6 +263,8 @@
        self.SetFacePic(viewCache.GetFacePic())
        self.SetTitleID(viewCache.GetTitleID())
        self.SetServerID(viewCache.GetServerID())
        if not self.GetOffTime(): # 有离线时间数据了,以成员自己的为准
            self.SetOffTime(viewCache.GetOffTime())
        fpChange = False
        fightPowerTotal = viewCache.GetFightPowerTotal()
        if self.GetFightPowerTotal() != fightPowerTotal:
@@ -343,6 +345,9 @@
            return
        self.__memberDict[playerID] = member
        self.__memberList.append(member)
        viewCache = PlayerViewCache.FindViewCache(playerID)
        member.SetOffTime(viewCache.GetOffTime() if viewCache else int(time.time()))
        self.__familyMgr.OnAddMember(self, playerID)
        return member
    
    def GetMemberIDList(self): return self.__memberDict.keys()
@@ -360,7 +365,6 @@
            if not member and False:
                member = FamilyMem()
        self.RefrshFightPowerTotal()
        self.__familyMgr.OnAddMember(self, playerID)
        return member
    
    def DeleteMember(self, playerID):
@@ -520,6 +524,8 @@
                if fixName not in self.__familyNameDict:
                    familyName = fixName
                    break
            family.SetName(familyName)
            family.SetExtra1(0) # 重置改名CD
        self.__familyNameDict[familyName] = family
        
        if family not in self.__familyList:
@@ -834,10 +840,18 @@
        self.__crossZoneCfgDict = updCrossZoneCfgDict
        self.__zoneFamilyMgrDict = {}
        self.__familyIDZoneIDDict = {}
        # 重新初始化本服管理的分区
        zoneDict = self.__crossZoneCfgDict[crossServerID]
        GameWorld.Log("本跨服重置公会互通分区! crossServerID=%s,zoneDict=%s" % (crossServerID, zoneDict))
        for zoneID in zoneDict.keys():
            self.GetZoneFamilyMgr(zoneID)
        GameWorld.Log("GetZoneIDListThisServer=%s" % self.GetZoneIDListThisServer())
        # 重新将本服公会数据分配到所属分区
        for family in self.__familyIDDict.values():
            familyID = family.GetID()
            zoneID = familyZoneDict.get(familyID, 0) # 理论上不可能再为0
            zoneID = familyZoneDict.get(familyID, 0) # 理论上不可能再为0,因为有0时 noZoneServerIDList 验证不会通过
            zoneMgr = self.GetZoneFamilyMgr(zoneID)
            zoneMgr.AddFamilyToZone(family)
            
@@ -877,7 +891,7 @@
                    break
        return zoneID
    
    def GetZoneIDListThisServer(self): return self.__zoneFamilyMgrDict.keys() # 在本服数据中已存在的分区
    def GetZoneIDListThisServer(self): return self.__zoneFamilyMgrDict.keys() # 本服管理的分区
    
    def GetFamilyZoneID(self, familyID): return self.__familyIDZoneIDDict.get(familyID, -1) # -1-未找到所属分区;>=0-所属分区
    
@@ -1035,7 +1049,7 @@
            self.__setFamilyToDefaultZone() # 游戏服本服的数据无论有没有跨服了都同意设置到默认分区
        return pos
    
def LoadZoneCfg(self):
def LoadZoneCfg():
    crossZoneCfgDict = {}
    appID = GameWorld.GetAppID()
    ipyDataMgr = IpyGameDataPY.IPY_Data()
@@ -1049,6 +1063,7 @@
            crossZoneCfgDict[crossServerID] = {}
        zoneDict = crossZoneCfgDict[crossServerID]
        zoneDict[zoneID] = [] + ipyData.GetServerIDList()
    GameWorld.Log("跨服公会分区配置加载: appID=%s,%s" % (appID, crossZoneCfgDict))
    return crossZoneCfgDict
def CheckCrossZoneCfg(curCrossZoneCfgDict, updCrossZoneCfgDict):
@@ -1058,7 +1073,7 @@
        GameWorld.Log("跨服公会互通分区配置不变不处理")
        return
    
    # 验证配置,是否有交叉、拆分,并邮件通知运维,待扩展,先开发功能
    # 验证配置,是否有交叉、拆分,并邮件通知运维,待扩展,功能完整性优先
    #GameWorld.SendGameErrorEx("FamilyCrossZoneCfgError", "noZoneServerIDList=%s" % noZoneServerIDList)
    
    return True
@@ -1073,11 +1088,13 @@
        if not crossZoneCfgDict or not DBDataMgr.GetFamilyMgr().UpdCrossZoneCfgDict(crossZoneCfgDict):
            return
        Sync_CenterToCross_FamilyCrossCfg()
        Sync_CrossToServer_FamilyInfo()
    return
def Sync_CenterToCross_FamilyInfo(serverType, serverID):
    ## 跨服中心同步给跨服服务器
    # 【注】只同步给跨服服务器,各跨服验证通过后,游戏服才会通过所属跨服取得最终的分区信息
    if serverType == ShareDefine.serverType_Cross:
        Sync_CenterToCross_FamilyCrossCfg(serverID)
    return
@@ -1115,6 +1132,7 @@
    ## 跨服服务器同步互通公会信息给游戏服
    # @param toServerID: 有指定游戏服连上时只发给该服,没有的话一般是分区配置变更时由跨服主动同步所有相关游戏服
    
    GameWorld.DebugLog("Sync_CrossToServer_FamilyInfo toServerID=%s,syncZoneID=%s,syncFamilyIDList=%s" % (toServerID, syncZoneID, syncFamilyIDList))
    familyMgr = DBDataMgr.GetFamilyMgr()
    crossZoneCfgDict = familyMgr.GetCrossZoneCfgDict() # 配置的互通
    if not crossZoneCfgDict:
@@ -1123,6 +1141,7 @@
    if crossServerID not in crossZoneCfgDict:
        return
    zoneCfgDict = crossZoneCfgDict[crossServerID]
    GameWorld.DebugLog("    crossServerID=%s,zoneCfgDict=%s" % (crossServerID, zoneCfgDict))
    
    for zoneID in familyMgr.GetZoneIDListThisServer():
        if syncZoneID and syncZoneID != zoneID:
@@ -1134,6 +1153,7 @@
        if toServerID:
            if not GameWorld.CheckServerIDInList(toServerID, cfgServerIDList):
                # 非指定目标服务器所属分区不同步
                #GameWorld.DebugLog("    非指定目标服务器所属分区不同步 toServerID=%s" % (toServerID))
                continue
            toServerIDList = [toServerID]
        else:
@@ -1260,6 +1280,7 @@
    syncData = familyMgr.GetSaveData(cntDict)
    familyIDList = familyMgr.GetFamilyIDList()
    
    GameWorld.Log("dataslen=%s" % len(syncData))
    CrossMsg.SendToCrossServer(ShareDefine.S2C_FamilyData, {"syncData":syncData, "familyIDList":familyIDList, "cntDict":cntDict}, [crossServerID])
    return
@@ -1270,11 +1291,9 @@
    GameWorld.Log("收到游戏服同步的互通公会数据! fromServerID=%s,cntDict=%s,familyIDList=%s" % (fromServerID, cntDict, familyIDList))
    
    unpackRet = __unpackFamilyData(syncData, familyIDList, cntDict)
    if not unpackRet:
        errorMsg = "unknown"
    else:
        errorMsg = unpackRet[0]
    if errorMsg:
    isOK = unpackRet[0]
    if not isOK:
        errorMsg = unpackRet[1]
        GameWorld.SendGameErrorEx("S2C_FamilyDataError", "互通公会数据同步失败! fromServerID=%s,errorMsg=%s" % (fromServerID, errorMsg))
        CrossMsg.SendToClientServer(ShareDefine.C2S_FamilyDataRet, {"isOK":False}, [fromServerID])
        return
@@ -1287,7 +1306,6 @@
    
    syncFamilyIDList = []
    for dbData in familyDataList:
        dbData = DBStruct.tagDBFamily()
        familyID = dbData.ID
        familyMgr.DelFamily(familyID, False) # 每次都强制先删除,支持重复同步
        zoneMgr.AddFamilyToZone(familyMgr.InitFamilyInstance(dbData))
@@ -1327,6 +1345,7 @@
    
    errorMsg = ""
    datas, pos, dataslen = syncData, 0, len(syncData)
    GameWorld.Log("__unpackFamilyData: dataslen=%s" % dataslen)
    
    zoneIDDict = {}
    familyMgr = DBDataMgr.GetFamilyMgr()
@@ -1342,25 +1361,25 @@
        familyID = dbData.ID
        if familyID not in familyIDList:
            errorMsg = "同步的数据公会ID不匹配! familyID=%s not in %s" % (familyID, familyIDList)
            return errorMsg
            return False, errorMsg
        
        familyServerID = dbData.ServerID
        zoneID = familyMgr.GetZoneIDInThisServer(familyServerID)
        if zoneID <= 0:
            errorMsg = "同步的公会数据不属于本跨服! familyID=%s,familyServerID=%s,zoneID=%s" % (familyID, familyServerID, zoneID)
            return errorMsg
            return False, errorMsg
        zoneIDDict[zoneID] = familyServerID
        
    if len(zoneIDDict) != 1:
        errorMsg = "同步的公会数据分区异常可能存在多个分区! zoneIDDict=%s" % zoneIDDict
        return errorMsg
        return False, errorMsg
    zoneID = zoneIDDict.keys()[0]
    
    uppackFamilyCnt = len(familyDataList)
    familyDataCnt = cntDict.get("familyDataCnt", 0)
    if uppackFamilyCnt != familyDataCnt:
        errorMsg = "同步的公会个数不匹配! uppackFamilyCnt=%s != %s" % (uppackFamilyCnt, familyDataCnt)
        return errorMsg
        return False, errorMsg
    
    # 成员
    memberDataList = []
@@ -1375,7 +1394,7 @@
    membreDataCnt = cntDict.get("membreDataCnt", 0)
    if uppackMemberCnt != membreDataCnt:
        errorMsg = "同步的成员个数不匹配! uppackMemberCnt=%s != %s" % (uppackMemberCnt, membreDataCnt)
        return errorMsg
        return False, errorMsg
    
    # 行为
    actionDataList = []
@@ -1390,9 +1409,9 @@
    actionDataCnt = cntDict.get("actionDataCnt", 0)
    if uppackMemberCnt != membreDataCnt:
        errorMsg = "同步的行为个数不匹配! uppackActionCnt=%s != %s" % (uppackActionCnt, actionDataCnt)
        return errorMsg
        return False, errorMsg
    
    return errorMsg, zoneID, familyDataList, memberDataList, actionDataList
    return True, zoneID, familyDataList, memberDataList, actionDataList
def C2S_FamilyDataRet(dataMsg, fromServerID):
    isOK = dataMsg["isOK"]