From 80344b714003facc6731e3eb9d62d1fb53e30529 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 02 七月 2021 19:09:45 +0800
Subject: [PATCH] 9046 【主干】【BT2】【BT3】【后端】培养功能(同步主干 冲突内容)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py      |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py         |  171 ++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py          |   14 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py          |  172 ++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py        |  126 +++++++++
 PySysDB/PySysDBPY.h                                                                         |   45 +++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                               |  172 ++++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                               |   12 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py             |   65 ++++
 10 files changed, 787 insertions(+), 8 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 1d35033..27ef405 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -33,6 +33,22 @@
 	DWORD		NextItemID;	//突破后物品ID
 };
 
+//灵器培养表
+
+struct tagLingQiTrain
+{
+	BYTE		_EquipPlace;	//灵器装备位
+	BYTE		_TrainType;	//培养类型
+	BYTE		_TrainLV;	//培养等阶
+	WORD		NeedRealmLV;	//培养所需境界
+	DWORD		EatCntTotal;	//升阶所需个数(非累计)
+	DWORD		EatCntEverytime;	//每次培养消耗x个
+	list		EatItemAttrTypeList;	//每X个培养丹增加属性类型=EatCntEverytime
+	list		EatItemAttrValueList;	//每X个培养丹增加属性值=EatCntEverytime
+	list		LVAttrTypeList;	//每级额外属性类(非累积)
+	list		LVAttrValueList;	//每级额外属性值(非累积)
+};
+
 //境界表 #tagRealm
 
 struct	tagRealm
@@ -296,6 +312,20 @@
 	DWORD		InitFightPower;	//初始战力
 };
 
+//灵宠培养表
+
+struct tagPetTrain
+{
+	BYTE		_TrainType;	//培养类型
+	BYTE		_TrainLV;	//培养等阶
+	WORD		NeedRealmLV;	//培养所需境界
+	DWORD		EatCntTotal;	//升阶所需个数(非累计)
+	DWORD		EatCntEverytime;	//每次培养消耗x个
+	list		EatItemAttrTypeList;	//每X个培养丹增加属性类型=EatCntEverytime
+	list		EatItemAttrValueList;	//每X个培养丹增加属性值=EatCntEverytime
+	list		LVAttrTypeList;	//每级额外属性类(非累积)
+	list		LVAttrValueList;	//每级额外属性值(非累积)
+};
 
 //装备分解属性表
 
@@ -339,6 +369,21 @@
 	list		LVAttrValue;	//每级额外属性值(非累积)
 };
 
+//坐骑培养表
+
+struct tagHorseTrain
+{
+	BYTE		_TrainType;	//培养类型
+	BYTE		_TrainLV;	//培养等阶
+	WORD		NeedRealmLV;	//培养所需境界
+	DWORD		EatCntTotal;	//升阶所需个数(非累计)
+	DWORD		EatCntEverytime;	//每次培养消耗x个
+	list		EatItemAttrTypeList;	//每X个培养丹增加属性类型=EatCntEverytime
+	list		EatItemAttrValueList;	//每X个培养丹增加属性值=EatCntEverytime
+	list		LVAttrTypeList;	//每级额外属性类(非累积)
+	list		LVAttrValueList;	//每级额外属性值(非累积)
+};
+
 //坐骑幻化表
 
 struct tagHorseSkinPlus
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index a47cd1d..6eb0e4a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -7491,6 +7491,66 @@
 
 
 #------------------------------------------------------
+# A3 27 灵器培养 #tagCMLingQiTrain
+
+class  tagCMLingQiTrain(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("EquipPlace", c_ubyte),    #灵器装备位
+                  ("TrainType", c_ubyte),    #培养类型: 1-基础培养,2-特殊培养,3-百分比培养
+                  ("UseItemCnt", c_ushort),    #消耗材料个数
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA3
+        self.SubCmd = 0x27
+        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 = 0xA3
+        self.SubCmd = 0x27
+        self.EquipPlace = 0
+        self.TrainType = 0
+        self.UseItemCnt = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMLingQiTrain)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A3 27 灵器培养 //tagCMLingQiTrain:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                EquipPlace:%d,
+                                TrainType:%d,
+                                UseItemCnt:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.EquipPlace,
+                                self.TrainType,
+                                self.UseItemCnt
+                                )
+        return DumpString
+
+
+m_NAtagCMLingQiTrain=tagCMLingQiTrain()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMLingQiTrain.Cmd,m_NAtagCMLingQiTrain.SubCmd))] = m_NAtagCMLingQiTrain
+
+
+#------------------------------------------------------
 #A3 02 丢弃背包物品 #tagPlayerDropItem
 
 class  tagPlayerDropItem(Structure):
@@ -10730,6 +10790,62 @@
 
 
 #------------------------------------------------------
+# A5 31 坐骑培养 #tagCMHorseTrain
+
+class  tagCMHorseTrain(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TrainType", c_ubyte),    #培养类型: 1-基础培养,2-特殊培养,3-百分比培养
+                  ("UseItemCnt", c_ushort),    #消耗材料个数
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA5
+        self.SubCmd = 0x31
+        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 = 0x31
+        self.TrainType = 0
+        self.UseItemCnt = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMHorseTrain)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 31 坐骑培养 //tagCMHorseTrain:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TrainType:%d,
+                                UseItemCnt:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TrainType,
+                                self.UseItemCnt
+                                )
+        return DumpString
+
+
+m_NAtagCMHorseTrain=tagCMHorseTrain()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMHorseTrain.Cmd,m_NAtagCMHorseTrain.SubCmd))] = m_NAtagCMHorseTrain
+
+
+#------------------------------------------------------
 # A5 27 坐骑提升 #tagCMHorseUp
 
 class  tagCMHorseUp(Structure):
@@ -13030,6 +13146,62 @@
 
 
 #------------------------------------------------------
