#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#---------------------------------------------------------------------  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
##@package PlayerFamily  
 | 
# @todo: ¼Ò×åÂß¼¹ÜÀíÆ÷  
 | 
#  
 | 
# @author: eggxp  
 | 
# @date 2010-3-31  
 | 
# @version 1.0  
 | 
#  
 | 
# @note:   
 | 
#---------------------------------------------------------------------  
 | 
#------------------------------------------------------------------------------   
 | 
#"""Version = 2017-03-06 14:30"""  
 | 
#---------------------------------------------------------------------  
 | 
import GameWorld  
 | 
import IPY_GameServer  
 | 
import ChConfig  
 | 
import PlayerRequest  
 | 
import PlayerControl  
 | 
import DirtyList  
 | 
import ReadChConfig  
 | 
import PlayerDBGSEvent  
 | 
import ShareDefine  
 | 
#import PlayerFamilyTech  
 | 
import PlayerFamilyAction  
 | 
import DataRecordPack  
 | 
import PlayerFamilyBoss  
 | 
import IpyGameDataPY  
 | 
import PlayerFamilyRedPacket  
 | 
import GameWorldFamilyWar  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import PyDataManager  
 | 
import PyGameData  
 | 
import PlayerCompensation  
 | 
import PlayerFamilyParty  
 | 
import PlayerFamilySWRH  
 | 
import PlayerViewCache  
 | 
import GameWorldBoss  
 | 
import AuctionHouse  
 | 
import PlayerAssist  
 | 
import PlayerTalk  
 | 
import PlayerTeam  
 | 
  
 | 
import copy  
 | 
import random  
 | 
import time  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
# µ¯ÛÀʱ¼äµÄÅäÖÃλÖà  
 | 
(  
 | 
ImpeachNoteTime, # °ïÖ÷ÏÂÏß¶à¾Ã¸øµ¯ÛÀÌáʾ  
 | 
CanImpeachTime, # °ïÖ÷ÏÂÏß¶à¾Ã£¬¿ÉÒÔ¿ªÊ¼µ¯ÛÀ  
 | 
ImpeachLastTime  # µ¯ÛÀÐèÒª³ÖÐøµÄʱ¼ä  
 | 
) = range(3)  
 | 
  
 | 
  
 | 
## ------------------ ÏÉÃË ----------------------  
 | 
## ÏÉÃËÁªÈüÅÅÃû  
 | 
def GetFamilyWarRank(curFamily): return curFamily.GetPoint()  
 | 
def SetFamilyWarRank(curFamily, rank): return curFamily.SetPoint(rank)  
 | 
## ÏÉÃË×ÜÕ½Á¦£¬ÐèÖ§³Ö³¬¹ý20E  
 | 
def GetFamilyTotalFightPower(curFamily): return curFamily.GetExtra4() * ChConfig.Def_PerPointValue + curFamily.GetExtra5()  
 | 
def SetFamilyTotalFightPower(curFamily, totalFightPower):  
 | 
    curFamily.SetExtra4(totalFightPower / ChConfig.Def_PerPointValue)  
 | 
    curFamily.SetExtra5(totalFightPower % ChConfig.Def_PerPointValue)  
 | 
    return  
 | 
def GetFamilyTotalFightPowerByID(familyID):  
 | 
    family = GameWorld.GetFamilyManager().FindFamily(familyID)  
 | 
    if not family:  
 | 
        return 0  
 | 
    return GetFamilyTotalFightPower(family)  
 | 
  
 | 
# ¹«¸æÐ޸ĴÎÊý  
 | 
def GetFamilyBroadcastCnt(curFamily): return curFamily.GetExtra3()  
 | 
def SetFamilyBroadcastCnt(curFamily, setCnt): return curFamily.SetExtra3(min(setCnt, ChConfig.Def_UpperLimit_DWord))  
 | 
# ÊÞÁ¸  
 | 
def GetFamilyBossFood(curFamily): return curFamily.GetHornor()  
 | 
def SetFamilyBossFood(curFamily, setCnt): return curFamily.SetHornor(min(setCnt, ChConfig.Def_UpperLimit_DWord))  
 | 
  
 | 
# ±¾ÖÜÈÎÎñÒÑ»ñµÃ×ʽðÊýÁ¿  
 | 
def GetCurWeekMissionMoney(curFamily): return curFamily.GetExtra2()  
 | 
def SetCurWeekMissionMoney(curFamily, value): return curFamily.SetExtra2(min(value, ChConfig.Def_UpperLimit_DWord))  
 | 
  
 | 
# ÏÉÃËÉϴδ¦ÀíµÄºÏ·þÌì  
 | 
def GetFamilyMixServerDay(curFamily): return curFamily.GetExtra1()  
 | 
def SetFamilyMixServerDay(curFamily, value): return curFamily.SetExtra1(value)  
 | 
## ------------------ ³ÉÔ± ----------------------  
 | 
def GetMemberFightPower(curMember): return curMember.GetExattr3()  
 | 
def SetMemberFightPower(curMember, fightPower): return curMember.SetExattr3(fightPower)  
 | 
  
 | 
def GetMemberJoinTime(curMember): return curMember.GetExattr4()  
 | 
def SetMemberJoinTime(curMember, joinTime): return curMember.SetExattr4(joinTime)  
 | 
#----------------------------------------------------------------------  
 | 
  
 | 
def RandomFakeFamily():  
 | 
    '''Ëæ»ú3¸ö¼ÙÏÉÃË'''  
 | 
    fakeFamilyNameList = IpyGameDataPY.GetFuncEvalCfg('FakeFamilyName')  
 | 
    randomList = range(1, len(fakeFamilyNameList) + 1)  
 | 
      
 | 
    randomCnt = IpyGameDataPY.GetFuncCfg('FakeFamilyName', 2)  
 | 
    familyManager = GameWorld.GetFamilyManager()  
 | 
    lackFakeCnt = max(0, randomCnt - familyManager.GetCount()) #»¹Ðè¼ÙÏÉÃ˸öÊý  
 | 
      
 | 
    fakeIDList = []  
 | 
    curfakeCnt = 0  
 | 
    for i in xrange(randomCnt):  
 | 
        fakeIndex = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FakeFamilyIndex % i)  
 | 
        fakeIDList.append(fakeIndex)  
 | 
        if fakeIndex:  
 | 
            curfakeCnt += 1  
 | 
      
 | 
    lackCnt = lackFakeCnt - curfakeCnt #ÐèÒªËæ»ú¸öÊý  
 | 
    if lackCnt > 0:  
 | 
        randomList = list(set(randomList) - set(fakeIDList))  
 | 
        random.shuffle(randomList)  
 | 
        for value in randomList:  
 | 
            familyName = fakeFamilyNameList[value - 1]  
 | 
            familyName = GameWorld.GbkToCode(familyName)  
 | 
            findFamily = GameWorld.GetFamilyManager().FindFamilyByName(familyName)  
 | 
            if findFamily:  
 | 
                continue  
 | 
            if 0 not in fakeIDList:  
 | 
                return []  
 | 
            changeIndex = fakeIDList.index(0)  
 | 
            PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FakeFamilyIndex % changeIndex, value)  
 | 
            GameWorld.DebugLog('    Ëæ»ú¼ÙÏÉÃË  changeIndex=%s,value=%s'%(changeIndex, value))  
 | 
            fakeIDList[changeIndex] = value  
 | 
            lackCnt -= 1  
 | 
            if not lackCnt:  
 | 
                break  
 | 
    elif lackCnt < 0:  
 | 
        #GameWorld.DebugLog('    Ëæ»ú¼ÙÏÉÃËÒì³£ ÒÑ´æÔÚµÄËæ»úÊý´óÓÚ»¹ÐèÒªµÄËæ»ú¸öÊýlackFakeCnt=%s,fakeIDList=%s'%(lackFakeCnt, fakeIDList))  
 | 
        return []  
 | 
    return fakeIDList  
 | 
  
 | 
def SyncFakeFamilyInfo(curPlayer=None):  
 | 
    '''֪ͨ¼ÙÏÉÃËÐÅÏ¢'''  
 | 
    fakeIDList = RandomFakeFamily()  
 | 
    fakeIDList = list(set(fakeIDList)-set([0])) #È¥µô0  
 | 
    fakeFamilyPack = ChPyNetSendPack.tagGCFakeFamilyInfo()  
 | 
    fakeFamilyPack.Clear()  
 | 
    fakeFamilyPack.Count = len(fakeIDList)  
 | 
    fakeFamilyPack.FakeIDList = fakeIDList  
 | 
      
 | 
    if not curPlayer:  
 | 
        # È«·þ¹ã²¥ÔÚÏßÍæ¼Ò  
 | 
        playerManager = GameWorld.GetPlayerManager()  
 | 
        for i in range(0, playerManager.GetPlayerCount()):  
 | 
            curPlayer = playerManager.GetPlayerByIndex(i)  
 | 
            if curPlayer == None or not curPlayer.GetInitOK():  
 | 
                continue  
 | 
              
 | 
            if PlayerControl.GetIsTJG(curPlayer):  
 | 
                continue  
 | 
            NetPackCommon.SendFakePack(curPlayer, fakeFamilyPack)  
 | 
    else:  
 | 
        if PlayerControl.GetIsTJG(curPlayer):  
 | 
            return  
 | 
        NetPackCommon.SendFakePack(curPlayer, fakeFamilyPack)  
 | 
    return  
 | 
  
 | 
def SyncCreatFamilyTimes(curPlayer=None):  
 | 
    # Í¨Öª½¨ÃË´ÎÊý  
 | 
    packData = ChPyNetSendPack.tagGCServerCreatFamilyTimes()  
 | 
    packData.Clear()  
 | 
    packData.Times = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerCreatFamilyTimes)  
 | 
    if not curPlayer:  
 | 
        # È«·þ¹ã²¥ÔÚÏßÍæ¼Ò  
 | 
        playerManager = GameWorld.GetPlayerManager()  
 | 
        for i in range(0, playerManager.GetPlayerCount()):  
 | 
            curPlayer = playerManager.GetPlayerByIndex(i)  
 | 
            if curPlayer == None or not curPlayer.GetInitOK():  
 | 
                continue  
 | 
              
 | 
            if PlayerControl.GetIsTJG(curPlayer):  
 | 
                continue  
 | 
            NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
    else:  
 | 
        if PlayerControl.GetIsTJG(curPlayer):  
 | 
            return  
 | 
        NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
    return  
 | 
  
 | 
#ÊäÈë¼Ò×åÃû³Æ  
 | 
#class   IPY_CInputFamilyName  
 | 
#{  
 | 
#public:  
 | 
#  
 | 
#    char *      GetName();  
 | 
#};  
 | 
## ´´½¨¼Ò×å  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param familyName ¼Ò×åÃû³Æ  
 | 
#  @param fakeIndex ¼ÙÏÉÃËË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def DoCreateFamily(curPlayer, familyName, fakeIndex, tick):  
 | 
    #---ÑéÖ¤Íæ¼ÒÊôÐÔ---  
 | 
    curPlayerID = curPlayer.GetPlayerID()  
 | 
  
 | 
    #¿Í»§¶Ë·¢ËÍ·â°ü, ´´½¨¼Ò×å, ½áÊøÊ¼þ, ÒòMapserver½áÊøÊ¼þ°ü³£³£Ïȵ½, µ¼ÖÂÕâÀï¾³£±»À¹½Ø  
 | 
    #·ÀÖ¹Íâ¹Ò·¢°ü Mapserverµ÷ÓýӿÚÉèÖÃGameServer_SetPlayerViewFamilyState  
 | 
#    if curPlayer.GetViewFamilyState() != ShareDefine.TViewFamilyType_CreateFamily:  
 | 
#        GameWorld.ErrLog("DoCreateFamily GetViewFamilyState = %s, err"%(curPlayer.GetViewFamilyState()), curPlayerID)  
 | 
#        return  
 | 
  
 | 
#    if GameWorld.GetPlayerManager().GetForbiddenEnterFamily(curPlayerID):  
 | 
#        #Founding_Family_Fail ¶Ô²»Æð, À뿪¼Ò×åºóµ±ÈÕÎÞ·¨²»ÄÜ´´½¨¼Ò×å ,²Ù×÷ÎÞЧ!  
 | 
#        PlayerControl.NotifyCode(curPlayer, "Founding_Family_Fail")  
 | 
#        return  
 | 
  
 | 
    if curPlayer.GetFamily() != None:  
 | 
        #Íæ¼ÒÒѾÓмÒ×å, ´´½¨Ê§°Ü  
 | 
        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_85890")  
 | 
        return  
 | 
  
 | 
    if curPlayer.GetFamilyID() != 0:  
 | 
        #·ÀÖ¹Êý¾Ý´íÎó, Ôö¼ÓÒ»²ãÅж¨  
 | 
        #Íæ¼ÒÒѾÓмÒ×å, ´´½¨Ê§°Ü  
 | 
        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_85890")  
 | 
        return  
 | 
    #¿Í»§¶ËÅжϵȼ¶¼´¿É  
 | 
  
 | 
#    if curPlayer.GetLV() < createFamily_MinLV:  
 | 
#        #GeRen_hwj35_717982 <n color="255,255,0" BKCOLOR="0,0,0">¶Ô²»Æð,ÄãµÄµÈ¼¶²»×ã</n><n color="0,190,255"> {%S1%}</n><n color="255,255,0" BKCOLOR="0,0,0">¼¶,ÎÞ·¨´´½¨°ï»á!</n>  
 | 
#        PlayerControl.NotifyCode(curPlayer, "GeRen_hwj35_717982", [createFamily_MinLV])  
 | 
#        return  
 | 
  
 | 
    #---ÑéÖ¤´´½¨µÄ¼Ò×åÐÅÏ¢ÊÇ·ñÕýÈ·---  
 | 
  
 | 
    #C++¹ýÂ˿ոñ  
 | 
    familyName = GameWorld.GetGameWorld().GetCharTrim(familyName)  
 | 
      
 | 
    fullFamilyName = GetFamilyFullName(curPlayer, familyName)  
 | 
    if not fullFamilyName:  
 | 
        return  
 | 
  
 | 
    if not CheckFamilName(curPlayer, familyName, fullFamilyName):  
 | 
        return  
 | 
      
 | 
    familyManager = GameWorld.GetFamilyManager()  
 | 
    curCnt = familyManager.GetCount()  
 | 
    if curCnt >= familyManager.GetFamilyUpperLimitCount():  
 | 
        #¶Ô²»Æð,Ŀǰ·þÎñÆ÷¼Ò×åÊýÁ¿ÒÑÂú,´´½¨¼Ò×åʧ°Ü  
 | 
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_Family_Full")  
 | 
        return  
 | 
    fakeIndexList = RandomFakeFamily()  
 | 
    #´´½¨¼Ò×åÂß¼  
 | 
    curFamily = familyManager.AddFamily(fullFamilyName)  
 | 
  
 | 
    if curFamily == None:  
 | 
        GameWorld.ErrLog("¼Ò×å´´½¨ÊýÄ¿ÒÑÂú, ´´½¨¼Ò×åʧ°Ü", curPlayerID)  
 | 
        return  
 | 
    GameWorld.Log("´´½¨ÏÉÃË: familyID=%s,playerID=%s" % (curFamily.GetID(), curPlayerID))  
 | 
    #---´´½¨¼Ò×å---  
 | 
    curFamily.SetCreateTime(GameWorld.GetCurrentDataTimeStr())  
 | 
    curFamily.SetLV(1)  
 | 
    curFamily.SetAcceptJoin(ShareDefine.FamilyAcceptJoin_Agree)     #ÉèÖÃÊÕÈË·½Ê½ÎªÖ±½Óͨ¹ýÉêÇë  
 | 
    PyDataManager.GetFamilyStoreItemManager().DelFamilyStoreItemAll(curFamily.GetID())  
 | 
      
 | 
    #д´½¨µÄÏÉÃËĬÈÏÉèÖÃÒÑ´¦Àí¹ýºÏ·þ  
 | 
    SetFamilyMixServerDay(curFamily, PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_LastMixServerDay))  
 | 
      
 | 
    #-ÉèÖüÒ×å³ÉÔ±ÊôÐÔ  
 | 
    DoPlayerJionFamily(curFamily, curPlayer, IPY_GameServer.fmlLeader)  
 | 
    creatFamilyTimes = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerCreatFamilyTimes)  
 | 
    #¿ÛµÀ¾ß(ǰN¸öÕ½Ã˲¢ÇÒ¼Ù±àºÅÔÚËæ»ú±àºÅÀﲻҪǮ)  
 | 
    if fakeIndex and fakeIndex in fakeIndexList:  
 | 
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FakeFamilyIndex % fakeIndexList.index(fakeIndex), 0)  
 | 
        GameWorld.Log('    ´´½¨Ç°n¸ö¼ÙÏÉÃ˲»¿ÛÇ®! ¼ÙÏÉÃËË÷Òý%s'%fakeIndexList.index(fakeIndex))  
 | 
    elif creatFamilyTimes < IpyGameDataPY.GetFuncCfg('CreateFamilyNeedMoney', 3):  
 | 
        GameWorld.Log('    ´´½¨Ç°n¸öÏÉÃ˲»¿ÛÇ®! creatFamilyTimes=%s' % creatFamilyTimes)  
 | 
    else:  
 | 
        for i, findex in enumerate(fakeIndexList):  
 | 
            if findex:  
 | 
                PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FakeFamilyIndex % i, 0)  
 | 
                break  
 | 
              
 | 
        needMoney = IpyGameDataPY.GetFuncCfg('CreateFamilyNeedMoney')  
 | 
        if needMoney:  
 | 
            moneyType = IpyGameDataPY.GetFuncCfg('CreateFamilyNeedMoney', 2)  
 | 
            sendMsg = str([moneyType, needMoney])  
 | 
            curPlayer.MapServer_QueryPlayerResult(0, 0, "CreateFamilyPayMoney", sendMsg, len(sendMsg))  
 | 
            #curPlayer.MapServer_PayMoney(moneyType, needMoney)  
 | 
            #Íæ¼Ò´´½¨¼Ò×å·ÑÓÃת»¯Îª¼Ò×å³õʼ×ʽð  
 | 
            #PlayerAddFamilyMoney(curPlayer, curFamily, needMoney)  
 | 
    
 | 
    SyncFakeFamilyInfo()      
 | 
      
 | 
    #¿ª·þǰ¼¸Ìì´´½¨Ôò¸ø³ÆºÅ  
 | 
#    needOpenServerDay, dienstgradID = ReadChConfig.GetEvalChConfig("FamilyCreateAddTitle")  
 | 
#    openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay)  
 | 
#    if openServerDay < needOpenServerDay:  
 | 
#        result = str(dienstgradID)  
 | 
#        curPlayer.MapServer_QueryPlayerResult(0, 0, "AddDienstgrad", result, len(result))  
 | 
      
 | 
#===============================================================================  
 | 
#    ´ËÂß¼·ÅÈëDoPlayerJionFamilyº¯Êý  
 | 
#    #Ë͸øÍæ¼Ò¼Ò×åÐÅÏ¢  
 | 
#    curPlayer.SetPlayerGetFamilyInfoTick(tick)  
 | 
#    curPlayer.Sync_FamilyInfo()  
 | 
#===============================================================================  
 | 
    #---´´½¨¼Ò×åÍê±Ï---  
 | 
    #ÖØÐÂÅÅÐò¼Ò×å  
 | 
    #GameWorld.GetFamilyManager().SortByLV()  
 | 
    DoFamilySort() # ´´ÃËÊ±Ç¿ÖÆ¸üÐÂÒ»´ÎÕ½Á¦  
 | 
      
 | 
    #XW_JZ_EstablishSud <n color="255,255,0">¹§Ï²Äú£¬¼Ò×彨Á¢³É¹¦!</n>    25  -   -  
 | 
    PlayerControl.NotifyCode(curPlayer, "XW_JZ_EstablishSud")  
 | 
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerCreatFamilyTimes, min(creatFamilyTimes + 1, ShareDefine.Def_UpperLimit_DWord))  
 | 
    SyncCreatFamilyTimes()  
 | 
    #°ï»á´´½¨Á÷Ïò  
 | 
    DataRecordPack.DR_CreateFamily(curPlayer.GetAccID(), curPlayerID, curPlayer.GetName(),  
 | 
                                   fullFamilyName, curFamily.GetID(), creatFamilyTimes+1)  
 | 
  
 | 
    GameWorld.Log('´´½¨¼Ò×å : %s(%s), fakeIndex=%s, creatFamilyTimes=%s' % (fullFamilyName, curFamily.GetID(), fakeIndex, creatFamilyTimes+1), curPlayerID)  
 | 
    PlayerControl.WorldNotify(0, "jiazu_liubo_671654", [curPlayer.GetName(), fullFamilyName, curFamily.GetID()])  
 | 
    return  
 | 
  
 | 
## »ñÈ¡¼Ò×åÈ«Ãû  
 | 
def GetFamilyFullName(curPlayer, familyName):  
 | 
    serverID = GameWorld.GetPlayerServerID(curPlayer)  
 | 
    roleNameFormat = eval(ReadChConfig.GetChConfig("FamilyNameFormat"))  
 | 
    nameFormat, paramList, maxLen, maxServerID, specServerDict = roleNameFormat  
 | 
    if serverID > maxServerID or serverID <= 0:  
 | 
        GameWorld.ErrLog("GetFamilyFullName serverID=%s error! maxServerID=%s, check FamilyNameFormat.txt" % (serverID, maxServerID))  
 | 
        return ""  
 | 
      
 | 
    nameFormatInfo = GameWorld.GetDictValueByRangeKey(specServerDict, serverID)  
 | 
    if nameFormatInfo:  
 | 
        nameFormat, paramList = nameFormatInfo  
 | 
          
 | 
    fullName = nameFormat % tuple(paramList)  
 | 
    if len(fullName) > maxLen:  
 | 
        GameWorld.ErrLog("GetFamilyFullName familyName=%s,È«Ãû=%s len=%s > %s, check FamilyNameFormat.txt" % (familyName, fullName, len(fullName), maxLen))  
 | 
        PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_980181", [maxLen / 2, maxLen])  
 | 
        return ""  
 | 
      
 | 
    return fullName  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##Íæ¼Ò¼ÓÈë¼Ò×å.  
 | 
# @param curFamily ¼Ò×åʵÀý  
 | 
# @param jionPlayer Íæ¼ÒʵÀý  
 | 
# @param jionFamilySetLv Íæ¼ÒÒÔʲôµÈ¼¶¼ÓÈë¼Ò×å  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks Íæ¼Ò¼ÓÈë¼Ò×å  
 | 
def DoPlayerJionFamily(curFamily, jionPlayer, jionFamilySetLv):  
 | 
    #¼ÓÈë¼Ò×å  
 | 
    familyMember = curFamily.AddMember(jionPlayer)  
 | 
    #ˢлù±¾ÐÅÏ¢  
 | 
    RefreshFamilyMemberBaseMsg(familyMember, jionPlayer)  
 | 
      
 | 
    #×峤ÉèÖà  
 | 
    if jionFamilySetLv == IPY_GameServer.fmlLeader:  
 | 
        curFamily.SetLeaderID(familyMember.GetPlayerID())  
 | 
        curFamily.SetLeaderName(familyMember.GetName())  
 | 
        curFamily.SetLeaderOfficialRank(familyMember.GetOfficialRank())  
 | 
    SetMemberJoinTime(familyMember, int(time.time()))  
 | 
    #ÉèÖüÒ×åµÈ¼¶¶ÔÓ¦µÄȨÏÞ  
 | 
    ChangeFamilyMemberLv(familyMember, jionFamilySetLv, True)  
 | 
      
 | 
    #ÉèÖüÒ×åIDºÍÖ¸Õë  
 | 
    jionPlayer.SetFamilyID(curFamily.GetID())  
 | 
    jionPlayer.SetFamily(curFamily)  
 | 
    #֪ͨµØÍ¼·þÎñÆ÷  
 | 
    jionPlayer.MapServer_FamilyRefresh()  
 | 
    #֪ͨ¼Ò×åÐÅÏ¢  
 | 
    #Èç¹û²»¸æËß, ¿Í»§¶ËµÃ²»µ½¼Ò×åË¢ÐÂ, µ¼Ö²»´ò¿ª¼Ò×å½çÃæµÄʱºò, ²»ÄÜÖ±½Óµã»÷Í·ÏñÕÐÈË  
 | 
    if GetFamilyMemberHasPow(familyMember, ChConfig.Def_PurviewDictKey_CanCall):  
 | 
        jionPlayer.Sync_FamilyInfo()  
 | 
        PlayerFamilyAction.ViewFamilyRequestInfo(jionPlayer)  
 | 
  
 | 
    #֪ͨ¿Í»§¶Ë¼Ò×å¿Æ¼¼ÐÅÏ¢  
 | 
    #jionPlayer.Sync_FamilyTechInfo()  
 | 
  
 | 
    # Í¨ÖªËùÓмÒ×å³ÉÔ±µ¯ÛÀÐÅÏ¢  
 | 
    #SendClientImpeachMag(jionPlayer, curFamily)  
 | 
      
 | 
    # Íæ¼ÒÕ½ÃËÃû±ä¸ü´¦Àí  
 | 
    __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)  
 | 
    #֪ͨսÃ˺ì°üÐÅÏ¢  
 | 
    PlayerFamilyRedPacket.NotifyRedPacketInfo(jionPlayer)  
 | 
      
 | 
    #֪ͨսÃËBOSS¿ªÆôÐÅÏ¢  
 | 
    PlayerFamilyBoss.NotifyFamilyBossFBInfo(jionPlayer)  
 | 
    #֪ͨ¼Ò×å²Ö¿â  
 | 
    PyDataManager.GetFamilyStoreItemManager().SyncFamilyStoreItem(jionPlayer, curFamily.GetID())  
 | 
    #ÏÉÃËÅÄÆ·  
 | 
    AuctionHouse.Sync_FamilyAuctionItemInfo(jionPlayer, curFamily.GetID())  
 | 
    SetMemberFightPower(familyMember, jionPlayer.GetFightPower())  
 | 
    AddFamilyIDToFightPowerChangeList(curFamily.GetID())  
 | 
      
 | 
    #֪ͨÏÉÃËÊ¢ÑçÌâÄ¿  
 | 
    PlayerFamilyParty.NotifyFamilyPartyQuestion(jionPlayer)  
 | 
    #Í¨ÖªÊØÎÀÈË»ÊÐÅÏ¢  
 | 
    PlayerFamilySWRH.NotifySWRHInfo(jionPlayer, curFamily.GetID())  
 | 
    #֪ͨÏÉÃËÐÖúÐÅÏ¢  
 | 
    PlayerAssist.SyncFamilyAssist(jionPlayer)  
 | 
    #oss¼Ç¼¼ÓÈë¼Ò×åÐÅÏ¢  
 | 
    DataRecordPack.DR_PlayerJoinFamily(jionPlayer, curFamily.GetID(), curFamily.GetName(), curFamily.GetCount())  
 | 
    return  
 | 
  
 | 
