66 【公会】基础主体-服务端(徽章旗帜、旗号;捐献;公会加经验、加贡献度;搜索支持公会编号;)
21个文件已修改
4个文件已删除
1个文件已添加
1998 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 254 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 512 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetFamilyActionCnt.py 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetTechLV.py 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_GiveMoney.py 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py 423 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyEmblem.py 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyTech.py 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCache.py 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerFamilyTechLVUP.py 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -1144,17 +1144,6 @@
    dict        ExpMaterial; //翅膀代数对应精炼值
};
//仙盟科技表
struct tagFamilyTech
{
    DWORD        _TechID;    //科技ID*1000+等级
    BYTE        AttrType;    //属性类型
    DWORD        AttrValue;    //属性值
    DWORD        Contribution;    //需要贡献度
    DWORD        PowerEx;    //额外战力
};
//NPC掉落表
struct tagNPCDropItem
@@ -1576,17 +1565,6 @@
    DWORD        _NPCID;    //ID
    WORD        PerPlayerMoneyAward;    // 首杀全服玩家奖励灵石额度/人
    list        PersonFirstKillAward;    // 个人首次击杀奖励 [[物品ID,个数,是否拍品], ...]
};
//仙盟活跃表
struct tagFamilyActivity
{
    DWORD        _ID;    //ID
    WORD        UnLockFuncID;    //解锁功能ID
    BYTE        TotalActivityTime;    //总次数
    WORD        SingleTimes;    //增加活跃需要次数
    WORD        SingleActiveValue;    //每轮增加活跃积分
};
//仙盟红包表
@@ -3038,6 +3016,16 @@
    DWORD        CustomFamilyID;    //定制仙盟ID
};
//仙盟捐献表
struct FamilyDonate
{
    BYTE        _DonateType;    //捐献类型
    BYTE        DailyCnt;    //每日次数
    BYTE        MoneyType;    //消耗货币类型
    DWORD        MoneyValue;    //消耗货币值
    list        AwardItemList;    //获得奖励列表[[物品ID,个数], ...]
};
//仙盟珍宝阁砍价表
struct FamilyZhenbaogeCut
{
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -230,9 +230,9 @@
PacketSubCMD_6=0x12
PacketCallFunc_6=OnFamilyMoneyDonate
PacketCMD_7=0xA6
PacketSubCMD_7=0x13
PacketCallFunc_7=OnFamilyAffairOP
PacketCMD_7=
PacketSubCMD_7=
PacketCallFunc_7=
PacketCMD_8=0xA6
PacketSubCMD_8=0x20
@@ -297,18 +297,6 @@
PacketCMD_2=0xA6
PacketSubCMD_2=0x10
PacketCallFunc_2=OnFamilyStoreExchange
;家族科技
[PlayerFamilyTech]
ScriptName = Player\PlayerFamilyTech.py
Writer = hxp
Releaser = hxp
RegType = 0
RegisterPackCount = 1
PacketCMD_1=0xA6
PacketSubCMD_1=0x07
PacketCallFunc_1=OnPlayerFamilyTechLVUP
;家族阵法
[PlayerFamilyZhenfa]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -454,7 +454,6 @@
Def_ItemID_GoldMoney = 20               # 直接给仙玉
Def_ItemID_SilverMoney = 22               # 直接给铜钱
Def_ItemID_FamilyContribution = 26               # 直接给战盟贡献点
Def_ItemID_FamilyActive = 28               # 直接给战盟活跃点
Def_ItemID_SP = 29               # 直接给sp
Def_ItemID_GoldPaper = 30               # 直接给绑玉/灵石
Def_ItemID_RealmPoint = 24               # 直接给修行点
@@ -472,7 +471,7 @@
Def_ItemID_FamilyFlagWarPoint = 540       # 直接给万界积分
Def_ItemID_TongTianPoint = 720               # 直接给通天令经验点
Def_ItemID_SuccessScore = 590               # 直接给成就积分
Def_TransformItemIDList = [Def_ItemID_FamilyContribution, Def_ItemID_FamilyActive, Def_ItemID_SP, Def_ItemID_GoldPaper,
Def_TransformItemIDList = [Def_ItemID_FamilyContribution, Def_ItemID_SP, Def_ItemID_GoldPaper,
                           Def_ItemID_RealmPoint, Def_ItemID_SilverMoney, Def_ItemID_BossReborn, Def_ItemID_Ysog,
                           Def_ItemID_SoulDust, Def_ItemID_SoulSplinters, Def_ItemID_SoulCore, Def_ItemID_Honor, Def_ItemID_GoldMoney,
                           Def_ItemID_FuncSysPrivilege, Def_ItemID_FCPartyPoint, Def_ItemID_BTGMPoint, Def_ItemID_GuShenMoney,
@@ -631,7 +630,6 @@
Def_Effect_GivePlayerMoneyGold = 203    #给人物金钱 仙玉道具效果ID
Def_Effect_AddDienstgrad = 204   #使用物品获得称号
Def_Effect_UseItemGiveZhenQi = 205      #使用道具给予真气
Def_Effect_ItemGiveFamilyActivity = 208      #使用道具给予仙盟活跃令
Def_Effect_ItemGiveFamilyContribution = 209      #使用道具给予仙盟贡献
Def_Effect_ItemAddExp = 213      #给经验道具 
Def_Effect_ItemAddLV = 214       #直接升级道具 
@@ -3257,7 +3255,6 @@
Def_PlayerKey_CrossRegisterMap = "CrossRegisterMap"  #跨服注册活动地图, dataMapID
Def_Player_Dict_FamilyTechLV = "FamilyTechLV_%s"    #家族科技等级, 参数(科技ID)
Def_Player_Dict_RouteServerInitOK = "RouteServerInitOK_33"     #RouteServer初始化成功(仅登陆一次)
Def_Player_Dict_Wallow_LV = "GameWallowLV_34"    #防沉迷等级
Def_Player_Dict_Wallow_OfflineTime = "GameWallowOfflineTime_35"    #防沉迷离线累积时间
@@ -3320,16 +3317,9 @@
Def_Player_Dict_UpdatePlayerName = "UpdatePlayerName_199"  # 改名锁
Def_Player_Dict_UpdateFamilyNameItemIndex = "UpdateFamilyNameItemIndex"  # 改名物品在背包的位置
Def_Player_Dict_UpdateFamilyName = "UpdateFamilyName"  # 改名锁
Def_Player_Dict_FamilyDayAward = "FamilyDayAward"  # 仙盟每日奖励领奖记录
Def_Player_Dict_FamilyDonateRecord = "FamilyDonateRecord"  # 仙盟今日捐献记录,按位存储每种类型今日已捐献次数
Def_Player_Dict_FamilyEmblemID = "FamilyEmblemID"  # 仙盟徽章ID
Def_Player_Dict_FamilyZhenbaogeCut = "FamilyZhenbaogeCut" #珍宝阁今日是否已砍过价
Def_Player_Dict_FamilyZhenbaogeBuy = "FamilyZhenbaogeBuy" #珍宝阁今日是否已购买过
# 仙盟事务
Def_Player_Dict_FamilyAffairRefreshFree = "FamilyAffairRefreshFree"  # 今日已免费刷新事务次数
Def_Player_Dict_FamilyAffairInfo = "FamilyAffairStar_%s"  # 事务信息,星级*10+状态(0-无;1-进行中;2-已完成);参数(事务编号ID)
Def_Player_Dict_FamilyAffairStartTime = "FamilyAffairStartTime_%s"  # 事务开始时间戳,参数(事务编号ID)
Def_Player_Dict_FamilyDonateCnt = "FamilyDonateCnt_%s"  # 仙盟今日捐献次数,参数(捐献类型)
Def_Player_Dict_DelPackIndex = "DelPackIndex215"  # 装备回购不重排,只记录最旧的一个物品
@@ -3380,10 +3370,6 @@
Def_PDict_FirstChargeRecord = "FirstChargeRecord_%s"  # 首充领取记录,按位记录首充第x天是否已领取,参数(首充ID)
Def_PDict_FirstChargeTime = "FirstChargeTime_%s"  # 首充充值时间戳,参数(首充ID)
Def_PDict_IsReBorn = "Def_PDict_IsReBorn"  # 是否回城复活
Def_PDict_FamilyWarDailyReward = "FamilyWarDailyReward"  # 王者仙盟每日俸禄领取状态
Def_PDict_Family_Contribution = "FamilyContribution"  #战盟贡献度
Def_PDict_HasChange_FamilyActiveToContribution = "HasChangeContribution"  #战盟活跃度已转化过贡献度
Def_PDict_KillPlayerAddActive = "KillPlayerAddActiveByDay"  # 杀人每日获得活跃度
Def_PDict_LoginDayCnt = "PLoginDayCnt"  # 累计登陆天数
Def_PDict_LoginDayAward = "PLoginDayAward"  # 累计登陆领取情况
Def_PDict_CollNpcIDCollTime = "NPCIDCollTime_%s"   # 采集NPCID对应每日对应采集次数,%sNPCID
@@ -3833,9 +3819,6 @@
Def_PDict_DailyActionDayBuyTimes = "DADayBuyTimes_%s"  # 每日活动今日购买次数 参数每日活动ID
Def_PDict_DailyActionDayItemTimes = "DADayItemTimes_%s"  # 每日活动今日物品增加次数 参数每日活动ID
Def_PDict_DailyActionWeekTimes = "DailyActionWeekTimes_%s"  # 每日活动本周完成次数 参数每日活动ID
#仙盟活跃
Def_PDict_FamilyActivityFinishCnt = "FamilyActivityFinishCnt%s"  # 已完成次数
Def_PDict_FamilyActivityAwardRecord = "FamilyActivityAwardRecord"  # 活跃度奖励领取记录,按二进制位标识
# 投资理财
Def_PDict_InvestTime = "InvestTime_%s"  # 投资时的时间,参数为投资类型
@@ -4984,7 +4967,7 @@
# 游戏功能奖励定义
(
Def_RewardType_Activity,  # 活跃度奖励 0
Def_RewardType_FamilyActivity,  # 仙盟活跃度奖励 1
Def_RewardType_1,  # 1
Def_RewardType_ChampionFamilyDailyReward,  # 仙盟联赛冠军仙盟每日俸禄奖励 2
Def_RewardType_XMZZWinCnt,  # 仙魔之争胜利场数奖励 3
Def_RewardType_FamilyDayAward,  # 仙盟每日福利奖励 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -8453,52 +8453,64 @@
# A6 24 修改家族徽章 #tagCMChangeFamilyEmblem
class  tagCMChangeFamilyEmblem(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("EmblemID", c_ubyte),    # 更换的徽章ID
                  ]
    Head = tagHead()
    EmblemID = 0    #(BYTE EmblemID)// 更换的徽章ID
    EmblemWord = ""    #(char EmblemWord[3])// 徽章文字
    data = None
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA6
        self.SubCmd = 0x24
        self.Head.Cmd = 0xA6
        self.Head.SubCmd = 0x24
        return
    def ReadData(self, stringData, _pos=0, _len=0):
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.EmblemID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.EmblemWord,_pos = CommFunc.ReadString(_lpData, _pos,3)
        return _pos
    def Clear(self):
        self.Cmd = 0xA6
        self.SubCmd = 0x24
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA6
        self.Head.SubCmd = 0x24
        self.EmblemID = 0
        self.EmblemWord = ""
        return
    def GetLength(self):
        return sizeof(tagCMChangeFamilyEmblem)
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 3
        return length
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.EmblemID)
        data = CommFunc.WriteString(data, 3, self.EmblemWord)
        return data
    def OutputString(self):
        DumpString = '''// A6 24 修改家族徽章 //tagCMChangeFamilyEmblem:
                                Cmd:%s,
                                SubCmd:%s,
                                EmblemID:%d
        DumpString = '''
                                Head:%s,
                                EmblemID:%d,
                                EmblemWord:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.EmblemID
                                self.Head.OutputString(),
                                self.EmblemID,
                                self.EmblemWord
                                )
        return DumpString
m_NAtagCMChangeFamilyEmblem=tagCMChangeFamilyEmblem()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChangeFamilyEmblem.Cmd,m_NAtagCMChangeFamilyEmblem.SubCmd))] = m_NAtagCMChangeFamilyEmblem
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChangeFamilyEmblem.Head.Cmd,m_NAtagCMChangeFamilyEmblem.Head.SubCmd))] = m_NAtagCMChangeFamilyEmblem
#------------------------------------------------------
@@ -8751,6 +8763,7 @@
    Head = tagHead()
    Name = ""    #(char Name[33])
    EmblemID = 0    #(WORD EmblemID)//选择徽章ID,解锁仙盟等级为1级的均为可选ID
    EmblemWord = ""    #(char EmblemWord[3])//徽章文字
    data = None
    def __init__(self):
@@ -8764,6 +8777,7 @@
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
        self.EmblemID,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.EmblemWord,_pos = CommFunc.ReadString(_lpData, _pos,3)
        return _pos
    def Clear(self):
@@ -8773,6 +8787,7 @@
        self.Head.SubCmd = 0x04
        self.Name = ""
        self.EmblemID = 0
        self.EmblemWord = ""
        return
    def GetLength(self):
@@ -8780,6 +8795,7 @@
        length += self.Head.GetLength()
        length += 33
        length += 2
        length += 3
        return length
@@ -8788,18 +8804,21 @@
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteString(data, 33, self.Name)
        data = CommFunc.WriteWORD(data, self.EmblemID)
        data = CommFunc.WriteString(data, 3, self.EmblemWord)
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Name:%s,
                                EmblemID:%d
                                EmblemID:%d,
                                EmblemWord:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Name,
                                self.EmblemID
                                self.EmblemID,
                                self.EmblemWord
                                )
        return DumpString
