From 6d52c69be5170f6518ac9be8aa05bae7bfd26b54 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 21 七月 2025 14:24:43 +0800
Subject: [PATCH] 121 【武将】武将系统-服务端(去除旧属性;优化命令Hero、PrintFightPower;优化武将技能战力计算;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py             |  302 +++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py             |   20 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                  |  372 -------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                  |  181 ---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py              |  116 --
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAutoCheckOnline.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py                  |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                   |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py           |  321 +++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py     |  121 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py             |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_502.py     |   56 
 /dev/null                                                                                           |  569 -----------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py  |   86 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py          |   26 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py             |   27 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                          |   21 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py              |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                |   20 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py         |  104 --
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py |   82 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                     |  386 -------
 22 files changed, 567 insertions(+), 2,259 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index b3b91b1..cf31d58 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1056,27 +1056,6 @@
 PacketSubCMD_1=0x20
 PacketCallFunc_1=OnTalk
 
-;属性果实
-[PlayerAttrFruit]
-ScriptName = Player\PlayerAttrFruit.py
-Writer = xdh
-Releaser = xdh
-RegType = 0
-RegisterPackCount = 3
-
-PacketCMD_1=0xA3
-PacketSubCMD_1=0x2B
-PacketCallFunc_1=OnEatAllFruitItem
-
-PacketCMD_2=0xA3
-PacketSubCMD_2=0x2A
-PacketCallFunc_2=OnRecycleAttrFruit
-
-PacketCMD_3=0xA3
-PacketSubCMD_3=0x17
-PacketCallFunc_3=OnAddFruitUseLimit
-
-
 ;开服活动
 [OpenServerCampaign]
 ScriptName = Player\OpenServerCampaign.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 966c29e..8b2fc9a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -187,51 +187,23 @@
 # 卡牌项目玩家/主公属性仅为中间层属性,并非最终属性,最终属性体现在卡牌上,暂定全部前端自己算
 # 所以仅配置战斗场景需要同步的属性即可
 CDBRefresh_AttrIDDict = {
-#                      AttrID_Atk:[IPY_PlayerDefine.CDBPlayerRefresh_MAXATK, 0],
-#                      AttrID_Def:[IPY_PlayerDefine.CDBPlayerRefresh_DEF, 0],
-                      AttrID_MaxHP:[IPY_PlayerDefine.CDBPlayerRefresh_MaxHP, 1],
-                      AttrID_HP:[IPY_PlayerDefine.CDBPlayerRefresh_HP, 1],
-#                      AttrID_Speed:[ShareDefine.CDBPlayerRefresh_SpeedValue, 0],
-#                      AttrID_AtkSpeed:[IPY_PlayerDefine.CDBPlayerRefresh_BattleValEx1, 0],
-                      AttrID_XP:[IPY_GameWorld.CDBPlayerRefresh_XP, 0],
-#                      AttrID_StunRate:[ShareDefine.CDBPlayerRefresh_StunRate, 0],
-#                      AttrID_StunRateDef:[ShareDefine.CDBPlayerRefresh_StunRateDef, 0],
-#                      AttrID_SuperHitRate:[IPY_PlayerDefine.CDBPlayerRefresh_SuperHitRate, 0],
-#                      AttrID_SuperHitRateDef:[ShareDefine.CDBPlayerRefresh_SuperHitRateDef, 0],
-#                      AttrID_ComboRate:[ShareDefine.CDBPlayerRefresh_ComboRate, 0],
-#                      AttrID_ComboRateDef:[ShareDefine.CDBPlayerRefresh_ComboRateDef, 0],
-#                      AttrID_MissRate:[IPY_PlayerDefine.CDBPlayerRefresh_Miss, 0],
-#                      AttrID_MissRateDef:[IPY_PlayerDefine.CDBPlayerRefresh_HIT, 0],
-#                      AttrID_ParryRate:[ShareDefine.CDBPlayerRefresh_ParryRate, 0],
-#                      AttrID_ParryRateDef:[ShareDefine.CDBPlayerRefresh_ParryRateDef, 0],
-#                      AttrID_SuckHPPer:[ShareDefine.CDBPlayerRefresh_SuckHPPer, 0],
-#                      AttrID_SuckHPPerDef:[ShareDefine.CDBPlayerRefresh_SuckHPPerDef, 0],
-#                      AttrID_FinalDamPer:[ShareDefine.CDBPlayerRefresh_FinalDamPer, 0],
-#                      AttrID_FinalDamPerDef:[ShareDefine.CDBPlayerRefresh_FinalDamPerDef, 0],
-#                      AttrID_PhyDamPer:[ShareDefine.CDBPlayerRefresh_PhyDamPer, 0],
-#                      AttrID_PhyDamPerDef:[ShareDefine.CDBPlayerRefresh_PhyDamPerDef, 0],
-#                      AttrID_MagDamPer:[ShareDefine.CDBPlayerRefresh_MagDamPer, 0],
-#                      AttrID_MagDamPerDef:[ShareDefine.CDBPlayerRefresh_MagDamPerDef, 0],
-#                      AttrID_NormalSkillPer:[ShareDefine.CDBPlayerRefresh_NormalSkillPer, 0],
-#                      AttrID_NormalSkillPerDef:[ShareDefine.CDBPlayerRefresh_NormalSkillPerDef, 0],
-#                      AttrID_AngerSkillPer:[ShareDefine.CDBPlayerRefresh_AngerSkillPer, 0],
-#                      AttrID_AngerSkillPerDef:[ShareDefine.CDBPlayerRefresh_AngerSkillPerDef, 0],
-#                      AttrID_SuperDamPer:[ShareDefine.CDBPlayerRefresh_SuperDamPer, 0],
-#                      AttrID_SuperDamPerDef:[ShareDefine.CDBPlayerRefresh_SuperDamPerDef, 0],
-#                      AttrID_CurePer:[ShareDefine.CDBPlayerRefresh_CurePer, 0],
-#                      AttrID_CurePerDef:[ShareDefine.CDBPlayerRefresh_CurePerDef, 0],
-#                      AttrID_ShieldPer:[ShareDefine.CDBPlayerRefresh_ShieldPer, 0],
-#                      AttrID_ShieldPerDef:[ShareDefine.CDBPlayerRefresh_ShieldPerDef, 0],
-#                      AttrID_DOTPer:[ShareDefine.CDBPlayerRefresh_DOTPer, 0],
-#                      AttrID_DOTPerDef:[ShareDefine.CDBPlayerRefresh_DOTPerDef, 0],
-                      }
+                         AttrID_MaxHP:[IPY_PlayerDefine.CDBPlayerRefresh_MaxHP, 1],
+                         AttrID_HP:[IPY_PlayerDefine.CDBPlayerRefresh_HP, 1],
+                         AttrID_XP:[IPY_GameWorld.CDBPlayerRefresh_XP, 0],
+                         }
 
 #刷属性分类索引
 Def_CalcAttrList = (
-Def_CalcAttr_LV, # 角色等级 0
+Def_CalcAttr_LV, # 主公等级 0
 Def_CalcAttr_MainEquip, # 主装备 1
 Def_CalcAttr_HeroBook, # 武将图鉴 2
 ) = range(3)
+
+CalcAttrName = {
+                Def_CalcAttr_LV:"主公等级",
+                Def_CalcAttr_MainEquip:"主装备",
+                Def_CalcAttr_HeroBook:"武将图鉴",
+                }
 
 ##-----------------------------------------------------------------------------------------------
 
@@ -443,27 +415,9 @@
 TYPE_Calc_FacePicDefPer,                 # 头像框防御加成
 ) = range(1, Def_Calc_AllAttrType_MAX)
 
-## 支持大数值属性,超过20E
-TYPE_BIGVALUE_ATTR = [TYPE_Calc_AttrHP, TYPE_Calc_AttrMaxHP]
 
 ## NPC 专属属性
 TYPE_NPCAttr_Calc = [TYPE_Calc_AtkInterval]
-
-
-# 衰减递增的属性列表, 衰减递增算法: 1-(1-a1)*(1-a2);   非衰减递增算法:  a1+a2
-TYPE_Calc_DeclineList = []
-
-#宠物属性列表
-Def_Pet_Attr = []
-#[ TYPE_Calc_PetSTR, TYPE_Calc_PetPNE, TYPE_Calc_PetPHY, TYPE_Calc_PetCON ]
-#===============================================================================
-# 1006 增加%d力量
-# 1007 增加%d筋骨
-# 1008 增加%d体魄
-# 1009 增加%d真元
-#===============================================================================
-#宠物基础属性效果ID
-Def_PetBaseEffectList = range(5000, 5007 + 1)
 
 #---------------------------------------------------------------------------
 Def_ItemCount_Max = 2000000000 # 物品最大叠加上限
@@ -3289,10 +3243,6 @@
 Def_PlayerKey_LastAttackerObjID = "LastAttackerObjID" # 被攻击者记录的最近攻击玩家ID
 Def_PlayerKey_HadInitFruitAttr = "HadInitFruitAttr" # 是否已经刷新过果实属性
 
-#功能索引ShareDefine.Def_AttrFruitFuncList
-Def_PlayerKey_FruitAttr = "FruitAttr_%s_%s" # 属性果实增加的属性,参数为(功能索引, 物品效果id)
-Def_PlayerKey_FruitFightPowerEx = "FruitFightPowerEx_%s" # 属性果实增加的附加战力,参数为(功能索引)
-
 Def_PDict_QueryTechLVUPState = "QueryTechLVUPState"  # 查询科技等级提升状态
 
 Def_PDict_PKStateTick = "PKStateTick"  # PK状态tick,只要有一方发起攻击,双方均进入PK状态
@@ -3560,10 +3510,6 @@
 Def_PDict_MixLoginDay = "MixLoginDay"  # 合服首登处理标记天
 
 Def_PDict_AddPointValue = "AddPointValue_%s"  # 已加属性点数, 参数(属性ID)
-Def_PDict_AttrFruitEatCnt = "AttrFruitEatCnt_%s"  # 已吃属性果实个数,参数为物品id
-Def_PDict_AttrFruitAddValue = "AttrFruitAddValue_%s"  # 已吃属性果实增加的属性,参数为物品id
-Def_PDict_AttrFruitAddItemCnt = "FruitAddItemCnt_%s"  # 增幅丹增加上限数,参数为果实物品id
-Def_PDict_AttrFruitItemBreakCnt = "FruitItemBreakCnt_%s"  # 增幅丹突破次数,参数为果实物品id
 
 Def_PDict_NobleLV = "NobleLV" # 贵族等级, 0位为不同贵族模式版本切换标记位, 从1位开始表示每种等级贵族开通情况, 1-已开通过;9-永久
 Def_PDict_NobleEndTime = "NobleEndTime_%s" # 贵族到期结束时间<单位s>, 参数为贵族等级, 从1开始
@@ -4408,240 +4354,11 @@
 
 #物品效果(ID或指定类型)对应的属性计算信息 {效果(ID/指定类型):[[属性索引, ...], 是否基础属性,(非)线性]}
 #对应 Def_Calc_AllAttrType_MAX
