From db6559bba9fef7a33f6f6e68863ca30eb428df68 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 16 四月 2025 14:50:43 +0800
Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(奖励增加支持仙官;优化称号、仙官、膜拜关联逻辑及配置;支持物品激活仙盟徽章;C026C028增加Job信息;)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py                       |   12 +++
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                       |   37 +++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                    |    5 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameXiangong.py                         |   61 +++++++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py                                  |    8 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                |   14 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py                    |    1 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                     |   14 +++
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py                           |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_FamilyEmblem.py |   34 ++++++++
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py                                 |   10 +
 ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py                                            |    8 +
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_GetFamilyByServerID.py                 |    8 +
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                         |    5 
 PySysDB/PySysDBG.h                                                                                    |   14 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                       |    4 
 16 files changed, 225 insertions(+), 13 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index fdadd3a..a299fe8 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -424,6 +424,18 @@
 	BYTE		LimitVIPLV;	//需要VIP等级
 };
 
+//物品表
+
+struct tagChinItem
+{
+	DWORD		_ItemID;	//物品ID
+	BYTE		ItemType;	//物品类型
+	DWORD		Effect1;	//道具使用效果1
+	DWORD		EffectValueA1;	//效果1的a值
+	DWORD		EffectValueB1;	//效果1的b值
+	DWORD		EffectValueC1;	//效果1的c值
+};
+
 //NPC表
 
 struct tagChinNPC
@@ -1587,6 +1599,8 @@
 	DWORD		TitleID;	//称号ID
 	list		AwardItemList;	//晋级仙宫奖励物品列表
 	char		MailKey;	//仙官通知邮件
+	BYTE		WorshipType;	//膜拜类型
+	DWORD		WorshipValue;	//膜拜值
 };
 
 //缥缈仙域表
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index ce3eeed..a12bdac 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -462,7 +462,7 @@
 Def_Billboard_MaxCnt = 100
 #---------------------------------------------------------------------
 #请求类型(需要和MapServer中的一致)
-Def_QueryType_Count = 55
+Def_QueryType_Count = 56
 (
 queryType_sqtPlayer,                  #查询玩家
 queryType_sqtFamilyWar,               #家族战
@@ -519,6 +519,7 @@
 queryType_EnterFB,                    #进入副本
 queryType_NPCInfo,                    #查询NPCInfo
 queryType_NPCCnt,                     #查询NPC数量
+queryType_FamilyEmblem,               #仙盟徽章
 ) = range(0, Def_QueryType_Count)
 #------------------------------------------------------------------------------ 
 #家族某行为类型保存的条数
@@ -925,3 +926,8 @@
                    ShareDefine.TYPE_Price_FamilyFlagWarPoint:Def_ItemID_FamilyFlagWarPoint,
                    }
 
+#写死的物品类型都放这边
+Def_ItemType_Title = 4           #称号
+
+#写死的物品效果ID都放这边------请按数值顺序存放
+Def_Effect_AddDienstgrad = 204   #使用物品获得称号
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index a86e5bf..53a6757 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -19460,6 +19460,7 @@
 class  tagGCFamilyGCZBatScenePlayer(Structure):
     PlayerID = 0    #(DWORD PlayerID)
     Name = ""    #(char Name[33])
+    Job = 0    #(BYTE Job)
     Face = 0    #(DWORD Face)
     FacePic = 0    #(DWORD FacePic)
     data = None
@@ -19472,6 +19473,7 @@
         self.Clear()
         self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
@@ -19479,6 +19481,7 @@
     def Clear(self):
         self.PlayerID = 0
         self.Name = ""
+        self.Job = 0
         self.Face = 0
         self.FacePic = 0
         return
@@ -19487,6 +19490,7 @@
         length = 0
         length += 4
         length += 33
+        length += 1
         length += 4
         length += 4
 
@@ -19496,6 +19500,7 @@
         data = ''
         data = CommFunc.WriteDWORD(data, self.PlayerID)
         data = CommFunc.WriteString(data, 33, self.Name)
+        data = CommFunc.WriteBYTE(data, self.Job)
         data = CommFunc.WriteDWORD(data, self.Face)
         data = CommFunc.WriteDWORD(data, self.FacePic)
         return data
@@ -19504,12 +19509,14 @@
         DumpString = '''
                                 PlayerID:%d,
                                 Name:%s,
+                                Job:%d,
                                 Face:%d,
                                 FacePic:%d
                                 '''\
                                 %(
                                 self.PlayerID,
                                 self.Name,
+                                self.Job,
                                 self.Face,
                                 self.FacePic
                                 )