@@ -8858,139 +8877,6 @@
m_NAtagCMDeleteFamilyMember=tagCMDeleteFamilyMember()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDeleteFamilyMember.Cmd,m_NAtagCMDeleteFamilyMember.SubCmd))] = m_NAtagCMDeleteFamilyMember
#------------------------------------------------------
# A6 06 家族兑换活跃令 #tagCMFamilyActivityExchange
class  tagCMFamilyActivityExchange(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)//材料所在背包索引的数量
    IndexList = list()    #(vector<WORD> IndexList)//材料所在背包索引列表
    ItemIDList = list()    #(vector<DWORD> ItemIDList)//材料所在背包物品ID列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA6
        self.Head.SubCmd = 0x06
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Count):
            value,_pos=CommFunc.ReadWORD(_lpData,_pos)
            self.IndexList.append(value)
        for i in range(self.Count):
            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
            self.ItemIDList.append(value)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA6
        self.Head.SubCmd = 0x06
        self.Count = 0
        self.IndexList = list()
        self.ItemIDList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 2 * self.Count
        length += 4 * self.Count
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteWORD(data, self.IndexList[i])
        for i in range(self.Count):
            data = CommFunc.WriteDWORD(data, self.ItemIDList[i])
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                IndexList:%s,
                                ItemIDList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "...",
                                "..."
                                )
        return DumpString
m_NAtagCMFamilyActivityExchange=tagCMFamilyActivityExchange()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFamilyActivityExchange.Head.Cmd,m_NAtagCMFamilyActivityExchange.Head.SubCmd))] = m_NAtagCMFamilyActivityExchange
#------------------------------------------------------
# A6 13 家族事务操作 #tagCMFamilyAffairOP
class  tagCMFamilyAffairOP(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("OPType", c_ubyte),    # 操作类型:1-刷新事务;2-开始事务;3-领取事务奖励;
                  ("AffairID", c_ushort),    # 事务ID,可选
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA6
        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 = 0xA6
        self.SubCmd = 0x13
        self.OPType = 0
        self.AffairID = 0
        return
    def GetLength(self):
        return sizeof(tagCMFamilyAffairOP)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A6 13 家族事务操作 //tagCMFamilyAffairOP:
                                Cmd:%s,
                                SubCmd:%s,
                                OPType:%d,
                                AffairID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.OPType,
                                self.AffairID
                                )
        return DumpString
m_NAtagCMFamilyAffairOP=tagCMFamilyAffairOP()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFamilyAffairOP.Cmd,m_NAtagCMFamilyAffairOP.SubCmd))] = m_NAtagCMFamilyAffairOP
#------------------------------------------------------
@@ -9616,58 +9502,6 @@
m_NAtagCMSendFamilyRedPacket=tagCMSendFamilyRedPacket()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMSendFamilyRedPacket.Head.Cmd,m_NAtagCMSendFamilyRedPacket.Head.SubCmd))] = m_NAtagCMSendFamilyRedPacket
#------------------------------------------------------
# A6 07  自身家族科技等级提升 #tagCMFamilyTechLVUP
class  tagCMFamilyTechLVUP(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("TechID", c_int),    # 科技ID
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA6
        self.SubCmd = 0x07
        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 = 0xA6
        self.SubCmd = 0x07
        self.TechID = 0
        return
    def GetLength(self):
        return sizeof(tagCMFamilyTechLVUP)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A6 07  自身家族科技等级提升 //tagCMFamilyTechLVUP:
                                Cmd:%s,
                                SubCmd:%s,
                                TechID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.TechID
                                )
        return DumpString
m_NAtagCMFamilyTechLVUP=tagCMFamilyTechLVUP()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFamilyTechLVUP.Cmd,m_NAtagCMFamilyTechLVUP.SubCmd))] = m_NAtagCMFamilyTechLVUP
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -5090,121 +5090,6 @@
#------------------------------------------------------
# A3 16 仙盟活跃信息通知 #tagMCFamilyActivityInfo
class  tagMCFamilyActionCnt(Structure):
    _pack_ = 1
    _fields_ = [
                  ("ActionID", c_ubyte),    # ID
                  ("FinishCnt", c_ushort),    # 已完成次数
                  ]
    def __init__(self):
        self.Clear()
        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.ActionID = 0
        self.FinishCnt = 0
        return
    def GetLength(self):
        return sizeof(tagMCFamilyActionCnt)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 16 仙盟活跃信息通知 //tagMCFamilyActivityInfo:
                                ActionID:%d,
                                FinishCnt:%d
                                '''\
                                %(
                                self.ActionID,
                                self.FinishCnt
                                )
        return DumpString
class  tagMCFamilyActivityInfo(Structure):
    Head = tagHead()
    AwardRecord = 0    #(DWORD AwardRecord)// 领奖情况记录
    Count = 0    #(BYTE Count)// 个数
    InfoList = list()    #(vector<tagMCFamilyActionCnt> InfoList)// 活动信息
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x16
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.AwardRecord,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Count):
            temInfoList = tagMCFamilyActionCnt()
            _pos = temInfoList.ReadData(_lpData, _pos)
            self.InfoList.append(temInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x16
        self.AwardRecord = 0
        self.Count = 0
        self.InfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 4
        length += 1
        for i in range(self.Count):
            length += self.InfoList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteDWORD(data, self.AwardRecord)
        data = CommFunc.WriteBYTE(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                AwardRecord:%d,
                                Count:%d,
                                InfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.AwardRecord,
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCFamilyActivityInfo=tagMCFamilyActivityInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyActivityInfo.Head.Cmd,m_NAtagMCFamilyActivityInfo.Head.SubCmd))] = m_NAtagMCFamilyActivityInfo
#------------------------------------------------------
# A3 54 法器信息 #tagMCFaQiInfo
class  tagMCFaQiInfo(Structure):
@@ -12906,6 +12791,73 @@
#------------------------------------------------------
# A5 02 捐献次数信息 #tagSCDonateCntInfo
class  tagSCDonateCntInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)
    DonateCntList = list()    #(vector<BYTE> DonateCntList)// 今日已捐献次数列表 [捐献类型1次数, ...]
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0x02
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Count):
            value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
            self.DonateCntList.append(value)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0x02
        self.Count = 0
        self.DonateCntList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1 * self.Count
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteBYTE(data, self.DonateCntList[i])
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                DonateCntList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagSCDonateCntInfo=tagSCDonateCntInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCDonateCntInfo.Head.Cmd,m_NAtagSCDonateCntInfo.Head.SubCmd))] = m_NAtagSCDonateCntInfo
#------------------------------------------------------
# A5 13 家族行为信息 #tagMCFamilyActionInfo
class  tagMCFamilyAction(Structure):
@@ -13094,181 +13046,6 @@
m_NAtagMCFamilyActionInfo=tagMCFamilyActionInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyActionInfo.Head.Cmd,m_NAtagMCFamilyActionInfo.Head.SubCmd))] = m_NAtagMCFamilyActionInfo
#------------------------------------------------------
# A5 02 家族活跃令兑换结果 #tagMCFamilyActivityExchangeResult
class  tagMCFamilyActivityExchangeResult(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("Point", c_int),    # 活跃令
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0x02
        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 = 0xA5
        self.SubCmd = 0x02
        self.Point = 0
        return
    def GetLength(self):
        return sizeof(tagMCFamilyActivityExchangeResult)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 02 家族活跃令兑换结果 //tagMCFamilyActivityExchangeResult:
                                Cmd:%s,
                                SubCmd:%s,
                                Point:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Point
                                )
        return DumpString
m_NAtagMCFamilyActivityExchangeResult=tagMCFamilyActivityExchangeResult()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyActivityExchangeResult.Cmd,m_NAtagMCFamilyActivityExchangeResult.SubCmd))] = m_NAtagMCFamilyActivityExchangeResult
#------------------------------------------------------
# A5 08 家族事务信息 #tagMCFamilyAffairInfo
class  tagMCFamilyAffair(Structure):
    _pack_ = 1
    _fields_ = [
                  ("AffairID", c_ushort),    # 事务ID
                  ("Star", c_ubyte),    # 星级
                  ("State", c_ubyte),    # 状态:0-无;1-进行中;2-已完成
                  ("RemainDuration", c_ushort),    # 剩余时长,秒,有剩余时间代表进行中
                  ]
    def __init__(self):
        self.Clear()
        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.AffairID = 0
        self.Star = 0
        self.State = 0
        self.RemainDuration = 0
        return
    def GetLength(self):
        return sizeof(tagMCFamilyAffair)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 08 家族事务信息 //tagMCFamilyAffairInfo:
                                AffairID:%d,
                                Star:%d,
                                State:%d,
                                RemainDuration:%d
                                '''\
                                %(
                                self.AffairID,
                                self.Star,
                                self.State,
                                self.RemainDuration
                                )
        return DumpString
class  tagMCFamilyAffairInfo(Structure):
    Head = tagHead()
    RefreshFreeCount = 0    #(BYTE RefreshFreeCount)// 今日已免费刷新次数
    Count = 0    #(BYTE Count)
    AffairInfoList = list()    #(vector<tagMCFamilyAffair> AffairInfoList)// 事务列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0x08
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.RefreshFreeCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Count):
            temAffairInfoList = tagMCFamilyAffair()
            _pos = temAffairInfoList.ReadData(_lpData, _pos)
            self.AffairInfoList.append(temAffairInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0x08
        self.RefreshFreeCount = 0
        self.Count = 0
        self.AffairInfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        for i in range(self.Count):
            length += self.AffairInfoList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.RefreshFreeCount)
        data = CommFunc.WriteBYTE(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteString(data, self.AffairInfoList[i].GetLength(), self.AffairInfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                RefreshFreeCount:%d,
                                Count:%d,
                                AffairInfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.RefreshFreeCount,
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCFamilyAffairInfo=tagMCFamilyAffairInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyAffairInfo.Head.Cmd,m_NAtagMCFamilyAffairInfo.Head.SubCmd))] = m_NAtagMCFamilyAffairInfo
#------------------------------------------------------
@@ -13821,6 +13598,7 @@
    JoinLVMin = 0    #(WORD JoinLVMin)//限制最低可加入的玩家等级
    ServerID = 0    #(DWORD ServerID)//区服ID
    EmblemID = 0    #(DWORD EmblemID)//徽章ID
    EmblemWord = ""    #(char EmblemWord[3])//徽章文字
    FightPower = 0    #(DWORD FightPower)//总战力,求余亿部分
    FightPowerEx = 0    #(DWORD FightPowerEx)//总战力,整除亿部分
    MemberCount = 0    #(BYTE MemberCount)//成员人数
@@ -13843,6 +13621,7 @@
        self.JoinLVMin,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.EmblemWord,_pos = CommFunc.ReadString(_lpData, _pos,3)
        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.MemberCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -13860,6 +13639,7 @@
        self.JoinLVMin = 0
        self.ServerID = 0
        self.EmblemID = 0
        self.EmblemWord = ""
        self.FightPower = 0
        self.FightPowerEx = 0
        self.MemberCount = 0
@@ -13878,6 +13658,7 @@
        length += 2
        length += 4
        length += 4
        length += 3
        length += 4
        length += 4
        length += 1
@@ -13897,6 +13678,7 @@
        data = CommFunc.WriteWORD(data, self.JoinLVMin)
        data = CommFunc.WriteDWORD(data, self.ServerID)
        data = CommFunc.WriteDWORD(data, self.EmblemID)
        data = CommFunc.WriteString(data, 3, self.EmblemWord)
        data = CommFunc.WriteDWORD(data, self.FightPower)
        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
        data = CommFunc.WriteBYTE(data, self.MemberCount)
@@ -13915,6 +13697,7 @@
                                JoinLVMin:%d,
                                ServerID:%d,
                                EmblemID:%d,
                                EmblemWord:%s,
                                FightPower:%d,
                                FightPowerEx:%d,
                                MemberCount:%d
@@ -13931,6 +13714,7 @@
                                self.JoinLVMin,
                                self.ServerID,
                                self.EmblemID,
                                self.EmblemWord,
                                self.FightPower,
                                self.FightPowerEx,
                                self.MemberCount