+# A7 05 宠物培养 #tagCMPetTrain
+
+class  tagCMPetTrain(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TrainType", c_ubyte),    #培养类型: 1-基础培养,2-特殊培养,3-百分比培养
+                  ("UseItemCnt", c_ushort),    #消耗材料个数
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA7
+        self.SubCmd = 0x05
+        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 = 0xA7
+        self.SubCmd = 0x05
+        self.TrainType = 0
+        self.UseItemCnt = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMPetTrain)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A7 05 宠物培养 //tagCMPetTrain:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TrainType:%d,
+                                UseItemCnt:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TrainType,
+                                self.UseItemCnt
+                                )
+        return DumpString
+
+
+m_NAtagCMPetTrain=tagCMPetTrain()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMPetTrain.Cmd,m_NAtagCMPetTrain.SubCmd))] = m_NAtagCMPetTrain
+
+
+#------------------------------------------------------
 # A8 04 购买VIP礼包 #tagCMBuyVIPItem
 
 class  tagCMBuyVIPItem(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 87bd2d3..05b6f0c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -617,6 +617,18 @@
 
 Def_Effect_ReduceSkillCDPer = 149   # 减少技能CD, a值为万分率
 
+Def_Effect_ZhuXianRate = 150   # 诛仙一击: 概率直接减少BOSS当前10%血量
+Def_Effect_ZhuXianReducePer = 151   # 诛仙护体: 受到BOSS伤害减免 万分率
+
+Def_Effect_HorseMaxHPPer = 152 # 坐骑生命加成
+Def_Effect_PetAtkPer = 153 # 灵宠攻击加成
+Def_Effect_HorseTrainAttrPer = 154 # 坐骑培养属性加成(攻防血)
+Def_Effect_PetTrainAttrPer = 155 # 灵宠培养属性加成(攻防血)
+Def_Effect_GuardTrainAttrPer = 156 # 守护培养属性加成(攻防血)
+Def_Effect_WingTrainAttrPer = 157 # 翅膀培养属性加成(攻防血)
+Def_Effect_PeerlessWeaponTrainAttrPer = 158 # 灭世培养属性加成(攻防血)
+Def_Effect_PeerlessWeapon2TrainAttrPer = 159 # 弑神培养属性加成(攻防血)
+
 #增加%d物理伤害值,其中a值为伤害值
 Def_Effect_AddAtk = 1005
 #增加%d魔法伤害值,其中a值为伤害值
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 5c98be4..990d379 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 = 149
+Def_Calc_AllAttrType_MAX = 159
 #基本属性BUFF计算,顺序与 ObjProperty_AttrByIndex 对应,同时也为buff效果ID同步通知策划
 TYPE_Calc_AttrList = (
 TYPE_Calc_Metal,                        # 金 1
@@ -237,6 +237,16 @@
 TYPE_Calc_SkillReducePer5,               # 受到技能伤害减少5
 TYPE_Calc_SkillReducePer6,               # 受到技能伤害减少6
 TYPE_Calc_SkillReducePer7,               # 受到技能伤害减少7
+TYPE_Calc_ZhuXianRate,                   # 诛仙一击: 概率直接减少BOSS当前10%血量
+TYPE_Calc_ZhuXianReducePer,              # 诛仙护体: 受到BOSS伤害减免 万分率     150
+TYPE_Calc_HorseMaxHPPer,                 # 坐骑生命加成
+TYPE_Calc_PetAtkPer,                     # 灵宠攻击加成
+TYPE_Calc_HorseTrainAttrPer,             # 坐骑培养属性加成(攻防血)
+TYPE_Calc_PetTrainAttrPer,               # 灵宠培养属性加成(攻防血)
+TYPE_Calc_GuardTrainAttrPer,             # 守护培养属性加成(攻防血) 155
+TYPE_Calc_WingTrainAttrPer,              # 翅膀培养属性加成(攻防血)
+TYPE_Calc_PeerlessWeaponTrainAttrPer,    # 灭世培养属性加成(攻防血)
+TYPE_Calc_PeerlessWeapon2TrainAttrPer,   # 弑神培养属性加成(攻防血)
 ) = range(1, Def_Calc_AllAttrType_MAX)
 
 ## 支持大数值属性,超过20E
@@ -3268,6 +3278,14 @@
 Def_PlayerKey_CurePer = "CurePer"   # 治疗加成 默认百分百
 Def_PlayerKey_BeHurtPer = "BeHurtPer"   # 加深受到伤害百分比
 Def_PlayerKey_HorseAtkPer = "HorseAtkPer"   # 坐骑攻击百分比
+Def_PlayerKey_HorseMaxHPPer = "HorseMaxHPPer"   # 坐骑生命加成
+Def_PlayerKey_PetAtkPer = "PetAtkPer"   # 灵宠攻击加成
+Def_PlayerKey_HorseTrainAttrPer = "HorseTrainAttrPer"   # 坐骑培养属性加成
+Def_PlayerKey_PetTrainAttrPer = "PetTrainAttrPer"   # 灵宠培养属性加成
+Def_PlayerKey_GuardTrainAttrPer = "GuardTrainAttrPer"   # 守护培养属性加成
+Def_PlayerKey_WingTrainAttrPer = "WingTrainAttrPer"   # 翅膀培养属性加成
+Def_PlayerKey_PeerlessWeaponTrainAttrPer = "PeerlessWeaponTrainAttrPer"   # 灭世培养属性加成
+Def_PlayerKey_PeerlessWeapon2TrainAttrPer = "PeerlessWeapon2TrainAttrPer"   # 弑神培养属性加成
 Def_PlayerKey_StoneBasePer = "StoneBasePer"   # 宝石基础属性百分比
 Def_PlayerKey_RealmBasePer = "RealmBasePer"   # 境界基础属性百分比
 Def_PlayerKey_WingHPPer = "WingHPPer"   # 翅膀生命百分比
@@ -3639,6 +3657,10 @@
 Def_PDict_EquipWashValue = "EquipWashV_%s_%s" # 装备部位洗练当前值,参数为(place, 属性编号)
 Def_PDict_EquipWashValueTemp = "EquipWashVT_%s_%s" # 装备部位洗练当前临时洗练值,参数为(place, 属性编号)
 
+# 灵器培养
+Def_PDict_LingQiTrainLV = "LingQiTrainLV_%s_%s" # 培养等阶,参数为(place, 培养类型)
+Def_PDict_LingQiTrainItemCount = "LingQiTrainItemCount_%s_%s" # 培养当前阶已吃培养丹个数,参数为(place, 培养类型)
+
 # 百战之地
 Def_PDict_BZZD_TotalFightExp = "BZZD_TExp" # 最后一次进入副本挑战获得总经验, 领取多倍奖励时用
 Def_PDict_BZZD_TotalFightExpPoint = "BZZD_TExpPoint" # 最后一次进入副本挑战获得总经验点, 领取多倍奖励时用
@@ -3653,6 +3675,8 @@
 
 # 宠物
 Def_PDict_FightPetIndex = "FightPetIndex" # 出战的宠物索引
+Def_PDict_PetTrainLV = "PetTrainLV_%s"  # 灵宠培养等阶,参数(培养类型)
+Def_PDict_PetTrainItemCount = "PetTrainItemCount_%s"  # 灵宠培养当前阶已吃培养丹个数,参数(培养类型)
 
 #装备分解
 Def_PDict_EquipDecomposeLV = "EquipDecomposeLV" #等级
@@ -3916,6 +3940,8 @@
 Def_PDict_HorserLV = "HorserLV"  # 坐骑等级
 Def_PDict_HorserEatItemCount = "HorserEatItemCount"  # 当前阶已吃培养丹个数
 Def_PDict_HorserSkinPlusState = "HorserSkinPlusState"  # 坐骑幻化皮肤激活状态,按二进制位存储,每位代表幻化ID是否已激活
+Def_PDict_HorserTrainLV = "HorserTrainLV_%s"  # 坐骑培养等阶,参数(培养类型)
+Def_PDict_HorserTrainItemCount = "HorserTrainItemCount_%s"  # 坐骑培养当前阶已吃培养丹个数,参数(培养类型)
 
 #骑宠觉醒
 Def_PDict_HorsePetSkinData = "HorsePetSkinData%d_%s"  #觉醒等级*100+外观索引  参数(类型,关联ID) 1-坐骑 2-灵宠
@@ -4443,6 +4469,7 @@
     ShareDefine.Def_Effect_MissRate:[[TYPE_Calc_AttrMiss], False, TYPE_NoLinear],
     #ShareDefine.Def_Effect_AddMAtkByPer:[[TYPE_Calc_AttrMATKMin, TYPE_Calc_AttrMATKMax], False, TYPE_NoLinear],
     ShareDefine.Def_Effect_AddAtkByPer:[[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax], False, TYPE_NoLinear],
+    ShareDefine.Def_Effect_PetAtkPer:[[TYPE_Calc_PetMinAtk, TYPE_Calc_PetMaxAtk], False, TYPE_NoLinear],
     ShareDefine.Def_Effect_SpeedPer:[[TYPE_Calc_AttrSpeed], False, TYPE_NoLinear],
     ShareDefine.Def_Effect_LuckPer:[[TYPE_Calc_Luck], False, TYPE_NoLinear],
     ShareDefine.Def_Effect_IceAtkPer:[[TYPE_Calc_AttrIceAtk], False, TYPE_NoLinear],
@@ -4473,6 +4500,13 @@
     ShareDefine.Def_Effect_StoneBasePer:[[TYPE_Calc_StoneBasePer], False, TYPE_NoLinear],
     ShareDefine.Def_Effect_RealmBasePer:[[TYPE_Calc_RealmBasePer], False, TYPE_NoLinear],
     ShareDefine.Def_Effect_HorseAtkPer:[[TYPE_Calc_HorseAtkPer], False, TYPE_NoLinear],
+    ShareDefine.Def_Effect_HorseMaxHPPer:[[TYPE_Calc_HorseMaxHPPer], False, TYPE_NoLinear],
+    ShareDefine.Def_Effect_HorseTrainAttrPer:[[TYPE_Calc_HorseTrainAttrPer], False, TYPE_NoLinear],
+    ShareDefine.Def_Effect_PetTrainAttrPer:[[TYPE_Calc_PetTrainAttrPer], False, TYPE_NoLinear],
+    ShareDefine.Def_Effect_GuardTrainAttrPer:[[TYPE_Calc_GuardTrainAttrPer], False, TYPE_NoLinear],
+    ShareDefine.Def_Effect_WingTrainAttrPer:[[TYPE_Calc_WingTrainAttrPer], False, TYPE_NoLinear],
+    ShareDefine.Def_Effect_PeerlessWeaponTrainAttrPer:[[TYPE_Calc_PeerlessWeaponTrainAttrPer], False, TYPE_NoLinear],
+    ShareDefine.Def_Effect_PeerlessWeapon2TrainAttrPer:[[TYPE_Calc_PeerlessWeapon2TrainAttrPer], False, TYPE_NoLinear],
     ShareDefine.Def_Effect_WingHPPer:[[TYPE_Calc_WingHPPer], False, TYPE_NoLinear],
     ShareDefine.Def_Effect_SuiteBasePer:[[TYPE_Calc_SuiteBasePer], False, TYPE_NoLinear],
     ShareDefine.Def_Effect_PlusBaseAtkPer:[[TYPE_Calc_PlusBaseAtkPer], False, TYPE_NoLinear],
@@ -4495,6 +4529,19 @@
                         TYPE_Calc_RealmBasePer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax, 
                                                 TYPE_Calc_AttrMaxHP, TYPE_Calc_AttrDEF],
                         TYPE_Calc_HorseAtkPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
