10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(增加查看其他指定仙盟/跨服仙盟支持;增加领取点赞奖励;修改仙盟轮次伤害计算规则受当前城池剩余生命影响;)
11个文件已修改
731 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/PyNetPack.ini 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 240 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 240 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
@@ -39,7 +39,7 @@
Writer = Alee
Releaser = Alee
RegType = 0
RegisterPackCount = 10
RegisterPackCount = 11
PacketCMD_1=0xA4
PacketSubCMD_1=0x01
@@ -81,6 +81,10 @@
PacketSubCMD_10=0x13
PacketCallFunc_10=OnChangeFamilyEmblem
PacketCMD_11=0xA4
PacketSubCMD_11=0x14
PacketCallFunc_11=OnViewTagFamily
[GameWorldFamilyWar]
ScriptName = GameWorldLogic\GameWorldFamilyWar.py
Writer = hxp
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -1026,6 +1026,58 @@
#------------------------------------------------------
# A4 14 查看目标仙盟 #tagCGViewTagFamily
class  tagCGViewTagFamily(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("TagFamilyID", c_int),    # 目标仙盟ID,支持查看跨服仙盟
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA4
        self.SubCmd = 0x14
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA4
        self.SubCmd = 0x14
        self.TagFamilyID = 0
        return
    def GetLength(self):
        return sizeof(tagCGViewTagFamily)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A4 14 查看目标仙盟 //tagCGViewTagFamily:
                                Cmd:%s,
                                SubCmd:%s,
                                TagFamilyID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.TagFamilyID
                                )
        return DumpString
