From 614707fc640e731fe8b78351f0933371da5450bf Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 11 十月 2023 16:32:02 +0800
Subject: [PATCH] 9952 【BT0.1】【主干】仙盟修改(阵法)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenfa.py       |  213 +++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                        |   23 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py             |    9 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                     |   60 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                 |  119 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                      |    3 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                          |   60 +++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                      |  119 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                   |   48 ++
 PySysDB/PySysDBPY.h                                                                                    |   16 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyZhenfa.py                            |  140 +++++++
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                          |   15 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py            |   31 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                     |   15 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py                                   |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py |    6 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py                                  |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py                 |    6 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py                      |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                             |   12 
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/FamilyZhenfa.py                             |   60 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py       |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py          |   14 
 PySysDB/PySysDBG.h                                                                                     |    9 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                        |   38 +
 25 files changed, 1,021 insertions(+), 14 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index f129180..2a0c85f 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -49,6 +49,15 @@
 	list		AwardItemList;	//奖励物品列表[[物品ID,个数,是否拍品], ...]
 };
 
+//仙盟阵法表
+
+struct tagFamilyZhenfa
+{
+	BYTE		_ZhenfaType;	// 阵法类型
+	WORD		_ZhenfaLV;	// 阵法等级
+	DWORD		LVUpNeedExp;	//升下一级所需经验
+};
+
 //集市查询表
 
 struct tagMarketQuery
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index dfe9400..b7c5b6b 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -760,6 +760,11 @@
 	DWORD		CftJobAAtkReducePer;	//战士攻击伤害减免
 	DWORD		CftJobBAtkReducePer;	//法师攻击伤害减免
 	DWORD		CftJobCAtkReducePer;	//弓箭攻击伤害减免
+	DWORD		CftAffairSpeedPer;	//仙盟事务速度加成
+	DWORD		CftFamilyBossHurtPer;	//仙盟BOSS伤害加成
+	DWORD		CftFamilyWarHPPer;	//仙盟联赛生命加成
+	DWORD		CftFamilyWarAtkPer;	//仙盟联赛攻击加成
+	DWORD		CftFamilySitExpPer;	//仙盟打坐经验加成
 };
 
 //NPC掉落表
@@ -2605,6 +2610,17 @@
 	list		AwardItemList;	//奖励物品列表[[物品ID,个数,是否拍品], ...]
 };
 
+//仙盟阵法表
+
+struct tagFamilyZhenfa
+{
+	BYTE		_ZhenfaType;	// 阵法类型
+	WORD		_ZhenfaLV;	// 阵法等级
+	DWORD		LVUpNeedExp;	//升下一级所需经验
+	list		LVAttrType;	//累计总属性类型
+	list		LVAttrValue;	//累计总属性值
+};
+
 //装备洗练等级上限
 
 struct tagItemWashMax
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 0b592aa..5e60744 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -14221,6 +14221,66 @@
 
 
 #------------------------------------------------------
