hch
2 天以前 35d98e9c630fd4408561c8c54b4c09193bb9ce9e
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -85,13 +85,26 @@
    return
def __doFamilyOnHour():
    needHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1)
    priorityHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 2) # 优先传给离线不超过x小时的成员,一样按优先级
    if GameWorld.IsMainServer() and not DBFamily.IsFamilyCross():
        # 开服前X天会长离线Y小时触发自动转让,优先级高于数值1,格式 X|Y
        openServerSet = IpyGameDataPY.GetFuncEvalCfg("FamilyLeaderAutoChange", 3)
        befServerDay = openServerSet[0]
        serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
        if serverDay <= befServerDay:
            needHours = openServerSet[1]
            priorityHours = openServerSet[2]
    GameWorld.DebugLog("自动传位时长设定: needHours=%s,priorityHours=%s" % (needHours, priorityHours))
    familyManager = DBDataMgr.GetFamilyMgr()
    for zoneID in familyManager.GetZoneIDListThisServer():
        zoneMgr = familyManager.GetZoneFamilyMgr(zoneID)
        for i in range(0, zoneMgr.GetCount()):
            family = zoneMgr.GetAt(i)
            #自动传位
            __AutoChangeLeader(family)
            __AutoChangeLeader(family, needHours, priorityHours)
    return
def FamilyCrossCenterOnDay():
@@ -165,6 +178,8 @@
    PlayerLoginRefreshFamily(crossPlayer) # 必须先刷新
    Sync_RequestAddFamilyInfo(crossPlayer, False)
    PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcFamily]) # 公会聊天缓存
    if GameWorld.IsCrossServer():
        PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcCountry]) # 跨服公会聊天缓存
    PlayerFamilyTaofa.OnCrossPlayerLogin(crossPlayer)
    return
@@ -805,12 +820,17 @@
            joinCDMinute = joinCDMinuteList[kickedCnt - 1] if len(joinCDMinuteList) >= kickedCnt else joinCDMinuteList[-1]
    if joinCDMinute:
        cdTimes = joinCDMinute * 60
        passTimes = int(time.time()) - leaveFamilyTime
        passTimes = GetFamilyTime() - leaveFamilyTime
        if passTimes < cdTimes:
            GameWorld.DebugLog("加入公会CD中: leaveCnt=%s,kickedCnt=%s,lastVoluntarily=%s,leaveFamilyTime=%s(%s),passTimes=%s < %s" 
                   % (leaveCnt, kickedCnt, lastVoluntarily, leaveFamilyTime, GameWorld.ChangeTimeNumToStr(leaveFamilyTime), passTimes, cdTimes))
            return True
    return False
def GetFamilyTime():
    if GameWorld.IsMainServer() and DBFamily.IsFamilyCross():
        return CrossMgr.GetSSServerMgr().GetCrossTime()
    return int(time.time())
def AutoJoinFamily(crossPlayer):
    if crossPlayer.GetFamilyID():
@@ -1327,7 +1347,7 @@
    CrossPlayer.FamilyNotify(familyID, "XW_JZ_AppointFamily", [memName, changeFamilyLV])
    return
def __AutoChangeLeader(curFamily):
def __AutoChangeLeader(curFamily, needHours, priorityHours):
    ## 自动传位
    leaderID = curFamily.GetLeaderID()
    leaderMem = curFamily.FindMember(leaderID)
@@ -1340,16 +1360,12 @@
    curTime = int(time.time())
    passTime = curTime - offTime
    passHours = passTime / 3600.0
    needHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1)
    if passHours < needHours:
        GameWorld.DebugLogEx("盟主离线未超过限制小时,不处理自动传位!familyID=%s,leaderID=%s,offTime=%s,passHours=%s < %s", 
                             familyID, leaderID, GameWorld.ChangeTimeNumToStr(offTime), passHours, needHours)
        return
    
    priorityHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1) # 优先传给离线不超过x小时的成员,一样按优先级
    priorityList = []
    commList = []
    for i in range(0, curFamily.GetCount()):
        member = curFamily.GetAt(i)
        if member.GetFmLV() == IPY_PlayerDefine.fmlLeader:
@@ -1368,22 +1384,16 @@
        fmLV = member.GetFmLV() # ְλ
        contribTotal = member.GetContribTotal() # 总贡献
        
        commList.append([fmLV, sortTime, contribTotal, member])
        if priorityHours and memPassHours <= priorityHours:
            priorityList.append([fmLV, sortTime, contribTotal, member])
            
    if not priorityList and not commList:
        # 没有可传位的目标成员
    if not priorityList:
        GameWorld.DebugLog("没有可传位的目标成员! familyID=%s" % familyID)
        return
    
    toMember = None
    if priorityList:
        priorityList.sort(reverse=True)
        toMember = priorityList[0][-1]
    else:
        commList.sort(reverse=True)
        toMember = commList[0][-1]
    priorityList.sort(reverse=True)
    toMember = priorityList[0][-1]
    if not toMember:
        return
    