m_NAtagCGViewTagFamily=tagCGViewTagFamily()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGViewTagFamily.Cmd,m_NAtagCGViewTagFamily.SubCmd))] = m_NAtagCGViewTagFamily
#------------------------------------------------------
# A9 03 关注BOSS刷新 #tagCGAttentionBoss
class  tagCGAttentionBoss(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -2712,6 +2712,246 @@
#------------------------------------------------------
# A4 13 查看目标仙盟返回信息 #tagGCTagFamilyInfo
class  tagGCTagFamilyMember(Structure):
    PlayerID = 0    #(DWORD PlayerID)
    NameLen = 0    #(BYTE NameLen)
    Name = ""    #(String Name)//size = NameLen
    FamilyLV = 0    #(BYTE FamilyLV)//家族成员等级
    LV = 0    #(WORD LV)
    Job = 0    #(BYTE Job)//ְҵ
    Face = 0    #(DWORD Face)//头像
    FacePic = 0    #(DWORD FacePic)//头像外框
    OfficialRank = 0    #(BYTE OfficialRank)//境界
    FightPower = 0    #(DWORD FightPower)//成员战力,求余亿部分
    FightPowerEx = 0    #(DWORD FightPowerEx)//成员战力,整除亿部分
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
        self.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.OfficialRank,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        return _pos
    def Clear(self):
        self.PlayerID = 0
        self.NameLen = 0
        self.Name = ""
        self.FamilyLV = 0
        self.LV = 0
        self.Job = 0
        self.Face = 0
        self.FacePic = 0
        self.OfficialRank = 0
        self.FightPower = 0
        self.FightPowerEx = 0
        return
    def GetLength(self):
        length = 0
        length += 4
        length += 1
        length += len(self.Name)
        length += 1
        length += 2
        length += 1
        length += 4
        length += 4
        length += 1
        length += 4
        length += 4
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteDWORD(data, self.PlayerID)
        data = CommFunc.WriteBYTE(data, self.NameLen)
        data = CommFunc.WriteString(data, self.NameLen, self.Name)
        data = CommFunc.WriteBYTE(data, self.FamilyLV)
        data = CommFunc.WriteWORD(data, self.LV)
        data = CommFunc.WriteBYTE(data, self.Job)
        data = CommFunc.WriteDWORD(data, self.Face)
        data = CommFunc.WriteDWORD(data, self.FacePic)
        data = CommFunc.WriteBYTE(data, self.OfficialRank)
        data = CommFunc.WriteDWORD(data, self.FightPower)
        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
        return data
    def OutputString(self):
        DumpString = '''
                                PlayerID:%d,
                                NameLen:%d,
                                Name:%s,
                                FamilyLV:%d,
                                LV:%d,
                                Job:%d,
                                Face:%d,
                                FacePic:%d,
                                OfficialRank:%d,
                                FightPower:%d,
                                FightPowerEx:%d
                                '''\
                                %(
                                self.PlayerID,
                                self.NameLen,
                                self.Name,
                                self.FamilyLV,
                                self.LV,
                                self.Job,
                                self.Face,
                                self.FacePic,
                                self.OfficialRank,
                                self.FightPower,
                                self.FightPowerEx
                                )
        return DumpString
class  tagGCTagFamilyInfo(Structure):
    Head = tagHead()
    FamilyID = 0    #(DWORD FamilyID)
    FamilyName = ""    #(char FamilyName[33])//家族名称
    FamilyLV = 0    #(WORD FamilyLV)//家族等级
    BroadcastLen = 0    #(WORD BroadcastLen)//公告
    Broadcast = ""    #(String Broadcast)//size = BroadcastLen
    MemberCount = 0    #(WORD MemberCount)//人数
    Member = list()    #(vector<tagGCTagFamilyMember> Member)//size = MemberCount
    FightPower = 0    #(DWORD FightPower)//仙盟总战力,求余亿部分
    FightPowerEx = 0    #(DWORD FightPowerEx)//仙盟总战力,整除亿部分
    EmblemID = 0    #(DWORD EmblemID)//徽章ID
    ServerID = 0    #(DWORD ServerID)//仙盟区服ID
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA4
        self.Head.SubCmd = 0x13
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FamilyName,_pos = CommFunc.ReadString(_lpData, _pos,33)
        self.FamilyLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.BroadcastLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.Broadcast,_pos = CommFunc.ReadString(_lpData, _pos,self.BroadcastLen)
        self.MemberCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
        for i in range(self.MemberCount):
            temMember = tagGCTagFamilyMember()
            _pos = temMember.ReadData(_lpData, _pos)
            self.Member.append(temMember)
        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA4
        self.Head.SubCmd = 0x13
        self.FamilyID = 0
        self.FamilyName = ""
        self.FamilyLV = 0
        self.BroadcastLen = 0
        self.Broadcast = ""
        self.MemberCount = 0
        self.Member = list()
        self.FightPower = 0
        self.FightPowerEx = 0
        self.EmblemID = 0
        self.ServerID = 0
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 4
        length += 33
        length += 2
        length += 2
        length += len(self.Broadcast)
        length += 2
        for i in range(self.MemberCount):
            length += self.Member[i].GetLength()
        length += 4
        length += 4
        length += 4
        length += 4
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteDWORD(data, self.FamilyID)
        data = CommFunc.WriteString(data, 33, self.FamilyName)
        data = CommFunc.WriteWORD(data, self.FamilyLV)
        data = CommFunc.WriteWORD(data, self.BroadcastLen)
        data = CommFunc.WriteString(data, self.BroadcastLen, self.Broadcast)
        data = CommFunc.WriteWORD(data, self.MemberCount)
        for i in range(self.MemberCount):
            data = CommFunc.WriteString(data, self.Member[i].GetLength(), self.Member[i].GetBuffer())
        data = CommFunc.WriteDWORD(data, self.FightPower)
        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
        data = CommFunc.WriteDWORD(data, self.EmblemID)
        data = CommFunc.WriteDWORD(data, self.ServerID)
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                FamilyID:%d,
                                FamilyName:%s,
                                FamilyLV:%d,
                                BroadcastLen:%d,
                                Broadcast:%s,
                                MemberCount:%d,
                                Member:%s,
                                FightPower:%d,
                                FightPowerEx:%d,
                                EmblemID:%d,
                                ServerID:%d
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.FamilyID,
                                self.FamilyName,
                                self.FamilyLV,
                                self.BroadcastLen,
                                self.Broadcast,
                                self.MemberCount,
                                "...",
                                self.FightPower,
                                self.FightPowerEx,
                                self.EmblemID,
                                self.ServerID
                                )
        return DumpString
