From 83ea442cfaceaf76648c6ec948e4494a10e228db Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 12 九月 2024 17:01:40 +0800
Subject: [PATCH] 10261 【越南】【砍树】仙盟徽章,头像框,头像(动态),聊天气泡,聊天表情(增加仙盟徽章)

---
 ServerPython/CoreServerGroup/GameServer/PyNetPack.ini                                             |    6 
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                   |   25 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py        |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                |   63 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py            |   11 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                     |   63 ++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                 |   11 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py                       |  200 ++++++++++++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py                             |   35 ++
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetFamilyInfo.py                       |   87 ++++----
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py                 |    2 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                     |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py       |    4 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py                       |   45 ++++
 PySysDB/PySysDBG.h                                                                                |    9 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                   |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py |    1 
 18 files changed, 514 insertions(+), 58 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index 97a40c6..b9ad138 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -39,6 +39,15 @@
 	BYTE		BossFBCnt;	//BOSS副本次数
 };
 
+//仙盟徽章表
+
+struct tagFamilyEmblem
+{
+	BYTE		_EmblemID;	//徽章ID
+	BYTE		UnlockFamilyLV;	//解锁仙盟等级,为0时代表其他方式解锁
+	DWORD		ExpireMinutes;	//有效时长,分钟
+};
+
 //仙盟试炼伤血奖励表
 
 struct tagFamilyBossHurtAward
diff --git a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
index 512e415..96477c9 100644
--- a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
+++ b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
@@ -39,7 +39,7 @@
 Writer = Alee
 Releaser = Alee
 RegType = 0
-RegisterPackCount = 9
+RegisterPackCount = 10
 
 PacketCMD_1=0xA4
 PacketSubCMD_1=0x01
@@ -77,6 +77,10 @@
 PacketSubCMD_9=0x12
 PacketCallFunc_9=PySearchFamily
 
+PacketCMD_10=0xA4
+PacketSubCMD_10=0x13
+PacketCallFunc_10=OnChangeFamilyEmblem
+
 [GameWorldFamilyWar]
 ScriptName = GameWorldLogic\GameWorldFamilyWar.py
 Writer = hxp
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 4265437..0f9e00f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -379,6 +379,58 @@
 
 
 #------------------------------------------------------
+# A4 13 修改家族徽章 #tagCGChangeFamilyEmblem
+
+class  tagCGChangeFamilyEmblem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("EmblemID", c_ubyte),    # 更换的徽章ID
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA4
+        self.SubCmd = 0x13
+        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 = 0x13
+        self.EmblemID = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCGChangeFamilyEmblem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A4 13 修改家族徽章 //tagCGChangeFamilyEmblem:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                EmblemID:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.EmblemID
+                                )
+        return DumpString
+
+
+m_NAtagCGChangeFamilyEmblem=tagCGChangeFamilyEmblem()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGChangeFamilyEmblem.Cmd,m_NAtagCGChangeFamilyEmblem.SubCmd))] = m_NAtagCGChangeFamilyEmblem
+
+
+#------------------------------------------------------
 # A4 08 查询家族行为信息 #tagCGQueryFamilyAction
 
 class  tagCGQueryFamilyAction(Structure):
@@ -712,6 +764,7 @@
     Head = tagHead()
     Name = ""    #(char Name[33])
     FakeID = 0    #(WORD FakeID)//假仙盟编号
+    EmblemID = 0    #(BYTE EmblemID)//选择徽章ID,解锁仙盟等级为1级的均为可选ID
     data = None
 
     def __init__(self):
@@ -725,6 +778,7 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
         self.FakeID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.EmblemID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -734,6 +788,7 @@
         self.Head.SubCmd = 0x04
         self.Name = ""
         self.FakeID = 0
+        self.EmblemID = 0
         return
 
     def GetLength(self):
@@ -741,6 +796,7 @@
         length += self.Head.GetLength()
         length += 33
         length += 2
+        length += 1
 
         return length
 
@@ -749,18 +805,21 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteString(data, 33, self.Name)
         data = CommFunc.WriteWORD(data, self.FakeID)