@@ -1594,13 +1604,19 @@
    if CheckFamilyNameExists(crossPlayer, newName, fromServerID):
        return
    
    zoneMgr = familyMgr.GetZoneFamilyMgrByFamilyID(familyID)
    if not zoneMgr:
        return
    if not zoneMgr.FamilyRemainName(family, newName):
        return
    if cdHours:
        SetRenameTime(family, curTime)
    moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("FamilyRename", 1)
    if moneyType and moneyValue:
        CrossPlayer.CostPlayerResources(crossPlayer, "FamilyRename", costMoneyDict={moneyType:moneyValue})
    family.SetName(newName)
    if cdHours:
        SetRenameTime(family, curTime)
        
    crossPlayerMgr = CrossPlayer.GetCrossPlayerMgr()
    for index in xrange(family.GetCount()):
@@ -1919,7 +1935,7 @@
    curMember.SetContribTotal(contribTotal)
    GameWorld.DebugLog("增加成员贡献: familyID=%s,addContribValue=%s,contribDay=%s,contribTotal=%s" % (familyID, addContribValue, contribDay, contribTotal), playerID)
    
    Broadcast_FamilyInfo(familyID, isSyncMem=False) # 成员贡献
    Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID]) # 成员贡献
    return
## ------------------------------------------------------------------------------------------------
@@ -2023,7 +2039,7 @@
def OnFamilyTalk(curPlayer, familyID, talkPack, tick):
    clientData, tick = None, 0
    reqDataEx = {"talkBuffer":talkPack.GetBuffer()}
    FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnFamilyTalk", reqCD=0, reqDataEx=reqDataEx)
    FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnFamilyTalk", reqDataEx=reqDataEx)
    return
def __OnFamilyTalk(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None):
    talkBuffer = reqDataEx["talkBuffer"]
@@ -2041,6 +2057,44 @@
    content = clientPack.Content
    bubbleBox = clientPack.BubbleBox
    PlayerTalk.DoTalkCache(channelType, playerID, content, bubbleBox, familyID)
    return
def OnCrossFamilyTalk(curPlayer, talkPack, tick):
    ## 跨服公会聊天,与跨服公会互通范围一致
    crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
    if crossServerID <= 0:
        GameWorld.DebugLog("本服公会未互通,不允许跨服聊天")
        return
    clientData, tick = None, 0
    reqDataEx = {"talkBuffer":talkPack.GetBuffer()}
    FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnCrossTalk", reqDataEx=reqDataEx)
    return
def __OnCrossTalk(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None):
    talkBuffer = reqDataEx["talkBuffer"]
    playerID = crossPlayer.GetPlayerID()
    if not talkBuffer:
        return
    familyMgr = DBDataMgr.GetFamilyMgr()
    zoneID = familyMgr.GetZoneIDInThisServer(fromServerID)
    if zoneID < 0:
        GameWorld.ErrLog("找不到服务器ID在跨服中的公会分区! fromServerID=%s" % fromServerID)
        return
    zoneMgr = familyMgr.GetZoneFamilyMgr(zoneID)
    serverIDList = zoneMgr.GetZoneServerIDList()
    if not serverIDList:
        return
    clientPack = ChPyNetSendPack.tagMCTalk()
    clientPack.ReadData(talkBuffer)
    CrossPlayer.SendFackPackToServerList(clientPack, serverIDList)
    # 聊天缓存
    channelType = clientPack.ChannelType
    content = clientPack.Content
    bubbleBox = clientPack.BubbleBox
    PlayerTalk.DoTalkCache(channelType, playerID, content, bubbleBox)
    return
## -------------------------------------- 游戏服本服处理 --------------------------------------------
@@ -2141,7 +2195,7 @@
    curPlayer.SetFamilyActiveValue(0)
    curPlayer.SetLastWeekFamilyActiveValue(0)
    curPlayer.SetFamilyLV(0)
    PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time()))
    PlayerControl.SetLeaveFamilyTimeEx(curPlayer, GetFamilyTime())
    leaveCnt, kickedCnt, _ = PlayerControl.GetLeaveFamilyInfo(curPlayer)
    GameWorld.DebugLog("__OnLeaveFamily: isVoluntarily=%s,leaveCnt=%s,kickedCnt=%s" % (isVoluntarily, leaveCnt, kickedCnt))
    delMoneyType, delMoneyPer = IpyGameDataPY.GetFuncCfg("FamilyLeave", 3), 0