| | |
| | | import CommFunc
|
| | | import GameWorld
|
| | | import ShareDefine
|
| | | import CheckServerID
|
| | | import PlayerViewCache
|
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | |
| | | ## 更新分区配置,重置分区,重新分配
|
| | | ## @return: 本跨服是否成功更新分区,验证不通过的话不会重置,保留原分区
|
| | | GameWorld.Log("跨服公会互通配置更新! updCrossZoneCfgDict=%s" % updCrossZoneCfgDict)
|
| | | if not CheckCrossZoneCfg(self.__crossZoneCfgDict, updCrossZoneCfgDict):
|
| | | if not CheckFamilyCrossZoneCfg(self.__crossZoneCfgDict, updCrossZoneCfgDict):
|
| | | return
|
| | |
|
| | | crossServerID = GameWorld.GetGameWorld().GetServerID()
|
| | |
| | | GameWorld.Log("跨服公会分区配置加载: appID=%s,%s" % (appID, crossZoneCfgDict))
|
| | | return crossZoneCfgDict
|
| | |
|
| | | def CheckCrossZoneCfg(curCrossZoneCfgDict, updCrossZoneCfgDict):
|
| | | # 检查待更新的分区配置是否符合规则,不符合的话保留原配置,不更新,待扩展
|
| | | def CheckFamilyCrossZoneCfg(curCrossZoneCfgDict, updCrossZoneCfgDict):
|
| | | # 检查待更新的分区配置是否符合规则,不符合的话保留原配置,不更新
|
| | |
|
| | | if curCrossZoneCfgDict == updCrossZoneCfgDict:
|
| | | GameWorld.Log("跨服公会互通分区配置不变不处理")
|
| | | return
|
| | |
|
| | | # 验证配置,是否有交叉、拆分,并邮件通知运维,待扩展,功能完整性优先
|
| | | #GameWorld.SendGameErrorEx("FamilyCrossZoneCfgError", "noZoneServerIDList=%s" % noZoneServerIDList)
|
| | | isOK, errInfo = CheckServerID.CheckCrossZoneCfg(curCrossZoneCfgDict, updCrossZoneCfgDict)
|
| | | if not isOK:
|
| | | GameWorld.SendGameErrorEx("FamilyCrossZoneCfgError", errInfo)
|
| | | return
|
| | |
|
| | | return True
|
| | |
|
| | |
| | | ## 本服公会首次跨服互通同步数据中
|
| | | return DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_FamilyTransDataTime) > 0
|
| | |
|
| | | def CheckMainServerNoFamilyToCross(connServerID=0):
|
| | | '''已经互通的情况下,需要再额外检查本服是否有公会
|
| | | 没有公会时需要主动告知跨服检查是否成功加入互通分区,否则本服将无法正常进行公会互通
|
| | | def CheckMainServerNoFamilyToCross(connServerID):
|
| | | '''已经互通的情况下,需要再额外检查本服是否有在目标服务器互通分区里
|
| | | 有一种情况:游戏加入互通后,该服的所有公会被删除(可能玩家主动删除、可能系统认为需要删除的公会)
|
| | | 导致该游戏服在跨服服务器没有公会了,且该服没有任何玩家加入任何公会,此时该服务器就无法正常被划入某个分区
|
| | | 所以已互通的游戏服受到跨服同步的分区信息时,需要检查是否已在分区里,没有的话需要主动汇报请求加入
|
| | | '''
|
| | | if not IsFamilyCross():
|
| | | return
|
| | | familyMgr = DBDataMgr.GetFamilyMgr()
|
| | | familyIDList = familyMgr.GetFamilyIDList()
|
| | | if familyIDList:
|
| | | if not connServerID:
|
| | | return
|
| | | familyMgr = DBDataMgr.GetFamilyMgr()
|
| | | #familyIDList = familyMgr.GetFamilyIDList()
|
| | | #if familyIDList:
|
| | | # return
|
| | |
|
| | | serverID = GameWorld.GetGameWorld().GetServerID()
|
| | | GameWorld.Log("本服无公会需直接同步跨服请求检查加入互通分区! serverID=%s" % (serverID))
|
| | |
|
| | | curZoneServerIDList = familyMgr.GetCurZoneServerIDList()
|
| | | if serverID in curZoneServerIDList:
|
| | | GameWorld.Log("已经在互通分区里了不处理! serverID=%s in %s" % (serverID, curZoneServerIDList))
|
| | | GameWorld.Log("已经在该跨服互通分区里了不处理! serverID=%s in %s" % (serverID, curZoneServerIDList))
|
| | | return
|
| | |
|
| | | crossServerID = 0
|
| | |
| | | GameWorld.Log("本服公会未分配互通分区! serverID=%s" % (serverID))
|
| | | return
|
| | |
|
| | | if connServerID:
|
| | | if connServerID != crossServerID:
|
| | | GameWorld.Log("本服公会互通非目标跨服ID不处理! serverID=%s,crossServerID=%s != %s" % (serverID, crossServerID, connServerID))
|
| | | return
|
| | | else:
|
| | | ssServer = CrossMgr.GetSSServerMgr().GetSSServer(crossServerID)
|
| | | connState = ssServer.GetConnState()
|
| | | if connState != ShareDefine.ssConn_Normal:
|
| | | GameWorld.Log("本服公会互通目标跨服ID非连接状态! serverID=%s,crossServerID=%s,connState=%s" % (serverID, crossServerID, connState))
|
| | | return
|
| | | |
| | | if connServerID != crossServerID:
|
| | | GameWorld.Log("本服公会互通非目标跨服ID不处理! serverID=%s,crossServerID=%s != %s" % (serverID, crossServerID, connServerID))
|
| | | return
|
| | | GameWorld.Log("本服已互通但没有在该跨服互通分区里,直接请求加入! serverID=%s,crossServerID=%s,toZoneID=%s" % (serverID, crossServerID, toZoneID))
|
| | | |
| | | CrossMsg.SendToCrossServer(ShareDefine.S2C_FamilyData, {"checkInZone":1, "toZoneID":toZoneID}, [crossServerID])
|
| | | return
|
| | |
|