@@ -19800,6 +19807,7 @@
     PlayerID = 0    #(DWORD PlayerID)
     Name = ""    #(char Name[33])//参与玩家名字
     FamilyLV = 0    #(BYTE FamilyLV)//参与时的家族职位
+    Job = 0    #(BYTE Job)
     Face = 0    #(DWORD Face)//基本脸型
     FacePic = 0    #(DWORD FacePic)//头像框
     FightPower = 0    #(DWORD FightPower)//战力,求余亿部分
@@ -19821,6 +19829,7 @@
         self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
         self.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
@@ -19837,6 +19846,7 @@
         self.PlayerID = 0
         self.Name = ""
         self.FamilyLV = 0
+        self.Job = 0
         self.Face = 0
         self.FacePic = 0
         self.FightPower = 0
@@ -19853,6 +19863,7 @@
         length = 0
         length += 4
         length += 33
+        length += 1
         length += 1
         length += 4
         length += 4
@@ -19872,6 +19883,7 @@
         data = CommFunc.WriteDWORD(data, self.PlayerID)
         data = CommFunc.WriteString(data, 33, self.Name)
         data = CommFunc.WriteBYTE(data, self.FamilyLV)
+        data = CommFunc.WriteBYTE(data, self.Job)
         data = CommFunc.WriteDWORD(data, self.Face)
         data = CommFunc.WriteDWORD(data, self.FacePic)
         data = CommFunc.WriteDWORD(data, self.FightPower)
@@ -19889,6 +19901,7 @@
                                 PlayerID:%d,
                                 Name:%s,
                                 FamilyLV:%d,
+                                Job:%d,
                                 Face:%d,
                                 FacePic:%d,
                                 FightPower:%d,
@@ -19904,6 +19917,7 @@
                                 self.PlayerID,
                                 self.Name,
                                 self.FamilyLV,
+                                self.Job,
                                 self.Face,
                                 self.FacePic,
                                 self.FightPower,
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_GetFamilyByServerID.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_GetFamilyByServerID.py
index 7aebf12..3b1a85d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_GetFamilyByServerID.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_GetFamilyByServerID.py
@@ -23,15 +23,19 @@
 def OnExec(orderId, gmCmdDict):
     serverIDList = eval(gmCmdDict.get("serverIDList", '[]')) 
     queryCnt = GameWorld.ToIntDef(gmCmdDict.get("queryCnt", '0')  , 100)
-    GameWorld.DebugLog("GMT_GetFamilyByServerID queryCnt=%s, %s, %s" % (queryCnt, serverIDList, gmCmdDict))
+    page = GameWorld.ToIntDef(gmCmdDict.get("page", '0')  , 1)
+    queryCnt = min(queryCnt, 100)
+    GameWorld.DebugLog("GMT_GetFamilyByServerID queryCnt=%s,page=%s, %s, %s" % (queryCnt, page, serverIDList, gmCmdDict))
     
     isCrossServer = GameWorld.IsCrossServer()
     familyMgr = GameWorld.GetFamilyManager()
     if isCrossServer:
-        sortFamilyIDList, totalCnt = PlayerFamily.SortCrossFamily(serverIDList, queryCnt)
+        sortFamilyIDList, totalCnt = PlayerFamily.SortCrossFamily(serverIDList, queryCnt, page)
     else:
         sortFamilyIDList = PlayerFamily.GetSortFamilyIDList()
         totalCnt = len(sortFamilyIDList)
+        startIndex = (page - 1) * queryCnt
+        sortFamilyIDList = sortFamilyIDList[startIndex:startIndex + queryCnt], totalCnt
         
     retCnt = 0
     familyList = []
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py
index f804b7e..7900f53 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py
@@ -28,6 +28,7 @@
 import NetPackCommon
 import PyDataManager
 import PlayerControl
+import GameXiangong
 import PyGameData
 import ChConfig
 import ChPlayer
@@ -2262,6 +2263,7 @@
         scenePlayer = ChPyNetSendPack.tagGCFamilyGCZBatScenePlayer()
         scenePlayer.PlayerID = playerID
         scenePlayer.Name = joinMember.playerName