+        data = CommFunc.WriteBYTE(data, self.EmblemID)
         return data
 
     def OutputString(self):
         DumpString = '''
                                 Head:%s,
                                 Name:%s,
-                                FakeID:%d
+                                FakeID:%d,
+                                EmblemID:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.Name,
-                                self.FakeID
+                                self.FakeID,
+                                self.EmblemID
                                 )
         return DumpString
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index f208134..4a01742 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -2409,6 +2409,7 @@
     WarRank = 0    #(BYTE WarRank)//联赛排名
     TotalFightPower = 0    #(DWORD TotalFightPower)//总战力,不足1个亿的部分
     TotalFightPowerEx = 0    #(DWORD TotalFightPowerEx)//总战力点,1点=1亿
+    EmblemID = 0    #(BYTE EmblemID)//徽章ID
     data = None
 
     def __init__(self):
@@ -2431,6 +2432,7 @@
         self.WarRank,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.TotalFightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.TotalFightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.EmblemID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -2448,6 +2450,7 @@
         self.WarRank = 0
         self.TotalFightPower = 0
         self.TotalFightPowerEx = 0
+        self.EmblemID = 0
         return
 
     def GetLength(self):
@@ -2466,6 +2469,7 @@
         length += 1
         length += 4
         length += 4
+        length += 1
 
         return length
 
@@ -2485,6 +2489,7 @@
         data = CommFunc.WriteBYTE(data, self.WarRank)
         data = CommFunc.WriteDWORD(data, self.TotalFightPower)
         data = CommFunc.WriteDWORD(data, self.TotalFightPowerEx)
+        data = CommFunc.WriteBYTE(data, self.EmblemID)
         return data
 
     def OutputString(self):
@@ -2502,7 +2507,8 @@
                                 JoinAccept:%d,
                                 WarRank:%d,
                                 TotalFightPower:%d,
-                                TotalFightPowerEx:%d
+                                TotalFightPowerEx:%d,
+                                EmblemID:%d
                                 '''\
                                 %(
                                 self.FamilyIndex,
@@ -2518,7 +2524,8 @@
                                 self.JoinAccept,
                                 self.WarRank,
                                 self.TotalFightPower,
-                                self.TotalFightPowerEx
+                                self.TotalFightPowerEx,
+                                self.EmblemID
                                 )
         return DumpString
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetFamilyInfo.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetFamilyInfo.py
index 8454d86..fd72e8a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetFamilyInfo.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetFamilyInfo.py
@@ -17,6 +17,7 @@
 #---------------------------------------------------------------------
 #"""Version = 2016-06-06 22:00"""
 #---------------------------------------------------------------------
+import PlayerFamilyEmblem
 import PlayerFamily
 import GameWorld
 #---------------------------------------------------------------------
@@ -28,7 +29,8 @@
 Def_FamilyInfo_FightPower,                       # 设置家族总战力
 Def_FamilyInfo_BossFood,                         # 设置家族兽粮
 Def_FamilyInfo_WeekMissionMoney,                 # 本周任务资金
-) = range(6)
+Def_FamilyInfo_Emblem,                           # 徽章
+) = range(7)
 
 #系统提示信息表
 Def_MsgDict = {
@@ -38,11 +40,8 @@
                Def_FamilyInfo_FightPower:'总战力',
                Def_FamilyInfo_BossFood:'兽粮',
                Def_FamilyInfo_WeekMissionMoney:'本周任务资金',
-               "all":'所有属性',
+               Def_FamilyInfo_Emblem:'设置徽章',
                }
-
-#设置全部属性时需要设置的属性类型, 一般用于快速测试用
-Def_SetAllFamilyInfoList = [Def_FamilyInfo_Money]
 #---------------------------------------------------------------------
 ## 执行逻辑
 #  @param curPlayer 当前玩家
@@ -50,13 +49,14 @@
 #  @return None
 #  @remarks 函数详细说明.
 def OnExec(curPlayer, cmdList):
-    if len(cmdList) != 2:
+    if not cmdList:
         helpStr = ""
         for index, name in Def_MsgDict.items():
             helpStr = helpStr + "%s-%s," % (index, name)
         GameWorld.DebugAnswer(curPlayer, 'SetFamilyInfo 类型 数值')
         GameWorld.DebugAnswer(curPlayer, '%s' % helpStr)
         #GameWorld.DebugAnswer(curPlayer, '    特殊: SetFamilyInfo all, 数值; 可设置所有战盟属性数值')
+        GameWorld.DebugAnswer(curPlayer, '设置徽章: %s 徽章ID [剩余时间秒]' % Def_FamilyInfo_Emblem)
         return
     
     curFamily = curPlayer.GetFamily()
@@ -65,12 +65,13 @@
         GameWorld.DebugAnswer(curPlayer, 'SetFamilyInfo 错误 玩家无家族')
         return
     
-    funcType, funcValue = cmdList
-    infoTypeList = [funcType]
-    if funcType == "all":
-        infoTypeList = Def_SetAllFamilyInfoList
-        
-    __SetFamilyInfoValue(curPlayer, curFamily, infoTypeList, funcValue)
+    funcType = cmdList[0]
+    funcValue = cmdList[1] if len(cmdList) > 1 else 0
+    
+    if not __SetFamilyInfoValue(curPlayer, curFamily, funcType, funcValue, cmdList):
+        GameWorld.DebugAnswer(curPlayer, '设置家族%s 失败, 数值 = %s'%(Def_MsgDict[funcType], funcValue))
+        return
+    
     #通知客户端刷新
     curFamily.Broadcast_FamilyChange()
     #通知地图服务器刷新
@@ -79,44 +80,50 @@
     GameWorld.DebugAnswer(curPlayer, '设置家族%s 成功, 数值 = %s'%(Def_MsgDict[funcType], funcValue))
     return
 
-def __SetFamilyInfoValue(curPlayer, curFamily, infoTypeList, funcValue):
+def __SetFamilyInfoValue(curPlayer, curFamily, funcType, funcValue, cmdList):
     isLVUP = False
     isSort = False
-
-    for funcType in infoTypeList:
+    
+    if funcType == Def_FamilyInfo_LV:
+        curFamily.SetLV(funcValue)
+        isSort = True
         