+# A6 14 家族阵法升级 #tagCMFamilyZhenfaLVUP
+
+class  tagCMFamilyZhenfaLVUP(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ZhenfaType", c_ubyte),    # 阵法类型
+                  ("ItemID", c_int),    # 消耗的物品ID
+                  ("ItemCount", c_ushort),    # 消耗个数,默认1
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA6
+        self.SubCmd = 0x14
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xA6
+        self.SubCmd = 0x14
+        self.ZhenfaType = 0
+        self.ItemID = 0
+        self.ItemCount = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMFamilyZhenfaLVUP)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A6 14 家族阵法升级 //tagCMFamilyZhenfaLVUP:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ZhenfaType:%d,
+                                ItemID:%d,
+                                ItemCount:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ZhenfaType,
+                                self.ItemID,
+                                self.ItemCount
+                                )
+        return DumpString
+
+
+m_NAtagCMFamilyZhenfaLVUP=tagCMFamilyZhenfaLVUP()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFamilyZhenfaLVUP.Cmd,m_NAtagCMFamilyZhenfaLVUP.SubCmd))] = m_NAtagCMFamilyZhenfaLVUP
+
+
+#------------------------------------------------------
 #A6 02  申请加入家族#tagCGRequesJoinFamily
 
 class  tagCGRequesJoinFamily(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index becbb41..2ee07d9 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -26601,6 +26601,125 @@
 
 
 #------------------------------------------------------
+# A5 09 仙盟阵法信息 #tagMCFamilyZhenfaInfo
+
+class  tagMCFamilyZhenfa(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ZhenfaType", c_ubyte),    # 阵法类型
+                  ("ZhenfaLV", c_ushort),    # 阵法等级
+                  ("ZhenfaExp", c_int),    # 阵法经验
+                  ]
+
+    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.ZhenfaType = 0
+        self.ZhenfaLV = 0
+        self.ZhenfaExp = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFamilyZhenfa)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 09 仙盟阵法信息 //tagMCFamilyZhenfaInfo:
+                                ZhenfaType:%d,
+                                ZhenfaLV:%d,
+                                ZhenfaExp:%d
+                                '''\
+                                %(
+                                self.ZhenfaType,
+                                self.ZhenfaLV,
+                                self.ZhenfaExp
+                                )
+        return DumpString
+
+
+class  tagMCFamilyZhenfaInfo(Structure):
+    Head = tagHead()
+    PlayerID = 0    #(DWORD PlayerID)// 当前培养阵法的玩家ID,如果有做自动捐献,需等收到的玩家ID为自己的时候才发送下一个捐献包
+    Count = 0    #(BYTE Count)
+    ZhenfaInfoList = list()    #(vector<tagMCFamilyZhenfa> ZhenfaInfoList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x09
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temZhenfaInfoList = tagMCFamilyZhenfa()
+            _pos = temZhenfaInfoList.ReadData(_lpData, _pos)
+            self.ZhenfaInfoList.append(temZhenfaInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x09
+        self.PlayerID = 0
+        self.Count = 0
+        self.ZhenfaInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.ZhenfaInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.ZhenfaInfoList[i].GetLength(), self.ZhenfaInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                PlayerID:%d,
+                                Count:%d,
+                                ZhenfaInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.PlayerID,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFamilyZhenfaInfo=tagMCFamilyZhenfaInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyZhenfaInfo.Head.Cmd,m_NAtagMCFamilyZhenfaInfo.Head.SubCmd))] = m_NAtagMCFamilyZhenfaInfo
+
+
+#------------------------------------------------------
 #A5 01  查看已申请加入的家族信息  #tagMCNotifyRequestJoinFamilyInfo
 
 class  tagRequestJoinFamily(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/FamilyZhenfa.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/FamilyZhenfa.py
new file mode 100644
index 0000000..ffab940
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/FamilyZhenfa.py
@@ -0,0 +1,60 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.FamilyZhenfa
+#
+# @todo:仙盟阵法
+# @author hxp
+# @date 2023-10-11
+# @version 1.0
+#
+# 详细描述: 仙盟阵法
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2023-10-11 16:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import ShareDefine
+import PlayerFamilyZhenfa
+import IpyGameDataPY
+
+## 执行逻辑
+#  @param curPlayer 当前玩家
+#  @param cmdList 参数列表
+#  @return None
+#  @remarks 函数详细说明.
+def OnExec(curPlayer, cmdList):
+    if not cmdList:
+        GameWorld.DebugAnswer(curPlayer, "重置阵法: FamilyZhenfa 0")
+        GameWorld.DebugAnswer(curPlayer, "设置阵法: FamilyZhenfa 类型 等级 经验 可选仙盟ID")
+        return
+    
+    playerID = curPlayer.GetPlayerID()
+    familyID = curPlayer.GetFamilyID()
+    if not familyID:
+        GameWorld.DebugAnswer(curPlayer, "没有仙盟")
+        return
+    
+    value1 = cmdList[0]
+    if len(cmdList) == 1 and value1 == 0:
+        GameWorld.GetFamilyActionManager().DelFamilyAction(familyID, ShareDefine.Def_ActionType_FamilyZhenfa)
+        PlayerFamilyZhenfa.SyncMap_AllFamilyZhenfaInfo()
+        return
+    
+    if len(cmdList) == 3:
+        zhenfaType = value1
+        zhenfaLV = cmdList[1] if len(cmdList) > 1 else 0
+        zhenfaExp = cmdList[2] if len(cmdList) > 2 else 0
+        ipyData = IpyGameDataPY.GetIpyGameData("FamilyZhenfa", zhenfaType, zhenfaLV)
+        if not ipyData:
+            GameWorld.DebugAnswer(curPlayer, "不存在该阵法类型: %s, LV:%s" % (zhenfaType, zhenfaLV))
+            return
+        actionData = PlayerFamilyZhenfa.GetFamilyZhenfaData(familyID, zhenfaType)
+        PlayerFamilyZhenfa.SetZhenfaLV(actionData, zhenfaLV)
+        PlayerFamilyZhenfa.SetZhenfaExp(actionData, zhenfaExp)
+        PlayerFamilyZhenfa.SyncMap_FamilyZhenfaInfo(familyID, "GM", {"playerID":playerID, "refreshAttr":True})
+        GameWorld.DebugAnswer(curPlayer, "设置阵法类型: %s, LV:%s, Exp:%s" % (zhenfaType, zhenfaLV, zhenfaExp))
+        
+    return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index 59dfaa4..d1fc6ae 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -97,6 +97,7 @@
 import PlayerFairyDomain
 import IpyGameDataPY
 import PlayerFamilyParty
+import PlayerFamilyZhenfa
 import GameWorldFamilyWar
 import GameWorldArena
 import CrossLuckyCloudBuy
@@ -1502,6 +1503,8 @@
     SendMapCommMapLinePlayerCount(True) # 同步一次普通地图线路人数信息
     #随机假仙盟
     PlayerFamily.RandomFakeFamily()
+    #仙盟阵法
+    PlayerFamilyZhenfa.OnMapServerInitOK()
     #缥缈仙域
     PlayerFairyDomain.OnMapServerInitOK()
     #情侣信息
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 24001a4..2d96800 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -68,6 +68,12 @@
                         ("list", "AwardItemList", 0),
                         ),
 
+                "FamilyZhenfa":(
+                        ("BYTE", "ZhenfaType", 1),
+                        ("WORD", "ZhenfaLV", 1),
+                        ("DWORD", "LVUpNeedExp", 0),
+                        ),
+
                 "MarketQuery":(
                         ("WORD", "QueryType", 1),
                         ("dict", "LimitInfo", 0),
@@ -991,6 +997,19 @@
     def GetRecordIndex(self): return self.RecordIndex # 奖励记录索引,同奖励类型时记录索引不可重复
     def GetNeedHurtTotal(self): return self.NeedHurtTotal # 所需总伤血
     def GetAwardItemList(self): return self.AwardItemList # 奖励物品列表[[物品ID,个数,是否拍品], ...]
+
+# 仙盟阵法表
+class IPY_FamilyZhenfa():
+    
+    def __init__(self):
+        self.ZhenfaType = 0
+        self.ZhenfaLV = 0
+        self.LVUpNeedExp = 0
+        return
+        
+    def GetZhenfaType(self): return self.ZhenfaType #  阵法类型
+    def GetZhenfaLV(self): return self.ZhenfaLV #  阵法等级
+    def GetLVUpNeedExp(self): return self.LVUpNeedExp # 升下一级所需经验
 
 # 集市查询表
 class IPY_MarketQuery():
@@ -2795,6 +2814,8 @@
         self.ipyFamilyLen = len(self.ipyFamilyCache)
         self.ipyFamilyBossHurtAwardCache = self.__LoadFileData("FamilyBossHurtAward", IPY_FamilyBossHurtAward)
         self.ipyFamilyBossHurtAwardLen = len(self.ipyFamilyBossHurtAwardCache)
+        self.ipyFamilyZhenfaCache = self.__LoadFileData("FamilyZhenfa", IPY_FamilyZhenfa)
+        self.ipyFamilyZhenfaLen = len(self.ipyFamilyZhenfaCache)
         self.ipyMarketQueryCache = self.__LoadFileData("MarketQuery", IPY_MarketQuery)
         self.ipyMarketQueryLen = len(self.ipyMarketQueryCache)
         self.ipyAuctionItemCache = self.__LoadFileData("AuctionItem", IPY_AuctionItem)
@@ -3129,6 +3150,8 @@
     def GetFamilyByIndex(self, index): return self.ipyFamilyCache[index]
     def GetFamilyBossHurtAwardCount(self): return self.ipyFamilyBossHurtAwardLen
     def GetFamilyBossHurtAwardByIndex(self, index): return self.ipyFamilyBossHurtAwardCache[index]
+    def GetFamilyZhenfaCount(self): return self.ipyFamilyZhenfaLen
+    def GetFamilyZhenfaByIndex(self, index): return self.ipyFamilyZhenfaCache[index]
     def GetMarketQueryCount(self): return self.ipyMarketQueryLen
     def GetMarketQueryByIndex(self, index): return self.ipyMarketQueryCache[index]
     def GetAuctionItemCount(self): return self.ipyAuctionItemLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
index be10c3e..202a55f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
@@ -1613,6 +1613,7 @@
 #  @param leavePlayerID 离开的玩家ID
 #  @return None
 def __DoPlayerLeaveFamilyByID(curFamily, leavePlayerID, tagPlayer=None):
+    PlayerCompensation.SendMailByKey("LeaveFamilyNotice", [leavePlayerID], [])
     PlayerFamilyAction.DelFamilyOfficerModelEquip(curFamily.GetID(), leavePlayerID)
     # 玩家战盟名变更处理
     __OnFamilyNameChange(leavePlayerID, '')
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyZhenfa.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyZhenfa.py
new file mode 100644
index 0000000..45adc2d
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyZhenfa.py
@@ -0,0 +1,140 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package PlayerFamilyZhenfa
+#
+# @todo:仙盟阵法
+# @author hxp
+# @date 2023-10-11
+# @version 1.0
+#
+# 详细描述: 仙盟阵法
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2023-10-11 16:30"""
+#-------------------------------------------------------------------------------
+
+import ShareDefine
+import IpyGameDataPY
+import GameWorld
+
+ActionType_FamilyZhenfa = ShareDefine.Def_ActionType_FamilyZhenfa
+
+def GetZhenfaType(actionData): return actionData.GetValue1()
+def SetZhenfaType(actionData, zhenfaType): actionData.SetValue1(zhenfaType)
+def GetZhenfaLV(actionData): return actionData.GetValue2()
+def SetZhenfaLV(actionData, lv): actionData.SetValue2(lv)
+def GetZhenfaExp(actionData): return actionData.GetValue3()
+def SetZhenfaExp(actionData, exp): actionData.SetValue3(exp)
+
+## 玩家登录
+#  @param None
+#  @return None
+def OnPlayerLogin(curPlayer):
+    return
+
+def GetFamilyZhenfaData(familyID, zhenfaType):
+    ## 获取仙盟阵法数据
+    findActionData = None
+    zhenfaAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, ActionType_FamilyZhenfa)
+    for index in range(zhenfaAction.Count()):
+        actionData = zhenfaAction.At(index)
+        if zhenfaType == GetZhenfaType(actionData):
+            findActionData = actionData
+            break
+    if not findActionData:
+        findActionData = zhenfaAction.AddAction()
+        findActionData.SetFamilyId(familyID)
+        findActionData.SetActionType(ActionType_FamilyZhenfa)
+        SetZhenfaType(findActionData, zhenfaType)
+    return findActionData
+
+def MapServer_FamilyZhenfa(curPlayer, msgList):
+    familyID, playerID, msgType, msgData = msgList
+    
+    # 加经验
+    if msgType == "AddExp":
+        __DoFamilyZhenfa_AddExp(familyID, playerID, msgType, msgData)
+        
+    return
+
+def __DoFamilyZhenfa_AddExp(familyID, playerID, msgType, msgData):
+    zhenfaType, addTotalExp = msgData
+    
+    actionData = GetFamilyZhenfaData(familyID, zhenfaType)
+    zhenfaLV = GetZhenfaLV(actionData)
+    zhenfaExp = GetZhenfaExp(actionData)
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("FamilyZhenfa", zhenfaType, zhenfaLV)
+    if not ipyData:
+        return
+    LVUpNeedExp = ipyData.GetLVUpNeedExp()
+    if not LVUpNeedExp:
+        GameWorld.DebugLog("该阵法已满级:familyID=%s,zhenfaType=%s,zhenfaLV=%s" % (familyID, zhenfaType, zhenfaLV), playerID)
+        return
+    
+    curExp = zhenfaExp + addTotalExp
+    GameWorld.DebugLog("执行阵法升级: familyID=%s,zhenfaType=%s,zhenfaLV=%s,zhenfaExp=%s,addTotalExp=%s,curExp=%s" 
+                       % (familyID, zhenfaType, zhenfaLV, zhenfaExp, addTotalExp, curExp), playerID)
+    
+    isLVUP = False
+    # 安全为主不用while
+    for _ in xrange(100):
+        if not LVUpNeedExp or curExp < LVUpNeedExp:
+            break
+        ipyData = IpyGameDataPY.GetIpyGameData("FamilyZhenfa", zhenfaType, zhenfaLV + 1)
+        if not ipyData:
+            break
+        
+        curExp = curExp - LVUpNeedExp
+        zhenfaLV += 1
+        isLVUP = True
+        GameWorld.DebugLog("    阵法升级: LVUpNeedExp=%s,zhenfaLV=%s,curExp=%s" % (LVUpNeedExp, zhenfaLV, curExp), playerID)
+        
+        LVUpNeedExp = ipyData.GetLVUpNeedExp()
+        
+    SetZhenfaLV(actionData, zhenfaLV)
+    SetZhenfaExp(actionData, curExp)
+    GameWorld.DebugLog("    更新阵法: familyID=%s,zhenfaType=%s,zhenfaLV=%s,curExp=%s" % (familyID, zhenfaType, zhenfaLV, curExp), playerID)
+    
+    # 同步地图
+    SyncMap_FamilyZhenfaInfo(familyID, msgType, {"playerID":playerID, "refreshAttr":isLVUP})
+    return
+
+def GetSyncMapFamilyZhenfaInfo(familyID):
+    info = {}
+    zhenfaAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, ActionType_FamilyZhenfa)
+    for index in range(zhenfaAction.Count()):
+        actionData = zhenfaAction.At(index)
+        zhenfaType = GetZhenfaType(actionData)
+        info[zhenfaType] = {"LV":GetZhenfaLV(actionData), "Exp":GetZhenfaExp(actionData)}
+    return info
+
+def SyncMap_FamilyZhenfaInfo(familyID, msgType, dataEx={}):
+    ## 同步单个仙盟所有阵法信息到地图
+    zhenfaInfo = {familyID:GetSyncMapFamilyZhenfaInfo(familyID)}
+    syncDict = {"zhenfaInfo":zhenfaInfo, "msgType":msgType, "familyID":familyID}
+    syncDict.update(dataEx)
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_FamilyZhenfaInfo, syncDict)
+    return
+
+def SyncMap_AllFamilyZhenfaInfo():
+    ## 同步所有仙盟阵法信息到地图
+    zhenfaInfo = {}
+    familyManager = GameWorld.GetFamilyManager()
+    for i in range(familyManager.GetCount()):
+        family = familyManager.GetAt(i)
+        familyID = family.GetID()
+        if not familyID:
+            continue
+        info = GetSyncMapFamilyZhenfaInfo(familyID)
+        if info:
+            zhenfaInfo[familyID] = info
+    syncDict = {"zhenfaInfo":zhenfaInfo, "msgType":"allFamily"}
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_FamilyZhenfaInfo, syncDict)
+    return
+
+def OnMapServerInitOK():
+    SyncMap_AllFamilyZhenfaInfo()
+    return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index f402a26..fdc8c07 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -51,6 +51,7 @@
 import GameWorldBoss
 import GameWorldFamilyWar
 #import PlayerFamilyTech
+import PlayerFamilyZhenfa
 import PlayerFamilyRedPacket
 import PlayerFBHelpBattle
 import PlayerHorsePetBoss
@@ -903,6 +904,15 @@
     if callName =="AllFamilyBossOver":
         PlayerFamilyBoss.AllFamilyBossKilled()
         return
+    #仙盟阵法
+    if callName =="FamilyZhenfa":
+        curPlayer = None
+        if srcPlayerID:
+            curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
+            if not curPlayer:
+                return
+        PlayerFamilyZhenfa.MapServer_FamilyZhenfa(curPlayer, eval(resultName))
+        return
     #骑宠BOSS结束
     if callName =="HorsePetBossOver":
         PlayerHorsePetBoss.HorsePetBossKilled(int(resultName))
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 15c7437..7c7059c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -168,6 +168,7 @@
 
 Def_Notify_WorldKey_FamilyPartyInfo = "FamilyPartyInfo"  # 仙盟宴会数据
 Def_Notify_WorldKey_FamilyPartyAddFamilyActivity = "FamilyPartyAddFamilyActivity"  # 仙盟宴会地图成员增加仙盟活跃令
+Def_Notify_WorldKey_FamilyZhenfaInfo = "FamilyZhenfaInfo"  # 仙盟阵法数据
 
 Def_Notify_WorldKey_AddFamilyAuctionItem = "AddFamilyAuctionItem"  # 添加仙盟拍品
 Def_Notify_WorldKey_AddSystemAuctionItem = "AddSystemAuctionItem"  # 添加系统拍品
@@ -684,6 +685,12 @@
 Def_Effect_PeerlessWeaponTrainAttrPer = 158 # 灭世培养属性加成(攻防血)
 Def_Effect_PeerlessWeapon2TrainAttrPer = 159 # 弑神培养属性加成(攻防血)
 Def_Effect_LianTiAttrPer = 160 # 炼体属性百分比(攻防血)
+
+Def_Effect_AffairSpeedPer = 161 # 仙盟事务速度加成
+Def_Effect_FamilyBossHurtPer = 162 # 仙盟BOSS伤害加成
+Def_Effect_FamilyWarHPPer = 163 # 仙盟联赛生命加成
+Def_Effect_FamilyWarAtkPer = 164 # 仙盟联赛攻击加成
+Def_Effect_FamilySitExpPer = 165 # 仙盟打坐经验加成
 
 #增加%d物理伤害值,其中a值为伤害值
 Def_Effect_AddAtk = 1005
@@ -1332,7 +1339,7 @@
                       Def_ActionType_LeaderImpeachTime,  # 族长下线了多久5
                       Def_ActionType_FamilyBossFB,    #记录家族boss副本信息6
                       Def_ActionType_FamilyStore,    #记录战盟仓库操作记录7
-                      Def_ActionType_XXX8,    #8
+                      Def_ActionType_FamilyZhenfa,    #仙盟阵法8
                       Def_ActionType_XXX9,    #9
                       Def_ActionType_XXX10,    #10
                       Def_ActionType_OfficerModelEquip,    #记录家族有职位的成员模型装备信息11
@@ -1617,7 +1624,7 @@
 )=range(5)
 
 # 战斗力模块类型
-Def_MFPType_Max = 32
+Def_MFPType_Max = 33
 ModuleFightPowerTypeList = (
 Def_MFPType_Role, # 角色 0
 Def_MFPType_Equip, # 装备(装备本身) 1
@@ -1650,6 +1657,7 @@
 Def_MFPType_Enchant, # 附魔 28
 Def_MFPType_Gubao, # 古宝 29
 Def_MFPType_Shentong, # 神通 30
+Def_MFPType_FamilyZhenfa, # 阵法 31
 Def_MFPType_Other, # 其他
 ) = range(Def_MFPType_Max)
 
@@ -1944,7 +1952,8 @@
 SuccType_EquipStarTotal, # 全身升星总星数X星 174
 SuccType_EquipWashTotal, # 全身洗炼总等级X级 175
 SuccType_CrossPK, # 跨服PK x次  176
-) = range(1, 177)
+SuccType_FamilyZhenfaExp, # 仙盟阵法捐献累计经验 177
+) = range(1, 178)
 
 # 节日红包成就类型
 FeastRedPackSuccessTypeList = range(SuccType_FeastRedPack_TalkWorld, SuccType_FeastRedPack_FBSweep + 1)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 585f309..14dec80 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -247,6 +247,18 @@
 PacketSubCMD_1=0x07
 PacketCallFunc_1=OnPlayerFamilyTechLVUP
 
+;家族阵法
+[PlayerFamilyZhenfa]
+ScriptName = Player\PlayerFamilyZhenfa.py
+Writer = hxp
+Releaser = hxp
+RegType = 0
+RegisterPackCount = 1
+
+PacketCMD_1=0xA6
+PacketSubCMD_1=0x14
+PacketCallFunc_1=OnFamilyZhenfaLVUP
+
 ;宠物
 [PlayerPet]
 ScriptName = Player\PlayerPet.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index fb00ad9..9fe28e8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -2323,7 +2323,11 @@
             if findBuff:
                 reduceFinalHurtPer = findBuff.GetSkill().GetEffect(0).GetEffectValue(0)
                 aFinalHurtPer -= reduceFinalHurtPer
-                
+    
+    # 仙盟boss最终伤害加成
+    if atkObjType == IPY_GameWorld.gotPlayer and mapID == ChConfig.Def_FBMapID_FamilyBossMap:
+        aFinalHurtPer += PlayerControl.GetFamilyBossHurtPer(atkObj)
+        
     atkStateMark = GetObjAtkStateMark(atkObj)
     defStateMark = GetObjAtkStateMark(defObj)
     hurtFormulaKey = "%sV%s_%s" % (atkStateMark, defStateMark, atkType)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 91a6e06..5a2d2bc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -74,7 +74,7 @@
 Def_BuffValue_Count = 3     # buff记录的value个数
 
 #游戏对象属性--------------------------------------------
-Def_Calc_AllAttrType_MAX = 160
+Def_Calc_AllAttrType_MAX = 166
 #基本属性BUFF计算,顺序与 ObjProperty_AttrByIndex 对应,同时也为buff效果ID同步通知策划
 TYPE_Calc_AttrList = (
 TYPE_Calc_Metal,                        # 金 1
@@ -247,7 +247,13 @@
 TYPE_Calc_WingTrainAttrPer,              # 翅膀培养属性加成(攻防血)
 TYPE_Calc_PeerlessWeaponTrainAttrPer,    # 灭世培养属性加成(攻防血)
 TYPE_Calc_PeerlessWeapon2TrainAttrPer,   # 弑神培养属性加成(攻防血)
-TYPE_Calc_LianTiAttrPer,                 # 坐骑培养属性加成(攻防血) 159
+TYPE_Calc_LianTiAttrPer,                 # 炼体属性百分比(攻防血) 159
+TYPE_Calc_160,                           # 160
+TYPE_Calc_AffairSpeedPer,                # 仙盟事务速度加成
+TYPE_Calc_FamilyBossHurtPer,             # 仙盟BOSS伤害加成
+TYPE_Calc_FamilyWarHPPer,                # 仙盟联赛生命加成
+TYPE_Calc_FamilyWarAtkPer,               # 仙盟联赛攻击加成
+TYPE_Calc_FamilySitExpPer,               # 仙盟打坐经验加成 165
 ) = range(1, Def_Calc_AllAttrType_MAX)
 
 ## 支持大数值属性,超过20E
@@ -2286,6 +2292,7 @@
                          1000 * 10,                        # 幸运云购
                          1000 * 10,                        # 跨服排位
                          1000 * 10,                        # 跨服妖魔boss
+                         1000 * 10,                        # 仙盟阵法
                          ]
 TYPE_Player_Tick_Count = len(TYPE_Player_Tick_Time) 
 
@@ -2366,6 +2373,7 @@
 TYPE_Player_Tick_LuckyCloudBuy,        #幸运云购
 TYPE_Player_Tick_Championship,        #跨服排位
 TYPE_Player_Tick_CrossYaomoBoss,        #跨服妖魔boss
+TYPE_Player_Tick_FamilyZhenfa,        #仙盟阵法
 ) = range(0, TYPE_Player_Tick_Count)
 
 #---------------------------------------------------------------------
@@ -3338,6 +3346,11 @@
 Def_PlayerKey_PeerlessWeaponTrainAttrPer = "PeerlessWeaponTrainAttrPer"   # 灭世培养属性加成
 Def_PlayerKey_PeerlessWeapon2TrainAttrPer = "PeerlessWeapon2TrainAttrPer"   # 弑神培养属性加成
 Def_PlayerKey_LianTiAttrPer = "LianTiAttrPer"   # 炼体属性属性加成
+Def_PlayerKey_AffairSpeedPer = "AffairSpeedPer"   # 仙盟事务速度加成
+Def_PlayerKey_FamilyBossHurtPer = "FamilyBossHurtPer"   # 仙盟BOSS伤害加成
+Def_PlayerKey_FamilyWarHPPer = "FamilyWarHPPer"   # 仙盟联赛生命加成
+Def_PlayerKey_FamilyWarAtkPer = "FamilyWarAtkPer"   # 仙盟联赛攻击加成
+Def_PlayerKey_FamilySitExpPer = "FamilySitExpPer"   # 仙盟打坐经验加成
 Def_PlayerKey_StoneBasePer = "StoneBasePer"   # 宝石基础属性百分比
 Def_PlayerKey_RealmBasePer = "RealmBasePer"   # 境界基础属性百分比
 Def_PlayerKey_WingHPPer = "WingHPPer"   # 翅膀生命百分比
@@ -4612,6 +4625,11 @@
     ShareDefine.Def_Effect_SkillReducePer5:[[TYPE_Calc_SkillReducePer5], False, TYPE_Linear],   # 受到技能伤害减少5
     ShareDefine.Def_Effect_SkillReducePer6:[[TYPE_Calc_SkillReducePer6], False, TYPE_Linear],   # 受到技能伤害减少6
     ShareDefine.Def_Effect_SkillReducePer7:[[TYPE_Calc_SkillReducePer7], False, TYPE_Linear],   # 受到技能伤害减少7
+    ShareDefine.Def_Effect_AffairSpeedPer:[[TYPE_Calc_AffairSpeedPer], False, TYPE_Linear],
+    ShareDefine.Def_Effect_FamilyBossHurtPer:[[TYPE_Calc_FamilyBossHurtPer], False, TYPE_Linear],
+    ShareDefine.Def_Effect_FamilyWarHPPer:[[TYPE_Calc_FamilyWarHPPer], False, TYPE_Linear],
+    ShareDefine.Def_Effect_FamilyWarAtkPer:[[TYPE_Calc_FamilyWarAtkPer], False, TYPE_Linear],
+    ShareDefine.Def_Effect_FamilySitExpPer:[[TYPE_Calc_FamilySitExpPer], False, TYPE_Linear],
     
     #战斗非线性
     ShareDefine.Def_Effect_SuperHitPer:[[TYPE_Calc_SuperHit], False, TYPE_NoLinear],
@@ -4725,6 +4743,14 @@
    ShareDefine.Def_Effect_JadeAddPer:           [ShareDefine.retJade, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk, ShareDefine.Def_Effect_MaxHP]],
                            }
 
+# 指定地图生效的非线性属性配置
+MapAttrInfoDict_Noline = {
+                          Def_FBMapID_FamilyWar:{
+                                                 TYPE_Calc_FamilyWarAtkPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
+                                                 TYPE_Calc_FamilyWarHPPer:[TYPE_Calc_AttrMaxHP],
+                                                 }
+                          }
+
 #属性线性索引
 CalcAttrIndexList = (
 CalcAttr_Base,
@@ -4803,7 +4829,8 @@
 Def_CalcAttrFunc_HorseStar, # 坐骑星级 57
 Def_CalcAttrFunc_PetStar, # 灵宠星级 58
 Def_CalcAttrFunc_TitleStar, # 称号星级 59
-) = range(60)
+Def_CalcAttrFunc_FamilyZhenfa, # 仙盟阵法 60
+) = range(61)
 
 # 技能功能点列表  - 默认不算战力,不享受百分比加成,技能功能点暂时配置,之后优化技能属性逻辑后可去掉
 CalcAttrFuncSkillList = [Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_DogzBattleSkill]
@@ -4844,6 +4871,7 @@
                             ShareDefine.Def_MFPType_GatherSoul:[Def_CalcAttrFunc_GatherSoul],
                             ShareDefine.Def_MFPType_Coat:[Def_CalcAttrFunc_Coat],
                             ShareDefine.Def_MFPType_Dogz:[Def_CalcAttrFunc_Dogz, Def_CalcAttrFunc_DogzEquip, Def_CalcAttrFunc_DogzEquipPlus, Def_CalcAttrFunc_DogzBattleSkill],
+                            ShareDefine.Def_MFPType_FamilyZhenfa:[Def_CalcAttrFunc_FamilyZhenfa],
                             ShareDefine.Def_MFPType_Other:[Def_CalcAttrFunc_Success, Def_CalcAttrFunc_FamilyTech, Def_CalcAttrFunc_EquipDecompose],
                             }
 
@@ -4854,7 +4882,7 @@
                ShareDefine.Def_MFPType_MagicWeapon1:"人族", ShareDefine.Def_MFPType_MagicWeapon2:"魔族", ShareDefine.Def_MFPType_MagicWeapon3:"仙族", ShareDefine.Def_MFPType_MagicWeapon4:"王者",
                ShareDefine.Def_MFPType_PetSoul:"宠魂", ShareDefine.Def_MFPType_HorseSoul:"骑魂", ShareDefine.Def_MFPType_FaQi:"法器", ShareDefine.Def_MFPType_Dogz:"神兽",
                ShareDefine.Def_MFPType_Coat:"时装", ShareDefine.Def_MFPType_Love:"情缘", ShareDefine.Def_MFPType_Charm:"魅力", ShareDefine.Def_MFPType_LianTi:"炼体",
-               ShareDefine.Def_MFPType_Enchant:"附魔", ShareDefine.Def_MFPType_Gubao:"古宝", ShareDefine.Def_MFPType_Shentong:"神通", 
+               ShareDefine.Def_MFPType_Enchant:"附魔", ShareDefine.Def_MFPType_Gubao:"古宝", ShareDefine.Def_MFPType_Shentong:"神通", ShareDefine.Def_MFPType_FamilyZhenfa:"阵法", 
                ShareDefine.Def_MFPType_Other:"其他",
                }
 
@@ -4873,7 +4901,7 @@
                  Def_CalcAttrFunc_WingTarin:"翅膀培养", Def_CalcAttrFunc_PeerlessWeaponTrain:"灭世培养", Def_CalcAttrFunc_PeerlessWeapon2Train:"噬魂培养", Def_CalcAttrFunc_FaQi:"法器",
                  Def_CalcAttrFunc_LoveRing:"情戒基础", Def_CalcAttrFunc_LoveRingCouple:"情戒仙侣", Def_CalcAttrFunc_Charm:"魅力", Def_CalcAttrFunc_LianTi:"炼体",
                  Def_CalcAttrFunc_Enchant:"附魔", Def_CalcAttrFunc_LingQiEnchant:"灵器附魔", Def_CalcAttrFunc_Gubao:"古宝", Def_CalcAttrFunc_Shentong:"神通",
-                 Def_CalcAttrFunc_HorseStar:"坐骑星级", Def_CalcAttrFunc_PetStar:"宠物星级", Def_CalcAttrFunc_TitleStar:"称号星级",
+                 Def_CalcAttrFunc_HorseStar:"坐骑星级", Def_CalcAttrFunc_PetStar:"宠物星级", Def_CalcAttrFunc_TitleStar:"称号星级", Def_CalcAttrFunc_FamilyZhenfa:"阵法",
                  }
 #-------------------------------------------------------------------------------
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 0b592aa..5e60744 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -14221,6 +14221,66 @@
 
 
 #------------------------------------------------------
+# A6 14 家族阵法升级 #tagCMFamilyZhenfaLVUP
+
+class  tagCMFamilyZhenfaLVUP(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ZhenfaType", c_ubyte),    # 阵法类型
+                  ("ItemID", c_int),    # 消耗的物品ID
+                  ("ItemCount", c_ushort),    # 消耗个数,默认1
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA6
+        self.SubCmd = 0x14
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xA6
+        self.SubCmd = 0x14
+        self.ZhenfaType = 0
+        self.ItemID = 0
+        self.ItemCount = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMFamilyZhenfaLVUP)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A6 14 家族阵法升级 //tagCMFamilyZhenfaLVUP:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ZhenfaType:%d,
+                                ItemID:%d,
+                                ItemCount:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ZhenfaType,
+                                self.ItemID,
+                                self.ItemCount
+                                )
+        return DumpString
+
+
+m_NAtagCMFamilyZhenfaLVUP=tagCMFamilyZhenfaLVUP()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFamilyZhenfaLVUP.Cmd,m_NAtagCMFamilyZhenfaLVUP.SubCmd))] = m_NAtagCMFamilyZhenfaLVUP
+
+
+#------------------------------------------------------
 #A6 02  申请加入家族#tagCGRequesJoinFamily
 
 class  tagCGRequesJoinFamily(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index becbb41..2ee07d9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -26601,6 +26601,125 @@
 
 
 #------------------------------------------------------
+# A5 09 仙盟阵法信息 #tagMCFamilyZhenfaInfo
+
+class  tagMCFamilyZhenfa(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ZhenfaType", c_ubyte),    # 阵法类型
+                  ("ZhenfaLV", c_ushort),    # 阵法等级
+                  ("ZhenfaExp", c_int),    # 阵法经验
+                  ]
+
+    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.ZhenfaType = 0
+        self.ZhenfaLV = 0
+        self.ZhenfaExp = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFamilyZhenfa)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 09 仙盟阵法信息 //tagMCFamilyZhenfaInfo:
+                                ZhenfaType:%d,
+                                ZhenfaLV:%d,
+                                ZhenfaExp:%d
+                                '''\
+                                %(
+                                self.ZhenfaType,
+                                self.ZhenfaLV,
+                                self.ZhenfaExp
+                                )
+        return DumpString
+
+
+class  tagMCFamilyZhenfaInfo(Structure):
+    Head = tagHead()
+    PlayerID = 0    #(DWORD PlayerID)// 当前培养阵法的玩家ID,如果有做自动捐献,需等收到的玩家ID为自己的时候才发送下一个捐献包
+    Count = 0    #(BYTE Count)
+    ZhenfaInfoList = list()    #(vector<tagMCFamilyZhenfa> ZhenfaInfoList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x09
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temZhenfaInfoList = tagMCFamilyZhenfa()
+            _pos = temZhenfaInfoList.ReadData(_lpData, _pos)
+            self.ZhenfaInfoList.append(temZhenfaInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x09
+        self.PlayerID = 0
+        self.Count = 0
+        self.ZhenfaInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.ZhenfaInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.ZhenfaInfoList[i].GetLength(), self.ZhenfaInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                PlayerID:%d,
+                                Count:%d,
+                                ZhenfaInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.PlayerID,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFamilyZhenfaInfo=tagMCFamilyZhenfaInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyZhenfaInfo.Head.Cmd,m_NAtagMCFamilyZhenfaInfo.Head.SubCmd))] = m_NAtagMCFamilyZhenfaInfo
+
+
+#------------------------------------------------------
 #A5 01  查看已申请加入的家族信息  #tagMCNotifyRequestJoinFamilyInfo
 
 class  tagRequestJoinFamily(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 9c78e57..e4ff915 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -618,6 +618,11 @@
                         ("DWORD", "CftJobAAtkReducePer", 0),
                         ("DWORD", "CftJobBAtkReducePer", 0),
                         ("DWORD", "CftJobCAtkReducePer", 0),
+                        ("DWORD", "CftAffairSpeedPer", 0),
+                        ("DWORD", "CftFamilyBossHurtPer", 0),
+                        ("DWORD", "CftFamilyWarHPPer", 0),
+                        ("DWORD", "CftFamilyWarAtkPer", 0),
+                        ("DWORD", "CftFamilySitExpPer", 0),
                         ),
 
                 "NPCDropItem":(
@@ -2019,6 +2024,14 @@
                         ("list", "AwardItemList", 0),
                         ),
 