+        scenePlayer.Job = joinMember.job
         scenePlayer.Face = joinMember.face
         scenePlayer.FacePic = joinMember.facePic
         clientPack.PlayerInfoList.append(scenePlayer)
@@ -2545,6 +2547,9 @@
         return
     
     __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, billRank, playerAwardItemList)
+    
+    serverIDList = actInfo.get(ShareDefine.ActKey_ServerIDRangeList, [])
+    GameXiangong.AddXiangongPlayerByItem(playerAwardItemList, playerID, serverIDList, billRank)
     return
 
 def __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, awardValue, awardItemList):
@@ -2616,6 +2621,9 @@
                 paramList = [billRank]
                 PlayerCompensation.SendMailByKey("FamilyGCZAwardHurt", [playerID], playerAwardItemList, paramList, crossMail=True)
                 
+                serverIDList = ipyData.GetServerIDRangeList()
+                GameXiangong.AddXiangongPlayerByItem(playerAwardItemList, playerID, serverIDList, billRank)
+                
         # 仙盟积分名次奖励
         if not joinMember.awardState&pow(2, AwwardType_FamilyScore):
             joinMember.awardState = joinMember.awardState | pow(2, AwwardType_FamilyScore)
@@ -2628,6 +2636,9 @@
             if playerAwardItemList:
                 paramList = [billRank]
                 PlayerCompensation.SendMailByKey("FamilyGCZAwardScore", [playerID], playerAwardItemList, paramList, crossMail=True)
+                
+                serverIDList = ipyData.GetServerIDRangeList()
+                GameXiangong.AddXiangongPlayerByItem(playerAwardItemList, playerID, serverIDList, billRank)
                 
         # 竞猜奖励
         if not joinMember.awardState&pow(2, AwwardType_Guess):
@@ -2917,6 +2928,7 @@
         defMem.PlayerID = playerID
         defMem.Name = joinMember.playerName
         defMem.FamilyLV = joinMember.fmLV
+        defMem.Job = joinMember.job
         defMem.Face = joinMember.face
         defMem.FacePic = joinMember.facePic
         defMem.FightPower = joinMember.fightPower % ChConfig.Def_PerPointValue
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameXiangong.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameXiangong.py
index 05f33e9..bab8d80 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameXiangong.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameXiangong.py
@@ -15,6 +15,7 @@
 #"""Version = 2024-09-04 16:30"""
 #-------------------------------------------------------------------------------
 
+import GameWorship
 import ShareDefine
 import PyDataManager
 import NetPackCommon
@@ -54,6 +55,58 @@
             return True
     return False
 
+def AddXiangongPlayerByItem(awardItemList, playerID, serverIDList, rank=None):
+    ## 根据奖励的物品信息自动发放仙官,仅跨服服务器
+    
+    if not GameWorld.IsCrossServer():
+        return
+    
+    titleID, titleItemID = 0, 0
+    for itemInfo in awardItemList:
+        itemID = itemInfo[0]
+        ipyData = IpyGameDataPY.GetIpyGameData("ChinItem", itemID)
+        if not ipyData:
+            continue
+        itemType = ipyData.GetItemType()
+        if itemType != ChConfig.Def_ItemType_Title:
+            continue
+        effID = ipyData.GetEffect1()
+        if effID != ChConfig.Def_Effect_AddDienstgrad:
+            continue
+        titleID = ipyData.GetEffectValueA1()
+        titleItemID = itemID
+        break
+    
+    if not titleID:
+        GameWorld.DebugLog("奖励没有给称号,不用处理称号仙官! %s" % str(awardItemList), playerID)
+        return
+    
+    xiangongID = GetTitleXiangongID(titleID)
+    if not xiangongID:
+        GameWorld.DebugLog("奖励的称号没有对应仙官不处理! titleItemID=%s,titleID=%s" % (titleItemID, titleID), playerID)
+        return
+    
+    GameWorld.Log("根据奖励称号物品晋升仙官: titleItemID=%s,titleID=%s,xiangongID=%s" % (titleItemID, titleID, xiangongID), playerID)
+    AddXiangongPlayer(xiangongID, playerID, serverIDList, rank)
+    return
+
+def GetTitleXiangongID(titleID):
+    ## 获取称号对应的仙宫ID
+    TitleXiangongIDDict = IpyGameDataPY.GetConfigEx("TitleXiangongID")
+    if not TitleXiangongIDDict:
+        TitleXiangongIDDict = {}
+        ipyDataMgr = IpyGameDataPY.IPY_Data()
+        for index in range(ipyDataMgr.GetXiangongCount()):
+            ipyData = ipyDataMgr.GetXiangongByIndex(index)
+            xiangongID = ipyData.GetXiangongID()
+            tID = ipyData.GetTitleID()
+            if not tID:
+                continue
+            TitleXiangongIDDict[tID] = xiangongID
+        IpyGameDataPY.SetConfigEx("TitleXiangongID", TitleXiangongIDDict)
+        GameWorld.Log("加载称号ID对应仙宫ID: %s" % TitleXiangongIDDict)
+    return TitleXiangongIDDict.get(titleID, 0)
+
 def AddXiangongPlayer(xiangongID, playerID, serverIDList, rank=None, syncDict=None):
     ## 添加新晋仙官玩家
     if not xiangongID:
@@ -85,11 +138,19 @@
         paramList = [rank, titleID, addQiyun]
         PlayerCompensation.SendMailByKey(ipyData.GetMailKey(), [playerID], addItemList, paramList, crossMail=True)
         
+    # 同步激活膜拜
+    worshipType = ipyData.GetWorshipType()
+    worshipValue = ipyData.GetWorshipValue()
+    if worshipType:
+        GameWorship.AddWorshipPlayer(worshipType, worshipValue, playerID, serverIDList)
+        
     if isinstance(syncDict, dict):
         if xiangongID not in syncDict:
             syncDict[xiangongID] = []
         newRecDataList = syncDict[xiangongID]
         newRecDataList.append(recData)
+    else:
+        SendNewXiangongPlayerToClientServer({xiangongID:[recData]})
     return
 
 def SendNewXiangongPlayerToClientServer(syncDict):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 2f00fb9..79c7e39 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -351,6 +351,15 @@
                         ("BYTE", "LimitVIPLV", 0),
                         ),
 
+                "ChinItem":(
+                        ("DWORD", "ItemID", 1),
+                        ("BYTE", "ItemType", 0),
+                        ("DWORD", "Effect1", 0),
+                        ("DWORD", "EffectValueA1", 0),
+                        ("DWORD", "EffectValueB1", 0),
+                        ("DWORD", "EffectValueC1", 0),
+                        ),
+
                 "ChinNPC":(
                         ("DWORD", "NPCID", 1),
                         ("char", "NPCName", 0),
@@ -1262,6 +1271,8 @@
                         ("DWORD", "TitleID", 0),
                         ("list", "AwardItemList", 0),
                         ("char", "MailKey", 0),
+                        ("BYTE", "WorshipType", 0),
+                        ("DWORD", "WorshipValue", 0),
                         ),
 
                 "FairyDomain":(
@@ -1769,6 +1780,20 @@
     def GetLimitMagicWeapon(self): return self.attrTuple[2] # 需要解锁法宝ID DWORD
     def GetLimiRealmLV(self): return self.attrTuple[3] # 需要境界等级 WORD
     def GetLimitVIPLV(self): return self.attrTuple[4] # 需要VIP等级 BYTE
+
+# 物品表
+class IPY_ChinItem():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetItemID(self): return self.attrTuple[0] # 物品ID DWORD
+    def GetItemType(self): return self.attrTuple[1] # 物品类型 BYTE
+    def GetEffect1(self): return self.attrTuple[2] # 道具使用效果1 DWORD
+    def GetEffectValueA1(self): return self.attrTuple[3] # 效果1的a值 DWORD
+    def GetEffectValueB1(self): return self.attrTuple[4] # 效果1的b值 DWORD
+    def GetEffectValueC1(self): return self.attrTuple[5] # 效果1的c值 DWORD
 
 # NPC表
 class IPY_ChinNPC():
@@ -3096,7 +3121,9 @@
     def GetMoneyValue(self): return self.attrTuple[3] # 货币值 DWORD
     def GetTitleID(self): return self.attrTuple[4] # 称号ID DWORD
     def GetAwardItemList(self): return self.attrTuple[5] # 晋级仙宫奖励物品列表 list
-    def GetMailKey(self): return self.attrTuple[6] # 仙官通知邮件 char
+    def GetMailKey(self): return self.attrTuple[6] # 仙官通知邮件 char
+    def GetWorshipType(self): return self.attrTuple[7] # 膜拜类型 BYTE
+    def GetWorshipValue(self): return self.attrTuple[8] # 膜拜值 DWORD
 
 # 缥缈仙域表
 class IPY_FairyDomain():
@@ -3200,6 +3227,7 @@
         self.__LoadFileData("ActFeastWish", onlyCheck)
         self.__LoadFileData("ActFeastTravel", onlyCheck)
         self.__LoadFileData("FuncOpenLV", onlyCheck)
+        self.__LoadFileData("ChinItem", onlyCheck)
         self.__LoadFileData("ChinNPC", onlyCheck)
         self.__LoadFileData("PlayerLV", onlyCheck)
         self.__LoadFileData("VipPrivilege", onlyCheck)
@@ -3745,6 +3773,13 @@
         self.CheckLoadData("FuncOpenLV")
         return self.ipyFuncOpenLVCache[index]
 
+    def GetChinItemCount(self):
+        self.CheckLoadData("ChinItem")
+        return self.ipyChinItemLen
+    def GetChinItemByIndex(self, index):
+        self.CheckLoadData("ChinItem")
+        return self.ipyChinItemCache[index]
+
     def GetChinNPCCount(self):
         self.CheckLoadData("ChinNPC")
         return self.ipyChinNPCLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
index d190580..e779af4 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
@@ -3027,10 +3027,11 @@
             return cmp(GetMemberJoinTime(member1), GetMemberJoinTime(member2))
     return ret
 
-def SortCrossFamily(serverIDList, top=0):
+def SortCrossFamily(serverIDList, getCnt=0, page=1):
     ''' 跨服仙盟排序, 排序规则: 总战力  > 等级 > ID
     @param serverIDList: 仙盟所属区服ID范围列表
-    @param top: 返回排序靠前x个仙盟,0则全部返回
+    @param getCnt: 返回排序靠前x个仙盟,0则全部返回
+    @param page: 第几页
     '''
     familyList = []
     familyManager = GameWorld.GetFamilyManager()
@@ -3042,7 +3043,10 @@
         familyList.append(family)
     familyList.sort(key=lambda f: (GetFamilyTotalFightPower(f), f.GetLV(), f.GetID()), reverse=True)
     totalCnt = len(familyList)
-    return familyList[:top] if top else familyList, totalCnt
+    if getCnt:
+        startIndex = (page - 1) * getCnt
+        return familyList[startIndex:startIndex + getCnt], totalCnt
+    return familyList, totalCnt
     
 #---------------------------------------------------------------------
 ##通知地图服务器, 玩家家族属性刷新
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py
index 87b8a0a..cff7771 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py
@@ -85,7 +85,8 @@
 def AddFamilyEmblem(familyID, emblemID, setExpireTimes=None):
     ## 添加仙盟徽章
     # @param setExpireTimes: 指定的有效时长秒,0-永久,>0-有效时长秒;没有指定时直接读配置进行累加
-    
+    if not familyID or not emblemID:
+        return
     ipyData = IpyGameDataPY.GetIpyGameData("FamilyEmblem", emblemID)
     if not ipyData:
         return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index 610f2b3..0d5af85 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -52,6 +52,7 @@
 import GameWorldBoss
 import GameWorldFamilyWar
 #import PlayerFamilyTech
+import PlayerFamilyEmblem
 import PlayerFamilyZhenfa
 import PlayerFamilyRedPacket
 import PlayerFamilyZhenbaoge
@@ -268,6 +269,13 @@
         PlayerFamily.PlayerExecLeaderImpeach(curPlayer, tick)
         return
     
+    elif queryType == ChConfig.queryType_FamilyEmblem:
+        #玩家激活仙盟徽章
+        familyID = curPlayer.GetFamilyID()
+        emblemID = GameWorld.ToIntDef(sendCMD)
+        PlayerFamilyEmblem.AddFamilyEmblem(familyID, emblemID)
+        return
+    
     #角色改名
     elif queryType == ChConfig.queryType_UpdatePlayerName:
         UpdatePlayerName.MapServer_UpdatePlayerName(curPlayer, sendCMD, tick)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 8dd11aa..12d464c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1409,11 +1409,12 @@
                        Def_WorshipType_CrossXianXiaMJ, # 跨服秘境寻宝 4
                        Def_WorshipType_CrossHorsePetTrain, # 跨服骑宠养成 5
                        Def_WorshipType_CrossGubaoTrain, # 跨服古宝养成 6
-                       ) = range(1, 1 + 6)
+                       Def_WorshipType_FamilyGCZ, # 仙盟攻城战 7
+                       ) = range(1, 1 + 7)
 
 #跨服膜拜类型
 Def_WorshipTypeCross = [Def_WorshipType_CrossChampionship, Def_WorshipType_CrossBossTrial, Def_WorshipType_CrossXianXiaMJ, 
-                        Def_WorshipType_CrossHorsePetTrain, Def_WorshipType_CrossGubaoTrain,
+                        Def_WorshipType_CrossHorsePetTrain, Def_WorshipType_CrossGubaoTrain, Def_WorshipType_FamilyGCZ,
                         ]
 
 #玩家记录类型
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 01d2100..713c71b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -541,6 +541,7 @@
 Def_Effect_FacePic = 275   #头像框物品;A值-头像框ID
 Def_Effect_EmojiPack = 276   #表情包物品;A值-表情包ID
 Def_Effect_RecycleItemMoney = 277   #回收物品转化为货币; A值-直接给货币物品ID;B值-货币数量