@@ -14282,114 +14066,6 @@
#------------------------------------------------------
# A5 04 玩家战盟科技等级 #tagMCPlayerTechInfo
class  tagMCPlayerTech(Structure):
    _pack_ = 1
    _fields_ = [
                  ("TechID", c_ushort),    # 科技ID
                  ("TechLV", c_ushort),    # 特技等级
                  ]
    def __init__(self):
        self.Clear()
        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.TechID = 0
        self.TechLV = 0
        return
    def GetLength(self):
        return sizeof(tagMCPlayerTech)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 04 玩家战盟科技等级 //tagMCPlayerTechInfo:
                                TechID:%d,
                                TechLV:%d
                                '''\
                                %(
                                self.TechID,
                                self.TechLV
                                )
        return DumpString
class  tagMCPlayerTechInfo(Structure):
    Head = tagHead()
    TechCnt = 0    #(BYTE TechCnt)// 科技个数
    TechInfoList = list()    #(vector<tagMCPlayerTech> TechInfoList)// 科技信息列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0x04
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.TechCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.TechCnt):
            temTechInfoList = tagMCPlayerTech()
            _pos = temTechInfoList.ReadData(_lpData, _pos)
            self.TechInfoList.append(temTechInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0x04
        self.TechCnt = 0
        self.TechInfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.TechCnt):
            length += self.TechInfoList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.TechCnt)
        for i in range(self.TechCnt):
            data = CommFunc.WriteString(data, self.TechInfoList[i].GetLength(), self.TechInfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                TechCnt:%d,
                                TechInfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.TechCnt,
                                "..."
                                )
        return DumpString
m_NAtagMCPlayerTechInfo=tagMCPlayerTechInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCPlayerTechInfo.Head.Cmd,m_NAtagMCPlayerTechInfo.Head.SubCmd))] = m_NAtagMCPlayerTechInfo
#------------------------------------------------------
# A5 20 玩家家族信息 #tagMCRoleFamilyInfo
class  tagMCRoleFamilyMember(Structure):
@@ -14407,7 +14083,9 @@
    FightPowerEx = 0    #(DWORD FightPowerEx)//战力,整除亿部分
    ServerID = 0    #(DWORD ServerID)//所属区服ID
    ContribTotal = 0    #(DWORD ContribTotal)//总贡献度
    ContribWeek = 0    #(DWORD ContribWeek)//周贡献度
    ContribDay = 0    #(DWORD ContribDay)//日贡献度
    DonateCntTotal = 0    #(DWORD DonateCntTotal)//总捐献次数
    DonateCntDay = 0    #(BYTE DonateCntDay)//日捐献次数
    OffTime = 0    #(DWORD OffTime)// 0-在线; >0-/离线时间戳
    data = None
@@ -14431,7 +14109,9 @@
        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.ContribTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.ContribWeek,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.ContribDay,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.DonateCntTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.DonateCntDay,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.OffTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        return _pos
@@ -14450,7 +14130,9 @@
        self.FightPowerEx = 0
        self.ServerID = 0
        self.ContribTotal = 0
        self.ContribWeek = 0
        self.ContribDay = 0
        self.DonateCntTotal = 0
        self.DonateCntDay = 0
        self.OffTime = 0
        return
@@ -14472,6 +14154,8 @@
        length += 4
        length += 4
        length += 4
        length += 1
        length += 4
        return length
@@ -14491,7 +14175,9 @@
        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
        data = CommFunc.WriteDWORD(data, self.ServerID)
        data = CommFunc.WriteDWORD(data, self.ContribTotal)
        data = CommFunc.WriteDWORD(data, self.ContribWeek)
        data = CommFunc.WriteDWORD(data, self.ContribDay)
        data = CommFunc.WriteDWORD(data, self.DonateCntTotal)
        data = CommFunc.WriteBYTE(data, self.DonateCntDay)
        data = CommFunc.WriteDWORD(data, self.OffTime)
        return data
@@ -14511,7 +14197,9 @@
                                FightPowerEx:%d,
                                ServerID:%d,
                                ContribTotal:%d,
                                ContribWeek:%d,
                                ContribDay:%d,
                                DonateCntTotal:%d,
                                DonateCntDay:%d,
                                OffTime:%d
                                '''\
                                %(
@@ -14529,7 +14217,9 @@
                                self.FightPowerEx,
                                self.ServerID,
                                self.ContribTotal,
                                self.ContribWeek,
                                self.ContribDay,
                                self.DonateCntTotal,
                                self.DonateCntDay,
                                self.OffTime
                                )
        return DumpString
@@ -14545,6 +14235,7 @@
    JoinLVMin = 0    #(WORD JoinLVMin)//限制最低可加入的玩家等级
    ServerID = 0    #(DWORD ServerID)//区服ID,创建时以族长的区服ID赋值
    EmblemID = 0    #(DWORD EmblemID)//徽章ID
    EmblemWord = ""    #(char EmblemWord[3])//徽章文字
    FightPower = 0    #(DWORD FightPower)//总战力,求余亿部分
    FightPowerEx = 0    #(DWORD FightPowerEx)//总战力,整除亿部分
    BroadcastLen = 0    #(WORD BroadcastLen)//公告
@@ -14571,6 +14262,7 @@
        self.JoinLVMin,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.EmblemWord,_pos = CommFunc.ReadString(_lpData, _pos,3)
        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.BroadcastLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
@@ -14596,6 +14288,7 @@
        self.JoinLVMin = 0
        self.ServerID = 0
        self.EmblemID = 0
        self.EmblemWord = ""
        self.FightPower = 0
        self.FightPowerEx = 0
        self.BroadcastLen = 0
@@ -14616,6 +14309,7 @@
        length += 2
        length += 4
        length += 4
        length += 3
        length += 4
        length += 4
        length += 2
@@ -14638,6 +14332,7 @@
        data = CommFunc.WriteWORD(data, self.JoinLVMin)
        data = CommFunc.WriteDWORD(data, self.ServerID)
        data = CommFunc.WriteDWORD(data, self.EmblemID)
        data = CommFunc.WriteString(data, 3, self.EmblemWord)
        data = CommFunc.WriteDWORD(data, self.FightPower)
        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
        data = CommFunc.WriteWORD(data, self.BroadcastLen)
@@ -14659,6 +14354,7 @@
                                JoinLVMin:%d,
                                ServerID:%d,
                                EmblemID:%d,
                                EmblemWord:%s,
                                FightPower:%d,
                                FightPowerEx:%d,
                                BroadcastLen:%d,
@@ -14677,6 +14373,7 @@
                                self.JoinLVMin,
                                self.ServerID,
                                self.EmblemID,
                                self.EmblemWord,
                                self.FightPower,
                                self.FightPowerEx,
                                self.BroadcastLen,
@@ -16637,6 +16334,7 @@
    FamilyID = 0    #(DWORD FamilyID)
    FamilyName = ""    #(char FamilyName[33])
    FamilyEmblemID = 0    #(DWORD FamilyEmblemID)//仙盟徽章ID
    FamilyEmblemWord = ""    #(char FamilyEmblemWord[3])//徽章文字
    PlusDataSize = 0    #(DWORD PlusDataSize)
    PlusData = ""    #(String PlusData)//扩展记录    
    data = None
@@ -16665,6 +16363,7 @@
        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FamilyName,_pos = CommFunc.ReadString(_lpData, _pos,33)
        self.FamilyEmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FamilyEmblemWord,_pos = CommFunc.ReadString(_lpData, _pos,3)
        self.PlusDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize)
        return _pos
@@ -16689,6 +16388,7 @@
        self.FamilyID = 0
        self.FamilyName = ""
        self.FamilyEmblemID = 0
        self.FamilyEmblemWord = ""
        self.PlusDataSize = 0
        self.PlusData = ""
        return
@@ -16711,6 +16411,7 @@
        length += 4
        length += 33
        length += 4
        length += 3
        length += 4
        length += len(self.PlusData)
@@ -16734,6 +16435,7 @@
        data = CommFunc.WriteDWORD(data, self.FamilyID)
        data = CommFunc.WriteString(data, 33, self.FamilyName)
        data = CommFunc.WriteDWORD(data, self.FamilyEmblemID)
        data = CommFunc.WriteString(data, 3, self.FamilyEmblemWord)
        data = CommFunc.WriteDWORD(data, self.PlusDataSize)
        data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData)
        return data
@@ -16756,6 +16458,7 @@
                                FamilyID:%d,
                                FamilyName:%s,
                                FamilyEmblemID:%d,
                                FamilyEmblemWord:%s,
                                PlusDataSize:%d,
                                PlusData:%s
                                '''\
@@ -16776,6 +16479,7 @@
                                self.FamilyID,
                                self.FamilyName,
                                self.FamilyEmblemID,
                                self.FamilyEmblemWord,
                                self.PlusDataSize,
                                self.PlusData
                                )
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py
@@ -746,6 +746,7 @@
        ('FightPower', ctypes.c_ulong),
        ('FightPowerEx', ctypes.c_ulong),
        ('EmblemID', ctypes.c_ushort),
        ('EmblemWord', ctypes.c_char * 3),
        ('ADOResult', ctypes.c_ulong),
    ]
@@ -768,6 +769,7 @@
        self.FightPower = 0
        self.FightPowerEx = 0
        self.EmblemID = 0
        self.EmblemWord = ''
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
@@ -790,6 +792,7 @@
        self.FightPower, pos = CommFunc.ReadDWORD(buf, pos)
        self.FightPowerEx, pos = CommFunc.ReadDWORD(buf, pos)
        self.EmblemID, pos = CommFunc.ReadWORD(buf, pos)
        self.EmblemWord, pos = CommFunc.ReadString(buf, pos, 3)
        return self.getLength()
    def getBuffer(self):
@@ -808,6 +811,7 @@
        buf = CommFunc.WriteDWORD(buf, self.FightPower)
        buf = CommFunc.WriteDWORD(buf, self.FightPowerEx)
        buf = CommFunc.WriteWORD(buf, self.EmblemID)
        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 3, self.EmblemWord)
        return buf
    def getLength(self):
@@ -826,6 +830,7 @@
        length += sizeof(ctypes.c_ulong)
        length += sizeof(ctypes.c_ulong)
        length += sizeof(ctypes.c_ushort)
        length += sizeof(ctypes.c_char) * 3
        return length
    def outputString(self):
@@ -844,6 +849,7 @@
            FightPower = %s,
            FightPowerEx = %s,
            EmblemID = %s,
            EmblemWord = %s,
            ADOResult = %s,
            '''%(
                self.ID,
@@ -860,6 +866,7 @@
                self.FightPower,
                self.FightPowerEx,
                self.EmblemID,
                self.EmblemWord,
                self.ADOResult,
            )
        return output
@@ -870,6 +877,12 @@
            self.Name = Str
        else:
            self.Name = Str[:33]
    def SetEmblemWord(self,Str):
        if len(Str)<=3:
            self.EmblemWord = Str
        else:
            self.EmblemWord = Str[:3]
            
# 家族成员表 #tagDBFamilyMem
@@ -891,7 +904,9 @@
        ('OffTime', ctypes.c_ulong),
        ('FmLV', ctypes.c_ubyte),
        ('ContribTotal', ctypes.c_ulong),
        ('ContribWeek', ctypes.c_ulong),
        ('ContribDay', ctypes.c_ulong),
        ('DonateCntTotal', ctypes.c_ulong),
        ('DonateCntDay', ctypes.c_ubyte),
        ('ADOResult', ctypes.c_ulong),
    ]
@@ -924,7 +939,9 @@
        self.OffTime, pos = CommFunc.ReadDWORD(buf, pos)
        self.FmLV, pos = CommFunc.ReadBYTE(buf, pos)
        self.ContribTotal, pos = CommFunc.ReadDWORD(buf, pos)
        self.ContribWeek, pos = CommFunc.ReadDWORD(buf, pos)
        self.ContribDay, pos = CommFunc.ReadDWORD(buf, pos)
        self.DonateCntTotal, pos = CommFunc.ReadDWORD(buf, pos)
        self.DonateCntDay, pos = CommFunc.ReadBYTE(buf, pos)
        return self.getLength()