+                "FamilyZhenfa":(
+                        ("BYTE", "ZhenfaType", 1),
+                        ("WORD", "ZhenfaLV", 1),
+                        ("DWORD", "LVUpNeedExp", 0),
+                        ("list", "LVAttrType", 0),
+                        ("list", "LVAttrValue", 0),
+                        ),
+
                 "ItemWashMax":(
                         ("BYTE", "Type", 1),
                         ("BYTE", "Star", 1),
@@ -3364,7 +3377,12 @@
         self.CftJobCHurtAddPer = 0
         self.CftJobAAtkReducePer = 0
         self.CftJobBAtkReducePer = 0
-        self.CftJobCAtkReducePer = 0
+        self.CftJobCAtkReducePer = 0
+        self.CftAffairSpeedPer = 0
+        self.CftFamilyBossHurtPer = 0
+        self.CftFamilyWarHPPer = 0
+        self.CftFamilyWarAtkPer = 0
+        self.CftFamilySitExpPer = 0
         return
         
     def GetLV(self): return self.LV # 等级
@@ -3395,7 +3413,12 @@
     def GetCftJobCHurtAddPer(self): return self.CftJobCHurtAddPer # 对目标弓箭伤害加成
     def GetCftJobAAtkReducePer(self): return self.CftJobAAtkReducePer # 战士攻击伤害减免
     def GetCftJobBAtkReducePer(self): return self.CftJobBAtkReducePer # 法师攻击伤害减免
-    def GetCftJobCAtkReducePer(self): return self.CftJobCAtkReducePer # 弓箭攻击伤害减免
+    def GetCftJobCAtkReducePer(self): return self.CftJobCAtkReducePer # 弓箭攻击伤害减免
+    def GetCftAffairSpeedPer(self): return self.CftAffairSpeedPer # 仙盟事务速度加成
+    def GetCftFamilyBossHurtPer(self): return self.CftFamilyBossHurtPer # 仙盟BOSS伤害加成
+    def GetCftFamilyWarHPPer(self): return self.CftFamilyWarHPPer # 仙盟联赛生命加成
+    def GetCftFamilyWarAtkPer(self): return self.CftFamilyWarAtkPer # 仙盟联赛攻击加成
+    def GetCftFamilySitExpPer(self): return self.CftFamilySitExpPer # 仙盟打坐经验加成
 
 # NPC掉落表
 class IPY_NPCDropItem():
@@ -6341,6 +6364,23 @@
     def GetNeedHurtTotal(self): return self.NeedHurtTotal # 所需总伤血
     def GetAwardItemList(self): return self.AwardItemList # 奖励物品列表[[物品ID,个数,是否拍品], ...]
 
+# 仙盟阵法表
+class IPY_FamilyZhenfa():
+    
+    def __init__(self):
+        self.ZhenfaType = 0
+        self.ZhenfaLV = 0
+        self.LVUpNeedExp = 0
+        self.LVAttrType = []
+        self.LVAttrValue = []
+        return
+        
+    def GetZhenfaType(self): return self.ZhenfaType #  阵法类型
+    def GetZhenfaLV(self): return self.ZhenfaLV #  阵法等级
+    def GetLVUpNeedExp(self): return self.LVUpNeedExp # 升下一级所需经验
+    def GetLVAttrType(self): return self.LVAttrType # 累计总属性类型
+    def GetLVAttrValue(self): return self.LVAttrValue # 累计总属性值
+
 # 装备洗练等级上限
 class IPY_ItemWashMax():
     
@@ -7076,6 +7116,8 @@
         self.ipyFamilyBossAwardLen = len(self.ipyFamilyBossAwardCache)
         self.ipyFamilyBossHurtAwardCache = self.__LoadFileData("FamilyBossHurtAward", IPY_FamilyBossHurtAward)
         self.ipyFamilyBossHurtAwardLen = len(self.ipyFamilyBossHurtAwardCache)
+        self.ipyFamilyZhenfaCache = self.__LoadFileData("FamilyZhenfa", IPY_FamilyZhenfa)
+        self.ipyFamilyZhenfaLen = len(self.ipyFamilyZhenfaCache)
         self.ipyItemWashMaxCache = self.__LoadFileData("ItemWashMax", IPY_ItemWashMax)
         self.ipyItemWashMaxLen = len(self.ipyItemWashMaxCache)
         self.ipyHorsePetBossAwardCache = self.__LoadFileData("HorsePetBossAward", IPY_HorsePetBossAward)
@@ -7684,6 +7726,8 @@
     def GetFamilyBossAwardByIndex(self, index): return self.ipyFamilyBossAwardCache[index]
     def GetFamilyBossHurtAwardCount(self): return self.ipyFamilyBossHurtAwardLen
     def GetFamilyBossHurtAwardByIndex(self, index): return self.ipyFamilyBossHurtAwardCache[index]
+    def GetFamilyZhenfaCount(self): return self.ipyFamilyZhenfaLen
+    def GetFamilyZhenfaByIndex(self, index): return self.ipyFamilyZhenfaCache[index]
     def GetItemWashMaxCount(self): return self.ipyItemWashMaxLen
     def GetItemWashMaxByIndex(self, index): return self.ipyItemWashMaxCache[index]
     def GetHorsePetBossAwardCount(self): return self.ipyHorsePetBossAwardLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 3f8a707..b6f8e28 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -79,6 +79,7 @@
 import PlayerVip
 import PlayerRefineStove
 import PlayerFamilyTech
+import PlayerFamilyZhenfa
 import PlayerCostRebate
 import PlayerActGarbageSorting
 import GY_Query_CrossRealmReg
@@ -3881,6 +3882,11 @@
         JobAAtkReducePer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_JobAAtkReducePer) * fpParam.GetCftJobAAtkReducePer() # 战士攻击伤害减免
         JobBAtkReducePer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_JobBAtkReducePer) * fpParam.GetCftJobBAtkReducePer() # 法师攻击伤害减免
         JobCAtkReducePer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_JobCAtkReducePer) * fpParam.GetCftJobCAtkReducePer() # 弓箭攻击伤害减免