-        if funcType == Def_FamilyInfo_LV:
-            curFamily.SetLV(funcValue)
-            isSort = True
-            
-        elif funcType == Def_FamilyInfo_Money:
-            curFamily.SetMoney(funcValue)
-            isLVUP = True
-            if funcValue == 0:
-                PlayerFamily.SetCurWeekMissionMoney(curFamily, 0)
-                
-        elif funcType == Def_FamilyInfo_WarRank:
-            PlayerFamily.SetFamilyWarRank(curFamily, funcValue)
-            isSort = True
-        
-        elif funcType == Def_FamilyInfo_FightPower:
-            PlayerFamily.SetFamilyTotalFightPower(curFamily, funcValue)
-            isSort = True
-            
-        elif funcType == Def_FamilyInfo_BossFood:
-            PlayerFamily.SetFamilyBossFood(curFamily, funcValue)
-            
-        elif funcType == Def_FamilyInfo_WeekMissionMoney:
+    elif funcType == Def_FamilyInfo_Money:
+        curFamily.SetMoney(funcValue)
+        isLVUP = True
+        if funcValue == 0:
             PlayerFamily.SetCurWeekMissionMoney(curFamily, 0)
             
-        else:
-            GameWorld.DebugAnswer(curPlayer, 'SetFamilyInfo 错误 funcType = %s'%(funcType))
+    elif funcType == Def_FamilyInfo_WarRank:
+        PlayerFamily.SetFamilyWarRank(curFamily, funcValue)
+        isSort = True
+    
+    elif funcType == Def_FamilyInfo_FightPower:
+        PlayerFamily.SetFamilyTotalFightPower(curFamily, funcValue)
+        isSort = True
+        
+    elif funcType == Def_FamilyInfo_BossFood:
+        PlayerFamily.SetFamilyBossFood(curFamily, funcValue)
+        
+    elif funcType == Def_FamilyInfo_WeekMissionMoney:
+        PlayerFamily.SetCurWeekMissionMoney(curFamily, 0)
+        
+    elif funcType == Def_FamilyInfo_Emblem:
+        setExpireTimes = None
+        if len(cmdList) > 2:
+            setExpireTimes = cmdList[2]
+        if not PlayerFamilyEmblem.AddFamilyEmblem(curFamily.GetID(), funcValue, setExpireTimes):
+            return
+        
+    else:
+        return
+    
     #自动升级战盟
     if isLVUP:
         if PlayerFamily.DoFamilyLvUp(curFamily):
             isSort = False
     if isSort:
         PlayerFamily.DoFamilySort()
-    return
+    return True
 
     
\ No newline at end of file
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index 6d688c0..4f469c5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -98,6 +98,7 @@
 import IpyGameDataPY
 import PlayerFamilyParty
 import PlayerFamilyZhenfa
+import PlayerFamilyEmblem
 import GameWorldFamilyWar
 import GameWorldArena
 import CrossLuckyCloudBuy
@@ -401,6 +402,7 @@
     if curMinute % 5 == 0:
         PlayerFamily.UpdFamilyTotalFightPower()
         PlayerFamilyRedPacket.CheckDelRedpacketData()
+        PlayerFamilyEmblem.CheckExpireEmblem()
         
     return
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 2a98b53..348090e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -62,6 +62,12 @@
                         ("BYTE", "BossFBCnt", 0),
                         ),
 