##  Íæ¼ÒÕ½ÃËÃû±ä¸ü´¦Àí  
 | 
def __OnFamilyNameChange(playerID, familyName):  
 | 
    GameWorld.DebugLog('    Íæ¼ÒÕ½ÃËÃû±ä¸ü´¦Àí, newFamilyName=%s' % familyName, playerID)  
 | 
    #²»´¦ÀíÅÅÐаñ  
 | 
    needChangeFamilyBillboardList = [  
 | 
                                     ]  
 | 
    billboardMgr = GameWorld.GetBillboard()  
 | 
    for billboardIndex in needChangeFamilyBillboardList:  
 | 
        billBoard = billboardMgr.FindBillboard(billboardIndex)  
 | 
        if not billBoard:  
 | 
            GameWorld.DebugLog('    Íæ¼ÒÕ½ÃËÃû±ä¸ü´¦Àí ÕÒ²»µ½ÕâÀàÐÍÅÅÐаñ billboardIndex=%s' % billboardIndex)  
 | 
            #ÕÒ²»µ½ÕâÀàÐÍÅÅÐаñ  
 | 
            continue  
 | 
        playerBillBoardData = billBoard.FindByID(playerID)  
 | 
        if not playerBillBoardData:  
 | 
            GameWorld.DebugLog('    Íæ¼ÒÕ½ÃËÃû±ä¸ü´¦Àí ¸ÃÍæ¼ÒûÓÐÔÚÅÅÐаñÉÏ ', playerID)  
 | 
            #¸ÃÍæ¼ÒûÓÐÔÚÅÅÐаñÉÏ  
 | 
            continue  
 | 
        #¸üÐÂÍæ¼ÒÕ½ÃËÃû×Ö  
 | 
        playerBillBoardData.SetName2(familyName)  
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##Íæ¼Ò¾èÔù¼Ò×å½ðÇ®  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param curFamily ¼Ò×åʵÀý  
 | 
# @param playeMoney Íæ¼Ò½ðÇ®  
 | 
# @return ²¼¶ûÖµ  
 | 
# @remarks Íæ¼Ò¾èÔù¼Ò×å½ðÇ®  
 | 
def PlayerAddFamilyMoney(curPlayer, curFamily, playerMoney):  
 | 
    curFamilyMoney = curFamily.GetMoney()  
 | 
    #×ʽðÒÑ´ïÉÏÏÞ  
 | 
    if curFamilyMoney >= ChConfig.Def_UpperLimit_DWord:  
 | 
        return False  
 | 
      
 | 
    curFamily.SetMoney(min(curFamilyMoney + GetPlayerMoney_Change_FamilyMoney(playerMoney),  
 | 
                               ChConfig.Def_UpperLimit_DWord))  
 | 
    #Õ½ÃËÉý¼¶  
 | 
    #DoFamilyLvUp(curFamily)  
 | 
    return True  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##Íæ¼Ò½ðǮת»»Îª¼Ò×å½ðÇ®  
 | 
# @param playerMoney Íæ¼Ò½ðÇ®  
 | 
# @return ¼Ò×å½ðÇ®  
 | 
# @remarks Íæ¼Ò½ðǮת»»Îª¼Ò×å½ðÇ®  
 | 
def GetPlayerMoney_Change_FamilyMoney(playerMoney):  
 | 
    return int(playerMoney * ShareDefine.Def_PlayerMoney_Change_FamilyMoney_Rate)  
 | 
#---------------------------------------------------------------------  
 | 
## ¼ì²â¼Ò×åÃû³Æ  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param familyName ¼Ò×åÃû³Æ  
 | 
#  @return None or True  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckFamilName(curPlayer, familyName, fullFamilyName):  
 | 
    #δͨ¹ýÔà»°ÁбíÅж¨  
 | 
    if DirtyList.IsWordForbidden(familyName):  
 | 
        #XW_JZ_Family_NameNoLegality ¶Ô²»Æð,¼Ò×åÃû³ÆÖк¬ÓзǷ¨×Ö·û,´´½¨¼Ò×åʧ°Ü  
 | 
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_Family_NameNoLegality")  
 | 
        return  
 | 
      
 | 
    if len(familyName) <= 0 or len(familyName) > ChConfig.Def_CreatFamily_MaxStr:  
 | 
        PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_980181", [ChConfig.Def_CreatFamily_MaxStr / 2, ChConfig.Def_CreatFamily_MaxStr])  
 | 
        return  
 | 
      
 | 
    #------------²é¿´ÊÇ·ñÓÐͬÃûµÄ¼Ò×å  
 | 
    findFamily = GameWorld.GetFamilyManager().FindFamilyByName(fullFamilyName)  
 | 
      
 | 
    if findFamily != None :  
 | 
          
 | 
        if findFamily.GetID() == curPlayer.GetFamilyID():  
 | 
            #ÔÊÐíÐ޸ijÉ×Ô¼º¼Ò×åÔÀ´µÄÃû×Ö  
 | 
            return True  
 | 
          
 | 
        else:  
 | 
            #XW_JZ_EstablishErr_Name    <n color="255,255,0">¶Ô²»Æð£¬ÄúÊäÈëµÄ¼Ò×åÃûÒÑ´æÔÚ£¬½¨Á¢¼Ò×åʧ°Ü£¡</n> 25  -   -  
 | 
            PlayerControl.NotifyCode(curPlayer, "XW_JZ_EstablishErr_Name")  
 | 
            return  
 | 
      
 | 
    return True  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## ÊäÈë¼Ò×åÃû³Æ£¨´´½¨¼Ò×壩  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.        
 | 
def InputFamilyName(index, tick):  
 | 
    #GameWorld.GetPsycoFunc(__Func_InputFamilyName)(index, tick)  
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## ÊäÈë¼Ò×åÃû³Æ£¨´´½¨¼Ò×壩  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __Func_InputFamilyName(index, tick):  
 | 
    return  
 | 
  
 | 
#// A4 04 ´´½¨¼Ò×å #tagCGPyCreatFamily  
 | 
#  
 | 
#struct    tagCGPyCreatFamily  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    char        Name[33];  
 | 
#    WORD        FakeID;  
 | 
#};  
 | 
## ²é¿´ÉêÇë°ï»áµÄ³ÉÔ±ÐÅÏ¢  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param clientData ·â°üÊý¾Ý½á¹¹Ìå  
 | 
#  @param tick Ê±¼ä´Á  
 | 
#  @return None  
 | 