+        AffairSpeedPer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_AffairSpeedPer) * fpParam.GetCftAffairSpeedPer() # 仙盟事务速度加成
+        FamilyBossHurtPer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_FamilyBossHurtPer) * fpParam.GetCftFamilyBossHurtPer() # 仙盟BOSS伤害加成
+        FamilyWarHPPer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_FamilyWarHPPer) * fpParam.GetCftFamilyWarHPPer() # 仙盟联赛生命加成
+        FamilyWarAtkPer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_FamilyWarAtkPer) * fpParam.GetCftFamilyWarAtkPer() # 仙盟联赛攻击加成
+        FamilySitExpPer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_FamilySitExpPer) * fpParam.GetCftFamilySitExpPer() # 仙盟打坐经验加成
         
         NormalHurt = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_NormalHurt) 
         NormalHurtPer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_NormalHurtPer) * fpParam.GetCftNormalHurtPer() # 普通附加伤害加成
@@ -4572,6 +4578,7 @@
         PlayerCharm.CalcCharmAttr(curPlayer)
         PlayerLianTi.CalcLianTiAttr(curPlayer)
         PlayerShentong.CalcShentongAttr(curPlayer)
+        PlayerFamilyZhenfa.CalcZhenfaAttr(curPlayer)
         self.RefreshAllState(isForce=True)
         GameWorld.DebugLog("End ReCalcAllState!!!")
         return