+                        TYPE_Calc_HorseMaxHPPer:[TYPE_Calc_AttrMaxHP],
+                        TYPE_Calc_HorseTrainAttrPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax, 
+                                                TYPE_Calc_AttrMaxHP, TYPE_Calc_AttrDEF],
+                        TYPE_Calc_PetTrainAttrPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax, 
+                                                TYPE_Calc_AttrMaxHP, TYPE_Calc_AttrDEF],
+                        TYPE_Calc_WingTrainAttrPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax, 
+                                                TYPE_Calc_AttrMaxHP, TYPE_Calc_AttrDEF],
+                        TYPE_Calc_GuardTrainAttrPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax, 
+                                                TYPE_Calc_AttrMaxHP, TYPE_Calc_AttrDEF],
+                        TYPE_Calc_PeerlessWeaponTrainAttrPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax, 
+                                                TYPE_Calc_AttrMaxHP, TYPE_Calc_AttrDEF],
+                        TYPE_Calc_PeerlessWeapon2TrainAttrPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax, 
+                                                TYPE_Calc_AttrMaxHP, TYPE_Calc_AttrDEF],
                         TYPE_Calc_WingHPPer:[TYPE_Calc_AttrMaxHP],
                         TYPE_Calc_SuiteBasePer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax, 
                                                 TYPE_Calc_AttrMaxHP],
@@ -4581,7 +4628,14 @@
 Def_CalcAttrFunc_LingQiAttr, # 灵器属性 38
 Def_CalcAttrFunc_HorseSkin, # 坐骑觉醒 39
 Def_CalcAttrFunc_PetSkin, # 灵宠觉醒 40
-) = range(41)
+Def_CalcAttrFunc_LingQiJingLianAttr, # 灵器精炼 41
+Def_CalcAttrFunc_HorseTarin, # 坐骑培养 42
+Def_CalcAttrFunc_PetTarin, # 灵宠培养 43
+Def_CalcAttrFunc_GuardTarin, # 守护培养 44
+Def_CalcAttrFunc_WingTarin, # 翅膀培养 45
+Def_CalcAttrFunc_PeerlessWeaponTrain, # 灭世培养 46
+Def_CalcAttrFunc_PeerlessWeapon2Train, # 噬魂培养 47
+) = range(48)
 
 # 技能功能点列表  - 默认不算战力,不享受百分比加成,技能功能点暂时配置,之后优化技能属性逻辑后可去掉
 CalcAttrFuncSkillList = [Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_DogzBattleSkill]
