ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
@@ -35,11 +35,15 @@
import NetPackCommon
import PyDataManager
import PyGameData
import PlayerBillboard
import PlayerActBossTrial
import PlayerCompensation
import PlayerFamilyParty
import PlayerFamilySWRH
import PlayerViewCache
import GameWorldBoss
import AuctionHouse
import PlayerAssist
import PlayerTalk
import PlayerTeam
@@ -71,6 +75,9 @@
    if not family:
        return 0
    return GetFamilyTotalFightPower(family)
# 徽章
def GetFamilyEmblem(curFamily): return curFamily.GetExtra6()
def SetFamilyEmblem(curFamily, value): return curFamily.SetExtra6(value)
# 公告修改次数
def GetFamilyBroadcastCnt(curFamily): return curFamily.GetExtra3()
@@ -87,12 +94,62 @@
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 GetMemberFightPower(curMember): return curMember.GetExattr3() + curMember.GetExattr5() * ChConfig.Def_PerPointValue
def SetMemberFightPower(curMember, fightPower):
    curMember.SetExattr5(fightPower / ChConfig.Def_PerPointValue)
    curMember.SetExattr3(fightPower % ChConfig.Def_PerPointValue)
    return
def GetMemberJoinTime(curMember): return curMember.GetExattr4()
def SetMemberJoinTime(curMember, joinTime): return curMember.SetExattr4(joinTime)
#----------------------------------------------------------------------
def OnGameServerInitOK():
    ## 服务器启动成功处理
    DoFamilySort()
    return
def OnMixServerInit():
    ## 合服后首次启动成功处理
    # 仙盟联赛重置
    GameWorldFamilyWar.DoFamilyWarReset()
    # 重置所有仙盟联赛评级
    familyManager = GameWorld.GetFamilyManager()
    for i in xrange(familyManager.GetCount()):
        family = familyManager.GetAt(i)
        SetFamilyWarRank(family, 0)
        # 仙盟榜相关榜单重新上榜
        familyID = family.GetID()
        familyBillInfo = GetFamilyBillboardInfo(family)
        familySubmitTotal = PlayerActBossTrial.GetFamilySubmitTotalByID(familyID)
        PlayerBillboard.UpdateFamilyBillboard(ShareDefine.Def_BT_BossTrialSubmitFamily, familyBillInfo, familySubmitTotal)
    DoFamilySort()
    return
def OnLoadDBPlayerOK():
    ## 服务器启动加载DB玩家成功处理
    # 检查仙盟ServerID
    familyManager = GameWorld.GetFamilyManager()
    for i in xrange(familyManager.GetCount()):
        family = familyManager.GetAt(i)
        if family.GetServerID():
            continue
        familyID = family.GetID()
        # 没有则默认取盟主的
        leaderID = family.GetLeaderID()
        leaderAccID = PlayerControl.GetDBPlayerAccIDByID(leaderID)
        if not leaderAccID:
            continue
        serverID = GameWorld.GetAccIDServerID(leaderAccID)
        family.SetServerID(serverID)
        GameWorld.Log("启动更新仙盟所属服务器ID: familyID=%s,serverID=%s,leaderID=%s,%s" % (familyID, serverID, leaderID, leaderAccID))
    return
def RandomFakeFamily():
    '''随机3个假仙盟'''
@@ -131,9 +188,25 @@
            if not lackCnt:
                break
    elif lackCnt < 0:
        GameWorld.ErrLog('    随机假仙盟异常 已存在的随机数大于还需要的随机个数lackFakeCnt=%s,fakeIDList=%s'%(lackFakeCnt, fakeIDList))
        #GameWorld.DebugLog('    随机假仙盟异常 已存在的随机数大于还需要的随机个数lackFakeCnt=%s,fakeIDList=%s'%(lackFakeCnt, fakeIDList))
        return []
    return fakeIDList
def GetFamilyNameFakeIndex(familyName):
    ## 获取仙盟名是否是系统随机出来的假仙盟名
    # @return: 0-不是, >0 对应的 fakeIndex
    fakeFamilyNameList = IpyGameDataPY.GetFuncEvalCfg('FakeFamilyName')
    randomCnt = IpyGameDataPY.GetFuncCfg('FakeFamilyName', 2)
    for i in xrange(randomCnt):
        fakeID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FakeFamilyIndex % i)
        if not fakeID:
            continue
        nameIndex = fakeID - 1
        if nameIndex >=0 and nameIndex < len(fakeFamilyNameList):
            fakeName = GameWorld.GbkToCode(fakeFamilyNameList[nameIndex])
            if familyName == fakeName:
                return fakeID
    return 0
