From cb45ad934671c0c54c1024f834e630109dfa5c73 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 14 四月 2025 15:01:13 +0800
Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(增加查看其他指定仙盟/跨服仙盟支持;增加领取点赞奖励;修改仙盟轮次伤害计算规则受当前城池剩余生命影响;)

---
 ServerPython/CoreServerGroup/GameServer/PyNetPack.ini                                            |    6 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py                  |   62 +++-
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py                   |    3 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py                            |   72 +++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py               |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py               |   52 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py           |  240 ++++++++++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                    |   52 ++++
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                    |    1 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                |  240 ++++++++++++++++++
 11 files changed, 706 insertions(+), 25 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
index 2f79136..fb350d6 100644
--- a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
+++ b/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
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 102b350..939ec1a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 7d19ab1..a86e5bf 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py
index c5ac94a..115236e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py
+++ b/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
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
index 5d1ff92..89c19a8 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
+++ b/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)
             
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
index ff60117..d190580 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
+++ b/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
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 0eeba7b..8dd11aa 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/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" # 仙盟攻城战
 
 #跨服广播类型定义
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 102b350..939ec1a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 7d19ab1..a86e5bf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py
index d90726d..64d3b20 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py
+++ b/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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 0eeba7b..8dd11aa 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/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" # 仙盟攻城战
 
 #跨服广播类型定义

--
Gitblit v1.8.0