@@ -953,7 +970,9 @@
            OffTime = %s,
            FmLV = %s,
            ContribTotal = %s,
            ContribWeek = %s,
            ContribDay = %s,
            DonateCntTotal = %s,
            DonateCntDay = %s,
            ADOResult = %s,
            '''%(
                self.PlayerID,
@@ -971,7 +990,9 @@
                self.OffTime,
                self.FmLV,
                self.ContribTotal,
                self.ContribWeek,
                self.ContribDay,
                self.DonateCntTotal,
                self.DonateCntDay,
                self.ADOResult,
            )
        return output
@@ -1130,6 +1151,7 @@
        ('FamilyID', ctypes.c_ulong),
        ('FamilyName', ctypes.c_char * 33),
        ('FamilyEmblemID', ctypes.c_ushort),
        ('FamilyEmblemWord', ctypes.c_char * 3),
        ('TitleID', ctypes.c_ulong),
        ('FightPower', ctypes.c_ulong),
        ('FightPowerEx', ctypes.c_ulong),
@@ -1157,6 +1179,7 @@
        self.FamilyID = 0
        self.FamilyName = ''
        self.FamilyEmblemID = 0
        self.FamilyEmblemWord = ''
        self.TitleID = 0
        self.FightPower = 0
        self.FightPowerEx = 0
@@ -1183,6 +1206,7 @@
        self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos)
        self.FamilyName, pos = CommFunc.ReadString(buf, pos, 33)
        self.FamilyEmblemID, pos = CommFunc.ReadWORD(buf, pos)
        self.FamilyEmblemWord, pos = CommFunc.ReadString(buf, pos, 3)
        self.TitleID, pos = CommFunc.ReadDWORD(buf, pos)
        self.FightPower, pos = CommFunc.ReadDWORD(buf, pos)
        self.FightPowerEx, pos = CommFunc.ReadDWORD(buf, pos)
@@ -1207,6 +1231,7 @@
        buf = CommFunc.WriteDWORD(buf, self.FamilyID)
        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.FamilyName)
        buf = CommFunc.WriteWORD(buf, self.FamilyEmblemID)
        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 3, self.FamilyEmblemWord)
        buf = CommFunc.WriteDWORD(buf, self.TitleID)
        buf = CommFunc.WriteDWORD(buf, self.FightPower)
        buf = CommFunc.WriteDWORD(buf, self.FightPowerEx)
@@ -1230,6 +1255,7 @@
        length += sizeof(ctypes.c_ulong)
        length += sizeof(ctypes.c_char) * 33
        length += sizeof(ctypes.c_ushort)
        length += sizeof(ctypes.c_char) * 3
        length += sizeof(ctypes.c_ulong)
        length += sizeof(ctypes.c_ulong)
        length += sizeof(ctypes.c_ulong)
@@ -1253,6 +1279,7 @@
            FamilyID = %s,
            FamilyName = %s,
            FamilyEmblemID = %s,
            FamilyEmblemWord = %s,
            TitleID = %s,
            FightPower = %s,
            FightPowerEx = %s,
@@ -1274,6 +1301,7 @@
                self.FamilyID,
                self.FamilyName,
                self.FamilyEmblemID,
                self.FamilyEmblemWord,
                self.TitleID,
                self.FightPower,
                self.FightPowerEx,
@@ -1304,6 +1332,12 @@
        else:
            self.FamilyName = Str[:33]
            
    def SetFamilyEmblemWord(self,Str):
        if len(Str)<=3:
            self.FamilyEmblemWord = Str
        else:
            self.FamilyEmblemWord = Str[:3]
# 邮件个人邮件表 #tagDBMailPersonal
class tagDBMailPersonal(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
@@ -203,8 +203,12 @@
    def SetFmLV(self, fmLV): self.__dbData.FmLV = fmLV
    def GetContribTotal(self): return self.__dbData.ContribTotal
    def SetContribTotal(self, contribTotal): self.__dbData.ContribTotal = contribTotal
    def GetContribWeek(self): return self.__dbData.ContribWeek
    def SetContribWeek(self, contribWeek): self.__dbData.ContribWeek = contribWeek
    def GetContribDay(self): return self.__dbData.ContribDay
    def SetContribDay(self, contribDay): self.__dbData.ContribDay = contribDay
    def GetDonateCntTotal(self): return self.__dbData.DonateCntTotal
    def SetDonateCntTotal(self, donateCntTotal): self.__dbData.DonateCntTotal = donateCntTotal
    def GetDonateCntDay(self): return self.__dbData.DonateCntDay
    def SetDonateCntDay(self, donateCntDay): self.__dbData.DonateCntDay = donateCntDay
    def GetBuffer(self): return self.__dbData.getBuffer()
    
    def RefreshMemberByID(self, playerID):
@@ -286,6 +290,8 @@
        return
    def GetEmblemID(self): return self.__dbData.EmblemID
    def SetEmblemID(self, emblemID): self.__dbData.EmblemID = emblemID
    def GetEmblemWord(self): return self.__dbData.EmblemWord
    def SetEmblemWord(self, emblemWord): self.__dbData.EmblemWord = emblemWord
    def GetBuffer(self): return self.__dbData.getBuffer()
        
    ## ------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py
@@ -53,6 +53,8 @@
    def SetFamilyName(self, familyName): self.__dbData.FamilyName = familyName
    def GetFamilyEmblemID(self): return self.__dbData.FamilyEmblemID
    def SetFamilyEmblemID(self, familyEmblemID): self.__dbData.FamilyEmblemID = familyEmblemID
    def GetFamilyEmblemWord(self): return self.__dbData.FamilyEmblemWord
    def SetFamilyEmblemWord(self, familyEmblemWord): self.__dbData.FamilyEmblemWord = familyEmblemWord
    def GetTitleID(self): return self.__dbData.TitleID
    def SetTitleID(self, titleID): self.__dbData.TitleID = titleID
    def GetFightPower(self): return self.__dbData.FightPower
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
@@ -725,8 +725,8 @@
        SendEventPack("UseCurrency_%s" % moneyType, dataDict, curPlayer)
       
    #战盟贡献
    elif moneyType == ShareDefine.TYPE_Price_Family_Contribution:
        SendEventPack("UseFamilyContribution", dataDict, curPlayer)
    #elif moneyType == ShareDefine.TYPE_Price_Family_Contribution:
    #    SendEventPack("UseFamilyContribution", dataDict, curPlayer)
                 
    return
@@ -992,24 +992,6 @@
    #发送封包
    SendEventPack("OneTimeCoinGiveGold", dataDict, curPlayer)
    return
## 增加玩家家族活跃度
#  @param curPlayer: 玩家实例
#  @param addValue: 增加值
#  @param curValue: 增加后值
#  @param reason:增加原因
#  @return
def DR_AddPlayerFamilyActiveValue(curPlayer, addValue, curValue, reason):
    return
    dataDict = {'PlayerID':curPlayer.GetPlayerID(), "PlayerName":curPlayer.GetPlayerName(),
                'AccID':curPlayer.GetAccID(),
                'addValue':addValue, 'FamilyActiveValue':curValue, 'Reason':reason}
    #发送封包
    SendEventPack("AddPlayerFamilyActiveValue", dataDict, curPlayer)
    return
## 宠物加点
#  @param curPlayer: 玩家实例
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py
@@ -128,7 +128,7 @@
    GameWorld.DebugAnswer(curPlayer, "仙盟ID:%s,ServerID:%s" % (familyID, family.GetServerID()))
    GameWorld.DebugAnswer(curPlayer, "LV:%s,Exp:%s" % (family.GetLV(), family.GetExp()))
    GameWorld.DebugAnswer(curPlayer, "审核:%s,等级条件:%s,申请数:%s" % (family.GetJoinReview(), family.GetJoinLVMin(), len(family.GetReqJoinPlayerInfo())))
    GameWorld.DebugAnswer(curPlayer, "徽章:%s" % (family.GetEmblemID()))
    GameWorld.DebugAnswer(curPlayer, "徽章:%s,%s" % (family.GetEmblemID(), GameWorld.CodeToGbk(family.GetEmblemWord())))
    GameWorld.DebugAnswer(curPlayer, "总战力:%s,人数:%s" % (family.GetFightPowerTotal(), family.GetCount()))
    GameWorld.DebugAnswer(curPlayer, "盟主:%s" % (family.GetLeaderID()))
    for index in range(family.GetCount()):
@@ -166,6 +166,7 @@
    memberCnt = gmList[4] if len(gmList) > 4 else random.randint(1, 10)
    
    FakeFamilyName = GameWorld.GbkToCode("神秘军团")
    FakeEmblemWord = GameWorld.GbkToCode("神")
    
    fackFamilyID = ShareDefine.FackFamilyIDStart
    fackMemID = ShareDefine.FackPlayerIDStart
@@ -197,6 +198,7 @@
        fackFamily.SetLV(familyLV)
        fackFamily.SetFightPowerTotal(familyFightPower)
        fackFamily.SetEmblemID(1)
        fackFamily.SetEmblemWord(FakeEmblemWord)
        fackFamily.SetJoinReview(1) # 设置需要审核
        fackFamily.SetJoinLVMin(random.randint(0, 1000))
        
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py
New file
@@ -0,0 +1,63 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.Family
#
# @todo:仙盟
# @author hxp
# @date 2025-10-10
# @version 1.0
#
# 详细描述: 仙盟
#
#-------------------------------------------------------------------------------
#"""Version = 2025-10-10 21:00"""
#-------------------------------------------------------------------------------
import GameWorld
import IpyGameDataPY
import PlayerFamilyEmblem
import PlayerFamily
import DBDataMgr
def OnExec(curPlayer, msgList):
    if not msgList:
        GameWorld.DebugAnswer(curPlayer, "设置等级: Family lv 等级 经验")
        GameWorld.DebugAnswer(curPlayer, "设置徽章: Family e 徽章ID [剩余时间秒]")
        GameWorld.DebugAnswer(curPlayer, "创建仙盟相关使用命令: CreateFamily")
        return
    familyID = curPlayer.GetFamilyID()
    familyMgr = DBDataMgr.GetFamilyMgr()
    curFamily = familyMgr.FindFamily(familyID) if familyID else None
    if not curFamily:
        GameWorld.DebugAnswer(curPlayer, "玩家未加入仙盟!")
        return
    value = msgList[0]
    if value == "lv":
        lv = msgList[1] if len(msgList) > 1 else 1
        exp = msgList[2] if len(msgList) > 2 else 0
        if not IpyGameDataPY.GetIpyGameData("Family", lv):
            GameWorld.DebugAnswer(curPlayer, "仙盟等级不存在: %s" % (lv))
            return
        curFamily.SetLV(lv)
        curFamily.SetExp(exp)
        GameWorld.DebugAnswer(curPlayer, "设置仙盟等级:%s, exp=%s" % (lv, exp))
    elif value == "e":
        emblemID = msgList[1] if len(msgList) > 1 else 0
        setExpireTimes = msgList[2] if len(msgList) > 2 else None
        emblemActionObj = PlayerFamilyEmblem.AddFamilyEmblem(curFamily.GetID(), emblemID, setExpireTimes)
        if not emblemActionObj:
            GameWorld.DebugAnswer(curPlayer, "该徽章ID无法添加")
            return
        endTime = PlayerFamilyEmblem.GetActionEmblemEndTime(emblemActionObj)
        GameWorld.DebugAnswer(curPlayer, "添加徽章(%s)到期:%s" % (emblemID, GameWorld.ChangeTimeNumToStr(endTime)))
        return
    PlayerFamily.Sync_FamilyInfo(curPlayer)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetFamilyActionCnt.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetTechLV.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
@@ -17,6 +17,7 @@
import DBDataMgr
import GameWorld
import PlayerFamily
import IpyGameDataPY
import IPY_GameWorld
import PlayerEventCounter
@@ -265,6 +266,7 @@
    #GameWorldActionControl.Dispose_OperationActionState()
    #GameWorldActionControl.Dispose_DailyActionState()
    #GameWorldActionControl.Dispose_FBStateTime()
    PlayerFamily.OnMinute()
    PlayerOnline.OnMinute()
    BattleObj.OnMinute()
    ObjPool.OnMinute()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -934,14 +934,6 @@
                        ("dict", "ExpMaterial", 0),
                        ),
                "FamilyTech":(
                        ("DWORD", "TechID", 1),
                        ("BYTE", "AttrType", 0),
                        ("DWORD", "AttrValue", 0),
                        ("DWORD", "Contribution", 0),
                        ("DWORD", "PowerEx", 0),
                        ),
                "NPCDropItem":(
                        ("DWORD", "NPCID", 1),
                        ("WORD", "MaxWorldLV", 0),
@@ -1281,14 +1273,6 @@
                        ("DWORD", "NPCID", 1),
                        ("WORD", "PerPlayerMoneyAward", 0),
                        ("list", "PersonFirstKillAward", 0),
                        ),
                "FamilyActivity":(
                        ("DWORD", "ID", 1),
                        ("WORD", "UnLockFuncID", 0),
                        ("BYTE", "TotalActivityTime", 0),
                        ("WORD", "SingleTimes", 0),
                        ("WORD", "SingleActiveValue", 0),
                        ),
                "FamilyRedPack":(
@@ -2380,6 +2364,14 @@
                        ("BYTE", "UnlockFamilyLV", 0),
                        ("DWORD", "ExpireMinutes", 0),
                        ("DWORD", "CustomFamilyID", 0),
                        ),
                "FamilyDonate":(
                        ("BYTE", "DonateType", 1),
                        ("BYTE", "DailyCnt", 0),
                        ("BYTE", "MoneyType", 0),
                        ("DWORD", "MoneyValue", 0),
                        ("list", "AwardItemList", 0),
                        ),
                "FamilyZhenbaogeCut":(
@@ -3872,19 +3864,6 @@
    def GetRandExpMax(self): return self.attrTuple[2] # 最大随机精炼值 DWORD
    def GetExpMaterial(self): return self.attrTuple[3] # 翅膀代数对应精炼值 dict
# 仙盟科技表
class IPY_FamilyTech():
    def __init__(self):
        self.attrTuple = None
        return
    def GetTechID(self): return self.attrTuple[0] # 科技ID*1000+等级 DWORD
    def GetAttrType(self): return self.attrTuple[1] # 属性类型 BYTE
    def GetAttrValue(self): return self.attrTuple[2] # 属性值 DWORD
    def GetContribution(self): return self.attrTuple[3] # 需要贡献度 DWORD
    def GetPowerEx(self): return self.attrTuple[4] # 额外战力 DWORD
# NPC掉落表
class IPY_NPCDropItem():
    
@@ -4360,19 +4339,6 @@
    def GetNPCID(self): return self.attrTuple[0] # ID DWORD
    def GetPerPlayerMoneyAward(self): return self.attrTuple[1] #  首杀全服玩家奖励灵石额度/人 WORD
    def GetPersonFirstKillAward(self): return self.attrTuple[2] #  个人首次击杀奖励 [[物品ID,个数,是否拍品], ...] list
# 仙盟活跃表
class IPY_FamilyActivity():
    def __init__(self):
        self.attrTuple = None
        return
    def GetID(self): return self.attrTuple[0] # ID DWORD
    def GetUnLockFuncID(self): return self.attrTuple[1] # 解锁功能ID WORD
    def GetTotalActivityTime(self): return self.attrTuple[2] # 总次数 BYTE
    def GetSingleTimes(self): return self.attrTuple[3] # 增加活跃需要次数 WORD
    def GetSingleActiveValue(self): return self.attrTuple[4] # 每轮增加活跃积分 WORD
# 仙盟红包表
class IPY_FamilyRedPack():
@@ -6060,6 +6026,19 @@
    def GetExpireMinutes(self): return self.attrTuple[2] # 有效时长,分钟 DWORD
    def GetCustomFamilyID(self): return self.attrTuple[3] # 定制仙盟ID DWORD
# 仙盟捐献表
class IPY_FamilyDonate():
    def __init__(self):
        self.attrTuple = None
        return
    def GetDonateType(self): return self.attrTuple[0] # 捐献类型 BYTE
    def GetDailyCnt(self): return self.attrTuple[1] # 每日次数 BYTE
    def GetMoneyType(self): return self.attrTuple[2] # 消耗货币类型 BYTE
    def GetMoneyValue(self): return self.attrTuple[3] # 消耗货币值 DWORD
    def GetAwardItemList(self): return self.attrTuple[4] # 获得奖励列表[[物品ID,个数], ...] list
# 仙盟珍宝阁砍价表
class IPY_FamilyZhenbaogeCut():
    
@@ -6239,7 +6218,7 @@
    def GetAwardID(self): return self.attrTuple[0] # 奖励ID 1~n BYTE
    def GetAwardItemList(self): return self.attrTuple[1] # 物品奖励[[物品ID,个数,是否拍品], ...] list
# 战令表
# 战令表/基金
class IPY_Zhanling():
    
    def __init__(self):
@@ -6475,7 +6454,6 @@
        self.__LoadFileData("EquipSuitAttr", onlyCheck)
        self.__LoadFileData("WingRefineAttr", onlyCheck)
        self.__LoadFileData("WingRefineExp", onlyCheck)
        self.__LoadFileData("FamilyTech", onlyCheck)
        self.__LoadFileData("NPCDropItem", onlyCheck)
        self.__LoadFileData("RuneTower", onlyCheck)
        self.__LoadFileData("ChinMap", onlyCheck)
@@ -6503,7 +6481,6 @@
        self.__LoadFileData("ActivityPlaceReward", onlyCheck)
        self.__LoadFileData("BOSSInfo", onlyCheck)
        self.__LoadFileData("BOSSFirstKill", onlyCheck)
        self.__LoadFileData("FamilyActivity", onlyCheck)
        self.__LoadFileData("FamilyRedPack", onlyCheck)
        self.__LoadFileData("ActFeastRedPacketSucc", onlyCheck)
        self.__LoadFileData("NPCShow", onlyCheck)
@@ -6623,6 +6600,7 @@
        self.__LoadFileData("EquipPlusEvolve", onlyCheck)
        self.__LoadFileData("Family", onlyCheck)
        self.__LoadFileData("FamilyEmblem", onlyCheck)
        self.__LoadFileData("FamilyDonate", onlyCheck)
        self.__LoadFileData("FamilyZhenbaogeCut", onlyCheck)
        self.__LoadFileData("FamilyZhenbaogeItem", onlyCheck)
        self.__LoadFileData("FamilyZhenfa", onlyCheck)
@@ -7466,13 +7444,6 @@
        self.CheckLoadData("WingRefineExp")
        return self.ipyWingRefineExpCache[index]
    def GetFamilyTechCount(self):
        self.CheckLoadData("FamilyTech")
        return self.ipyFamilyTechLen
    def GetFamilyTechByIndex(self, index):
        self.CheckLoadData("FamilyTech")
        return self.ipyFamilyTechCache[index]
    def GetNPCDropItemCount(self):
        self.CheckLoadData("NPCDropItem")
        return self.ipyNPCDropItemLen
@@ -7661,13 +7632,6 @@
    def GetBOSSFirstKillByIndex(self, index):
        self.CheckLoadData("BOSSFirstKill")
        return self.ipyBOSSFirstKillCache[index]
    def GetFamilyActivityCount(self):
        self.CheckLoadData("FamilyActivity")
        return self.ipyFamilyActivityLen
    def GetFamilyActivityByIndex(self, index):
        self.CheckLoadData("FamilyActivity")
        return self.ipyFamilyActivityCache[index]
    def GetFamilyRedPackCount(self):
        self.CheckLoadData("FamilyRedPack")
@@ -8502,6 +8466,13 @@
        self.CheckLoadData("FamilyEmblem")
        return self.ipyFamilyEmblemCache[index]
    def GetFamilyDonateCount(self):
        self.CheckLoadData("FamilyDonate")
        return self.ipyFamilyDonateLen
    def GetFamilyDonateByIndex(self, index):
        self.CheckLoadData("FamilyDonate")
        return self.ipyFamilyDonateCache[index]
    def GetFamilyZhenbaogeCutCount(self):
        self.CheckLoadData("FamilyZhenbaogeCut")
        return self.ipyFamilyZhenbaogeCutLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -876,12 +876,8 @@
            return True
        if itemID not in ChConfig.Def_TransformItemIDList:
            return False
        if itemID == ChConfig.Def_ItemID_FamilyContribution:
            PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, itemCount, True, ShareDefine.Def_AddFAVReason_UseItem, True)
        elif itemID == ChConfig.Def_ItemID_SilverMoney:
        if itemID == ChConfig.Def_ItemID_SilverMoney:
            PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, itemCount)
        elif itemID == ChConfig.Def_ItemID_FamilyActive:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyActivity, itemCount)
        elif itemID == ChConfig.Def_ItemID_SP:
            PlayerControl.PlayerAddZhenQi(curPlayer, itemCount)
        elif itemID == ChConfig.Def_ItemID_GoldPaper:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_GiveMoney.py
@@ -98,11 +98,8 @@
    for moneyType, giveMoney in giveMoneyDict.items():
        
        giveTotalMoney = giveMoney * successCnt
        if moneyType == ShareDefine.TYPE_Price_Family_Contribution:
            PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, giveTotalMoney, True, ShareDefine.Def_AddFAVReason_UseItem, True)
        else:
            addDataDict = {"UseCount":successCnt, ChConfig.Def_Give_Reason_SonKey:itemID}
            PlayerControl.GiveMoney(curPlayer, moneyType, giveTotalMoney, ChConfig.Def_GiveMoney_UseItem, addDataDict)
        addDataDict = {"UseCount":successCnt, ChConfig.Def_Give_Reason_SonKey:itemID}
        PlayerControl.GiveMoney(curPlayer, moneyType, giveTotalMoney, ChConfig.Def_GiveMoney_UseItem, addDataDict)
            
    return True, successCnt
@@ -138,10 +135,6 @@
        return ShareDefine.TYPE_Price_Rune
    elif curEffID == ChConfig.Def_Effect_ItemGiveRuneSplinters:
        return ShareDefine.TYPE_Price_RuneSplinters
    elif curEffID == ChConfig.Def_Effect_ItemGiveFamilyActivity:
        return ShareDefine.TYPE_Price_FamilyActivity
    elif curEffID == ChConfig.Def_Effect_ItemGiveFamilyContribution:
        return ShareDefine.TYPE_Price_Family_Contribution
    elif curEffID == ChConfig.Def_Effect_ItemGiveRealmPoint:
        return ShareDefine.TYPE_Price_RealmPoint
    elif curEffID == ChConfig.Def_Effect_ItemGiveSoulDust:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -3287,8 +3287,8 @@
    elif rewardType == ChConfig.Def_RewardType_DayFreeGoldGift:
        PlayerDailyGiftbag.OnGetDailyFreeGiftbag(curPlayer)
    # 仙盟每日福利奖励
    elif rewardType == ChConfig.Def_RewardType_FamilyDayAward:
        PlayerFamily.GetFamilyDayAward(curPlayer)
    #elif rewardType == ChConfig.Def_RewardType_FamilyDayAward:
    #    PlayerFamily.GetFamilyDayAward(curPlayer)
    # 玩家等级奖励
    elif rewardType == ChConfig.Def_RewardType_LVAward:
        PlayerLVAward.GetPlayerLVAward(curPlayer, dataEx)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -2981,6 +2981,9 @@
        GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_GiveMoney, msgInfo, [serverGroupID])
        return True
    
    if priceType == ShareDefine.TYPE_Price_FamilyExp:
        return PlayerFamily.AddFamilyExp(curPlayer, value)
    befMoney = GetMoney(curPlayer, priceType)
    if priceType == IPY_GameWorld.TYPE_Price_Gold_Money:
        updPlayerGold = GetMoneyReal(curPlayer, priceType) + value
@@ -3063,6 +3066,9 @@
    
    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_GetMoney, value, [priceType])
    
    if priceType == ShareDefine.TYPE_Price_FamilyCoin:
        PlayerFamily.AddFamilyContrib(curPlayer, value) # 公会币同步增加公会贡献
    if priceType not in [IPY_GameWorld.TYPE_Price_Gold_Money, IPY_GameWorld.TYPE_Price_Gold_Paper, ShareDefine.TYPE_Price_PayCoin] \
        and giveType == ChConfig.Def_GiveMoney_Unknown:
        #GameWorld.DebugLog("该货币没有指定来源类型不记录!priceType=%s,giveType=%s" % (priceType, giveType))
@@ -4832,10 +4838,6 @@
# 血瓶恢复效果
def GetHPCureEnhance(curPlayer): return 0
# 仙盟徽章ID
def GetFamilyEmblemID(curPlayer): return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyEmblemID)
def SetFamilyEmblemID(curPlayer, emblemID): NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyEmblemID, emblemID)
# 仙盟职位,使用 GetReceivedSalary,因为FamilyMemberLV没有入库
def GetFamilyMemberLV(curPlayer): return curPlayer.GetReceivedSalary()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -22,17 +22,18 @@
import NetPackCommon
import PlayerViewCache
import ChPyNetSendPack
import PlayerFamilyTech
import PlayerFamilyEmblem
import PlayerFamilyZhenfa
#import PlayerFamilyZhenfa
import PlayerFamilyZhenbaoge
import IPY_PlayerDefine
import IpyGameDataPY
import IPY_GameWorld
import ItemControler
import GameFuncComm
import ItemCommon
import DBDataMgr
import DirtyList
import ObjPool
import random
import time
@@ -53,7 +54,10 @@
FamilyChangeType_MemFmlvChange, # 成员职位变更 7
FamilyChangeType_MemLogin, # 成员上线 8
FamilyChangeType_MemLogout, # 成员离线9
) = range(10)
FamilyChangeType_FamilyLVExp, # 仙盟等级经验变更 10
FamilyChangeType_MemContrib, # 成员贡献变更 11
FamilyChangeType_OnDay, # 过天 12
) = range(13)
#仙盟权限
(
@@ -77,18 +81,25 @@
    familyManager = DBDataMgr.GetFamilyMgr()
    for i in range(0, familyManager.GetCount()):
        family = familyManager.GetAt(i)
        familyID = family.GetID()
        #珍宝阁
        PlayerFamilyZhenbaoge.OnDay(family)
        for index in xrange(family.GetCount()):
            member = family.GetAt(index)
            # 重置成员日信息
            member.SetContribDay(0)
            member.SetDonateCntDay(0)
        Broadcast_FamilyChange(familyID, FamilyChangeType_OnDay)
        
    return
def PlayerOnDay(curPlayer):
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family):
        return
    #每日福利奖励
    Sync_FamilyDayRewardState(curPlayer)
    __FamilyAffair_Refresh(curPlayer, True)
    ResetDailyDonateCnt(curPlayer)
    PlayerFamilyZhenbaoge.PlayerOnDay(curPlayer)
    return
@@ -97,10 +108,8 @@
        return
    PlayerLoginRefreshFamily(curPlayer, tick)
    Sync_RequestAddFamilyInfo(curPlayer, False)
    Sync_FamilyDayRewardState(curPlayer)
    PlayerFamilyTech.Sync_PlayerFamilyTechLV(curPlayer)
    __FamilyAffair_CheckReset(curPlayer)
    PlayerFamilyZhenfa.OnPlayerLogin(curPlayer)
    SyncDonateCntInfo(curPlayer)
    #PlayerFamilyZhenfa.OnPlayerLogin(curPlayer)
    PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
    return
@@ -124,9 +133,6 @@
def OnWeekEx(curPlayer):
    #重置
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityAwardRecord, 0)
    for actionid in ShareDefine.FamilyActiveIDList:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityFinishCnt%actionid, 0)
    return
def PlayerLoginRefreshFamily(curPlayer, tick):
@@ -169,6 +175,11 @@
    
    return
def OnMinute():
    #战力刷新在DBFamily.OnMinute
    PlayerFamilyEmblem.CheckExpireEmblem()
    return
#// A6 04 创建家族 #tagCMCreateFamily
#
#struct    tagCMCreateFamily
@@ -176,11 +187,13 @@
#    tagHead        Head;
#    char        Name[33];
#    WORD        EmblemID; //选择徽章ID,解锁仙盟等级为1级的均为可选ID
#    char        EmblemWord[3];    //徽章文字
#};
def OnCreateFamily(index, clientPack, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    inputName = clientPack.Name
    emblemID = clientPack.EmblemID
    emblemWord = clientPack.EmblemWord
    
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family):
        return
@@ -218,6 +231,7 @@
        emblemID = random.choice(emblemIDList) # 从默认徽章中随机选择一个
    GameWorld.Log("创建仙盟: familyID=%s,playerID=%s,emblemID=%s" % (newFamilyID, playerID, emblemID))
    curFamily.SetEmblemID(emblemID)
    curFamily.SetEmblemWord(emblemWord)
    
    #-设置家族成员属性
    DoPlayerJionFamily(curFamily, playerID, curPlayer, IPY_PlayerDefine.fmlLeader)
@@ -366,7 +380,6 @@
    playerID = curPlayer.GetPlayerID()
    refreshFmLV = 0
    refreshFamilyLV = 0
    refreshEmblemID = 0
    refreshFamilyName = ""
    if refreshFamilyID:
        familyMgr = DBDataMgr.GetFamilyMgr()
@@ -374,7 +387,6 @@
        if curFamily:
            refreshFamilyLV = curFamily.GetLV()
            refreshFamilyName = curFamily.GetName()
            refreshEmblemID = curFamily.GetEmblemID()
            member = curFamily.FindMember(playerID)
            if member:
                refreshFmLV = member.GetFmLV()
@@ -392,9 +404,6 @@
        curPlayer.SetFamilyName(refreshFamilyName)
        curPlayer.Notify_FamilyNameRefresh() #//04 36    周围玩家家族名刷新#tagPlayerFamilyNameRefresh
        
    if PlayerControl.GetFamilyEmblemID(curPlayer) != refreshEmblemID:
        PlayerControl.SetFamilyEmblemID(curPlayer, refreshEmblemID)
    if lastFmLV != refreshFmLV:
        PlayerControl.SetFamilyMemberLV(curPlayer, refreshFmLV)
        
@@ -430,8 +439,6 @@
    familyMgr = DBDataMgr.GetFamilyMgr()
    familyMgr.DelPlayerReqJoinFamilyIDAll(curPlayer.GetPlayerID())
    Sync_RequestAddFamilyInfo(curPlayer)
    __FamilyAffair_CheckReset(curPlayer)
    PlayerFamilyTech.Sync_PlayerFamilyTechLV(curPlayer)
    return
def __OnLeaveFamily(curPlayer, tick):
@@ -480,6 +487,7 @@
    clientPack.JoinLVMin = curFamily.GetJoinLVMin()
    clientPack.ServerID = curFamily.GetServerID()
    clientPack.EmblemID = curFamily.GetEmblemID()
    clientPack.EmblemWord = curFamily.GetEmblemWord()
    clientPack.FightPower = curFamily.GetFightPower()
    clientPack.FightPowerEx = curFamily.GetFightPowerEx()
    clientPack.Broadcast = curFamily.GetBroadcast()
@@ -503,7 +511,9 @@
        memInfo.FmLV = member.GetFmLV()
        memInfo.ServerID = member.GetServerID()
        memInfo.ContribTotal = member.GetContribTotal()
        memInfo.ContribWeek = member.GetContribWeek()
        memInfo.ContribDay = member.GetContribDay()
        memInfo.DonateCntTotal = member.GetDonateCntTotal()
        memInfo.DonateCntDay = member.GetDonateCntDay()
        memInfo.OffTime = member.GetOffTime()
        clientPack.MemberList.append(memInfo)
    clientPack.MemberCount = len(clientPack.MemberList)
@@ -937,11 +947,13 @@
#{
#    tagHead        Head;
#    BYTE        EmblemID;    // 更换的徽章ID
#    char        EmblemWord[3];    // 徽章文字
#};
def OnChangeFamilyEmblem(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    changeEmblemID = clientData.EmblemID
    PlayerFamilyEmblem.OnChangeFamilyEmblem(curPlayer, changeEmblemID)
    emblemWord = clientData.EmblemWord
    PlayerFamilyEmblem.OnChangeFamilyEmblem(curPlayer, changeEmblemID, emblemWord)
    return
#// A6 25 修改家族成员职位 #tagCMChangeFamilyMemLV
@@ -1305,8 +1317,11 @@
        family = familyMgr.GetAt(index)
        if not family:
            continue
        if msg and msg not in family.GetName():
            continue
        if msg:
            if msg in family.GetName() or msg == str(family.GetID()):
                pass
            else:
                continue
        familyView = ChPyNetSendPack.tagMCFamilyView()
        familyView.FamilyID = family.GetID()
        familyView.FamilyName = family.GetName()
@@ -1320,6 +1335,7 @@
        familyView.JoinLVMin = family.GetJoinLVMin()
        familyView.ServerID = family.GetServerID()
        familyView.EmblemID = family.GetEmblemID()
        familyView.EmblemWord = family.GetEmblemWord()
        familyView.FightPower = family.GetFightPower()
        familyView.FightPowerEx = family.GetFightPowerEx()
        familyView.MemberCount = family.GetCount()
@@ -1339,20 +1355,138 @@
#    BYTE        DonateType;    // 捐献类型
#};
def OnFamilyMoneyDonate(index, clientData, tick):
    #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    #DonateType = clientData.DonateType
    #playerID = curPlayer.GetPlayerID()
    # 先屏蔽,等功能定了再改
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    donateType = clientData.DonateType
    playerID = curPlayer.GetPlayerID()
    familyID = curPlayer.GetFamilyID()
    if familyID <= 0:
        return
    familyMgr = DBDataMgr.GetFamilyMgr()
    curFamily = familyMgr.FindFamily(familyID)
    if not curFamily:
        return
    curMember = curFamily.FindMember(playerID)
    if not curMember:
        return
    ipyData = IpyGameDataPY.GetIpyGameData("FamilyDonate", donateType)
    if not ipyData:
        return
    dailyCntMax = ipyData.GetDailyCnt()
    donateCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDonateCnt % donateType)
    if donateCnt >= dailyCntMax:
        GameWorld.DebugLog("今日捐献次数已达上限! donateType=%s,donateCnt=%s >= %s" % (donateType, donateCnt, dailyCntMax), playerID)
        return
    moneyType = ipyData.GetMoneyType()
    moneyValue = ipyData.GetMoneyValue()
    if not moneyType or not moneyValue:
        return
    if not PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "FamilyMoneyDonate"):
        return
    awardItemList = ipyData.GetAwardItemList()
    donateCnt += 1
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyDonateCnt % donateType, donateCnt)
    SyncDonateCntInfo(curPlayer)
    # 增加成员捐献次数记录
    memDonateCntDay = curMember.GetDonateCntDay() + 1
    memDonateCntTotal = min(curMember.GetDonateCntTotal() + 1, ChConfig.Def_UpperLimit_DWord)
    curMember.SetDonateCntDay(memDonateCntDay)
    curMember.SetDonateCntTotal(memDonateCntTotal)
    GameWorld.DebugLog("家族捐献: donateType=%s,donateCnt=%s,%s,memDonateCntDay=%s,memDonateCntDay=%s"
                       % (donateType, donateCnt, awardItemList, memDonateCntDay, memDonateCntTotal), playerID)
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList)
    return
def ResetDailyDonateCnt(curPlayer):
    isReset = False
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetFamilyDonateCount()):
        ipyData = ipyDataMgr.GetFamilyDonateByIndex(index)
        donateType = ipyData.GetDonateType()
        donateCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDonateCnt % donateType)
        if donateCnt:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyDonateCnt % donateType, 0)
            isReset = True
    if isReset:
        SyncDonateCntInfo(curPlayer)
    return
#---------------------------------------------------------------------
def AddPlayerFamilyActiveValue(curPlayer, addValue, sendPackGameServer = False, reason = 0, isSysMsg=False):
    # 多个地方用到,先保留,之后删除统一修改
def SyncDonateCntInfo(curPlayer):
    donateCntList = []
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetFamilyDonateCount()):
        ipyData = ipyDataMgr.GetFamilyDonateByIndex(index)
        donateType = ipyData.GetDonateType()
        donateCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDonateCnt % donateType)
        donateCntList.append(donateCnt)
    if not donateCntList:
        return
    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCDonateCntInfo)
    clientPack.DonateCntList = donateCntList
    clientPack.Count = len(clientPack.DonateCntList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
def AddFamilyExp(curPlayer, addExp):
    ## 增加玩家家族经验
    playerID = curPlayer.GetPlayerID()
    familyID = curPlayer.GetFamilyID()
    if familyID <= 0:
        return
    familyMgr = DBDataMgr.GetFamilyMgr()
    curFamily = familyMgr.FindFamily(familyID)
    if not curFamily:
        return
    curLV = curFamily.GetLV()
    curExp = curFamily.GetExp()
    updLV = curLV
    updExp = curExp + addExp
    GameWorld.DebugLog("增加仙盟经验: curLV=%s,curExp=%s,addExp=%s,updExp=%s" % (curLV, curExp, addExp, updExp), playerID)
    ipyData = IpyGameDataPY.GetIpyGameData("Family", curLV)
    lvUPExp = ipyData.GetNeedExp()
    while lvUPExp and updExp >= lvUPExp:
        ipyData = IpyGameDataPY.GetIpyGameDataNotLog("Family", updLV + 1)
        if not ipyData:
            break
        updLV += 1
        updExp -= lvUPExp
        lvUPExp = ipyData.GetNeedExp()
        GameWorld.DebugLog("    仙盟升级: updLV=%s,updExp=%s,lvUPExp=%s" % (updLV, updExp, lvUPExp), playerID)
    curFamily.SetLV(updLV)
    curFamily.SetExp(updExp)
    Sync_FamilyInfo(curPlayer)
    Broadcast_FamilyChange(familyID, FamilyChangeType_FamilyLVExp, excludeIDList=[playerID])
    return True
def SendPack_GameServer_AddFamilyDetail(curPlayer, addFamilyHornor = 0, addFamilyMoney = 0, addFamilyActiveValue = 0, resion=0):
    return
def SendPack_GameServer_AddFamilyDetailEx(curPlayer, addPlayerActiveValue, addFamilyMoney = 0, addFamilyHornor = 0, resion=0):
def AddFamilyContrib(curPlayer, addContribValue):
    ## 增加玩家累计家族贡献
    playerID = curPlayer.GetPlayerID()
    familyID = curPlayer.GetFamilyID()
    if familyID <= 0:
        return
    familyMgr = DBDataMgr.GetFamilyMgr()
    curFamily = familyMgr.FindFamily(familyID)
    if not curFamily:
        return
    curMember = curFamily.FindMember(playerID)
    if not curMember:
        return
    contribDay = curMember.GetContribDay() + addContribValue
    contribTotal = min(curMember.GetContribTotal() + addContribValue, ChConfig.Def_UpperLimit_DWord)
    curMember.SetContribDay(contribDay)
    curMember.SetContribTotal(contribTotal)
    GameWorld.DebugLog("增加成员贡献: familyID=%s,addContribValue=%s,contribDay=%s,contribTotal=%s" % (familyID, addContribValue, contribDay, contribTotal), playerID)
    Sync_FamilyInfo(curPlayer)
    Broadcast_FamilyChange(familyID, FamilyChangeType_MemContrib, excludeIDList=[playerID])
    return
## ------------------------------------------------------------------------------------------------
@@ -1453,222 +1587,3 @@
    Broadcast_FamilyPack(familyID, clientPack)
    return
def GetFamilyDayAward(curPlayer):
    ##领取仙盟每日奖励 2小时脱机挂时间
    return
def Sync_FamilyDayRewardState(curPlayer):
    clientPack = ChPyNetSendPack.tagMCFamilyDayAward()
    clientPack.GetState = 0
    clientPack.MoneyDonateCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDonateRecord)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
def AddFamilyActivity(curPlayer, actionid, addCnt=1):
    return
##--------------------------------------- 仙盟事务 --------------------------------------------------
AffairState_None = 0 # 无
AffairState_Underway = 1 # 进行中
AffairState_Finish = 2 # 已完成
#// A6 13 家族事务操作 #tagCMFamilyAffairOP
#
#struct     tagCMFamilyAffairOP
#{
#    tagHead        Head;
#    BYTE        OPType;    // 操作类型:1-刷新事务;2-开始事务;3-领取事务奖励;
#    WORD        AffairID;    // 事务ID,可选
#};
def OnFamilyAffairOP(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    opType = clientData.OPType
    affairID = clientData.AffairID
    if opType == 1:
        __FamilyAffair_Refresh(curPlayer)
    elif opType == 2:
        __FamilyAffair_Start(curPlayer, affairID)
    elif opType == 3:
        __FamilyAffair_GetAward(curPlayer, affairID)
    return
def __FamilyAffair_CheckReset(curPlayer):
    ## 检查任务重置,登录,进入仙盟触发
    info = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairInfo % 1)
    if not info:
        # 任务1还没分配,默认强制重置
        __FamilyAffair_Refresh(curPlayer, True)
    else:
        SyncFamilyAffairInfo(curPlayer)
    return
def __FamilyAffair_Refresh(curPlayer, isReset=False):
    ## 刷新事务
    playerID = curPlayer.GetPlayerID()
    moneyType, moneyValue = 0, 0
    dayRefreshFreeCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairRefreshFree)
    if not isReset:
        freeCountMax = IpyGameDataPY.GetFuncCfg("FamilyAffair", 2)
        if freeCountMax and dayRefreshFreeCount >= freeCountMax:
            moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 3)
            if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue):
                return
    sendMailAffairList = []
    refreshAffairIDList = []
    affairCountMax = IpyGameDataPY.GetFuncCfg("FamilyAffair", 1)
    affairStarDict = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 4)
    maxStar = 0
    starWeightList = []
    for starStr, starInfo in affairStarDict.items():
        star = int(starStr)
        if star > maxStar:
            maxStar = star
        starWeightList.append([starInfo[0], star])
    for affairID in range(1, affairCountMax + 1):
        star, state = __GetAffairInfo(curPlayer, affairID)
        if isReset:
            # 重置时还在进行中的直接发奖励
            if state == AffairState_Underway:
                sendMailAffairList.append([affairID, star])
            refreshAffairIDList.append(affairID)
        else:
            # 非重置只处理没有状态非最高星的
            if state == AffairState_None and star < maxStar:
                refreshAffairIDList.append(affairID)
    GameWorld.DebugLog("刷新事务: isReset=%s,moneyType=%s,moneyValue=%s,dayRefreshFreeCount=%s"
                       % (isReset, moneyType, moneyValue, dayRefreshFreeCount), playerID)
    GameWorld.DebugLog("    sendMailAffairList=%s" % sendMailAffairList, playerID)
    for mailInfo in sendMailAffairList:
        affairID, star = mailInfo
        if str(star) not in affairStarDict:
            continue
        paramList = [affairID, star]
        addItemList = affairStarDict[str(star)][2]
        PlayerControl.SendMailByKey("FamilyAffairAward", [playerID], addItemList, paramList)
    if isReset:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairRefreshFree, 0)
        for affairID in range(1, affairCountMax + 1):
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairInfo % affairID, 0)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID, 0)
    else:
        if moneyType and moneyValue:
            PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "FamilyAffair")
        else:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairRefreshFree, dayRefreshFreeCount + 1)
    GameWorld.DebugLog("    starWeightList=%s" % starWeightList, playerID)
    GameWorld.DebugLog("    refreshAffairIDList=%s" % refreshAffairIDList, playerID)
    for affairID in refreshAffairIDList:
        star = GameWorld.GetResultByWeightList(starWeightList, 1)
        __SetAffairInfo(curPlayer, affairID, star, AffairState_None)
        GameWorld.DebugLog("    随机事务:affairID=%s,star=%s" % (affairID, star), playerID)
    SyncFamilyAffairInfo(curPlayer)
    return
def __FamilyAffair_Start(curPlayer, affairID):
    ## 开始事务
    playerID = curPlayer.GetPlayerID()
    star, state = __GetAffairInfo(curPlayer, affairID)
    if not star:
        return
    if state != AffairState_None:
        GameWorld.DebugLog("仙盟事务已经进行中或已完成,无法开始: affairID=%s,star=%s,state=%s" % (affairID, star, state), playerID)
        return
    startTime = int(time.time())
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID, startTime)
    __SetAffairInfo(curPlayer, affairID, star, AffairState_Underway)
    GameWorld.DebugLog("仙盟事务开始: affairID=%s,star=%s,startTime=%s" % (affairID, star, startTime), playerID)
    SyncFamilyAffairInfo(curPlayer, affairID)
    return
def __FamilyAffair_GetAward(curPlayer, affairID):
    ## 领取事务奖励
    playerID = curPlayer.GetPlayerID()
    curTime = int(time.time())
    affairStarDict = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 4)
    star, state = __GetAffairInfo(curPlayer, affairID)
    if state != AffairState_Underway:
        GameWorld.DebugLog("仙盟事务状态非进行中无法领取: affairID=%s,star=%s,state=%s" % (affairID, star, state), playerID)
        SyncFamilyAffairInfo(curPlayer, affairID)
        return
    startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID)
    remainDuration = __GetAffairRemainDuration(curPlayer, affairID, star, curTime, affairStarDict)
    if remainDuration != 0:
        GameWorld.DebugLog("仙盟事务当前剩余时长未完成: affairID=%s,remainDuration=%s,startTime=%s"
                           % (affairID, remainDuration, startTime), playerID)
        SyncFamilyAffairInfo(curPlayer, affairID)
        return
    if str(star) not in affairStarDict:
        return
    addItemList = affairStarDict[str(star)][2]
    if not ItemCommon.GiveAwardItem(curPlayer, addItemList):
        return
    __SetAffairInfo(curPlayer, affairID, star, AffairState_Finish)
    GameWorld.DebugLog("仙盟事务领奖: affairID=%s,star=%s" % (affairID, star), playerID)
    SyncFamilyAffairInfo(curPlayer, affairID)
    return
def __GetAffairInfo(curPlayer, affairID):
    affairInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairInfo % affairID)
    star, state = affairInfo / 10, affairInfo % 10
    return star, state
def __SetAffairInfo(curPlayer, affairID, star, state):
    info = star * 10 + state
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairInfo % affairID, info)
    return
def __GetAffairRemainDuration(curPlayer, affairID, star, curTime, affairStarDict):
    ## -1-未开始;>=0-剩余时长
    startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID)
    if not startTime:
        return -1
    starInfo = affairStarDict.get(str(star), [])
    needDuration = starInfo[1] if len(starInfo) > 1 else 0
    # 可扩展减时长属性
    speedPer = 0#PlayerControl.GetAffairSpeedPer(curPlayer)
    if speedPer:
        needDuration = int(needDuration * max(10000 - speedPer, 0) / 10000.0)
        #GameWorld.DebugLog("事务加速: needDuration=%s,speedPer=%s" % (needDuration, speedPer), curPlayer.GetPlayerID())
    remainDuration = max(needDuration - (curTime - startTime), 0)
    return remainDuration
def SyncFamilyAffairInfo(curPlayer, affairID=None):
    if affairID == None:
        affairIDList = []
        affairCountMax = IpyGameDataPY.GetFuncCfg("FamilyAffair", 1)
        for affairID in range(1, affairCountMax + 1):
            affairIDList.append(affairID)
    else:
        affairIDList = [affairID]
    curTime = int(time.time())
    affairStarDict = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 4)
    affairInfoList = []
    for affairID in affairIDList:
        star, state = __GetAffairInfo(curPlayer, affairID)
        remainDuration = __GetAffairRemainDuration(curPlayer, affairID, star, curTime, affairStarDict)
        affairInfo = ChPyNetSendPack.tagMCFamilyAffair()
        affairInfo.AffairID = affairID
        affairInfo.Star = star
        affairInfo.State = state
        affairInfo.RemainDuration = max(0, remainDuration)
        affairInfoList.append(affairInfo)
    if not affairInfoList:
        return
    clientPack = ChPyNetSendPack.tagMCFamilyAffairInfo()
    clientPack.Clear()
    clientPack.RefreshFreeCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairRefreshFree)
    clientPack.AffairInfoList = affairInfoList
    clientPack.Count = len(clientPack.AffairInfoList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyEmblem.py
@@ -68,7 +68,7 @@
                updEmblemID = random.choice(defaultEmblemIDList) if defaultEmblemIDList else 0
                GameWorld.Log("仙盟佩戴徽章过期恢复随机默认徽章! familyID=%s,emblemID=%s,endTime=%s,updEmblemID=%s" % (familyID, emblemID, endTime, updEmblemID))
                family.SetEmblemID(updEmblemID)
                family.Broadcast_FamilyChange()
                PlayerFamily.Broadcast_FamilyChange(familyID, PlayerFamily.FamilyChangeType_EChange)
    return
def GetFamilyEmblemActionData(familyID, emblemID):
@@ -77,7 +77,7 @@
    familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType)
    for index in range(familyAction.Count()):
        familyActionObj = familyAction.At(index)
        if emblemID == familyActionObj.GetValue1():
        if emblemID == GetActionEmblemID(familyActionObj):
            return familyActionObj
    return
@@ -104,9 +104,6 @@
        actionType = ShareDefine.Def_ActionType_FamilyEmblem
        familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType)
        emblemActionObj = familyAction.AddAction()
        emblemActionObj.SetTime(curTime)
        emblemActionObj.SetFamilyId(familyID)
        emblemActionObj.SetActionType(actionType)
        
    if not emblemActionObj:
        return
@@ -134,19 +131,19 @@
    SetActionEmblemEndTime(emblemActionObj, updEndTime)
    
    # ֪ͨ
    #PlayerFamilyAction.SendFamilyAction(emblemActionObj)
    PlayerFamily.SendFamilyAction(emblemActionObj)
    return emblemActionObj
def OnChangeFamilyEmblem(curPlayer, emblemID):
def OnChangeFamilyEmblem(curPlayer, emblemID, emblemWord=""):
    ## 修改仙盟徽章
    playerID = curPlayer.GetPlayerID()
    familyID = curPlayer.GetFamilyID()
    familyManager = PlayerFamily.GetFamilyMgr()
    curFamily = familyManager.FindFamily(familyID)
    if familyID <= 0:
        return
    familyMgr = DBDataMgr.GetFamilyMgr()
    curFamily = familyMgr.FindFamily(familyID)
    if not curFamily:
        return
    familyID = curFamily.GetID()
    if curFamily.GetLeaderID() != playerID:
        GameWorld.DebugLog("只有盟主可以修改徽章!", playerID)
        return
@@ -178,8 +175,10 @@
            GameWorld.Log("该徽章已过期! familyID=%s,emblemID=%s,endTime=%s" % (familyID, emblemID, endTime))
            return
        
    GameWorld.DebugLog("更换仙盟徽章! familyID=%s,emblemID=%s" % (familyID, emblemID), playerID)
    GameWorld.DebugLog("更换仙盟徽章! familyID=%s,emblemID=%s,emblemWord=%s" % (familyID, emblemID, GameWorld.CodeToGbk(emblemWord)), playerID)
    curFamily.SetEmblemID(emblemID)
    #PlayerFamily.SendPack_MapServer_PlayerFamilyRefresh(curFamily)
    curFamily.Broadcast_FamilyChange()
    return
    if emblemWord:
        curFamily.SetEmblemWord(emblemWord)
    PlayerFamily.Sync_FamilyInfo(curPlayer)
    PlayerFamily.Broadcast_FamilyChange(familyID, PlayerFamily.FamilyChangeType_EChange, excludeIDList=[playerID])
    return True
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyTech.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCache.py
@@ -194,6 +194,9 @@
    if not curCache:
        return
    
    familyID = curPlayer.GetFamilyID()
    family = DBDataMgr.GetFamilyMgr().FindFamily(familyID) if familyID else None
    tick = GameWorld.GetGameWorld().GetTick()
    curPlayer.SetDict(Key_UpdViewCacheTick, tick)
    #GameWorld.DebugLog("更新玩家查看缓存数据! isOffline=%s" % isOffline, playerID)
@@ -205,9 +208,10 @@
    curCache.SetFace(curPlayer.GetFace())
    curCache.SetFacePic(curPlayer.GetFacePic())
    curCache.SetModelMark(curPlayer.GetModelMark())
    curCache.SetFamilyID(curPlayer.GetFamilyID())
    curCache.SetFamilyName(curPlayer.GetFamilyName())
    curCache.SetFamilyEmblemID(PlayerControl.GetFamilyEmblemID(curPlayer))
    curCache.SetFamilyID(familyID)
    curCache.SetFamilyName(family.GetName() if family else "")
    curCache.SetFamilyEmblemID(family.GetEmblemID() if family else 0)
    curCache.SetFamilyEmblemWord(family.GetEmblemWord() if family else 0)
    curCache.SetTitleID(PlayerControl.GetTitleID(curPlayer))
    curCache.SetFightPowerTotal(PlayerControl.GetFightPower(curPlayer))
    curCache.SetServerID(GameWorld.GetPlayerServerID(curPlayer))
@@ -264,9 +268,10 @@
    curCache.SetFacePic(dbPlayer.FacePic)
    curCache.SetModelMark(dbPlayer.ModelMark)
    curCache.SetFamilyID(familyID)
    family = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
    family = DBDataMgr.GetFamilyMgr().FindFamily(familyID) if familyID else None
    curCache.SetFamilyName(family.GetName() if family else "")
    curCache.SetFamilyEmblemID(family.GetEmblemID() if family else 0)
    curCache.SetFamilyEmblemWord(family.GetEmblemWord() if family else 0)
    #curCache.SetTitleID(PlayerControl.GetTitleID(curPlayer))
    curCache.SetFightPowerTotal(dbPlayer.FightPowerEx * ChConfig.Def_PerPointValue + dbPlayer.FightPower)
    curCache.SetServerID(GameWorld.GetAccIDServerID(dbPlayer.AccID))
@@ -371,6 +376,7 @@
    clientPack.FamilyID = curCache.GetFamilyID()
    clientPack.FamilyName = curCache.GetFamilyName()
    clientPack.FamilyEmblemID = curCache.GetFamilyEmblemID()
    clientPack.FamilyEmblemWord = curCache.GetFamilyEmblemWord()
    clientPack.PlusData = curCache.GetPlusData()
    clientPack.PlusDataSize = len(clientPack.PlusData)
    return clientPack
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerFamilyTechLVUP.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py
@@ -25888,6 +25888,7 @@
        ('FamilyID', ctypes.c_ulong),
        ('FamilyName', ctypes.c_char * 33),
        ('FamilyEmblemID', ctypes.c_ushort),
        ('FamilyEmblemWord', ctypes.c_char * 3),
        ('TitleID', ctypes.c_ulong),
        ('FightPower', ctypes.c_ulong),
        ('FightPowerEx', ctypes.c_ulong),
@@ -25915,6 +25916,7 @@
        self.FamilyID = 0
        self.FamilyName = ''
        self.FamilyEmblemID = 0
        self.FamilyEmblemWord = ''
        self.TitleID = 0
        self.FightPower = 0
        self.FightPowerEx = 0
@@ -25944,6 +25946,7 @@
        self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos)
        self.FamilyName, pos = CommFunc.ReadString(buf, pos, 33)
        self.FamilyEmblemID, pos = CommFunc.ReadWORD(buf, pos)
        self.FamilyEmblemWord, pos = CommFunc.ReadString(buf, pos, 3)
        self.TitleID, pos = CommFunc.ReadDWORD(buf, pos)
        self.FightPower, pos = CommFunc.ReadDWORD(buf, pos)
        self.FightPowerEx, pos = CommFunc.ReadDWORD(buf, pos)
@@ -25968,6 +25971,7 @@
        buf = CommFunc.WriteDWORD(buf, self.FamilyID)
        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.FamilyName)
        buf = CommFunc.WriteWORD(buf, self.FamilyEmblemID)
        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 3, self.FamilyEmblemWord)
        buf = CommFunc.WriteDWORD(buf, self.TitleID)
        buf = CommFunc.WriteDWORD(buf, self.FightPower)
        buf = CommFunc.WriteDWORD(buf, self.FightPowerEx)
@@ -25991,6 +25995,7 @@
        length += sizeof(ctypes.c_ulong)
        length += sizeof(ctypes.c_char) * 33
        length += sizeof(ctypes.c_ushort)
        length += sizeof(ctypes.c_char) * 3
        length += sizeof(ctypes.c_ulong)
        length += sizeof(ctypes.c_ulong)
        length += sizeof(ctypes.c_ulong)
@@ -26015,6 +26020,7 @@
        rec[u'FamilyID'] = self.FamilyID
        rec[u'FamilyName'] = fix_incomingText(self.FamilyName)
        rec[u'FamilyEmblemID'] = self.FamilyEmblemID
        rec[u'FamilyEmblemWord'] = fix_incomingText(self.FamilyEmblemWord)
        rec[u'TitleID'] = self.TitleID
        rec[u'FightPower'] = self.FightPower
        rec[u'FightPowerEx'] = self.FightPowerEx
@@ -26038,6 +26044,7 @@
        self.FamilyID = rec.get(u'FamilyID', 0)
        self.FamilyName = fix_outgoingText(rec.get(u'FamilyName', u''))
        self.FamilyEmblemID = rec.get(u'FamilyEmblemID', 0)
        self.FamilyEmblemWord = fix_outgoingText(rec.get(u'FamilyEmblemWord', u''))
        self.TitleID = rec.get(u'TitleID', 0)
        self.FightPower = rec.get(u'FightPower', 0)
        self.FightPowerEx = rec.get(u'FightPowerEx', 0)
@@ -26160,6 +26167,7 @@
            FamilyID = %s,
            FamilyName = %s,
            FamilyEmblemID = %s,
            FamilyEmblemWord = %s,
            TitleID = %s,
            FightPower = %s,
            FightPowerEx = %s,
@@ -26181,6 +26189,7 @@
                self.FamilyID,
                self.FamilyName,
                self.FamilyEmblemID,
                self.FamilyEmblemWord,
                self.TitleID,
                self.FightPower,
                self.FightPowerEx,
@@ -26193,7 +26202,7 @@
        return output
    def dumpString(self):
        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
                self.PlayerID,
                self.AccID,
                self.PlayerName,
@@ -26206,6 +26215,7 @@
                self.FamilyID,
                self.FamilyName,
                self.FamilyEmblemID,
                self.FamilyEmblemWord,
                self.TitleID,
                self.FightPower,
                self.FightPowerEx,
@@ -26234,6 +26244,12 @@
            self.FamilyName = Str
        else:
            self.FamilyName = Str[:33]
    def SetFamilyEmblemWord(self,Str):
        if len(Str)<=3:
            self.FamilyEmblemWord = Str
        else:
            self.FamilyEmblemWord = Str[:3]
            
# 排行榜表 #tagDBBillboard
@@ -27247,6 +27263,7 @@
        ('FightPower', ctypes.c_ulong),
        ('FightPowerEx', ctypes.c_ulong),
        ('EmblemID', ctypes.c_ushort),
        ('EmblemWord', ctypes.c_char * 3),
        ('ADOResult', ctypes.c_ulong),
    ]
@@ -27269,6 +27286,7 @@
        self.FightPower = 0
        self.FightPowerEx = 0
        self.EmblemID = 0
        self.EmblemWord = ''
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
@@ -27294,6 +27312,7 @@
        self.FightPower, pos = CommFunc.ReadDWORD(buf, pos)
        self.FightPowerEx, pos = CommFunc.ReadDWORD(buf, pos)
        self.EmblemID, pos = CommFunc.ReadWORD(buf, pos)
        self.EmblemWord, pos = CommFunc.ReadString(buf, pos, 3)
        return self.getLength()
    def getBuffer(self):
@@ -27312,6 +27331,7 @@
        buf = CommFunc.WriteDWORD(buf, self.FightPower)
        buf = CommFunc.WriteDWORD(buf, self.FightPowerEx)
        buf = CommFunc.WriteWORD(buf, self.EmblemID)
        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 3, self.EmblemWord)
        return buf
    def getLength(self):
@@ -27330,6 +27350,7 @@
        length += sizeof(ctypes.c_ulong)
        length += sizeof(ctypes.c_ulong)
        length += sizeof(ctypes.c_ushort)
        length += sizeof(ctypes.c_char) * 3
        return length
    def getRecord(self):
@@ -27349,6 +27370,7 @@
        rec[u'FightPower'] = self.FightPower
        rec[u'FightPowerEx'] = self.FightPowerEx
        rec[u'EmblemID'] = self.EmblemID
        rec[u'EmblemWord'] = fix_incomingText(self.EmblemWord)
        return rec
    def readRecord(self, rec):
@@ -27367,6 +27389,7 @@
        self.FightPower = rec.get(u'FightPower', 0)
        self.FightPowerEx = rec.get(u'FightPowerEx', 0)
        self.EmblemID = rec.get(u'EmblemID', 0)
        self.EmblemWord = fix_outgoingText(rec.get(u'EmblemWord', u''))
    def adoLoad(self, collection):
        '''使用KEY查找并读取'''
@@ -27532,6 +27555,7 @@
            FightPower = %s,
            FightPowerEx = %s,
            EmblemID = %s,
            EmblemWord = %s,
            ADOResult = %s,
            '''%(
                self.ID,
@@ -27548,12 +27572,13 @@
                self.FightPower,
                self.FightPowerEx,
                self.EmblemID,
                self.EmblemWord,
                self.ADOResult,
            )
        return output
    def dumpString(self):
        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
                self.ID,
                self.Name,
                self.LeaderID,