+                "FamilyEmblem":(
+                        ("BYTE", "EmblemID", 1),
+                        ("BYTE", "UnlockFamilyLV", 0),
+                        ("DWORD", "ExpireMinutes", 0),
+                        ),
+
                 "FamilyBossHurtAward":(
                         ("BYTE", "AwardType", 1),
                         ("BYTE", "RecordIndex", 1),
@@ -1212,6 +1218,17 @@
     def GetNeedMoney(self): return self.attrTuple[4] # 升级需要资金 DWORD
     def GetWeekMissionMoneyMax(self): return self.attrTuple[5] # 每周任务最大可获得仙盟资金 DWORD
     def GetBossFBCnt(self): return self.attrTuple[6] # BOSS副本次数 BYTE
+
+# 仙盟徽章表
+class IPY_FamilyEmblem():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetEmblemID(self): return self.attrTuple[0] # 徽章ID BYTE
+    def GetUnlockFamilyLV(self): return self.attrTuple[1] # 解锁仙盟等级,为0时代表其他方式解锁 BYTE
+    def GetExpireMinutes(self): return self.attrTuple[2] # 有效时长,分钟 DWORD
 
 # 仙盟试炼伤血奖励表
 class IPY_FamilyBossHurtAward():
@@ -2882,6 +2899,7 @@
         self.__LoadFileData("CreateRoleLimitServer", onlyCheck)
         self.__LoadFileData("WorldLV", onlyCheck)
         self.__LoadFileData("Family", onlyCheck)
+        self.__LoadFileData("FamilyEmblem", onlyCheck)
         self.__LoadFileData("FamilyBossHurtAward", onlyCheck)
         self.__LoadFileData("FamilyZhenfa", onlyCheck)
         self.__LoadFileData("MarketQuery", onlyCheck)
@@ -3217,6 +3235,13 @@
         self.CheckLoadData("Family")
         return self.ipyFamilyCache[index]
 
+    def GetFamilyEmblemCount(self):
+        self.CheckLoadData("FamilyEmblem")
+        return self.ipyFamilyEmblemLen
+    def GetFamilyEmblemByIndex(self, index):
+        self.CheckLoadData("FamilyEmblem")
+        return self.ipyFamilyEmblemCache[index]
+
     def GetFamilyBossHurtAwardCount(self):
         self.CheckLoadData("FamilyBossHurtAward")
         return self.ipyFamilyBossHurtAwardLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
index 9dc63bf..8b22ad5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
@@ -38,6 +38,7 @@
 import PlayerBillboard
 import PlayerActBossTrial
 import PlayerCompensation
+import PlayerFamilyEmblem
 import PlayerFamilyParty
 import PlayerFamilySWRH
 import PlayerViewCache
@@ -75,9 +76,9 @@
     if not family:
         return 0
     return GetFamilyTotalFightPower(family)
-# 徽章
-def GetFamilyEmblem(curFamily): return curFamily.GetExtra6()
-def SetFamilyEmblem(curFamily, value): return curFamily.SetExtra6(value)
+# 徽章ID
+def GetFamilyEmblemID(curFamily): return curFamily.GetExtra6()
+def SetFamilyEmblemID(curFamily, emblemID): return curFamily.SetExtra6(emblemID)
 
 # 公告修改次数
 def GetFamilyBroadcastCnt(curFamily): return curFamily.GetExtra3()
@@ -270,7 +271,7 @@
 #  @param tick 当前时间
 #  @return None
 #  @remarks 函数详细说明.
-def DoCreateFamily(curPlayer, familyName, fakeIndex, tick):
+def DoCreateFamily(curPlayer, familyName, fakeIndex, tick, emblemID=0):
     #---验证玩家属性---
     curPlayerID = curPlayer.GetPlayerID()
 
@@ -327,12 +328,16 @@
     if curFamily == None:
         GameWorld.ErrLog("家族创建数目已满, 创建家族失败", curPlayerID)
         return
-    GameWorld.Log("创建仙盟: familyID=%s,playerID=%s" % (curFamily.GetID(), curPlayerID))
+    emblemIDList = PlayerFamilyEmblem.GetDefaultFamilyEmblemIDList()
+    if not emblemID or emblemID not in emblemIDList:
+        emblemID = random.choice(emblemIDList) # 从默认徽章中随机选择一个
+    GameWorld.Log("创建仙盟: familyID=%s,playerID=%s,emblemID=%s" % (curFamily.GetID(), curPlayerID, emblemID))
     #---创建家族---
     curFamily.SetServerID(GameWorld.GetAccIDServerID(curPlayer.GetAccID()))
     curFamily.SetCreateTime(GameWorld.GetCurrentDataTimeStr())
     curFamily.SetLV(1)
     curFamily.SetAcceptJoin(ShareDefine.FamilyAcceptJoin_Agree)     #设置收人方式为直接通过申请
+    SetFamilyEmblemID(curFamily, emblemID)
     PyDataManager.GetFamilyStoreItemManager().DelFamilyStoreItemAll(curFamily.GetID())
     
     #新创建的仙盟默认设置已处理过合服
@@ -597,6 +602,7 @@
 #    tagHead        Head;
 #    char        Name[33];
 #    WORD        FakeID;
+#    BYTE        EmblemID; //选择徽章ID,解锁仙盟等级为1级的均为可选ID
 #};
 ## 查看申请帮会的成员信息
 #  @param index 玩家索引
@@ -607,8 +613,9 @@
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     inputName = clientPack.Name
     fakeIndex = clientPack.FakeID
+    emblemID = clientPack.EmblemID
     #执行创建家族逻辑
-    DoCreateFamily(curPlayer, inputName, fakeIndex, tick)
+    DoCreateFamily(curPlayer, inputName, fakeIndex, tick, emblemID)
     #重置查看家族状态(仅创建家族时候重置, 其余状态由MapServer退出事件时重置)
     __ClearViewFamilyState(curPlayer)
     #玩家离开事件
@@ -744,6 +751,7 @@
     totalFightPower = GetFamilyTotalFightPower(family)
     familyView.TotalFightPower = totalFightPower % ChConfig.Def_PerPointValue
     familyView.TotalFightPowerEx = totalFightPower / ChConfig.Def_PerPointValue
+    familyView.EmblemID = GetFamilyEmblemID(family)
     return familyView
 
 ## 玩家模糊查询家族,0F 0D封包
@@ -824,6 +832,19 @@
             break
     familyViewPack.PageCount = len(familyViewPack.Family)
     NetPackCommon.SendFakePack(curPlayer, familyViewPack)
+    return
+
+#// A4 13 修改家族徽章 #tagCGChangeFamilyEmblem
+#
+#struct    tagCGChangeFamilyEmblem
+#{
+#    tagHead        Head;
+#    BYTE        EmblemID;    // 更换的徽章ID
+#};
+def OnChangeFamilyEmblem(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    changeEmblemID = clientData.EmblemID
+    PlayerFamilyEmblem.OnChangeFamilyEmblem(curPlayer, changeEmblemID)
     return
 
 #class   IPY_CFamilyChangeBroadcast
@@ -3774,7 +3795,7 @@
     fightPower = GetFamilyTotalFightPower(curFamily)
     value1 = fightPower / ChConfig.Def_PerPointValue
     value2 = fightPower % ChConfig.Def_PerPointValue
-    value3 = GetFamilyEmblem(curFamily)
+    value3 = GetFamilyEmblemID(curFamily)
     value4 = curFamily.GetLV()
     value5 = curFamily.GetServerID()
     return {"id":familyID, "name":name, "id2":id2, "name2":name2, "value1":value1, "value2":value2, 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py
index 356f27f..0528290 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py
@@ -557,6 +557,51 @@
         
     return
 
+def SendFamilyAction(familyActionData, curPlayer=None):
+    
+    familyID = familyActionData.GetFamilyId()
+    
+    actionInfoPack = ChPyNetSendPack.tagGCFamilyActionInfo()
+    actionInfoPack.Clear()
+    actionInfoPack.FamilyID = familyID
+    actionInfoPack.ActionType = familyActionData.GetActionType()
+    actionInfoPack.FamilyActionList = []    
+    
+    actionData = ChPyNetSendPack.tagGCFamilyAction()
+    actionData.Clear()
+    actionData.Time = familyActionData.GetTime()
+    actionData.Name = familyActionData.GetName()
+    actionData.NameLen = len(actionData.Name)
+    actionData.Value1 = familyActionData.GetValue1()
+    actionData.Value2 = familyActionData.GetValue2()
+    actionData.Value3 = familyActionData.GetValue3()
+    actionData.Value4 = familyActionData.GetValue4()
+    actionData.Value5 = familyActionData.GetValue5()
+    actionData.Value6 = familyActionData.GetValue6()
+    actionData.UseData = familyActionData.GetUseData()
+    actionData.UseDataLen = len(actionData.UseData)
+    actionInfoPack.FamilyActionList.append(actionData)
+    
+    actionInfoPack.Count = len(actionInfoPack.FamilyActionList)
+    
+    if curPlayer:
+        NetPackCommon.SendFakePack(curPlayer, actionInfoPack)
+        return
+    
+    # 没有指定玩家的情况下通知全战盟
+    family = GameWorld.GetFamilyManager().FindFamily(familyID)
+    if not family:
+        return
+    
+    for index in xrange(family.GetCount()):
+        curMember = family.GetAt(index)
+        curPlayer = curMember.GetPlayer()
+        #不在线
+        if curPlayer == None:
+            continue
+        NetPackCommon.SendFakePack(curPlayer, actionInfoPack)
+        
+    return
 
 ## 删除时机: 1-降为普通成员;2-退出家族
 def DelFamilyOfficerModelEquip(familyID, delPlayerID):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py
new file mode 100644
index 0000000..da087bb
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py
@@ -0,0 +1,200 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package PlayerFamilyEmblem
+#
+# @todo:仙盟徽章
+# @author hxp
+# @date 2024-09-09
+# @version 1.0
+#
+# 详细描述: 仙盟徽章
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-09-09 15:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import ShareDefine
+import PlayerFamilyAction
+import IpyGameDataPY
+import PlayerFamily
+
+import random
+import time
+
+def GetActionEmblemID(emblemActionObj): return emblemActionObj.GetValue1()
+def SetActionEmblemID(emblemActionObj, emblemID): return emblemActionObj.SetValue1(emblemID)
+def GetActionEmblemExpireTimes(emblemActionObj): return emblemActionObj.GetValue2()
+def SetActionEmblemExpireTimes(emblemActionObj, endTime): return emblemActionObj.SetValue2(endTime)
+
+def GetDefaultFamilyEmblemIDList():
+    ## 获取默认的仙盟徽章ID列表,即所有解锁等级为1的徽章ID
+    defaultEmblemIDList = []
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in range(ipyDataMgr.GetFamilyEmblemCount()):
+        ipyData = ipyDataMgr.GetFamilyEmblemByIndex(index)
+        emblemID = ipyData.GetEmblemID()
+        if ipyData.GetUnlockFamilyLV() == 1:
+            defaultEmblemIDList.append(emblemID)
+    return defaultEmblemIDList
+
+def CheckExpireEmblem():
+    ## 检查过期的勋章
+    
+    defaultEmblemIDList = []
+    curTime = int(time.time())
+    actionType = ShareDefine.Def_ActionType_FamilyEmblem
+    familyManager = GameWorld.GetFamilyManager()
+    familyActionMgr = GameWorld.GetFamilyActionManager()
+    for i in xrange(familyManager.GetCount()):
+        family = familyManager.GetAt(i)
+        if not family:
+            continue
+        familyID = family.GetID()
+        familyAction = familyActionMgr.GetFamilyAction(familyID, actionType)
+        for index in range(familyAction.Count())[::-1]: # 可能触发删除,倒序遍历
+            emblemActionObj = familyAction.At(index)
+            emblemID = GetActionEmblemID(emblemActionObj)
+            isExpired, endTime = IsEmblemExpired(emblemActionObj, curTime)
+            if not isExpired:
+                #GameWorld.Log("检查仙盟徽章未过期! familyID=%s,emblemID=%s,endTime=%s" % (familyID, emblemID, endTime))
+                continue
+            familyAction.DelAction(index)
+            GameWorld.Log("删除过期仙盟徽章! familyID=%s,emblemID=%s,endTime=%s" % (familyID, emblemID, endTime))
+            if PlayerFamily.GetFamilyEmblemID(family) == emblemID:
+                if not defaultEmblemIDList:
+                    defaultEmblemIDList = GetDefaultFamilyEmblemIDList()
+                updEmblemID = random.choice(defaultEmblemIDList) if defaultEmblemIDList else 0
+                GameWorld.Log("仙盟佩戴徽章过期恢复随机默认徽章! familyID=%s,emblemID=%s,endTime=%s,updEmblemID=%s" % (familyID, emblemID, endTime, updEmblemID))
+                PlayerFamily.SetFamilyEmblemID(family, updEmblemID)
+                family.Broadcast_FamilyChange()
+    return
+
+def IsEmblemExpired(emblemActionObj, curTime):
+    ## 勋章是否过期
+    # @return: 是否过期, endTime
+        
+    endTime = -1
+    if not emblemActionObj:
+        return True, endTime
+    
+    createTime = emblemActionObj.GetTime()
+    expireTimes = GetEmblemExpireTimes(emblemActionObj)
+    if expireTimes == 0:
+        # 永久的
+        return False, 0
+    
+    if expireTimes > 0:
+        endTime = createTime + expireTimes
+        if endTime >= curTime:
+            # 未过期
+            return False, endTime
+        
+    return True, endTime
+
+def GetEmblemExpireTimes(emblemActionObj):
+    ## 获取勋章有效时长,秒
+    # @return: 0-永久;-1-无效;>0-有效秒数
+    expireTimes = GetActionEmblemExpireTimes(emblemActionObj) # 有效时长,秒
+    if not expireTimes:
+        emblemID = GetActionEmblemID(emblemActionObj)
+        ipyData = IpyGameDataPY.GetIpyGameData("FamilyEmblem", emblemID)
+        if not ipyData:
+            return -1
+        expireTimes = ipyData.GetExpireMinutes() * 60
+    return expireTimes
+
+def GetFamilyEmblemActionData(familyID, emblemID):
+    ## 获取仙盟时效徽章Action数据
+    actionType = ShareDefine.Def_ActionType_FamilyEmblem
+    familyAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, actionType)
+    for index in range(familyAction.Count()):
+        familyActionObj = familyAction.At(index)
+        if emblemID == familyActionObj.GetValue1():
+            return familyActionObj
+    return
+
+def AddFamilyEmblem(familyID, emblemID, setExpireTimes=None):
+    ## 添加仙盟徽章
+    # @param setExpireTimes: 指定的有效时长秒,0-永久,>0-有效时长秒;没有指定时直接读配置进行累加
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("FamilyEmblem", emblemID)
+    if not ipyData:
+        return
+    unlockFamilyLV = ipyData.GetUnlockFamilyLV()
+    if unlockFamilyLV:
+        GameWorld.Log("仙盟解锁的徽章不需要添加! familyID=%s,emblemID=%s" % (familyID, emblemID))
+        return
+    if setExpireTimes >= 0:
+        expireTimes = setExpireTimes
+    else:        
+        expireTimes = ipyData.GetExpireMinutes() * 60
+    GameWorld.Log("添加仙盟徽章! familyID=%s,emblemID=%s,setExpireTimes=%s,expireTimes=%s" 
+                  % (familyID, emblemID, setExpireTimes, expireTimes))
+    
+    curTime = int(time.time())
+    emblemActionObj = GetFamilyEmblemActionData(familyID, emblemID)
+    if not emblemActionObj:
+        actionType = ShareDefine.Def_ActionType_FamilyEmblem
+        familyAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, actionType)
+        emblemActionObj = familyAction.AddAction()
+        emblemActionObj.SetTime(curTime)
+        emblemActionObj.SetFamilyId(familyID)
+        emblemActionObj.SetActionType(actionType)
+    else:
+        isExpired, endTime = IsEmblemExpired(emblemActionObj, curTime)
+        if setExpireTimes >= 0:
+            emblemActionObj.SetTime(curTime)
+            GameWorld.Log("直接设置勋章剩余时长,重新设置获得时间! familyID=%s,emblemID=%s" % (familyID, emblemID))
+        elif isExpired:
+            emblemActionObj.SetTime(curTime)
+            GameWorld.Log("获得勋章时已过期,重新设置获得时间! familyID=%s,emblemID=%s,endTime=%s" % (familyID, emblemID, endTime))
+        else:
+            # 未过期,非永久的直接累加时长
+            if expireTimes > 0:
+                expireTimes += GetActionEmblemExpireTimes(emblemActionObj)
+                GameWorld.Log("获得勋章时未过期,累加有效时长! familyID=%s,emblemID=%s,expireTimes=%s" % (familyID, emblemID, expireTimes))
+                
+    SetActionEmblemID(emblemActionObj, emblemID)
+    SetActionEmblemExpireTimes(emblemActionObj, expireTimes)
+    
+    # 通知
+    PlayerFamilyAction.SendFamilyAction(emblemActionObj)
+    return emblemActionObj
+
+def OnChangeFamilyEmblem(curPlayer, emblemID):
+    ## 修改仙盟徽章
+    playerID = curPlayer.GetPlayerID()
+    curFamily = curPlayer.GetFamily()
+    if not curFamily:
+        return
+    familyID = curFamily.GetID()
+    
+    if curFamily.GetLeaderID() != playerID:
+        GameWorld.DebugLog("只有盟主可以修改徽章!", playerID)
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("FamilyEmblem", emblemID)
+    if not ipyData:
+        return
+    unlockFamilyLV = ipyData.GetUnlockFamilyLV()
+    
+    if unlockFamilyLV:
+        if curFamily.GetLV() < unlockFamilyLV:
+            GameWorld.DebugLog("仙盟等级不足,无法使用该徽章! emblemID=%s,unlockFamilyLV=%s" 
+                               % (emblemID, unlockFamilyLV), playerID)
+            return
+    else:
+        emblemActionObj = GetFamilyEmblemActionData(familyID, emblemID)
+        isExpired, endTime = IsEmblemExpired(emblemActionObj, int(time.time()))
+        if isExpired:
+            GameWorld.DebugLog("该徽章不存在或已过期! emblemID=%s,endTime=%s" % (emblemID, endTime), playerID)
+            return
+        
+    GameWorld.DebugLog("更换仙盟徽章! familyID=%s,emblemID=%s" % (familyID, emblemID), playerID)
+    PlayerFamily.SetFamilyEmblemID(curFamily, emblemID)
+    PlayerFamily.SendPack_MapServer_PlayerFamilyRefresh(curFamily)
+    curFamily.Broadcast_FamilyChange()
+    return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 048b2f1..8ba4720 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1483,7 +1483,8 @@
                       Def_ActionType_FamilyEvent,    #记录家族事件12
                       Def_ActionType_BossTrialSubmit,    #boss凭证提交 13
                       Def_ActionType_FamilyCTGAssist,    #仙盟充值协助活动 14
-                      ) = range(0, 15)
+                      Def_ActionType_FamilyEmblem,    #仙盟时效徽章信息 15
+                      ) = range(0, 16)
 
 # 家族行为事件类型定义; Def_ActionType_FamilyEvent; 存与事件记录Value1
 # 通用:time-时间;name-玩家;value1-事件类型
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index b0f48ea..4e66f6a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3637,6 +3637,7 @@
 Def_Player_Dict_UpdateFamilyName = "UpdateFamilyName"  # 改名锁
 Def_Player_Dict_FamilyDayAward = "FamilyDayAward"  # 仙盟每日奖励领奖记录
 Def_Player_Dict_FamilyMoneyDonateCount = "FamilyMoneyDonateCount"  # 仙盟今日货币捐献次数