def SyncFakeFamilyInfo(curPlayer=None):
    '''通知假仙盟信息'''
@@ -159,6 +232,28 @@
        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
#输入家族名称
@@ -234,6 +329,7 @@
        return
    GameWorld.Log("创建仙盟: familyID=%s,playerID=%s" % (curFamily.GetID(), curPlayerID))
    #---创建家族---
    curFamily.SetServerID(GameWorld.GetAccIDServerID(curPlayer.GetAccID()))
    curFamily.SetCreateTime(GameWorld.GetCurrentDataTimeStr())
    curFamily.SetLV(1)
    curFamily.SetAcceptJoin(ShareDefine.FamilyAcceptJoin_Agree)     #设置收人方式为直接通过申请
@@ -244,11 +340,17 @@
    
    #-设置家族成员属性
    DoPlayerJionFamily(curFamily, curPlayer, IPY_GameServer.fmlLeader)
    creatFamilyTimes = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerCreatFamilyTimes)
    # 如果是手动指定仙盟名创建的,判断是否在系统随机的假仙盟里,如果是的话就当做创建系统分配的假仙盟处理
    if familyName and not fakeIndex:
        fakeIndex = GetFamilyNameFakeIndex(familyName)
        GameWorld.DebugLog("    玩家手动输入创建仙盟名与系统随机的假仙盟名相同,默认当做创建假仙盟!fakeIndexID=%s" % (fakeIndex))
    #扣道具(前N个战盟并且假编号在随机编号里不要钱)
    if fakeIndex and fakeIndex in fakeIndexList:
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FakeFamilyIndex % fakeIndexList.index(fakeIndex), 0)
        GameWorld.DebugLog('    创建前3个仙盟不扣钱! 假仙盟索引%s'%fakeIndexList.index(fakeIndex))
        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:
@@ -258,7 +360,9 @@
        needMoney = IpyGameDataPY.GetFuncCfg('CreateFamilyNeedMoney')
        if needMoney:
            moneyType = IpyGameDataPY.GetFuncCfg('CreateFamilyNeedMoney', 2)
            curPlayer.MapServer_PayMoney(moneyType, needMoney)
            sendMsg = str([moneyType, needMoney])
            curPlayer.MapServer_QueryPlayerResult(0, 0, "CreateFamilyPayMoney", sendMsg, len(sendMsg))
            #curPlayer.MapServer_PayMoney(moneyType, needMoney)
            #玩家创建家族费用转化为家族初始资金
            #PlayerAddFamilyMoney(curPlayer, curFamily, needMoney)
  
@@ -284,12 +388,13 @@
    
    #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())
                                   fullFamilyName, curFamily.GetID(), creatFamilyTimes+1)
    GameWorld.Log('创建家族 : %s(%s), fakeIndex=%s' % (fullFamilyName, curFamily.GetID(), fakeIndex), curPlayerID)
    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
@@ -364,18 +469,21 @@
    #通知战盟红包信息
    PlayerFamilyRedPacket.NotifyRedPacketInfo(jionPlayer)
    
    #通知战盟BOSS开启信息
    PlayerFamilyBoss.NotifyFamilyBossFBInfo(jionPlayer)
    #通知战盟BOSS
    PlayerFamilyBoss.OnPlayerJionFamily(curFamily, jionPlayer)
    #通知家族仓库
    PyDataManager.GetFamilyStoreItemManager().SyncFamilyStoreItem(jionPlayer, curFamily.GetID())
    SetMemberFightPower(familyMember, jionPlayer.GetFightPower())
    #仙盟拍品
    AuctionHouse.Sync_FamilyAuctionItemInfo(jionPlayer, curFamily.GetID())
    SetMemberFightPower(familyMember, PlayerControl.GetFightPower(jionPlayer))
    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
@@ -385,7 +493,6 @@
    GameWorld.DebugLog('    玩家战盟名变更处理, newFamilyName=%s' % familyName, playerID)
    #不处理排行榜
    needChangeFamilyBillboardList = [
                                     #ShareDefine.Def_BT_RechargeTeHui,  # 充值特惠活动排行榜-当前期记录
                                     ]
    billboardMgr = GameWorld.GetBillboard()
    for billboardIndex in needChangeFamilyBillboardList:
@@ -580,7 +687,7 @@
    #===============================================================================================
    return
def SendFamilyFakePack(familyID, clientPack):
def SendFamilyFakePack(familyID, clientPack, excludePlayerIDList=[]):
    ## 广播家族成员PY封包
    family = GameWorld.GetFamilyManager().FindFamily(familyID)
    if not family:
@@ -589,8 +696,11 @@
    for index in xrange(family.GetCount()):
        member = family.GetAt(index)
        memPlayer = member.GetPlayer()
        if memPlayer:
            NetPackCommon.SendFakePack(memPlayer, clientPack)
        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):
@@ -1421,7 +1531,12 @@
    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()  # 被踢玩家职位
@@ -1432,10 +1547,10 @@
    PlayerFamilyAction.AddFamilyActionNote(tagPlayerName, curFamily.GetID(), ShareDefine.Def_ActionType_FamilyEvent,
                                           [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_KickOut], tick)
    #删除玩家
    curFamily.DeleteMember(tagPlayerID)
    __DoPlayerLeaveFamilyByID(curFamily, tagPlayerID)
    curFamily.DeleteMember(tagPlayerID)
    tagPlayer = playerManager.FindPlayerByID(tagMemberID)
    __DoPlayerLeaveFamilyByID(curFamily, tagPlayerID, tagPlayer)
    #玩家在线, 设置这个玩家的属性
    PlayerForceLeaveFamily(tagPlayer, tick)
    
@@ -1500,6 +1615,12 @@
    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)
@@ -1526,7 +1647,7 @@
    curFamily.DeleteMember(curMember.GetPlayerID())
    #玩家在线, 设置这个玩家的属性
    PlayerForceLeaveFamily(curPlayer, tick)  
    __DoPlayerLeaveFamilyByID(curFamily, curPlayerID)
    __DoPlayerLeaveFamilyByID(curFamily, curPlayerID, curPlayer)
    DataRecordPack.DR_PlayerLeaveFamily(curPlayer, curFamily.GetID(), curFamily.GetName(), curFamily.GetCount(),
                                        familyLV, curPlayer.GetPlayerID(), curPlayer.GetName(), familyLV, updTime)
@@ -1544,12 +1665,14 @@
#  @param curFamily 离开的家族
#  @param leavePlayerID 离开的玩家ID
#  @return None
def __DoPlayerLeaveFamilyByID(curFamily, leavePlayerID):
def __DoPlayerLeaveFamilyByID(curFamily, leavePlayerID, tagPlayer=None):
    PlayerCompensation.SendMailByKey("LeaveFamilyNotice", [leavePlayerID], [])
    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
@@ -1670,8 +1793,10 @@
                                          addFamilyMoney, curFamily.GetFamilyActiveValue(), addFamilyActiveValue)
    
    #通知客户端
    #curFamily.Broadcast_FamilyChange()
    curPlayer.Sync_FamilyInfo()
    if addFamilyHornor:
        curFamily.Broadcast_FamilyChange()
    else:
        curPlayer.Sync_FamilyInfo()
    
    #金钱变更时才通知
    if addFamilyMoney != 0:
@@ -1862,6 +1987,7 @@
#  @remarks 函数详细说明.
def PlayerLoginRefreshFamily(curPlayer, tick):
    SyncFakeFamilyInfo(curPlayer)
    SyncCreatFamilyTimes(curPlayer)
    familyID = curPlayer.GetFamilyID()
    curFamily = None
    
@@ -1915,8 +2041,10 @@
    
    if not PlayerControl.GetIsTJG(curPlayer):
        #上线重置离线时间为0, 非脱机挂才设置
        curMember.SetExattr2(0)
        curMember.SetExattr2(0) # 在线0,脱机1,>1离线时间
        curPlayer.Sync_FamilyInfo()
    else:
        curMember.SetExattr2(1) # 脱机1
    
    curPlayer.MapServer_FamilyRefresh()
    curMember = GetPlayerFamilyMember(curPlayer)
@@ -2612,6 +2740,13 @@
    __SetFamilyActivityDayStateValue(0)
    return