@@ -5002,6 +5009,7 @@
             
         #        层非线性战斗属性累加
         battleNolineAttrBuff = allAttrListBuffs[ChConfig.CalcAttr_BattleNoline]
+        CalcNoLineEffect.AddPlayerMapAttrNolineEffect(curPlayer, battleNolineAttrBuff)
         CalcNoLineEffect.ChangePlayerAttrInNoLineEffectList(curPlayer, battleNolineAttrBuff, isBuffAttr=True)
         
         battleAttrBuff = allAttrListBuffs[ChConfig.CalcAttr_Battle]
@@ -7076,6 +7084,29 @@
 def GetLianTiAttrPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_LianTiAttrPer)
 def SetLianTiAttrPer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_LianTiAttrPer, value)
 
+def GetAttr160(curPlayer): return 0
+def SetAttr160(curPlayer, value): pass
+
+# 仙盟事务速度加成
+def GetAffairSpeedPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AffairSpeedPer)
+def SetAffairSpeedPer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_AffairSpeedPer, value)
+
+# 仙盟BOSS伤害加成
+def GetFamilyBossHurtPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_FamilyBossHurtPer)
+def SetFamilyBossHurtPer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_FamilyBossHurtPer, value)
+
+# 仙盟联赛生命加成
+def GetFamilyWarHPPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_FamilyWarHPPer)
+def SetFamilyWarHPPer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_FamilyWarHPPer, value)
+
+# 仙盟联赛攻击加成
+def GetFamilyWarAtkPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_FamilyWarAtkPer)
+def SetFamilyWarAtkPer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_FamilyWarAtkPer, value)
+
+# 仙盟打坐经验加成
+def GetFamilySitExpPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_FamilySitExpPer)
+def SetFamilySitExpPer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_FamilySitExpPer, value)
+
 # 宝石基础属性百分比
 def GetStoneBasePer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_StoneBasePer)
 def SetStoneBasePer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_StoneBasePer, value)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index dffb4e2..fea6218 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -45,6 +45,7 @@
 import PlayerControl
 import PlayerWorldAverageLv
 import PlayerFamily