+Def_Player_Dict_FamilyEmblemID = "FamilyEmblemID"  # 仙盟徽章ID
 
 # 仙盟事务
 Def_Player_Dict_FamilyAffairRefreshFree = "FamilyAffairRefreshFree"  # 今日已免费刷新事务次数
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 4265437..0f9e00f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -379,6 +379,58 @@
 
 
 #------------------------------------------------------
+# A4 13 修改家族徽章 #tagCGChangeFamilyEmblem
+
+class  tagCGChangeFamilyEmblem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("EmblemID", c_ubyte),    # 更换的徽章ID
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA4
+        self.SubCmd = 0x13
+        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 = 0x13
+        self.EmblemID = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCGChangeFamilyEmblem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A4 13 修改家族徽章 //tagCGChangeFamilyEmblem:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                EmblemID:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.EmblemID
+                                )
+        return DumpString
+
+
+m_NAtagCGChangeFamilyEmblem=tagCGChangeFamilyEmblem()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGChangeFamilyEmblem.Cmd,m_NAtagCGChangeFamilyEmblem.SubCmd))] = m_NAtagCGChangeFamilyEmblem
+
+
+#------------------------------------------------------
 # A4 08 查询家族行为信息 #tagCGQueryFamilyAction
 
 class  tagCGQueryFamilyAction(Structure):