+Def_Effect_FamilyEmblem = 278   #激活仙盟徽章; A值-徽章ID;
 #----以下未使用或代码依然存在的---
 Def_Effect_ItemGiveGongXun = 1920        #使用道具给予功勋
 Def_Effect_ItemGiveRuneJH = 1925       #使用道具给予符印精华
@@ -2636,7 +2637,7 @@
 
 #---------------------------------------------------------------------
 #请求类型(需要和GameServer中的一致)
-Def_QueryType_Count = 55
+Def_QueryType_Count = 56
 (
 queryType_sqtPlayer,                  #查询玩家
 queryType_sqtFamilyWar,               #家族战
@@ -2693,6 +2694,7 @@
 queryType_EnterFB,                    #进入副本
 queryType_NPCInfo,                    #查询NPCInfo
 queryType_NPCCnt,                     #查询NPC数量
+queryType_FamilyEmblem,               #仙盟徽章
 ) = range(0, Def_QueryType_Count)
 #------------------------------------------------------------------------------ 
 #---------------------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index a86e5bf..53a6757 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -19460,6 +19460,7 @@
 class  tagGCFamilyGCZBatScenePlayer(Structure):
     PlayerID = 0    #(DWORD PlayerID)
     Name = ""    #(char Name[33])
+    Job = 0    #(BYTE Job)
     Face = 0    #(DWORD Face)
     FacePic = 0    #(DWORD FacePic)
     data = None