m_NAtagGCTagFamilyInfo=tagGCTagFamilyInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCTagFamilyInfo.Head.Cmd,m_NAtagGCTagFamilyInfo.Head.SubCmd))] = m_NAtagGCTagFamilyInfo
#------------------------------------------------------
#A4 01  查看申请入会的玩家信息 #tagGCViewFamilyRequestInfo
class  tagtMemberInfo(Structure):
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py
@@ -90,7 +90,8 @@
AwwardType_Guess, # 竞猜
AwwardType_PlayerHurt, # 个人伤害排行
AwwardType_FamilyScore, # 仙盟积分排行
) = range(3)
AwwardType_Like, # 点赞
) = range(4)
class FamilyGCZFighter(object):
@@ -1287,9 +1288,13 @@
    value5 = joinFamily.serverID
    groupValue1 = joinFamily.zoneID
    groupValue2 = GetRoundHurtGroupID(joinFamily.batType, joinFamily.groupNum)
    roundTotalHurt = sum(joinFamily.cityWall.fighterHurtDict.values())
    cmpValue = roundTotalHurt / ChConfig.Def_PerPointValue
    cmpValue2 = roundTotalHurt % ChConfig.Def_PerPointValue
    memHurtTotal = sum(joinFamily.cityWall.fighterHurtDict.values())
    cityRemainHPPer = joinFamily.cityWall.hp / float(joinFamily.cityWall.hpMax)
    familyRoundHurt = eval(IpyGameDataPY.GetFuncCompileCfg("FamilyGCZCity", 3))
    GameWorld.DebugLog("计算仙盟轮次伤害榜值: familyID=%s,familyRoundHurt=%s,memHurtTotal=%s,cityRemainHPPer=%s, %s/%s"
                       % (dataID, familyRoundHurt, memHurtTotal, cityRemainHPPer, joinFamily.cityWall.hp, joinFamily.cityWall.hpMax))
    cmpValue = familyRoundHurt / ChConfig.Def_PerPointValue
    cmpValue2 = familyRoundHurt % ChConfig.Def_PerPointValue
    cmpValue3 = joinFamily.sortWeight
    CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_FamilyGCZRoundHurt, groupValue1, dataID, name1, name2, type2, value1, value2,
                                     cmpValue, cmpValue2, cmpValue3, groupValue2=groupValue2, id2=id2, autoSort=True, value3=value3, value5=value5)
@@ -1855,7 +1860,11 @@
                           % (remainHurtTotal, killCnt, curCity.atkReportDict, tagCity.defReportDict))
        
    GameWorld.DebugLog("cityHP=%s/%s,atkedGuardIDList=%s" % (tagCity.hp, tagCity.hpMax, atkedGuardIDList))
    if tagFamilyID:
        tagJoinFamily = zone.GetZoneJoinFamily(tagFamilyID)
        if tagJoinFamily:
            UndFamilyRoundHurtBillboard(tagJoinFamily) # 榜单伤害受城池血量影响,所以被攻击方也要更新榜单
    for memID, memHurt in memHurtDict.items():
        GameWorld.DebugLog("攻击方成员输出: memID=%s,%s" % (memID, memHurt))
        joinMember = zone.GetZoneJoinMember(memID)
@@ -1875,6 +1884,8 @@
            
    if not curCity.IsBroken():
        UndFamilyRoundHurtBillboard(curJoinFamily)
    else:
        GameWorld.DebugLog("    攻击方仙盟城池已被摧毁,不再累加本轮仙盟伤害榜值! familyID=%s" % curFamilyID)
        
    if not CheckXiuluoCity(zoneID, curRound, batType, groupNum, gmPlayerID):
        Sync_FamilyGCZBatSceneInfo(zoneID, batType, groupNum)
@@ -2052,6 +2063,9 @@
        hurtDict[tagCityID] = oneHurtTotal # 飘血按伤害
        # 通知被攻击盟成员大本营城池信息
        if tagCity.familyID:
            tagJoinFamily = zone.GetZoneJoinFamily(tagCity.familyID)
            if tagJoinFamily:
                UndFamilyRoundHurtBillboard(tagJoinFamily) # 榜单伤害受城池血量影响,所以被攻击方也要更新榜单
            Sync_FamilyGCZCampInfo(zoneID, tagCity.familyID, defMemIDList=atkedGuardIDList)
        Sync_FamilyGCZBatCityInfo(zoneID, batType, groupNum, tagCityID, AtkRet_OK, playerID, oneHurtTotal, killCnt)
        