@@ -712,6 +764,7 @@
     Head = tagHead()
     Name = ""    #(char Name[33])
     FakeID = 0    #(WORD FakeID)//假仙盟编号
+    EmblemID = 0    #(BYTE EmblemID)//选择徽章ID,解锁仙盟等级为1级的均为可选ID
     data = None
 
     def __init__(self):
@@ -725,6 +778,7 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
         self.FakeID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.EmblemID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -734,6 +788,7 @@
         self.Head.SubCmd = 0x04
         self.Name = ""
         self.FakeID = 0
+        self.EmblemID = 0
         return
 
     def GetLength(self):
@@ -741,6 +796,7 @@
         length += self.Head.GetLength()
         length += 33
         length += 2
+        length += 1
 
         return length
 
@@ -749,18 +805,21 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteString(data, 33, self.Name)
         data = CommFunc.WriteWORD(data, self.FakeID)
+        data = CommFunc.WriteBYTE(data, self.EmblemID)
         return data
 
     def OutputString(self):
         DumpString = '''
                                 Head:%s,
                                 Name:%s,
-                                FakeID:%d
+                                FakeID:%d,
+                                EmblemID:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.Name,
-                                self.FakeID
+                                self.FakeID,
+                                self.EmblemID
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index f208134..4a01742 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -2409,6 +2409,7 @@
     WarRank = 0    #(BYTE WarRank)//联赛排名
     TotalFightPower = 0    #(DWORD TotalFightPower)//总战力,不足1个亿的部分
     TotalFightPowerEx = 0    #(DWORD TotalFightPowerEx)//总战力点,1点=1亿
+    EmblemID = 0    #(BYTE EmblemID)//徽章ID
     data = None
 
     def __init__(self):
@@ -2431,6 +2432,7 @@
         self.WarRank,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.TotalFightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.TotalFightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.EmblemID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -2448,6 +2450,7 @@
         self.WarRank = 0
         self.TotalFightPower = 0
         self.TotalFightPowerEx = 0
+        self.EmblemID = 0
         return
 
     def GetLength(self):
@@ -2466,6 +2469,7 @@
         length += 1
         length += 4
         length += 4
+        length += 1
 
         return length
 
@@ -2485,6 +2489,7 @@
         data = CommFunc.WriteBYTE(data, self.WarRank)
         data = CommFunc.WriteDWORD(data, self.TotalFightPower)
         data = CommFunc.WriteDWORD(data, self.TotalFightPowerEx)
+        data = CommFunc.WriteBYTE(data, self.EmblemID)
         return data
 
     def OutputString(self):
@@ -2502,7 +2507,8 @@
                                 JoinAccept:%d,
                                 WarRank:%d,
                                 TotalFightPower:%d,
-                                TotalFightPowerEx:%d
+                                TotalFightPowerEx:%d,
+                                EmblemID:%d
                                 '''\
                                 %(
                                 self.FamilyIndex,
@@ -2518,7 +2524,8 @@
                                 self.JoinAccept,
                                 self.WarRank,
                                 self.TotalFightPower,
-                                self.TotalFightPowerEx
+                                self.TotalFightPowerEx,
+                                self.EmblemID
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 9581a1b..72d55c4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -7253,6 +7253,10 @@
 def GetAttr160(curPlayer): return 0
 def SetAttr160(curPlayer, value): pass
 
+# 仙盟徽章ID
+def GetFamilyEmblemID(curPlayer): return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyEmblemID)
+def SetFamilyEmblemID(curPlayer, emblemID): NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyEmblemID, emblemID)
+
 # 仙盟事务速度加成
 def GetAffairSpeedPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AffairSpeedPer)
 def SetAffairSpeedPer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_AffairSpeedPer, value)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