@@ -4596,11 +4650,12 @@
                             ShareDefine.Def_MFPType_Star:[Def_CalcAttrFunc_Star],
                             ShareDefine.Def_MFPType_Plus:[Def_CalcAttrFunc_Plus],
                             ShareDefine.Def_MFPType_Stone:[Def_CalcAttrFunc_Stone],
-                            ShareDefine.Def_MFPType_LingQi:[Def_CalcAttrFunc_LingQi, Def_CalcAttrFunc_LingQiAttr],
+                            ShareDefine.Def_MFPType_LingQi:[Def_CalcAttrFunc_LingQi, Def_CalcAttrFunc_LingQiAttr, Def_CalcAttrFunc_LingQiJingLianAttr, Def_CalcAttrFunc_GuardTarin, 
+                                                            Def_CalcAttrFunc_WingTarin, Def_CalcAttrFunc_PeerlessWeaponTrain, Def_CalcAttrFunc_PeerlessWeapon2Train],
                             ShareDefine.Def_MFPType_Wash:[Def_CalcAttrFunc_Wash],
-                            ShareDefine.Def_MFPType_Pet:[Def_CalcAttrFunc_Pet, Def_CalcAttrFunc_PetSign, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_PetSkin],
+                            ShareDefine.Def_MFPType_Pet:[Def_CalcAttrFunc_Pet, Def_CalcAttrFunc_PetSign, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_PetSkin, Def_CalcAttrFunc_PetTarin],
                             ShareDefine.Def_MFPType_PetSoul:[Def_CalcAttrFunc_PetSoul],
-                            ShareDefine.Def_MFPType_Horse:[Def_CalcAttrFunc_Horse, Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_HorseSkin],
+                            ShareDefine.Def_MFPType_Horse:[Def_CalcAttrFunc_Horse, Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_HorseSkin, Def_CalcAttrFunc_HorseTarin],
                             ShareDefine.Def_MFPType_HorseSoul:[Def_CalcAttrFunc_HorseSoul],
                             ShareDefine.Def_MFPType_Prestige:[Def_CalcAttrFunc_Prestige],
                             ShareDefine.Def_MFPType_GodWeapon:[Def_CalcAttrFunc_GodWeapon],
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index a47cd1d..6eb0e4a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -7491,6 +7491,66 @@
 
 
 #------------------------------------------------------
+# A3 27 灵器培养 #tagCMLingQiTrain
+
+class  tagCMLingQiTrain(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("EquipPlace", c_ubyte),    #灵器装备位
+                  ("TrainType", c_ubyte),    #培养类型: 1-基础培养,2-特殊培养,3-百分比培养
+                  ("UseItemCnt", c_ushort),    #消耗材料个数
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA3
+        self.SubCmd = 0x27
+        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 = 0xA3
+        self.SubCmd = 0x27
+        self.EquipPlace = 0
+        self.TrainType = 0
+        self.UseItemCnt = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMLingQiTrain)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A3 27 灵器培养 //tagCMLingQiTrain:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                EquipPlace:%d,
+                                TrainType:%d,
+                                UseItemCnt:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.EquipPlace,
+                                self.TrainType,
+                                self.UseItemCnt
+                                )
+        return DumpString
+
+
+m_NAtagCMLingQiTrain=tagCMLingQiTrain()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMLingQiTrain.Cmd,m_NAtagCMLingQiTrain.SubCmd))] = m_NAtagCMLingQiTrain
+
+
+#------------------------------------------------------
 #A3 02 丢弃背包物品 #tagPlayerDropItem
 
 class  tagPlayerDropItem(Structure):
@@ -10730,6 +10790,62 @@
 
 
 #------------------------------------------------------
+# A5 31 坐骑培养 #tagCMHorseTrain
+
+class  tagCMHorseTrain(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TrainType", c_ubyte),    #培养类型: 1-基础培养,2-特殊培养,3-百分比培养
+                  ("UseItemCnt", c_ushort),    #消耗材料个数
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA5
+        self.SubCmd = 0x31
+        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 = 0x31
+        self.TrainType = 0
+        self.UseItemCnt = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMHorseTrain)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 31 坐骑培养 //tagCMHorseTrain:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TrainType:%d,
+                                UseItemCnt:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TrainType,
+                                self.UseItemCnt
+                                )
+        return DumpString
+
+
+m_NAtagCMHorseTrain=tagCMHorseTrain()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMHorseTrain.Cmd,m_NAtagCMHorseTrain.SubCmd))] = m_NAtagCMHorseTrain
+
+
+#------------------------------------------------------
 # A5 27 坐骑提升 #tagCMHorseUp
 
 class  tagCMHorseUp(Structure):
@@ -13030,6 +13146,62 @@
 
 
 #------------------------------------------------------
+# A7 05 宠物培养 #tagCMPetTrain
+
+class  tagCMPetTrain(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TrainType", c_ubyte),    #培养类型: 1-基础培养,2-特殊培养,3-百分比培养
+                  ("UseItemCnt", c_ushort),    #消耗材料个数
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA7
+        self.SubCmd = 0x05
+        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 = 0xA7
+        self.SubCmd = 0x05
+        self.TrainType = 0
+        self.UseItemCnt = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMPetTrain)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A7 05 宠物培养 //tagCMPetTrain:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TrainType:%d,
+                                UseItemCnt:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TrainType,
+                                self.UseItemCnt
+                                )
+        return DumpString
+
+
+m_NAtagCMPetTrain=tagCMPetTrain()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMPetTrain.Cmd,m_NAtagCMPetTrain.SubCmd))] = m_NAtagCMPetTrain
+
+
+#------------------------------------------------------
 # A8 04 购买VIP礼包 #tagCMBuyVIPItem
 
 class  tagCMBuyVIPItem(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 7897928..63f01bd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -58,6 +58,19 @@
                         ("DWORD", "NextItemID", 0),
                         ),
 
+                "LingQiTrain":(
+                        ("BYTE", "EquipPlace", 1),
+                        ("BYTE", "TrainType", 1),
+                        ("BYTE", "TrainLV", 1),
+                        ("WORD", "NeedRealmLV", 0),
+                        ("DWORD", "EatCntTotal", 0),
+                        ("DWORD", "EatCntEverytime", 0),
+                        ("list", "EatItemAttrTypeList", 0),
+                        ("list", "EatItemAttrValueList", 0),
+                        ("list", "LVAttrTypeList", 0),
+                        ("list", "LVAttrValueList", 0),
+                        ),
+
                 "Realm":(
                         ("WORD", "Lv", 1),
                         ("BYTE", "LvLarge", 0),
@@ -256,6 +269,18 @@
                         ("DWORD", "InitFightPower", 0),
                         ),
 