def FamilyOnDayEx(tick):
    familyManager = GameWorld.GetFamilyManager()
    for i in range(0, familyManager.GetCount()):
        family = familyManager.GetAt(i)
        #仙盟boss
        PlayerFamilyBoss.FamilyBossFBOnDayEx(family)
    return
#---------------------------------------------------------------------
##家族过周
@@ -2646,7 +2781,7 @@
        DataRecordPack.DR_FamilyActiveValueByOnWeek(familyID, family.GetName(), familyActiveValue)
        
        #清除家族boss副本信息
        PlayerFamilyBoss.FamilyBossFBOnWeek(familyID)
        PlayerFamilyBoss.FamilyBossFBOnWeek(family)
        
    return
@@ -2764,7 +2899,7 @@
        GameWorld.ErrLog("key = %s not in tagFamily.txt" % familyLv)
        return 0
    keyStr = ChConfig.FamilySettingDict[index]
    return getattr(curFamilyLvSetting, keyStr)
    return getattr(curFamilyLvSetting, "Get%s" % keyStr)()
#===============================================================================
@@ -2844,7 +2979,7 @@
        GameWorld.Log("GetLeaderOfflineTime->FindMember, None;%s" % leaderID)
        return 0
    offLineTimeNum = curMember.GetExattr2()
    if not offLineTimeNum:
    if not offLineTimeNum or offLineTimeNum == 1:
        return 0
    offLineTime = GameWorld.ChangeTimeNumToStr(offLineTimeNum)
    return GameWorld.GetPastHour(offLineTime)
@@ -2855,7 +2990,7 @@
    for i in range(0, family.GetCount()):
        member = family.GetAt(i) 
        offLineTimeNum = member.GetExattr2()
        if not offLineTimeNum:
        if not offLineTimeNum or offLineTimeNum == 1:
            #有人在线直接返回
            return 0
        if not offLineTime:
@@ -2890,7 +3025,7 @@
        elif toMember2.GetExattr1() < member.GetExattr1():
            toMember2 = member
        offLineHour = GameWorld.GetPastHour(GameWorld.ChangeTimeNumToStr(member.GetExattr2())) if member.GetExattr2() else 0
        offLineHour = GameWorld.GetPastHour(GameWorld.ChangeTimeNumToStr(member.GetExattr2())) if member.GetExattr2() > 1 else 0
        #GameWorld.DebugLog('memberID=%s 离线%s小时,历史贡献度%s'%(member.GetPlayerID(), offLineHour, member.GetExattr1()))
        if offLineHour < 48:
            if not toMember1:
@@ -3258,17 +3393,6 @@
    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
@@ -3490,7 +3614,8 @@
    requestPlayerName = curPlayer.GetName()
    playerLV = curPlayer.GetLV()
    #玩家Id, 等级,职业,战斗力
    actionDataList = [curPlayer.GetID(), playerLV, curPlayer.GetJob(), curPlayer.GetFightPower()]
    fightPower = PlayerControl.GetFightPower(curPlayer)
    actionDataList = [curPlayer.GetID(), playerLV, curPlayer.GetJob(), fightPower % ChConfig.Def_PerPointValue, fightPower / ChConfig.Def_PerPointValue]
    allFamilyActionManager = GameWorld.GetFamilyActionManager()
    familyManager = GameWorld.GetFamilyManager()
    indexList = range(familyManager.GetCount())
@@ -3545,3 +3670,111 @@
        
    PlayerControl.NotifyCode(curPlayer, "jiazu_pan_500807")
    return
##--------------------------------------- 仙盟传功 --------------------------------------------------
def MapServer_FamilyChuangong(curPlayer, msgList):
    msgType, msgData = msgList
    if msgType == "Invite":
        tagPlayerID = msgData[0]
        __DoChuangong_Invite(curPlayer, tagPlayerID)
        return
    if msgType == "Response":
        tagPlayerID, isOK = msgData
        __DoChuangong_Response(curPlayer, tagPlayerID, isOK)
        return
    return
def __CheckChuangongPlayer(curPlayer, tagPlayerID):
    curFamily = curPlayer.GetFamily()
    if not curFamily:
        return
    tagMember = curFamily.FindMember(tagPlayerID)
    if not tagMember:
        GameWorld.DebugLog("非盟友无法传功! tagPlayerID=%s" % tagPlayerID, curPlayer.GetPlayerID())
        return
    tagPlayer = tagMember.GetPlayer()
    if not tagPlayer:
        PlayerControl.NotifyCode(curPlayer, "FairyFeastPlayerOffline")
        return
    return tagPlayer