index 24c06c9..cd82528 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -127,6 +127,9 @@
     if curPlayer.GetFamilyLastWeekActiveValue() != refreshPack.GetLastWeekFamilyActiveValue():
         curPlayer.SetFamilyLastWeekActiveValue(refreshPack.GetLastWeekFamilyActiveValue())
         
+    if hasattr(refreshPack, "GetExtra6") and PlayerControl.GetFamilyEmblemID(curPlayer) != refreshPack.GetExtra6():
+        PlayerControl.SetFamilyEmblemID(curPlayer, refreshPack.GetExtra6())
+        
     #---处理特殊逻辑, 进入退出家族---
 
     if lastFamilyID != 0 and curPlayer.GetFamilyID() == 0:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
index 6ea032f..c102e68 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -171,6 +171,7 @@
     curPlayerPropDict["Name"] = curPlayer.GetPlayerName()
     curPlayerPropDict["FamilyID"] = curPlayer.GetFamilyID()
     curPlayerPropDict["FamilyName"] = curPlayer.GetFamilyName()
+    curPlayerPropDict["FamilyEmblemID"] = PlayerControl.GetFamilyEmblemID(curPlayer)
     curPlayerPropDict["TitleID"] = PlayerControl.GetTitleID(curPlayer)
     curPlayerPropDict["CoupleName"] = PlayerControl.GetCoupleName(curPlayer)
     curPlayerPropDict["FightPower"] = PlayerControl.GetFightPower(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 048b2f1..8ba4720 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1483,7 +1483,8 @@
                       Def_ActionType_FamilyEvent,    #记录家族事件12
                       Def_ActionType_BossTrialSubmit,    #boss凭证提交 13
                       Def_ActionType_FamilyCTGAssist,    #仙盟充值协助活动 14
-                      ) = range(0, 15)
+                      Def_ActionType_FamilyEmblem,    #仙盟时效徽章信息 15
+                      ) = range(0, 16)
 
 # 家族行为事件类型定义; Def_ActionType_FamilyEvent; 存与事件记录Value1
 # 通用:time-时间;name-玩家;value1-事件类型

--
Gitblit v1.8.0