+import PlayerFamilyZhenfa
 import PlayerOnlinePrize
 import NPCCustomRefresh
 import PlayerLoginDayAward
@@ -1336,6 +1337,10 @@
                 GameLogic_FamilyParty.DoAddFamilyMemberFamilyActivity(familyID, addFamilyActivity)
             return
         
+        if key == ShareDefine.Def_Notify_WorldKey_FamilyZhenfaInfo:
+            PlayerFamilyZhenfa.GameServer_FamilyZhenfa(eval(msgValue))
+            return
+        
         if key == ShareDefine.Def_Notify_WorldKey_AssistBoss:
             assistData = eval(msgValue)
             if GameWorld.GetMap().GetMapID() == assistData[0]:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
index 71cee19..e03761f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -30,6 +30,7 @@
 import ChMapToGamePyPack
 import PlayerFamilyTech
 import PlayerFamilyRedPacket
+import PlayerFamilyZhenfa
 import SkillCommon
 import BuffSkill
 import ItemCommon
@@ -160,6 +161,7 @@
     GameLogic_FamilyWar.DoCheckChampionFamilyTitle(curPlayer)
     GameLogic_FamilyBoss.OnEnterFamily(curPlayer)
     PlayerFamilyRedPacket.CreatCacheRedPacktet(curPlayer)
+    PlayerFamilyZhenfa.OnEnterFamily(curPlayer)
     return
 
 ## 退出家族触发事件
@@ -186,6 +188,7 @@
     #清空仓库积分
     PlayerControl.SetPlayerCurrency(curPlayer, ShareDefine.TYPE_Price_FamilyStoreScore, 0)
     GameLogic_FamilyWar.DoCheckChampionFamilyTitle(curPlayer)
+    PlayerFamilyZhenfa.OnLeaveFamily(curPlayer)
     return
 
 ## 家族等级加持buff变更处理(进、退家族时 及 家族等级变更时)