@@ -2467,7 +2481,11 @@
    # 竞猜
    if awardType == AwwardType_Guess:
        awardTemplateID = ipyDataInfo.get("GuessTemplateID", 0)
        __clientServer_GetAward_Guess(zoneID, playerID, serverGroupID, actID, state, awardType, awardTemplateID)
        playerAwardID, awardItemList = GetGuessAwardInfo(zoneID, state, awardTemplateID, playerID)
        if not awardItemList:
            GameWorld.ErrLog("仙盟攻城战玩家没有竞猜奖励! zoneID=%s" % (zoneID), playerID)
            return
        __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, playerAwardID, awardItemList)
        return
    
    gczMgr = GetFamilyGCZMgr()
@@ -2497,6 +2515,12 @@
        billboardType = ShareDefine.Def_CBT_FamilyGCZScore
        awardTemplateID = ipyDataInfo.get("FamilyTemplateID", 0)
        
    # 点赞奖励
    elif awardType == AwwardType_Like:
        awardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyGCZGuess", 4)
        __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, 0, awardItemList)
        return
    else:
        return
    
@@ -2518,30 +2542,22 @@
    if not playerAwardItemList:
        return
    
    GameWorld.Log("仙盟攻城战玩家请求领取奖励! zoneID=%s,awardType=%s,playerAwardItemList=%s"
                  % (zoneID, awardType, playerAwardItemList), playerID)
    joinMember.awardState = joinMember.awardState | pow(2, awardType) # 标记已推送
    msgInfo = {"zoneID":zoneID, "playerID":playerID, "actID":actID, "awardType":awardType, "awardValue":billRank,
               "awardItemList":playerAwardItemList, "fmLV":fmLV}
    Send_CrossServerMsg_FamilyGCZ("FamilyGCZAward", msgInfo, [serverGroupID])
    __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, billRank, playerAwardItemList)
    return
def __clientServer_GetAward_Guess(zoneID, playerID, serverGroupID, actID, state, awardType, guessTemplateID):
    ## 竞猜领奖
    playerAwardID, awardItemList = GetGuessAwardInfo(zoneID, state, guessTemplateID, playerID)
    if not awardItemList:
        GameWorld.ErrLog("仙盟攻城战玩家没有竞猜奖励! zoneID=%s" % (zoneID), playerID)
        return
    GameWorld.Log("仙盟攻城战玩家请求领取竞猜奖励! zoneID=%s,playerAwardID=%s,awardItemList=%s"
                  % (zoneID, playerAwardID, awardItemList), playerID)
def __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, awardValue, awardItemList):
    ## 同步子服领奖结果
    gczMgr = GetFamilyGCZMgr()
    zone = gczMgr.GetActZone(zoneID)
    joinMember = zone.GetZoneJoinMember(playerID)
    fmLV = 0
    if joinMember:
        fmLV = joinMember.fmLV
        joinMember.awardState = joinMember.awardState | pow(2, awardType) # 标记已推送
    msgInfo = {"zoneID":zoneID, "playerID":playerID, "actID":actID, "awardType":awardType, "awardValue":playerAwardID, "awardItemList":awardItemList}
    GameWorld.Log("仙盟攻城战玩家请求领取奖励! zoneID=%s,awardType=%s,awardValue=%s,awardItemList=%s"
                  % (zoneID, awardType, awardValue, awardItemList), playerID)
    msgInfo = {"zoneID":zoneID, "playerID":playerID, "actID":actID, "awardType":awardType, "awardValue":awardValue,
               "awardItemList":awardItemList, "fmLV":fmLV}
    Send_CrossServerMsg_FamilyGCZ("FamilyGCZAward", msgInfo, [serverGroupID])
    return
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -235,6 +235,9 @@
        elif msgType == ShareDefine.ClientServerMsg_SyncFamilyInfo:
            PlayerFamily.ClientServerMsg_SyncFamilyInfo(serverGroupID, msgData)
            
        elif msgType == ShareDefine.ClientServerMsg_QueryCrossFamily:
            PlayerFamily.ClientServerMsg_QueryCrossFamily(serverGroupID, msgData)
        elif msgType == ShareDefine.ClientServerMsg_FamilyGCZ:
            CrossFamilyGCZ.ClientServerMsg_FamilyGCZ(serverGroupID, msgData)
            
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
@@ -919,6 +919,63 @@
    PlayerFamilyEmblem.OnChangeFamilyEmblem(curPlayer, changeEmblemID)
    return