+                "PetTrain":(
+                        ("BYTE", "TrainType", 1),
+                        ("BYTE", "TrainLV", 1),
+                        ("WORD", "NeedRealmLV", 0),
+                        ("DWORD", "EatCntTotal", 0),
+                        ("DWORD", "EatCntEverytime", 0),
+                        ("list", "EatItemAttrTypeList", 0),
+                        ("list", "EatItemAttrValueList", 0),
+                        ("list", "LVAttrTypeList", 0),
+                        ("list", "LVAttrValueList", 0),
+                        ),
+
                 "EquipDecompose":(
                         ("WORD", "LV", 1),
                         ("DWORD", "UpNeedExp", 0),
@@ -282,6 +307,18 @@
                         ("WORD", "NeedEatCount", 0),
                         ("list", "LVAttrType", 0),
                         ("list", "LVAttrValue", 0),
+                        ),
+
+                "HorseTrain":(
+                        ("BYTE", "TrainType", 1),
+                        ("BYTE", "TrainLV", 1),
+                        ("WORD", "NeedRealmLV", 0),
+                        ("DWORD", "EatCntTotal", 0),
+                        ("DWORD", "EatCntEverytime", 0),
+                        ("list", "EatItemAttrTypeList", 0),
+                        ("list", "EatItemAttrValueList", 0),
+                        ("list", "LVAttrTypeList", 0),
+                        ("list", "LVAttrValueList", 0),
                         ),
 
                 "HorseSkinPlus":(
@@ -1911,6 +1948,33 @@
     def GetUpCostItem(self): return self.UpCostItem # 突破需要材料
     def GetNextItemID(self): return self.NextItemID # 突破后物品ID
 
+# 灵器培养表
+class IPY_LingQiTrain():
+    
+    def __init__(self):
+        self.EquipPlace = 0
+        self.TrainType = 0
+        self.TrainLV = 0
+        self.NeedRealmLV = 0
+        self.EatCntTotal = 0
+        self.EatCntEverytime = 0
+        self.EatItemAttrTypeList = []
+        self.EatItemAttrValueList = []
+        self.LVAttrTypeList = []
+        self.LVAttrValueList = []
+        return
+        
+    def GetEquipPlace(self): return self.EquipPlace # 灵器装备位
+    def GetTrainType(self): return self.TrainType # 培养类型
+    def GetTrainLV(self): return self.TrainLV # 培养等阶
+    def GetNeedRealmLV(self): return self.NeedRealmLV # 培养所需境界
+    def GetEatCntTotal(self): return self.EatCntTotal # 升阶所需个数(非累计)
+    def GetEatCntEverytime(self): return self.EatCntEverytime # 每次培养消耗x个
+    def GetEatItemAttrTypeList(self): return self.EatItemAttrTypeList # 每X个培养丹增加属性类型=EatCntEverytime
+    def GetEatItemAttrValueList(self): return self.EatItemAttrValueList # 每X个培养丹增加属性值=EatCntEverytime
+    def GetLVAttrTypeList(self): return self.LVAttrTypeList # 每级额外属性类(非累积)
+    def GetLVAttrValueList(self): return self.LVAttrValueList # 每级额外属性值(非累积)
+
 # 境界表
 class IPY_Realm():
     
@@ -2327,6 +2391,31 @@
     def GetSkillUnLockSys(self): return self.SkillUnLockSys # 灵兽技能解锁提示
     def GetInitFightPower(self): return self.InitFightPower # 初始战力
 
+# 灵宠培养表
+class IPY_PetTrain():
+    
+    def __init__(self):
+        self.TrainType = 0
+        self.TrainLV = 0
+        self.NeedRealmLV = 0
+        self.EatCntTotal = 0
+        self.EatCntEverytime = 0
+        self.EatItemAttrTypeList = []
+        self.EatItemAttrValueList = []
+        self.LVAttrTypeList = []
+        self.LVAttrValueList = []
+        return
+        
+    def GetTrainType(self): return self.TrainType # 培养类型
+    def GetTrainLV(self): return self.TrainLV # 培养等阶
+    def GetNeedRealmLV(self): return self.NeedRealmLV # 培养所需境界
+    def GetEatCntTotal(self): return self.EatCntTotal # 升阶所需个数(非累计)
+    def GetEatCntEverytime(self): return self.EatCntEverytime # 每次培养消耗x个
+    def GetEatItemAttrTypeList(self): return self.EatItemAttrTypeList # 每X个培养丹增加属性类型=EatCntEverytime
+    def GetEatItemAttrValueList(self): return self.EatItemAttrValueList # 每X个培养丹增加属性值=EatCntEverytime
+    def GetLVAttrTypeList(self): return self.LVAttrTypeList # 每级额外属性类(非累积)
+    def GetLVAttrValueList(self): return self.LVAttrValueList # 每级额外属性值(非累积)
+
 # 装备分解属性表
 class IPY_EquipDecompose():
     
@@ -2386,6 +2475,31 @@
     def GetNeedEatCount(self): return self.NeedEatCount # 升级所需个数(非累计)
     def GetLVAttrType(self): return self.LVAttrType # 每级额外属性类型(非累积)
     def GetLVAttrValue(self): return self.LVAttrValue # 每级额外属性值(非累积)
+
+# 坐骑培养表
+class IPY_HorseTrain():
+    
+    def __init__(self):
+        self.TrainType = 0
+        self.TrainLV = 0
+        self.NeedRealmLV = 0
+        self.EatCntTotal = 0
+        self.EatCntEverytime = 0
+        self.EatItemAttrTypeList = []
+        self.EatItemAttrValueList = []
+        self.LVAttrTypeList = []
+        self.LVAttrValueList = []
+        return
+        
+    def GetTrainType(self): return self.TrainType # 培养类型
+    def GetTrainLV(self): return self.TrainLV # 培养等阶
+    def GetNeedRealmLV(self): return self.NeedRealmLV # 培养所需境界
+    def GetEatCntTotal(self): return self.EatCntTotal # 升阶所需个数(非累计)
+    def GetEatCntEverytime(self): return self.EatCntEverytime # 每次培养消耗x个
+    def GetEatItemAttrTypeList(self): return self.EatItemAttrTypeList # 每X个培养丹增加属性类型=EatCntEverytime
+    def GetEatItemAttrValueList(self): return self.EatItemAttrValueList # 每X个培养丹增加属性值=EatCntEverytime
+    def GetLVAttrTypeList(self): return self.LVAttrTypeList # 每级额外属性类(非累积)
+    def GetLVAttrValueList(self): return self.LVAttrValueList # 每级额外属性值(非累积)
 
 # 坐骑幻化表
 class IPY_HorseSkinPlus():
@@ -5719,6 +5833,8 @@
         self.ipyRolePointLen = len(self.ipyRolePointCache)
         self.ipyLingQiAttrCache = self.__LoadFileData("LingQiAttr", IPY_LingQiAttr)
         self.ipyLingQiAttrLen = len(self.ipyLingQiAttrCache)
+        self.ipyLingQiTrainCache = self.__LoadFileData("LingQiTrain", IPY_LingQiTrain)
+        self.ipyLingQiTrainLen = len(self.ipyLingQiTrainCache)
         self.ipyRealmCache = self.__LoadFileData("Realm", IPY_Realm)
         self.ipyRealmLen = len(self.ipyRealmCache)
         self.ipyGodWeaponCache = self.__LoadFileData("GodWeapon", IPY_GodWeapon)
@@ -5759,6 +5875,8 @@
         self.ipyAttrFruitLen = len(self.ipyAttrFruitCache)
         self.ipyPetInfoCache = self.__LoadFileData("PetInfo", IPY_PetInfo)
         self.ipyPetInfoLen = len(self.ipyPetInfoCache)
+        self.ipyPetTrainCache = self.__LoadFileData("PetTrain", IPY_PetTrain)
+        self.ipyPetTrainLen = len(self.ipyPetTrainCache)
         self.ipyEquipDecomposeCache = self.__LoadFileData("EquipDecompose", IPY_EquipDecompose)
         self.ipyEquipDecomposeLen = len(self.ipyEquipDecomposeCache)
         self.ipyPetClassCostCache = self.__LoadFileData("PetClassCost", IPY_PetClassCost)
@@ -5767,6 +5885,8 @@
         self.ipyPetEatEquipLen = len(self.ipyPetEatEquipCache)
         self.ipyHorseLVUpCache = self.__LoadFileData("HorseLVUp", IPY_HorseLVUp)
         self.ipyHorseLVUpLen = len(self.ipyHorseLVUpCache)
+        self.ipyHorseTrainCache = self.__LoadFileData("HorseTrain", IPY_HorseTrain)
+        self.ipyHorseTrainLen = len(self.ipyHorseTrainCache)
         self.ipyHorseSkinPlusCache = self.__LoadFileData("HorseSkinPlus", IPY_HorseSkinPlus)
         self.ipyHorseSkinPlusLen = len(self.ipyHorseSkinPlusCache)
         self.ipyPlayerLVCache = self.__LoadFileData("PlayerLV", IPY_PlayerLV)
@@ -6263,6 +6383,8 @@
     def GetRolePointByIndex(self, index): return self.ipyRolePointCache[index]
     def GetLingQiAttrCount(self): return self.ipyLingQiAttrLen
     def GetLingQiAttrByIndex(self, index): return self.ipyLingQiAttrCache[index]
+    def GetLingQiTrainCount(self): return self.ipyLingQiTrainLen
+    def GetLingQiTrainByIndex(self, index): return self.ipyLingQiTrainCache[index]
     def GetRealmCount(self): return self.ipyRealmLen
     def GetRealmByIndex(self, index): return self.ipyRealmCache[index]
     def GetGodWeaponCount(self): return self.ipyGodWeaponLen
@@ -6303,6 +6425,8 @@
     def GetAttrFruitByIndex(self, index): return self.ipyAttrFruitCache[index]
     def GetPetInfoCount(self): return self.ipyPetInfoLen
     def GetPetInfoByIndex(self, index): return self.ipyPetInfoCache[index]
+    def GetPetTrainCount(self): return self.ipyPetTrainLen
+    def GetPetTrainByIndex(self, index): return self.ipyPetTrainCache[index]
     def GetEquipDecomposeCount(self): return self.ipyEquipDecomposeLen
     def GetEquipDecomposeByIndex(self, index): return self.ipyEquipDecomposeCache[index]
     def GetPetClassCostCount(self): return self.ipyPetClassCostLen
@@ -6311,6 +6435,8 @@
     def GetPetEatEquipByIndex(self, index): return self.ipyPetEatEquipCache[index]
     def GetHorseLVUpCount(self): return self.ipyHorseLVUpLen
     def GetHorseLVUpByIndex(self, index): return self.ipyHorseLVUpCache[index]
+    def GetHorseTrainCount(self): return self.ipyHorseTrainLen
+    def GetHorseTrainByIndex(self, index): return self.ipyHorseTrainCache[index]
     def GetHorseSkinPlusCount(self): return self.ipyHorseSkinPlusLen
     def GetHorseSkinPlusByIndex(self, index): return self.ipyHorseSkinPlusCache[index]
     def GetPlayerLVCount(self): return self.ipyPlayerLVLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
index e190120..06d09e7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -327,6 +327,10 @@
     GameWorld.DebugLog("登录更新装备相关值汇总: orangeEquipCount=%s,totalStar=%s,totalPlusLV=%s,totalEvolveLV=%s,totalWashLV=%s,totalStoneLV=%s" 
                        % (orangeEquipCount, totalStar, totalPlusLV, totalEvolveLV, totalWashLV, totalStoneLV))
     Sync_EquipPartSuiteActivateInfo(curPlayer)
+    
+    for equipPlace in ChConfig.EquipPlace_LingQi:
+        Sync_LingQiTrainData(curPlayer, equipPlace)
+        
     return
 
 ## 刷新所有装备对人物属性的改变
@@ -605,6 +609,111 @@
     PlayerControl.WorldNotify(0, 'SpiritOrgan', [curPlayer.GetName(), breakItemID, nextItemID])
     return
 
+#// A3 27 灵器培养 #tagCMLingQiTrain
+#
+#struct    tagCMLingQiTrain
+#{
+#    tagHead        Head;
+#    BYTE        EquipPlace;        //灵器装备位
+#    BYTE        TrainType;        //培养类型: 1-基础培养,2-特殊培养,3-百分比培养
+#    WORD        UseItemCnt;        //消耗材料个数
+#};
+def OnLingQiTrain(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    
+    equipPlace = clientData.EquipPlace # 灵器装备位
+    trainType = clientData.TrainType # 培养类型
+    costItemCount = clientData.UseItemCnt # 消耗材料个数
+    
+    trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainLV % (equipPlace, trainType))
+    curEatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainItemCount % (equipPlace, trainType))
+    GameWorld.DebugLog("灵器培养: equipPlace=%s,trainType=%s,trainLV=%s,costItemCount=%s,curEatItemCount=%s" 
+                       % (equipPlace, trainType, trainLV, costItemCount, curEatItemCount))
+    
+    if equipPlace not in ChConfig.EquipPlace_LingQi:
+        return
+    
+    if trainType <= 0 or trainType > GetLingQiTrainTypes():
+        return
+    
+    if trainLV <= 0:
+        GameWorld.DebugLog("    培养未激活  trainType=%s" % trainType)
+        return
+    
+    trainIpyData = IpyGameDataPY.GetIpyGameData("LingQiTrain", equipPlace, trainType, trainLV)
+    if not trainIpyData:
+        return
+    
+    needRealmLV = trainIpyData.GetNeedRealmLV()
+    curRealmLV = curPlayer.GetOfficialRank()
+    if curRealmLV < needRealmLV:
+        GameWorld.DebugLog("    境界不足,无法培养!  curRealmLV(%s) < needRealmLV(%s)" % (curRealmLV, needRealmLV))
+        return
+    
+    needEatCountTotal = trainIpyData.GetEatCntTotal()
+    if not needEatCountTotal:
+        GameWorld.DebugLog("    该培养已满级!")
+        return
+    
+    costItemIDList = IpyGameDataPY.GetFuncEvalCfg("LingQiTrain", 1)
+    costItemID = costItemIDList[trainType - 1]
+    if not costItemID or not costItemCount:
+        return
+    
+    costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)
+    lackCnt = costItemCount - bindCnt - unBindCnt
+    if lackCnt > 0:
+        GameWorld.DebugLog("    消耗道具不足,无法培养!costItemID=%s,costItemCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s" 
+                           % (costItemID, costItemCount, bindCnt, unBindCnt, lackCnt))
+        return
+    
+    delCnt = costItemCount
+    
+    # 扣除消耗
+    if delCnt:
+        ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, "LingQiTrain")
+        
+    updClassLV = trainLV
+    updEatItemCount = curEatItemCount + costItemCount
+    GameWorld.DebugLog("    updEatItemCount=%s,needEatCountTotal=%s" % (updEatItemCount, needEatCountTotal))
+    
+    if updEatItemCount >= needEatCountTotal:
+        updClassLV += 1
+        updEatItemCount -= needEatCountTotal
+        GameWorld.DebugLog("    进阶: updClassLV=%s,updEatItemCount=%s" % (updClassLV, updEatItemCount))
+        
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LingQiTrainLV % (equipPlace, trainType), updClassLV)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LingQiTrainItemCount % (equipPlace, trainType), updEatItemCount)
+    
+    # 升阶
+    if updClassLV > trainLV:
+        pass
+    
+    Sync_LingQiTrainData(curPlayer, equipPlace)
+    # 刷属性
+    RefreshPlayerLingQiEquipAttr(curPlayer)
+    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
+    return
+
+def GetLingQiTrainTypes():
+    return len(IpyGameDataPY.GetFuncEvalCfg("LingQiTrain", 1))
+
+def Sync_LingQiTrainData(curPlayer, equipPlace):
+    clientPack = ChPyNetSendPack.tagMCLingQiTrainInfo()
+    clientPack.EquipPlace = equipPlace
+    clientPack.TrainLVList = []
+    clientPack.TrainItemCountList = []
+    for trainType in xrange(1, GetLingQiTrainTypes() + 1):
+        trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainLV % (equipPlace, trainType))
+        if trainLV == 0:
+            trainLV = 1
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LingQiTrainLV % (equipPlace, trainType), trainLV)
+        clientPack.TrainLVList.append(trainLV)
+        clientPack.TrainItemCountList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainItemCount % (equipPlace, trainType)))
+    clientPack.TrainTypes = len(clientPack.TrainLVList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
 def RefreshPlayerLingQiEquipAttr(curPlayer):
     ''' 刷新玩家灵器装备属性
     '''
@@ -659,9 +768,67 @@
                 PlayerControl.CalcAttrDict_Type(lqAttrID, lqAttrValue, lingQiAttrList)
                 
         #灵器各部位其他属性
-        if equipPlace == ShareDefine.retWing:
-            PlayerWing.CalcWingAttrEx(curPlayer, curEquip, allAttrList)
+        #if equipPlace == ShareDefine.retWing:
+        #    PlayerWing.CalcWingAttrEx(curPlayer, curEquip, allAttrList)
+            
+    # 新培养属性
+    guardTrainAttrList = [{} for _ in range(4)]
+    wingTrainAttrList = [{} for _ in range(4)]
+    peerlessWeaponTrainAttrList = [{} for _ in range(4)]
+    peerlessWeapon2TrainAttrList = [{} for _ in range(4)]
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in xrange(ipyDataMgr.GetLingQiTrainCount()):
+        trainIpyData = ipyDataMgr.GetLingQiTrainByIndex(index)
+        equipPlace = trainIpyData.GetEquipPlace()
+        trainType = trainIpyData.GetTrainType()
+        dataTrainLV = trainIpyData.GetTrainLV()
         
+        if equipPlace == ShareDefine.retGuard1:
+            lingQiTrainAttrList = guardTrainAttrList
+        elif equipPlace == ShareDefine.retWing:
+            lingQiTrainAttrList = wingTrainAttrList
+        elif equipPlace == ShareDefine.retPeerlessWeapon:
+            lingQiTrainAttrList = peerlessWeaponTrainAttrList
+        elif equipPlace == ShareDefine.retPeerlessWeapon2:
+            lingQiTrainAttrList = peerlessWeapon2TrainAttrList
+        else:
+            continue
+        
+        trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainLV % (equipPlace, trainType))
+        
+        if dataTrainLV > trainLV:
+            continue
+        elif dataTrainLV == trainLV:
+            trainItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainItemCount % (equipPlace, trainType))
+        else:
+            trainItemCount = trainIpyData.GetEatCntTotal()
+            
+        # 等阶额外属性
+        lvAttrTypeList = trainIpyData.GetLVAttrTypeList()
+        lvAttrValueList = trainIpyData.GetLVAttrValueList()
+        for i, attrID in enumerate(lvAttrTypeList):
+            attrValue = lvAttrValueList[i]
+            PlayerControl.CalcAttrDict_Type(attrID, attrValue, lingQiTrainAttrList)
+            
+        # 培养丹增加属性
+        eatCntEverytime = trainIpyData.GetEatCntEverytime()
+        if trainItemCount and eatCntEverytime:
+            eatItemAttrTypeList = trainIpyData.GetEatItemAttrTypeList()
+            eatItemAttrValueList = trainIpyData.GetEatItemAttrValueList()
+            attrMultiple = trainItemCount / eatCntEverytime
+            for i, attrID in enumerate(eatItemAttrTypeList):
+                attrValue = eatItemAttrValueList[i]
+                PlayerControl.CalcAttrDict_Type(attrID, attrValue * attrMultiple, lingQiTrainAttrList)
+                
+    #GameWorld.DebugLog("守护培养属性: %s" % guardTrainAttrList)
+    #GameWorld.DebugLog("翅膀培养属性: %s" % wingTrainAttrList)
+    #GameWorld.DebugLog("灭世培养属性: %s" % peerlessWeaponTrainAttrList)
+    #GameWorld.DebugLog("噬魂培养属性: %s" % peerlessWeapon2TrainAttrList)
+    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_GuardTarin, guardTrainAttrList)
+    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_WingTarin, wingTrainAttrList)
+    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PeerlessWeaponTrain, peerlessWeaponTrainAttrList)
+    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PeerlessWeapon2Train, peerlessWeapon2TrainAttrList)
+    
     lqFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))
     curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_LingQi, lqFightPowerEx)
     
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 0fbe413..475d84e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -7154,6 +7154,14 @@
 def GetSkillReducePer7(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_SkillReducePer7)
 def SetSkillReducePer7(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_SkillReducePer7, value)
 