-ItemEffect_AttrDict = {
-    #基础属性
-    ShareDefine.Def_Effect_Metal:[[TYPE_Calc_Metal], True, TYPE_Linear],
-    ShareDefine.Def_Effect_Wood:[[TYPE_Calc_Wood], True, TYPE_Linear],
-    ShareDefine.Def_Effect_Water:[[TYPE_Calc_Water], True, TYPE_Linear],
-    ShareDefine.Def_Effect_Fire:[[TYPE_Calc_Fire], True, TYPE_Linear],
-    ShareDefine.Def_Effect_Earth:[[TYPE_Calc_Earth], True, TYPE_Linear],
-    
-    #战斗线性
-    ShareDefine.Def_Effect_MaxHP:[[TYPE_Calc_AttrMaxHP], False, TYPE_Linear],      # 最大血量
-    ShareDefine.Def_Effect_MaxMP:[[TYPE_Calc_AttrMaxMP], False, TYPE_Linear],
-    ShareDefine.Def_Effect_Def:[[TYPE_Calc_AttrDEF], False, TYPE_Linear],
-    ShareDefine.Def_Effect_Miss:[[TYPE_Calc_AttrMiss], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SuperHitRate:[[TYPE_Calc_SuperHitRate], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SuperHit:[[TYPE_Calc_SuperHit], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SuperHitReduce:[[TYPE_Calc_SuperHitReduce], False, TYPE_Linear],
-    ShareDefine.Def_Effect_Hit:[[TYPE_Calc_AttrHit], False, TYPE_Linear],
-    ShareDefine.Def_Effect_MinAtk:[[TYPE_Calc_AttrATKMin], False, TYPE_Linear],
-    ShareDefine.Def_Effect_MaxAtk:[[TYPE_Calc_AttrATKMax], False, TYPE_Linear],
-    ShareDefine.Def_Effect_Atk:[[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax], False, TYPE_Linear],
-    #ShareDefine.Def_Effect_Atk:[[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax, 
-    #                             TYPE_Calc_AttrMATKMin, TYPE_Calc_AttrMATKMax], False, TYPE_Linear],
-    ShareDefine.Def_Effect_AddAtk:[[TYPE_Calc_AttrATKMax], False, TYPE_Linear],
-    #ShareDefine.Def_Effect_AddAtk:[[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax], False, TYPE_Linear],
-    #ShareDefine.Def_Effect_AddMAtk:[[TYPE_Calc_AttrMATKMin, TYPE_Calc_AttrMATKMax], False, TYPE_Linear],
-    ShareDefine.Def_Effect_AtkSpeed:[[TYPE_Calc_AttrAtkSpeed], False, TYPE_Linear],
-    ShareDefine.Def_Effect_ToxinDef:[[TYPE_Calc_AttrPoisonDef], False, TYPE_Linear],
-    ShareDefine.Def_Effect_ThunderDef:[[TYPE_Calc_AttrThunderDef], False, TYPE_Linear],    
-    ShareDefine.Def_Effect_IgnoreDefRate:[[TYPE_Calc_IgnoreDefRate], False, TYPE_Linear],
-    ShareDefine.Def_Effect_DamBackPer:[[TYPE_Calc_DamBackPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_GreatHit:[[TYPE_Calc_GreatHit], False, TYPE_Linear],
-    ShareDefine.Def_Effect_LuckyHit:[[TYPE_Calc_LuckyHit], False, TYPE_Linear],
-    ShareDefine.Def_Effect_LuckyHitRate:[[TYPE_Calc_LuckyHitRate], False, TYPE_Linear],
-    ShareDefine.Def_Effect_Luck:[[TYPE_Calc_Luck], False, TYPE_Linear],
-    ShareDefine.Def_Effect_ReduceSkillCDPer:[[TYPE_Calc_ReduceSkillCDPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_IceAtk:[[TYPE_Calc_AttrIceAtk], False, TYPE_Linear],
-    ShareDefine.Def_Effect_IceDef:[[TYPE_Calc_AttrIceDef], False, TYPE_Linear],
-    ShareDefine.Def_Effect_HPRestore:[[TYPE_Calc_HPRestorePer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_DropMoneyPer:[[TYPE_Calc_DropMoneyPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_FightExpRate:[[TYPE_Calc_AttrFightExpRate], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SkillAtkRate:[[TYPE_Calc_SkillAtkRate], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SkillAtkRateReduce:[[TYPE_Calc_SkillAtkRateReduce], False, TYPE_Linear],
-    ShareDefine.Def_Effect_DamagePVP:[[TYPE_Calc_DamagePVP], False, TYPE_Linear],
-    ShareDefine.Def_Effect_DamagePVPReduce:[[TYPE_Calc_DamagePVPReduce], False, TYPE_Linear],
-    ShareDefine.Def_Effect_DamagePerPVP:[[TYPE_Calc_DamagePerPVP], False, TYPE_Linear],
-    ShareDefine.Def_Effect_DamagePerPVPReduce:[[TYPE_Calc_DamagePerPVPReduce], False, TYPE_Linear],
-    ShareDefine.Def_Effect_BleedDamage:[[TYPE_Calc_BleedDamage], False, TYPE_Linear],
-    ShareDefine.Def_Effect_NPCHurtAddPer:[[TYPE_Calc_NPCHurtAddPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_JobAHurtAddPer:[[TYPE_Calc_JobAHurtAddPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_JobBHurtAddPer:[[TYPE_Calc_JobBHurtAddPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_JobCHurtAddPer:[[TYPE_Calc_JobCHurtAddPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_JobAAtkReducePer:[[TYPE_Calc_JobAAtkReducePer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_JobBAtkReducePer:[[TYPE_Calc_JobBAtkReducePer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_JobCAtkReducePer:[[TYPE_Calc_JobCAtkReducePer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SuperHitRateReduce:[[TYPE_Calc_SuperHitRateReduce], False, TYPE_Linear],
-    ShareDefine.Def_Effect_FinalHurt:[[TYPE_Calc_FinalHurt], False, TYPE_Linear],
-    ShareDefine.Def_Effect_FinalHurtReduce:[[TYPE_Calc_FinalHurtReduce], False, TYPE_Linear],
-    ShareDefine.Def_Effect_Speed:[[TYPE_Calc_AttrSpeed], False, TYPE_Linear],
-    ShareDefine.Def_Effect_PetSkillAtkRate:[[TYPE_Calc_PetSkillAtkRate], False, TYPE_Linear],
-    ShareDefine.Def_Effect_OnlyFinalHurt:[[TYPE_Calc_OnlyFinalHurt], False, TYPE_Linear],
-    ShareDefine.Def_Effect_PVPAtkBackHP:[[TYPE_Calc_PVPAtkBackHP], False, TYPE_Linear],
-    ShareDefine.Def_Effect_NormalHurt:[[TYPE_Calc_NormalHurt], False, TYPE_Linear],
-    ShareDefine.Def_Effect_NormalHurtPer:[[TYPE_Calc_NormalHurtPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_FabaoHurt:[[TYPE_Calc_FabaoHurt], False, TYPE_Linear],
-    ShareDefine.Def_Effect_FabaoHurtPer:[[TYPE_Calc_FabaoHurtPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SuperHitRateReduce:[[TYPE_Calc_SuperHitRateReduce], False, TYPE_Linear], # 暴击概率抗性
-    ShareDefine.Def_Effect_DamagePVE:[[TYPE_Calc_DamagePVE], False, TYPE_Linear],  # PVE固定伤害
-    ShareDefine.Def_Effect_BossFinalHurtPer:[[TYPE_Calc_BossFinalHurtPer], False, TYPE_Linear],   # Boss最终伤害万分率
-    ShareDefine.Def_Effect_FinalHurtPer:[[TYPE_Calc_FinalHurtPer], False, TYPE_Linear],   # 最终伤害万分率
-    ShareDefine.Def_Effect_FinalHurtReducePer:[[TYPE_Calc_FinalHurtReducePer], False, TYPE_Linear],   # 最终伤害减少万分
-    ShareDefine.Def_Effect_YinjiTime:[[TYPE_Calc_YinjiTime], False, TYPE_Linear],   # 每X秒自动消失一个印记
-    ShareDefine.Def_Effect_TheFBSkillsCD:[[TYPE_Calc_TheFBSkillsCD], False, TYPE_Linear],   # 减少指定技能组CD XX%
-    ShareDefine.Def_Effect_BurnValue:[[TYPE_Calc_BurnValue], False, TYPE_Linear],   # 灼烧固定伤害
-    ShareDefine.Def_Effect_BurnTimePer:[[TYPE_Calc_BurnTimePer], False, TYPE_Linear],   # 延长灼烧时间百分比
-    ShareDefine.Def_Effect_SubSpeedPer:[[TYPE_Calc_SubSpeedPer], False, TYPE_Linear],   # 减移动速度百分比
-    ShareDefine.Def_Effect_SkillAddPer1:[[TYPE_Calc_SkillAddPer1], False, TYPE_Linear],   # 技能伤害增强1
-    ShareDefine.Def_Effect_SkillAddPer2:[[TYPE_Calc_SkillAddPer2], False, TYPE_Linear],   # 技能伤害增强2
-    ShareDefine.Def_Effect_SkillAddPer3:[[TYPE_Calc_SkillAddPer3], False, TYPE_Linear],   # 技能伤害增强3
-    ShareDefine.Def_Effect_SkillAddPer4:[[TYPE_Calc_SkillAddPer4], False, TYPE_Linear],   # 技能伤害增强4
-    ShareDefine.Def_Effect_SkillAddPer5:[[TYPE_Calc_SkillAddPer5], False, TYPE_Linear],   # 技能伤害增强5
-    ShareDefine.Def_Effect_SkillAddPer6:[[TYPE_Calc_SkillAddPer6], False, TYPE_Linear],   # 技能伤害增强6
-    ShareDefine.Def_Effect_SkillAddPer7:[[TYPE_Calc_SkillAddPer7], False, TYPE_Linear],   # 技能伤害增强7
-    ShareDefine.Def_Effect_SkillReducePer1:[[TYPE_Calc_SkillReducePer1], False, TYPE_Linear],   # 受到技能伤害减少1
-    ShareDefine.Def_Effect_SkillReducePer2:[[TYPE_Calc_SkillReducePer2], False, TYPE_Linear],   # 受到技能伤害减少2
-    ShareDefine.Def_Effect_SkillReducePer3:[[TYPE_Calc_SkillReducePer3], False, TYPE_Linear],   # 受到技能伤害减少3
-    ShareDefine.Def_Effect_SkillReducePer4:[[TYPE_Calc_SkillReducePer4], False, TYPE_Linear],   # 受到技能伤害减少4
-    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_ComboDefRate:[[TYPE_Calc_ComboDefRate], False, TYPE_Linear],
-    ShareDefine.Def_Effect_AtkBackRate:[[TYPE_Calc_AtkBackRate], False, TYPE_Linear],
-    ShareDefine.Def_Effect_AtkBackDefRate:[[TYPE_Calc_AtkBackDefRate], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SuckHPPer:[[TYPE_Calc_SuckHPPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SuckHPDefPer:[[TYPE_Calc_SuckHPDefPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_CurePer:[[TYPE_Calc_CurePer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_CureDefPer:[[TYPE_Calc_CureDefPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_PetStrengthenPer:[[TYPE_Calc_PetStrengthenPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_PetWeakenPer:[[TYPE_Calc_PetWeakenPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SuperHitHurtPer:[[TYPE_Calc_SuperHitHurtPer], False, TYPE_Linear],
-    ShareDefine.Def_Effect_SuperHitHurtDefPer:[[TYPE_Calc_SuperHitHurtDefPer], False, TYPE_Linear],
-    
-    #战斗非线性
-    ShareDefine.Def_Effect_SuperHitPer:[[TYPE_Calc_SuperHit], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_LuckyHitPer:[[TYPE_Calc_LuckyHit], False, TYPE_NoLinear], # 会心一击伤害百分比
-    ShareDefine.Def_Effect_MaxHPPer:[[TYPE_Calc_AttrMaxHP], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_DefPer:[[TYPE_Calc_AttrDEF], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_HitRate:[[TYPE_Calc_AttrHit], False, TYPE_NoLinear],
-    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_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],
-    ShareDefine.Def_Effect_IceDefPer:[[TYPE_Calc_AttrIceDef], False, TYPE_NoLinear],
-    
-    #功能交叉影响的战斗非线性
-    ShareDefine.Def_Effect_BaseAtkAddPer:[[TYPE_Calc_BaseAtkAddPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_BaseMaxHPAddPer:[[TYPE_Calc_BaseMaxHPAddPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_BaseDefAddPer:[[TYPE_Calc_BaseDefAddPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_BaseHitAddPer:[[TYPE_Calc_BaseHitAddPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_BaseMissAddPer:[[TYPE_Calc_BaseMissAddPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_FaQiMaxHPPer:[[TYPE_Calc_FaQiMaxHPPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_FaQiAtkPer:[[TYPE_Calc_FaQiAtkPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_FaQiDefPer:[[TYPE_Calc_FaQiDefPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_GodWeaponMaxHPPer:[[TYPE_Calc_GodWeaponMaxHPPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_GodWeaponAtkPer:[[TYPE_Calc_GodWeaponAtkPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_StoneMaxHPPer:[[TYPE_Calc_StoneMaxHPPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_StoneAtkPer:[[TYPE_Calc_StoneAtkPer], False, TYPE_NoLinear],
-    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_HorseSkinMaxHPPer:[[TYPE_Calc_HorseSkinMaxHPPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_HorseSkinAtkPer:[[TYPE_Calc_HorseSkinAtkPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_HorseSkinDefPer:[[TYPE_Calc_HorseSkinDefPer], 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_LianTiAttrPer:[[TYPE_Calc_LianTiAttrPer], 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],
-    ShareDefine.Def_Effect_TitleMaxHPPer:[[TYPE_Calc_TitleMaxHPPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_TitleAtkPer:[[TYPE_Calc_TitleAtkPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_TitleDefPer:[[TYPE_Calc_TitleDefPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_FaceMaxHPPer:[[TYPE_Calc_FaceMaxHPPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_FaceAtkPer:[[TYPE_Calc_FaceAtkPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_FaceDefPer:[[TYPE_Calc_FaceDefPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_FacePicMaxHPPer:[[TYPE_Calc_FacePicMaxHPPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_FacePicAtkPer:[[TYPE_Calc_FacePicAtkPer], False, TYPE_NoLinear],
-    ShareDefine.Def_Effect_FacePicDefPer:[[TYPE_Calc_FacePicDefPer], False, TYPE_NoLinear],
-    }
+ItemEffect_AttrDict = {}
 
 # 各功能点交叉非线性属性影响提升
 # 注:该非线性层使用的基值是功能点战斗属性;而上面的非线性层使用的基值是当前角色的实际战斗属性
-FuncNoLinearAttrDict = {
-                        TYPE_Calc_BaseAtkAddPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
-                        TYPE_Calc_BaseMaxHPAddPer:[TYPE_Calc_AttrMaxHP],
-                        TYPE_Calc_BaseDefAddPer:[TYPE_Calc_AttrDEF],
-                        TYPE_Calc_BaseHitAddPer:[TYPE_Calc_AttrHit],
-                        TYPE_Calc_BaseMissAddPer:[TYPE_Calc_AttrMiss],
-                        TYPE_Calc_FaQiMaxHPPer:[TYPE_Calc_AttrMaxHP],
-                        TYPE_Calc_FaQiAtkPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
-                        TYPE_Calc_FaQiDefPer:[TYPE_Calc_AttrDEF],
-                        TYPE_Calc_GodWeaponMaxHPPer:[TYPE_Calc_AttrMaxHP],
-                        TYPE_Calc_GodWeaponAtkPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
-                        TYPE_Calc_StoneMaxHPPer:[TYPE_Calc_AttrMaxHP],
-                        TYPE_Calc_StoneAtkPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
-                        TYPE_Calc_StoneBasePer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax, 
-                                                TYPE_Calc_AttrMaxHP, TYPE_Calc_AttrDEF],
-                        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_HorseSkinMaxHPPer:[TYPE_Calc_AttrMaxHP],
-                        TYPE_Calc_HorseSkinAtkPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
-                        TYPE_Calc_HorseSkinDefPer:[TYPE_Calc_AttrDEF],
-                        TYPE_Calc_TitleMaxHPPer:[TYPE_Calc_AttrMaxHP],
-                        TYPE_Calc_TitleAtkPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
-                        TYPE_Calc_TitleDefPer:[TYPE_Calc_AttrDEF],
-                        TYPE_Calc_FaceMaxHPPer:[TYPE_Calc_AttrMaxHP],
-                        TYPE_Calc_FaceAtkPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
-                        TYPE_Calc_FaceDefPer:[TYPE_Calc_AttrDEF],
-                        TYPE_Calc_FacePicMaxHPPer:[TYPE_Calc_AttrMaxHP],
-                        TYPE_Calc_FacePicAtkPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
-                        TYPE_Calc_FacePicDefPer:[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_LianTiAttrPer:[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],
-                        TYPE_Calc_PlusBaseAtkPer:[TYPE_Calc_AttrATKMin, TYPE_Calc_AttrATKMax],
-                        }
-
-# 对装备基础属性加成配置 {属性ID:[影响部位信息, [影响的计算属性列表]], ...}
-# 影响部位信息: 大于0-指定部位; -1-所有部位; -2-基础部位
-EquipBassAttrAddInfoSet = {
-   ShareDefine.Def_Effect_EquipBaseAddPer:      [-1, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk, ShareDefine.Def_Effect_MaxHP, ShareDefine.Def_Effect_Def]],
-   ShareDefine.Def_Effect_BaseEquipAddPer:      [-2, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk, ShareDefine.Def_Effect_MaxHP, ShareDefine.Def_Effect_Def]],
-   ShareDefine.Def_Effect_BaseEquipAtkAddPer:           [-2, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk]],
-   ShareDefine.Def_Effect_BaseEquipMaxHPAddPer:         [-2, [ShareDefine.Def_Effect_MaxHP]],
-   ShareDefine.Def_Effect_WeaponAddPer:         [ShareDefine.retWeapon, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk]],
-   ShareDefine.Def_Effect_Weapon2AddPer:        [ShareDefine.retWeapon2, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk]],
-   ShareDefine.Def_Effect_BeltAddPer:           [ShareDefine.retBelt, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk]],
-   ShareDefine.Def_Effect_GloveAddPer:          [ShareDefine.retGlove, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk]],
-   ShareDefine.Def_Effect_ClothesAddPer:        [ShareDefine.retClothes, [ShareDefine.Def_Effect_MaxHP, ShareDefine.Def_Effect_Def]],
-   ShareDefine.Def_Effect_HatAddPer:            [ShareDefine.retHat, [ShareDefine.Def_Effect_MaxHP, ShareDefine.Def_Effect_Def]],
-   ShareDefine.Def_Effect_TrousersAddPer:       [ShareDefine.retTrousers, [ShareDefine.Def_Effect_MaxHP, ShareDefine.Def_Effect_Def]],
-   ShareDefine.Def_Effect_ShoesAddPer:          [ShareDefine.retShoes, [ShareDefine.Def_Effect_MaxHP, ShareDefine.Def_Effect_Def]],
-   ShareDefine.Def_Effect_ShawlAddPer:          [ShareDefine.retShawl, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk, ShareDefine.Def_Effect_MaxHP]],
-   ShareDefine.Def_Effect_RingAddPer:           [ShareDefine.retRing, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk, ShareDefine.Def_Effect_MaxHP]],
-   ShareDefine.Def_Effect_NeckAddPer:           [ShareDefine.retNeck, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk, ShareDefine.Def_Effect_MaxHP]],
-   ShareDefine.Def_Effect_AmuletAddPer:         [ShareDefine.retAmulet, [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MinAtk, ShareDefine.Def_Effect_MaxAtk, ShareDefine.Def_Effect_MaxHP]],
-                           }
+FuncNoLinearAttrDict = {}
 
 # 指定地图生效的非线性属性配置
 MapAttrInfoDict_Noline = {
@@ -4737,83 +4454,6 @@
 Def_CalcAttrFunc_ChatBox, # 气泡框 65
 ) = range(66)
 
-# 技能功能点列表  - 默认不算战力,不享受百分比加成,技能功能点暂时配置,之后优化技能属性逻辑后可去掉
-CalcAttrFuncSkillList = [Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_DogzBattleSkill]
-# 不计算战力的功能点列表 - 由其他方式计算的战力的功能点,如装备用评分计算
-CalcAttrFuncNoFightPowerList = [Def_CalcAttrFunc_Equip, Def_CalcAttrFunc_DogzEquip, Def_CalcAttrFunc_LingQiAttr]
-
-#战斗力分组类型对应功能点属性分类索引列表,并不是一一对应的,有些战斗力类型可由多个功能点组成
-#***注意***: 以下功能点需包含上面定义的所有功能点,不然会导致有些属性无法加上
-MFPTypeAttrFuncIndexDict = {ShareDefine.Def_MFPType_Role:[Def_CalcAttrFunc_RoleBase],
-                            ShareDefine.Def_MFPType_Equip:[Def_CalcAttrFunc_Equip],
-                            ShareDefine.Def_MFPType_LingGen:[Def_CalcAttrFunc_LingGenQuailty, Def_CalcAttrFunc_LingGen],
-                            ShareDefine.Def_MFPType_Star:[Def_CalcAttrFunc_Star],
-                            ShareDefine.Def_MFPType_Plus:[Def_CalcAttrFunc_Plus],
-                            ShareDefine.Def_MFPType_Stone:[Def_CalcAttrFunc_Stone],
-                            ShareDefine.Def_MFPType_Enchant:[Def_CalcAttrFunc_Enchant],
-                            ShareDefine.Def_MFPType_Gubao:[Def_CalcAttrFunc_Gubao, Def_CalcAttrFunc_GubaoResonance],
-                            ShareDefine.Def_MFPType_Shentong:[Def_CalcAttrFunc_Shentong],
-                            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, Def_CalcAttrFunc_PetTarin, Def_CalcAttrFunc_PetStar],
-                            ShareDefine.Def_MFPType_PetSoul:[Def_CalcAttrFunc_PetSoul],
-                            ShareDefine.Def_MFPType_Horse:[Def_CalcAttrFunc_Horse, Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_HorseSkin, Def_CalcAttrFunc_HorseTarin, Def_CalcAttrFunc_HorseStar],
-                            ShareDefine.Def_MFPType_HorseSoul:[Def_CalcAttrFunc_HorseSoul],
-                            ShareDefine.Def_MFPType_FaQi:[Def_CalcAttrFunc_FaQi],
-                            ShareDefine.Def_MFPType_Love:[Def_CalcAttrFunc_LoveRing, Def_CalcAttrFunc_LoveRingCouple],
-                            ShareDefine.Def_MFPType_Charm:[Def_CalcAttrFunc_Charm],
-                            ShareDefine.Def_MFPType_LianTi:[Def_CalcAttrFunc_LianTi],
-                            ShareDefine.Def_MFPType_Prestige:[Def_CalcAttrFunc_Prestige],
-                            ShareDefine.Def_MFPType_GodWeapon:[Def_CalcAttrFunc_GodWeapon],
-                            ShareDefine.Def_MFPType_Dienstgrad:[Def_CalcAttrFunc_Dienstgrad, Def_CalcAttrFunc_TitleStar],
-                            ShareDefine.Def_MFPType_Rune:[Def_CalcAttrFunc_Rune],
-                            ShareDefine.Def_MFPType_MagicWeapon1:[Def_CalcAttrFunc_MagicWeapon1],
-                            ShareDefine.Def_MFPType_MagicWeapon2:[Def_CalcAttrFunc_MagicWeapon2],
-                            ShareDefine.Def_MFPType_MagicWeapon3:[Def_CalcAttrFunc_MagicWeapon3, Def_CalcAttrFunc_Stove, Def_CalcAttrFunc_VIP],
-                            ShareDefine.Def_MFPType_MagicWeapon4:[Def_CalcAttrFunc_MagicWeapon4],
-                            ShareDefine.Def_MFPType_StoveYao:[Def_CalcAttrFunc_StoveYao],
-                            ShareDefine.Def_MFPType_GatherSoul:[Def_CalcAttrFunc_GatherSoul],
-                            ShareDefine.Def_MFPType_GatherTheSoul:[Def_CalcAttrFunc_GatherTheSoul],
-                            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_Face:[Def_CalcAttrFunc_Face],
-                            ShareDefine.Def_MFPType_FacePic:[Def_CalcAttrFunc_FacePic],
-                            ShareDefine.Def_MFPType_ChatBox:[Def_CalcAttrFunc_ChatBox],
-                            ShareDefine.Def_MFPType_Other:[Def_CalcAttrFunc_Success, Def_CalcAttrFunc_FamilyTech, Def_CalcAttrFunc_EquipDecompose],
-                            }
-
-MFPTypeName = {ShareDefine.Def_MFPType_Role:"角色", ShareDefine.Def_MFPType_LingGen:"灵根", ShareDefine.Def_MFPType_Equip:"装备", ShareDefine.Def_MFPType_Star:"升星",
-               ShareDefine.Def_MFPType_Plus:"强化", ShareDefine.Def_MFPType_Stone:"宝石", ShareDefine.Def_MFPType_Wash:"洗练", ShareDefine.Def_MFPType_LingQi:"灵器",
-               ShareDefine.Def_MFPType_Pet:"灵宠", ShareDefine.Def_MFPType_Horse:"坐骑", ShareDefine.Def_MFPType_Prestige:"境界", ShareDefine.Def_MFPType_GodWeapon:"神兵",
-               ShareDefine.Def_MFPType_Dienstgrad:"称号", ShareDefine.Def_MFPType_Rune:"符印", ShareDefine.Def_MFPType_GatherSoul:"聚魂", ShareDefine.Def_MFPType_StoveYao:"丹药",
-               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_FamilyZhenfa:"阵法", 
-               ShareDefine.Def_MFPType_GatherTheSoul:"聚魂新", ShareDefine.Def_MFPType_Face:"头像", ShareDefine.Def_MFPType_FacePic:"头像框", ShareDefine.Def_MFPType_ChatBox:"气泡框", 
-               ShareDefine.Def_MFPType_Other:"其他",
-               }
-
-FuncIndexName = {
-                 Def_CalcAttrFunc_RoleBase:"角色基础", Def_CalcAttrFunc_LingGen:"灵根", Def_CalcAttrFunc_LingGenQuailty:"灵根品质", Def_CalcAttrFunc_Equip:"装备", 
-                 Def_CalcAttrFunc_Star:"升星", Def_CalcAttrFunc_Plus:"强化", Def_CalcAttrFunc_Stone:"宝石", Def_CalcAttrFunc_Wash:"洗练", 
-                 Def_CalcAttrFunc_LingQi:"灵器", Def_CalcAttrFunc_LingQiAttr:"灵器属性", Def_CalcAttrFunc_LingQiJingLianAttr:"灵器精炼", Def_CalcAttrFunc_Pet:"灵宠",
-                 Def_CalcAttrFunc_Horse:"坐骑", Def_CalcAttrFunc_Prestige:"境界", Def_CalcAttrFunc_GodWeapon:"神兵", Def_CalcAttrFunc_Dienstgrad:"称号", 
-                 Def_CalcAttrFunc_Rune:"符印", Def_CalcAttrFunc_GatherSoul:"聚魂", Def_CalcAttrFunc_Success:"成就", Def_CalcAttrFunc_VIP:"VIP", 
-                 Def_CalcAttrFunc_Stove:"炼丹炉", Def_CalcAttrFunc_FamilyTech:"心法", Def_CalcAttrFunc_EquipDecompose:"装备分解", Def_CalcAttrFunc_PetSoul:"宠物魂石", 
-                 Def_CalcAttrFunc_HorseSoul:"坐骑魂石", Def_CalcAttrFunc_HorseSkill:"坐骑技能属性", Def_CalcAttrFunc_PetSkill:"宠物技能属性", Def_CalcAttrFunc_StoveYao:"炼丹炉丹药", 
-                 Def_CalcAttrFunc_PetSign:"宠物签到", Def_CalcAttrFunc_Dogz:"神兽", Def_CalcAttrFunc_DogzBattleSkill:"神兽技能", Def_CalcAttrFunc_DogzEquip:"神兽装备", 
-                 Def_CalcAttrFunc_DogzEquipPlus:"神兽强化", Def_CalcAttrFunc_Coat:"时装", Def_CalcAttrFunc_MagicWeapon1:"人族法宝属性", 
-                 Def_CalcAttrFunc_MagicWeapon2:"魔族法宝属性", Def_CalcAttrFunc_MagicWeapon3:"仙族法宝属性", Def_CalcAttrFunc_MagicWeapon4:"王者法宝属性", Def_CalcAttrFunc_HorseSkin:"坐骑觉醒", 
-                 Def_CalcAttrFunc_PetSkin:"灵宠觉醒", Def_CalcAttrFunc_HorseTarin:"坐骑培养", Def_CalcAttrFunc_PetTarin:"灵宠培养", Def_CalcAttrFunc_GuardTarin:"守护培养",
-                 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_FamilyZhenfa:"阵法",
-                 Def_CalcAttrFunc_GatherTheSoul:"聚魂新", Def_CalcAttrFunc_GubaoResonance:"古宝共鸣", Def_CalcAttrFunc_Face:"头像", Def_CalcAttrFunc_FacePic:"头像框", Def_CalcAttrFunc_ChatBox:"气泡框",
-                 }
 #-------------------------------------------------------------------------------
 
 (
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 3c04f3a..050417a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -2677,58 +2677,6 @@
 
 
 #------------------------------------------------------
-# A3 17 增加果实使用上限 #tagCMAddFruitUseLimit
-
-class  tagCMAddFruitUseLimit(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("ItemID", c_int),    #果实物品ID
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xA3
-        self.SubCmd = 0x17
-        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 = 0x17
-        self.ItemID = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagCMAddFruitUseLimit)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// A3 17 增加果实使用上限 //tagCMAddFruitUseLimit:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                ItemID:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.ItemID
-                                )
-        return DumpString
-
-
-m_NAtagCMAddFruitUseLimit=tagCMAddFruitUseLimit()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMAddFruitUseLimit.Cmd,m_NAtagCMAddFruitUseLimit.SubCmd))] = m_NAtagCMAddFruitUseLimit
-
-
-#------------------------------------------------------
 # A3 10 购买商城物品 #tagCMBuyItem
 
 class  tagCMBuyItem(Structure):
@@ -4091,83 +4039,6 @@
 
 
 #------------------------------------------------------
-# A3 2A 回收魂石 #tagCMRecycleAttrFruit
-
-class  tagCMRecycleAttrFruit(Structure):
-    Head = tagHead()
-    IndexCount = 0    #(BYTE IndexCount)//索引个数
-    IndexList = list()    #(vector<BYTE> IndexList)//物品在背包中索引列表
-    RecycleCountList = list()    #(vector<WORD> RecycleCountList)//索引对应回收个数列表
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xA3
-        self.Head.SubCmd = 0x2A
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.IndexCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.IndexCount):
-            value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
-            self.IndexList.append(value)
-        for i in range(self.IndexCount):
-            value,_pos=CommFunc.ReadWORD(_lpData,_pos)
-            self.RecycleCountList.append(value)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xA3
-        self.Head.SubCmd = 0x2A
-        self.IndexCount = 0
-        self.IndexList = list()
-        self.RecycleCountList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 1
-        length += 1 * self.IndexCount
-        length += 2 * self.IndexCount
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.IndexCount)
-        for i in range(self.IndexCount):
-            data = CommFunc.WriteBYTE(data, self.IndexList[i])
-        for i in range(self.IndexCount):
-            data = CommFunc.WriteWORD(data, self.RecycleCountList[i])
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                IndexCount:%d,
-                                IndexList:%s,
-                                RecycleCountList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.IndexCount,
-                                "...",
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagCMRecycleAttrFruit=tagCMRecycleAttrFruit()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMRecycleAttrFruit.Head.Cmd,m_NAtagCMRecycleAttrFruit.Head.SubCmd))] = m_NAtagCMRecycleAttrFruit
-
-
-#------------------------------------------------------
 #A3 03 物品合成 #tagCMItemCompound
 
 class  tagCMItemCompound(Structure):
@@ -4489,58 +4360,6 @@
 
 m_NAtagCMTrialExchange=tagCMTrialExchange()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTrialExchange.Cmd,m_NAtagCMTrialExchange.SubCmd))] = m_NAtagCMTrialExchange
-
-
-#------------------------------------------------------
-# A3 2B 一键使用属性果实 #tagCMUseAllAttrFruit
-
-class  tagCMUseAllAttrFruit(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("FuncIndex", c_ubyte),    #功能索引
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xA3
-        self.SubCmd = 0x2B
-        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 = 0x2B
-        self.FuncIndex = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagCMUseAllAttrFruit)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// A3 2B 一键使用属性果实 //tagCMUseAllAttrFruit:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                FuncIndex:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.FuncIndex
-                                )
-        return DumpString
-
-
-m_NAtagCMUseAllAttrFruit=tagCMUseAllAttrFruit()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMUseAllAttrFruit.Cmd,m_NAtagCMUseAllAttrFruit.SubCmd))] = m_NAtagCMUseAllAttrFruit
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 8777856..7d8db7d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -3873,122 +3873,6 @@
 
 
 #------------------------------------------------------
-# A3 39 玩家属性果实已使用个数信息#tagMCAttrFruitEatCntList
-
-class  tagMCAttrFruitEatCnt(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("ItemID", c_int),    #果实物品ID
-                  ("EatCnt", c_int),    #已使用个数
-                  ("ItemAddCnt", c_int),    #增幅丹增加上限
-                  ("ItemBreakCnt", 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.ItemID = 0
-        self.EatCnt = 0
-        self.ItemAddCnt = 0
-        self.ItemBreakCnt = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCAttrFruitEatCnt)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// A3 39 玩家属性果实已使用个数信息//tagMCAttrFruitEatCntList:
-                                ItemID:%d,
-                                EatCnt:%d,
-                                ItemAddCnt:%d,
-                                ItemBreakCnt:%d
-                                '''\
-                                %(
-                                self.ItemID,
-                                self.EatCnt,
-                                self.ItemAddCnt,
-                                self.ItemBreakCnt
-                                )
-        return DumpString
-
-
-class  tagMCAttrFruitEatCntList(Structure):
-    Head = tagHead()
-    count = 0    #(BYTE count)//信息个数
-    EatCntList = list()    #(vector<tagMCAttrFruitEatCnt> EatCntList)
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xA3
-        self.Head.SubCmd = 0x39
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.count):
-            temEatCntList = tagMCAttrFruitEatCnt()
-            _pos = temEatCntList.ReadData(_lpData, _pos)
-            self.EatCntList.append(temEatCntList)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xA3
-        self.Head.SubCmd = 0x39
-        self.count = 0
-        self.EatCntList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 1
-        for i in range(self.count):
-            length += self.EatCntList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.count)
-        for i in range(self.count):
-            data = CommFunc.WriteString(data, self.EatCntList[i].GetLength(), self.EatCntList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                count:%d,
-                                EatCntList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.count,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagMCAttrFruitEatCntList=tagMCAttrFruitEatCntList()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCAttrFruitEatCntList.Head.Cmd,m_NAtagMCAttrFruitEatCntList.Head.SubCmd))] = m_NAtagMCAttrFruitEatCntList
-
-
-#------------------------------------------------------
 #A3 B7 当日累计攻击boss次数 #tagMCBOSSAttactCnt
 
 class  tagMCBossCntInfo(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearFruitAttr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearFruitAttr.py
deleted file mode 100644
index 455a187..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearFruitAttr.py
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-#-------------------------------------------------------------------------------
-#
-##@package GM.Commands.ClearFruitAttr
-#
-# @todo:重置属性果实数据
-# @author hxp
-# @date 2014-11-4
-# @version 1.1
-#
-# @change: "2014-12-04 15:30" hxp 属性果实支持按个数或按属性点控制上限
-#
-# 详细描述: 重置属性果实数据
-#
-#---------------------------------------------------------------------
-#"""Version = 2014-12-04 15:30"""
-#---------------------------------------------------------------------
-
-import ChConfig
-import GameWorld
-import IpyGameDataPY
-import PlayerControl
-import PlayerAttrFruit
-import ItemControler
-import IPY_GameWorld
-#---------------------------------------------------------------------
-#全局变量
-#---------------------------------------------------------------------
-
-#---------------------------------------------------------------------
-#逻辑实现
-## GM命令执行入口
-#  @param curPlayer 当前玩家
-#  @param list 参数列表 [npcID]
-#  @return None
-#  @remarks 函数详细说明.
-def OnExec(curPlayer, paramList):
-    
-    clearFuncIndex = paramList[0] if len(paramList) > 0 else -1
-    isGiveFruitItem = paramList[1] if len(paramList) > 1 else 0
-    if clearFuncIndex == 99:
-        clearFuncIndex = -1
-        isGiveFruitItem = 1
-        
-    giveFruitItemList = []
-    
-    ipyDataMgr = IpyGameDataPY.IPY_Data()
-    for i in xrange(ipyDataMgr.GetAttrFruitCount()):
-        ipyData = ipyDataMgr.GetAttrFruitByIndex(i)
-        itemID = ipyData.GetID()
-        funcIndex = ipyData.GetFuncID()
-        limitType = PlayerAttrFruit.Def_LimitType_Cnt
-        
-        if clearFuncIndex not in [-1, funcIndex]:
-            continue
-        
-        # 重置该物品已使用个数/属性
-        if limitType == PlayerAttrFruit.Def_LimitType_Cnt:
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AttrFruitEatCnt % itemID, 0)
-        elif limitType == PlayerAttrFruit.Def_LimitType_Attr:
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AttrFruitAddValue % itemID, 0)
-        
-        curPlayer.SetDict(ChConfig.Def_PlayerKey_FruitFightPowerEx % (funcIndex), 0)
-        
-        itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
-        # 重置该物品所加的属性值
-        if itemData:
-            for i in range(itemData.GetEffectCount()):
-                curEffect = itemData.GetEffectByIndex(i)
-                effectID = curEffect.GetEffectID()
-                
-                if effectID not in ChConfig.ItemEffect_AttrDict:
-                    continue
-                
-                attrKey = ChConfig.Def_PlayerKey_FruitAttr % (funcIndex, effectID)
-                curPlayer.SetDict(attrKey, 0)
-                
-            if isGiveFruitItem:
-                giveFruitItemList.append([itemID, PlayerAttrFruit.GetMaxEatCnt(curPlayer, itemID)])
-                
-    PlayerAttrFruit.Sync_AttrFruitEatCnt(curPlayer)
-    
-    # 刷新属性
-    PlayerControl.PlayerControl(curPlayer).ReCalcAllState()
-    
-    for itemID, itemCount in giveFruitItemList:
-        if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem]):
-            break
-    GameWorld.DebugAnswer(curPlayer, "OK!")
-    return
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py
index 302bd9d..37ad243 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py
@@ -19,6 +19,7 @@
 import ShareDefine
 import IpyGameDataPY
 import PlayerControl
+import PlayerOnline
 import GameWorld
 import ChConfig
 
@@ -42,6 +43,8 @@
         GameWorld.DebugAnswer(curPlayer, "新增武将: MakeItemCount 英雄ID [个数]")
         return
     
+    PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
+    
     value = msgList[0]
     value2 = msgList[1] if len(msgList) > 1 else 0
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py
index 4921090..485683e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py
@@ -4,21 +4,22 @@
 #
 ##@package GM.Commands.PrintFightPower
 #
-# @todo:显示战力明细
+# @todo:输出阵容战力
 # @author hxp
-# @date 2018-01-31
+# @date 2025-07-21
 # @version 1.0
 #
-# 详细描述: 显示战力明细
+# 详细描述: 输出阵容战力
 #
 #-------------------------------------------------------------------------------
-#"""Version = 2018-01-31 20:00"""
+#"""Version = 2025-07-21 14:30"""
 #-------------------------------------------------------------------------------
 
-import ChConfig
 import GameWorld
 import PlayerControl
-
+import PlayerOnline
+import ShareDefine
+import ChConfig
 
 #逻辑实现
 ## GM命令执行入口
@@ -27,38 +28,53 @@
 #  @return None
 #  @remarks 函数详细说明.
 def OnExec(curPlayer, msgList):
-    mfpTypeName = ChConfig.MFPTypeName
     
-    funcIndexName = ChConfig.FuncIndexName
+    olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
     
-    GameWorld.DebugAnswer(curPlayer, "PrintFightPower 模块类型(可选)")
-    
-    if msgList:
-        mfpType = msgList[0]
-        if mfpType not in mfpTypeName:
-            return
-        fightPower = PlayerControl.GetMFPFightPower(curPlayer, mfpType)
-        GameWorld.DebugAnswer(curPlayer, "--- %s战力(%s): %s" % (mfpTypeName[mfpType], mfpType, fightPower))
-        for funcIndex in ChConfig.MFPTypeAttrFuncIndexDict[mfpType]:
-            funcName = funcIndexName.get(funcIndex, "属性(%s)" % funcIndex)
-            attrInfo, insidePerAttrDict, customAttrDict = PlayerControl.GetCalcAttrListValue(curPlayer, funcIndex)
-            GameWorld.DebugAnswer(curPlayer, "%s:%s" % (funcName, attrInfo))
-            if insidePerAttrDict:
-                GameWorld.DebugAnswer(curPlayer, "%s内部加成:%s" % (funcName, insidePerAttrDict))
-            if customAttrDict:
-                GameWorld.DebugAnswer(curPlayer, "%s自定义属性:%s" % (funcName, customAttrDict))
+    if not msgList:
+        GameWorld.DebugAnswer(curPlayer, "PrintFightPower [阵容ID]")
+        GameWorld.DebugAnswer(curPlayer, "主公战力: %s" % PlayerControl.GetFightPower(curPlayer))
+        for lineupID in ShareDefine.LineupList:
+            lineup = olPlayer.GetLineup(lineupID)
+            GameWorld.DebugAnswer(curPlayer, "阵容(%s)总战力: %s" % (lineupID, lineup.fightPower))
         return
     
-    GameWorld.DebugAnswer(curPlayer, "===== 总战力: %s" % PlayerControl.GetFightPower(curPlayer))
-    for mfpType in ChConfig.MFPTypeAttrFuncIndexDict.keys():
-        fightPower = PlayerControl.GetMFPFightPower(curPlayer, mfpType)
-        mfpSkillFP = PlayerControl.GetMFPSkillFightPower(curPlayer, mfpType)
-        mfpEx = PlayerControl.GetMFPExFightPower(curPlayer, mfpType)
-        name = mfpTypeName.get(mfpType, "模块%s" % mfpType)
-        if mfpSkillFP or mfpEx:
-            GameWorld.DebugAnswer(curPlayer, "%s战力(%s): %s,技能:%s, Ex=%s" % (name, mfpType, fightPower, mfpSkillFP, mfpEx))
-        else:
-            GameWorld.DebugAnswer(curPlayer, "%s战力(%s): %s" % (name, mfpType, fightPower))
+    lineupID = msgList[0]
+    if lineupID not in ShareDefine.LineupList:
+        GameWorld.DebugAnswer(curPlayer, "阵容(%s)不存在.")
+        return
+    
+    GameWorld.DebugAnswer(curPlayer, "-------------------")
+    lineup = olPlayer.GetLineup(lineupID)    
+    GameWorld.DebugAnswer(curPlayer, "【阵容 - %s】明细总战力: %s" % (lineupID, lineup.fightPower))
+    
+    for calcIndex in ChConfig.Def_CalcAttrList:
+        calcName = ChConfig.CalcAttrName.get(calcIndex, "%s" % calcIndex)
+        attrDict = olPlayer.GetCalcAttr(calcIndex)
+        attrInfo = ""
+        for attrID in ChConfig.AttrIDList:
+            attrValue = attrDict.get(attrID, 0)
+            if not attrValue:
+                continue
+            if attrInfo:
+                attrInfo += "; "
+            attrInfo += "%s-%s" % (attrID, attrValue)
+        GameWorld.DebugAnswer(curPlayer, "%s:%s" % (calcName, attrInfo))
+        
+    posNumList = lineup.lineupHeroDict.keys()
+    posNumList.sort()
+    for posNum in posNumList:
+        lineupHero = lineup.GetLineupHero(posNum)
+        GameWorld.DebugAnswer(curPlayer, "---位置:%s,武将(%s) 战力: %s" % (posNum, lineupHero.heroID, lineupHero.fightPower))
+        GameWorld.DebugAnswer(curPlayer, "技能:%s,战力:%s" % (lineupHero.heroSkillIDList, lineupHero.skillFightPower))
+        attrInfo = ""
+        for attrID in ChConfig.AttrIDList:
+            attrValue = lineupHero.heroBatAttrDict.get(attrID, 0)
+            if not attrValue:
+                continue
+            if attrInfo:
+                attrInfo += "; "
+            attrInfo += "%s-%s" % (attrID, attrValue)
+        GameWorld.DebugAnswer(curPlayer, "属性:%s" % attrInfo)
         
     return
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
index 55c26ef..a711479 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
@@ -42,7 +42,6 @@
 import ReadChConfig
 import OperControlManager
 import ShareDefine
-import PlayerAttrFruit
 import DataRecordPack
 import ChPyNetSendPack
 import NetPackCommon
@@ -674,10 +673,6 @@
 #  @return None or True
 #  @remarks 函数详细说明.
 def __DealWith_SpecialItem(curPlayer, curItem, tick, useCnt, exData):
-    #果实物品
-    useFruitResult = PlayerAttrFruit.DoPlayerEatFruitItem(curPlayer, curItem, useCnt)
-    if useFruitResult != -1:
-        return useFruitResult
     
     #------------------------获得物品相关属性
     itemTypeID = curItem.GetItemTypeID()  #物品类型id
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 8b29dc8..9080305 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -2578,18 +2578,18 @@
         heroAttrDict = {}
         if lineupPlayerID:
             heroAttrDict.update({
-                                 ShareDefine.Def_Effect_Atk:500000000,
-                                 ShareDefine.Def_Effect_Def:50000000,
-                                 ShareDefine.Def_Effect_MaxHP:3000000000,
+                                 ChConfig.AttrID_Atk:500000000,
+                                 ChConfig.AttrID_Def:50000000,
+                                 ChConfig.AttrID_MaxHP:3000000000,
                                  })
         else:
             npcDataEx = GetNPCDataEx(curNPC.GetNPCID())
             if not npcDataEx:
                 return
             heroAttrDict.update({
-                                 ShareDefine.Def_Effect_Atk:npcDataEx.GetAtk(),
-                                 ShareDefine.Def_Effect_Def:npcDataEx.GetDef(),
-                                 ShareDefine.Def_Effect_MaxHP:npcDataEx.GetMaxHP(),
+                                 ChConfig.AttrID_Atk:npcDataEx.GetAtk(),
+                                 ChConfig.AttrID_Def:npcDataEx.GetDef(),
+                                 ChConfig.AttrID_MaxHP:npcDataEx.GetMaxHP(),
                                  })
             
         GameWorld.DebugLog("heroAttrDict: ID:%s,NPCID:%s,%s" % (curNPC.GetID(), curNPC.GetNPCID(), heroAttrDict))
@@ -2598,10 +2598,10 @@
         curNPC.ResetNPCBattleState()
         
         # 设置属性
-        curNPC.SetMinAtk(heroAttrDict.get(ShareDefine.Def_Effect_Atk, 1))
-        curNPC.SetMaxAtk(heroAttrDict.get(ShareDefine.Def_Effect_Atk, 1))
-        curNPC.SetDef(heroAttrDict.get(ShareDefine.Def_Effect_Def, 1))
-        GameObj.SetMaxHP(curNPC, heroAttrDict.get(ShareDefine.Def_Effect_MaxHP, 1))
+        curNPC.SetMinAtk(heroAttrDict.get(ChConfig.AttrID_Atk, 1))
+        curNPC.SetMaxAtk(heroAttrDict.get(ChConfig.AttrID_Atk, 1))
+        curNPC.SetDef(heroAttrDict.get(ChConfig.AttrID_Def, 1))
+        GameObj.SetMaxHP(curNPC, heroAttrDict.get(ChConfig.AttrID_MaxHP, 1))
         return
     
     ## 刷新NPC属性
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index c82f489..d50420b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -55,7 +55,6 @@
 import FBCommon
 import BossHurtMng
 import PlayerWishingWell
-import PlayerAttrFruit
 import PlayerSuccess
 import PlayerDienstgrad
 import PlayerFreeGoods
@@ -634,9 +633,6 @@
     
     # 投资理财
     PlayerGoldInvest.OnLogin(curPlayer)
-    
-    #属性果实使用情况
-    PlayerAttrFruit.AttrFruitOnLogin(curPlayer)
     
     #成就
     PlayerSuccess.SuccOnLogin(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAttrFruit.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAttrFruit.py
deleted file mode 100644
index c1253b2..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAttrFruit.py
+++ /dev/null
@@ -1,569 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-#-------------------------------------------------------------------------------
-#
-##@package Player.PlayerAttrFruit
-#
-# @todo:玩家各功能属性果实/魂石
-# @author hxp
-# @date 2014-11-04
-# @version 1.9
-#
-# @change: "2014-11-25 18:00" hxp 修改取坐骑阶级错误bug
-# @change: "2014-11-26 17:30" hxp 增加获取属性果实已使用个数字典
-# @change: "2014-12-04 15:30" hxp 属性果实支持按个数或按属性点控制上限;修改百分比属性只算基础属性
-# @change: "2014-12-05 19:30" hxp 增加支持按饼图随机属性点
-# @change: "2015-01-04 21:00" hxp 增加图腾属性果实
-# @change: "2015-05-28 14:00" hxp 刷属性优化
-# @change: "2016-05-17 11:00" xdh 增加每日最大使用上限,增加一键使用
-# @change: "2016-10-17 16:00" hxp 贵族特权判断方式修改
-# @change: "2017-08-07 20:30" xdh 手游版本修改
-#
-# 详细描述: 玩家各功能属性果实(按等级或阶级有使用个数上限)
-#
-#---------------------------------------------------------------------
-#"""Version = 2017-08-07 20:30"""
-#---------------------------------------------------------------------
-import NetPackCommon
-import ChPyNetSendPack
-import PlayerControl
-import ShareDefine
-import ItemCommon
-import PlayerHorse
-import GameWorld
-import ChConfig
-import IPY_GameWorld
-import IpyGameDataPY
-import PlayerPet
-import PlayerRefineStove
-import PlayerActTask
-import PlayerSuccess
-import SkillShell
-
-(
-Def_LimitType_Cnt, # 按个数限制
-Def_LimitType_Attr, # 按属性限制
-) = range(2)
-
-
-
-
-## 属性果实登录处理
-# @param curPlayer
-# @return None
-def AttrFruitOnLogin(curPlayer):
-    Sync_AttrFruitEatCnt(curPlayer)
-    return
-
-## 获取果实ipy数据
-def GetAttrFruitIpyData(itemID, isShowLog=True):
-    if isShowLog:
-        return IpyGameDataPY.GetIpyGameData("AttrFruit", itemID)
-    else:
-        return IpyGameDataPY.GetIpyGameDataNotLog("AttrFruit", itemID)
-    
-
-#// A3 2A 回收魂石 #tagCMRecycleAttrFruit
-#
-#struct    tagCMRecycleAttrFruit
-#{
-#    tagHead        Head;
-#    BYTE        IndexCount;    //索引个数
-#    BYTE        IndexList[IndexCount];    //物品在背包中索引列表
-#    WORD        RecycleCountList[IndexCount];    //索引对应回收个数列表
-#};
-def OnRecycleAttrFruit(index, packData, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    
-    indexList = packData.IndexList
-    recycleCountList = packData.RecycleCountList
-    if not indexList or len(indexList) != len(recycleCountList):
-        return
-    
-    totalMoney = 0
-    recycleItemList = []
-    backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
-    for i, itemIndex in enumerate(indexList):
-        recycleCount = recycleCountList[i]
-        curItem = backPack.GetAt(itemIndex)
-        if not ItemCommon.CheckItemCanUse(curItem):
-            continue
-        
-        recycleCount = min(recycleCount, curItem.GetCount())
-        if recycleCount <= 0:
-            continue
-        
-        itemID = curItem.GetItemTypeID()
-        ipyData = GetAttrFruitIpyData(itemID)
-        if not ipyData:
-            continue
-        
-        maxEatCnt = GetMaxEatCnt(curPlayer, itemID)
-        eatCntKey = ChConfig.Def_PDict_AttrFruitEatCnt % itemID
-        limitType = Def_LimitType_Cnt
-        if limitType == Def_LimitType_Attr:
-            eatCntKey = ChConfig.Def_PDict_AttrFruitAddValue % itemID
-        eatCnt = curPlayer.NomalDictGetProperty(eatCntKey) # 已吃次数/属性值
-        if eatCnt < maxEatCnt:
-            GameWorld.DebugLog("未达到使用个数上限,不可回收!eatCnt=%s,maxEatCnt=%s" % (eatCnt, maxEatCnt), curPlayer.GetPlayerID())
-            continue
-        
-        recycleMoney = ipyData.GetRecycleMoney()
-        if not recycleMoney:
-            continue
-        
-        totalMoney += recycleMoney * recycleCount
-        recycleItemList.append({"GUID":curItem.GetGUID(), "ItemID":itemID, "ItemCount":recycleCount, "Index":itemIndex})
-        ItemCommon.DelItem(curPlayer, curItem, recycleCount, True, ChConfig.ItemDel_AttrFruit)  
-        GameWorld.DebugLog("回收魂石 itemID=%s,maxEatCnt=%s,eatCnt=%s,recycleCount=%s,recycleMoney=%s,totalMoney=%s" 
-                           % (itemID, maxEatCnt, eatCnt, recycleCount, recycleMoney, totalMoney), curPlayer.GetPlayerID())
-                
-    if totalMoney:
-        addDataDict = {"recycleItemList":recycleItemList}
-        PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_Danjing, totalMoney, ChConfig.Def_GiveMoney_UseItem, addDataDict)
-        curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitRecycleAttrFruit, 1)
-    return
-
-
-#// A3 2B 一键使用属性果实 #tagCMUseAllAttrFruit
-#
-#struct    tagCMUseAllAttrFruit
-#{
-#    tagHead        Head;
-#    BYTE        FuncIndex;        //功能索引
-#};
-## 一键使用属性果实
-# @param index
-# @return None
-def OnEatAllFruitItem(index, packData, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    funcIndex = packData.FuncIndex
-    
-    if funcIndex not in ShareDefine.Def_AttrFruitFuncList:
-        GameWorld.ErrLog("该属性果实功能未开放!")
-        return
-    
-    addValueDict = {}
-    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
-    for i in range(curPack.GetCount()):
-        item = curPack.GetAt(i)
-        if item == None or item.IsEmpty():
-            continue
-        itemID = item.GetItemTypeID()
-    
-        addValue, hasUseCnt = __DoEatFruitItem(curPlayer, item, item.GetCount(), False)
-        if addValue <= 0:
-            continue
-        
-        addValueDict[itemID] = addValueDict.get(itemID, 0) + addValue
-        
-    GameWorld.DebugLog("OnEatAllFruitItem addValueDict=%s!" % addValueDict)
-    if not addValueDict:
-        return
-    
-    Sync_AttrFruitEatCnt(curPlayer, addValueDict.keys())
-    
-    # 增加属性
-    for itemid, addValue in addValueDict.items():
-        ipyData = GetAttrFruitIpyData(itemid)
-        funcIndex = ipyData.GetFuncID()
-        __AddFruitAttr(curPlayer, itemid, funcIndex, addValue)
-    
-    # 刷新属性
-    __RefreshAttr(curPlayer, funcIndex)
-    return
-
-
-
-## 玩家使用属性果实
-# @param curPlayer
-# @param useCnt 使用数量
-# @return -1代表非属性果实;True or False代表使用成功与否
-def DoPlayerEatFruitItem(curPlayer, curItem, useCnt=1):
-    itemID = curItem.GetItemTypeID()
-    useCnt = max(1, useCnt)
-    ipyData = GetAttrFruitIpyData(itemID, False)
-    # 不是果实物品
-    if not ipyData:
-        return -1
-    
-    funcIndex = ipyData.GetFuncID()
-    addValue, hasUseCnt = __DoEatFruitItem(curPlayer, curItem, useCnt)
-    
-    if not addValue:
-        return False, hasUseCnt
-    Sync_AttrFruitEatCnt(curPlayer, [itemID])
-    
-    # 增加属性
-    __AddFruitAttr(curPlayer, itemID, funcIndex, addValue)
-    
-    # 刷新属性
-    __RefreshAttr(curPlayer, funcIndex)
-    return True, hasUseCnt
-
-## 玩家使用属性果实
-# @param curPlayer
-# @param useCnt 使用数量
-# @return 增加数量/属性,实际使用数量
-def __DoEatFruitItem(curPlayer, item, useCnt, isShowMsg=True):
-    itemID = item.GetItemTypeID()
-    DefaultReturn = 0, 0
-    ipyData = GetAttrFruitIpyData(itemID)
-    # 不是果实物品
-    if not ipyData:
-        return DefaultReturn
-
-    funcIndex = ipyData.GetFuncID()
-    limitType = Def_LimitType_Cnt
-    maxEatCnt = GetMaxEatCnt(curPlayer, itemID)
-    
-    if funcIndex not in ShareDefine.Def_AttrFruitFuncList:
-        GameWorld.ErrLog("该属性果实功能未开放!funcIndex=%s"%funcIndex)
-        return DefaultReturn
-     
-    eatCntKey = ChConfig.Def_PDict_AttrFruitEatCnt % itemID
-    
-    if limitType == Def_LimitType_Attr:
-        eatCntKey = ChConfig.Def_PDict_AttrFruitAddValue % itemID
-        
-        
-    eatCnt = curPlayer.NomalDictGetProperty(eatCntKey) # 已吃次数/属性值
-    
-    GameWorld.DebugLog("使用属性果实 itemID=%s,limitType=%s,maxEatCnt=%s,eatCnt=%s" 
-                       % (itemID, limitType, maxEatCnt, eatCnt))
-    
-    hasUseCnt = 0 #实际使用个数
-    addValue = 0
-    for _ in range(useCnt):
-        if eatCnt >= maxEatCnt:
-            GameWorld.DebugLog("    已达到该等级段最大个数/属性,不可使用!")
-            break
-        
-        # 更新使用个数
-        curValue = 1 # 按个数的默认使用一个
-#        if limitType == Def_LimitType_Attr:
-#            attrFruitRandom = ReadChConfig.GetEvalChConfig("AttrFruitRandom")
-#            if itemID in attrFruitRandom:
-#                randomList = attrFruitRandom[itemID]
-#                curValue = GameWorld.GetResultByRandomList(randomList, 1) # 至少为1
-#                GameWorld.DebugLog("    饼图随机属性点addValue=%s" % curValue)
-#            else:
-#                curEff = item.GetEffectByIndex(0) # 按属性的默认取效果1的AB值随机
-#                minValue = curEff.GetEffectValue(0)
-#                maxValue = max(curEff.GetEffectValue(1), minValue)
-#                curValue = random.randint(minValue, maxValue)
-#                GameWorld.DebugLog("    效果值AB范围随机属性点addValue=%s" % curValue)
-#                
-#            curValue = min(curValue, maxEatCnt - eatCnt)
-        eatCnt += curValue
-        hasUseCnt += 1
-        addValue += curValue
-        
-    if hasUseCnt <= 0:
-        return DefaultReturn
-    PlayerControl.NomalDictSetProperty(curPlayer, eatCntKey, eatCnt)
-    if funcIndex == ShareDefine.Def_AttrFruitFunc_Stove:
-        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_UseStoveBylv, hasUseCnt, [item.GetLV()])
-        PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_FruitStoveEatTimes) # 算次数,不算个数
-        
-    alchemyIpyData = IpyGameDataPY.GetIpyGameDataByCondition("Alchemy", {"AlchemItemID":itemID}, False, True)
-    if alchemyIpyData:
-        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_UseStoveByType, hasUseCnt, [alchemyIpyData.GetAlchemType()])
-        
-    effect = item.GetEffectByIndex(0)
-    effID = effect.GetEffectID()
-    ## 特殊属性ID处理,此属性ID做一次性处理,不做属性计算
-    if effID == ShareDefine.Def_Effect_FreePoint:
-        effValue = effect.GetEffectValue(0)
-        addFreePoint = effValue * hasUseCnt
-        freePoint = curPlayer.GetFreePoint()
-        updFreePoint = freePoint + addFreePoint
-        curPlayer.SetFreePoint(updFreePoint)
-        GameWorld.DebugLog("丹药增加自由属性点: freePoint=%s,addFreePoint=%s(%s*%s),updFreePoint=%s" 
-                           % (freePoint, addFreePoint, effValue, hasUseCnt, updFreePoint))
-        
-    ItemCommon.DelItem(curPlayer, item, hasUseCnt, True, ChConfig.ItemDel_AttrFruit)
-    return addValue, hasUseCnt
-
-## 刷新对应索引属性
-# @param funcIndex
-# @return None
-def __RefreshAttr(curPlayer, funcIndex):
-    if funcIndex == ShareDefine.Def_AttrFruitFunc_Pet:
-        PlayerPet.RefreshPetItemAddAttr(curPlayer, True)
-    elif funcIndex == ShareDefine.Def_AttrFruitFunc_Horse:
-        PlayerHorse.RefreshHorseAttr(curPlayer)
-    elif funcIndex == ShareDefine.Def_AttrFruitFunc_Stove:
-        PlayerRefineStove.CalcStoveAttr(curPlayer)
-        PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
-
-    return
-
-## 增加果实增加的属性缓存
-# @param curPlayer
-# @return None
-def __AddFruitAttr(curPlayer, fruitItemID, funcIndex, addValue):
-    
-    if addValue < 1:
-        return []
-    
-    itemData = GameWorld.GetGameData().GetItemByTypeID(fruitItemID)
-    if not itemData:
-        return []
-    
-    
-    limitType = Def_LimitType_Cnt #默认按个数
-    
-    # 增加附加战力,仅按个数时有效
-    fightPowerExfigKey = ChConfig.Def_PlayerKey_FruitFightPowerEx % (funcIndex)
-    fightPowerEx = curPlayer.GetDictByKey(fightPowerExfigKey)
-    fruitIpyData = GetAttrFruitIpyData(fruitItemID)
-    addFightPowerEx = 0 if not fruitIpyData else fruitIpyData.GetFightPowerEx()
-    fightPowerEx = fightPowerEx + addFightPowerEx * addValue
-    curPlayer.SetDict(fightPowerExfigKey, fightPowerEx)
-    GameWorld.DebugLog("    Add funcIndex=%s,addFightPowerEx=%s,addValue=%s,fightPowerEx=%s" % (funcIndex, addFightPowerEx, addValue, fightPowerEx))
-    attrIDList = []
-    for i in range(itemData.GetEffectCount()):
-        curEffect = itemData.GetEffectByIndex(i)
-        effectID = curEffect.GetEffectID()
-        
-        if not effectID or effectID not in ChConfig.ItemEffect_AttrDict or effectID == ShareDefine.Def_Effect_FreePoint:
-            continue
-        attrIDList.append(effectID)
-        attrKey = ChConfig.Def_PlayerKey_FruitAttr % (funcIndex, effectID)
-        curValue = curPlayer.GetDictByKey(attrKey)
-        effValueA = curEffect.GetEffectValue(0)
-        effValueB = curEffect.GetEffectValue(1)
-        if limitType == Def_LimitType_Cnt:
-            updValue = curValue + effValueA * addValue # 按个数的,以每个属性*个数
-        else:
-            updValue = curValue + addValue # 加属性的直接加
-            
-        curPlayer.SetDict(attrKey, updValue)
-        GameWorld.DebugLog("    Add funcIndex=%s,effID=%s,curValue=%s,effA=%s,effB=%s,count=%s,updV=%s" 
-                           % (funcIndex, effectID, curValue, effValueA, effValueB, addValue, updValue))
-    return attrIDList
-
-## 加载果实增加的属性缓存,一般是登录或切地图后
-# @param curPlayer
-# @return None
-def __InitPlayerAttrFruit(curPlayer):
-    hadInit = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_HadInitFruitAttr)
-    if hadInit:
-        return
-    #GameWorld.DebugLog("__InitPlayerAttrFruit")
-    
-    ipyDataMgr = IpyGameDataPY.IPY_Data()
-    maxCnt = ipyDataMgr.GetAttrFruitCount()
-    for i in xrange(maxCnt):
-        ipyData = ipyDataMgr.GetAttrFruitByIndex(i)
-        fruitItemID = ipyData.GetID()
-        funcIndex = ipyData.GetFuncID() # 所属功能
-        limitType = Def_LimitType_Cnt # 限制类型
-        eatCntKey = ChConfig.Def_PDict_AttrFruitEatCnt % fruitItemID
-        if limitType == Def_LimitType_Attr:
-            eatCntKey = ChConfig.Def_PDict_AttrFruitAddValue % fruitItemID
-            
-        eatCnt = curPlayer.NomalDictGetProperty(eatCntKey)
-        __AddFruitAttr(curPlayer, fruitItemID, funcIndex, eatCnt)
-    
-    # 设置本地图已经刷新过
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_HadInitFruitAttr, 1)
-    return
-
-## 计算属性果实增加的属性
-# @param curPlayer
-# @param allAttrList
-# @param funcIndex 对应功能索引
-# @return None
-def CalcAttrFruitAddAtrr(curPlayer, allAttrList, funcIndex):
-    #GameWorld.DebugLog("CalcAttrFruitAddAtrr...funcIndex=%s" % (funcIndex))
-    #GameWorld.DebugLog("    无果实属性 allAttrList=%s" % str(allAttrList))
-    __InitPlayerAttrFruit(curPlayer)
-
-    for effectID in ChConfig.ItemEffect_AttrDict:
-        
-        if not isinstance(effectID, int):
-            continue
-        
-        attrKey = ChConfig.Def_PlayerKey_FruitAttr % (funcIndex, effectID)
-        addValue = curPlayer.GetDictByKey(attrKey)
-        if not addValue:
-            continue
-        
-        #GameWorld.DebugLog("    effectID=%s,addValue=%s" % (effectID, addValue))
-        PlayerControl.CalcAttrDict_Type(effectID, addValue, allAttrList)
-
-    fightPowerEx = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_FruitFightPowerEx % (funcIndex))
-    #GameWorld.DebugLog("    有果实属性funcIndex=%s,fightPowerEx=%s,allAttrList=%s" % (funcIndex, fightPowerEx, allAttrList))
-    return fightPowerEx
-    
-
-## 统计百分比属性对功能内层的属性增加
-#  @param curPlayer 
-#  @param funcIndex 
-#  @return None
-def AddFuncPerValue(curPlayer, funcIndex, effPerID, allAttrList):
-    attrPerKey = ChConfig.Def_PlayerKey_FruitAttr % (funcIndex, effPerID)
-    addPer = curPlayer.GetDictByKey(attrPerKey)
-    
-    if addPer <= 0:
-        return
-    
-    #[属性索引, 是否基础属性,(非)线性]
-    attrInfo = ChConfig.ItemEffect_AttrDict.get(effPerID, [])
-    if attrInfo is []:
-        return
-    
-    addAttrList = attrInfo[0]
-    for attrDict in allAttrList:
-        for attrIndex, attrValue in attrDict.items():
-            # 非百分比增加的属性
-            if attrIndex not in addAttrList:
-                continue
-            
-            addPerValue = int(attrValue * addPer / ShareDefine.Def_MaxRateValue) # 百分比增加属性
-            
-            updValue = attrValue + addPerValue
-            attrDict[attrIndex] = updValue
-
-            #GameWorld.DebugLog("    effPerID=%s,attrValue=%s,addPer=%s,addPerValue=%s,updValue=%s" 
-            #                   % (effPerID, attrValue, addPer, addPerValue, updValue))
-
-    return True
-
-        
-## 同步属性果实使用情况
-#  @param curPlayer 
-#  @param fruitItemID 
-#  @return None
-def Sync_AttrFruitEatCnt(curPlayer, fruitItemIDList=None):
-    
-    eatPack = ChPyNetSendPack.tagMCAttrFruitEatCntList()
-    eatPack.Clear()
-    eatPack.EatCntList = []
-    if fruitItemIDList is None:
-        itemidList = []
-        ipyDataMgr = IpyGameDataPY.IPY_Data()
-        maxCnt = ipyDataMgr.GetAttrFruitCount()
-        for i in xrange(maxCnt):
-            ipyData = ipyDataMgr.GetAttrFruitByIndex(i)
-            itemID = ipyData.GetID()
-            itemidList.append(itemID)
-        
-    else:
-        itemidList = fruitItemIDList
-        
-    
-    for fruitItemID in itemidList:
-        eatCntKey = ChConfig.Def_PDict_AttrFruitEatCnt % fruitItemID
-        #addValueKey = ChConfig.Def_PDict_AttrFruitAddValue % fruitItemID
-        eatCntPack = ChPyNetSendPack.tagMCAttrFruitEatCnt()
-        eatCntPack.Clear()
-        eatCntPack.ItemID = fruitItemID
-        eatCntPack.EatCnt = curPlayer.NomalDictGetProperty(eatCntKey)
-        eatCntPack.ItemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AttrFruitAddItemCnt % fruitItemID)
-        eatCntPack.ItemBreakCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AttrFruitItemBreakCnt % fruitItemID)
-        eatPack.EatCntList.append(eatCntPack)
-    
-    eatPack.count = len(eatPack.EatCntList)
-    NetPackCommon.SendFakePack(curPlayer, eatPack)
-    return
-
-## 属性果实已吃个数字典
-#  @param curPlayer 
-#  @param fruitItemID 
-#  @return {id:个数,...}
-def GetAttrFruitEatCntDict(curPlayer):
-    eatCntDict = {}
-    
-    ipyDataMgr = IpyGameDataPY.IPY_Data()
-    maxCnt = ipyDataMgr.GetAttrFruitCount()
-    for i in xrange(maxCnt):
-        ipyData = ipyDataMgr.GetAttrFruitByIndex(i)
-        fruitItemID = ipyData.GetID()
-        eatCntKey = ChConfig.Def_PDict_AttrFruitEatCnt % fruitItemID
-#        if fruitInfo[Def_LimitType] == Def_LimitType_Attr:
-#            eatCntKey = ChConfig.Def_PDict_AttrFruitAddValue % fruitItemID
-#            dayEatCntKey = ChConfig.Def_PDict_AttrFruitDayAddValue % fruitItemID
-            
-        eatCnt = curPlayer.NomalDictGetProperty(eatCntKey) # 已吃次数/属性值
-        if eatCnt <= 0:
-            continue
-        
-        eatCntDict[fruitItemID] = eatCnt
-        
-    return eatCntDict
-
-def IsFruitEatFull(curPlayer, itemID):
-    #使用次数是否已满
-    maxEatCnt = GetMaxEatCnt(curPlayer, itemID)
-    eatCntKey = ChConfig.Def_PDict_AttrFruitEatCnt % itemID
-    limitType = Def_LimitType_Cnt
-    if limitType == Def_LimitType_Attr:
-        eatCntKey = ChConfig.Def_PDict_AttrFruitAddValue % itemID
-    eatCnt = curPlayer.NomalDictGetProperty(eatCntKey) # 已吃次数/属性值
-    if eatCnt >= maxEatCnt:
-        return True
-    return
-
-def GetMaxEatCnt(curPlayer, itemID):
-    ##获取果实最大可用个数
-    ipyData = GetAttrFruitIpyData(itemID)
-    if not ipyData:
-        return 0
-    maxEatCntDict = ipyData.GetMaxUseCnt()
-    realmLV = curPlayer.GetOfficialRank()
-    orderList = sorted(maxEatCntDict.keys(), reverse=True)
-    maxEatCnt = 0
-    for order in orderList:
-        if realmLV >= order:
-            maxEatCnt = maxEatCntDict[order]
-            break
-    addItemUseCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AttrFruitAddItemCnt % itemID)
-    maxEatCnt += addItemUseCnt
-    return maxEatCnt
-
-
-#// A3 17 增加果实使用上限 #tagCMAddFruitUseLimit
-#
-#struct    tagCMAddFruitUseLimit
-#{
-#    tagHead        Head;
-#    DWORD        ItemID;        //果实物品ID
-#};
-def OnAddFruitUseLimit(index, packData, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    itemID = packData.ItemID
-    ipyData = GetAttrFruitIpyData(itemID)
-    if not ipyData:
-        return
-    addItemInfoList = ipyData.GetAddItemInfo()
-    if not addItemInfoList:
-        return
-    itemBreakCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AttrFruitItemBreakCnt % itemID)
-    itemAddUseCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AttrFruitAddItemCnt % itemID)
-    needUseCnt = canUpCnt = 0
-    for breakCnt, useCnt, upCnt in addItemInfoList:
-        if itemBreakCnt >= breakCnt:
-            continue
-        needUseCnt, canUpCnt = useCnt, upCnt
-        break
-    if not needUseCnt:
-        return
-
-    needItemID = IpyGameDataPY.GetFuncCfg('AlchemyOverLimit')
-    if itemAddUseCnt + canUpCnt> ChConfig.Def_UpperLimit_DWord:
-        return
-    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
-    enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(needItemID, itemPack, needUseCnt)
-    if not enough:
-        return
-    ItemCommon.ReduceItem(curPlayer, itemPack, indexList, needUseCnt, False, "AddFruitUseLimit")
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AttrFruitAddItemCnt % itemID, itemAddUseCnt+canUpCnt)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AttrFruitItemBreakCnt % itemID,
-                                       itemBreakCnt + 1)
-    Sync_AttrFruitEatCnt(curPlayer, [itemID])
-    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAutoCheckOnline.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAutoCheckOnline.py
index 4784715..57401fa 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAutoCheckOnline.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAutoCheckOnline.py
@@ -568,7 +568,7 @@
     errCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_Captcha_ErrCount)
     
     #文件加密
-    captchaMsg = GotoHeaven(captchaMsg, ShareDefine.Def_Effect_PHY)
+    captchaMsg = GotoHeaven(captchaMsg, 3)
     msgContent = ShareDefine.Def_CaptchaS_SendMsg%(captchaType, errCount, captchaMsg)
     sendMsg = ShareDefine.Def_AutoCheck_SendMsg%(ShareDefine.Def_AutoCheck_Captcha, msgContent)
     
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 e9bb496..241e10b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -1057,8 +1057,6 @@
         CrossPlayerData.ClearCrossSyncDataCache(curPlayer)
         PyGameData.g_fbBuyBuffTimeDict.pop(playerID, None)
     #清除地图玩家缓存
-    PyGameData.g_playerFuncAttrDict.pop(playerID, None)
-    PyGameData.g_playerEquipPartAttrDict.pop(playerID, None)
     PyGameData.g_playerReqEnterFBEx.pop(playerID, None)
     NPCCommon.ClearPriWoodPile(curPlayer)
     #移除地图缓存的境界难度玩家ID信息
@@ -5045,32 +5043,6 @@
 #  @param allAttrList 属性列表
 #  @return None
 def CalcAttrDict_Type(attrType, value, allAttrList):
-    if value == 0:
-        return
-    
-    #[属性索引, 是否基础属性,(非)线性]
-    attrInfo = ChConfig.ItemEffect_AttrDict.get(attrType, [])
-    if attrInfo == []:
-        return
-    
-    index = ChConfig.Def_CalcAttrIndexDict[(attrInfo[1], attrInfo[2])]
-    
-    attrDict = allAttrList[index]
-    for i in attrInfo[0]:
-        GameWorld.AddDictValue(attrDict, {i:value})
-    return
-
-def CalcAttrDict_TypeEx(attrType, value, allAttrDict):
-    ## 统计玩家属性,累加
-    if value == 0:
-        return
-    
-    #[属性索引, 是否基础属性,(非)线性]
-    attrInfo = ChConfig.ItemEffect_AttrDict.get(attrType, [])
-    if attrInfo == []:
-        return
-    for i in attrInfo[0]:
-        GameWorld.AddDictValue(allAttrDict, {i:value})
     return
 
 ## 培养境界等级
@@ -5175,32 +5147,6 @@
 
 ## 设置保存功能事先计算好的属性值
 def SetCalcAttrListValue(curPlayer, funcIndex, allAttrList, insidePerAttrDict=None, customAttrDict=None):
-    # 设置值之前先清空重置
-    # @param customAttrDict: 自定义的属性信息,必须是格式 {"自定义属性描述名key":属性信息, ...}  自定义属性描述名key - 建议不同功能点之间不要重复
-    ClearCalcAttrListValue(curPlayer, funcIndex)
-    if insidePerAttrDict == None:
-        insidePerAttrDict = {}
-    if customAttrDict == None:
-        customAttrDict = {}
-        
-    battleAttrDict = allAttrList[ChConfig.CalcAttr_Battle]
-    if ChConfig.TYPE_Calc_PerLVAtk in battleAttrDict:
-        # 每1级加的攻击力不一定满1点,所以这里按万分率来算,支持小数算法
-        addAtk = int(curPlayer.GetLV() * battleAttrDict[ChConfig.TYPE_Calc_PerLVAtk] / float(ShareDefine.Def_MaxRateValue))
-        battleAttrDict[ChConfig.TYPE_Calc_AttrATKMin] = battleAttrDict.get(ChConfig.TYPE_Calc_AttrATKMin, 0) + addAtk
-        battleAttrDict[ChConfig.TYPE_Calc_AttrATKMax] = battleAttrDict.get(ChConfig.TYPE_Calc_AttrATKMax, 0) + addAtk
-        
-    if ChConfig.TYPE_Calc_PerLVMaxHP in battleAttrDict:
-        # 每1级加的生命值不会少于1点,所以直接乘
-        addMaxHP = curPlayer.GetLV() * battleAttrDict[ChConfig.TYPE_Calc_PerLVMaxHP]
-        battleAttrDict[ChConfig.TYPE_Calc_AttrMaxHP] = battleAttrDict.get(ChConfig.TYPE_Calc_AttrMaxHP, 0) + addMaxHP
-        
-    playerID = curPlayer.GetPlayerID()
-    if playerID not in PyGameData.g_playerFuncAttrDict:
-        PyGameData.g_playerFuncAttrDict[playerID] = {}
-    funcAttrDict = PyGameData.g_playerFuncAttrDict[playerID]
-    funcAttrDict[funcIndex] = [allAttrList, insidePerAttrDict, customAttrDict]
-    #GameWorld.DebugLog("保存功能点属性: funcIndex=%s, %s, %s" % (funcIndex, allAttrList, insidePerAttrDict))
     return
 
 def GetCalcAttrListValue(curPlayer, funcIndex):
@@ -5208,57 +5154,7 @@
     attrList = [{} for _ in range(4)]
     insidePerAttrDict = {}
     customAttrDict = {}
-    if isinstance(funcIndex, int):
-        funcIndexList = [funcIndex]
-    elif isinstance(funcIndex, list):
-        funcIndexList = funcIndex
-    else:
-        return attrList, insidePerAttrDict, customAttrDict
-    
-    playerID = curPlayer.GetPlayerID()
-    if playerID not in PyGameData.g_playerFuncAttrDict:
-        return attrList, insidePerAttrDict, customAttrDict
-    funcAttrDict = PyGameData.g_playerFuncAttrDict[playerID]
-    for funcIndex in funcIndexList:
-        if funcIndex not in funcAttrDict:
-            continue
-        funcAttrList, funcInsidePerAttrDict, funcCustomAttrDict = funcAttrDict[funcIndex]
-        for i, attrDict in enumerate(attrList):
-            curAttrDict = funcAttrList[i]
-            AddAttrDictValue(attrDict, curAttrDict)
-        customAttrDict.update(funcCustomAttrDict)
-        AddAttrDictValue(insidePerAttrDict, funcInsidePerAttrDict)
     return attrList, insidePerAttrDict, customAttrDict
-
-## 重置缓存
-def ClearCalcAttrListValue(curPlayer, funcIndex):
-    playerID = curPlayer.GetPlayerID()
-    if playerID not in PyGameData.g_playerFuncAttrDict:
-        return
-    funcAttrDict = PyGameData.g_playerFuncAttrDict[playerID]
-    funcAttrDict.pop(funcIndex, None)
-    return
-
-def AddAttrListValue(attrList):
-    addAttrList = [{} for _ in range(4)]
-    for aList in attrList:
-        for i in ChConfig.CalcAttrIndexList:
-            AddAttrDictValue(addAttrList[i], aList[i])
-    return addAttrList
-
-## 属性值字典累加
-def AddAttrDictValue(dict1, dict2):
-    for key, value in dict2.items():
-        if key not in dict1:
-            dict1[key] = value
-        else:
-            aValue = dict1[key]
-            if key in ChConfig.TYPE_Calc_DeclineList:
-                # 这种算法的属性一般是万分率的,最大不超过百分百,故暂默认万分率, 若有不是万分率的属性再做处理
-                dict1[key] = 10000 - (10000 - aValue) * (10000 - value)
-            else:
-                dict1[key] = aValue + value
-    return
 
 def GetLordAttr(curPlayer):
     ## 获取主公属性汇总
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
index 9c66bbb..519373b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -21,7 +21,6 @@
 import PlayerControl
 import ChConfig
 import OperControlManager
-import OpenServerCampaign
 import ItemCommon
 import ChEquip
 import ShareDefine
@@ -29,7 +28,6 @@
 import ItemControler
 import NetPackCommon
 import PlayerBillboard
-import PlayerAttrFruit
 import GameFuncComm
 import IpyGameDataPY
 import CrossPlayerData
@@ -394,166 +392,167 @@
 
 def CalcHorseAttrEx(curPlayer):
     ## 计算马匹属性
-    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
-        return
-        
-    allAttrList = [{} for _ in range(4)]
-    allAttrListHorseSoul = [{} for _ in range(4)]
-    allAttrListSkin = [{} for _ in range(4)]
-    allAttrListTrain = [{} for _ in range(4)]
-    allAttrListStar = [{} for _ in range(4)]
-    
-    customAttrDictHorse = {}
-    customAttrDictSkin = {}
-    
-    horseSpeed = 0 # 坐骑功能增加的速度值,骑乘时才有效果
-    horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV)
-    # 等阶培养属性
-    #totalItemCount = 0
-    horseBaseAttrInfo = {}
-    ipyDataMgr = IpyGameDataPY.IPY_Data()
-    for index in xrange(ipyDataMgr.GetHorseLVUpCount()):
-        horseIpyData = ipyDataMgr.GetHorseLVUpByIndex(index)
-        dataHorseLV = horseIpyData.GetHorseLV()
-        if dataHorseLV > horseLV:
-            break
-        elif dataHorseLV == horseLV:
-            upItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserEatItemCount)
-        else:
-            upItemCount = horseIpyData.GetNeedEatCount()
-                
-        # 等阶额外属性
-        lvAttrTypeList = horseIpyData.GetLVAttrType()
-        lvAttrValueList = horseIpyData.GetLVAttrValue()
-        for i, attrID in enumerate(lvAttrTypeList):
-            attrValue = lvAttrValueList[i]
-            if attrID == ShareDefine.Def_Effect_Speed:
-                horseSpeed += attrValue
-                continue
-            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
-            horseBaseAttrInfo[attrID] = horseBaseAttrInfo.get(attrID, 0) + attrValue
-            
-        # 培养丹增加属性
-        upItemPerCount = horseIpyData.GetUpEatItemPerCount()
-        if upItemCount and upItemPerCount:
-            upItemAttrTypeList = horseIpyData.GetUpItemAttrType()
-            upItemAttrValueList = horseIpyData.GetUpItemAttrValue()
-            attrMultiple = upItemCount / upItemPerCount
-            for i, attrID in enumerate(upItemAttrTypeList):
-                attrValue = upItemAttrValueList[i]
-                PlayerControl.CalcAttrDict_Type(attrID, attrValue * attrMultiple, allAttrList)
-                horseBaseAttrInfo[attrID] = horseBaseAttrInfo.get(attrID, 0) + attrValue * attrMultiple
-                
-    customAttrDictHorse["horseBaseAttrInfo"] = horseBaseAttrInfo
-    
-#    # 等阶培养丹累加个数属性
-#    eatItemAttrInfo = IpyGameDataPY.GetFuncCfg("HorseUpItem", 3)
-#    for attrID, attrValue in eatItemAttrInfo:
-#        PlayerControl.CalcAttrDict_Type(attrID, attrValue * totalItemCount, allAttrList)
-        
-    # 幻化属性
-    initFPAdd = 0 #初始战力
-    horseSkinQualityAttrInfo = {}
-    for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()):
-        skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
-        if not CheckHorseSkinState(curPlayer, skinPlusIpyData):
-            continue
-        initFPAdd += skinPlusIpyData.GetInitFightPower()
-        attrTypeList = skinPlusIpyData.GetAttrType()
-        attrValueList = skinPlusIpyData.GetAttrValue()
-        for i, attrID in enumerate(attrTypeList):
-            attrValue = attrValueList[i]
-            if attrID == ShareDefine.Def_Effect_Speed:
-                horseSpeed += attrValue
-                continue
-            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSkin)
-            
-        #觉醒战力
-        skintype = 1
-        horseID = skinPlusIpyData.GetHorseID()
-        skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (skintype, horseID))
-        skinIpyData = IpyGameDataPY.GetIpyGameDataNotLog('HorsePetSkin', skintype, horseID, skinData / 100)
-        if skinIpyData:
-            for attrID, attrValue in skinIpyData.GetAttrInfo().items():
-                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSkin)
-                
-        hIpyData = IpyGameDataPY.GetIpyGameData("Horse", horseID)
-        if hIpyData:
-            quality = hIpyData.GetQuality()
-            if quality not in horseSkinQualityAttrInfo:
-                horseSkinQualityAttrInfo[quality] = {}
-            qualityAttrDict = horseSkinQualityAttrInfo[quality]
-            for i, attrID in enumerate(attrTypeList):
-                attrValue = attrValueList[i]
-                qualityAttrDict[attrID] = qualityAttrDict.get(attrID, 0) + attrValue
-                
-        #星级
-        horseStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserStar % horseID)
-        starIpyData = IpyGameDataPY.GetIpyGameDataNotLog("HorseStarUp", horseID, horseStar)
-        if starIpyData:
-            starAttrType = starIpyData.GetStarAttrType()
-            starAttrValue = starIpyData.GetStarAttrValue()
-            for i, attrID in enumerate(starAttrType):
-                attrValue = starAttrValue[i]
-                if attrID == ShareDefine.Def_Effect_Speed:
-                    horseSpeed += attrValue
-                    continue
-                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
-        
-    customAttrDictSkin["horseSkinQualityAttrInfo"] = horseSkinQualityAttrInfo
-    
-    # 新培养属性
-    for index in xrange(ipyDataMgr.GetHorseTrainCount()):
-        trainIpyData = ipyDataMgr.GetHorseTrainByIndex(index)
-        trainType = trainIpyData.GetTrainType()
-        dataTrainLV = trainIpyData.GetTrainLV()
-        trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserTrainLV % trainType)
-        
-        if dataTrainLV > trainLV:
-            continue
-        elif dataTrainLV == trainLV:
-            trainItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserTrainItemCount % trainType)
-        else:
-            trainItemCount = trainIpyData.GetEatCntTotal()
-            
-        # 等阶额外属性
-        lvAttrTypeList = trainIpyData.GetLVAttrTypeList()
-        lvAttrValueList = trainIpyData.GetLVAttrValueList()
-        for i, attrID in enumerate(lvAttrTypeList):
-            attrValue = lvAttrValueList[i]
-            if attrID == ShareDefine.Def_Effect_Speed:
-                horseSpeed += attrValue
-                continue
-            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListTrain)
-            
-        # 培养丹增加属性
-        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, allAttrListTrain)
-                
-    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_Horse, initFPAdd)
-    
-    #GameWorld.DebugLog("坐骑功能属性: horseLV=%s,horseSpeed=%s,totalItemCount=%s,initFPAdd=%s" % (horseLV, horseSpeed, totalItemCount, initFPAdd))
-    
-    # 先缓存值,骑乘状态时进行附加
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_SpeedHorse, horseSpeed)
-    
-    # 果实对坐骑的加成, 魂石果实算附加属性层,单独计算
-    fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrListHorseSoul, ShareDefine.Def_AttrFruitFunc_Horse)
-    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_HorseSoul, fightPowerEx)
-    
-    # 保存计算值
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Horse, allAttrList, customAttrDict=customAttrDictHorse)
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSoul, allAttrListHorseSoul)
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkin, allAttrListSkin, customAttrDict=customAttrDictSkin)
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseTarin, allAttrListTrain)
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseStar, allAttrListStar)
     return
+#    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
+#        return
+#        
+#    allAttrList = [{} for _ in range(4)]
+#    allAttrListHorseSoul = [{} for _ in range(4)]
+#    allAttrListSkin = [{} for _ in range(4)]
+#    allAttrListTrain = [{} for _ in range(4)]
+#    allAttrListStar = [{} for _ in range(4)]
+#    
+#    customAttrDictHorse = {}
+#    customAttrDictSkin = {}
+#    
+#    horseSpeed = 0 # 坐骑功能增加的速度值,骑乘时才有效果
+#    horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV)
+#    # 等阶培养属性
+#    #totalItemCount = 0
+#    horseBaseAttrInfo = {}
+#    ipyDataMgr = IpyGameDataPY.IPY_Data()
+#    for index in xrange(ipyDataMgr.GetHorseLVUpCount()):
+#        horseIpyData = ipyDataMgr.GetHorseLVUpByIndex(index)
+#        dataHorseLV = horseIpyData.GetHorseLV()
+#        if dataHorseLV > horseLV:
+#            break
+#        elif dataHorseLV == horseLV:
+#            upItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserEatItemCount)
+#        else:
+#            upItemCount = horseIpyData.GetNeedEatCount()
+#                
+#        # 等阶额外属性
+#        lvAttrTypeList = horseIpyData.GetLVAttrType()
+#        lvAttrValueList = horseIpyData.GetLVAttrValue()
+#        for i, attrID in enumerate(lvAttrTypeList):
+#            attrValue = lvAttrValueList[i]
+#            if attrID == ShareDefine.Def_Effect_Speed:
+#                horseSpeed += attrValue
+#                continue
+#            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
+#            horseBaseAttrInfo[attrID] = horseBaseAttrInfo.get(attrID, 0) + attrValue
+#            
+#        # 培养丹增加属性
+#        upItemPerCount = horseIpyData.GetUpEatItemPerCount()
+#        if upItemCount and upItemPerCount:
+#            upItemAttrTypeList = horseIpyData.GetUpItemAttrType()
+#            upItemAttrValueList = horseIpyData.GetUpItemAttrValue()
+#            attrMultiple = upItemCount / upItemPerCount
+#            for i, attrID in enumerate(upItemAttrTypeList):
+#                attrValue = upItemAttrValueList[i]
+#                PlayerControl.CalcAttrDict_Type(attrID, attrValue * attrMultiple, allAttrList)
+#                horseBaseAttrInfo[attrID] = horseBaseAttrInfo.get(attrID, 0) + attrValue * attrMultiple
+#                
+#    customAttrDictHorse["horseBaseAttrInfo"] = horseBaseAttrInfo
+#    
+##    # 等阶培养丹累加个数属性
+##    eatItemAttrInfo = IpyGameDataPY.GetFuncCfg("HorseUpItem", 3)
+##    for attrID, attrValue in eatItemAttrInfo:
+##        PlayerControl.CalcAttrDict_Type(attrID, attrValue * totalItemCount, allAttrList)
+#        
+#    # 幻化属性
+#    initFPAdd = 0 #初始战力
+#    horseSkinQualityAttrInfo = {}
+#    for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()):
+#        skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
+#        if not CheckHorseSkinState(curPlayer, skinPlusIpyData):
+#            continue
+#        initFPAdd += skinPlusIpyData.GetInitFightPower()
+#        attrTypeList = skinPlusIpyData.GetAttrType()
+#        attrValueList = skinPlusIpyData.GetAttrValue()
+#        for i, attrID in enumerate(attrTypeList):
+#            attrValue = attrValueList[i]
+#            if attrID == ShareDefine.Def_Effect_Speed:
+#                horseSpeed += attrValue
+#                continue
+#            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSkin)
+#            
+#        #觉醒战力
+#        skintype = 1
+#        horseID = skinPlusIpyData.GetHorseID()
+#        skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (skintype, horseID))
+#        skinIpyData = IpyGameDataPY.GetIpyGameDataNotLog('HorsePetSkin', skintype, horseID, skinData / 100)
+#        if skinIpyData:
+#            for attrID, attrValue in skinIpyData.GetAttrInfo().items():
+#                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSkin)
+#                
+#        hIpyData = IpyGameDataPY.GetIpyGameData("Horse", horseID)
+#        if hIpyData:
+#            quality = hIpyData.GetQuality()
+#            if quality not in horseSkinQualityAttrInfo:
+#                horseSkinQualityAttrInfo[quality] = {}
+#            qualityAttrDict = horseSkinQualityAttrInfo[quality]
+#            for i, attrID in enumerate(attrTypeList):
+#                attrValue = attrValueList[i]
+#                qualityAttrDict[attrID] = qualityAttrDict.get(attrID, 0) + attrValue
+#                
+#        #星级
+#        horseStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserStar % horseID)
+#        starIpyData = IpyGameDataPY.GetIpyGameDataNotLog("HorseStarUp", horseID, horseStar)
+#        if starIpyData:
+#            starAttrType = starIpyData.GetStarAttrType()
+#            starAttrValue = starIpyData.GetStarAttrValue()
+#            for i, attrID in enumerate(starAttrType):
+#                attrValue = starAttrValue[i]
+#                if attrID == ShareDefine.Def_Effect_Speed:
+#                    horseSpeed += attrValue
+#                    continue
+#                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
+#        
+#    customAttrDictSkin["horseSkinQualityAttrInfo"] = horseSkinQualityAttrInfo
+#    
+#    # 新培养属性
+#    for index in xrange(ipyDataMgr.GetHorseTrainCount()):
+#        trainIpyData = ipyDataMgr.GetHorseTrainByIndex(index)
+#        trainType = trainIpyData.GetTrainType()
+#        dataTrainLV = trainIpyData.GetTrainLV()
+#        trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserTrainLV % trainType)
+#        
+#        if dataTrainLV > trainLV:
+#            continue
+#        elif dataTrainLV == trainLV:
+#            trainItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserTrainItemCount % trainType)
+#        else:
+#            trainItemCount = trainIpyData.GetEatCntTotal()
+#            
+#        # 等阶额外属性
+#        lvAttrTypeList = trainIpyData.GetLVAttrTypeList()
+#        lvAttrValueList = trainIpyData.GetLVAttrValueList()
+#        for i, attrID in enumerate(lvAttrTypeList):
+#            attrValue = lvAttrValueList[i]
+#            if attrID == ShareDefine.Def_Effect_Speed:
+#                horseSpeed += attrValue
+#                continue
+#            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListTrain)
+#            
+#        # 培养丹增加属性
+#        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, allAttrListTrain)
+#                
+#    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_Horse, initFPAdd)
+#    
+#    #GameWorld.DebugLog("坐骑功能属性: horseLV=%s,horseSpeed=%s,totalItemCount=%s,initFPAdd=%s" % (horseLV, horseSpeed, totalItemCount, initFPAdd))
+#    
+#    # 先缓存值,骑乘状态时进行附加
+#    curPlayer.SetDict(ChConfig.Def_PlayerKey_SpeedHorse, horseSpeed)
+#    
+#    # 果实对坐骑的加成, 魂石果实算附加属性层,单独计算
+#    fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrListHorseSoul, ShareDefine.Def_AttrFruitFunc_Horse)
+#    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_HorseSoul, fightPowerEx)
+#    
+#    # 保存计算值
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Horse, allAttrList, customAttrDict=customAttrDictHorse)
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSoul, allAttrListHorseSoul)
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkin, allAttrListSkin, customAttrDict=customAttrDictSkin)
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseTarin, allAttrListTrain)
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseStar, allAttrListStar)
+#    return
 
 def GetHorseSkinActCount(curPlayer):
     horseSkinActCount = 0
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
index 0c96bc7..872e5f6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
@@ -43,6 +43,7 @@
         self.heroBatAttrDict = {} # 武将的最终战斗属性字典, {attrID:value, ...}
         self.heroSkillIDList = [] # 武将拥有的技能ID列表 [skillID, ...]
         self.fightPower = 0 # 武将最终战力
+        self.skillFightPower = 0 # 技能战力
         return
     
 class Lineup():
@@ -674,23 +675,44 @@
             else:
                 attrValue = FormulaControl.Eval("otherAttrFormula", otherAttrFormula, attrParamDict)
             #GameWorld.DebugLog("    attrID=%s,attrValue=%s,attrParamDict=%s" % (attrID, attrValue, attrParamDict))
-            lineupHero.heroBatAttrDict[attrID] = attrValue
             
             attrIpyData = IpyGameDataPY.GetIpyGameData("PlayerAttr", attrID)
             attrName = attrIpyData.GetParameter() if attrIpyData else "%s" % attrID
             fightPowerParamDict[attrName] = attrValue
             if attrValue:
+                lineupHero.heroBatAttrDict[attrID] = attrValue
                 logAttrDict["%s-%s" % (attrID, attrName)] = attrValue
                 
         # 计算战力
         fightPower = FormulaControl.Eval("fightPowerFormula", fightPowerFormula, fightPowerParamDict)
-        skillFightPower = 0
+        
+        GameWorld.DebugLog("    fightPower=%s,heroSkillIDList=%s" % (fightPower, lineupHero.heroSkillIDList))
+        skillTypeIDDict = {}
         for skillID in lineupHero.heroSkillIDList:
             skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
             if not skillData:
                 continue
+            skillTypeID = skillData.GetSkillTypeID()
+            if skillTypeID not in skillTypeIDDict:
+                skillTypeIDDict[skillTypeID] = skillData
+            else:
+                befSkillData = skillTypeIDDict[skillTypeID]
+                befSkillID = befSkillData.GetSkillID()
+                if befSkillID >= skillID:
+                    continue
+                skillTypeIDDict[skillTypeID] = skillData
+                
+        skillFightPower = 0
+        lineupHero.heroSkillIDList = []
+        for skillData in skillTypeIDDict.values():
+            skillID = skillData.GetSkillID()
+            lineupHero.heroSkillIDList.append(skillID)
             skillFightPower += skillData.GetFightPower()
+        GameWorld.DebugLog("    skillFightPower=%s,heroSkillIDList=%s" % (skillFightPower, lineupHero.heroSkillIDList))
+        
+        # 最终战力
         fightPowerTotal = fightPower + skillFightPower
+        lineupHero.skillFightPower = skillFightPower
         lineupHero.fightPower = fightPowerTotal
         lineupFightPower += fightPowerTotal
         
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
index a248e8b..512cd75 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
@@ -32,10 +32,8 @@
 import PetControl
 import GameWorld
 import IpyGameDataPY
-import PlayerAttrFruit
 import GameMap
 import OpenServerCampaign
-import PlayerMagicWeapon
 import PlayerWeekParty
 import CalcNoLineEffect
 import PassiveBuffEffMng
@@ -870,160 +868,162 @@
 #  @param curPlayer 玩家
 #  @return None
 def CalcPetItemAddPlayerAttr(curPlayer):
-    allAttrListPet = [{} for _ in range(4)]
-    allAttrListPetSign = [{} for _ in range(4)] # 属性含 特殊的技能属性(因为签到技能属性成长,战力也是成长的,所以不能放技能中算战力,暂时放魂石中)
-    allAttrListPetSoul = [{} for _ in range(4)]
-    skillAttrList = [{} for _ in range(4)]
-    allAttrListPetSkin = [{} for _ in range(4)]
-    allAttrListTrain = [{} for _ in range(4)]
-    allAttrListStar = [{} for _ in range(4)]
-    customAttrDictPet = {}
-    totalMinAtk, totalMaxAtk, qualityAttrInfo = GetPetAtkValue(curPlayer)
-    customAttrDictPet["petQualityAttrInfo"] = qualityAttrInfo
-    PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_PetMinAtk, totalMinAtk, allAttrListPet)
-    PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_PetMaxAtk, totalMaxAtk, allAttrListPet)
-    totalSignNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalSignNum) # 总签到天数
-    # 果实给人物加属性, 魂石果实算附加属性层,单独计算
-    fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrListPetSoul, ShareDefine.Def_AttrFruitFunc_Pet)
-    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_PetSoul, fightPowerEx)
-    
-    #灵兽技能给人物加的属性
-    learnSkillList, passiveSkillList = GetPetLearnSkill(curPlayer)
-    #GameWorld.DebugLog("1刷技能属性: %s" % allAttrList)
-    for skillID in passiveSkillList:
-        curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
-        if not curSkill:
-            continue
-        # 灵宠签到技能特殊处理
-        if curSkill.GetSkillTypeID() == ChConfig.Def_SkillID_PetSignDay:
-            for effectIndex in xrange(curSkill.GetEffectCount()):
-                curEffect = curSkill.GetEffect(effectIndex)
-                effID = curEffect.GetEffectID()
-                effValue = curEffect.GetEffectValue(0)
-                PlayerControl.CalcAttrDict_Type(effID, effValue * totalSignNum, allAttrListPetSign)
-            
-            continue
-        for effectIndex in xrange(curSkill.GetEffectCount()):
-            curEffect = curSkill.GetEffect(effectIndex)
-            if curEffect.GetEffectID() in ChConfig.Def_SkillEffs_Pet:
-                # 给宠物加的不处理
-                continue
-            SkillShell.CalcBuffEffAttr(curPlayer, curEffect, skillAttrList)
-    
-    # 新培养属性
-    ipyDataMgr = IpyGameDataPY.IPY_Data()
-    for index in xrange(ipyDataMgr.GetPetTrainCount()):
-        trainIpyData = ipyDataMgr.GetPetTrainByIndex(index)
-        trainType = trainIpyData.GetTrainType()
-        dataTrainLV = trainIpyData.GetTrainLV()
-        trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PetTrainLV % trainType)
-        
-        if dataTrainLV > trainLV:
-            continue
-        elif dataTrainLV == trainLV:
-            trainItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PetTrainItemCount % 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, allAttrListTrain)
-            
-        # 培养丹增加属性
-        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, allAttrListTrain)
-                
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetTarin, allAttrListTrain)
-    
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Pet, allAttrListPet, customAttrDict=customAttrDictPet)
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSoul, allAttrListPetSoul)
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSign, allAttrListPetSign)
-    
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkill, skillAttrList)
-    
-    #初始战力
-    fpExTotal = 0
-    petPackIndex = ShareDefine.rptPet
-    petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
-    for i in range(petPack.GetCount()):
-        petItem = petPack.GetAt(i)
-        if petItem.IsEmpty():
-            continue
-        # 物品上的技能战力,主人上的另算
-        for i in range(petItem.GetUserAttrCount(ShareDefine.Def_IudetPet_Skill)):
-            skillID = petItem.GetUserAttrByIndex(ShareDefine.Def_IudetPet_Skill, i)
-            curSkilData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
-            if not curSkilData:
-                continue
-            fpExTotal += curSkilData.GetFightPower()
-        petItemNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
-        petIpyData = GetPetIpydata(petItemNPCID)
-        if not petIpyData:
-            continue
-        fpExTotal += petIpyData.GetInitFightPower() # 初始战力
-        #觉醒战力
-        skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (2, petItemNPCID), 0)
-        skinIpyData = IpyGameDataPY.GetIpyGameDataNotLog('HorsePetSkin', 2, petItemNPCID, skinData/100)
-        if skinIpyData:
-            for attrID, attrValue in skinIpyData.GetAttrInfo().items():
-                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListPetSkin)
-                
-        #星级
-        curStar = petItem.GetUserAttr(ShareDefine.Def_IudetPet_Star)
-        starIpyData = IpyGameDataPY.GetIpyGameDataNotLog("PetStarUp", petItemNPCID, curStar)
-        if starIpyData:
-            starAttrType = starIpyData.GetStarAttrType()
-            starAttrValue = starIpyData.GetStarAttrValue()
-            for i, attrID in enumerate(starAttrType):
-                attrValue = starAttrValue[i]
-                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
-                
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkin, allAttrListPetSkin)
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetStar, allAttrListStar)
-    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_Pet, fpExTotal)
-#    GameWorld.DebugLog("宠物榜NPCID: %s, petDict=%s" % (billPetNPCID, str(billPetDict)))
     return
+#    allAttrListPet = [{} for _ in range(4)]
+#    allAttrListPetSign = [{} for _ in range(4)] # 属性含 特殊的技能属性(因为签到技能属性成长,战力也是成长的,所以不能放技能中算战力,暂时放魂石中)
+#    allAttrListPetSoul = [{} for _ in range(4)]
+#    skillAttrList = [{} for _ in range(4)]
+#    allAttrListPetSkin = [{} for _ in range(4)]
+#    allAttrListTrain = [{} for _ in range(4)]
+#    allAttrListStar = [{} for _ in range(4)]
+#    customAttrDictPet = {}
+#    totalMinAtk, totalMaxAtk, qualityAttrInfo = GetPetAtkValue(curPlayer)
+#    customAttrDictPet["petQualityAttrInfo"] = qualityAttrInfo
+#    PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_PetMinAtk, totalMinAtk, allAttrListPet)
+#    PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_PetMaxAtk, totalMaxAtk, allAttrListPet)
+#    totalSignNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalSignNum) # 总签到天数
+#    # 果实给人物加属性, 魂石果实算附加属性层,单独计算
+#    fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrListPetSoul, ShareDefine.Def_AttrFruitFunc_Pet)
+#    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_PetSoul, fightPowerEx)
+#    
+#    #灵兽技能给人物加的属性
+#    learnSkillList, passiveSkillList = GetPetLearnSkill(curPlayer)
+#    #GameWorld.DebugLog("1刷技能属性: %s" % allAttrList)
+#    for skillID in passiveSkillList:
+#        curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
+#        if not curSkill:
+#            continue
+#        # 灵宠签到技能特殊处理
+#        if curSkill.GetSkillTypeID() == ChConfig.Def_SkillID_PetSignDay:
+#            for effectIndex in xrange(curSkill.GetEffectCount()):
+#                curEffect = curSkill.GetEffect(effectIndex)
+#                effID = curEffect.GetEffectID()
+#                effValue = curEffect.GetEffectValue(0)
+#                PlayerControl.CalcAttrDict_Type(effID, effValue * totalSignNum, allAttrListPetSign)
+#            
+#            continue
+#        for effectIndex in xrange(curSkill.GetEffectCount()):
+#            curEffect = curSkill.GetEffect(effectIndex)
+#            if curEffect.GetEffectID() in ChConfig.Def_SkillEffs_Pet:
+#                # 给宠物加的不处理
+#                continue
+#            SkillShell.CalcBuffEffAttr(curPlayer, curEffect, skillAttrList)
+#    
+#    # 新培养属性
+#    ipyDataMgr = IpyGameDataPY.IPY_Data()
+#    for index in xrange(ipyDataMgr.GetPetTrainCount()):
+#        trainIpyData = ipyDataMgr.GetPetTrainByIndex(index)
+#        trainType = trainIpyData.GetTrainType()
+#        dataTrainLV = trainIpyData.GetTrainLV()
+#        trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PetTrainLV % trainType)
+#        
+#        if dataTrainLV > trainLV:
+#            continue
+#        elif dataTrainLV == trainLV:
+#            trainItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PetTrainItemCount % 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, allAttrListTrain)
+#            
+#        # 培养丹增加属性
+#        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, allAttrListTrain)
+#                
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetTarin, allAttrListTrain)
+#    
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Pet, allAttrListPet, customAttrDict=customAttrDictPet)
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSoul, allAttrListPetSoul)
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSign, allAttrListPetSign)
+#    
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkill, skillAttrList)
+#    
+#    #初始战力
+#    fpExTotal = 0
+#    petPackIndex = ShareDefine.rptPet
+#    petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
+#    for i in range(petPack.GetCount()):
+#        petItem = petPack.GetAt(i)
+#        if petItem.IsEmpty():
+#            continue
+#        # 物品上的技能战力,主人上的另算
+#        for i in range(petItem.GetUserAttrCount(ShareDefine.Def_IudetPet_Skill)):
+#            skillID = petItem.GetUserAttrByIndex(ShareDefine.Def_IudetPet_Skill, i)
+#            curSkilData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
+#            if not curSkilData:
+#                continue
+#            fpExTotal += curSkilData.GetFightPower()
+#        petItemNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
+#        petIpyData = GetPetIpydata(petItemNPCID)
+#        if not petIpyData:
+#            continue
+#        fpExTotal += petIpyData.GetInitFightPower() # 初始战力
+#        #觉醒战力
+#        skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (2, petItemNPCID), 0)
+#        skinIpyData = IpyGameDataPY.GetIpyGameDataNotLog('HorsePetSkin', 2, petItemNPCID, skinData/100)
+#        if skinIpyData:
+#            for attrID, attrValue in skinIpyData.GetAttrInfo().items():
+#                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListPetSkin)
+#                
+#        #星级
+#        curStar = petItem.GetUserAttr(ShareDefine.Def_IudetPet_Star)
+#        starIpyData = IpyGameDataPY.GetIpyGameDataNotLog("PetStarUp", petItemNPCID, curStar)
+#        if starIpyData:
+#            starAttrType = starIpyData.GetStarAttrType()
+#            starAttrValue = starIpyData.GetStarAttrValue()
+#            for i, attrID in enumerate(starAttrType):
+#                attrValue = starAttrValue[i]
+#                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
+#                
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkin, allAttrListPetSkin)
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetStar, allAttrListStar)
+#    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_Pet, fpExTotal)
+##    GameWorld.DebugLog("宠物榜NPCID: %s, petDict=%s" % (billPetNPCID, str(billPetDict)))
+#    return
 
 ## 获取灵兽出战时的攻击力
 def GetPetAtkValue(curPlayer):
     qualityAttrInfo = {}
-    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Pet):
-        #GameWorld.DebugLog(' 宠物功能未开启')
-        return 0, 0, qualityAttrInfo
-    
-    classAddAtk = 0
-    petPackIndex = ShareDefine.rptPet
-    petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
-    for i in range(petPack.GetCount()):
-        packItem = petPack.GetAt(i)
-        if packItem.IsEmpty():
-            continue
-        petItemNPCID = packItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
-        classlv = packItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)
-        classIpyData = IpyGameDataPY.GetIpyGameData("PetClassCost", petItemNPCID, classlv + 1)
-        atkAdd = classIpyData.GetAtkAdd() if classIpyData else 0
-        classAddAtk += atkAdd
-        
-        petIpyData = GetPetIpydata(petItemNPCID)
-        if petIpyData:
-            quality = petIpyData.GetQuality()
-            if quality not in qualityAttrInfo:
-                qualityAttrInfo[quality] = {}
-            qualityAttrDict = qualityAttrInfo[quality]
-            qualityAttrDict[ShareDefine.Def_Effect_PetAtk] = qualityAttrDict.get(ShareDefine.Def_Effect_PetAtk, 0) + atkAdd
-            
-    totalMinAtk = classAddAtk
-    totalMaxAtk = classAddAtk
-    return totalMinAtk, totalMaxAtk, qualityAttrInfo
+    return 0, 0, qualityAttrInfo
+#    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Pet):
+#        #GameWorld.DebugLog(' 宠物功能未开启')
+#        return 0, 0, qualityAttrInfo
+#    
+#    classAddAtk = 0
+#    petPackIndex = ShareDefine.rptPet
+#    petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
+#    for i in range(petPack.GetCount()):
+#        packItem = petPack.GetAt(i)
+#        if packItem.IsEmpty():
+#            continue
+#        petItemNPCID = packItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
+#        classlv = packItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)
+#        classIpyData = IpyGameDataPY.GetIpyGameData("PetClassCost", petItemNPCID, classlv + 1)
+#        atkAdd = classIpyData.GetAtkAdd() if classIpyData else 0
+#        classAddAtk += atkAdd
+#        
+#        petIpyData = GetPetIpydata(petItemNPCID)
+#        if petIpyData:
+#            quality = petIpyData.GetQuality()
+#            if quality not in qualityAttrInfo:
+#                qualityAttrInfo[quality] = {}
+#            qualityAttrDict = qualityAttrInfo[quality]
+#            qualityAttrDict[ShareDefine.Def_Effect_PetAtk] = qualityAttrDict.get(ShareDefine.Def_Effect_PetAtk, 0) + atkAdd
+#            
+#    totalMinAtk = classAddAtk
+#    totalMaxAtk = classAddAtk
+#    return totalMinAtk, totalMaxAtk, qualityAttrInfo
 
 def OnPlayerPetLogin(curPlayer):
     ## 登录处理
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
index e11e5b8..78630bc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
@@ -25,9 +25,7 @@
 import ShareDefine
 import ItemCommon
 import PlayerSuccess
-import PlayerAttrFruit
 import IpyGameDataPY
-import PlayerActivity
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
 import PlayerActGarbageSorting
@@ -322,10 +320,10 @@
 
 def CalcStoveAttr(curPlayer):
     # 果实加成
-    allAttrYaoList = [{} for _ in range(4)]
-    fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrYaoList, ShareDefine.Def_AttrFruitFunc_Stove)
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_StoveYao, allAttrYaoList)
-    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_StoveYao, fightPowerEx)
+#    allAttrYaoList = [{} for _ in range(4)]
+#    fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrYaoList, ShareDefine.Def_AttrFruitFunc_Stove)
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_StoveYao, allAttrYaoList)
+#    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_StoveYao, fightPowerEx)
     return
 
 
@@ -337,62 +335,63 @@
 #    tagHead        Head;
 #};
 def PlayerPrayElixir(index, clientPack, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    prayCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyPrayCnt)
-    limitCnt = PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_PrayElixir)
-    if prayCnt >= limitCnt:
-        GameWorld.DebugLog('今日祈福丹药次数已满!prayCnt=%s' % prayCnt)
-        return
-    packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, 1)
-    if not packSpace:
-        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
-        return
-
-    alchemyItemList = IpyGameDataPY.GetFuncEvalCfg('GodAlchemy')
-
-    newItemInfoList = []
-    for itemInfo in alchemyItemList:
-        itemID = itemInfo[1]
-#        if not GetIsCanOutByAlchemyLV(curPlayer, itemID):
-#            #GameWorld.DebugLog('祈福丹药,炼丹等级未达到,移除产出库!itemID=%s'%itemID)
-#            continue
-        if PlayerAttrFruit.IsFruitEatFull(curPlayer, itemID):
-            #GameWorld.DebugLog('祈福丹药,使用次数已满,移除产出库!itemID=%s'%itemID)
-            continue
-        newItemInfoList.append(itemInfo)
-    if not newItemInfoList:
-        GameWorld.DebugLog('祈福丹药,没有丹药可产出!!')
-        return
-
-    makeItemInfo = GameWorld.GetResultByWeightList(newItemInfoList)
-    if not makeItemInfo:
-        GameWorld.DebugLog("祈福丹药, 结果错误!")
-        return
-
-    makeItemID, itemCount = makeItemInfo
-    makeItemData = GameWorld.GetGameData().GetItemByTypeID(makeItemID)
-    if not makeItemData:
-        return
-
-    costMoney = IpyGameDataPY.GetFuncCfg('GodAlchemy', 2)
-    if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney, ChConfig.Def_Cost_AlchemyPray):
-        return
-    #给物品
-    ItemControler.GivePlayerItem(curPlayer, makeItemID, itemCount, 0, [IPY_GameWorld.rptItem],
-                                 event=[ChConfig.ItemGive_Refine, False, {}])
-    #GameWorld.DebugLog('makeItemID=%s,newItemInfoList=%s'%(makeItemID, newItemInfoList))
-
-    #紫色及以上全服广播
-    notifyColor = IpyGameDataPY.GetFuncCfg("AlchemyNotify", 1)
-    needNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 2)
-    notNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 3)
-    if makeItemID not in notNotifyItemIDList and (makeItemID in needNotifyItemIDList or makeItemData.GetItemColor() >= notifyColor):
-        PlayerControl.WorldNotify(0, "BlastfurnaceBlessing", [curPlayer.GetPlayerName(), makeItemID])
-
-    #更新次数
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyPrayCnt, prayCnt + 1)
-    Sycn_AlchemyPrayMsg(curPlayer, makeItemID)
     return
+#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+#    prayCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyPrayCnt)
+#    limitCnt = PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_PrayElixir)
+#    if prayCnt >= limitCnt:
+#        GameWorld.DebugLog('今日祈福丹药次数已满!prayCnt=%s' % prayCnt)
+#        return
+#    packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, 1)
+#    if not packSpace:
+#        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
+#        return
+#
+#    alchemyItemList = IpyGameDataPY.GetFuncEvalCfg('GodAlchemy')
+#
+#    newItemInfoList = []
+#    for itemInfo in alchemyItemList:
+#        itemID = itemInfo[1]
+##        if not GetIsCanOutByAlchemyLV(curPlayer, itemID):
+##            #GameWorld.DebugLog('祈福丹药,炼丹等级未达到,移除产出库!itemID=%s'%itemID)
+##            continue
+#        if PlayerAttrFruit.IsFruitEatFull(curPlayer, itemID):
+#            #GameWorld.DebugLog('祈福丹药,使用次数已满,移除产出库!itemID=%s'%itemID)
+#            continue
+#        newItemInfoList.append(itemInfo)
+#    if not newItemInfoList:
+#        GameWorld.DebugLog('祈福丹药,没有丹药可产出!!')
+#        return
+#
+#    makeItemInfo = GameWorld.GetResultByWeightList(newItemInfoList)
+#    if not makeItemInfo:
+#        GameWorld.DebugLog("祈福丹药, 结果错误!")
+#        return
+#
+#    makeItemID, itemCount = makeItemInfo
+#    makeItemData = GameWorld.GetGameData().GetItemByTypeID(makeItemID)
+#    if not makeItemData:
+#        return
+#
+#    costMoney = IpyGameDataPY.GetFuncCfg('GodAlchemy', 2)
+#    if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney, ChConfig.Def_Cost_AlchemyPray):
+#        return
+#    #给物品
+#    ItemControler.GivePlayerItem(curPlayer, makeItemID, itemCount, 0, [IPY_GameWorld.rptItem],
+#                                 event=[ChConfig.ItemGive_Refine, False, {}])
+#    #GameWorld.DebugLog('makeItemID=%s,newItemInfoList=%s'%(makeItemID, newItemInfoList))
+#
+#    #紫色及以上全服广播
+#    notifyColor = IpyGameDataPY.GetFuncCfg("AlchemyNotify", 1)
+#    needNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 2)
+#    notNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 3)
+#    if makeItemID not in notNotifyItemIDList and (makeItemID in needNotifyItemIDList or makeItemData.GetItemColor() >= notifyColor):
+#        PlayerControl.WorldNotify(0, "BlastfurnaceBlessing", [curPlayer.GetPlayerName(), makeItemID])
+#
+#    #更新次数
+#    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyPrayCnt, prayCnt + 1)
+#    Sycn_AlchemyPrayMsg(curPlayer, makeItemID)
+#    return
 
 
 def Sycn_AlchemyPrayMsg(curPlayer, itemID=0):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py
index c0cfcad..809fdde 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py
@@ -498,20 +498,21 @@
     return
 
 def CalcVIPAttr(curPlayer):
-    allAttrList = [{} for _ in range(4)]
-    
-    # 属性需要判断是否过期
-    #if GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_VIPKillNPCAddAtk):
-    mwID = IpyGameDataPY.GetFuncCfg("VIPAddAtkEXP", 2) # VIP杀怪加属性所需激活法宝
-    if PlayerMagicWeapon.GetIsActiveMagicWeapon(curPlayer, mwID):
-        killLV = GetVIPKillNPCLV(curPlayer)
-        killLVIpyData = IpyGameDataPY.GetIpyGameData("VIPKillNPC", killLV)
-        if killLVIpyData:
-            PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_MinAtk, killLVIpyData.GetAddMinAtk(), allAttrList)
-            PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_MaxAtk, killLVIpyData.GetAddMaxAtk(), allAttrList)
-            
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_VIP, allAttrList)
     return
+#    allAttrList = [{} for _ in range(4)]
+#    
+#    # 属性需要判断是否过期
+#    #if GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_VIPKillNPCAddAtk):
+#    mwID = IpyGameDataPY.GetFuncCfg("VIPAddAtkEXP", 2) # VIP杀怪加属性所需激活法宝
+#    if PlayerMagicWeapon.GetIsActiveMagicWeapon(curPlayer, mwID):
+#        killLV = GetVIPKillNPCLV(curPlayer)
+#        killLVIpyData = IpyGameDataPY.GetIpyGameData("VIPKillNPC", killLV)
+#        if killLVIpyData:
+#            PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_MinAtk, killLVIpyData.GetAddMinAtk(), allAttrList)
+#            PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_MaxAtk, killLVIpyData.GetAddMaxAtk(), allAttrList)
+#            
+#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_VIP, allAttrList)
+#    return
 
 #// A8 05 VIP杀怪等级信息同步开关 #tagCMVIPKillNPCLVInfoSwitch
 #
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index 69d97b0..e22d418 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -48,8 +48,6 @@
 g_stoneLevelIDDict = {} # 宝石类型等级对应物品ID {(stoneEffType, stoneLevel):itemID, ...}
 
 g_refreshAttrBillboardFunc = [] # 刷属性后需要触发的同步排行榜函数列表
-g_playerFuncAttrDict = {} # 玩家功能点属性 {playerID:{funcIndex:属性列表, ...}, ...}
-g_playerEquipPartAttrDict = {} # 玩家装备位养成属性 {playerID:{阶:[强化属性列表, 宝石属性列表, 洗练属性列表], ...}, ...}
 
 g_filterEquipDict = {} # 按装备条件过滤的装备ID,不分职业 {"classLV_color_star":{(itemJob,itemPlace):itemID, ...}, ...}
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 95da8ae..a413601 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -475,378 +475,6 @@
 
 #---写死的技能ID---
 
-#---写死的物品属性效果ID---
-Def_Effect_FreePoint = 200 # 自由灵根,注意此属性ID不能在刷属性中加,只能在某个功能中一次性处理
-Def_Effect_Metal = 201 # 金
-Def_Effect_Wood = 202 # 木
-Def_Effect_Water = 203 # 水
-Def_Effect_Fire = 204 # 火
-Def_Effect_Earth = 205 # 土
-#增加%d力量
-Def_Effect_STR = 2 
-#增加%d真元
-Def_Effect_PNE = 5 
-#增加%d筋骨
-Def_Effect_PHY = 3 
-#增加%d体魄
-Def_Effect_CON = 4 
-#增加HP
-Def_Effect_MaxHP = 6
-#增加%d伤害值(物理和魔法的最大/小),只用到a值
-Def_Effect_Atk = 7
-#增加%d防御值
-Def_Effect_Def = 8 
-#命中(A值为具体值)
-Def_Effect_Hit = 9 
-#闪避(A值为具体值)
-Def_Effect_Miss = 10 
-#攻击速度(A值为具体值)
-Def_Effect_AtkSpeed = 11
-#暴击伤害(a值为固定值,直接加上)
-Def_Effect_SuperHit = 13 
-#暴击伤害减少固定值
-Def_Effect_SuperHitReduce = 14
-#暴击率(A值为万分率, 永恒为具体数值)
-Def_Effect_SuperHitRate = 12 
-# 会心一击概率
-Def_Effect_LuckyHitRate = 15
-# 会心一击固定伤害
-Def_Effect_LuckyHit = 16
-# 会心一击抗性(抗概率), a值为万分率
-Def_Effect_LuckyHitRateReduce = 17
-# 技能伤害加成 (用作伤害加成)其中a值为增加的万分率
-Def_Effect_SkillAtkRate = 18 
-# PVP固定伤害
-Def_Effect_DamagePVP = 19
-# PVP固定减伤
-Def_Effect_DamagePVPReduce = 20
-#生命回复固定值(A值固定值)
-Def_Effect_HPRestore = 21
-#反伤百分比(A值固定值)
-Def_Effect_DamBackPer = 22 
-#移动速度(A值固定值)
-Def_Effect_Speed = 23
-#宠物攻击(A值固定值)
-Def_Effect_PetAtk = 24
-#宠物伤害比例提升(A值万分率)
-Def_Effect_PetDamPer = 25
-#冰攻(A值为具体值) 真实伤害元素攻击, 无视防御, 只有元素防御可以减免伤害, 此项目用冰元素代替
-Def_Effect_IceAtk = 26
-#冰防(A值为具体值) 真实抵抗元素抵抗, 减免元素攻击造成的伤害, 此项目用冰元素代替
-Def_Effect_IceDef = 27
-#无视防御几率提升
-Def_Effect_IgnoreDefRate = 28 
-#无视防御抗性, 受击时减少对方的无视防御属性
-Def_Effect_IgnoreDefRateReduce = 29
-#玩家每次被攻击有20%的几率减少伤害比率
-Def_Effect_DamChanceDef = 30
-#流血伤害
-Def_Effect_BleedDamage = 31
-#攻击回血, 每次攻击回复一定生命值, 固定值
-Def_Effect_AtkBackHP = 32
-#攻击时有几率使目标玩家眩晕0.5秒
-Def_Effect_FaintRate = 33
-#有几率使即将受到的眩晕效果不生效
-Def_Effect_FaintDefRate = 34
-# 附加伤害
-Def_Effect_FinalHurt = 35
-# 附加减伤
-Def_Effect_FinalHurtReduce = 36
-# PVP技能加成 百分比
-Def_Effect_DamagePerPVP = 37
-# PVP技能减免 百分比
-Def_Effect_DamagePerPVPReduce = 38
-# 连击几率(默认100%技能伤害)
-Def_Effect_ComboRate = 39
-# 连击伤害(A值万分率),外层
-Def_Effect_ComboDamPer = 40
-#基础攻击百分比(角色基础+装备基础+强化基础)
-Def_Effect_BaseAtkAddPer = 41
-#基础生命百分比(角色基础+装备基础+强化基础)
-Def_Effect_BaseMaxHPAddPer = 42
-#基础防御百分比(角色基础+装备基础+强化基础)
-Def_Effect_BaseDefAddPer = 43
-#命中/攻击成功率提升,A值填万分率
-Def_Effect_HitRate = 44 #20025
-#闪避/防御成功率提升,A值填万分率
-Def_Effect_MissRate = 45 #20026
-#杀怪经验百分比, 百分比增加基础杀怪经验(a值为万分率,直接加上)
-Def_Effect_FightExpRate = 46
-Def_Effect_SkillAtkRateReduce = 49 #20032
-#增加HP(A值填万分率)
-Def_Effect_MaxHPPer = 50 #20023
-#按比率增加物理攻击力,其中a值为增加的万分率
-Def_Effect_AddAtkByPer = 51 #20018
-#每1级+%s攻击, 数值取万分率,支持小数算法
-Def_Effect_PerLVAtk = 52
-#每1级+%s生命, 数值为固定值
-Def_Effect_PerLVMaxHP = 53
-#装备掉率, (a值为万分率,直接加上)
-Def_Effect_DropEquipPer = 54
-#金币掉率, (a值为万分率,直接加上)
-Def_Effect_DropMoneyPer = 55
-#神兵生命百分比
-Def_Effect_GodWeaponMaxHPPer = 56
-#神兵攻击百分比
-Def_Effect_GodWeaponAtkPer = 57
-#宝石生命百分比
-Def_Effect_StoneMaxHPPer = 58
-#宝石攻击百分比
-Def_Effect_StoneAtkPer = 59
-#装备基础百分比 - 含特殊装备位
-Def_Effect_EquipBaseAddPer = 60
-#基础装备百分比
-Def_Effect_BaseEquipAddPer = 64
-#冰攻百分比(A值为万分率)
-Def_Effect_IceAtkPer = 61
-#冰防百分比(A值为万分率)
-Def_Effect_IceDefPer = 62
-#基础装备生命百分比
-Def_Effect_BaseEquipMaxHPAddPer = 63
-#基础装备攻击百分比
-Def_Effect_BaseEquipAtkAddPer = 65
-#防具防御百分比 - 废弃
-Def_Effect_ArmorDefAddPer = 66
-#主手基础属性值 百分比
-Def_Effect_WeaponAddPer = 121
-#副手基础属性值 百分比
-Def_Effect_Weapon2AddPer = 122
-#腰带基础属性值 百分比
-Def_Effect_BeltAddPer = 123
-#手套基础属性值 百分比
-Def_Effect_GloveAddPer = 124
-#衣袍基础属性值 百分比
-Def_Effect_ClothesAddPer = 125
-#帽子基础属性值 百分比
-Def_Effect_HatAddPer = 126
-#下装基础属性值 百分比
-Def_Effect_TrousersAddPer = 127
-#鞋履基础属性值 百分比
-Def_Effect_ShoesAddPer = 128
-#仙器A基础属性值 百分比
-Def_Effect_ShawlAddPer = 129
-#仙器B基础属性值 百分比
-Def_Effect_RingAddPer = 130
-#仙绳基础属性值 百分比
-Def_Effect_NeckAddPer = 131
-#莲台基础属性值 百分比
-Def_Effect_AmuletAddPer = 132
-
-Def_Effect_MinAtk = 67 # 最小攻击
-Def_Effect_MaxAtk = 68 # 最大攻击
-
-#增加%d防御值(A值填万分率)
-Def_Effect_DefPer = 69 
-#暴击伤害倍率(a值为万分率,直接加上)
-Def_Effect_SuperHitPer = 70
-#移动速度百分比(A值万分率)
-Def_Effect_SpeedPer = 71
-#防护值(A值为具体值)
-Def_Effect_MaxProDef = 72
-#生命上限换算为防护值的百分比(A值为万分率)
-Def_Effect_ProDefHPPer = 73
-#防护值吸收伤害比率(A值为具体值)
-Def_Effect_ProDefAbsorb = 74
-#基础命中百分比(角色基础+装备基础+强化基础)
-Def_Effect_BaseHitAddPer = 75
-#基础闪避百分比(角色基础+装备基础+强化基础)
-Def_Effect_BaseMissAddPer = 76
-Def_Effect_PetMinAtk = 77
-Def_Effect_PetMaxAtk = 78
-Def_Effect_OnlyFinalHurt = 79   # 绝版 额外输出伤害
-Def_Effect_PVPAtkBackHP = 80    # 绝版 PVP攻击回血
-
-Def_Effect_HorseAtkPer = 82 # 坐骑攻击百分比
-Def_Effect_StoneBasePer = 83 # 宝石基础属性百分比
-Def_Effect_RealmBasePer = 84 # 境界基础属性百分比
-Def_Effect_PetSkillAtkRate = 85 # 宠物技能伤害比例
-Def_Effect_WingHPPer = 86 # 翅膀生命百分比
-Def_Effect_SuiteBasePer = 87 # 套装基础属性百分比
-Def_Effect_PlusBaseAtkPer = 88 # 强化基础攻击百分比
-
-Def_Effect_NPCHurtAddPer = 89 # 对怪物伤害加成
-
-Def_Effect_JobAHurtAddPer = 90 # 对目标战士伤害加成
-Def_Effect_JobBHurtAddPer = 91 # 对目标法师伤害加成
-Def_Effect_JobCHurtAddPer = 92 # 对目标弓箭伤害加成
-Def_Effect_JobAAtkReducePer = 93 # 战士攻击伤害减免
-Def_Effect_JobBAtkReducePer = 94 # 法师攻击伤害减免
-Def_Effect_JobCAtkReducePer = 95 # 弓箭攻击伤害减免
-
-Def_Effect_SkillAddPer1 = 102 # 技能伤害增强1
-Def_Effect_SkillAddPer2 = 103 # 技能伤害增强2
-Def_Effect_SkillAddPer3 = 104 # 技能伤害增强3
-Def_Effect_SkillAddPer4 = 105 # 技能伤害增强4
-Def_Effect_SkillAddPer5 = 106 # 技能伤害增强5
-Def_Effect_SkillAddPer6 = 107 # 技能伤害增强6
-Def_Effect_SkillAddPer7 = 108 # 技能伤害增强7
-
-Def_Effect_SkillReducePer1 = 109 # 受到技能伤害减少1
-Def_Effect_SkillReducePer2 = 110 # 受到技能伤害减少2
-Def_Effect_SkillReducePer3 = 111 # 受到技能伤害减少3
-Def_Effect_SkillReducePer4 = 112 # 受到技能伤害减少4
-Def_Effect_SkillReducePer5 = 113 # 受到技能伤害减少5
-Def_Effect_SkillReducePer6 = 114 # 受到技能伤害减少6
-Def_Effect_SkillReducePer7 = 115 # 受到技能伤害减少7
-
-## 技能伤害百分比增加的 属性ID 列表
-SkillAddPerAttrIDList = [Def_Effect_SkillAddPer1, Def_Effect_SkillAddPer2, Def_Effect_SkillAddPer3, Def_Effect_SkillAddPer4, 
-                         Def_Effect_SkillAddPer5, Def_Effect_SkillAddPer6, Def_Effect_SkillAddPer7]
-## 技能伤害百分比减少的 属性ID 列表
-SkillReducePerAttrIDList = [Def_Effect_SkillReducePer1, Def_Effect_SkillReducePer2, Def_Effect_SkillReducePer3, Def_Effect_SkillReducePer4, 
-                            Def_Effect_SkillReducePer5, Def_Effect_SkillReducePer6, Def_Effect_SkillReducePer7]
-    
-Def_Effect_Luck = 120 # 气运
-Def_Effect_LuckPer = 133 # 气运百分率
-
-Def_Effect_NormalHurt = 134 # 普通攻击增伤 
-Def_Effect_NormalHurtPer = 135 # 普通攻击加成 
-Def_Effect_FabaoHurt = 136 # 法宝技能增伤 
-Def_Effect_FabaoHurtPer = 137 # 法宝技能加成 
-
-Def_Effect_SuperHitRateReduce = 138 # 暴击概率抗性
-Def_Effect_LuckyHitReduce = 139 # 会心一击伤害固定减伤
-Def_Effect_LuckyHitPer = 140 # 会心一击伤害百分比
-Def_Effect_DamagePVE = 141  # PVE固定伤害
-Def_Effect_FinalHurtPer = 142   # 最终伤害万分率
-Def_Effect_FinalHurtReducePer = 143    # 最终伤害减少万分
-Def_Effect_YinjiTime = 144    # 每X毫秒自动消失一个印记
-Def_Effect_TheFBSkillsCD = 145    # 减少指定技能组CD XX%
-Def_Effect_BurnValue = 146    # 灼烧固定伤害
-Def_Effect_BurnTimePer = 147    # 延长灼烧时间百分比
-Def_Effect_SubSpeedPer = 148    # 减移动速度百分比
-
-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 # 弑神培养属性加成(攻防血)
-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 # 仙盟打坐经验加成
-
-Def_Effect_BossFinalHurtPer = 166   # Boss最终伤害万分率
-
-#法器生命百分比
-Def_Effect_FaQiMaxHPPer = 167
-#法器攻击百分比
-Def_Effect_FaQiAtkPer = 168
-#法器防御百分比
-Def_Effect_FaQiDefPer = 169
-
-#坐骑幻化生命加成
-Def_Effect_HorseSkinMaxHPPer = 170 # 坐骑幻化生命加成
-#坐骑幻化攻击加成
-Def_Effect_HorseSkinAtkPer = 171 # 坐骑幻化攻击加成
-#坐骑幻化防御加成
-Def_Effect_HorseSkinDefPer = 172 # 坐骑幻化防御加成
-
-#称号生命加成
-Def_Effect_TitleMaxHPPer = 173 # 称号生命加成
-#称号攻击加成
-Def_Effect_TitleAtkPer = 174 # 称号攻击加成
-#称号防御加成
-Def_Effect_TitleDefPer = 175 # 称号防御加成
-
-#头像生命加成
-Def_Effect_FaceMaxHPPer = 176 # 头像生命加成
-#头像攻击加成
-Def_Effect_FaceAtkPer = 177 # 头像攻击加成
-#头像防御加成
-Def_Effect_FaceDefPer = 178 # 头像防御加成
-
-#头像框生命加成
-Def_Effect_FacePicMaxHPPer = 179 # 头像框生命加成
-#头像框攻击加成
-Def_Effect_FacePicAtkPer = 180 # 头像框攻击加成
-#头像框防御加成
-Def_Effect_FacePicDefPer = 181 # 头像框防御加成
-
-Def_Effect_ComboDefRate = 210 # 抗连击概率
-Def_Effect_AtkBackRate = 211 # 反击概率
-Def_Effect_AtkBackDefRate = 212 # 抗反击概率
-Def_Effect_SuckHPPer = 213 # 吸血比率
-Def_Effect_SuckHPDefPer = 214 # 抗吸血比率
-Def_Effect_CurePer = 215 # 强化治疗
-Def_Effect_CureDefPer = 216 # 弱化治疗
-Def_Effect_PetStrengthenPer = 217 # 强化灵兽
-Def_Effect_PetWeakenPer = 218 # 弱化灵兽
-Def_Effect_SuperHitHurtPer = 219 # 强化暴伤
-Def_Effect_SuperHitHurtDefPer = 220 # 弱化暴伤
-Def_Effect_DamBlockRate = 221 # 格挡概率
-Def_Effect_DamBlockDefRate = 222 # 抗格挡概率
-
-#增加%d物理伤害值,其中a值为伤害值
-Def_Effect_AddAtk = 1005
-#增加%d魔法伤害值,其中a值为伤害值
-Def_Effect_AddMAtk = 20020
-#增加内防
-Def_Effect_MagicDef = 20001
-#减技能CD(A值固定值)
-Def_Effect_ReduceSkillCD = 20031
-# 卓越一击倍数(a值为万分率,直接加上)
-Def_Effect_GreatHit = 20029
-
-#内力上限(A值为具体值)
-Def_Effect_MaxMP = 20015
-
-#按比率增加魔法攻击力,其中a值为增加的万分率
-Def_Effect_AddMAtkByPer = 20017
-#火功(A值为具体值)
-Def_Effect_FireAtk = 20003
-#火防(A值为具体值)
-Def_Effect_FireDef = 20008
-
-#风功(A值为具体值)
-Def_Effect_WindAtk = 20002
-#风防(A值为具体值)
-Def_Effect_WindDef = 20007
-
-#雷功(A值为具体值)
-Def_Effect_ThunderAtk = 20004
-#雷防(A值为具体值)
-Def_Effect_ThunderDef = 20009
-
-#毒功(A值为具体值)
-Def_Effect_ToxinAtk = 20006
-#毒防(A值为具体值)
-Def_Effect_ToxinDef = 20011
-
-#翅膀效果id(a值为效果类型)
-Def_Effect_WingType = 2801
-
-#增加宠物属性
-Def_PetEffect_AddSTR = 5041    #加力量
-Def_PetEffect_AddPNE = 5042    #加真元
-Def_PetEffect_AddPHY = 5043    #加筋骨
-Def_PetEffect_AddCON = 5044    #加体魄
-Def_PetEffect_AddATK = 5045    #加伤害值
-Def_PetEffect_AddDEF = 5046    #加外防
-Def_PetEffect_AddMDEF = 5047   #加内防
-Def_PetEffect_AddMaxHP = 5052  #加气血
-Def_PetEffect_AddMaxHPBySelf = 5048     #宠物的气血上限值的百分比加成到主人身上,A值为百分比的值
-Def_PetEffect_AddATKBySelf = 5049       #宠物的外攻上限值的百分比加成到主人身上,A值为百分比的值 
-Def_PetEffect_AddDEFBySelf = 5050       #宠物的外防上限值的百分比加成到主人身上,A值为百分比的值 
-Def_PetEffect_AddMATKBySelf = 5051      #宠物的内攻上限值的百分比加成到主人身上,A值为百分比的值 
-
-# 属性果实功能索引定义
-Def_AttrFruitFuncList = (
-                         Def_AttrFruitFunc_Pet, # 宠物
-                         Def_AttrFruitFunc_Horse, # 坐骑
-                         Def_AttrFruitFunc_Stove, # 丹药
-                         ) = range(3)
 
 #---排行榜---
 #排行榜类型BillboardType
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_502.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_502.py
index e948c74..0c4fa48 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_502.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_502.py
@@ -25,34 +25,34 @@
 #  @return None
 def OnCalcBuffEx(defender, curEffect, calcDict, curBuff):
 
-    totalHP = 0
-    equipPack = defender.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
-    for i in xrange(equipPack.GetCount()):
-        curEquip = equipPack.GetAt(i)
-        
-        if curEquip.IsEmpty():
-            continue
-        if i not in ChConfig.EquipPlace_BaseArmor:
-            continue
-        if not curEquip.GetItemQuality():
-            continue
-        #基础属性效果
-        for i in range(0, curEquip.GetEffectCount()):
-            equipEffect = curEquip.GetEffectByIndex(i)
-            if not equipEffect:
-                break
-            
-            effectID = equipEffect.GetEffectID()
-            if effectID == 0:
-                #最后一个
-                break
-            if effectID != ShareDefine.Def_Effect_MaxHP:
-                continue
-            totalHP += equipEffect.GetEffectValue(0)
-    
-    totalHP = int(totalHP*float(curEffect.GetEffectValue(0))/ChConfig.Def_MaxRateValue)
-    
-    calcDict[ChConfig.TYPE_Calc_AttrMaxHP] = calcDict.get(ChConfig.TYPE_Calc_AttrMaxHP, 0) + totalHP
+#    totalHP = 0
+#    equipPack = defender.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
+#    for i in xrange(equipPack.GetCount()):
+#        curEquip = equipPack.GetAt(i)
+#        
+#        if curEquip.IsEmpty():
+#            continue
+#        if i not in ChConfig.EquipPlace_BaseArmor:
+#            continue
+#        if not curEquip.GetItemQuality():
+#            continue
+#        #基础属性效果
+#        for i in range(0, curEquip.GetEffectCount()):
+#            equipEffect = curEquip.GetEffectByIndex(i)
+#            if not equipEffect:
+#                break
+#            
+#            effectID = equipEffect.GetEffectID()
+#            if effectID == 0:
+#                #最后一个
+#                break
+#            if effectID != ShareDefine.Def_Effect_MaxHP:
+#                continue
+#            totalHP += equipEffect.GetEffectValue(0)
+#    
+#    totalHP = int(totalHP*float(curEffect.GetEffectValue(0))/ChConfig.Def_MaxRateValue)
+#    
+#    calcDict[ChConfig.TYPE_Calc_AttrMaxHP] = calcDict.get(ChConfig.TYPE_Calc_AttrMaxHP, 0) + totalHP
     return
 
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
index 032cb06..a835c35 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
@@ -2167,48 +2167,50 @@
 def GetSkillAddPerByID(curPlayer, skillTypeID):
     ## 获取技能伤害百分比提升值
     # @param skillTypeID: 技能TypeID
-    SkillAddPerAttrIDDict = IpyGameDataPY.GetConfigEx("SkillAddPerAttrIDDict")
-    if not SkillAddPerAttrIDDict:
-        SkillAddPerAttrIDDict = {}
-        skillPlusAttrIDDict = IpyGameDataPY.GetFuncEvalCfg("SkillPlusAttrID", 2, {})
-        for attrIDStr, skillTypeIDList in skillPlusAttrIDDict.items():
-            attrID = int(attrIDStr)
-            if attrID not in ShareDefine.SkillAddPerAttrIDList:
-                continue
-            for cfgSkillTypeID in skillTypeIDList:
-                SkillAddPerAttrIDDict[cfgSkillTypeID] = attrID
-        IpyGameDataPY.SetConfigEx("SkillAddPerAttrIDDict", SkillAddPerAttrIDDict)
-        
-    if skillTypeID not in SkillAddPerAttrIDDict:
-        return 0
-    curAttrID = SkillAddPerAttrIDDict[skillTypeID]
-    attrInfo = ChConfig.ItemEffect_AttrDict.get(curAttrID, [])
-    if attrInfo == []:
-        return 0
-    effIndex = attrInfo[0][0]
-    return EffGetSet.GetValueByEffIndex(curPlayer, effIndex)
+    return 0
+#    SkillAddPerAttrIDDict = IpyGameDataPY.GetConfigEx("SkillAddPerAttrIDDict")
+#    if not SkillAddPerAttrIDDict:
+#        SkillAddPerAttrIDDict = {}
+#        skillPlusAttrIDDict = IpyGameDataPY.GetFuncEvalCfg("SkillPlusAttrID", 2, {})
+#        for attrIDStr, skillTypeIDList in skillPlusAttrIDDict.items():
+#            attrID = int(attrIDStr)
+#            if attrID not in ShareDefine.SkillAddPerAttrIDList:
+#                continue
+#            for cfgSkillTypeID in skillTypeIDList:
+#                SkillAddPerAttrIDDict[cfgSkillTypeID] = attrID
+#        IpyGameDataPY.SetConfigEx("SkillAddPerAttrIDDict", SkillAddPerAttrIDDict)
+#        
+#    if skillTypeID not in SkillAddPerAttrIDDict:
+#        return 0
+#    curAttrID = SkillAddPerAttrIDDict[skillTypeID]
+#    attrInfo = ChConfig.ItemEffect_AttrDict.get(curAttrID, [])
+#    if attrInfo == []:
+#        return 0
+#    effIndex = attrInfo[0][0]
+#    return EffGetSet.GetValueByEffIndex(curPlayer, effIndex)
 
 def GetSkillReducePerByID(curPlayer, skillTypeID):
     ## 获取技能伤害百分比减伤值
     # @param skillTypeID: 技能TypeID
-    SkillReducePerAttrIDDict = IpyGameDataPY.GetConfigEx("SkillReducePerAttrIDDict")
-    if not SkillReducePerAttrIDDict:
-        SkillReducePerAttrIDDict = {}
-        skillPlusAttrIDDict = IpyGameDataPY.GetFuncEvalCfg("SkillPlusAttrID", 2, {})
-        for attrIDStr, skillTypeIDList in skillPlusAttrIDDict.items():
-            attrID = int(attrIDStr)
-            if attrID not in ShareDefine.SkillReducePerAttrIDList:
-                continue
-            for cfgSkillTypeID in skillTypeIDList:
-                SkillReducePerAttrIDDict[cfgSkillTypeID] = attrID
-        IpyGameDataPY.SetConfigEx("SkillReducePerAttrIDDict", SkillReducePerAttrIDDict)
-        
-    if skillTypeID not in SkillReducePerAttrIDDict:
-        return 0
-    curAttrID = SkillReducePerAttrIDDict[skillTypeID]
-    attrInfo = ChConfig.ItemEffect_AttrDict.get(curAttrID, [])
-    if attrInfo == []:
-        return 0
-    effIndex = attrInfo[0][0]
-    return EffGetSet.GetValueByEffIndex(curPlayer, effIndex)
+    return 0
+#    SkillReducePerAttrIDDict = IpyGameDataPY.GetConfigEx("SkillReducePerAttrIDDict")
+#    if not SkillReducePerAttrIDDict:
+#        SkillReducePerAttrIDDict = {}
+#        skillPlusAttrIDDict = IpyGameDataPY.GetFuncEvalCfg("SkillPlusAttrID", 2, {})
+#        for attrIDStr, skillTypeIDList in skillPlusAttrIDDict.items():
+#            attrID = int(attrIDStr)
+#            if attrID not in ShareDefine.SkillReducePerAttrIDList:
+#                continue
+#            for cfgSkillTypeID in skillTypeIDList:
+#                SkillReducePerAttrIDDict[cfgSkillTypeID] = attrID
+#        IpyGameDataPY.SetConfigEx("SkillReducePerAttrIDDict", SkillReducePerAttrIDDict)
+#        
+#    if skillTypeID not in SkillReducePerAttrIDDict:
+#        return 0
+#    curAttrID = SkillReducePerAttrIDDict[skillTypeID]
+#    attrInfo = ChConfig.ItemEffect_AttrDict.get(curAttrID, [])
+#    if attrInfo == []:
+#        return 0
+#    effIndex = attrInfo[0][0]
+#    return EffGetSet.GetValueByEffIndex(curPlayer, effIndex)
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
index ec02178..3452d8a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -2034,11 +2034,11 @@
     needBaseAttrID, needBaseAttrValue = GetSkillUpNeedAttr(stateSkillLV)
     if needBaseAttrID and needBaseAttrValue:
         baseAttrDict = {
-                            ShareDefine.Def_Effect_Metal:PlayerControl.GetMetal(curPlayer),
-                            ShareDefine.Def_Effect_Wood:PlayerControl.GetWood(curPlayer),
-                            ShareDefine.Def_Effect_Water:PlayerControl.GetWater(curPlayer),
-                            ShareDefine.Def_Effect_Fire:PlayerControl.GetFire(curPlayer),
-                            ShareDefine.Def_Effect_Earth:PlayerControl.GetEarth(curPlayer),
+                            #ShareDefine.Def_Effect_Metal:PlayerControl.GetMetal(curPlayer),
+                            #ShareDefine.Def_Effect_Wood:PlayerControl.GetWood(curPlayer),
+                            #ShareDefine.Def_Effect_Water:PlayerControl.GetWater(curPlayer),
+                            #ShareDefine.Def_Effect_Fire:PlayerControl.GetFire(curPlayer),
+                            #ShareDefine.Def_Effect_Earth:PlayerControl.GetEarth(curPlayer),
                          }
         if needBaseAttrID not in baseAttrDict:
             GameWorld.ErrLog('    技能升级属性点条件配置错误,curSkillTypeID=%s,needBaseAttrID=%s'%(curSkillTypeID, needBaseAttrID))
@@ -2171,11 +2171,11 @@
     if skillTypeID not in PyGameData.g_elemntSkillDict:
         return isNotify, hasChangeLV
     baseAttrDict = {
-                            ShareDefine.Def_Effect_Metal:PlayerControl.GetMetal(curPlayer),
-                            ShareDefine.Def_Effect_Wood:PlayerControl.GetWood(curPlayer),
-                            ShareDefine.Def_Effect_Water:PlayerControl.GetWater(curPlayer),
-                            ShareDefine.Def_Effect_Fire:PlayerControl.GetFire(curPlayer),
-                            ShareDefine.Def_Effect_Earth:PlayerControl.GetEarth(curPlayer),
+                            #ShareDefine.Def_Effect_Metal:PlayerControl.GetMetal(curPlayer),
+                            #ShareDefine.Def_Effect_Wood:PlayerControl.GetWood(curPlayer),
+                            #ShareDefine.Def_Effect_Water:PlayerControl.GetWater(curPlayer),
+                            #ShareDefine.Def_Effect_Fire:PlayerControl.GetFire(curPlayer),
+                            #ShareDefine.Def_Effect_Earth:PlayerControl.GetEarth(curPlayer),
                          }
     activeSkillLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % skillTypeID)
     limitInfoList = PyGameData.g_elemntSkillDict[skillTypeID]

--
Gitblit v1.8.0