#// A4 14 查看目标仙盟 #tagCGViewTagFamily
#
#struct    tagCGViewTagFamily
#{
#    tagHead        Head;
#    DWORD        TagFamilyID;    // 目标仙盟ID,支持查看跨服仙盟
#};
def OnViewTagFamily(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    tagFamilyID = clientData.TagFamilyID
    clientPack = __GetTagFamilyInfoPack(tagFamilyID)
    if not clientPack:
        # 发送跨服服务器查询,可能是跨服仙盟
        dataMsg = {"playerID":playerID, "tagFamilyID":tagFamilyID}
        CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryCrossFamily, dataMsg)
        return
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
def __GetTagFamilyInfoPack(tagFamilyID):
    ## 获取查看目标仙盟同步封包
    familyManager = GameWorld.GetFamilyManager()
    family = familyManager.FindFamily(tagFamilyID)
    if not family:
        return
    clientPack = ChPyNetSendPack.tagGCTagFamilyInfo()
    clientPack.FamilyID = tagFamilyID
    clientPack.FamilyName = family.GetName()
    clientPack.FamilyLV = family.GetLV()
    clientPack.Broadcast = family.GetBroadcast()
    clientPack.BroadcastLen = len(clientPack.Broadcast)
    clientPack.Member = []
    for index in range(family.GetCount()):
        curMember = family.GetAt(index)
        mem = ChPyNetSendPack.tagGCTagFamilyMember()
        mem.PlayerID = curMember.GetPlayerID()
        mem.Name = curMember.GetName()
        mem.NameLen = len(mem.Name)
        mem.FamilyLV = curMember.GetFamilyLV()
        mem.LV = curMember.GetLV()
        mem.Job = curMember.GetJob()
        mem.Face = curMember.GetFace()
        mem.FacePic = curMember.GetFacePic()
        mem.OfficialRank = curMember.GetOfficialRank()
        fightPower = GetMemberFightPower(curMember)
        mem.FightPower = fightPower % ChConfig.Def_PerPointValue
        mem.FightPowerEx = fightPower / ChConfig.Def_PerPointValue
        clientPack.Member.append(mem)
    clientPack.MemberCount = len(clientPack.Member)
    familyFightPower = GetFamilyTotalFightPower(family)
    clientPack.FightPower = familyFightPower % ChConfig.Def_PerPointValue
    clientPack.FightPowerEx = familyFightPower / ChConfig.Def_PerPointValue
    clientPack.EmblemID = GetFamilyEmblemID(family)
    clientPack.ServerID = family.GetServerID()
    return clientPack
#class   IPY_CFamilyChangeBroadcast
#{
#public:
@@ -4193,3 +4250,18 @@
        
    return
def ClientServerMsg_QueryCrossFamily(serverGroupID, msgData):
    ## 子服查询跨服仙盟
    playerID = msgData["playerID"]
    tagFamilyID = msgData.get("tagFamilyID", 0)
    if tagFamilyID:
        clientPack = __GetTagFamilyInfoPack(tagFamilyID)
        if clientPack:
            NetPackCommon.SendFakePackByCross({playerID:serverGroupID}, clientPack)
        else:
            PlayerControl.NotifyCodeCross(serverGroupID, playerID, "TagFamilyNotExist")
        return
    # 可扩展查看跨服仙盟列表信息...
    return
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1744,6 +1744,7 @@
ClientServerMsg_QueryXiangong = "QueryXiangong" # 查看仙宫仙名录
ClientServerMsg_LianqiScore = "LianqiScore" # 炼器积分
ClientServerMsg_SyncFamilyInfo = "SyncFamilyInfo" # 仙盟信息同步
ClientServerMsg_QueryCrossFamily = "QueryCrossFamily" # 查询跨服仙盟
ClientServerMsg_FamilyGCZ = "FamilyGCZ" # 仙盟攻城战
#跨服广播类型定义
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -1026,6 +1026,58 @@
#------------------------------------------------------
# A4 14 查看目标仙盟 #tagCGViewTagFamily
class  tagCGViewTagFamily(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("TagFamilyID", c_int),    # 目标仙盟ID,支持查看跨服仙盟
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA4
        self.SubCmd = 0x14
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA4
        self.SubCmd = 0x14
        self.TagFamilyID = 0
        return
    def GetLength(self):
        return sizeof(tagCGViewTagFamily)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A4 14 查看目标仙盟 //tagCGViewTagFamily:
                                Cmd:%s,
                                SubCmd:%s,
                                TagFamilyID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.TagFamilyID
                                )
        return DumpString