@@ -27568,6 +27593,7 @@
                self.FightPower,
                self.FightPowerEx,
                self.EmblemID,
                self.EmblemWord,
            )
        return output
@@ -27577,6 +27603,12 @@
            self.Name = Str
        else:
            self.Name = Str[:33]
    def SetEmblemWord(self,Str):
        if len(Str)<=3:
            self.EmblemWord = Str
        else:
            self.EmblemWord = Str[:3]
            
# 家族成员表 #tagDBFamilyMem
@@ -27598,7 +27630,9 @@
        ('OffTime', ctypes.c_ulong),
        ('FmLV', ctypes.c_ubyte),
        ('ContribTotal', ctypes.c_ulong),
        ('ContribWeek', ctypes.c_ulong),
        ('ContribDay', ctypes.c_ulong),
        ('DonateCntTotal', ctypes.c_ulong),
        ('DonateCntDay', ctypes.c_ubyte),
        ('ADOResult', ctypes.c_ulong),
    ]
@@ -27634,7 +27668,9 @@
        self.OffTime, pos = CommFunc.ReadDWORD(buf, pos)
        self.FmLV, pos = CommFunc.ReadBYTE(buf, pos)
        self.ContribTotal, pos = CommFunc.ReadDWORD(buf, pos)
        self.ContribWeek, pos = CommFunc.ReadDWORD(buf, pos)
        self.ContribDay, pos = CommFunc.ReadDWORD(buf, pos)
        self.DonateCntTotal, pos = CommFunc.ReadDWORD(buf, pos)
        self.DonateCntDay, pos = CommFunc.ReadBYTE(buf, pos)
        return self.getLength()