def __DoChuangong_Invite(curPlayer, tagPlayerID):
    ## 邀请
    playerID = curPlayer.GetPlayerID()
    tagPlayer = __CheckChuangongPlayer(curPlayer, tagPlayerID)
    if not tagPlayer:
        return
    invitePlayerIDList = PyGameData.g_chuangongPlayerDict.get(playerID, [])
    if tagPlayerID not in invitePlayerIDList:
        invitePlayerIDList.append(tagPlayerID)
        PyGameData.g_chuangongPlayerDict[playerID] = invitePlayerIDList
    clientPack = ChPyNetSendPack.tagGCChuangongInviteInfo()
    clientPack.Clear()
    clientPack.PlayerID = curPlayer.GetPlayerID()
    clientPack.Name = curPlayer.GetName()
    clientPack.NameLen = len(clientPack.Name)
    clientPack.LV = curPlayer.GetLV()
    clientPack.Job = curPlayer.GetJob()
    clientPack.RealmLV = curPlayer.GetOfficialRank()
    NetPackCommon.SendFakePack(tagPlayer, clientPack)
    GameWorld.DebugLog("邀请传功: tagPlayerID=%s, %s" % (tagPlayerID, PyGameData.g_chuangongPlayerDict), playerID)
    return
def __DoChuangong_Response(curPlayer, tagPlayerID, isOK):
    ## 相应
    playerID = curPlayer.GetPlayerID()
    tagPlayer = __CheckChuangongPlayer(curPlayer, tagPlayerID)
    if not tagPlayer:
        return
    invitePlayerIDList = PyGameData.g_chuangongPlayerDict.get(tagPlayerID, [])
    if not isOK:
        if playerID in invitePlayerIDList:
            invitePlayerIDList.remove(playerID)
            PyGameData.g_chuangongPlayerDict[tagPlayerID] = invitePlayerIDList
        GameWorld.DebugLog("拒绝传功: tagPlayerID=%s, %s" % (tagPlayerID, PyGameData.g_chuangongPlayerDict), playerID)
        return
    if not invitePlayerIDList:
        PlayerControl.NotifyCode(curPlayer, "TagHadFinishChuangong")
        return
    if playerID not in invitePlayerIDList:
        GameWorld.DebugLog("不在对方邀请列表了,无法传功: tagPlayerID=%s, %s" % (tagPlayerID, invitePlayerIDList), playerID)
        return
    PyGameData.g_chuangongPlayerDict.pop(tagPlayerID)
    # 通知双方开始传功
    __NotifyChuangongStart(curPlayer, tagPlayer)
    __NotifyChuangongStart(tagPlayer, curPlayer)
    return
def __NotifyChuangongStart(curPlayer, tagPlayer):
    clientPack = ChPyNetSendPack.tagGCChuangongStart()
    clientPack.Clear()
    clientPack.PlayerID = tagPlayer.GetPlayerID()
    clientPack.Name = tagPlayer.GetName()
    clientPack.NameLen = len(clientPack.Name)
    clientPack.LV = tagPlayer.GetLV()
    clientPack.Job = tagPlayer.GetJob()
    clientPack.RealmLV = tagPlayer.GetOfficialRank()
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
##--------------------------------------------------------------------------------------------------
def GetFamilyBillboardInfo(curFamily):
    ## 获取仙盟榜单信息 区服ID、徽章、仙盟名、盟主名、仙盟总战力、仙盟等级
    familyID = curFamily.GetID()
    name = curFamily.GetName()
    id2 = curFamily.GetLeaderID()
    name2 = curFamily.GetLeaderName()
    fightPower = GetFamilyTotalFightPower(curFamily)
    value1 = fightPower / ChConfig.Def_PerPointValue
    value2 = fightPower % ChConfig.Def_PerPointValue
    value3 = GetFamilyEmblem(curFamily)
    value4 = curFamily.GetLV()
    value5 = curFamily.GetServerID()
    return {"id":familyID, "name":name, "id2":id2, "name2":name2, "value1":value1, "value2":value2,
            "value3":value3, "value4":value4, "value5":value5}