m_NAtagCGViewTagFamily=tagCGViewTagFamily()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGViewTagFamily.Cmd,m_NAtagCGViewTagFamily.SubCmd))] = m_NAtagCGViewTagFamily
#------------------------------------------------------
# A9 03 关注BOSS刷新 #tagCGAttentionBoss
class  tagCGAttentionBoss(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -2712,6 +2712,246 @@
#------------------------------------------------------
# A4 13 查看目标仙盟返回信息 #tagGCTagFamilyInfo
class  tagGCTagFamilyMember(Structure):
    PlayerID = 0    #(DWORD PlayerID)
    NameLen = 0    #(BYTE NameLen)
    Name = ""    #(String Name)//size = NameLen
    FamilyLV = 0    #(BYTE FamilyLV)//家族成员等级
    LV = 0    #(WORD LV)
    Job = 0    #(BYTE Job)//ְҵ
    Face = 0    #(DWORD Face)//头像
    FacePic = 0    #(DWORD FacePic)//头像外框
    OfficialRank = 0    #(BYTE OfficialRank)//境界
    FightPower = 0    #(DWORD FightPower)//成员战力,求余亿部分
    FightPowerEx = 0    #(DWORD FightPowerEx)//成员战力,整除亿部分
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
        self.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.OfficialRank,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        return _pos
    def Clear(self):
        self.PlayerID = 0
        self.NameLen = 0
        self.Name = ""
        self.FamilyLV = 0
        self.LV = 0
        self.Job = 0
        self.Face = 0
        self.FacePic = 0
        self.OfficialRank = 0
        self.FightPower = 0
        self.FightPowerEx = 0
        return
    def GetLength(self):
        length = 0
        length += 4
        length += 1
        length += len(self.Name)
        length += 1
        length += 2
        length += 1
        length += 4
        length += 4
        length += 1
        length += 4
        length += 4
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteDWORD(data, self.PlayerID)
        data = CommFunc.WriteBYTE(data, self.NameLen)
        data = CommFunc.WriteString(data, self.NameLen, self.Name)
        data = CommFunc.WriteBYTE(data, self.FamilyLV)
        data = CommFunc.WriteWORD(data, self.LV)
        data = CommFunc.WriteBYTE(data, self.Job)
        data = CommFunc.WriteDWORD(data, self.Face)
        data = CommFunc.WriteDWORD(data, self.FacePic)
        data = CommFunc.WriteBYTE(data, self.OfficialRank)
        data = CommFunc.WriteDWORD(data, self.FightPower)
        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
        return data
    def OutputString(self):
        DumpString = '''
                                PlayerID:%d,
                                NameLen:%d,
                                Name:%s,
                                FamilyLV:%d,
                                LV:%d,
                                Job:%d,
                                Face:%d,
                                FacePic:%d,
                                OfficialRank:%d,
                                FightPower:%d,
                                FightPowerEx:%d
                                '''\
                                %(
                                self.PlayerID,
                                self.NameLen,
                                self.Name,
                                self.FamilyLV,
                                self.LV,
                                self.Job,
                                self.Face,
                                self.FacePic,
                                self.OfficialRank,
                                self.FightPower,
                                self.FightPowerEx
                                )
        return DumpString
class  tagGCTagFamilyInfo(Structure):
    Head = tagHead()
    FamilyID = 0    #(DWORD FamilyID)
    FamilyName = ""    #(char FamilyName[33])//家族名称
    FamilyLV = 0    #(WORD FamilyLV)//家族等级
    BroadcastLen = 0    #(WORD BroadcastLen)//公告
    Broadcast = ""    #(String Broadcast)//size = BroadcastLen
    MemberCount = 0    #(WORD MemberCount)//人数
    Member = list()    #(vector<tagGCTagFamilyMember> Member)//size = MemberCount
    FightPower = 0    #(DWORD FightPower)//仙盟总战力,求余亿部分
    FightPowerEx = 0    #(DWORD FightPowerEx)//仙盟总战力,整除亿部分
    EmblemID = 0    #(DWORD EmblemID)//徽章ID
    ServerID = 0    #(DWORD ServerID)//仙盟区服ID
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA4
        self.Head.SubCmd = 0x13
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FamilyName,_pos = CommFunc.ReadString(_lpData, _pos,33)
        self.FamilyLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.BroadcastLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.Broadcast,_pos = CommFunc.ReadString(_lpData, _pos,self.BroadcastLen)
        self.MemberCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
        for i in range(self.MemberCount):
            temMember = tagGCTagFamilyMember()
            _pos = temMember.ReadData(_lpData, _pos)
            self.Member.append(temMember)
        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA4
        self.Head.SubCmd = 0x13
        self.FamilyID = 0
        self.FamilyName = ""
        self.FamilyLV = 0
        self.BroadcastLen = 0
        self.Broadcast = ""
        self.MemberCount = 0
        self.Member = list()
        self.FightPower = 0
        self.FightPowerEx = 0
        self.EmblemID = 0
        self.ServerID = 0
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 4
        length += 33
        length += 2
        length += 2
        length += len(self.Broadcast)
        length += 2
        for i in range(self.MemberCount):
            length += self.Member[i].GetLength()
        length += 4
        length += 4
        length += 4
        length += 4
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteDWORD(data, self.FamilyID)
        data = CommFunc.WriteString(data, 33, self.FamilyName)
        data = CommFunc.WriteWORD(data, self.FamilyLV)
        data = CommFunc.WriteWORD(data, self.BroadcastLen)
        data = CommFunc.WriteString(data, self.BroadcastLen, self.Broadcast)
        data = CommFunc.WriteWORD(data, self.MemberCount)
        for i in range(self.MemberCount):
            data = CommFunc.WriteString(data, self.Member[i].GetLength(), self.Member[i].GetBuffer())
        data = CommFunc.WriteDWORD(data, self.FightPower)
        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
        data = CommFunc.WriteDWORD(data, self.EmblemID)
        data = CommFunc.WriteDWORD(data, self.ServerID)
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                FamilyID:%d,
                                FamilyName:%s,
                                FamilyLV:%d,
                                BroadcastLen:%d,
                                Broadcast:%s,
                                MemberCount:%d,
                                Member:%s,
                                FightPower:%d,
                                FightPowerEx:%d,
                                EmblemID:%d,
                                ServerID:%d
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.FamilyID,
                                self.FamilyName,
                                self.FamilyLV,
                                self.BroadcastLen,
                                self.Broadcast,
                                self.MemberCount,
                                "...",
                                self.FightPower,
                                self.FightPowerEx,
                                self.EmblemID,
                                self.ServerID
                                )
        return DumpString