+#---诛仙一击概率---
+def GetZhuXianRate(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ZhuxianRate)
+def SetZhuXianRate(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_ZhuxianRate, value)
+
+#---诛仙护体减伤---
+def GetZhuXianReducePer(curPlayer): return 0#curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ZhuXianReducePer)
+def SetZhuXianReducePer(curPlayer, value): return #curPlayer.SetDict(ChConfig.Def_PlayerKey_ZhuXianReducePer, value)
+
 ## 计算功能背包物品属性 
 #  @param curPlayer 当前玩家
 #  @param packType 背包类型
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 016cccc..05b6f0c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -617,6 +617,18 @@
 
 Def_Effect_ReduceSkillCDPer = 149   # 减少技能CD, a值为万分率
 
+Def_Effect_ZhuXianRate = 150   # 诛仙一击: 概率直接减少BOSS当前10%血量
+Def_Effect_ZhuXianReducePer = 151   # 诛仙护体: 受到BOSS伤害减免 万分率
+
+Def_Effect_HorseMaxHPPer = 152 # 坐骑生命加成
+Def_Effect_PetAtkPer = 153 # 灵宠攻击加成
+Def_Effect_HorseTrainAttrPer = 154 # 坐骑培养属性加成(攻防血)
+Def_Effect_PetTrainAttrPer = 155 # 灵宠培养属性加成(攻防血)
+Def_Effect_GuardTrainAttrPer = 156 # 守护培养属性加成(攻防血)
+Def_Effect_WingTrainAttrPer = 157 # 翅膀培养属性加成(攻防血)
+Def_Effect_PeerlessWeaponTrainAttrPer = 158 # 灭世培养属性加成(攻防血)
+Def_Effect_PeerlessWeapon2TrainAttrPer = 159 # 弑神培养属性加成(攻防血)
+
 #增加%d物理伤害值,其中a值为伤害值
 Def_Effect_AddAtk = 1005
 #增加%d魔法伤害值,其中a值为伤害值