@@ -27664,7 +27700,9 @@
        rec[u'OffTime'] = self.OffTime
        rec[u'FmLV'] = self.FmLV
        rec[u'ContribTotal'] = self.ContribTotal
        rec[u'ContribWeek'] = self.ContribWeek
        rec[u'ContribDay'] = self.ContribDay
        rec[u'DonateCntTotal'] = self.DonateCntTotal
        rec[u'DonateCntDay'] = self.DonateCntDay
        return rec
    def readRecord(self, rec):
@@ -27684,7 +27722,9 @@
        self.OffTime = rec.get(u'OffTime', 0)
        self.FmLV = rec.get(u'FmLV', 0)
        self.ContribTotal = rec.get(u'ContribTotal', 0)
        self.ContribWeek = rec.get(u'ContribWeek', 0)
        self.ContribDay = rec.get(u'ContribDay', 0)
        self.DonateCntTotal = rec.get(u'DonateCntTotal', 0)
        self.DonateCntDay = rec.get(u'DonateCntDay', 0)
    def adoLoad(self, collection):
        '''使用KEY查找并读取'''
@@ -27851,7 +27891,9 @@
            OffTime = %s,
            FmLV = %s,
            ContribTotal = %s,
            ContribWeek = %s,
            ContribDay = %s,
            DonateCntTotal = %s,
            DonateCntDay = %s,
            ADOResult = %s,
            '''%(
                self.PlayerID,
@@ -27869,13 +27911,15 @@
                self.OffTime,
                self.FmLV,
                self.ContribTotal,
                self.ContribWeek,
                self.ContribDay,
                self.DonateCntTotal,
                self.DonateCntDay,
                self.ADOResult,
            )
        return output
    def dumpString(self):
        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
                self.PlayerID,
                self.FamilyID,
                self.JoinTime,
@@ -27891,7 +27935,9 @@
                self.OffTime,
                self.FmLV,
                self.ContribTotal,
                self.ContribWeek,
                self.ContribDay,
                self.DonateCntTotal,
                self.DonateCntDay,
            )
        return output
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -276,8 +276,6 @@
Def_Notify_WorldKey_FamilyKillHorsePetRobBossCnt = 'FamilyKillHorsePetRobBossCnt'   # 仙盟击杀骑宠boss数统计
Def_Notify_WorldKey_HorsePetRobBossPlayerCount = 'HorsePetRobBossPlayerCount'   # 骑宠争夺活动有效参考人数
Def_Notify_WorldKey_FamilyActivityDayState = "FamilyActivityDayState"  #战盟相关活动今日开启状态, 按位存储代表今日是否开启过
Def_Notify_WorldKey_RedPacketOutput = 'RedPacketOutput'  # 红包产出信息
Def_Notify_WorldKey_HurtLog = 'HurtLog'  # 战斗伤害日志
@@ -622,7 +620,7 @@
CDBPlayerRefresh_RuneSplinters,         # 符印碎片 170
CDBPlayerRefresh_RealmPoint,            # 境界修炼点
CDBPlayerRefresh_Ysog,                  # 魔精
CDBPlayerRefresh_FamilyActivity,        # 仙盟活跃令
CDBPlayerRefresh_FamilyCoin,            # 仙盟公会币
CDBPlayerRefresh_ParryRateDef,          # 抗格挡
CDBPlayerRefresh_PKState,               # 战斗状态 175
CDBPlayerRefresh_BossState,             # boss״̬
@@ -739,11 +737,11 @@
) = range(146, 287)
TYPE_Price_Gold_Paper_Money = 5    # 金钱类型,(先用礼券,再用金子)
TYPE_Price_Family_Contribution = 6 # 战盟贡献度(活跃度转换得来)
TYPE_Price_FamilyExp = 6 # 战盟经验
TYPE_Price_FamilyStoreScore = 10    # 战盟仓库积分
TYPE_Price_RealmPoint = 13    # 境界修炼点
TYPE_Price_Ysog = 14    # 魔精
TYPE_Price_FamilyActivity = 15    # 仙盟活跃令
TYPE_Price_FamilyCoin = 15    # 仙盟公会贡献币
TYPE_Price_FBHelpPoint = 16    # 副本助战积分, 废弃
TYPE_Price_Honor = 18    # 荣誉
TYPE_Price_BossActScore = 19    # boss活动积分,bt版用
@@ -783,7 +781,7 @@
#key可用于遍历所有货币,value仅GM相关会用到
MoneyNameDict = {
                 1:"金币", 41:"战锤", 42:"将星玉髓", 51:"招募积分", 52:"淘金令", 53:"挑战券",
                 1:"金币", 15:"公会贡献币", 41:"战锤", 42:"将星玉髓", 51:"招募积分", 52:"淘金令", 53:"挑战券",
                 98:"代币时效", 99:"代币"
                 }
#MoneyNameDict = {
@@ -800,7 +798,6 @@
# 自定义积分及通知字典 {货币类型:通知客户端刷新类型, ...} , 如果不通知的话刷新类型则配置 None
TYPE_Price_CurrencyDict = {
                           TYPE_Price_Family_Contribution:CDBPlayerRefresh_FamilyContribution,
                           TYPE_Price_FamilyStoreScore:CDBPlayerRefresh_FamilyStoreScore,
                           TYPE_Price_Rune:CDBPlayerRefresh_Rune,
                           TYPE_Price_RuneSplinters:CDBPlayerRefresh_RuneSplinters,
@@ -808,7 +805,7 @@
                           TYPE_Price_BourseMoney:None,
                           TYPE_Price_RealmPoint:CDBPlayerRefresh_RealmPoint,
                           TYPE_Price_Ysog:CDBPlayerRefresh_Ysog,
                           TYPE_Price_FamilyActivity:CDBPlayerRefresh_FamilyActivity,
                           TYPE_Price_FamilyCoin:CDBPlayerRefresh_FamilyCoin,
                           TYPE_Price_Danjing:CDBPlayerRefresh_Danjing,
                           TYPE_Price_SoulDust:CDBPlayerRefresh_SoulDust,
                           TYPE_Price_SoulSplinters:CDBPlayerRefresh_SoulSplinters,
@@ -1624,7 +1621,7 @@
SuccType_XXX97, # 废弃97
SuccType_XXX98, # 废弃98
SuccType_XXX99, # 废弃99
SuccType_FamilyTechLV, # 仙盟X技能X级100
SuccType_100, # 100
SuccType_XXX101, # 废弃101
SuccType_XXX102, # 废弃102
SuccType_XXX103, # 废弃103
@@ -1724,7 +1721,6 @@
                              SuccType_Pray,SuccType_PetClassLV,
                              SuccType_QueenRelics,SuccType_XMZZConWin,
                              SuccType_Collect,SuccType_DogzBattle,
                              SuccType_UseItem,SuccType_FamilyTechLV,
                              SuccType_GetSpecialItem,SuccType_GetMagicWeapon,SuccType_XBXZ,
                              SuccType_FeastRedPack_KillSpecificNPC,SuccType_FeastRedPack_KillBoss,
                              SuccType_FeastRedPack_EnterMap, SuccType_FeastRedPack_FBSweep,
@@ -1840,18 +1836,6 @@
    EntFBAskRet_Other,          # xx 其他限制
    EntFBAskRet_Max,
) = range(18)
#增加仙盟活跃的活动类型
FamilyActiveIDList = (
FamilyActive_Task, #仙盟任务
FamilyActive_Party, #仙盟宴会
FamilyActive_BOSS, #仙盟BOSS
FamilyActive_War, #仙盟联赛
FamilyActive_HelpDujie, #同盟护法
FamilyActive_SWRH, #守卫人皇
) = range(1,6+1)
# BOSS 功能标识区分 对应KillBossCntLimit,主要根据击杀类型不同区分
(