@@ -641,6 +644,7 @@
     SyncFamilyActivityInfo(curPlayer)
     Sync_FamilyDayRewardState(curPlayer)
     __FamilyAffair_CheckReset(curPlayer)
+    PlayerFamilyZhenfa.OnPlayerLogin(curPlayer)
     return
 
 def FamilyPlayerOnLoginCross(curPlayer):
@@ -1139,6 +1143,11 @@
     starInfo = affairStarDict.get(str(star), [])
     needDuration = starInfo[1] if len(starInfo) > 1 else 0
     # 可扩展减时长属性
+    speedPer = 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
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenfa.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenfa.py
new file mode 100644
index 0000000..0f048b1
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenfa.py
@@ -0,0 +1,213 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerFamilyZhenfa
+#
+# @todo:仙盟阵法
+# @author hxp
+# @date 2023-10-11
+# @version 1.0
+#
+# 详细描述: 仙盟阵法
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2023-10-11 16:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import ItemCommon
+import ShareDefine
+import PlayerControl
+import NetPackCommon
+import ChPyNetSendPack
+import IpyGameDataPY
+import PlayerSuccess
+import IPY_GameWorld
+import PyGameData
+import ChConfig
+
+ZhenfaKey_LV = "LV"
+ZhenfaKey_Exp = "Exp"
+
+def OnPlayerLogin(curPlayer):
+    Sync_FamilyZhenfaInfo(curPlayer)
+    return
+
+def OnLeaveFamily(curPlayer):
+    #Sync_FamilyZhenfaInfo(curPlayer)
+    RefreshZhenfaAttr(curPlayer)
+    return
+
+def OnEnterFamily(curPlayer):
+    Sync_FamilyZhenfaInfo(curPlayer)
+    RefreshZhenfaAttr(curPlayer)
+    return
+
+def GetFamilyZhenfaInfo(familyID, zhenfaType, key, defValue=0):
+    ## 获取家族阵法信息
+    zhenfaInfo = PyGameData.g_familyZhenfaInfo.get(familyID, {})
+    info = zhenfaInfo.get(zhenfaType, {})
+    return info.get(key, defValue)
+
+def GameServer_FamilyZhenfa(msgDict):
+    zhenfaInfo = msgDict.get("zhenfaInfo", {}) # {familyID:{zhenfaType:{k:v, }, ...}, ...}
+    msgType = msgDict.get("msgType", "")
+    familyID = msgDict.get("familyID", 0) # 指定更新的仙盟
+    playerID = msgDict.get("playerID", 0) # 触发更新的玩家ID
+    refreshAttr = msgDict.get("refreshAttr", 1)
+    
+    # 所有仙盟,直接替换
+    if msgType == "allFamily":
+        PyGameData.g_familyZhenfaInfo = zhenfaInfo
+    # 单个仙盟更新
+    else:
+        PyGameData.g_familyZhenfaInfo.update(zhenfaInfo)
+        
+    #GameWorld.DebugLog("更新阵法信息: %s" % PyGameData.g_familyZhenfaInfo)
+    playerManager = GameWorld.GetPlayerManager()
+    for index in xrange(playerManager.GetPlayerCount()):
+        curPlayer = playerManager.GetPlayerByIndex(index)
+        if curPlayer.GetID() == 0:
+            continue
+        
+        if familyID and curPlayer.GetFamilyID() != familyID:
+            continue
+        
+        OnFamilyZhenfaRefresh(curPlayer, refreshAttr, playerID)
+        
+    return
+
+def SendGameServer_FamilyZhenfa(curPlayer, familyID, playerID, msgType, msgData):
+    GameWorld.DebugLog("仙盟阵法同步GameServer: familyID=%s,msgType=%s,%s" % (familyID, msgType, msgData), playerID)
+    msgInfo = str([familyID, playerID, msgType, msgData])
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "FamilyZhenfa", msgInfo, len(msgInfo))
+    return
+
+#// A6 14 家族阵法升级 #tagCMFamilyZhenfaLVUP
+#
+#struct     tagCMFamilyZhenfaLVUP
+#{
+#    tagHead        Head;
+#    BYTE        ZhenfaType;    // 阵法类型
+#    DWORD        ItemID;        // 消耗的物品ID
+#    WORD        ItemCount;    // 消耗个数,默认1
+#};
+def OnFamilyZhenfaLVUP(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    familyID = curPlayer.GetFamilyID()
+    zhenfaType = clientData.ZhenfaType
+    useItemID = clientData.ItemID
+    useItemCount = clientData.ItemCount
+    if not familyID:
+        GameWorld.DebugLog("没有仙盟,无法升级阵法", playerID)
+        return
+    if not useItemID or useItemCount <= 0:
+        GameWorld.DebugLog("没有指定升级阵法物品: useItemID=%s,useItemCount=%s" % (useItemID, useItemCount), playerID)
+        return
+    zhenfaLV = GetFamilyZhenfaInfo(familyID, zhenfaType, ZhenfaKey_LV)
+    ipyData = IpyGameDataPY.GetIpyGameData("FamilyZhenfa", zhenfaType, zhenfaLV)
+    if not ipyData:
+        return
+    LVUpNeedExp = ipyData.GetLVUpNeedExp()
+    if not LVUpNeedExp:
+        GameWorld.DebugLog("该阵法已满级:zhenfaType=%s,zhenfaLV=%s" % (zhenfaType, zhenfaLV), playerID)
+        return
+    expItemDict = IpyGameDataPY.GetFuncEvalCfg("FamilyZhenfa", 1)
+    if str(zhenfaType) not in expItemDict:
+        GameWorld.DebugLog("不存在该阵法类型: zhenfaType=%s" % zhenfaType, playerID)
+        return
+    expItemList = expItemDict[str(zhenfaType)]
+    
+    if useItemID not in expItemList:
+        GameWorld.DebugLog("该物品不能升级该阵法:zhenfaType=%s,useItemID=%s not in %s" % (zhenfaType, useItemID, expItemList), playerID)
+        return
+    
+    itemData = GameWorld.GetGameData().GetItemByTypeID(useItemID)
+    if not itemData:
+        return
+    itemExp = itemData.GetEffectByIndex(0).GetEffectValue(0) # 默认效果1 A值为可加经验
+    if not itemExp:
+        GameWorld.DebugLog("该物品没有阵法经验:useItemID=%s" % useItemID, playerID)
+        return
+    
+    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList({useItemID:useItemCount}, itemPack)
+    if lackItemDict:
+        GameWorld.DebugLog("阵法升级物品不足:useItemID=%s,useItemCount=%s,lackItemDict=%s" % (useItemID, useItemCount, lackItemDict), playerID)
+        return
+    
+    if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FamilyZhenfa, tick):
+        GameWorld.DebugLog("阵法升级操作CD中...", playerID)
+        PlayerControl.NotifyCode(curPlayer, "RequestLater")
+        return
+    
+    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "FamilyZhenfaLVUP")
+    
+    addTotalExp = itemExp * useItemCount
+    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FamilyZhenfaExp, addTotalExp)
+    
+    SendGameServer_FamilyZhenfa(curPlayer, familyID, playerID, "AddExp", [zhenfaType, addTotalExp])
+    return
+
+def OnFamilyZhenfaRefresh(curPlayer, refreshAttr, opPlayerID):
+    if curPlayer.GetPlayerID() == opPlayerID:
+        curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_FamilyZhenfa, 0)
+        
+    Sync_FamilyZhenfaInfo(curPlayer, opPlayerID)
+    
+    if refreshAttr:
+        RefreshZhenfaAttr(curPlayer)
+    return
+
+def RefreshZhenfaAttr(curPlayer):
+    CalcZhenfaAttr(curPlayer)
+    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
+    return
+
+def CalcZhenfaAttr(curPlayer):
+    
+    allAttrList = [{} for i in range(4)]
+    
+    familyID = curPlayer.GetFamilyID()
+    if familyID:
+        expItemDict = IpyGameDataPY.GetFuncEvalCfg("FamilyZhenfa", 1)
+        zhenfaInfo = PyGameData.g_familyZhenfaInfo.get(familyID, {})
+        for zhenfaTypeStr in expItemDict.keys():
+            zhenfaType = int(zhenfaTypeStr)
+            info = zhenfaInfo.get(zhenfaType, {})
+            zhenfaLV = info.get(ZhenfaKey_LV, 0)
+            ipyData = IpyGameDataPY.GetIpyGameData("FamilyZhenfa", zhenfaType, zhenfaLV)
+            if not ipyData:
+                continue
+            attrTypeList, attrValueList = ipyData.GetLVAttrType(), ipyData.GetLVAttrValue()
+            for i, attrID in enumerate(attrTypeList):
+                PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)
+                
+    # 保存计算值
+    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_FamilyZhenfa, allAttrList)   
+    return
+
+def Sync_FamilyZhenfaInfo(curPlayer, playerID=0):
+    familyID = curPlayer.GetFamilyID()
+    if not familyID:
+        return
+    
+    zhenfaInfoList = []
+    zhenfaInfo = PyGameData.g_familyZhenfaInfo.get(familyID, {})
+    for zhenfaType, info in zhenfaInfo.items():
+        zhenfa = ChPyNetSendPack.tagMCFamilyZhenfa()
+        zhenfa.Clear()
+        zhenfa.ZhenfaType = zhenfaType
+        zhenfa.ZhenfaLV = info.get(ZhenfaKey_LV, 0)
+        zhenfa.ZhenfaExp = info.get(ZhenfaKey_Exp, 0)
+        zhenfaInfoList.append(zhenfa)
+        
+    clientPack = ChPyNetSendPack.tagMCFamilyZhenfaInfo()
+    clientPack.Clear()
+    clientPack.PlayerID = playerID
+    clientPack.ZhenfaInfoList = zhenfaInfoList
+    clientPack.Count = len(clientPack.ZhenfaInfoList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index 58b580d..a481010 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -122,3 +122,6 @@
 g_coupleInfo = {} # {playerID:[coupleID, coupleName], ...}
 
 g_playerPriWoodPileNPCDict = {} # {playerID:[npcObj, ...], ...}
+
+g_familyZhenfaInfo = {} # 仙盟阵法信息{familyID:{zhenfaType:{k:v, }, ...}, ...}
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 15c7437..7c7059c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -168,6 +168,7 @@
 
 Def_Notify_WorldKey_FamilyPartyInfo = "FamilyPartyInfo"  # 仙盟宴会数据
 Def_Notify_WorldKey_FamilyPartyAddFamilyActivity = "FamilyPartyAddFamilyActivity"  # 仙盟宴会地图成员增加仙盟活跃令
+Def_Notify_WorldKey_FamilyZhenfaInfo = "FamilyZhenfaInfo"  # 仙盟阵法数据
 
 Def_Notify_WorldKey_AddFamilyAuctionItem = "AddFamilyAuctionItem"  # 添加仙盟拍品
 Def_Notify_WorldKey_AddSystemAuctionItem = "AddSystemAuctionItem"  # 添加系统拍品
@@ -684,6 +685,12 @@
 Def_Effect_PeerlessWeaponTrainAttrPer = 158 # 灭世培养属性加成(攻防血)
 Def_Effect_PeerlessWeapon2TrainAttrPer = 159 # 弑神培养属性加成(攻防血)
 Def_Effect_LianTiAttrPer = 160 # 炼体属性百分比(攻防血)
+
+Def_Effect_AffairSpeedPer = 161 # 仙盟事务速度加成
+Def_Effect_FamilyBossHurtPer = 162 # 仙盟BOSS伤害加成
+Def_Effect_FamilyWarHPPer = 163 # 仙盟联赛生命加成
+Def_Effect_FamilyWarAtkPer = 164 # 仙盟联赛攻击加成
+Def_Effect_FamilySitExpPer = 165 # 仙盟打坐经验加成
 
 #增加%d物理伤害值,其中a值为伤害值
 Def_Effect_AddAtk = 1005
@@ -1332,7 +1339,7 @@
                       Def_ActionType_LeaderImpeachTime,  # 族长下线了多久5
                       Def_ActionType_FamilyBossFB,    #记录家族boss副本信息6
                       Def_ActionType_FamilyStore,    #记录战盟仓库操作记录7
-                      Def_ActionType_XXX8,    #8
+                      Def_ActionType_FamilyZhenfa,    #仙盟阵法8
                       Def_ActionType_XXX9,    #9
                       Def_ActionType_XXX10,    #10
                       Def_ActionType_OfficerModelEquip,    #记录家族有职位的成员模型装备信息11
@@ -1617,7 +1624,7 @@
 )=range(5)
 
 # 战斗力模块类型