def PyCreatFamily(index, clientPack, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    inputName = clientPack.Name  
 | 
    fakeIndex = clientPack.FakeID  
 | 
    #Ö´Ðд´½¨¼Ò×åÂß¼  
 | 
    DoCreateFamily(curPlayer, inputName, fakeIndex, tick)  
 | 
    #ÖØÖò鿴¼Ò×å״̬(½ö´´½¨¼Ò×åʱºòÖØÖÃ, ÆäÓà״̬ÓÉMapServerÍ˳öʼþÊ±ÖØÖÃ)  
 | 
    __ClearViewFamilyState(curPlayer)  
 | 
    #Íæ¼ÒÀ뿪ʼþ  
 | 
    curPlayer.MapServer_LeaveEvent()  
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##ÖØÖüÒ×å²é¿´×´Ì¬.  
 | 
# @param curPlayer ÊµÀý  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks ÖØÖüÒ×å²é¿´×´Ì¬.  
 | 
def __ClearViewFamilyState(curPlayer):  
 | 
    curPlayer.SetViewFamilyState(ShareDefine.TViewFamilyType_None)  
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
#class   IPY_CCheckFamilyNameExist  
 | 
#{  
 | 
#public:  
 | 
#  
 | 
#    char *      GetName();  
 | 
#};  
 | 
## ¼ì²é¼Ò×åÊÇ·ñ´æÔÚ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckFamilyNameExist(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
      
 | 
#    if curPlayer.GetViewFamilyState() != ShareDefine.TViewFamilyType_CreateFamily:  
 | 
#        GameWorld.ErrLog("CheckFamilyNameExist : viewState = %s"%(curPlayer.GetViewFamilyState()), curPlayer.GetPlayerID())  
 | 
#        return  
 | 
      
 | 
    pack = IPY_GameServer.IPY_CCheckFamilyNameExist()  
 | 
    familyName = GameWorld.GetGameWorld().GetCharTrim(pack.GetName())  
 | 
      
 | 
    curFamily = GameWorld.GetFamilyManager().FindFamilyByName(familyName)  
 | 
      
 | 
    if curFamily != None:  
 | 
        #XW_JZ_Query_Being  <n color="255,255,0">ÄúÊäÈëµÄ¼Ò×åÃûÒÑ´æÔÚ,²»¿ÉÒÔʹÓã¡</n>  25  -   -  
 | 
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_Query_Being")  
 | 
        return  
 | 
      
 | 
    #XW_JZ_Query_NoBeing    <n color="255,255,0">ÄúÊäÈëµÄ¼Ò×åÃû²»´æÔÚ,¿ÉÒÔʹÓã¡</n>   25  -   -  
 | 
    PlayerControl.NotifyCode(curPlayer, "XW_JZ_Query_NoBeing")     
 | 
    return  
 | 
  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##֪ͨ¿Í»§¶Ë·þÎñÆ÷¼Ò×åÐÅÏ¢.  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param viewPage ²é¿´Ò³  
 | 
# @param pageCnt Ã¿Ò³ÊýÁ¿  
 | 
# @param sortRule ÅÅÐò¹æÔò(°´ÈÙÓþ, ¼Ò×åµÈ¼¶µÈ)  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks Í¨Öª¿Í»§¶Ë·þÎñÆ÷¼Ò×åÐÅÏ¢  
 | 
def Sync_AllFamilyInfo(curPlayer, viewPage, pageCnt=ChConfig.Def_ViewAllFamilyPageCount, sortRule=IPY_GameServer.fsrHornor):  
 | 
    #familyCount = GameWorld.GetFamilyManager().GetCount()  
 | 
    familyCount = len(PyGameData.g_sortFamilyIDList)  
 | 
    allPageCnt = GameWorld.GetIntUpper(familyCount, pageCnt)  
 | 
  
 | 
    if allPageCnt != 0 and (viewPage < 0 or viewPage >= allPageCnt):  
 | 
        GameWorld.Log("¿Í»§¶Ë²é¿´¼Ò×åÒ³·â°ü´íÎó,ÎÞ´ËÒ³ viewPage = %s, allPageCnt = %s" % (viewPage, allPageCnt), curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    startIndex, endIndex = GameWorld.GetViewPageBeginIndexAndEndIndex(viewPage, pageCnt, familyCount)  
 | 
      
 | 
    # ÅÅÐò¹æÔò±ä¸ü£¬Ê¹ÓÃpy×Ô¶¨Òå°ü֪ͨ  
 | 
    Sync_PyAllFamilyInfo(curPlayer, allPageCnt, viewPage, startIndex, endIndex)  
 | 
      
 | 
    #===============================================================================================  
 | 
    # #ÉèÖüÒ×åÐÅÏ¢ÅÅÐò¹æÔò  
 | 
    # GameWorld.GetFamilyManager().SortBySortRule(sortRule)  
 | 
    #   
 | 
    # #֪ͨ¼Ò×åÐÅÏ¢  
 | 
    # curPlayer.Sync_AllFamilyInfo(allPageCnt, viewPage, startIndex, endIndex, sortRule)  
 | 
    #===============================================================================================  
 | 
    return  
 | 
  
 | 
def SendFamilyFakePack(familyID, clientPack, excludePlayerIDList=[]):  
 | 
    ## ¹ã²¥¼Ò×å³ÉÔ±PY·â°ü  
 | 
    family = GameWorld.GetFamilyManager().FindFamily(familyID)  
 | 
    if not family:  
 | 
        return  
 | 
      
 | 
    for index in xrange(family.GetCount()):  
 | 
        member = family.GetAt(index)  
 | 
        memPlayer = member.GetPlayer()  
 | 
        if not memPlayer:  
 | 
            continue  
 | 
        if excludePlayerIDList and memPlayer.GetPlayerID() in excludePlayerIDList:  
 | 
            continue  
 | 
        NetPackCommon.SendFakePack(memPlayer, clientPack)  
 | 
    return  
 | 
  
 | 
def Sync_PyAllFamilyInfo(curPlayer, allPageCnt, viewPage, startIndex, endIndex):  
 | 
    familyCount = len(PyGameData.g_sortFamilyIDList)  
 | 
    if startIndex < 0 or endIndex >= familyCount:  
 | 
        return  
 | 
      
 | 
    familyMgr = GameWorld.GetFamilyManager()  
 | 
    familyViewPack = ChPyNetSendPack.tagGCPyAllFamilyView()  
 | 
    familyViewPack.Clear()  
 | 
    familyViewPack.TotalCount = allPageCnt  
 | 
    familyViewPack.CurPage = viewPage  
 | 
    familyViewPack.Family = []  
 | 
    for i in xrange(startIndex, endIndex + 1):  
 | 
        familyID = PyGameData.g_sortFamilyIDList[i]  
 | 
        family = familyMgr.FindFamily(familyID)  
 | 
        if not family:  
 | 
            continue  
 | 
        familyViewPack.Family.append(__GetFamilyView(i, family))  
 | 
    familyViewPack.PageCount = len(familyViewPack.Family)  
 | 
    NetPackCommon.SendFakePack(curPlayer, familyViewPack)  
 | 
    return  
 | 
  
 | 
def __GetFamilyView(index, family):  
 | 
    familyView = ChPyNetSendPack.tagGCPyFamilyView()  
 | 
    familyView.Clear()  
 | 
    familyView.FamilyIndex = index  
 | 
    familyView.FamilyID = family.GetID()  
 | 
    familyView.FamilyName = family.GetName()  
 | 
    familyView.FamilyNameLen = len(familyView.FamilyName)  
 | 
    familyView.LeaderID = family.GetLeaderID()  
 | 
    familyView.LeaderName = family.GetLeaderName()  
 | 
    familyView.LeaderNameLen = len(familyView.LeaderName)  
 | 
    familyView.LeaderOfficialRank = family.GetLeaderOfficialRank()  
 | 
    familyView.FamilyLV = family.GetLV()  
 | 
    familyView.FamilyMemberCount = family.GetCount()  
 | 
    familyView.JoinAccept = family.GetAcceptJoin()  
 | 
    familyView.WarRank = GetFamilyWarRank(family)  
 | 
    totalFightPower = GetFamilyTotalFightPower(family)  
 | 
    familyView.TotalFightPower = totalFightPower % ChConfig.Def_PerPointValue  
 | 
    familyView.TotalFightPowerEx = totalFightPower / ChConfig.Def_PerPointValue  
 | 
    return familyView  
 | 
  
 | 
## Íæ¼ÒÄ£ºý²éѯ¼Ò×壬0F 0D·â°ü  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä   
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def SearchFamily(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
  
 | 
    pack = IPY_GameServer.IPY_CSearchFamily()  
 | 
    msg = pack.GetMsg()  
 | 
      
 | 
    if not msg:  
 | 
        #ûÓвéѯÄÚÈÝ, ·µ»ØµÚÒ»Ò³  
 | 
        Sync_AllFamilyInfo(curPlayer, 0)  
 | 
        return  
 | 
      
 | 
    Sync_SearchFamily(curPlayer, msg)  
 | 
    #curPlayer.Sync_SearchFamily(msg)  
 | 
    return  
 | 
  
 | 
def Sync_SearchFamily(curPlayer, msg):  
 | 
    familyMgr = GameWorld.GetFamilyManager()  
 | 
    familyViewPack = ChPyNetSendPack.tagGCPyAllFamilyView()  
 | 
    familyViewPack.Clear()  
 | 
    familyViewPack.IsSearching = 1  
 | 
    familyViewPack.TotalCount = 1  
 | 
    #familyViewPack.CurPage = viewPage  
 | 
    familyViewPack.Family = []  
 | 
    for i, familyID in enumerate(PyGameData.g_sortFamilyIDList):  
 | 
        family = familyMgr.FindFamily(familyID)  
 | 
        if not family:  
 | 
            continue  
 | 
        if msg not in family.GetName():  
 | 
            continue  
 | 
        familyViewPack.Family.append(__GetFamilyView(i, family))  
 | 
    familyViewPack.PageCount = len(familyViewPack.Family)  
 | 
    NetPackCommon.SendFakePack(curPlayer, familyViewPack)  
 | 
    return  
 | 
  
 | 
#// A4 12 ËÑË÷¼Ò×å #tagCGPySearchFamily  
 | 
#  
 | 
#struct    tagCGPySearchFamily  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        MsgLen;        //Ä£ºýËÑË÷¼Ò×壬Èç¹ûÊäÈëΪ¿Õ£¬ÔòΪ²»ÏÞÖÆ¸ÃÌõ¼þ  
 | 
#    char        Msg[MsgLen];    //size = MsgLen  
 | 
#    BYTE        LV;        //×îµÍ¼Ò×åµÈ¼¶,Èç¹ûΪ0£¬Ôò²»ÏÞÖÆ¸ÃÌõ¼þ  
 | 
#    BYTE        MaxCount;    //ËÑË÷½á¹ûËùÐè×î´óÌõÊý£¬ºó¶ËÏÞÖÆ×î¶à·µ»Ø20Ìõ  
 | 
#    BYTE        IsSearching;    //ĬÈÏ1£¬Èç¹ûÓÐÖ¸¶¨ÆäËûÖµ£¬Ôò·µ»ØÖ¸¶¨Öµ  
 | 
#};  
 | 
def PySearchFamily(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
      
 | 
    msg = clientData.Msg  
 | 
    minFamilyLV = clientData.LV  
 | 
    maxCount = min(20, clientData.MaxCount)  
 | 
    IsSearching = clientData.IsSearching  
 | 
      
 | 
    familyMgr = GameWorld.GetFamilyManager()  
 | 
    familyViewPack = ChPyNetSendPack.tagGCPyAllFamilyView()  
 | 
    familyViewPack.Clear()  
 | 
    familyViewPack.IsSearching = IsSearching  
 | 
    familyViewPack.TotalCount = 1  
 | 
    #familyViewPack.CurPage = viewPage  
 | 
    familyViewPack.Family = []  
 | 
    for i, familyID in enumerate(PyGameData.g_sortFamilyIDList):  
 | 
        family = familyMgr.FindFamily(familyID)  
 | 
        if not family:  
 | 
            continue  
 | 
        if msg not in family.GetName():  
 | 
            continue  
 | 
        if minFamilyLV and family.GetLV() < minFamilyLV:  
 | 
            continue  
 | 
        familyViewPack.Family.append(__GetFamilyView(i, family))  
 | 
        if len(familyViewPack.Family) >= maxCount:  
 | 
            break  
 | 
    familyViewPack.PageCount = len(familyViewPack.Family)  
 | 
    NetPackCommon.SendFakePack(curPlayer, familyViewPack)  
 | 
    return  
 | 
  
 | 
#class   IPY_CFamilyChangeBroadcast  
 | 
#{  
 | 
#public:  
 | 
#  
 | 
#    char *      GetMsg();  
 | 
#};  
 | 
## ¸üй«¸æ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def UpdateBroadcast(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    curPlayerID = curPlayer.GetPlayerID()  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
    if curFamily == None:  
 | 
        GameWorld.Log("¸üй«¸æ -> ¿Í»§¶Ë·â°üÒì³£ ->Íæ¼ÒÎÞ¼Ò×å" , curPlayerID)  
 | 
        return  
 | 
      
 | 
    curMember = curFamily.FindMember(curPlayerID)  
 | 
    if curMember == None:  
 | 
        GameWorld.Log("¸üй«¸æ -> ¿Í»§¶Ë·â°üÒì³£ ->ÕÒµ½³ÉÔ±´íÎó" , curPlayerID)  
 | 
        return  
 | 
      
 | 
    if not GetFamilyMemberHasPow(curMember, ChConfig.Def_PurviewDictKey_CanBroadcast):  
 | 
        GameWorld.Log("¸üй«¸æ -> ¿Í»§¶Ë·â°üÒì³£ ->ÄãûÓÐȨÏÞ" , curPlayerID)  
 | 
        return  
 | 
      
 | 
    #ÅжϴÎÊý  
 | 
    curBroadcastCnt = GetFamilyBroadcastCnt(curFamily)  
 | 
    maxBroadcastCnt = IpyGameDataPY.GetFuncCfg('FamilyBroadcast')  
 | 
    if curBroadcastCnt >= maxBroadcastCnt:  
 | 
        #Ãâ·Ñ´ÎÊýÓÃÍê ÏûºÄÇ®  
 | 
        croadcastCostGold = IpyGameDataPY.GetFuncCfg('FamilyBroadcast', 2)  
 | 
        result = str(croadcastCostGold)  
 | 
        curPlayer.MapServer_QueryPlayerResult(0, 0, "FamilyBroadcastCost", result, len(result))  
 | 
          
 | 
    #¸üдÎÊý  
 | 
    SetFamilyBroadcastCnt(curFamily, curBroadcastCnt + 1)  
 | 
      
 | 
    pack = IPY_GameServer.IPY_CFamilyChangeBroadcast()  
 | 
    #¸ü¸Ä¼Ò×幫¸æ  
 | 
    curFamily.SetBroadcast(pack.GetMsg())  
 | 
    GameWorld.Log('¸ü¸ÄÏÉÃ˹«¸æ Family=%s,¹«¸æ=%s'%(GameWorld.CodeToGBK(curFamily.GetName()), GameWorld.CodeToGBK(pack.GetMsg())), curPlayerID)  
 | 
    #֪ͨ¿Í»§¶Ë¼Ò×åÐÅÏ¢¸Ä±ä  
 | 
    curFamily.Broadcast_FamilyChange()  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    for i in range(0, curFamily.GetCount()):  
 | 
        notifyMember = curFamily.GetAt(i)  
 | 
        notifyPlayer = playerManager.FindPlayerByID(notifyMember.GetPlayerID())  
 | 
          
 | 
        if notifyPlayer == None:  
 | 
            continue  
 | 
        if notifyPlayer.GetPlayerID() == curPlayer.GetPlayerID():  
 | 
            #²»°üÀ¨×Ô¼º  
 | 
            continue  
 | 
        curPlayer.ChatMi(notifyPlayer, 1, pack.GetMsg(), 0, PlayerTalk.GetTalkExtraValue(curPlayer))  
 | 
        PyDataManager.GetContactsManager().AddContactsBoth(curPlayer.GetID(), notifyPlayer.GetID())  
 | 
    return  
 | 
  
 | 
## ¼ì²âÄ¿±êÍæ¼ÒÊÇ·ñ¿ÉÒÔ¼ÓÈë¼Ò×å  
 | 
#  @param curPlayer ²Ù×÷ÈËÔ±  
 | 
#  @param tagPlayer ±»¼ÓÈëÈËÔ±  
 | 
#  @return ²¼¶ûÖµ  
 | 
#  @remarks ¼ì²âÄ¿±êÍæ¼ÒÊÇ·ñ¿ÉÒÔ¼ÓÈë¼Ò×å  
 | 
def __CheckCanAddFamilyMember(curPlayer, curFamily, tagPlayer):  
 | 
    curPlayerID = curPlayer.GetPlayerID()  
 | 
    #---¼ì²é¼Ò×åÊôÐÔ---  
 | 
    #¼Ò×åÊÇ·ñÂúÈË  
 | 
    maxMemberCnt = GetFamilySetting(curFamily, ChConfig.Def_FamilySetting_MaxMemberCnt)   
 | 
      
 | 
    if curFamily.GetCount() >= maxMemberCnt:  
 | 
        #jiazu_lhs_202580 ¶Ô²»Æð,°ï»áÈËÊýÒÑ´ïÉÏÏÞ,ÎÞ·¨ÕÐÊÕгÉÔ±!  
 | 
        PlayerControl.NotifyCode(curPlayer, "jiazu_lhs_202580")  
 | 
        return False  
 | 
      
 | 
    #---¼ì²éÍæ¼Ò¼Ò×åȨÏÞ---  
 | 
    curMember = curFamily.FindMember(curPlayerID)  
 | 
      
 | 
    if curMember == None:  
 | 
        GameWorld.ErrLog("Ìí¼Ó¼Ò×å³ÉÔ± - >ÕÒµ½³ÉÔ±´íÎó", curPlayerID)  
 | 
        return False  
 | 
      
 | 
    if not GetFamilyMemberHasPow(curMember, ChConfig.Def_PurviewDictKey_CanCall):  
 | 
        #XW_JZ_InviteErr_Popedom    <n color="255,255,0">¶Ô²»Æð£¬ÄúûÓÐÑûÇë¼Ò×åµÄȨÏÞ£¬ÑûÇë¼Ò×åʧ°Ü£¡</n> 25  -   -  
 | 
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Popedom")              
 | 
        return False  
 | 
      
 | 
    #Ä¿±êÒѾÊDZ¾¼Ò×å³ÉÔ±ÁË  
 | 
    tagMember = curFamily.FindMember(tagPlayer.GetID())  
 | 
      
 | 
    if tagMember != None:  
 | 
        #XW_JZ_InviteErr_Repeat <n color="255,255,0">¶Ô²»Æð£¬Ä¿±êÍæ¼ÒÒÑÓмÒ×壬ÑûÇë¼Ò×åʧ°Ü£¡</n>   25  -   -  
 | 
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Repeat")  
 | 
        return False  
 | 
      
 | 
    #---¼ì²éÄ¿±êÍæ¼ÒÊôÐÔ---  
 | 
    if tagPlayer.GetFamily() != None:  
 | 
        #XW_JZ_InviteErr_Repeat <n color="255,255,0">¶Ô²»Æð£¬Ä¿±êÍæ¼ÒÒÑÓмÒ×壬ÑûÇë¼Ò×åʧ°Ü£¡</n>   25  -   -  
 | 
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Repeat")  
 | 
        return False  
 | 
      
 | 
#    if GameWorld.GetPlayerManager().GetForbiddenEnterFamily(tagPlayer.GetPlayerID()):  
 | 
#        #Invite_Family_Fail ¶Ô²»Æð,Ä¿±êÍæ¼ÒÀ뿪¼Ò×å²»×ã1Ìì,²Ù×÷ÎÞЧ!  
 | 
#        PlayerControl.NotifyCode(curPlayer, "Invite_Family_Fail")  
 | 
#        return False  
 | 
      
 | 
    if tagPlayer.GetLV() < ChConfig.Def_Family_JionMinLV:  
 | 
        #XW_JZ_InviteErr_Lv <n color="255,255,0">Ä¿±êµÈ¼¶µÍÓÚ"S1"£¬ÑûÇë¼Ò×åʧ°Ü£¡</n> 25  -   -  
 | 
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Lv", [ChConfig.Def_Family_JionMinLV])  
 | 
        return False  
 | 
      
 | 
    if not GameWorld.IsSameCountry(curPlayer, tagPlayer):  
 | 
        #XW_JZ_InviteErr_Antagonize <n color="255,255,0">Ä¿±êΪµÐ¶Ô¹úÍæ¼Ò£¬ÑûÇë¼Ò×åʧ°Ü£¡</n>   25  -   -  
 | 
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Antagonize")  
 | 
        return False  
 | 
  
 | 
    return True  
 | 
#---------------------------------------------------------------------  
 | 
#===============================================================================  
 | 
# #//0F 05 ¼Ò×åÊÕÈË#tagCAddFamilyPlayer  
 | 
# #class   IPY_CAddFamilyPlayer  
 | 
# #{  
 | 
# #public:  
 | 
# #    //Íæ¼ÒÃû³Æ  
 | 
# #    char *      GetTagName();  
 | 
# #    //Íæ¼ÒID  
 | 
# #    int      GetTagID();  
 | 
# #};  
 | 
#===============================================================================  
 | 
## ÑûÇëÍæ¼Ò¼ÓÈë¼Ò×å  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick Ê±¼ä´Á  
 | 
#  @return None  
 | 
#  @remarks ÑûÇëÍæ¼Ò¼ÓÈë¼Ò×å //0F 05 ¼Ò×åÊÕÈË#tagCAddFamilyPlayer  
 | 
def AddFamilyPlayer(index, tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_AddFamilyPlayer)(index, tick)  
 | 
    return  
 | 
  
 | 
## ÑûÇëÍæ¼Ò¼ÓÈë¼Ò×å  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick Ê±¼ä´Á  
 | 
#  @return None  
 | 
#  @remarks ÑûÇëÍæ¼Ò¼ÓÈë¼Ò×å //0F 05 ¼Ò×åÊÕÈË#tagCAddFamilyPlayer  
 | 
def __Func_AddFamilyPlayer(index, tick):  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    curPlayer = playerManager.GetPlayerByIndex(index)  
 | 
    curPlayerID = curPlayer.GetID()  
 | 
    #---ÑéÖ¤Íæ¼ÒÊôÐÔ---  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
      
 | 
    if curFamily == None:  
 | 
        GameWorld.ErrLog('AddFamilyPlayer, Íæ¼ÒÎÞ¼Ò×å', curPlayerID)  
 | 
        return  
 | 
      
 | 
    #---»ñÈ¡·â°ü²ÎÊý---  
 | 
    pack = IPY_GameServer.IPY_CAddFamilyPlayer()  
 | 
    pack_FindPlayerID = pack.GetTagID()  
 | 
    pack_FindPlayerName = pack.GetTagName()  
 | 
      
 | 
    #---²éÕÒÑûÇë¼ÓÈë¼Ò×åµÄÍæ¼Ò---  
 | 
    findPlayer = None  
 | 
      
 | 
    if pack_FindPlayerID != 0:  
 | 
        findPlayer = playerManager.FindPlayerByID(pack_FindPlayerID)  
 | 
    else:  
 | 
        findPlayer = playerManager.FindPlayerByName(pack_FindPlayerName)  
 | 
      
 | 
    #---ÑéÖ¤ÑûÇë¼ÓÈë¼Ò×åµÄÍæ¼Ò---  
 | 
    if findPlayer == None:  
 | 
        #jiazu_hwj35_367906 ¶Ô²»Æð,ÄúÊäÈëµÄÍæ¼Ò²»ÔÚÏß,ÑûÇëʧ°Ü  
 | 
        PlayerControl.NotifyCode(curPlayer, "jiazu_hwj35_367906")  
 | 
        return  
 | 
      
 | 
    #¼ì²é¼Ò×åÊÇ·ñ¿ÉÒÔ¼ÓÈë¸Ä³ÉÔ±  
 | 
    if not __CheckCanAddFamilyMember(curPlayer, curFamily, findPlayer):  
 | 
        return  
 | 
      
 | 
    #---·¢ËÍÑûÇëÇëÇóÖÁÑûÇëµÄÍæ¼Ò---  
 | 
    curPlayer.AddRequest(findPlayer.GetID(), IPY_GameServer.reqFamily, tick, ChConfig.Def_EventClearTime)  
 | 
    findPlayer.Frm_FamilyAskIfJoin(curPlayerID, curPlayer.GetName(), curFamily.GetID(), curFamily.GetName())  
 | 
      
 | 
    #--֪ͨϵͳÌáʾ  
 | 
    #XW_JZ_InviteEnter  <n color="255,255,0">Äã¶Ô</n><n color="0,190,255">{%S1%}</n><n color="255,255,0">ÑûÇë¼ÓÈë¼Ò×åµÄÇëÇóÒѾ·¢³ö,ÇëµÈ´ý¶Ô·½Ó¦´ð£¡</n>   25  -   -  
 | 
    PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteEnter", [findPlayer.GetName()])  
 | 
#===============================================================================  
 | 
#    #ÕâÀïÖ»·¢ÇëÇó, Î´¸Ä±ä, ÎÞÐèˢР 
 | 
#    #֪ͨ¿Í»§¶Ë¼Ò×åÐÅÏ¢¸Ä±ä  
 | 
#    curFamily.Broadcast_FamilyChange()      
 | 
#===============================================================================  
 | 
    return  
 | 
  
 | 
#//////////////////////////////////////////////////////////////  
 | 
#//0F 08 ÇëÇó¼ÓÈë¼Ò×åµÄ»ØÓ¦#tagAskJoinFamilyReply  
 | 
#tagAskJoinFamilyReply       *   GettagAskJoinFamilyReply();  
 | 
#  
 | 
#class   IPY_AskJoinFamilyReply  
 | 
#{  
 | 
#public:  
 | 
#  
 | 
#    int      GetTagPlayerID();  
 | 
#    //ÊÇ·ñͬÒâ¼ÓÈë  
 | 
#    int      GetIsOK();  
 | 
#};  
 | 
## ÑûÇëÍæ¼Ò¼ÓÈë¼Ò×åµÄ»ØÓ¦  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks ÑûÇëÍæ¼Ò¼ÓÈë¼Ò×åµÄ»ØÓ¦  
 | 
def AskJoinFamilyReply(index, tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_AskJoinFamilyReply)(index, tick)  
 | 
    return  
 | 
  
 | 
## ÑûÇëÍæ¼Ò¼ÓÈë¼Ò×åµÄ»ØÓ¦  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks ÑûÇëÍæ¼Ò¼ÓÈë¼Ò×åµÄ»ØÓ¦  
 | 
def __Func_AskJoinFamilyReply(index, tick):  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    noFamilyPlayer = playerManager.GetPlayerByIndex(index)  
 | 
    #»ñÈ¡·â°ü  
 | 
    pack = IPY_GameServer.IPY_AskJoinFamilyReply()  
 | 
    srcPlayer = playerManager.FindPlayerByID(pack.GetTagPlayerID())  
 | 
      
 | 
    #ÑûÇëÄ¿±ê¼ÓÈë¼Ò×åµÄÍæ¼ÒÒѾ²»ÔÚÏß  
 | 
    if srcPlayer == None:  
 | 
        #jiazu_hwj35_329496 ¶Ô²»Æð,ÑûÇëÄú½øÈë°ï»áµÄÍæ¼ÒÒÑÏÂÏß,²Ù×÷ÎÞЧ  
 | 
        PlayerControl.NotifyCode(noFamilyPlayer, "jiazu_hwj35_329496")  
 | 
        return  
 | 
      
 | 
    #ÇëÇóÒѾʧЧ  
 | 
    if not PlayerRequest.CheckRequest(srcPlayer, noFamilyPlayer, IPY_GameServer.reqFamily):  
 | 
        return  
 | 
      
 | 
    if not pack.GetIsOK():  
 | 
        #XW_JZ_InviteErr_Refuse <n color="255,255,0">Ä¿±ê¾Ü¾øÁËÄú·¢³öµÄÑûÇëÇëÇó£¬ÑûÇë¼Ò×åʧ°Ü£¡</n>  25  -   -  
 | 
        PlayerControl.NotifyCode(srcPlayer, "XW_JZ_InviteErr_Refuse")  
 | 
        return  
 | 
      
 | 
    srcFamily = srcPlayer.GetFamily()  
 | 
      
 | 
    if not srcFamily:  
 | 
        GameWorld.ErrLog('AskJoinFamilyReply, Íæ¼ÒÎÞ¼Ò×å', srcPlayer.GetID())  
 | 
        return  
 | 
      
 | 
    #¼Ò×å¼ì²éδͨ¹ý  
 | 
    if not __CheckCanAddFamilyMember(srcPlayer, srcFamily, noFamilyPlayer):  
 | 
        return  
 | 
  
 | 
    #---Ä¿±ê¼ÓÈë¼Ò×å---  
 | 
    DoPlayerJionFamily(srcFamily, noFamilyPlayer, IPY_GameServer.fmlMember)  
 | 
      
 | 
    noFamilyPlayerName = noFamilyPlayer.GetName()  
 | 
      
 | 
    #֪ͨËùÓмÒ×å³ÉÔ±, Õâ¸öÈ˼ÓÈëÁ˼Ò×å  
 | 
    NotifyAllFamilyMemberMsg(srcFamily, noFamilyPlayer, "XW_JZ_EnterFamily", [noFamilyPlayerName])  
 | 
    PlayerControl.NotifyCode(noFamilyPlayer, 'XW_JZ_EnterFamilyInfo', [srcFamily.GetName()])  
 | 
    #֪ͨ¿Í»§¶Ë¼Ò×åÐÅÏ¢¸Ä±ä  
 | 
    srcFamily.Broadcast_FamilyChange()  
 | 
    return  
 | 
  
 | 
  
 | 
#===============================================================================  
 | 
# //A4 03 ¼ÓÈë¼Ò×åÉóºËÇé¿ö #tagCGJoinFamilyReply  
 | 
#   
 | 
# struct tagCGJoinFamilyReply  
 | 
# {  
 | 
#    tagHead    Head;  
 | 
#    DWORD    TagPlayerID;    //±»ÉóºËÍæ¼ÒID  
 | 
#    BYTE    IsOK;        //ÊÇ·ñͬÒâ¼ÓÈë  
 | 
#   
 | 
# };  
 | 
#===============================================================================  
 | 
## ¼ÓÈë¼Ò×åÉóºËÇé¿ö  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param clientData: ·â°ü½á¹¹Ìå  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
def AddFamilyReply(index, clientData, tick):  
 | 
      
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    curPlayer = playerManager.GetPlayerByIndex(index)  
 | 
      
 | 
    if not GameWorld.RefurbishPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_AddFamilyReply, tick):  
 | 
        #¼ä¸ôδµ½  
 | 
        return  
 | 
      
 | 
    familyId = curPlayer.GetFamilyID()  
 | 
    if familyId <= 0:  
 | 
        #ÉóºËÈËûÓмÒ×å  
 | 
        return  
 | 
      
 | 
    tagPlayerID = clientData.TagPlayerID  
 | 
      
 | 
    tagPlayerIDList = []  # ÊÇ·ñÔÚÉêÇëÁбíÖÐ  
 | 
    allFamilyActionManager = GameWorld.GetFamilyActionManager()    
 | 
    familyAction = allFamilyActionManager.GetFamilyAction(familyId, ShareDefine.Def_ActionType_FamilyAdd)  
 | 
  
 | 
    for index in range(0, familyAction.Count()):  
 | 
        familyActionData = familyAction.At(index)  
 | 
        playerID = familyActionData.GetValue1()  # ID  
 | 
        if tagPlayerID == 0:  
 | 
            tagPlayerIDList.append(playerID)  
 | 
        if tagPlayerID == playerID:  
 | 
            tagPlayerIDList.append(playerID)  
 | 
            break  
 | 
      
 | 
    if not tagPlayerIDList:  
 | 
        return  
 | 
      
 | 
    family = curPlayer.GetFamily()  
 | 
    isNeedSync = False  
 | 
    for playerID in tagPlayerIDList:  
 | 
        tagPlayer = playerManager.FindPlayerByID(playerID)  
 | 
        #¾Ü¾ø  
 | 
        if not clientData.IsOK:  
 | 
              
 | 
            if tagPlayer:  
 | 
                #jiazu_pan_592934:{%S}¾Ü¾øÁËÄúµÄÈë°ïÉêÇë  
 | 
                PlayerControl.NotifyCode(tagPlayer, "jiazu_pan_592934", [family.GetName()])  
 | 
                  
 | 
                #·¢Ë;ܾø¼ÓÈë°ï»áµ½µØÍ¼·þÎñÆ÷  
 | 
                sendMsg = "[%s, %s]" % (familyId, 0)  
 | 
                tagPlayer.MapServer_QueryPlayerResult(0, 0, 'AddFamilyReply', sendMsg, len(sendMsg))  
 | 
            else:  
 | 
                #Çå³ýÉêÇë¼ÓÈë¼Ò×åµÄÐÐΪÊý¾Ý  
 | 
                PlayerFamilyAction.ClearFamilyAction(familyId, ShareDefine.Def_ActionType_FamilyAdd, playerID=tagPlayerID)  
 | 
            continue  
 | 
      
 | 
        #ÉêÇëÄ¿±ê²»ÔÚÏß  
 | 
        if not tagPlayer:  
 | 
            continue  
 | 
          
 | 
        #¼Ò×å¼ì²éδͨ¹ý  
 | 
        if not __CheckCanAddFamilyMember(curPlayer, family, tagPlayer):  
 | 
            continue  
 | 
      
 | 
        #---Ä¿±ê¼ÓÈë¼Ò×å---  
 | 
        DoPlayerJionFamily(family, tagPlayer, IPY_GameServer.fmlMember)  
 | 
        isNeedSync = True  
 | 
        #֪ͨËùÓмÒ×å³ÉÔ±, Õâ¸öÈ˼ÓÈëÁ˼Ò×å  
 | 
        NotifyAllFamilyMemberMsg(family, tagPlayer, "XW_JZ_EnterFamily", [tagPlayer.GetName()])  
 | 
        PlayerControl.NotifyCode(tagPlayer, 'XW_JZ_EnterFamilyInfo', [family.GetName()])  
 | 
        ##·¢Ëͳɹ¦¼ÓÈë°ï»áµ½µØÍ¼·þÎñÆ÷  
 | 
        sendMsg = "[%s, %s]" % (familyId, 1)  
 | 
        tagPlayer.MapServer_QueryPlayerResult(0, 0, 'AddFamilyReply', sendMsg, len(sendMsg))  
 | 
      
 | 
    if isNeedSync:  
 | 
        #֪ͨ¿Í»§¶Ë¼Ò×åÐÅÏ¢¸Ä±ä  
 | 
        family.Broadcast_FamilyChange()  
 | 
    return  
 | 
  
 | 
  
 | 
#===============================================================================  
 | 
          
 | 
## Í¨ÖªËùÓмÒ×å³ÉÔ±ÐÅÏ¢  
 | 
#  @param curFamily µ±Ç°¼Ò×å  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param code "XW_JZ_EnterFamily"  
 | 
#  @param parList [playerName]  
 | 
#  @param includeSelf ÊÇ·ñͬʱ֪ͨ±¾ÈË  
 | 
#  @return None  
 | 
#  @remarks Í¨ÖªËùÓмÒ×å³ÉÔ±ÐÅÏ¢  
 | 
def NotifyAllFamilyMemberMsg(curFamily, curPlayer, code, parList=[], includeSelf=True):  
 | 
    if curPlayer and PlayerControl.GetIsTJG(curPlayer):  
 | 
        # ÍÑ»ú¹ÒÍæ¼Ò²»Í¨ÖªÆäËûÍæ¼Ò  
 | 
        return  
 | 
      
 | 
    #֪ͨËùÓмÒ×å³ÉÔ±, Õâ¸öÈ˼ÓÈëÁ˼Ò×å  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    for i in range(0, curFamily.GetCount()):  
 | 
        notifyMember = curFamily.GetAt(i)  
 | 
        notifyPlayer = playerManager.FindPlayerByID(notifyMember.GetPlayerID())  
 | 
          
 | 
        if notifyPlayer == None:  
 | 
            continue  
 | 
          
 | 
        if (not includeSelf and curPlayer and notifyPlayer.GetPlayerID() == curPlayer.GetPlayerID()):  
 | 
            #²»°üÀ¨×Ô¼º  
 | 
            continue  
 | 
          
 | 
        if PlayerControl.GetIsTJG(notifyPlayer):  
 | 
            continue  
 | 
          
 | 
        #ÀýÈç: XW_JZ_EnterFamily  <n color="0,190,255">{%S1%}</n><n color="255,255,0">¼ÓÈëÁ˼Ò×壡</n>  25  -   -  
 | 
        PlayerControl.NotifyCode(notifyPlayer, code, parList)  
 | 
      
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
## ²éÕÒ¼Ò×åÖÐÓµÓиÃȨÏÞµÄÍæ¼ÒÊý  
 | 
#  @param curFamily ¼Ò×å  
 | 
#  @param familyLV Íæ¼ÒµÈ¼¶  
 | 
#  @return ÊýÁ¿  
 | 
#  @remarks ²éÕÒ¼Ò×åÖÐÓµÓиÃȨÏÞµÄÍæ¼ÒÊý  
 | 
def FindFamilyMemberCntByPowLv(curFamily, familyLV):  
 | 
    memberCnt = 0  
 | 
      
 | 
    for i in range(0, curFamily.GetCount()):  
 | 
        familyMember = curFamily.GetAt(i)  
 | 
        if familyMember.GetFamilyLV() != familyLV:  
 | 
            continue  
 | 
          
 | 
        memberCnt += 1  
 | 
          
 | 
    return memberCnt  
 | 
#---------------------------------------------------------------------  
 | 
## »ñÈ¡¼Ò×åµÈ¼¶ÐÅÏ¢  
 | 
#  @param info infoKey  
 | 
#  @return keyStr  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __GetFamilyLVInfo(info):  
 | 
    if info == IPY_GameServer.fmlMember:  
 | 
        return 'fmlMember'  
 | 
    if info == IPY_GameServer.fmlCounsellor:  
 | 
        return 'fmlCounsellor'  
 | 
    if info == IPY_GameServer.fmlViceLeader:  
 | 
        return 'fmlViceLeader'  
 | 
    if info == IPY_GameServer.fmlLeader:  
 | 
        return 'fmlLeader'  
 | 
      
 | 
    return ''  
 | 
  
 | 
#class   IPY_CFamilyChangeMember  
 | 
#{  
 | 
#public:  
 | 
#  
 | 
#    int      GetPlayerID();  
 | 
#  
 | 
#    int      GetFamilyLV();  
 | 
#};  
 | 
## ¸ü¸Ä¼Ò×å³ÉԱȨÏÞ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks ¸ü¸Ä¼Ò×å³ÉԱȨÏÞ  
 | 
def FamilyChangeMemberLV(index, tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_FamilyChangeMemberLV)(index, tick)  
 | 
    return  
 | 
  
 | 
## ¸ü¸Ä¼Ò×å³ÉԱȨÏÞ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks ¸ü¸Ä¼Ò×å³ÉԱȨÏÞ  
 | 
def __Func_FamilyChangeMemberLV(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    curPlayerID = curPlayer.GetPlayerID()  
 | 
    #---Íæ¼ÒȨÏÞÑéÖ¤---  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
      
 | 
    if curFamily == None:  
 | 
        GameWorld.Log("¸ü¸Ä¼Ò×å³ÉÔ±µÈ¼¶->·â°üÒì³£->Íæ¼ÒûÓмÒ×å", curPlayerID)  
 | 
        return  
 | 
      
 | 
    #---¿ªÊ¼±ä¸üְλ---  
 | 
    pack = IPY_GameServer.IPY_CFamilyChangeMember()  
 | 
    pack_tagID = pack.GetPlayerID()  
 | 
    pack_FamilyLv = pack.GetFamilyLV()  
 | 
    DoChangeFamilyMemberLV(curFamily, curPlayer, pack_tagID, pack_FamilyLv)  
 | 
    return  
 | 
      
 | 
def DoChangeFamilyMemberLV(curFamily, curPlayer, tagID, pack_FamilyLv, isGMOP=False):  
 | 
    curPlayerID = curPlayer.GetPlayerID()  
 | 
    curMember = curFamily.FindMember(curPlayerID)  
 | 
      
 | 
    if curPlayer == None or curMember == None:  
 | 
        GameWorld.Log("¸ü¸Ä¼Ò×å³ÉÔ±µÈ¼¶->·â°üÒì³£->Î޴˳ÉÔ±", curPlayerID)  
 | 
        return  
 | 
      
 | 
    # ·ÇGM²Ù×÷µÄÐè¼ì²éȨÏÞ  
 | 
    if not isGMOP:  
 | 
        if not GetFamilyMemberHasPow(curMember, ChConfig.Def_PurviewDictKey_CanChangeFamilyJob):  
 | 
            return  
 | 
          
 | 
        if curPlayerID == tagID:  
 | 
            GameWorld.Log("¸ü¸Ä¼Ò×å³ÉÔ±µÈ¼¶->·â°üÒì³£->²»ÄÜÈÎÃâ×Ô¼º", curPlayerID)  
 | 
            return  
 | 
      
 | 
    tagMember = curFamily.FindMember(tagID)  
 | 
      
 | 
    if tagMember == None:  
 | 
        GameWorld.Log("¸ü¸Ä¼Ò×å³ÉÔ±µÈ¼¶->·â°üÒì³£->Ä¿±ê²»´æÔÚ, tagID=%s" % tagID, curPlayerID)  
 | 
        return      
 | 
      
 | 
    if pack_FamilyLv not in ChConfig.Def_Family_MemberLVList:  
 | 
        GameWorld.Log("¸ü¸Ä¼Ò×å³ÉÔ±µÈ¼¶->·â°üÒì³£->µÈ¼¶ = %s²»´æÔÚ" % (pack_FamilyLv), curPlayerID)  
 | 
        return  
 | 
    if not isGMOP:  
 | 
        if curMember.GetFamilyLV() != IPY_GameServer.fmlLeader:  
 | 
            if tagMember.GetFamilyLV() >= curMember.GetFamilyLV() or pack_FamilyLv >= curMember.GetFamilyLV():  
 | 
                GameWorld.Log("¸ü¸Ä¼Ò×å³ÉÔ±µÈ¼¶->Ä¿±êְλ±È×Ô¼ºµÄ¸ß»òÕß¶Ô·½µÄµ±Ç°Ö°Î»±È×Ô¼º¸ß", curPlayerID)  
 | 
                return  
 | 
      
 | 
    familyID = curFamily.GetID()  # ¼Ò×åID  
 | 
    familyName = curFamily.GetName()  # ¼Ò×åÃû×Ö  
 | 
      
 | 
    #---תÈüÒ×峤---  
 | 
    if pack_FamilyLv == IPY_GameServer.fmlLeader:   
 | 
        createFamily_MinLV = IpyGameDataPY.GetFuncCfg('CreateFamilyMinLV')  
 | 
        if tagMember.GetLV() < createFamily_MinLV:  
 | 
            PlayerControl.NotifyCode(curPlayer, "DBB17139-6C93-4E66-9CC1314EAEB6F455", [createFamily_MinLV])  
 | 
            return  
 | 
          
 | 
        leaderID = curFamily.GetLeaderID()  
 | 
        leaderMember = curFamily.FindMember(leaderID)  
 | 
        if not leaderMember:  
 | 
            return  
 | 
          
 | 
        #°Ñ×峤½µÎªÆÕͨ³ÉÔ±  
 | 
        ChangeFamilyMemberLv(leaderMember, IPY_GameServer.fmlMember)  
 | 
        #oss¼Ç¼×峤ְλ±ä¸ü  
 | 
        DataRecordPack.DR_PlayerChangeFamilyJob(curPlayer, familyID, familyName, leaderMember.GetPlayerID(),  
 | 
                                                leaderMember.GetName(), leaderMember.GetFamilyLV(), isGMOP)  
 | 
          
 | 
        #ÉèÖÃÄ¿±êÍæ¼ÒÊôÐÔ, °ÑÄ¿±êÌáʾΪ×峤  
 | 
        SetFamilyLeader(curFamily, tagMember)  
 | 
        #֪ͨ¼Ò×å³ÉÔ±ÐÅÏ¢  
 | 
        NotifyAllFamilyMemberMsg(curFamily, curPlayer, "XW_JZ_AppointFamily", [tagMember.GetName(), pack_FamilyLv])  
 | 
        #֪ͨµØÍ¼·þÎñÆ÷ˢР 
 | 
        curPlayer.MapServer_FamilyRefresh()  
 | 
          
 | 
        leaderPlayer = leaderMember.GetPlayer()  
 | 
        if isGMOP and leaderPlayer:  
 | 
            leaderPlayer.MapServer_FamilyRefresh()  
 | 
          
 | 
        GameWorld.Log("%s¼Ò×åתÈÃ×峤, ÉèÖÃΪ×峤:%s" % (curFamily.GetID(), tagMember.GetName()), curPlayerID)  
 | 
    #---ÉèÖÃȨÏÞ---  
 | 
    else:  
 | 
        #²é¿´¸ÃȨÏÞÊÇ·ñÒѾ´ïµ½ÉÏÏÞ  
 | 
        familyLvMemberCnt = FindFamilyMemberCntByPowLv(curFamily, pack_FamilyLv)  
 | 
        #Ŀǰ¸ÃȨÏÞµÄÈËÊýÒѾ´ïµ½ÉÏÏÞ  
 | 
        if familyLvMemberCnt >= GetFamilySetting(curFamily, ChConfig.Def_FamilyPowLvChangeFamilySettingDict[pack_FamilyLv]):  
 | 
            # jiazu_hwj35_272921 ¸ÄΪ jiazu_chenxin_31379  
 | 
            PlayerControl.NotifyCode(curPlayer, "jiazu_chenxin_31379")  
 | 
            return  
 | 
          
 | 
        #ÈÎÃü֪ͨ  
 | 
        if tagMember.GetFamilyLV() != pack_FamilyLv:   
 | 
            #XW_JZ_AppointFamily <n color="255,255,0">¹§Ï²</n><n color="0,190,255">{%S1%}</n><n color="255,255,0">£¬±»ÈÎÃüΪ{%S2%}£¡</n>    25  -   -  
 | 
            NotifyAllFamilyMemberMsg(curFamily, curPlayer, "XW_JZ_AppointFamily", [tagMember.GetName(), pack_FamilyLv])  
 | 
        if tagMember.GetFamilyLV() == IPY_GameServer.fmlViceLeader and tagMember.GetPlayerID() in PyGameData.g_autoViceleaderDict.get(familyID, []):  
 | 
            #×Ô¶¯°²Åŵĸ±ÃËÖ÷±»³·Ö°Ôò¸ÃÃ˲»ÔÙ×Ô¶¯°²ÅÅ  
 | 
            if familyID not in PyGameData.g_forbidAutoViceleaderFamily:  
 | 
                PyGameData.g_forbidAutoViceleaderFamily.append(familyID)  
 | 
        #¸ü¸Ä¼Ò×åµÈ¼¶  
 | 
        ChangeFamilyMemberLv(tagMember, pack_FamilyLv)  
 | 
      
 | 
    #¼Ç¼¶Ô·½³ÉÔ±±ä¸üÐÅÏ¢  
 | 
    DataRecordPack.DR_PlayerChangeFamilyJob(curPlayer, curFamily.GetID(), curFamily.GetName(), tagMember.GetPlayerID(),  
 | 
                                            tagMember.GetName(), tagMember.GetFamilyLV(), isGMOP)  
 | 
      
 | 
    #֪ͨµØÍ¼·þÎñÆ÷¼Ò×å±ä¸üÏûÏ¢  
 | 
    tagPlayer = tagMember.GetPlayer()  
 | 
      
 | 
    if tagPlayer != None:  
 | 
        #֪ͨµØÍ¼·þÎñÆ÷¼Ò×åµÈ¼¶¸Ä±ä  
 | 
        tagPlayer.MapServer_FamilyRefresh()  
 | 
        #Èç¹û²»¸æËß, ¿Í»§¶ËµÃ²»µ½¼Ò×åË¢ÐÂ, µ¼Ö²»´ò¿ª¼Ò×å½çÃæµÄʱºò, ²»ÄÜÖ±½Óµã»÷Í·ÏñÕÐÈË  
 | 
        if GetFamilyMemberHasPow(tagMember, ChConfig.Def_PurviewDictKey_CanCall):  
 | 
            tagPlayer.Sync_FamilyInfo()  
 | 
            PlayerFamilyAction.ViewFamilyRequestInfo(tagPlayer)  
 | 
    if isGMOP:  
 | 
        curFamily.SetBroadcast('')  
 | 
    curFamily.Broadcast_FamilyChange()  
 | 
    return True  
 | 
#---------------------------------------------------------------------  
 | 
#class   IPY_CGetFamilyInfo  
 | 
#{  
 | 
#public:  
 | 
#  
 | 
#    int      GetType();  
 | 
#};  
 | 
  
 | 
## ÒªÇóµÃµ½¼Ò×å³ÉÔ±ÐÅÏ¢  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GetFamilyMember(index, tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_GetFamilyMember)(index, tick)  
 | 
    return  
 | 
  
 | 
## ÒªÇóµÃµ½¼Ò×å³ÉÔ±ÐÅÏ¢  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __Func_GetFamilyMember(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
      
 | 
    curPlayerFamily = curPlayer.GetFamily()  
 | 
      
 | 
    if not curPlayerFamily:  
 | 
        GameWorld.Log('###²é¿´¼Ò×å½çÃæ·â°üÒì³££¬Íæ¼ÒÎÞ¼Ò×å' , curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    if tick - curPlayer.GetPlayerGetFamilyInfoTick() < ChConfig.Def_PlayerGetFamilyInfoTick:  
 | 
        GameWorld.Log("ÒªÇóµÃµ½¼Ò×å³ÉÔ±ÐÅÏ¢ -> ¿Í»§¶Ë -> µÃµ½ÐÅÏ¢Ëٶȹý¿ì" , curPlayer.GetPlayerID())  
 | 
        return  
 | 
          
 | 
    #Ë͸øÍæ¼Ò¼Ò×åÐÅÏ¢  
 | 
    curPlayer.SetPlayerGetFamilyInfoTick(tick)  
 | 
    curPlayer.Sync_FamilyInfo()  
 | 
      
 | 
    #----------Åж¨ÊÇ·ñ¿ÉÒÔ¼Ò×å¸ÄÃû  
 | 
    if __CheckCanRenameFamilyName(curPlayer):  
 | 
        curPlayer.Frm_RenameFamilyAsk(curPlayerFamily.GetName())  
 | 
      
 | 
    return  
 | 
  
 | 
#----------------------------------------------------------------------  
 | 
#class   IPY_GSetPlayerViewFamilyState  
 | 
#{  
 | 
#public:  
 | 
#    //0: ÎÞ״̬ 1:²é¿´ÖÐ  
 | 
#    int      GetState();  
 | 
#};  
 | 
## µØÍ¼·þÎñÆ÷Ë¢ÐÂÍæ¼Ò²é¿´¼Ò×åµÄ״̬  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def MapServer_PlayerViewFamilyState(index, tick):  
 | 
    #µØÍ¼·þÎñÆ÷Ë¢ÐÂÍæ¼Ò²é¿´¼Ò×åµÄ״̬  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    pack = IPY_GameServer.IPY_GSetPlayerViewFamilyState()  
 | 
    curPlayer.SetViewFamilyState(pack.GetState())  
 | 
    return  
 | 
  
 | 
#//////////////////////////////////////////////////////////////  
 | 
#//0F 09 É¾³ý¼Ò×å³ÉÔ±#tagCDeleteFamilyMember  
 | 
#tagCDeleteFamilyMember       *   GettagCDeleteFamilyMember();  
 | 
#  
 | 
#class   IPY_CDeleteFamilyMember  
 | 
#{  
 | 
#public:  
 | 
#  
 | 
#    int      GetMemberID();  
 | 
#};  
 | 
## É¾³ý¼Ò×å³ÉÔ±  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def DeleteFamilyMember(index, tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_DeleteFamilyMember)(index, tick)  
 | 
    return  
 | 
  
 | 
## É¾³ý¼Ò×å³ÉÔ±  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __Func_DeleteFamilyMember(index, tick):  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    curPlayer = playerManager.GetPlayerByIndex(index)  
 | 
    pack = IPY_GameServer.IPY_CDeleteFamilyMember()  
 | 
    tagMemberID = pack.GetMemberID()  
 | 
      
 | 
    if curPlayer.GetPlayerID() == tagMemberID:  
 | 
        GameWorld.Log("ɾ³ý¼Ò×å³ÉÔ± ->·â°ü´íÎó ->²»ÄÜÌß³ö×Ô¼º" , curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    #----------------×Ô¼º---------------  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
    if curFamily == None:  
 | 
        GameWorld.Log("ɾ³ý¼Ò×å³ÉÔ± ->·â°ü´íÎó ->Íæ¼ÒûÓмÒ×å" , curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    curMember = curFamily.FindMember(curPlayer.GetPlayerID())  
 | 
      
 | 
    if curMember == None:  
 | 
        GameWorld.Log("ɾ³ý¼Ò×å³ÉÔ± ->·â°ü´íÎó ->Î޴˳ÉÔ±" , curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    #ȨÏÞ²»×ã  
 | 
    if not GetFamilyMemberHasPow(curMember, ChConfig.Def_PurviewDictKey_CanKickMember):  
 | 
        return  
 | 
  
 | 
  
 | 
    #----------------¶Ô·½---------------  
 | 
    curTagMember = curFamily.FindMember(tagMemberID)  
 | 
    if curTagMember == None:  
 | 
        GameWorld.Log("ɾ³ý¼Ò×å³ÉÔ± ->·â°ü´íÎó ->Î޴˳ÉÔ±" , curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    if curTagMember.GetFamilyLV() == IPY_GameServer.fmlLeader:  
 | 
        GameWorld.Log("ɾ³ý¼Ò×å³ÉÔ± ->·â°ü´íÎó ->²»ÄÜÌß³ö×峤" , curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    curFamilyLV = curMember.GetFamilyLV()  
 | 
    if curFamilyLV != IPY_GameServer.fmlLeader and curTagMember.GetFamilyLV() == IPY_GameServer.fmlViceLeader:  
 | 
        GameWorld.Log("ɾ³ý¼Ò×å³ÉÔ± ->·â°ü´íÎó ->»¤·¨²»ÄÜÌß³ö»¤·¨", curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    if GameWorldFamilyWar.IsFamilyInWarFighting(curFamily.GetID()):  
 | 
        PlayerControl.NotifyCode(curPlayer, "FamilyWarFightingDeleteMemLimiit")  
 | 
        return  
 | 
      
 | 
    if PlayerFamilySWRH.IsInFamilySWRH():  
 | 
        PlayerControl.NotifyCode(curPlayer, "DungeonGuardSkyText2")  
 | 
        return  
 | 
      
 | 
    if GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyRobBoss):          
 | 
        PlayerControl.NotifyCode(curPlayer, "FairyGrabBossExitError")  
 | 
        return  
 | 
    if PlayerFamilyBoss.IsInAllFamilyBoss():  
 | 
        PlayerControl.NotifyCode(curPlayer, "LeagueBOSSExitError1")  
 | 
        return  
 | 
    if AuctionHouse.IsFamilyMemberBiddingAuctionItem(curFamily.GetID(), tagMemberID):  
 | 
        PlayerControl.NotifyCode(curPlayer, "Paimai7")  
 | 
        return  
 | 
    tagPlayerName = curTagMember.GetName()  # ±»ÌßÍæ¼ÒÃû  
 | 
    tagPlayerID = curTagMember.GetPlayerID()  # ±»ÌßÍæ¼ÒID  
 | 
    tagFamilyLV = curTagMember.GetFamilyLV()  # ±»ÌßÍæ¼Òְλ  
 | 
      
 | 
    #XW_JZ_LeaveFamily   <n color="0,190,255">{%S1%}</n><n color="255,255,0">Í˳öÁ˼Ò×壡</n>  25  -   -  
 | 
    NotifyAllFamilyMemberMsg(curFamily, curPlayer, "XW_JZ_LeaveFamily", [tagPlayerName])  
 | 
    #¼Ç¼±»ÌßÐÅÏ¢  
 | 
    PlayerFamilyAction.AddFamilyActionNote(tagPlayerName, curFamily.GetID(), ShareDefine.Def_ActionType_FamilyEvent,  
 | 
                                           [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_KickOut], tick)  
 | 
    #ɾ³ýÍæ¼Ò  
 | 
    curFamily.DeleteMember(tagPlayerID)      
 | 
    tagPlayer = playerManager.FindPlayerByID(tagMemberID)  
 | 
      
 | 
    __DoPlayerLeaveFamilyByID(curFamily, tagPlayerID, tagPlayer)  
 | 
    #Íæ¼ÒÔÚÏß, ÉèÖÃÕâ¸öÍæ¼ÒµÄÊôÐÔ  
 | 
    PlayerForceLeaveFamily(tagPlayer, tick)  
 | 
      
 | 
    #¼Ç¼Á÷Ïò 150  
 | 
    DataRecordPack.DR_PlayerLeaveFamily(curPlayer, curFamily.GetID(), curFamily.GetName(), curFamily.GetCount(),  
 | 
                                        curFamilyLV, tagPlayerID, tagPlayerName, tagFamilyLV)  
 | 
      
 | 
    #֪ͨ¿Í»§¶Ë¼Ò×åÐÅÏ¢¸Ä±ä  
 | 
    curFamily.Broadcast_FamilyChange()  
 | 
    return  
 | 
  
 | 
#//////////////////////////////////////////////////////////////  
 | 
#//0F 0A Í˳ö¼Ò×å#tagCLeaveFamily  
 | 
#tagCLeaveFamily       *   GettagCLeaveFamily();  
 | 
#  
 | 
#class   IPY_CLeaveFamily  
 | 
#{  
 | 
#public:  
 | 
#  
 | 
#    int      GetType();  
 | 
#};  
 | 
## À뿪¼Ò×å  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def LeaveFamily(index, tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_LeaveFamily)(index, tick)  
 | 
    return  
 | 
  
 | 
## À뿪¼Ò×å  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __Func_LeaveFamily(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    #pack = IPY_GameServer.IPY_CLeaveFamily()  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
    if curFamily == None:  
 | 
        GameWorld.Log("À뿪¼Ò×å -> ·â°ü´íÎó -> Íæ¼ÒûÓмÒ×å" , curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    curMember = curFamily.FindMember(curPlayer.GetPlayerID())  
 | 
    if curMember == None:  
 | 
        GameWorld.Log("À뿪¼Ò×å -> ·â°ü´íÎó ->Î޴˳ÉÔ±" , curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    familyLV = curMember.GetFamilyLV()  # Ö°Î»  
 | 
    if curFamily.GetCount() > 1 and familyLV == IPY_GameServer.fmlLeader:  
 | 
        #XW_JZ_FamilyHeadCannotExit <n color="255,255,0">¶Ô²»Æð£¬¼Ò×å×峤²»ÄÜÖ±½ÓÍ˳ö¼Ò×å£¬ÍÆ³ö¼Ò×åʧ°Ü£¡</n>   25  -   -  
 | 
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_FamilyHeadCannotExit")     
 | 
        return  
 | 
      
 | 
    if GameWorldFamilyWar.IsFamilyInWarFighting(curFamily.GetID()):  
 | 
        PlayerControl.NotifyCode(curPlayer, "FamilyWarFightingLeaveLimiit")  
 | 
        return  
 | 
    if PlayerFamilySWRH.IsInFamilySWRH():  
 | 
        PlayerControl.NotifyCode(curPlayer, "DungeonGuardSkyText1")  
 | 
        return  
 | 
      
 | 
    if GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyRobBoss):          
 | 
        PlayerControl.NotifyCode(curPlayer, "FairyGrabBossExitError")  
 | 
        return  
 | 
    if PlayerFamilyBoss.IsInAllFamilyBoss():  
 | 
        PlayerControl.NotifyCode(curPlayer, "LeagueBOSSExitError1")  
 | 
        return  
 | 
    if AuctionHouse.IsFamilyMemberBiddingAuctionItem(curFamily.GetID(), curMember.GetPlayerID()):  
 | 
        PlayerControl.NotifyCode(curPlayer, "Paimai8")  
 | 
        return  
 | 
    #ÅжÏÍ˳öʱ¼ä¼ä¸ô  
 | 
    curTime = int(time.time())  
 | 
    lastLeaveFamilyTime = PlayerControl.GetLeaveFamilyTime(curPlayer)  
 | 
    if lastLeaveFamilyTime > 100:  
 | 
        remainTime = IpyGameDataPY.GetFuncCfg('ExitFairyTime', 2) - (curTime - lastLeaveFamilyTime)  
 | 
        if remainTime > 0:  
 | 
            PlayerControl.NotifyCode(curPlayer, "ExitFairyTime", [remainTime*1000])  
 | 
            return  
 | 
        updTime = 1 if IpyGameDataPY.GetFuncCfg('ExitFairyTime') > 1 else curTime  
 | 
    elif lastLeaveFamilyTime >= IpyGameDataPY.GetFuncCfg('ExitFairyTime')-1:  
 | 
        updTime = curTime  
 | 
    else:  
 | 
        updTime = lastLeaveFamilyTime+1  
 | 
    PlayerControl.SetLeaveFamilyTime(curPlayer, updTime)  
 | 
      
 | 
    #XW_JZ_LeaveFamily   <n color="0,190,255">{%S1%}</n><n color="255,255,0">Í˳öÁ˼Ò×壡</n>  25  -   -  
 | 
    NotifyAllFamilyMemberMsg(curFamily, curPlayer, "XW_JZ_LeaveFamily", [curPlayer.GetName()])  
 | 
      
 | 
    # ¼Ç¼Í˳öÐÅÏ¢  
 | 
    PlayerFamilyAction.AddFamilyActionNote(curPlayer.GetName(), curFamily.GetID(), ShareDefine.Def_ActionType_FamilyEvent,  
 | 
                                           [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_Leave], tick)  
 | 
    curPlayerID = curMember.GetPlayerID()  
 | 
    #ɾ³ýÍæ¼Ò  
 | 
    curFamily.DeleteMember(curMember.GetPlayerID())  
 | 
    #Íæ¼ÒÔÚÏß, ÉèÖÃÕâ¸öÍæ¼ÒµÄÊôÐÔ  
 | 
    PlayerForceLeaveFamily(curPlayer, tick)    
 | 
    __DoPlayerLeaveFamilyByID(curFamily, curPlayerID, curPlayer)  
 | 
  
 | 
    DataRecordPack.DR_PlayerLeaveFamily(curPlayer, curFamily.GetID(), curFamily.GetName(), curFamily.GetCount(),  
 | 
                                        familyLV, curPlayer.GetPlayerID(), curPlayer.GetName(), familyLV, updTime)  
 | 
      
 | 
    if curFamily.GetCount() == 0:  
 | 
        #Íæ¼ÒÀ뿪ºó, ¼Ò×åûÓÐÈËÁË , É¾³ýÕâ¸ö¼Ò×å  
 | 
        __DelFamily(curPlayer , curFamily)  
 | 
        return  
 | 
      
 | 
    #֪ͨ¿Í»§¶Ë¼Ò×åÐÅÏ¢¸Ä±ä  
 | 
    curFamily.Broadcast_FamilyChange()  
 | 
    return  
 | 
  
 | 
## Íæ¼ÒÀ뿪¼Ò×å´¦Àí£¬¸ù¾ÝID£¬ÎÞÊÓÍæ¼ÒÊÇ·ñÔÚÏß  
 | 
#  @param curFamily À뿪µÄ¼Ò×å  
 | 
#  @param leavePlayerID À뿪µÄÍæ¼ÒID  
 | 
#  @return None  
 | 
def __DoPlayerLeaveFamilyByID(curFamily, leavePlayerID, tagPlayer=None):  
 | 
    PlayerFamilyAction.DelFamilyOfficerModelEquip(curFamily.GetID(), leavePlayerID)  
 | 
    # Íæ¼ÒÕ½ÃËÃû±ä¸ü´¦Àí  
 | 
    __OnFamilyNameChange(leavePlayerID, '')  
 | 
    AddFamilyIDToFightPowerChangeList(curFamily.GetID())  
 | 
    PlayerViewCache.OnPlayerFamilyChange(leavePlayerID, 0, "")  
 | 
    PlayerAssist.OnPlayerLeaveFamily(curFamily.GetID(), leavePlayerID, tagPlayer)  
 | 
    if leavePlayerID in PyGameData.g_autoViceleaderDict.get(curFamily.GetID(),[]):  
 | 
        PyGameData.g_autoViceleaderDict[curFamily.GetID()].remove(leavePlayerID)  
 | 
    return  
 | 
  
 | 
#//////////////////////////////////////////////////////////////  
 | 
#//05 02 ²é¿´ËùÓмÒ×å#tagGViewAllFamily  
 | 
#tagGViewAllFamily       *   GettagGViewAllFamily();  
 | 
#  
 | 
#class   IPY_GViewAllFamily  
 | 
#{  
 | 
#public:  
 | 
#  
 | 
#    int      GetType();  
 | 
#};  
 | 
## ²é¿´ËùÓмÒ×å  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def MapServer_PlayerViewAllFamily(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    #¹Ì¶¨·µ»ØµÚÒ»Ò³  
 | 
    Sync_AllFamilyInfo(curPlayer, 0)  
 | 
    return  
 | 
  
 | 
#class   IPY_GAddFamilyDetail  
 | 
#{  
 | 
#public:  
 | 
#    //Ôö¼Ó¼Ò×åÈÙÓþ  
 | 
#    int      GetAddFamilyHornor();  
 | 
#    //Ôö¼Ó¼Ò×å×ʽð  
 | 
#    int      GetAddFamilyMoney();  
 | 
#    //Ôö¼Ó¼Ò×å»îÔ¾¶È  
 | 
#    int      GetFamilyActiveValue();  
 | 
#};  
 | 
## mapÇëÇóÍæ¼ÒÔö¼Ó¹±Ï׵ļÒ×åÐÅÏ¢  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä   
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def MapServer_PlayerAddFamilyDetail(index, tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_MapServer_PlayerAddFamilyDetail)(index, tick)  
 | 
    return  
 | 
  
 | 
def __Func_MapServer_PlayerAddFamilyDetail(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    pack = IPY_GameServer.IPY_GAddFamilyDetail()  
 | 
    addFamilyHornor = pack.GetAddFamilyHornor()  
 | 
    addFamilyMoney = pack.GetAddFamilyMoney()  
 | 
    addFamilyActiveValue = pack.GetFamilyActiveValue()  
 | 
    __DoLogic_MapServer_PlayerAddFamilyDetail(curPlayer, addFamilyHornor, addFamilyMoney, addFamilyActiveValue, 0)  
 | 
    return  
 | 
  
 | 
#// 03 05 Ôö¼Ó¼Ò×åÊôÐÔ#tagMGAddFamilyDetail  
 | 
#  
 | 
#struct    tagMGAddFamilyDetail  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    DWORD        PlayerID;        //Íæ¼ÒID  
 | 
#    DWORD        AddFamilyHornor;        //Ôö¼Ó¼Ò×åÈÙÓþ  
 | 
#    DWORD        AddFamilyMoney;        //Ôö¼Ó¼Ò×å×ʽð  
 | 
#    DWORD        FamilyActiveValue;        //¼Ò×å»îÔ¾¶È  
 | 
#    BYTE        AddResion;        //Ôö¼ÓÔÒò  
 | 
#};  
 | 
def OnMGAddFamilyDetail(routeIndex, mapID, curPackData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPackData.PlayerID)  
 | 
    addFamilyHornor = curPackData.AddFamilyHornor  
 | 
    addFamilyMoney = curPackData.AddFamilyMoney  
 | 
    addFamilyActiveValue = curPackData.FamilyActiveValue  
 | 
    addResion = curPackData.AddResion  
 | 
    __DoLogic_MapServer_PlayerAddFamilyDetail(curPlayer, addFamilyHornor, addFamilyMoney, addFamilyActiveValue, addResion)  
 | 
    return  
 | 
  
 | 
def __DoLogic_MapServer_PlayerAddFamilyDetail(curPlayer, addFamilyHornor, addFamilyMoney, addFamilyActiveValue, addResion):  
 | 
    if not curPlayer:  
 | 
        #@warning: ÄÚÍø·¢ÏÖÕâÀïΪNone, ÔÒò´ý²é, ÏȼӷÀ·¶  
 | 
        GameWorld.ErrLog('MapServer_PlayerAddFamilyDetail Player = None')  
 | 
        return  
 | 
  
 | 
    curPlayerID = curPlayer.GetPlayerID()  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
      
 | 
    if curFamily == None:  
 | 
        GameWorld.Log("AddFamilyDetail ->Íæ¼ÒûÓмÒ×å" , curPlayerID)  
 | 
        return  
 | 
      
 | 
    curMember = curFamily.FindMember(curPlayerID)  
 | 
      
 | 
    if curMember == None:  
 | 
        GameWorld.Log("AddFamilyDetail ->Î޴˳ÉÔ±" , curPlayerID)  
 | 
        return  
 | 
      
 | 
    GameWorld.DebugLog("PlayerAddFamilyDetail addFamilyHornor=%s,addFamilyMoney=%s,addFamilyActiveValue=%s,addResion=%s"   
 | 
                       % (addFamilyHornor, addFamilyMoney, addFamilyActiveValue, addResion), curPlayerID)  
 | 
    weekMissionMoneyMax = GetFamilySetting(curFamily, ChConfig.Def_FamilySetting_WeekMissionMoneyMax)  
 | 
    if addFamilyMoney != 0 and addResion == ShareDefine.Def_AddFAVReason_DoFamilyMisson and weekMissionMoneyMax:  
 | 
        curWeekMissionMoney = GetCurWeekMissionMoney(curFamily)  
 | 
        addFamilyMoney = min(addFamilyMoney, max(weekMissionMoneyMax - curWeekMissionMoney, 0))  
 | 
        GameWorld.DebugLog("    ±¾ÖÜÈÎÎñÒÑ»ñµÃÏÉÃË×ʽðÊý!curWeekMissionMoney=%s,weekMissionMoneyMax=%s,addFamilyMoney=%s"   
 | 
                           % (curWeekMissionMoney, weekMissionMoneyMax, addFamilyMoney), curPlayerID)  
 | 
          
 | 
    #----------ÉèÖÃÖµ  
 | 
    if addFamilyHornor != 0:  
 | 
        SetFamilyBossFood(curFamily, min(GetFamilyBossFood(curFamily) + addFamilyHornor, ChConfig.Def_UpperLimit_DWord))  
 | 
  
 | 
    if addFamilyMoney != 0:  
 | 
        curFamily.SetMoney(min(curFamily.GetMoney() + addFamilyMoney, ChConfig.Def_UpperLimit_DWord))  
 | 
        if addResion == ShareDefine.Def_AddFAVReason_DoFamilyMisson and weekMissionMoneyMax:  
 | 
            SetCurWeekMissionMoney(curFamily, GetCurWeekMissionMoney(curFamily) + addFamilyMoney)  
 | 
              
 | 
    if addFamilyActiveValue != 0:  
 | 
        curFamily.SetFamilyActiveValue(min(curFamily.GetFamilyActiveValue() + addFamilyActiveValue, ChConfig.Def_UpperLimit_DWord))  
 | 
        ReFreshPlayerFamilyTotalActiveValue(curPlayer, addFamilyActiveValue)  
 | 
      
 | 
    #¼Ç¼Á÷Ïò151  
 | 
    if addFamilyMoney != 0:  
 | 
        DataRecordPack.DR_AddFamilyDetail(curFamily.GetName(), curFamily.GetID(), curFamily.GetLV(), curFamily.GetMoney(),  
 | 
                                          addFamilyMoney, curFamily.GetFamilyActiveValue(), addFamilyActiveValue)  
 | 
      
 | 
    #֪ͨ¿Í»§¶Ë  
 | 
    #curFamily.Broadcast_FamilyChange()  
 | 
    curPlayer.Sync_FamilyInfo()  
 | 
      
 | 
    #½ðÇ®±ä¸üʱ²Å֪ͨ  
 | 
    if addFamilyMoney != 0:  
 | 
        #֪ͨµØÍ¼·þÎñÆ÷ˢмÒ×åÊôÐÔ  
 | 
        SendPack_MapServer_PlayerFamilyRefresh(curFamily)  
 | 
    #Õ½ÃËÉý¼¶  
 | 
    #DoFamilyLvUp(curFamily)  
 | 
    return  
 | 
  
 | 
      
 | 
## ¸üмÒ×å³ÉÔ±Õ½Á¦  
 | 
def UpdFamilyMemberFightPower(familyID, playerID, fightPower):  
 | 
    curFamily = GameWorld.GetFamilyManager().FindFamily(familyID)  
 | 
    if not curFamily:  
 | 
        return  
 | 
      
 | 
    curMember = curFamily.FindMember(playerID)  
 | 
    if not curMember:  
 | 
        return  
 | 
      
 | 
    SetMemberFightPower(curMember, fightPower)  
 | 
    GameWorld.DebugLog("ÏÉÃ˳ÉÔ±Õ½Á¦±ä¸ü familyID=%s,fightPower=%s" % (familyID, fightPower), playerID)  
 | 
    AddFamilyIDToFightPowerChangeList(familyID)  
 | 
    return  
 | 
  
 | 
## A4 07 Éý¼¶¼Ò×å#tagCGFamilyLVUp  
 | 
#  @param index: Íæ¼ÒË÷Òý  
 | 
#  @param clientData: ¿Í»§¶Ë·â°ü½á¹¹Ìå  
 | 
#  @param tick: Ê±¼ä´Á  
 | 
#  @return None   
 | 
def OnPlayerLVUpFamily(index, clientData, tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_MapServer_PlayerLVUpFamily)(index, tick)  
 | 
    return  
 | 
  
 | 
#class   IPY_GFamilyLVUp  
 | 
#{  
 | 
#public:  
 | 
#    //ĿǰÎÞÒâÒå  
 | 
#    int      GetType();  
 | 
#};  
 | 
## Íæ¼ÒΪ¼Ò×åÉý¼¶  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def MapServer_PlayerLVUpFamily(index, tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_MapServer_PlayerLVUpFamily)(index, tick)  
 | 
    return  
 | 
  
 | 
## Íæ¼ÒΪ¼Ò×åÉý¼¶  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __Func_MapServer_PlayerLVUpFamily(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    curPlayerID = curPlayer.GetPlayerID()  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
      
 | 
    if curFamily == None:  
 | 
        #jiazu_pan_161795 <n color="255,255,0">¶Ô²»Æð,ÄãδӵÓмÒ×å,ÎÞ·¨ÌáÉý¼Ò×åµÈ¼¶!</n>   25  -   -  
 | 
        PlayerControl.NotifyCode(curPlayer, "jiazu_pan_161795")  
 | 
        return  
 | 
  
 | 
    curMember = curFamily.FindMember(curPlayerID)  
 | 
  
 | 
    if curMember == None:  
 | 
        GameWorld.ErrLog("FamilyLVUp -> Î޴˳ÉÔ±", curPlayerID)  
 | 
        return  
 | 
      
 | 
    #Ñé֤ȨÏÞ  
 | 
    if not GetFamilyMemberHasPow(curMember, ChConfig.Def_PurviewDictKey_CanFamilyLvUp):  
 | 
        PlayerControl.NotifyCode(curPlayer, "jiazu_liubo_272921")  
 | 
        return  
 | 
#===============================================================================  
 | 
#    if curMember.GetFamilyLV() != IPY_GameServer.fmlLeader:  
 | 
#        #XW_JZ_LvUpNoLeader <n color="255,255,0">¶Ô²»Æð,Äú²»ÊǼÒ×å×峤,ÎÞ·¨ÌáÉý¼Ò×åµÈ¼¶!</n>  25  -   -  
 | 
#        PlayerControl.NotifyCode(curPlayer, "XW_JZ_LvUpNoLeader")  
 | 
#        return  
 | 
#===============================================================================  
 | 
    DoFamilyLvUp(curFamily)  
 | 
  
 | 
      
 | 
    return  
 | 
  
 | 
## Ö´ÐмÒ×åÉý¼¶  
 | 
#  @param curFamily  
 | 
#  @return None  
 | 
def DoFamilyLvUp(curFamily):  
 | 
    #ÒѾÊÇ×î¸ßµÈ¼¶  
 | 
    if curFamily.GetLV() >= ChConfig.Def_Family_MaxLv:  
 | 
        #PlayerControl.NotifyCode(curPlayer, "jiazu_hwj35_0")  
 | 
        return  
 | 
      
 | 
    #[Éý¼¶ÐèÒª·±ÈÙ, ËùÐè×ʽð, ËùÐè×êʯ, ËùÐèµÍ¼¶ÁîÅÆÊý, ËùÐè¸ß¼¶ÁîÅÆÊý]  
 | 
    needMoney = GetFamilySetting(curFamily, ChConfig.Def_FamilySetting_LvUpCost)  
 | 
   
 | 
    if curFamily.GetMoney() < needMoney:  
 | 
        GameWorld.DebugLog("Õ½ÃË×ʽð²»×ã! needMoney=%s" % (needMoney))  
 | 
        return  
 | 
      
 | 
    #---¿ªÊ¼Éý¼¶---  
 | 
    curFamily.SetMoney(curFamily.GetMoney() - needMoney)  
 | 
  
 | 
    curFamily.SetLV(curFamily.GetLV() + 1)  
 | 
      
 | 
    #Êä³öϵͳÌáʾ  
 | 
    PlayerControl.FamilyNotify(curFamily.GetID(), 'jiazu_chenxin_272921', [needMoney])  
 | 
      
 | 
    #°ï»áÉý¼¶Á÷Ïò  
 | 
    DataRecordPack.DR_FamilyLvUp(curFamily.GetName(), curFamily.GetID(), curFamily.GetLV())  
 | 
      
 | 
    #¼Ç¼Éý¼¶ÐÅÏ¢  
 | 
    tick = GameWorld.GetGameWorld().GetTick()  
 | 
    leaderID = curFamily.GetLeaderID()  
 | 
    memLeader = curFamily.FindMember(leaderID)  
 | 
    leaderName = memLeader.GetName() if memLeader else '' #ĬÈϼÇÃËÖ÷Ãû×Ö  
 | 
    PlayerFamilyAction.AddFamilyActionNote(leaderName, curFamily.GetID(), ShareDefine.Def_ActionType_FamilyEvent,  
 | 
                                           [ShareDefine.Def_FamilyActionEvent_LVUP, curFamily.GetLV()], tick)  
 | 
    #XW_JZ_LvAdvance <n color="255,255,0">¼Ò×åµÄµÈ¼¶ÌáÉýÁË£¡</n>  25  -   -  
 | 
    #NotifyAllFamilyMemberMsg(curFamily, curPlayer, "XW_JZ_LvAdvance")  
 | 
      
 | 
    #֪ͨµØÍ¼·þÎñÆ÷ˢмÒ×åÊôÐÔ  
 | 
    SendPack_MapServer_PlayerFamilyRefresh(curFamily)  
 | 
      
 | 
    #֪ͨ¿Í»§¶Ë¼Ò×åÐÅÏ¢¸Ä±ä  
 | 
    curFamily.Broadcast_FamilyChange()  
 | 
      
 | 
    #ÊÀ½ç·þÎñÆ÷¼Ò×åÖØÐÂÅÅÐò  
 | 
    #GameWorld.GetFamilyManager().SortByLV()  
 | 
    DoFamilySort() # Éý¼¶Ö±½ÓÇ¿ÅÅÒ»´Î  
 | 
    return True  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## É¾³ý¼Ò×å£¬Íæ¼ÒÇ¿ÖÆÀ뿪¼Ò×å  
 | 
#  @param curPlayer Íæ¼ÒʵÀý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def PlayerForceLeaveFamily(curPlayer, tick):  
 | 
    if curPlayer == None:  
 | 
        return  
 | 
    #ÉèÖõ±Ìì¼ÓÈë¼Ò×å  
 | 
    GameWorld.GetPlayerManager().SetForbiddenEnterFamily(curPlayer.GetPlayerID(), True)  
 | 
    # Í¨ÖªmapÍæ¼Ò²»ÄܲμӼÒ×å»î¶¯  
 | 
    #NoteForbiddenFamilyAction(curPlayer)  
 | 
      
 | 
    #GameServerÍæ¼ÒÀ뿪¼Ò×å  
 | 
    curPlayer.SetFamily(None)  
 | 
    curPlayer.SetFamilyID(0)  
 | 
    #MapServerÍæ¼ÒÀ뿪¼Ò×å  
 | 
    curPlayer.MapServer_FamilyRefresh()  
 | 
    #֪ͨ¼Ò×å¿Æ¼¼ÐÅÏ¢£¬À뿪¼Ò×å£¬Íæ¼Ò×ÔÉí¿Æ¼¼²»ÊÜÓ°Ïì  
 | 
      
 | 
    #µ¯ÛÀÐÅÏ¢·â°ü  
 | 
    SendPackClientImpeachMsg(curPlayer, 0, 0)  
 | 
    PlayerTeam.OnTeamMemFamilyRefresh(curPlayer, 0)  
 | 
      
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## Í¨ÖªmapÍæ¼Ò²»ÄܲμӼÒ×å»î¶¯  
 | 
#  @param curPlayer Íæ¼ÒʵÀý  
 | 
#  @return None  
 | 
def NoteForbiddenFamilyAction(curPlayer):  
 | 
    # Í¨ÖªmapÍæ¼Ò²»ÄܲμӼÒ×å»î¶¯  
 | 
    isForbid = GameWorld.GetPlayerManager().GetForbiddenEnterFamily(curPlayer.GetPlayerID())  
 | 
    msg = str(GameWorld.ToIntDef(isForbid, 0))  
 | 
    curPlayer.MapServer_QueryPlayerResult(0, 0, 'ForbiddenFamilyAction', msg, len(msg))  
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## µ±Íæ¼Ò»»Ïߣ¬ÒªÍ¬²½¸øÍæ¼Ò×îеļÒ×åÐÅÏ¢  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def OnPlayerChangeMap(curPlayer, tick):  
 | 
    #ͬ²½¸øÍæ¼Ò, ×îеļÒ×åÐÅÏ¢(¼Ò×åµÈ¼¶Ë¢ÐÂ)  
 | 
    curPlayer.MapServer_FamilyRefresh()  
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## µÇ¼Âß¼  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def PlayerLoginRefreshFamily(curPlayer, tick):  
 | 
    SyncFakeFamilyInfo(curPlayer)  
 | 
    SyncCreatFamilyTimes(curPlayer)  
 | 
    familyID = curPlayer.GetFamilyID()  
 | 
    curFamily = None  
 | 
      
 | 
    #Íæ¼ÒûÓмÒ×å  
 | 
    #Ôٴμì²éÒ»´Î, Íæ¼ÒµÄ¼Ò×åÊÇ·ñ´æÔÚ  
 | 
    #2009.6.27  
 | 
    #bugÆðÔ´ÓÚ:  
 | 
    #Êý¾ÝÖеÄtagDBPlayer±íµÄFamilyID×Ö¶ÎΪ0, µ«ÊÇtagPlayerFamilyÖл¹ÓÐËû  
 | 
    #ÓÚÊÇËûÀ뿪¼Ò×åÁË  
 | 
    #ÓÚ½ñÈ¥µôÁ˲»ºÍгµÄË«ÏòÁ´Ìõ  
 | 
    #Ö±½ÓÔÚÊý¾ÝÖÐÕÒ, Èç¹ûÄÜÕÒµ½Õâ¸öÈË, ÄÇôÕâ¸öÍæ¼Ò¾ÍÓмÒ×å  
 | 
    #·ÀÖ¹ÔËÐдÎÊý¹ý¶à  
 | 
    for i in range(2):  
 | 
        if familyID == 0:  
 | 
            curPlayerFamily = GameWorld.GetFamilyManager().FindPlayerFamilyIndex(curPlayer.GetPlayerID())  
 | 
            if curPlayerFamily == None:  
 | 
                return  
 | 
              
 | 
            #Íæ¼ÒÈÔÈ»ÓмÒ×å, ²¹¾È  
 | 
            familyID = curPlayerFamily.GetFamilyID()  
 | 
            GameWorld.Log('Íæ¼Ò(%s)ÈÔÈ»ÓмÒ×å(%s), ²¹¾È' % (curPlayer.GetPlayerID(), familyID))  
 | 
            curPlayer.SetFamilyID(familyID)  
 | 
              
 | 
      
 | 
        #Íæ¼ÒµÇ¼, Ë¢Ð¼Ò×å  
 | 
        familyManager = GameWorld.GetFamilyManager()  
 | 
        curFamily = familyManager.FindFamily(familyID)  
 | 
        if curFamily == None:  
 | 
            PlayerForceLeaveFamily(curPlayer, tick)  
 | 
            GameWorld.Log("PlayerLoginRefreshFamily -> Íæ¼ÒÀ뿪¼Ò×å = %s" % (familyID) , curPlayer.GetPlayerID())  
 | 
            familyID = 0  
 | 
            continue  
 | 
              
 | 
      
 | 
        #ÔÚ¼Ò×åÖÐÕÒµ½Õâ¸öÍæ¼Ò, ¿´¿´ÓÐûÓÐÕâ¸öÈË(Õâ¸öÈËÔÚÀëÏß¹ý³ÌÖÐÓпÉÄܱ»Ìß³ö)  
 | 
        curMember = curFamily.FindMember(curPlayer.GetPlayerID())  
 | 
        if curMember == None:  
 | 
            #Íæ¼ÒÒѾ±»Ìß³ö  
 | 
            PlayerForceLeaveFamily(curPlayer, tick)  
 | 
            GameWorld.Log("PlayerLoginRefreshFamily -> Íæ¼Ò±»Ìß³ö¼Ò×å = %s" % (familyID) , curPlayer.GetPlayerID())  
 | 
            familyID = 0  
 | 
            continue  
 | 
      
 | 
      
 | 
    #Ë͸øÍæ¼Ò¼Ò×åÐÅÏ¢  
 | 
    curPlayer.SetPlayerGetFamilyInfoTick(tick)  
 | 
      
 | 
    #ÕâÈË»¹ÔÚ¼Ò×åÖÐ  
 | 
    curPlayer.SetFamily(curFamily)  
 | 
    curMember.SetPlayer(curPlayer)  
 | 
      
 | 
    if not PlayerControl.GetIsTJG(curPlayer):  
 | 
        #ÉÏÏßÖØÖÃÀëÏßʱ¼äΪ0, ·ÇÍÑ»ú¹Ò²ÅÉèÖà  
 | 
        curMember.SetExattr2(0)  
 | 
        curPlayer.Sync_FamilyInfo()  
 | 
      
 | 
    curPlayer.MapServer_FamilyRefresh()  
 | 
    curMember = GetPlayerFamilyMember(curPlayer)  
 | 
    if curMember and GetFamilyMemberHasPow(curMember, ChConfig.Def_PurviewDictKey_CanCall):  
 | 
        PlayerFamilyAction.ViewFamilyRequestInfo(curPlayer)  
 | 
      
 | 
    #XW_JZ_LeaguerOnline <n color="0,190,255">{%S1%}</n><n color="255,255,0">ÉÏÏßÁË£¡</n>    25  -   -  
 | 
    NotifyAllFamilyMemberMsg(curFamily, curPlayer, "XW_JZ_LeaguerOnline", [curPlayer.GetName()], False)  
 | 
      
 | 
    # °ïÖ÷µ¯ÛÀ´¦Àí  
 | 
    #LeaderImpeachOnLogin(curPlayer)  
 | 
      
 | 
    PlayerRefresh(curPlayer, tick)  
 | 
      
 | 
    GameWorldFamilyWar.OnPlayerLogin(curFamily, curPlayer)  
 | 
      
 | 
    # ÃËÖ÷ÉÏÏß´¦Àí  
 | 
    if curMember.GetFamilyLV() == IPY_GameServer.fmlLeader:  
 | 
        OnFamilyLeaderLogin(curPlayer, curFamily)  
 | 
    return  
 | 
  
 | 
def OnFamilyLeaderLogin(curPlayer, curFamily):  
 | 
    ## ÃËÖ÷µÇ¼´¦Àí  
 | 
    __DoFamilyMixServerLogicOnLeaderLogin(curPlayer, curFamily)  
 | 
    return  
 | 
  
 | 
def __DoFamilyMixServerLogicOnLeaderLogin(curPlayer, curFamily):  
 | 
    ## ºÏ·þÏÉÃËÃËÖ÷µÇ¼´¦Àí  
 | 
      
 | 
    isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer)  
 | 
    if not isMixServer:  
 | 
        return  
 | 
    lastMixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_LastMixServerDay)  
 | 
    familyID = curFamily.GetID()  
 | 
    familyMixServerDay = GetFamilyMixServerDay(curFamily)  
 | 
    if familyMixServerDay == lastMixServerDay:  
 | 
        GameWorld.DebugLog("ÒѾ´¦Àí¹ýÏÉÃËÃËÖ÷ºÏ·þµÇ¼Âß¼! lastMixServerDay=%s" % (lastMixServerDay), familyID)  
 | 
        return  
 | 
    SetFamilyMixServerDay(curFamily, lastMixServerDay)  
 | 
    GameWorld.Log("´¦ÀíºÏ·þÏÉÃËÃËÖ÷µÇ¼! lastMixServerDay=%s" % (lastMixServerDay), familyID)  
 | 
      
 | 
    mailItemList = IpyGameDataPY.GetFuncEvalCfg("MixServerMail", 4)  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    detailDict = {}  
 | 
    GameWorld.Log("    ·¢ËͺϷþÃËÖ÷רÊô²¹³¥Óʼþ! familyID=%s,mailItemList=%s" % (familyID, mailItemList), playerID)  
 | 
    PlayerCompensation.SendMailByKey("MixServer2", [playerID], mailItemList, detail=detailDict)  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
## Íæ¼ÒÏÂÏß¼Ò×åË¢ÐÂÂß¼  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def PlayerLogoffRefreshFamily(curPlayer, tick):  
 | 
    familyID = curPlayer.GetFamilyID()  
 | 
    if familyID == 0:  
 | 
        #Íæ¼ÒûÓмÒ×å  
 | 
        return  
 | 
      
 | 
    family = curPlayer.GetFamily()  
 | 
    if family == None:  
 | 
        return  
 | 
      
 | 
    curMember = family.FindMember(curPlayer.GetPlayerID())  
 | 
      
 | 
    if not curMember:  
 | 
        GameWorld.Log('###Íæ¼Ò¼Ò×åÒì³££¬Íæ¼Ò = %s,ÓмÒ×å = %s£¬¼Ò×åÖÐÎÞ·¨²éÕÒ´ËÍæ¼Ò' % (curPlayer.GetPlayerID() , curPlayer.GetFamilyID()))  
 | 
        return  
 | 
      
 | 
    curMember.SetPlayer(None)  
 | 
      
 | 
    #XW_JZ_LeaguerLeaveline  <n color="0,190,255">{%S1%}</n><n color="255,255,0">ÏÂÏßÁË£¡</n>    25  -   -  
 | 
    NotifyAllFamilyMemberMsg(family, curPlayer, "XW_JZ_LeaguerLeaveline", [curPlayer.GetName()], False)  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
## Ë¢Ð¼Ò×å³ÉÔ±»ù±¾ÐÅÏ¢  
 | 
#  @param curMember ¼Ò×åÍæ¼Ò  
 | 
#  @param curPlayer ÕæÊµÍæ¼Ò  
 | 
#  @return None  
 | 
#  @remarks Ë¢Ð¼Ò×å³ÉÔ±»ù±¾ÐÅÏ¢  
 | 
def RefreshFamilyMemberBaseMsg(curMember, curPlayer):  
 | 
    curMember.SetName(curPlayer.GetName())  
 | 
    curMember.SetLV(curPlayer.GetLV())  
 | 
    curMember.SetReincarnationLv(curPlayer.GetReincarnationLv())  
 | 
    curMember.SetJob(curPlayer.GetJob())  
 | 
    curMember.SetOperateInfo(curPlayer.GetOperateInfo())  
 | 
    curMember.SetOfficialRank(curPlayer.GetOfficialRank())  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
## Íæ¼ÒˢР 
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def PlayerRefresh(curPlayer, tick):  
 | 
    #»ñµÃIPY_PlayerFamilyʵÀý  
 | 
    curMember = GetPlayerFamilyMember(curPlayer)  
 | 
      
 | 
    if curMember == None:  
 | 
        return  
 | 
      
 | 
    RefreshFamilyMemberBaseMsg(curMember, curPlayer)  
 | 
    #¼Ò×峤¾³½ç  
 | 
    family = curPlayer.GetFamily()  
 | 
    if family.GetLeaderID() == curPlayer.GetID():  
 | 
        family.SetLeaderOfficialRank(curPlayer.GetOfficialRank())  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
##Ë¢ÐÂÍæ¼Ò¼Ò×å»îÔ¾¶È  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param value ÊýÖµ  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks Ë¢ÐÂÍæ¼Ò¼Ò×å»îÔ¾¶È  
 | 
def ReFreshPlayerFamilyActiveValue(curPlayer, value):  
 | 
    #»ñµÃIPY_PlayerFamilyʵÀý  
 | 
    curMember = GetPlayerFamilyMember(curPlayer)  
 | 
      
 | 
    if curMember == None:  
 | 
        return  
 | 
    #GameWorld.DebugLog('ÉèÖóÉÔ±Íæ¼Ò¼Ò×å»îÔ¾¶È value=%s'%value)   
 | 
    curMember.SetFamilyActiveValue(value)  
 | 
    return  
 | 
  
 | 
def ReFreshPlayerFamilyTotalActiveValue(curPlayer, addValue):  
 | 
    '''ÉèÖóÉÔ±ÀúÊ·¹±Ï×¶È'''  
 | 
    curMember = GetPlayerFamilyMember(curPlayer)  
 | 
      
 | 
    if curMember == None:  
 | 
        return  
 | 
    #GameWorld.DebugLog('ÉèÖóÉÔ±ÀúÊ·¹±Ï×¶È value=%s'%addValue)  
 | 
    curValue = curMember.GetExattr1()  
 | 
    curMember.SetExattr1(min(curValue+addValue, ChConfig.Def_UpperLimit_DWord))  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
##´ÓIPY_Player»ñµÃIPY_PlayerFamily  
 | 
# @param curPlayer IPY_PlayerʵÀý  
 | 
# @return IPY_PlayerFamilyʵÀý»òNone  
 | 
# @remarks ´ÓIPY_Player»ñµÃIPY_PlayerFamily  
 | 
def GetPlayerFamilyMember(curPlayer):  
 | 
    family = curPlayer.GetFamily()  
 | 
    if family == None:  
 | 
        return  
 | 
  
 | 
    return family.FindMember(curPlayer.GetPlayerID())  
 | 
#---------------------------------------------------------------------  
 | 
## É¾³ý¼Ò×å  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def DeleteFamily(curPlayer, tick):  
 | 
    family = curPlayer.GetFamily()  
 | 
    #Íæ¼ÒÎÞ¼Ò×å  
 | 
    if not family:  
 | 
        return  
 | 
      
 | 
    #-------Ö´ÐÐɾ³ýÂß¼  
 | 
    DoLogic_DeleteFamily(curPlayer , family , tick)  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
## É¾³ý¼Ò×å  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param family µ±Ç°¼Ò×å  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def DoLogic_DeleteFamily(curPlayer, family, tick):  
 | 
    #ɾ³ý¼Ò×åËùÓгÉÔ±  
 | 
    #½«Éæ¼°µ½C++ÖÐÁбíɾ³ýµÄ¹¦ÄÜ,ͳһ¸Ä³É -> ¸´ÖÆPyÁбíºó,È»ºó½øÐÐɾ³ýÂß¼ (ÒòWhileÓм¸Âʽ«µ¼ÖÂËÀËø)  
 | 
    member_List = []  
 | 
    for index in range(family.GetCount()):  
 | 
        player = family.GetAt(index)  
 | 
        member_List.append(player)  
 | 
      
 | 
    for familyMember in member_List:  
 | 
        tagPlayer = familyMember.GetPlayer()  
 | 
        family.DeleteMember(familyMember.GetPlayerID())  
 | 
        #Íæ¼Ò²»ÔÚÏß  
 | 
        if not tagPlayer:  
 | 
            continue  
 | 
          
 | 
        #Íæ¼ÒÔÚÏß, ÉèÖÃÕâ¸öÍæ¼ÒµÄÊôÐÔ  
 | 
        PlayerForceLeaveFamily(tagPlayer, tick)  
 | 
      
 | 
    #Êä³öÒ»ÌõÐÅÏ¢¼Ç¼  
 | 
    if curPlayer != None:  
 | 
        GameWorld.Log('Íæ¼ÒID = %s, Íæ¼ÒÃû = %s, É¾³ý¼Ò×å =%s' % (curPlayer.GetID(), curPlayer.GetName(), family.GetID()))  
 | 
      
 | 
    #ɾ³ýÕâ¸ö¼Ò×å  
 | 
    __DelFamily(curPlayer, family)  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
## É¾³ý¼Ò×å  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param family µ±Ç°¼Ò×å  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __DelFamily(curPlayer, family):  
 | 
    familyID = family.GetID()  
 | 
    familyName = family.GetName()  
 | 
    familyWarRank = GetFamilyWarRank(family)  
 | 
      
 | 
    if curPlayer != None:  
 | 
        #92£¬Íæ¼Ò×ÔÐнâÉ¢Íþ  
 | 
        DataRecordPack.DR_DismissFamilyByPlayer(curPlayer.GetAccID(), curPlayer.GetPlayerID(),  
 | 
                                                curPlayer.GetName(), familyName, familyID,  
 | 
                                                family.GetMoney(), family.GetLV(),  
 | 
                                                family.GetHornor(), family.GetPoint())  
 | 
          
 | 
    else:  
 | 
        #Á÷Ïò206£¬ÏµÍ³½âÉ¢°ï»á  
 | 
        DataRecordPack.DR_DismissFamilyBySystem(familyName, familyID, family.GetMoney(),  
 | 
                                                 family.GetLV(), family.GetHornor(), family.GetPoint())  
 | 
          
 | 
    #ɾ³ý¼Ò×å   
 | 
    GameWorld.GetFamilyManager().DelFamily(familyID)  
 | 
      
 | 
    #ÖØÐÂÅÅÐò¼Ò×å  
 | 
    #GameWorld.GetFamilyManager().SortByLV()  
 | 
    if familyID in PyGameData.g_sortFamilyIDList:  
 | 
        PyGameData.g_sortFamilyIDList.remove(familyID) # Ö±½Ó´ÓÅÅÐòÁбíÖÐÒÆ³ý, ²»ÐèÒªÖØÐÂÅÅÐò  
 | 
          
 | 
    #¼Ò×å¿Æ¼¼É¾³ý, ¸ÄΪµØÍ¼Ö±½Ó´¦Àí, ÔÝÆÁ±Î  
 | 
    #PlayerFamilyTech.DelFamilyTechData(familyID)  
 | 
      
 | 
    #ɾ³ý¼Ò×åÐÐΪÊý¾Ý  
 | 
    PlayerFamilyAction.ClearFamilyAction(familyID)  
 | 
    #Çå¿Õ±¦¿âÎïÆ·  
 | 
    PyDataManager.GetFamilyStoreItemManager().DelFamilyStoreItemAll(familyID)  
 | 
    #ÏÉÃËÁªÈü  
 | 
    GameWorldFamilyWar.OnDeleteFamily(familyID, familyWarRank)  
 | 
    #ÏÉÃ˺ì°ü  
 | 
    PlayerFamilyRedPacket.DelRedPackByFamilyID(familyID)  
 | 
    SyncFakeFamilyInfo()  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
## ÉèÖüÒ×åÁìÐä  
 | 
#  @param curFamily µ±Ç°¼Ò×å  
 | 
#  @param familyMember ¼Ò×å³ÉÔ±  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def SetFamilyLeader(curFamily, familyMember):  
 | 
    #ÉèÖÃ×峤ÐÅÏ¢   
 | 
    curFamily.SetLeaderID(familyMember.GetPlayerID())  
 | 
    curFamily.SetLeaderName(familyMember.GetName())  
 | 
    curFamily.SetLeaderOfficialRank(familyMember.GetOfficialRank())  
 | 
    #ÉèÖÃ×峤ȨÏÞ  
 | 
    ChangeFamilyMemberLv(familyMember, IPY_GameServer.fmlLeader)  
 | 
    GameWorldFamilyWar.OnChangeFamilyLeader(curFamily.GetID(), familyMember.GetPlayerID())  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
##¸ü¸Ä¼Ò×å³ÉÔ±µÈ¼¶.  
 | 
# @param familyMember ¼Ò×å³ÉÔ±ÀàʵÀý IPY_PlayerFamily  
 | 
# @param changeFamilyLV ¼Ò×å³ÉÔ±µÈ¼¶ C++ö¾Ùenum TFamilyMemberLV  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks ¸ü¸Ä¼Ò×å³ÉÔ±µÈ¼¶.  
 | 
def ChangeFamilyMemberLv(familyMember, changeFamilyLV, isJoin=False):  
 | 
    befFamilyLV = familyMember.GetFamilyLV()  
 | 
      
 | 
    #¸Ä±ä¼Ò×å³ÉÔ±µÈ¼¶  
 | 
    familyMember.SetFamilyLV(changeFamilyLV)  
 | 
    #ÉèÖüÒ×å³ÉԱȨÏÞ  
 | 
    __SetFamilyMemberPurview(familyMember)  
 | 
         
 | 
    # ¼Ç¼¼Ò×åʼþ¼Ç¼ÐÅÏ¢  
 | 
    tick = GameWorld.GetGameWorld().GetTick()  
 | 
    changeType = ShareDefine.Def_FamilyMemberChange_Join if isJoin else ShareDefine.Def_FamilyMemberChange_FMLV  
 | 
    PlayerFamilyAction.AddFamilyActionNote(familyMember.GetName(), familyMember.GetFamilyID(), ShareDefine.Def_ActionType_FamilyEvent,  
 | 
                                           [ShareDefine.Def_FamilyActionEvent_MemberChange, changeType, changeFamilyLV, befFamilyLV], tick)  
 | 
      
 | 
    if befFamilyLV == changeFamilyLV:  
 | 
        return  
 | 
  
 | 
    # ±äΪ·ÇÆÕͨ³ÉÔ±£¬¸üÐÂÄ£ÐÍ×°±¸ÐÅÏ¢  
 | 
    if befFamilyLV == IPY_GameServer.fmlMember:  
 | 
        PlayerFamilyAction.UpdFamilyOfficerModelEquip(familyMember.GetFamilyID(), familyMember.GetPlayerID())  
 | 
          
 | 
    # ±äΪÆÕͨ³ÉÔ±£¬É¾³ýÄ£ÐÍ×°±¸ÐÅÏ¢  
 | 
    elif changeFamilyLV == IPY_GameServer.fmlMember:  
 | 
        PlayerFamilyAction.DelFamilyOfficerModelEquip(familyMember.GetFamilyID(), familyMember.GetPlayerID())  
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##ÉèÖüÒ×å³ÉԱȨÏÞ  
 | 
# @param familyMember ¼Ò×å³ÉÔ±ÀàʵÀý IPY_PlayerFamily  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks ÉèÖüÒ×å³ÉԱȨÏÞ  
 | 
def __SetFamilyMemberPurview(familyMember):  
 | 
    #ÐÞ¸ÄÉè¼Æ·½Ê½, °´È¨ÏÞ±í¶ÁÈ¡  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
##»ñÈ¡¼Ò×å³ÉÔ±ÊÇ·ñÓжÔÓ¦µÄȨÏÞ  
 | 
# @param familyMember ¼Ò×å³ÉÔ±ÀàʵÀý IPY_PlayerFamily  
 | 
# @param powID È¨ÏÞID ChConfig.Def_PurviewDictKey_  
 | 
# @return ²¼¶ûÖµ  
 | 
# @remarks »ñÈ¡¼Ò×å³ÉÔ±ÊÇ·ñÓжÔÓ¦µÄȨÏÞ  
 | 
def GetFamilyMemberHasPow(familyMember, powID):  
 | 
    powList = IpyGameDataPY.GetFuncEvalCfg('FamilyPurview')  
 | 
      
 | 
    if powID >= len(powList):  
 | 
        return False  
 | 
    needMemberLV = powList[powID]  
 | 
    return familyMember.GetFamilyLV() >= needMemberLV  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##»ñÈ¡Íæ¼ÒÊÇ·ñÓжÔÓ¦µÄ¼Ò×åȨÏÞ  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param powID È¨ÏÞID ChConfig.Def_PurviewDictKey_  
 | 
# @return ²¼¶ûÖµ  
 | 
# @remarks »ñÈ¡Íæ¼ÒÊÇ·ñÓжÔÓ¦µÄ¼Ò×åȨÏÞ  
 | 
def GetPlayerHasFamilyPow(curPlayer, powID):  
 | 
    curMember = GetPlayerFamilyMember(curPlayer)  
 | 
      
 | 
    if curMember == None:  
 | 
        GameWorld.ErrLog("GetPlayerHasFamilyPow -> ¼Ò×åÎ޴˳ÉÔ±", curPlayer.GetID())  
 | 
        return False  
 | 
      
 | 
    return GetFamilyMemberHasPow(curMember, powID)  
 | 
#---------------------------------------------------------------------  
 | 
## OnWeek´¥·¢  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def OnWeek(curPlayer):  
 | 
    #OnWeek´¥·¢  
 | 
    return  
 | 
  
 | 
#def RefreshState(curPlayer, type, value, tick):  
 | 
#    curFamily = curPlayer.GetFamily()  
 | 
#    if curFamily == None:  
 | 
#        return  
 | 
#      
 | 
#    curMember = curFamily.FindMember(curPlayer.GetPlayerID())  
 | 
#    if curMember == None:  
 | 
#        return  
 | 
#    if type == IPY_GameServer.CDBPlayerRefresh_FamilyHornor:  
 | 
#        curMember.SetHornor(value)  
 | 
#        return  
 | 
#    return  
 | 
  
 | 
#//////////////////////////////////////////////////////////////  
 | 
#//05 07 ¼ÆËã¼Ò×åÕ½½±Àø#tagGCalcFamilyWarResult  
 | 
#tagGCalcFamilyWarResult       *   GettagGCalcFamilyWarResult();  
 | 
#  
 | 
#class   IPY_GCalcFamilyWarResult  
 | 
#{  
 | 
#public:  
 | 
#    //½ø¹¥·½ID  
 | 
#    int      GetFamilyID();  
 | 
#    //·ÀÊØ·½ID  
 | 
#    int      GetVSFamilyID();  
 | 
#    //½ø¹¥·½ÊÇ·ñÓ®ÁË  
 | 
#    int      GetAttackerWin();  
 | 
#    //Õ¼ËþÊý  
 | 
#    int      GetTowerTaken()  
 | 
#};  
 | 
  
 | 
## ¼ÆËã¼Ò×åÕ½½±Àø  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def MapServer_FamilyWarCalcResult(index, tick):  
 | 
    GameWorld.ErrLog('´Ë½Ó¿Ú·ÏÆú')  
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
#===============================================================================  
 | 
# //0F 0C ÖØÃüÃû¼Ò×廨Ӧ#tagCRenameFamilyAnswer  
 | 
# tagCRenameFamilyAnswer       *   GettagCRenameFamilyAnswer();  
 | 
#   
 | 
# class   IPY_CRenameFamilyAnswer  
 | 
# {  
 | 
# public:  
 | 
#   
 | 
#    char *      GetFamilyName();  
 | 
# };  
 | 
#===============================================================================  
 | 
## ÖØÃüÃû¼Ò×廨Ӧ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def RenameFamilyAnswer(index , tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_RenameFamilyAnswer)(index , tick)  
 | 
    return  
 | 
  
 | 
## ÖØÃüÃû¼Ò×廨Ӧ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __Func_RenameFamilyAnswer(index , tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
      
 | 
    #ÑéÖ¤·â°üÃû×Ö£¬ÊÇ·ñ¿ÉÒÔ¸ü¸Ä  
 | 
    pack = IPY_GameServer.IPY_CRenameFamilyAnswer()  
 | 
    cFamilyName = pack.GetFamilyName()  
 | 
    RenameFamily(curPlayer, cFamilyName)  
 | 
    return  
 | 
  
 | 
def RenameFamily(curPlayer, familyName):  
 | 
    #C++¹ýÂ˿ոñ  
 | 
    familyName = GameWorld.GetGameWorld().GetCharTrim(familyName)  
 | 
      
 | 
    #Ö´ÐмÒ×åÖØÃüÃûÂß¼  
 | 
    result = __DoLogic_RenameFamilyAnswer(curPlayer , familyName)  
 | 
      
 | 
    #֪ͨ¸ÄÃû½á¹û  
 | 
    curPlayer.Sync_FamilyRenameResult(familyName, result)  
 | 
    #ʧ°ÜÒ²´«»ØµØÍ¼½â³ý¸ÄÃûËø  
 | 
    if result != 1:  
 | 
        curPlayerID = curPlayer.GetPlayerID()  
 | 
        curPlayerMapID = GameWorld.GetQueryPlayerMapID(curPlayer)  
 | 
        msgStr = str([curPlayerID, ''])  
 | 
        GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, curPlayerID, curPlayerMapID, 'FamilyNameRefresh',  
 | 
                                            msgStr, len(msgStr),  
 | 
                                                curPlayer.GetRouteServerIndex())  
 | 
    return  
 | 
  
 | 
## Ö´ÐÐÖØÃüÃûÂß¼  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param familyName ÖØÃüÃû  
 | 
#  @return True or 0Òì³£ or 1³É¹¦ 2:δͨ¹ýÔà×Ö·ûÑéÖ¤ 3:¼Ò×åÃû×ÖÖÐÓзǷ¨×Ö·û 4:¼Ò×åÒѾ´æÔÚ  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __DoLogic_RenameFamilyAnswer(curPlayer , familyName):  
 | 
    #Åж¨ÊÇ·ñ¿ÉÒÔ¸ü¸Ä¼Ò×åÃû×Ö   
 | 
    if not __CheckCanRenameFamilyName(curPlayer):  
 | 
        return 0  
 | 
      
 | 
    #·â°üÃû×Ö´íÎó£¬ÎÞ·¨¸ÄÃû 0: Òì³£ 1£º³É¹¦, 2:δͨ¹ýÔà×Ö·ûÑéÖ¤ 3:¼Ò×åÃû×ÖÖÐÓзǷ¨×Ö·û 4:¼Ò×åÒѾ´æÔÚ  
 | 
    checkFamilyName = CheckRenameFamilName(curPlayer , familyName)  
 | 
      
 | 
    #Èç¹ûδ³É¹¦£¬·µ»Ø½á¹û  
 | 
    if checkFamilyName != 1:  
 | 
        return checkFamilyName  
 | 
      
 | 
    #ÉÏÃæÒѾÑéÖ¤¹ýÁË£¬¼Ò×å¿Ï¶¨´æÔÚµÄ  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
    curFamilyID = curFamily.GetID()  
 | 
    curPlayerID = curPlayer.GetID()  
 | 
#    curFamilyTrig = PlayerDBGSEvent.FindDBGSTrig_ByEventID(curFamilyID , PlayerDBGSEvent.Def_Key_RenameFamily)  
 | 
#      
 | 
#    if not curFamilyTrig:  
 | 
#        #¸Ã¼Ò×åÎÞ¸ÄÃûʼþ , Ìí¼Ó¸ÄÃûʼþ  
 | 
#        renameTrig = PlayerDBGSEvent.AddDBGSTrig_ByEventID(curFamilyID , PlayerDBGSEvent.Def_Key_RenameFamily)  
 | 
#        renameTrig.SetIsEvent(True)  
 | 
#    else:  
 | 
#        #δ¸ÄÃû¹ý  
 | 
#        curFamilyTrig.SetIsEvent(True)  
 | 
          
 | 
    #------------¸ÄÃû³É¹¦ÁË  
 | 
    oldName = curFamily.GetName()  
 | 
    curFamily.SetName(familyName)  
 | 
      
 | 
    #֪ͨ¼Ò×åˢР 
 | 
    curFamily.Broadcast_FamilyChange()  
 | 
      
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
      
 | 
    #ÏÉÃËÁªÈü  
 | 
    GameWorldFamilyWar.OnRenameFamily(curFamilyID, familyName)  
 | 
      
 | 
    #֪ͨ¼Ò×åÕ½µØÍ¼£¬Ë¢ÐÂÃû×Ö  
 | 
    #playerManager.MapServer_QueryPlayer(0, 0, curFamilyID,   
 | 
    #                    ShareDefine.Def_FamilyWar_FightMapID, 'FamilyWarRename',   
 | 
    #                    '%s'%(familyName), len(familyName))  
 | 
      
 | 
    #֪ͨ¼Ò×åÔÚÏß³ÉÔ±£¬¸üмÒ×åÍ·¶¥Í¼±ê  
 | 
    memberIDList = []  
 | 
    for index in range(0 , curFamily.GetCount()):  
 | 
        curMember = curFamily.GetAt(index)  
 | 
        curMemberID = curMember.GetPlayerID()  
 | 
        __OnFamilyNameChange(curMemberID, familyName)  
 | 
        memberIDList.append(curMemberID)  
 | 
        player = playerManager.FindPlayerByID(curMemberID)  
 | 
        #Íæ¼Ò²»ÔÚÏß  
 | 
        if not player:  
 | 
            continue  
 | 
          
 | 
        curPlayerMapID = GameWorld.GetQueryPlayerMapID(player)  
 | 
          
 | 
        if not curPlayerMapID:  
 | 
            continue  
 | 
          
 | 
        msgStr = str([curPlayerID, familyName])  
 | 
        playerManager.MapServer_QueryPlayer(0, 0, curMemberID, curPlayerMapID, 'FamilyNameRefresh',  
 | 
                                            msgStr, len(msgStr),  
 | 
                                                player.GetRouteServerIndex())  
 | 
      
 | 
    PlayerCompensation.SendMailByKey('FamilyNameChange', memberIDList, [], [oldName, familyName])      
 | 
    PlayerControl.WorldNotify(0, 'Family_ChangeName', [oldName, familyName])  
 | 
    return True  
 | 
  
 | 
## ¼ì²âÊÇ·ñÄܼÒ×å¸ÄÃû£¨È¨ÏÞ£©  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @return None or True  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __CheckCanRenameFamilyName(curPlayer):  
 | 
    #--------ÑéÖ¤¼Ò×å¸ÄÃû¿ª¹ØÊÇ·ñ´ò¿ª  
 | 
#    canRenameFamilyName = ReadChConfig.GetEvalChConfig('CanRenameFamilyName')  
 | 
#      
 | 
#    if not canRenameFamilyName:  
 | 
#        return  
 | 
      
 | 
    #--------ÑéÖ¤Íæ¼ÒÊÇ·ñÓÐȨÏÞ¸ÄÃû¼Ò×å  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
      
 | 
    if not curFamily:  
 | 
        return  
 | 
      
 | 
    curMember = curFamily.FindMember(curPlayer.GetPlayerID())  
 | 
      
 | 
    if not curMember:  
 | 
        return  
 | 
  
 | 
    if curMember.GetFamilyLV() != IPY_GameServer.fmlLeader:  
 | 
        return  
 | 
      
 | 
    #--------ÑéÖ¤¸Ã¼Ò×åÊÇ·ñÒѾ¸ÄÃû¹ý ¿ÉÒÔÎÞÏÞ¸Ä  
 | 
#    familyTrig = PlayerDBGSEvent.FindDBGSTrig_ByEventID(curFamily.GetID() , PlayerDBGSEvent.Def_Key_RenameFamily)  
 | 
#      
 | 
#    if not familyTrig:  
 | 
#        return True  
 | 
#      
 | 
#    #ÒѾ¸Ä¹ýÃû×ÖÁË  
 | 
#    if familyTrig.GetIsEvent():  
 | 
#        return  
 | 
      
 | 
    return True  
 | 
#---------------------------------------------------------------------  
 | 
## ¼ì²âÄÜ·ñ¸ÄÃû  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param familyName ¼Ò×åÃû  
 | 
#  @return 1£º³É¹¦, 2:δͨ¹ýÔà×Ö·ûÑéÖ¤ 3:¼Ò×åÃû×ÖÖÐÓзǷ¨×Ö·û 4:¼Ò×åÒѾ´æÔÚ  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckRenameFamilName(curPlayer, familyName):  
 | 
    #δͨ¹ýÔà»°ÁбíÅж¨  
 | 
    if DirtyList.IsWordForbidden(familyName):  
 | 
        return 2  
 | 
      
 | 
    if len(familyName) <= 0 or len(familyName) > ChConfig.Def_CreatFamily_MaxStr:  
 | 
        return 3  
 | 
      
 | 
    #------------²é¿´ÊÇ·ñÓÐͬÃûµÄ¼Ò×å  
 | 
    findFamily = GameWorld.GetFamilyManager().FindFamilyByName(familyName)  
 | 
      
 | 
    if findFamily != None :  
 | 
          
 | 
        if findFamily.GetID() == curPlayer.GetFamilyID():  
 | 
            #ÔÊÐíÐ޸ijÉ×Ô¼º¼Ò×åÔÀ´µÄÃû×Ö  
 | 
            return 1  
 | 
          
 | 
        else:  
 | 
            return 4  
 | 
      
 | 
    return 1  
 | 
#---------------------------------------------------------------------  
 | 
## Í¨¹ýID·µ»Ø¼Ò×åÃû³Æ  
 | 
#  @param familyID ¼Ò×åID  
 | 
#  @return str  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GetFamilyName_ByID(familyID):  
 | 
    family = GameWorld.GetFamilyManager().FindFamily(familyID)  
 | 
          
 | 
    if family:  
 | 
        return family.GetName()  
 | 
          
 | 
    return ''  
 | 
  
 | 
## Í¨¹ý¼Ò×åID·µ»ØÃËÖ÷Ãû  
 | 
#  @param familyID ¼Ò×åID  
 | 
#  @return str  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GetLeaderName_ByFamilyID(familyID):  
 | 
    family = GameWorld.GetFamilyManager().FindFamily(familyID)  
 | 
    if family:  
 | 
        return family.GetLeaderName()  
 | 
    return ''  
 | 
  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## ¼ì²éÍæ¼ÒÊÇ·ñÊÇÖ¸¶¨¼Ò×åµÄÖ¸¶¨È¨ÏÞ  
 | 
#  @param playerID Íæ¼ÒID  
 | 
#  @param family ¼Ò×å  
 | 
#  @param familyLV ¼Ò×åµÈ¼¶  
 | 
#  @return None or True  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckPlayerFamilyLV(playerID , family , familyLV):  
 | 
    if not family:  
 | 
        return  
 | 
      
 | 
    curMember = family.FindMember(playerID)  
 | 
      
 | 
    if not curMember:  
 | 
        return  
 | 
      
 | 
    if curMember.GetFamilyLV() != familyLV:  
 | 
        return  
 | 
      
 | 
    return True  
 | 
  
 | 
def GetPlayerFamilyMemberLVEx(familyID, playerID):  
 | 
    curFamily = GameWorld.GetFamilyManager().FindFamily(familyID)  
 | 
    if not curFamily:  
 | 
        return 0  
 | 
      
 | 
    curMember = curFamily.FindMember(playerID)  
 | 
    if not curMember:  
 | 
        return 0  
 | 
    # IPY_GameServer.fmlMember  
 | 
    return curMember.GetFamilyLV()  
 | 
  
 | 
## »ñÈ¡Íæ¼Ò¼Ò×åµÄ³ÉÔ±µÈ¼¶  
 | 
def GetPlayerFamilyMemberLV(curPlayer):  
 | 
    family = curPlayer.GetFamily()  
 | 
    if not family:  
 | 
        return 0  
 | 
      
 | 
    curMember = family.FindMember(curPlayer.GetPlayerID())  
 | 
    if not curMember:  
 | 
        return 0  
 | 
      
 | 
    return curMember.GetFamilyLV()  
 | 
  
 | 
def GetPlayerJoinFamilyTime(curPlayer):  
 | 
    #»ñÈ¡Íæ¼Ò¼ÓÈëÏÉÃËʱ¼ä  
 | 
    curMember = GetPlayerFamilyMember(curPlayer)  
 | 
    if not curMember:  
 | 
        return 0  
 | 
    return GetMemberJoinTime(curMember)  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##¼Ò×å¹ýÌì  
 | 
# @param tick Ê±¼ä´Á  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks ¼Ò×å¹ýÌì  
 | 
def FamilyOnDay(tick):  
 | 
    #---ÉèÖÃËùÓÐÍæ¼Ò¿ÉÒÔÔٴμÓÈë¼Ò×å---  
 | 
    GameWorld.GetPlayerManager().ClearForbiddenEnterFamily()  
 | 
    #---¿Û³ýµØÍ¼ÉÏËùÓмÒ×åµÄά»¤·Ñ---  
 | 
    familyManager = GameWorld.GetFamilyManager()  
 | 
    #ɾ³ý¼Ò×åÁÐ±í  
 | 
    delFamilyList = []  
 | 
      
 | 
    for i in range(0, familyManager.GetCount()):  
 | 
        family = familyManager.GetAt(i)  
 | 
              
 | 
        familyMoney = family.GetMoney()  
 | 
          
 | 
#        useMoney = GetFamilySetting(family, ChConfig.Def_FamilySetting_SystemLostMoney)  
 | 
#          
 | 
#        #¼Ò×å×ʽð²»×ã, ½âÉ¢  
 | 
#        if familyMoney < useMoney:  
 | 
#            family.SetMoney(0)  
 | 
#            delFamilyList.append(family)  
 | 
#            continue  
 | 
        #¶à¾ÃûÈËÉÏÏߣ¬½âÉ¢  
 | 
        offlineDay = GetLastOnlineMemberOfflineTime(family)  
 | 
        GameWorld.DebugLog('    ÏÉÃË%s %sÌìûÈËÉÏÏßÁË'%(family.GetID(), offlineDay))  
 | 
        if offlineDay >= IpyGameDataPY.GetFuncCfg('AutoDelFamily'):  
 | 
            delFamilyList.append(family)  
 | 
            continue  
 | 
          
 | 
        #Çå³ý¼Ò×åÐüÉÍÈÎÎñÐÅÏ¢  
 | 
        PlayerFamilyAction.ClearFamilyAction(family.GetID(), ShareDefine.Def_ActionType_FamilyArrest)  
 | 
           
 | 
        #ɾ³ý3ÌìǰÉêÇë¼ÓÈëµÄÐÅÏ¢  
 | 
        PlayerFamilyAction.ClearFamilyAction(family.GetID(), ShareDefine.Def_ActionType_FamilyAdd,  
 | 
                                                   ChConfig.Def_Family_ClearRequestAddNote_Day)  
 | 
          
 | 
        #´Ë´¦²»Í¨ÖªµØÍ¼·þÎñÆ÷¼Ò×å×ʽð±ä¸ü  
 | 
#        family.SetMoney(familyMoney - useMoney)  
 | 
#        if useMoney > 0:  
 | 
#            #°ï»áÈÕ³£Î¬³ÖÏûºÄ{%S1%}ÒøÁ½°ï»á×ʽð  
 | 
#            PlayerControl.FamilyNotify(family.GetID(), 'jiazu_lhs_272921', [useMoney])  
 | 
          
 | 
        #֪ͨ¿Í»§¶ËˢР 
 | 
        family.Broadcast_FamilyChange()  
 | 
        #֪ͨµØÍ¼·þÎñÆ÷ˢР 
 | 
        SendPack_MapServer_PlayerFamilyRefresh(family)  
 | 
        #Õ½ÃËÉý¼¶  
 | 
        #DoFamilyLvUp(family)  
 | 
  
 | 
    for delFamily in delFamilyList:  
 | 
        #¶Ô²»Æð, ÄúµÄ°ï»áÒò×ʽð²»×ã½âÉ¢  
 | 
        PlayerControl.FamilyNotify(delFamily.GetID(), 'jiazu_hwj35_59724')  
 | 
        #°ï»á×ʽð²»×ã½âÉ¢  
 | 
        GameWorld.Log('%s¼Ò×åÒò×ʽð²»×ãά»¤, ½âÉ¢ ' % (delFamily.GetID()))  
 | 
        DoLogic_DeleteFamily(None, delFamily, tick)  
 | 
      
 | 
    #ÖØÖüÒ×åÏà¹Ø»î¶¯Ã¿ÈÕ¿ªÆô״̬  
 | 
    __SetFamilyActivityDayStateValue(0)  
 | 
    return  
 | 
  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##¼Ò×å¹ýÖÜ  
 | 
# @param tick Ê±¼ä´Á  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks ¼Ò×å¹ýÖÜ  
 | 
def FamilyOnWeek(tick):  
 | 
      
 | 
    #---¼ÆËãÉÏÖܼÒ×å»îÔ¾¶È---  
 | 
    familyManager = GameWorld.GetFamilyManager()  
 | 
    for i in range(0, familyManager.GetCount()):  
 | 
        family = familyManager.GetAt(i)  
 | 
        familyID = family.GetID()  # ¼Ò×åID  
 | 
          
 | 
        familyActiveValue = family.GetFamilyActiveValue()  # ÀۼƻîÔ¾Öµ  
 | 
        family.SetLastWeekFamilyActiveValue(familyActiveValue)  # ÉèÖÃÉÏÖÜ»îÔ¾Öµ  
 | 
        family.SetFamilyActiveValue(0)  
 | 
        #Çå³ý¹«¸æ´ÎÊý  
 | 
        SetFamilyBroadcastCnt(family, 0)  
 | 
        #Çå³ý±¾ÖÜÈÎÎñÒÑ»ñµÃ×ʽðÊýÁ¿  
 | 
        SetCurWeekMissionMoney(family, 0)  
 | 
        for j in xrange(family.GetCount()):  
 | 
            member = family.GetAt(j)  
 | 
            #ÔÏÈÊǵØÍ¼Íæ¼ÒÉÏÏߺóÖØÖ㬵¼ÖÂÍæ¼Ò²»ÉÏÏßÖܹ±Ï×ÏÔʾ֮ǰµÄ£¬¹ÌÔÚ´ËÖØÖà  
 | 
            member.SetFamilyActiveValue(0)  
 | 
          
 | 
          
 | 
        #֪ͨµØÍ¼·þÎñÆ÷ˢмÒ×åÊôÐÔ  
 | 
        SendPack_MapServer_PlayerFamilyRefresh(family)  
 | 
        #oss¼Ç¼ÉÏÖܼÒ×åÐÅÏ¢  
 | 
        GameWorld.Log("familyActiveValue = %s" % familyActiveValue)  
 | 
        DataRecordPack.DR_FamilyActiveValueByOnWeek(familyID, family.GetName(), familyActiveValue)  
 | 
          
 | 
        #Çå³ý¼Ò×åboss¸±±¾ÐÅÏ¢  
 | 
        PlayerFamilyBoss.FamilyBossFBOnWeek(familyID)  
 | 
          
 | 
    return  
 | 
  
 | 
def FamilyOnHour():  
 | 
    familyManager = GameWorld.GetFamilyManager()  
 | 
    for i in xrange(familyManager.GetCount()):  
 | 
        family = familyManager.GetAt(i)  
 | 
        #×Ô¶¯´«Î»  
 | 
        __AutoChangeLeader(family)  
 | 
          
 | 
        __AutoChangeFamilyJobLV(family)  
 | 
    return  
 | 
  
 | 
def __AutoChangeFamilyJobLV(family):  
 | 
    ##¿ª·þ2ÌìÄÚд´½¨µÄÏÉÃË£¬ÏµÍ³×Ô¶¯ÎªÏÉÃ˰²ÅÅÁ½Î»¸±ÃËÖ÷  
 | 
    familyID = family.GetID()  
 | 
    openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay)  
 | 
    if openServerDay >= IpyGameDataPY.GetFuncCfg('FairyFMZ'):  
 | 
        #GameWorld.DebugLog('×Ô¶¯ÎªÏÉÃ˰²ÅÅÁ½Î»¸±ÃËÖ÷ ¿ª·þÌ쳬¹ý familyID=%s'%familyID)  
 | 
        return  
 | 
      
 | 
    if familyID in PyGameData.g_forbidAutoViceleaderFamily:  
 | 
        #GameWorld.DebugLog('×Ô¶¯ÎªÏÉÃ˰²ÅÅÁ½Î»¸±ÃËÖ÷ ±»½ûÖ¹ familyID=%s'%familyID)  
 | 
        return  
 | 
    createTime = family.GetCreateTime()  
 | 
    pastHour = GameWorld.GetPastHour(createTime)  
 | 
    if pastHour < IpyGameDataPY.GetFuncCfg('FairyFMZ', 2):  
 | 
        #GameWorld.DebugLog('×Ô¶¯ÎªÏÉÃ˰²ÅÅÁ½Î»¸±ÃËÖ÷ ½¨ÃË䳬¹ýXСʱ familyID=%s,pastHour=%s'%(familyID, pastHour))  
 | 
        return  
 | 
    if (pastHour - IpyGameDataPY.GetFuncCfg('FairyFMZ', 2)) % IpyGameDataPY.GetFuncCfg('FairyFMZ', 3) != 0:  
 | 
        GameWorld.DebugLog('×Ô¶¯ÎªÏÉÃ˰²ÅÅÁ½Î»¸±ÃËÖ÷ ¼ä¸ôûµ½ familyID=%s,pastHour=%s'%(familyID, pastHour))  
 | 
        return  
 | 
      
 | 
    tofmlv = IPY_GameServer.fmlViceLeader  
 | 
    viceLeaderCnt = 0 #¸±ÃËÖ÷ÊýÁ¿  
 | 
    changeMemberList = []  
 | 
    for i in xrange(family.GetCount()):  
 | 
        familyMember = family.GetAt(i)  
 | 
        if familyMember.GetFamilyLV() == tofmlv:  
 | 
            viceLeaderCnt += 1  
 | 
            continue  
 | 
        if familyMember.GetFamilyLV() < tofmlv:  
 | 
            changeMemberList.append(familyMember)  
 | 
          
 | 
    maxCnt = GetFamilySetting(family, ChConfig.Def_FamilyPowLvChangeFamilySettingDict[tofmlv])  
 | 
    #GameWorld.DebugLog('×Ô¶¯ÎªÏÉÃ˰²ÅÅÁ½Î»¸±ÃËÖ÷ familyID=%s,viceLeaderCnt=%s,changeMemberList=%s'%(familyID, viceLeaderCnt, changeMemberList))  
 | 
    if viceLeaderCnt >= maxCnt or not changeMemberList:  
 | 
        return  
 | 
      
 | 
    if familyID not in PyGameData.g_autoViceleaderDict:  
 | 
        PyGameData.g_autoViceleaderDict[familyID] = []  
 | 
          
 | 
    changeMemberList.sort(cmp=CmpAutoMemberSort)  
 | 
    for i, member in enumerate(changeMemberList):  
 | 
        if viceLeaderCnt + i >= maxCnt:  
 | 
            break  
 | 
        ChangeFamilyMemberLv(member, tofmlv)  
 | 
        playerID = member.GetPlayerID()  
 | 
        if playerID not in PyGameData.g_autoViceleaderDict[familyID]:  
 | 
            PyGameData.g_autoViceleaderDict[familyID].append(playerID)  
 | 
        GameWorld.Log('×Ô¶¯ÎªÏÉÃ˰²ÅŸ±ÃËÖ÷ familyID=%s,playerID=%s'%(familyID, playerID))  
 | 
          
 | 
    return  
 | 
  
 | 
def CmpAutoMemberSort(member1, member2):  
 | 
    ## ÅÅÐò¹æÔò: µÈ¼¶>Õ½Á¦>ÈëÃËÏȺó  
 | 
    ret = -cmp(member1.GetLV(), member2.GetLV())  
 | 
    if ret == 0:  
 | 
        ret = -cmp(GetMemberFightPower(member1), GetMemberFightPower(member2))  
 | 
        if ret == 0:  
 | 
            return cmp(GetMemberJoinTime(member1), GetMemberJoinTime(member2))  
 | 
    return ret  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##֪ͨµØÍ¼·þÎñÆ÷, Íæ¼Ò¼Ò×åÊôÐÔˢР 
 | 
# @param curFamily ¼Ò×åʵÀý  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks IPY_MFamilyRefresh  
 | 
def SendPack_MapServer_PlayerFamilyRefresh(curFamily):  
 | 
#===============================================================================  
 | 
#    µ±¼Ò×åÒÔÏÂȨÏÞ±ä¸üʱҪ֪ͨµØÍ¼·þÎñÆ÷ IPY_MFamilyRefresh  
 | 
#    GetFamilyLV  
 | 
#    GetFamilyName  
 | 
#    GetFamilyMemberLV  
 | 
#    GetFamilyMoney  
 | 
#    GetLastWeekFamilyActiveValue  
 | 
#===============================================================================  
 | 
    #֪ͨËùÓÐÔÚÏßÍæ¼Ò, ¼Ò×åµÈ¼¶Ë¢Ð  
 | 
    for i in range(0, curFamily.GetCount()):  
 | 
        curMember = curFamily.GetAt(i)  
 | 
        curPlayer = curMember.GetPlayer()  
 | 
          
 | 
        if curPlayer == None:  
 | 
            #²»ÔÚÏß  
 | 
            continue  
 | 
          
 | 
        curPlayer.MapServer_FamilyRefresh()  
 | 
          
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
## »ñÈ¡¼Ò×åÅäÖÃÐÅÏ¢  
 | 
#  @param curFamily: ¼Ò×åʵÀý  
 | 
#  @param param: ÅäÖñíË÷Òý  
 | 
#  @return  
 | 
def GetFamilySetting(curFamily, index):  
 | 
    if index not in ChConfig.FamilySettingDict:  
 | 
        return 0  
 | 
    familyLv = curFamily.GetLV()  # ¼Ò×åµÈ¼¶  
 | 
    curFamilyLvSetting = IpyGameDataPY.GetIpyGameData('Family', familyLv)  
 | 
    #familySetting = ReadChConfig.GetEvalChConfig("FamilySetting")  
 | 
      
 | 
      
 | 
    #curFamilyLvSetting = familySetting.get(familyLv, [])  
 | 
    if not curFamilyLvSetting:  
 | 
        GameWorld.ErrLog("key = %s not in tagFamily.txt" % familyLv)  
 | 
        return 0  
 | 
    keyStr = ChConfig.FamilySettingDict[index]  
 | 
    return getattr(curFamilyLvSetting, keyStr)  
 | 
  
 | 
  
 | 
#===============================================================================  
 | 
# //A4 01  ²é¿´¼Ò×åµÚNÒ³#tagCGViewFamilyPage  
 | 
#   
 | 
# struct    tagCGViewFamilyPage  
 | 
# {  
 | 
#    tagHead        Head;  
 | 
#    WORD        PageIndex;        //²éѯҳÊý  
 | 
#    BYTE        ShowCount;        //ÿҳÏÔʾÊýÁ¿  
 | 
#    BYTE        SortRulex;        //ÅÅÐò¹æÔò  
 | 
#    BYTE        ViewType;        //²é¿´ÀàÐÍ  
 | 
# };  
 | 
#===============================================================================  
 | 
## ²é¿´ËùÓмÒ×åµÚNÒ³(py×Ô¶¨Òå·â°ü)  
 | 
#  @param index: Íæ¼ÒË÷Òý  
 | 
#  @param clientData: ¿Í»§¶Ë·â°ü½á¹¹Ìå  
 | 
#  @param tick: Ê±¼ä´Á  
 | 
#  @return None  
 | 
def PyViewFamilyPage(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
      
 | 
    viewPage = clientData.PageIndex  # ²éѯҳÊý  
 | 
    showCnt = clientData.ShowCount   # Ã¿Ò³ÏÔʾÊýÁ¿  
 | 
#===================================================================================================  
 | 
#    sortRule = clientData.SortRulex  # ÅÅÐò¹æÔò  
 | 
#    viewType = clientData.ViewType   # ²é¿´ÀàÐÍ  
 | 
#    if viewType not in [ShareDefine.TViewFamilyType_FamilyWar, ShareDefine.TViewFamilyType_AddFamily]:  
 | 
#        return  
 | 
#   
 | 
#    curPlayer.SetViewFamilyState(viewType)  
 | 
#===================================================================================================  
 | 
    #Ö´ÐÐÂß¼  
 | 
    Sync_AllFamilyInfo(curPlayer, viewPage, showCnt)  
 | 
    return  
 | 
  
 | 
  
 | 
## ²éѯÊÇ·ñ»¹ÔÚÉêÇëµÄ°ï»áÉóºËÁбíÖÐ  
 | 
## @param curPlayer:Íæ¼ÒʵÀý  
 | 
#  @param familyList:ÉêÇëµÄ¼Ò×åÁÐ±í  
 | 
#  @return: ²éѯ½á¹û[¼Ò×åID, ÊÇ·ñÔڸüÒ×åµÄÉóºËÁбíÖÐ]    
 | 
def QueryRequestIsFamily(curPlayer, familyList):  
 | 
  
 | 
    allFamilyActionManager = GameWorld.GetFamilyActionManager()    
 | 
      
 | 
    resultList = []  
 | 
    for familyID in familyList:  
 | 
        familyAction = allFamilyActionManager.GetFamilyAction(familyID, ShareDefine.Def_ActionType_FamilyAdd)  
 | 
          
 | 
        isExist = False  # ÊÇ·ñÔÚÉóºËÁбíÖÐ  
 | 
        for index in range(0, familyAction.Count()):  
 | 
            familyActionData = familyAction.At(index)  
 | 
            playerID = familyActionData.GetValue1()  # ID  
 | 
              
 | 
            if curPlayer.GetID() != playerID:  
 | 
                continue  
 | 
              
 | 
            isExist = True  
 | 
              
 | 
        resultList.append([familyID, isExist])  
 | 
      
 | 
    return resultList  
 | 
  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## »ñµÃ°ïÖ÷ÏÂÏßÁ˶à¾Ã  
 | 
#  @param familyID:¼Ò×åid  
 | 
#  @return: ÏÂÏß³ÖÐøÊ±¼ä  
 | 
def GetLeaderOfflineTime(curFamily):     
 | 
    if curFamily == None:  
 | 
        return 0  
 | 
  
 | 
    leaderID = curFamily.GetLeaderID()  
 | 
  
 | 
    curMember = curFamily.FindMember(leaderID)      
 | 
    if curMember == None:  
 | 
        GameWorld.Log("GetLeaderOfflineTime->FindMember, None;%s" % leaderID)  
 | 
        return 0  
 | 
    offLineTimeNum = curMember.GetExattr2()  
 | 
    if not offLineTimeNum:  
 | 
        return 0  
 | 
    offLineTime = GameWorld.ChangeTimeNumToStr(offLineTimeNum)  
 | 
    return GameWorld.GetPastHour(offLineTime)  
 | 
  
 | 
def GetLastOnlineMemberOfflineTime(family):  
 | 
    '''»ñȡսÃ˶à¾ÃûÈËÉÏÏßÁË'''  
 | 
    offLineTime = 0  
 | 
    for i in range(0, family.GetCount()):  
 | 
        member = family.GetAt(i)   
 | 
        offLineTimeNum = member.GetExattr2()  
 | 
        if not offLineTimeNum:  
 | 
            #ÓÐÈËÔÚÏßÖ±½Ó·µ»Ø  
 | 
            return 0  
 | 
        if not offLineTime:  
 | 
            offLineTime = offLineTimeNum  
 | 
        else:  
 | 
            offLineTime = max(offLineTime, offLineTimeNum)  
 | 
    if not offLineTime:  
 | 
        return 0  
 | 
    offLineTime = GameWorld.ChangeTimeNumToStr(offLineTime)  
 | 
    return GameWorld.GetPastDay(offLineTime)  
 | 
  
 | 
def __AutoChangeLeader(curFamily):  
 | 
    '''×Ô¶¯´«Î»'''  
 | 
    # »ñµÃ°ïÖ÷ÏÂÏßÁ˶à¾Ã(Сʱ)  
 | 
    leaderOffLineTime = GetLeaderOfflineTime(curFamily)  
 | 
    GameWorld.DebugLog('°ïÖ÷ÏÂÏßÁË%sСʱ'%leaderOffLineTime, curFamily.GetID())  
 | 
    if leaderOffLineTime < IpyGameDataPY.GetFuncCfg('AutoChangeLeader'):  
 | 
        return  
 | 
      
 | 
    toMember = None #×îÖÕ´«Î»ÈË  
 | 
    toMember1 = None #48СʱÄÚÓÐÉÏÏßµÄ×î¸ß¹±Ï׳ÉÔ±  
 | 
    toMember2 = None #×î¸ß¹±Ï׳ÉÔ±  
 | 
    for i in range(0, curFamily.GetCount()):  
 | 
        member = curFamily.GetAt(i)  
 | 
        if member.GetFamilyLV() == IPY_GameServer.fmlLeader:  
 | 
            continue  
 | 
        if member.GetFamilyLV() == IPY_GameServer.fmlViceLeader: #¸±ÃËÖ÷  
 | 
            toMember = member  
 | 
            break  
 | 
        if not toMember2:  
 | 
            toMember2 = member  
 | 
        elif toMember2.GetExattr1() < member.GetExattr1():  
 | 
            toMember2 = member  
 | 
  
 | 
        offLineHour = GameWorld.GetPastHour(GameWorld.ChangeTimeNumToStr(member.GetExattr2())) if member.GetExattr2() else 0  
 | 
        #GameWorld.DebugLog('memberID=%s ÀëÏß%sСʱ£¬ÀúÊ·¹±Ï×¶È%s'%(member.GetPlayerID(), offLineHour, member.GetExattr1()))  
 | 
        if offLineHour < 48:  
 | 
            if not toMember1:  
 | 
                toMember1 = member  
 | 
            elif toMember1.GetExattr1() < member.GetExattr1():  
 | 
                toMember1 = member  
 | 
      
 | 
    toMember = toMember or toMember1 or toMember2  
 | 
    if not toMember:  
 | 
        return  
 | 
    GameWorld.DebugLog('ÏÉÃËfamilyID=%s,leaderID=%s´«Î»¸øtoMember=%s'%(curFamily.GetID(), curFamily.GetLeaderID(), toMember.GetPlayerID()))  
 | 
    #´«Î»  
 | 
    #°Ñ×峤½µÎªÆÕͨ³ÉÔ±  
 | 
    leaderID = curFamily.GetLeaderID()  
 | 
    leaderMember = curFamily.FindMember(leaderID)  
 | 
    ChangeFamilyMemberLv(leaderMember, IPY_GameServer.fmlMember)  
 | 
    NotifyAllFamilyMemberMsg(curFamily, 0, "XW_JZ_AppointFamily", [curFamily.GetLeaderName(), IPY_GameServer.fmlMember])  
 | 
      
 | 
    #ÉèÖÃÄ¿±êÍæ¼ÒÊôÐÔ, °ÑÄ¿±êÌáʾΪ×峤  
 | 
    SetFamilyLeader(curFamily, toMember)  
 | 
      
 | 
    #֪ͨ¼Ò×å³ÉÔ±ÐÅÏ¢  
 | 
    NotifyAllFamilyMemberMsg(curFamily, None, "XW_JZ_AppointFamily", [toMember.GetName(), IPY_GameServer.fmlLeader])  
 | 
     
 | 
      
 | 
    familyID = curFamily.GetID()  
 | 
    familyName = curFamily.GetName()  
 | 
    DataRecordPack.DR_ImpeachChangeFamilyJob(familyID, familyName, toMember.GetPlayerID(),  
 | 
                                             toMember.GetName(), toMember.GetFamilyLV())  
 | 
      
 | 
    DataRecordPack.DR_ImpeachChangeFamilyJob(familyID, familyName, leaderMember.GetPlayerID(),  
 | 
                                             leaderMember.GetName(), leaderMember.GetFamilyLV())  
 | 
     
 | 
    leaderPlayer = toMember.GetPlayer()  
 | 
    if leaderPlayer:  
 | 
        leaderPlayer.MapServer_FamilyRefresh()  
 | 
    return  
 | 
  
 | 
#----°ïÖ÷µ¯ÛÀ-----------------------------------------------------------------  
 | 
## °ïÖ÷ÔÚÏßÇé¿ö֪ͨ  
 | 
#  @param curPlayer:Íæ¼ÒʵÀý  
 | 
#  @return: None  
 | 
def LeaderImpeachOnLogin(curPlayer):  
 | 
      
 | 
    curFamily = curPlayer.GetFamily()  
 | 
    if curFamily == None:  
 | 
        return  
 | 
      
 | 
    # »ñµÃµ¯ÛÀÊý¾ÝÐÅÏ¢  
 | 
    familyId = curFamily.GetID()  
 | 
    notePlayerID, noteTime = GetLeaderImpeachData(familyId)  
 | 
      
 | 
    # °ïÖ÷ÉÏÏß  
 | 
    if curPlayer.GetID() == curFamily.GetLeaderID():  
 | 
          
 | 
        # Ã»Óе¯ÛÀ¼Ç¼  
 | 
        if notePlayerID <= 0:  
 | 
            return  
 | 
          
 | 
        # Çå³ýµ¯ÛÀ¼Ç¼  
 | 
        ClearFamilyImpeach(curFamily, notePlayerID, noteTime)  
 | 
                 
 | 
        curMember = curFamily.FindMember(notePlayerID)  
 | 
        if curMember == None:  
 | 
            return  
 | 
          
 | 
        # Ìáʾµ¯ÛÀÎÞЧ  
 | 
        NotifyAllFamilyMemberMsg(curFamily, curPlayer, "jiazu_xyj_202580",  
 | 
                                  [curFamily.GetLeaderName(), curMember.GetName()])  
 | 
        return  
 | 
      
 | 
    # °ïÖ÷µ¯ÛÀʱ¼ä  
 | 
    impeachTime = ReadChConfig.GetEvalChConfig('FamilyLeaderImpeach')  
 | 
      
 | 
    # »ñµÃ°ïÖ÷ÏÂÏßÁ˶à¾Ã(Сʱ)  
 | 
    leaderOffLineTime = GetLeaderOfflineTime(curFamily)  
 | 
      
 | 
    # Ð¡ÓÚÌáʾʱ¼ä£¬²»´¦Àí  
 | 
    if leaderOffLineTime <= impeachTime[ImpeachNoteTime]:  
 | 
        return  
 | 
      
 | 
    # »¹²»Äܵ¯ÛÀ£¬µ«¿ÉÒÔ¸øÓèÌáÐÑ  
 | 
    if leaderOffLineTime <= impeachTime[CanImpeachTime]:  
 | 
        # ÌáʾÀëÏßÌìÊý  
 | 
        PlayerControl.NotifyCode(curPlayer, 'jiazu_xyj_0', [int(leaderOffLineTime / 24)])  
 | 
        return  
 | 
      
 | 
    curMember = curFamily.FindMember(notePlayerID)  
 | 
    if curMember:  
 | 
        playerName = curMember.GetName()  
 | 
        #ÓÐÈËʹÓõ¯ÛÀ·ûÌáʾ  
 | 
        PlayerControl.NotifyCode(curPlayer, 'jiazu_xyj_861048', [playerName, playerName])  
 | 
    else:  
 | 
        # ´ïµ½µ¯ÛÀʱ¼ä£¬¸øÌáʾ  
 | 
        PlayerControl.NotifyCode(curPlayer, 'jiazu_xyj_31379')  
 | 
      
 | 
    # Í¨ÖªËùÓмÒ×å³ÉÔ±µ¯ÛÀÐÅÏ¢  
 | 
    SendClientImpeachMag(curPlayer, curFamily)  
 | 
    return  
 | 
  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## Ê¹Óõ¯ÛÀ·û  
 | 
#  @param curPlayer:Íæ¼ÒʵÀý  
 | 
#  @return: None  
 | 
def PlayerExecLeaderImpeach(curPlayer, tick):  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
    if curFamily == None:  
 | 
        return  
 | 
  
 | 
    # °ïÖ÷µ¯ÛÀÌáʾʱ¼ä£¬¿ÉÒÔʵÐе¯ÛÀʱ¼ä  
 | 
    impeachTime = ReadChConfig.GetEvalChConfig('FamilyLeaderImpeach')  
 | 
      
 | 
    # »¹²»Äܵ¯ÛÀ£¬µ«¿ÉÒÔ¸øÓèÌáÐÑ  
 | 
    if GetLeaderOfflineTime(curFamily) <= impeachTime[CanImpeachTime]:  
 | 
        PlayerControl.NotifyCode(curPlayer, 'jiazu_xyj_161795')  
 | 
        return  
 | 
      
 | 
    familyId = curFamily.GetID()  
 | 
    playerId = curPlayer.GetID()  
 | 
      
 | 
    # »ñµÃµ¯ÛÀÊý¾ÝÐÅÏ¢  
 | 
    notePlayerID, noteTime = GetLeaderImpeachData(familyId)  
 | 
      
 | 
    if notePlayerID == playerId:  
 | 
        PlayerControl.NotifyCode(curPlayer, 'jiazu_xyj_161795')  
 | 
        return  
 | 
              
 | 
    # ¼Ç¼µ¯ÛÀÐÅÏ¢  
 | 
    PlayerFamilyAction.AddFamilyActionNote(curFamily.GetName(), familyId,  
 | 
                                           ShareDefine.Def_ActionType_LeaderImpeachTime,  
 | 
                                            [playerId], tick)  
 | 
    # Í¨Öªmap¿Û³ýÎïÆ·  
 | 
    curPlayer.MapServer_QueryPlayerResult(0, 0, 'DelFamilyImpeachItem', '', 0)      
 | 
    # °ï»áÌáʾ  
 | 
    playerName = curPlayer.GetName()  
 | 
    NotifyAllFamilyMemberMsg(curFamily, curPlayer, "jiazu_xyj_861048", [playerName, playerName])  
 | 
  
 | 
    # Í¨ÖªËùÓмÒ×å³ÉÔ±µ¯ÛÀÐÅÏ¢  
 | 
    notePlayerID, noteTime = GetLeaderImpeachData(familyId)  
 | 
    SendClientAllMemberImpeachMag(curFamily, notePlayerID, noteTime)  
 | 
    return  
 | 
  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## »ñµÃµ¯ÛÀÊý¾ÝÐÅÏ¢  
 | 
#  @param familyId:Íæ¼Òid  
 | 
#  @return: None  
 | 
def GetLeaderImpeachData(familyId):  
 | 
    allFamilyActionManager = GameWorld.GetFamilyActionManager()    
 | 
    familyAction = allFamilyActionManager.GetFamilyAction(familyId, ShareDefine.Def_ActionType_LeaderImpeachTime)  
 | 
      
 | 
    # ÊÇ ×Ô¼ºµÄµ¯ÛÀ¼Ç¼£¬  
 | 
    if familyAction.Count() > 0:  
 | 
        familyActionData = familyAction.At(0)  
 | 
  
 | 
        return familyActionData.GetValue1(), int(familyActionData.GetTime())  
 | 
      
 | 
    return 0, 0  
 | 
  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## °ïÖ÷µ¯ÛÀʱÖÓµ÷Óà  
 | 
#  @param tick  
 | 
#  @return: None  
 | 
def OnLeaderImpeachTick(tick):  
 | 
      
 | 
    if not GameWorld.SetWorldDictKey(ChConfig.TYPE_LeaderImpeachTick, tick):  
 | 
        #¼ä¸ôδµ½  
 | 
        return  
 | 
      
 | 
    # °ïÖ÷µ¯ÛÀÌáʾʱ¼ä£¬¿ÉÒÔʵÐе¯ÛÀʱ¼ä, µ¯ÛÀÐè³ÖÐøÊ±¼ä  
 | 
    impeachTime = ReadChConfig.GetEvalChConfig('FamilyLeaderImpeach')  
 | 
      
 | 
    for i in range(0, GameWorld.GetFamilyManager().GetCount()):  
 | 
        family = GameWorld.GetFamilyManager().GetAt(i)  
 | 
          
 | 
        # »ñµÃµ¯ÛÀÊý¾ÝÐÅÏ¢family  
 | 
        notePlayerID, noteTime = GetLeaderImpeachData(family.GetID())  
 | 
        if notePlayerID <= 0:  
 | 
            continue  
 | 
      
 | 
        familyID = family.GetID()  
 | 
        curMember = family.FindMember(notePlayerID)  
 | 
        if curMember == None:  
 | 
            # Çå³ýµ¯ÛÀ¼Ç¼  
 | 
            ClearFamilyImpeach(family, notePlayerID, noteTime)  
 | 
            return  
 | 
          
 | 
        # Ê±¼äδµ½  
 | 
        offLineTime = GameWorld.ChangeTimeNumToStr(noteTime)  
 | 
        if GameWorld.GetPastSeconds(str(offLineTime)) < impeachTime[ImpeachLastTime]:  
 | 
            continue  
 | 
                  
 | 
        leaderID = family.GetLeaderID()  
 | 
        memLeader = family.FindMember(leaderID)  
 | 
          
 | 
        if memLeader == None:  
 | 
            GameWorld.ErrLog('OnLeaderImpeachTick: Can not find family leader')  
 | 
            return  
 | 
                  
 | 
        # µÈ¼¶´íÎó  
 | 
        createFamily_MinLV = IpyGameDataPY.GetFuncCfg('CreateFamilyMinLV')  
 | 
        if curMember.GetLV() < createFamily_MinLV or leaderID == notePlayerID:  
 | 
            # Çå³ýµ¯ÛÀ¼Ç¼  
 | 
            ClearFamilyImpeach(family, notePlayerID, noteTime)  
 | 
            return  
 | 
          
 | 
        leaderName = memLeader.GetName()  
 | 
        #NotifyAllFamilyMemberMsg(family, 0, "XW_JZ_LeaveFamily", [leaderName])  
 | 
          
 | 
        #ɾ³ýÍæ¼Ò  
 | 
        #family.DeleteMember(leaderID)    
 | 
        # ¼Ç¼µ¯ÛÀÍ˳öÐÅÏ¢  
 | 
        PlayerFamilyAction.AddFamilyActionNote(leaderName, familyID, ShareDefine.Def_ActionType_FamilyEvent,  
 | 
                                               [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_Impeach], tick)  
 | 
        #__DoPlayerLeaveFamilyByID(family, leaderID)  
 | 
        #tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(leaderID)  
 | 
          
 | 
        #ÈôÍæ¼ÒÔÚÏß, ÉèÖÃÕâ¸öÍæ¼ÒµÄÊôÐÔ  
 | 
        #PlayerForceLeaveFamily(tagPlayer, tick)  
 | 
          
 | 
        ChangeFamilyMemberLv(memLeader, IPY_GameServer.fmlMember) # Ô°ïÖ÷±äΪÆÕͨ³ÉÔ±  
 | 
        NotifyAllFamilyMemberMsg(family, 0, "XW_JZ_AppointFamily", [leaderName, IPY_GameServer.fmlMember])  
 | 
          
 | 
        #ImpeachNotifyInfoDict = ReadChConfig.GetEvalChConfig('ImpeachNotifyInfo')  
 | 
        #title = ImpeachNotifyInfoDict.get('title', '')  
 | 
        #content = ImpeachNotifyInfoDict.get('content', '')  
 | 
        #ÔÀ´°ïÖ÷²»ÔÚ£¬·¢Óʼþ֪ͨ±»È¡´ú  
 | 
        #PlayerMail.GSystemMail(leaderID , title , content%curMember.GetName() , tick)  
 | 
          
 | 
        familyName = family.GetName()  
 | 
        DataRecordPack.DR_ImpeachLeaveFamily(familyID, familyName, leaderID, leaderName)  
 | 
          
 | 
        #ÉèÖÃÄ¿±êÍæ¼ÒÊôÐÔ, °ÑÄ¿±êÌáʾΪ×峤  
 | 
        SetFamilyLeader(family, curMember)  
 | 
          
 | 
        #oss¼Ç¼×Ô¼ºÖ°Î»±ä¸ü  
 | 
        curFamilyLV = curMember.GetFamilyLV()  
 | 
        notePlayerName = curMember.GetName()  
 | 
        DataRecordPack.DR_ImpeachChangeFamilyJob(familyID, familyName, curMember.GetPlayerID(),  
 | 
                                                 notePlayerName, curFamilyLV)  
 | 
        #֪ͨ¼Ò×å³ÉÔ±ÐÅÏ¢,¹ã²¥          
 | 
        NotifyAllFamilyMemberMsg(family, 0, "XW_JZ_AppointFamily", [notePlayerName, curFamilyLV])  
 | 
        PlayerControl.WorldNotify(0, 'jiazu_xyj_272921', [notePlayerName, familyName])  
 | 
                  
 | 
        player = GameWorld.GetPlayerManager().FindPlayerByID(notePlayerID)   
 | 
        if player != None:  
 | 
            #֪ͨµØÍ¼·þÎñÆ÷¼Ò×åµÈ¼¶¸Ä±ä  
 | 
            player.MapServer_FamilyRefresh()  
 | 
              
 | 
            #Èç¹û²»¸æËß, ¿Í»§¶ËµÃ²»µ½¼Ò×åË¢ÐÂ, µ¼Ö²»´ò¿ª¼Ò×å½çÃæµÄʱºò, ²»ÄÜÖ±½Óµã»÷Í·ÏñÕÐÈË  
 | 
            if GetFamilyMemberHasPow(curMember, ChConfig.Def_PurviewDictKey_CanCall):  
 | 
                player.Sync_FamilyInfo()  
 | 
          
 | 
        family.Broadcast_FamilyChange()   
 | 
        # Çå³ýµ¯ÛÀ¼Ç¼  
 | 
        ClearFamilyImpeach(family, notePlayerID, noteTime)  
 | 
        continue  
 | 
      
 | 
    return  
 | 
  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## Í¨ÖªËùÓмÒ×å³ÉÔ±µ¯ÛÀÐÅÏ¢  
 | 
#  @param curFamily µ±Ç°¼Ò×å  
 | 
#  @param notePlayerID Ê¹Óõ¯ÛÀµÄÈË  
 | 
#  @param noteTime µ¯ÛÀ¿ªÊ¼Ê±¼ä  
 | 
#  @return None  
 | 
def SendClientAllMemberImpeachMag(curFamily, notePlayerID, noteTime):  
 | 
      
 | 
    if notePlayerID > 0:  
 | 
        # °ïÖ÷µ¯ÛÀʱ¼ä  
 | 
        impeachTime = ReadChConfig.GetEvalChConfig('FamilyLeaderImpeach')  
 | 
          
 | 
        # Ê±¼äδµ½  
 | 
        offLineTime = GameWorld.ChangeTimeNumToStr(noteTime)  
 | 
        noteTime = impeachTime[ImpeachLastTime] - GameWorld.GetPastSeconds(offLineTime)   
 | 
      
 | 
    #֪ͨËùÓмÒ×å³ÉÔ±, Õâ¸öÈ˼ÓÈëÁ˼Ò×å  
 | 
    for i in range(0, curFamily.GetCount()):  
 | 
        notifyMember = curFamily.GetAt(i)  
 | 
          
 | 
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(notifyMember.GetPlayerID())          
 | 
        if curPlayer == None:  
 | 
            continue  
 | 
  
 | 
        # µ¯ÛÀÐÅÏ¢·â°ü  
 | 
        SendPackClientImpeachMsg(curPlayer, notePlayerID, noteTime)  
 | 
    return  
 | 
  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## Í¨ÖªËùÓмÒ×å³ÉÔ±µ¯ÛÀÐÅÏ¢  
 | 
#  @param curPlayer   
 | 
#  @return None  
 | 
def SendClientImpeachMag(curPlayer, family):  
 | 
     
 | 
    # »ñµÃµ¯ÛÀÊý¾ÝÐÅÏ¢family  
 | 
    notePlayerID, noteTime = GetLeaderImpeachData(family.GetID())  
 | 
    if notePlayerID <= 0:  
 | 
        return  
 | 
  
 | 
    # °ïÖ÷µ¯ÛÀʱ¼ä  
 | 
    impeachTime = ReadChConfig.GetEvalChConfig('FamilyLeaderImpeach')  
 | 
      
 | 
    # Ê±¼äδµ½  
 | 
    offLineTime = GameWorld.ChangeTimeNumToStr(noteTime)  
 | 
    noteTime = impeachTime[ImpeachLastTime] - GameWorld.GetPastSeconds(offLineTime)   
 | 
    if noteTime <= 0:  
 | 
        return  
 | 
      
 | 
    # µ¯ÛÀÐÅÏ¢·â°ü  
 | 
    SendPackClientImpeachMsg(curPlayer, notePlayerID, noteTime)  
 | 
    return  
 | 
  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## µ¯ÛÀÐÅÏ¢·â°ü  
 | 
#  @param curPlayer µ±Ç°  
 | 
#  @param notePlayerID Ê¹Óõ¯ÛÀµÄÈË  
 | 
#  @param noteTime µ¯ÛÀ¿ªÊ¼Ê±¼ä  
 | 
#  @return None  
 | 
def SendPackClientImpeachMsg(curPlayer, notePlayerID, noteTime):  
 | 
#    packData = ChPyNetSendPack.tagFamilyImpeachData()  
 | 
#    packData.Clear()  
 | 
#  
 | 
#    packData.PlayerID = notePlayerID  
 | 
#    packData.StartTime = noteTime  
 | 
#    NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
    return  
 | 
  
 | 
  
 | 
## É¾³ýµ¯ÛÀÐÅÏ¢  
 | 
#  @param curFamily µ±Ç°¼Ò×å  
 | 
#  @param notePlayerID Ê¹Óõ¯ÛÀµÄÈË  
 | 
#  @param noteTime µ¯ÛÀ¿ªÊ¼Ê±¼ä  
 | 
#  @return None  
 | 
def ClearFamilyImpeach(curFamily, notePlayerID, noteTime):  
 | 
  
 | 
    # Óе¯ÛÀ¼Ç¼£¬ÒªÇå³ý  
 | 
    familyID = curFamily.GetID()  
 | 
    PlayerFamilyAction.ClearFamilyAction(familyID, ShareDefine.Def_ActionType_LeaderImpeachTime)  
 | 
            
 | 
    # Í¨ÖªËùÓмÒ×å³ÉÔ±µ¯ÛÀÐÅÏ¢  
 | 
    SendClientAllMemberImpeachMag(curFamily, 0, 0)  
 | 
    return  
 | 
  
 | 
      
 | 
#===============================================================================  
 | 
# //A4 02  ²é¿´ÉêÇëÈë»áµÄÍæ¼Ò #tagCGViewFamilyRequestInfo  
 | 
#   
 | 
# struct    tagCGViewFamilyRequestInfo  
 | 
# {  
 | 
#    tagHead        Head;  
 | 
# };  
 | 
#===============================================================================  
 | 
## ²é¿´ÉêÇë°ï»áµÄ³ÉÔ±ÐÅÏ¢  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param clientData ·â°üÊý¾Ý½á¹¹Ìå  
 | 
#  @param tick Ê±¼ä´Á  
 | 
#  @return None  
 | 
def ViewFamilyRequestInfo(index, clientPack, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    PlayerFamilyAction.ViewFamilyRequestInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
## ¿ªÆô¼Ò×åboss¸±±¾  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param clientData ·â°üÊý¾Ý½á¹¹Ìå  
 | 
#  @param tick Ê±¼ä´Á  
 | 
#  @return None  
 | 
def OpenFamilyBossFB(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    fbMapID = clientData.MapID  
 | 
    PlayerFamilyBoss.OpenFamilyBossFB(curPlayer, tick)  
 | 
    return  
 | 
#===============================================================================  
 | 
# //A4 06 ±ä¸ü¼Ò×å³ÉÔ±¼ÓÈëÉóºË·½Ê½#tagCGChangeFamilyAcceptJoinType  
 | 
#struct tagCGChangeFamilyAcceptJoinType  
 | 
#{  
 | 
#    tagHead        Head;      
 | 
#    BYTE        Type;  #0 Ä¬ÈÏÐèÒªÉóºË,1 ×Ô¶¯Í¬ÒâÉêÇë,2 ¾Ü¾øÉêÇë  
 | 
#};      
 | 
#===============================================================================  
 | 
## Çл»¼Ò×åÊÕÈËÉóºË·½Ê½  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param clientData ·â°üÊý¾Ý½á¹¹Ìå  
 | 
#  @param tick Ê±¼ä´Á  
 | 
#  @return None  
 | 
def ChangeFamilyAcceptJoinType(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    familyId = curPlayer.GetFamilyID()  
 | 
    if familyId <= 0:  
 | 
        return  
 | 
  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
    if curFamily == None:  
 | 
        return  
 | 
    curPlayerID = curPlayer.GetPlayerID()  
 | 
    curMember = curFamily.FindMember(curPlayerID)  
 | 
    if curMember == None:  
 | 
        return  
 | 
    if not GetFamilyMemberHasPow(curMember, ChConfig.Def_PurviewDictKey_CanCall):  
 | 
        return  
 | 
#    if curFamily.GetLeaderID() != curPlayer.GetID():  
 | 
#        #Ö»ÓмÒ×峤²ÅÓÐȨÏ޸ıäÊÕÈË·½Ê½  
 | 
#        return  
 | 
    #  
 | 
    if curFamily.GetAcceptJoin() == clientData.Type:  
 | 
        return  
 | 
    if clientData.Type > ShareDefine.FamilyAcceptJoin_Refuse:  
 | 
        return  
 | 
    curFamily.SetAcceptJoin(clientData.Type)  
 | 
    #Í¨ÖªÍæ¼Ò¼Ò×åÐÅÏ¢  
 | 
    curPlayer.Sync_FamilyInfo()  
 | 
    #֪ͨ¼Ò×å³ÉÔ± ¼Ò×åÐÅÏ¢¸Ä±ä  
 | 
    curFamily.Broadcast_FamilyChange()  
 | 
    return  
 | 
  
 | 
## µØÍ¼·þÎñÆ÷Ôö¼ÓÕ½ÃËÏà¹ØÐÅÏ¢Öµ  
 | 
#  @param curPlayer Íæ¼ÒʵÀý  
 | 
#  @param infoDict ÐÅÏ¢×Öµä  
 | 
#  @return   
 | 
def MapServer_PyAddFamilyInfoValue(curPlayer, infoDict):  
 | 
      
 | 
    if not curPlayer:  
 | 
        GameWorld.ErrLog('MapServer_PyAddFamilyInfoValue Player = None')  
 | 
        return  
 | 
  
 | 
    curPlayerID = curPlayer.GetPlayerID()  
 | 
    curFamily = curPlayer.GetFamily()  
 | 
      
 | 
    if curFamily == None:  
 | 
        GameWorld.Log("MapServer_PyAddFamilyInfoValue ->Íæ¼ÒûÓмÒ×å", curPlayerID)  
 | 
        return  
 | 
      
 | 
    curMember = curFamily.FindMember(curPlayerID)  
 | 
      
 | 
    if curMember == None:  
 | 
        GameWorld.Log("MapServer_PyAddFamilyInfoValue ->Î޴˳ÉÔ±", curPlayerID)  
 | 
        return  
 | 
      
 | 
    if not infoDict:  
 | 
        GameWorld.Log("MapServer_PyAddFamilyInfoValue ->ÎÞ¸üÐÂÐÅÏ¢!", curPlayerID)  
 | 
        return  
 | 
      
 | 
    GameWorld.DebugLog("MapServer_PyAddFamilyInfoValue ->infoDict=%s" % str(infoDict), curPlayerID)  
 | 
      
 | 
    isMapServerRefresh = False   
 | 
    #Õ½ÃËÉý¼¶  
 | 
    #DoFamilyLvUp(curFamily)  
 | 
      
 | 
    # Í¨Öª¿Í»§¶Ë  
 | 
    curFamily.Broadcast_FamilyChange()  
 | 
      
 | 
    # µØÍ¼Ë¢Ð  
 | 
    if isMapServerRefresh:  
 | 
        SendPack_MapServer_PlayerFamilyRefresh(curFamily)  
 | 
    return  
 | 
  
 | 
def __SetFamilyActivityDayStateValue(updValue):  
 | 
    ''' ÉèÖÃÕ½Ã˻½ñÌ쿪Æô״ֵ̬ '''  
 | 
    PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_FamilyActivityDayState, updValue)  
 | 
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_FamilyActivityDayState, updValue)  
 | 
    return  
 | 
  
 | 
def SetFamilyActivityDayOpen(activityType):  
 | 
    ''' ÉèÖÃÕ½Ã˶ÔÓ¦»î¶¯½ñÈÕ¿ªÆô¹ý '''  
 | 
    fadState = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_FamilyActivityDayState)  
 | 
    updState = fadState | pow(2, activityType)  
 | 
    __SetFamilyActivityDayStateValue(updState)  
 | 
    return  
 | 
  
 | 
def GetFamilyLeaderLV(familyID):  
 | 
    ''' »ñȡսÃËÃËÖ÷µÈ¼¶ '''  
 | 
    family = GameWorld.GetFamilyManager().FindFamily(familyID)  
 | 
    if not family:  
 | 
        return 0  
 | 
    leaderLV = 0  
 | 
    leaderID = family.GetLeaderID()  
 | 
    for i in range(0, family.GetCount()):  
 | 
        member = family.GetAt(i)  
 | 
        if member.GetPlayerID() == leaderID:  
 | 
            leaderLV = member.GetLV()  
 | 
            break  
 | 
    return leaderLV  
 | 
  
 | 
def AddFamilyIDToFightPowerChangeList(familyID):  
 | 
    if familyID not in PyGameData.g_fightPowerChangeFamilyIDList:  
 | 
        PyGameData.g_fightPowerChangeFamilyIDList.append(familyID)  
 | 
        GameWorld.DebugLog("ÏÉÃËÕ½Á¦±ä¸ü´ý´¦ÀíÁбí: fightPowerChangeFamilyIDList=%s" % PyGameData.g_fightPowerChangeFamilyIDList)  
 | 
    return  
 | 
  
 | 
def UpdFamilyTotalFightPower():  
 | 
    ## ¸üÐÂÏÉÃË×ÜÕ½Á¦  
 | 
    if not PyGameData.g_fightPowerChangeFamilyIDList:  
 | 
        #GameWorld.DebugLog("²»ÐèÒª¸üÐÂÏÉÃË×ÜÕ½Á¦!")  
 | 
        return  
 | 
          
 | 
    GameWorld.DebugLog("¸üÐÂÏÉÃË×ÜÕ½Á¦ fightPowerChangeFamilyIDList=%s" % PyGameData.g_fightPowerChangeFamilyIDList)  
 | 
    familyManager = GameWorld.GetFamilyManager()  
 | 
    for familyID in PyGameData.g_fightPowerChangeFamilyIDList:      
 | 
        family = familyManager.FindFamily(familyID)  
 | 
        if not family:  
 | 
            continue  
 | 
          
 | 
        totalFightPower = 0  
 | 
        for i in xrange(family.GetCount()):  
 | 
            member = family.GetAt(i)  
 | 
            totalFightPower += GetMemberFightPower(member)  
 | 
        SetFamilyTotalFightPower(family, totalFightPower)  
 | 
        GameWorld.DebugLog("    familyID=%s,totalFightPower=%s" % (familyID, totalFightPower))  
 | 
          
 | 
    PyGameData.g_fightPowerChangeFamilyIDList = []  
 | 
      
 | 
    DoFamilySort(False) # ´Ë´¦±ØÐëΪFalse  
 | 
    return True  
 | 
  
 | 
def GetSortFamilyIDList(): return PyGameData.g_sortFamilyIDList  
 | 
def GetFamilyIDRank(familyID):  
 | 
    '''»ñÈ¡ÏÉÃ˵ÄÅÅÃû£¬ ×¢ÒâÓëÁªÈüÅÅÃûÇø·Ö  
 | 
    Ã¿¸öÏÉÃËÒ»¶¨ÓÐÅÅÃû£¬µ«ÊDz»Ò»¶¨ÓÐÁªÈüÅÅÃû£¬ÁªÈüÅÅÃûÖ»ÊǾö¶¨ÏÉÃË×îÖÕÅÅÃûµÄÒ»¸ö±È½ÏÒòËØ  
 | 
    '''  
 | 
    if familyID not in PyGameData.g_sortFamilyIDList:  
 | 
        return len(PyGameData.g_sortFamilyIDList) + 1  
 | 
    return PyGameData.g_sortFamilyIDList.index(familyID) + 1  
 | 
  
 | 
def DoFamilySort(isUpdTotalFightPower=True):  
 | 
    ''' ÏÉÃËÅÅÐò£¬ ÅÅÐò¹æÔò: ÁªÈüÆÀ¼¶ > ×ÜÕ½Á¦ > µÈ¼¶ > ´´½¨Ê±¼ä  
 | 
    ¶¨Ê±5·ÖÖÓÅÅÐòÒ»´Î  
 | 
    ÏÉÃËÁªÈü·Ö×éǰ¼°Ã¿ÖܽáÊøºóÇ¿ÖÆÅÅÒ»´Î  
 | 
    '''  
 | 
    GameWorld.DebugLog("ÏÉÃËÅÅÐò, ÅÅÐò¹æÔò: ÁªÈüÆÀ¼¶ > ×ÜÕ½Á¦ > µÈ¼¶ > ´´½¨Ê±¼ä")  
 | 
    if isUpdTotalFightPower:  
 | 
        UpdFamilyTotalFightPower()  
 | 
          
 | 
    familyList = []  
 | 
    familyManager = GameWorld.GetFamilyManager()  
 | 
    for i in xrange(familyManager.GetCount()):  
 | 
        family = familyManager.GetAt(i)  
 | 
        familyList.append(family)  
 | 
    familyList.sort(cmp=CmpFamilySort)  
 | 
      
 | 
    PyGameData.g_sortFamilyIDList = []  
 | 
    for i, family in enumerate(familyList, 1):  
 | 
        GameWorld.DebugLog("    i=%s,warRank=%s,fightPower=%s,LV=%s,CreateTime=%s,familyID=%s"   
 | 
                           % (i, GetFamilyWarRank(family), GetFamilyTotalFightPower(family), family.GetLV(), family.GetCreateTime(), family.GetID()))  
 | 
        PyGameData.g_sortFamilyIDList.append(family.GetID())  
 | 
    GameWorld.DebugLog("    sortFamilyIDList=%s" % PyGameData.g_sortFamilyIDList)  
 | 
    return  
 | 
  
 | 
def CmpFamilySort(family1, family2):  
 | 
    ## ÅÅÐò¹æÔò: ÁªÈüÆÀ¼¶ > ×ÜÕ½Á¦ > µÈ¼¶ > ´´½¨Ê±¼ä  
 | 
    familyWarRankCmpValue1 = GetFamilyWarRank(family1)  
 | 
    familyWarRankCmpValue2 = GetFamilyWarRank(family2)  
 | 
      
 | 
    # Á½¸ö¶¼ÓÐÃû´Î£¬Ãû´ÎֵСµÄÅÅǰ  
 | 
    if familyWarRankCmpValue1 and familyWarRankCmpValue2:  
 | 
        ret = cmp(familyWarRankCmpValue1, familyWarRankCmpValue2)  
 | 
        if ret != 0:  
 | 
            return ret  
 | 
    # ÆäÖÐÒ»¸öÓÐÃû´Î£¬ÓÐÃû´ÎµÄÅÅǰ  
 | 
    elif familyWarRankCmpValue1 or familyWarRankCmpValue2:  
 | 
        return cmp(familyWarRankCmpValue2, familyWarRankCmpValue1) # µ¹Ðò  
 | 
      
 | 
    # Õ½Á¦µ¹Ðò  
 | 
    ret = cmp(GetFamilyTotalFightPower(family2), GetFamilyTotalFightPower(family1))  
 | 
    if ret != 0:  
 | 
        return ret  
 | 
      
 | 
    # µÈ¼¶µ¹Ðò  
 | 
    ret = cmp(family2.GetLV(), family1.GetLV())  
 | 
    if ret != 0:  
 | 
        return ret  
 | 
      
 | 
    # ´´½¨Ê±¼äÕýÐò  
 | 
    ret = cmp(family1.GetCreateTime(), family2.GetCreateTime())  
 | 
    if ret != 0:  
 | 
        return ret  
 | 
      
 | 
    return 0  
 | 
  
 | 
#// A4 11 Ò»¼üÉêÇëÈëÃË #tagCGOneKeyJoinFamily  
 | 
#  
 | 
#struct    tagCGOneKeyJoinFamily  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#};  
 | 
def QuicklyJoinFamily(index, clientData, tick):  
 | 
    #Ò»¼üÉêÇëÈëÃË  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    if curPlayer.GetFamilyID():  
 | 
        return  
 | 
    actionType = ShareDefine.Def_ActionType_FamilyAdd  
 | 
    requestPlayerName = curPlayer.GetName()  
 | 
    playerLV = curPlayer.GetLV()  
 | 
    #Íæ¼ÒId, µÈ¼¶,Ö°Òµ,Õ½¶·Á¦  
 | 
    actionDataList = [curPlayer.GetID(), playerLV, curPlayer.GetJob(), curPlayer.GetFightPower()]  
 | 
    allFamilyActionManager = GameWorld.GetFamilyActionManager()  
 | 
    familyManager = GameWorld.GetFamilyManager()  
 | 
    indexList = range(familyManager.GetCount())  
 | 
    random.shuffle(indexList) #´òÂÒ˳Ðò  
 | 
    joinFamilyID = 0  
 | 
    for i in indexList:  
 | 
        family = familyManager.GetAt(i)  
 | 
        if not family:  
 | 
            continue  
 | 
        familyID = family.GetID()  
 | 
          
 | 
        #¼Ò×åÉóºËÉèÖþܾøÍæ¼Ò¼ÓÈë  
 | 
        curAcceptJoinType = family.GetAcceptJoin()  
 | 
        if curAcceptJoinType == ShareDefine.FamilyAcceptJoin_Refuse:  
 | 
            continue  
 | 
        if curAcceptJoinType == ShareDefine.FamilyAcceptJoin_Agree:  
 | 
            maxMemberCnt = GetFamilySetting(family, ChConfig.Def_FamilySetting_MaxMemberCnt)  
 | 
            if family.GetCount() < maxMemberCnt and playerLV >= ChConfig.Def_Family_JionMinLV:  
 | 
                #Ö±½Ó¼ÓÈË  
 | 
                DoPlayerJionFamily(family, curPlayer, IPY_GameServer.fmlMember)  
 | 
                #֪ͨËùÓмÒ×å³ÉÔ±, Õâ¸öÈ˼ÓÈëÁ˼Ò×å  
 | 
                NotifyAllFamilyMemberMsg(family, curPlayer, "XW_JZ_EnterFamily", [requestPlayerName])  
 | 
                PlayerControl.NotifyCode(curPlayer, 'XW_JZ_EnterFamilyInfo', [family.GetName()])  
 | 
                #֪ͨ¿Í»§¶Ë¼Ò×åÐÅÏ¢¸Ä±ä  
 | 
                family.Broadcast_FamilyChange()  
 | 
                return  
 | 
            continue  
 | 
          
 | 
        if not joinFamilyID:  
 | 
            familyAction = allFamilyActionManager.GetFamilyAction(familyID, actionType)  
 | 
            familyActionCnt = familyAction.Count()  
 | 
            hasApply = False  
 | 
            for index in range(0, familyActionCnt):  
 | 
                familyActionData = familyAction.At(index)  
 | 
                name = familyActionData.GetName()  
 | 
                if name == requestPlayerName:  
 | 
                    hasApply = True  
 | 
                    break  
 | 
            if hasApply:  
 | 
                continue  
 | 
            joinFamilyID = familyID  
 | 
              
 | 
    if joinFamilyID:  
 | 
        joinfamily = familyManager.FindFamily(joinFamilyID)  
 | 
        result = PlayerFamilyAction.AddFamilyActionNote(requestPlayerName, joinFamilyID, actionType, actionDataList, tick, False)  
 | 
        if result and joinfamily:  
 | 
            sendMsg = str([joinFamilyID]) # ¸æËßMapÍæ¼ÒÉêÇë¼ÓÈë¼Ò×å³É¹¦  
 | 
            curPlayer.MapServer_QueryPlayerResult(0, 0, 'FamilyAdd', sendMsg, len(sendMsg))  
 | 
            #jiazu_pan_500807:ÉêÇëÈë°ï³É¹¦£¡ÇëµÈ´ý°ï»á¹ÜÀíÈËÔ±ÉóÅú£¡   
 | 
            #PlayerControl.NotifyCode(curPlayer, "jiazu_pan_500807")  
 | 
            PlayerFamilyAction.NotifyFamilyRequestInfo(joinfamily)  
 | 
          
 | 
    PlayerControl.NotifyCode(curPlayer, "jiazu_pan_500807")  
 | 
    return  
 |