@@ -19472,6 +19473,7 @@
         self.Clear()
         self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
@@ -19479,6 +19481,7 @@
     def Clear(self):
         self.PlayerID = 0
         self.Name = ""
+        self.Job = 0
         self.Face = 0
         self.FacePic = 0
         return
@@ -19487,6 +19490,7 @@
         length = 0
         length += 4
         length += 33
+        length += 1
         length += 4
         length += 4
 
@@ -19496,6 +19500,7 @@
         data = ''
         data = CommFunc.WriteDWORD(data, self.PlayerID)
         data = CommFunc.WriteString(data, 33, self.Name)
+        data = CommFunc.WriteBYTE(data, self.Job)
         data = CommFunc.WriteDWORD(data, self.Face)
         data = CommFunc.WriteDWORD(data, self.FacePic)
         return data
@@ -19504,12 +19509,14 @@
         DumpString = '''
                                 PlayerID:%d,
                                 Name:%s,
+                                Job:%d,
                                 Face:%d,
                                 FacePic:%d
                                 '''\
                                 %(
                                 self.PlayerID,
                                 self.Name,
+                                self.Job,
                                 self.Face,
                                 self.FacePic
                                 )
@@ -19800,6 +19807,7 @@
     PlayerID = 0    #(DWORD PlayerID)
     Name = ""    #(char Name[33])//参与玩家名字
     FamilyLV = 0    #(BYTE FamilyLV)//参与时的家族职位
+    Job = 0    #(BYTE Job)
     Face = 0    #(DWORD Face)//基本脸型
     FacePic = 0    #(DWORD FacePic)//头像框
     FightPower = 0    #(DWORD FightPower)//战力,求余亿部分
@@ -19821,6 +19829,7 @@
         self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
         self.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
@@ -19837,6 +19846,7 @@
         self.PlayerID = 0
         self.Name = ""
         self.FamilyLV = 0
+        self.Job = 0
         self.Face = 0
         self.FacePic = 0
         self.FightPower = 0