-Def_MFPType_Max = 32
+Def_MFPType_Max = 33
 ModuleFightPowerTypeList = (
 Def_MFPType_Role, # 角色 0
 Def_MFPType_Equip, # 装备(装备本身) 1
@@ -1650,6 +1657,7 @@
 Def_MFPType_Enchant, # 附魔 28
 Def_MFPType_Gubao, # 古宝 29
 Def_MFPType_Shentong, # 神通 30
+Def_MFPType_FamilyZhenfa, # 阵法 31
 Def_MFPType_Other, # 其他
 ) = range(Def_MFPType_Max)
 
@@ -1944,7 +1952,8 @@
 SuccType_EquipStarTotal, # 全身升星总星数X星 174
 SuccType_EquipWashTotal, # 全身洗炼总等级X级 175
 SuccType_CrossPK, # 跨服PK x次  176
-) = range(1, 177)
+SuccType_FamilyZhenfaExp, # 仙盟阵法捐献累计经验 177
+) = range(1, 178)
 
 # 节日红包成就类型
 FeastRedPackSuccessTypeList = range(SuccType_FeastRedPack_TalkWorld, SuccType_FeastRedPack_FBSweep + 1)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py
index 08ba180..4ea3121 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py
@@ -21,8 +21,22 @@
 import ChConfig
 import EffGetSet
 import GameWorld
+import FBCommon
 #---------------------------------------------------------------------
 
+def AddPlayerMapAttrNolineEffect(curPlayer, effectDict):
+    ## 根据玩家当前属性给玩家添加非线性效果加成 - 某些地图才生效的
+    mapID = FBCommon.GetRecordMapID(curPlayer.GetMapID())
+    mapAttrNolineInfo = ChConfig.MapAttrInfoDict_Noline.get(mapID, {})
+    for attrIndex, effAttrIndexList in mapAttrNolineInfo.items():
+        curValue = EffGetSet.GetValueByEffIndex(curPlayer, attrIndex)
+        if not curValue:
+            #GameWorld.DebugLog("    没有该类属性: attrIndex=%s" % attrIndex)
+            continue
+        for effAttrIndex in effAttrIndexList:
+            effectDict[effAttrIndex] = effectDict.get(effAttrIndex, 0) + curValue
+    return
+
 ## 给玩家添加非线性Buff效果 
 #  @param curPlayer 当前玩家
 #  @param effectDict 效果列表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
index d900d00..c03979f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
@@ -199,6 +199,12 @@
    [lambda curObj:PlayerControl.GetPeerlessWeaponTrainAttrPer(curObj), lambda curObj, value:PlayerControl.SetPeerlessWeaponTrainAttrPer(curObj, value), 0, 0, 0],      # 灭世培养属性加成
    [lambda curObj:PlayerControl.GetPeerlessWeapon2TrainAttrPer(curObj), lambda curObj, value:PlayerControl.SetPeerlessWeapon2TrainAttrPer(curObj, value), 0, 0, 0],      # 弑神培养属性加成
    [lambda curObj:PlayerControl.GetLianTiAttrPer(curObj), lambda curObj, value:PlayerControl.SetLianTiAttrPer(curObj, value), 0, 0, 0],      # 炼体属性属性加成
+   [lambda curObj:PlayerControl.GetAttr160(curObj), lambda curObj, value:PlayerControl.SetAttr160(curObj, value), 0, 0, 0],      # 160
+   [lambda curObj:PlayerControl.GetAffairSpeedPer(curObj), lambda curObj, value:PlayerControl.SetAffairSpeedPer(curObj, value), 0, 0, 0],      # 仙盟事务速度加成
+   [lambda curObj:PlayerControl.GetFamilyBossHurtPer(curObj), lambda curObj, value:PlayerControl.SetFamilyBossHurtPer(curObj, value), 0, 0, 0],      # 仙盟BOSS伤害加成
+   [lambda curObj:PlayerControl.GetFamilyWarHPPer(curObj), lambda curObj, value:PlayerControl.SetFamilyWarHPPer(curObj, value), 0, 0, 0],      # 仙盟联赛生命加成
+   [lambda curObj:PlayerControl.GetFamilyWarAtkPer(curObj), lambda curObj, value:PlayerControl.SetFamilyWarAtkPer(curObj, value), 0, 0, 0],      # 仙盟联赛攻击加成
+   [lambda curObj:PlayerControl.GetFamilySitExpPer(curObj), lambda curObj, value:PlayerControl.SetFamilySitExpPer(curObj, value), 0, 0, 0],      # 仙盟打坐经验加成
 ]
 
 ## 通过索引获得属性值

--
Gitblit v1.8.0