m_NAtagGCTagFamilyInfo=tagGCTagFamilyInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCTagFamilyInfo.Head.Cmd,m_NAtagGCTagFamilyInfo.Head.SubCmd))] = m_NAtagGCTagFamilyInfo
#------------------------------------------------------
#A4 01  查看申请入会的玩家信息 #tagGCViewFamilyRequestInfo
class  tagtMemberInfo(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py
@@ -475,7 +475,7 @@
    return
def GetFamilyGCZAward(curPlayer, awardType, tick):
    ## 领奖 0-竞猜奖励;1-个人排行奖励;2-仙盟排名奖励;
    ## 领奖 0-竞猜奖励;1-个人排行奖励;2-仙盟排名奖励;3-点赞
    playerID = curPlayer.GetPlayerID()
    awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZAwardState)
    if awardState&pow(2, awardType):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1744,6 +1744,7 @@
ClientServerMsg_QueryXiangong = "QueryXiangong" # 查看仙宫仙名录
ClientServerMsg_LianqiScore = "LianqiScore" # 炼器积分
ClientServerMsg_SyncFamilyInfo = "SyncFamilyInfo" # 仙盟信息同步
ClientServerMsg_QueryCrossFamily = "QueryCrossFamily" # 查询跨服仙盟
ClientServerMsg_FamilyGCZ = "FamilyGCZ" # 仙盟攻城战
#跨服广播类型定义