@@ -1009,7 +1021,7 @@
                            TYPE_Price_Environment:CDBPlayerRefresh_Environment,
                            }
 
-# 支持负值的货币及对应0418刷新类型,不需要通知的话配置None
+# 支持负值的货币及对应0418刷新类型
 MoneyMinusRefreshDict = {
                          1:CDBPlayerRefresh_MoneyMinusGold,
                          2:CDBPlayerRefresh_MoneyMinusGoldPaper,
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 a151b96..268f375 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
@@ -188,6 +188,16 @@
    [lambda curObj:PlayerControl.GetSkillReducePer5(curObj), lambda curObj, value:PlayerControl.SetSkillReducePer5(curObj, value), ShareDefine.CDBPlayerRefresh_SkillReducePer5, 1, 0],    # 受到技能伤害减少5
    [lambda curObj:PlayerControl.GetSkillReducePer6(curObj), lambda curObj, value:PlayerControl.SetSkillReducePer6(curObj, value), ShareDefine.CDBPlayerRefresh_SkillReducePer6, 1, 0],    # 受到技能伤害减少6
    [lambda curObj:PlayerControl.GetSkillReducePer7(curObj), lambda curObj, value:PlayerControl.SetSkillReducePer7(curObj, value), ShareDefine.CDBPlayerRefresh_SkillReducePer7, 1, 0],    # 受到技能伤害减少7
+   [lambda curObj:PlayerControl.GetZhuXianRate(curObj), lambda curObj, value:PlayerControl.SetZhuXianRate(curObj, value), 0, 0, 0],    # 诛仙一击: 概率直接减少BOSS当前10%血量
+   [lambda curObj:PlayerControl.GetZhuXianReducePer(curObj), lambda curObj, value:PlayerControl.SetZhuXianReducePer(curObj, value), 0, 0, 0],    # 诛仙护体: 受到BOSS伤害减免 万分率
+   [lambda curObj:PlayerControl.GetHorseMaxHPPer(curObj), lambda curObj, value:PlayerControl.SetHorseMaxHPPer(curObj, value), 0, 0, 0],      # 坐骑生命加成
+   [lambda curObj:PlayerControl.GetPetAtkPer(curObj), lambda curObj, value:PlayerControl.SetPetAtkPer(curObj, value), 0, 0, 0],      # 灵宠攻击加成
+   [lambda curObj:PlayerControl.GetHorseTrainAttrPer(curObj), lambda curObj, value:PlayerControl.SetHorseTrainAttrPer(curObj, value), 0, 0, 0],      # 坐骑培养属性加成
+   [lambda curObj:PlayerControl.GetPetTrainAttrPer(curObj), lambda curObj, value:PlayerControl.SetPetTrainAttrPer(curObj, value), 0, 0, 0],      # 灵宠培养属性加成
+   [lambda curObj:PlayerControl.GetGuardTrainAttrPer(curObj), lambda curObj, value:PlayerControl.SetGuardTrainAttrPer(curObj, value), 0, 0, 0],      # 守护培养属性加成
+   [lambda curObj:PlayerControl.GetWingTrainAttrPer(curObj), lambda curObj, value:PlayerControl.SetWingTrainAttrPer(curObj, value), 0, 0, 0],      # 翅膀培养属性加成
+   [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],      # 弑神培养属性加成
 ]
 
 ## 通过索引获得属性值

--
Gitblit v1.8.0