@@ -19853,6 +19863,7 @@
         length = 0
         length += 4
         length += 33
+        length += 1
         length += 1
         length += 4
         length += 4
@@ -19872,6 +19883,7 @@
         data = CommFunc.WriteDWORD(data, self.PlayerID)
         data = CommFunc.WriteString(data, 33, self.Name)
         data = CommFunc.WriteBYTE(data, self.FamilyLV)
+        data = CommFunc.WriteBYTE(data, self.Job)
         data = CommFunc.WriteDWORD(data, self.Face)
         data = CommFunc.WriteDWORD(data, self.FacePic)
         data = CommFunc.WriteDWORD(data, self.FightPower)
@@ -19889,6 +19901,7 @@
                                 PlayerID:%d,
                                 Name:%s,
                                 FamilyLV:%d,
+                                Job:%d,
                                 Face:%d,
                                 FacePic:%d,
                                 FightPower:%d,
@@ -19904,6 +19917,7 @@
                                 self.PlayerID,
                                 self.Name,
                                 self.FamilyLV,
+                                self.Job,
                                 self.Face,
                                 self.FacePic,
                                 self.FightPower,
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
index e835f25..054bc14 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
@@ -739,6 +739,7 @@
                             ChConfig.Def_Effect_AddMagicWeaponUpExp:"Item_AddMagicWeaponUpExp", # 增加法宝升星经验
                             ChConfig.Def_Effect_ChatBubbleBox:"Item_ChatBubbleBox", # 激活聊天气泡框
                             ChConfig.Def_Effect_EmojiPack:"Item_EmojiPack",
+                            ChConfig.Def_Effect_FamilyEmblem:"Item_FamilyEmblem",
                             ChConfig.Def_Effect_ItemGiveWeekPartyPoint:"Item_WeekPartyPoint", # 增加活动巡礼积分
                             ChConfig.Def_Effect_ItemGiveWeekPartyPoint1:"Item_WeekPartyPoint", # 增加活动巡礼积分
                             ChConfig.Def_Effect_AddRealmExpRate:"Item_AddRealmExpRate", # 增加聚灵效率
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_FamilyEmblem.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_FamilyEmblem.py
new file mode 100644
index 0000000..d6181c6
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_FamilyEmblem.py
@@ -0,0 +1,34 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package UseItem.Item_FamilyEmblem
+#
+# @todo:仙盟徽章
+# @author hxp
+# @date 2025-04-16
+# @version 1.0
+#
+# 详细描述: 仙盟徽章
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-04-16 15:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import ItemCommon
+import GameWorld
+
+def UseItem(curPlayer, curRoleItem, tick):
+    useItemEff = curRoleItem.GetEffectByIndex(0)
+    emblemID = useItemEff.GetEffectValue(0) 
+    if emblemID == 0:
+        return
+    if not curPlayer.GetFamilyID():
+        GameWorld.DebugLog("玩家没有仙盟,无法使用徽章物品!", curPlayer.GetPlayerID())
+        return
+    ItemCommon.DelItem(curPlayer, curRoleItem, 1, False, "FamilyEmblem", isForceDR=True)
+    #通知GameServer激活
+    sendMsg = str(emblemID)
+    curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_FamilyEmblem, 0, '', sendMsg, len(sendMsg))
+    return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 8dd11aa..12d464c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1409,11 +1409,12 @@
                        Def_WorshipType_CrossXianXiaMJ, # 跨服秘境寻宝 4
                        Def_WorshipType_CrossHorsePetTrain, # 跨服骑宠养成 5
                        Def_WorshipType_CrossGubaoTrain, # 跨服古宝养成 6
-                       ) = range(1, 1 + 6)
+                       Def_WorshipType_FamilyGCZ, # 仙盟攻城战 7
+                       ) = range(1, 1 + 7)
 
 #跨服膜拜类型
 Def_WorshipTypeCross = [Def_WorshipType_CrossChampionship, Def_WorshipType_CrossBossTrial, Def_WorshipType_CrossXianXiaMJ, 
-                        Def_WorshipType_CrossHorsePetTrain, Def_WorshipType_CrossGubaoTrain,
+                        Def_WorshipType_CrossHorsePetTrain, Def_WorshipType_CrossGubaoTrain, Def_WorshipType_FamilyGCZ,
                         ]
 
 #玩家记录类型

--
Gitblit v1.8.0