From afea2d9d4b9cb6d0982c02a775e8198fc2421c53 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 08 十二月 2023 18:21:28 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(增加抗连击、反击、抗反击、吸血、抗吸血属性,玩家及NPC属性接口通用;连击、反击属性效果支持;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                         |   13 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                   |  157 +++++++++++++++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py     |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py                    |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py                     |   17 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4075.py |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                       |   44 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py                   |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                       |   61 +++---
 PySysDB/PySysDBPY.h                                                                                        |   12 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py                             |   90 ++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                              |   13 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py                |   41 ----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                            |   32 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py          |   15 +
 15 files changed, 395 insertions(+), 118 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 1def995..af055a8 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -631,6 +631,16 @@
 	DWORD		_NPCID;	//NPCID
 	BYTE		FightPowerLackAtkLimit;	//战力不足限制攻击
 	DWORD		SuppressFightPower;	//推荐/压制战力
+	DWORD		AtkSpeed;	//攻击速度
+	DWORD		SuperHitRateReduce;	//抗暴击概率
+	DWORD		FaintRate;	//击晕概率
+	DWORD		FaintDefRate;	//抗击晕概率
+	DWORD		ComboRate;	//连击概率
+	DWORD		ComboDefRate;	//抗连击概率
+	DWORD		AtkBackRate;	//反击概率
+	DWORD		AtkBackDefRate;	//抗反击概率
+	DWORD		SuckHPPer;	//吸血比率
+	DWORD		SuckHPDefPer;	//抗吸血比率
 };
 
 //成长型境界怪物表
@@ -887,6 +897,8 @@
 	DWORD		_DataMapID;	//数据地图ID
 	WORD		_LineID;	//功能线路ID
 	DWORD		NPCID;	//NPCID
+	DWORD		SummerNPCID;	//召唤兽ID
+	list		AwardItemList;	//过关奖励列表,[[物品ID,个数,是否拍品], ...]
 };
 
 //副本助战表
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 1e462d0..acec481 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -694,6 +694,12 @@
 Def_Effect_FamilyWarAtkPer = 164 # 仙盟联赛攻击加成
 Def_Effect_FamilySitExpPer = 165 # 仙盟打坐经验加成
 
+Def_Effect_ComboDefRate = 210 # 抗连击概率
+Def_Effect_AtkBackRate = 211 # 反击概率
+Def_Effect_AtkBackDefRate = 212 # 抗反击概率
+Def_Effect_SuckHPPer = 213 # 吸血比率
+Def_Effect_SuckHPDefPer = 214 # 抗吸血比率
+
 #增加%d物理伤害值,其中a值为伤害值
 Def_Effect_AddAtk = 1005
 #增加%d魔法伤害值,其中a值为伤害值
@@ -1060,7 +1066,12 @@
 CDBPlayerRefresh_JiYuan, # 机缘币  245
 CDBPlayerRefresh_BTGMYuE, # BTGM余额  246
 CDBPlayerRefresh_SuccessScore, # 成就积分  247
-) = range(146, 248)
+CDBPlayerRefresh_ComboDefRate, # 抗连击概率 248
+CDBPlayerRefresh_AtkBackRate, # 反击概率 249
+CDBPlayerRefresh_AtkBackDefRate, # 抗反击概率 250
+CDBPlayerRefresh_SuckHPPer, # 吸血比率 251
+CDBPlayerRefresh_SuckHPDefPer, # 抗吸血比率 252
+) = range(146, 253)
 
 TYPE_Price_Gold_Paper_Money = 5    # 金钱类型,(先用礼券,再用金子)
 TYPE_Price_Family_Contribution = 6 # 战盟贡献度(活跃度转换得来)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index 73768b3..7c17195 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -1425,7 +1425,7 @@
         return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReduce(defObj)
     
     aSuperHitRate = atkObj.GetSuperHitRate()
-    dSuperHitRateReduce = PlayerControl.GetSuperHitRateReduce(defObj)
+    dSuperHitRateReduce = GameObj.GetSuperHitRateReduce(defObj)
     superHitRate = eval(ReadChConfig.GetChConfig("CalcSuperHitRate"))
     superHitRate += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, 
                                                                        ChConfig.TriggerType_Buff_AddSuperHitRate)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
index 7963bd4..072738d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
@@ -1363,6 +1363,9 @@
 #  @return None
 #  @remarks 函数详细说明.
 def __Sync_AttackResult(attacker, defender, curSkill):
+    battleType = AttackCommon.GetBattleType(attacker, curSkill)
+    turnBattleType = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
+    battleType = turnBattleType * 10 + battleType # 通知的battle修改: 回合攻击战斗类型*10+原战斗类型
     #普通攻击
     if not curSkill:
         #GameWorld.Log("玩家普通攻击成功")
@@ -1373,7 +1376,7 @@
         else:
             curHurt = g_skillHurtList.GetHurtAt(0)
             attacker.BaseAttack(curHurt.GetObjID(), curHurt.GetObjType(),
-                                AttackCommon.GetBattleType(attacker, curSkill),
+                                battleType,
                                 curHurt.GetAttackType(), curHurt.GetHurtHP(), curHurt.GetHurtHPEx(), curHurt.GetCurHP(), curHurt.GetCurHPEx())
         
         #//返回值无意义
@@ -1384,7 +1387,6 @@
     changeSkillID = PassiveBuffEffMng.GetPassiveSkillValueByTriggerTypeEx(attacker, None, curSkill, ChConfig.TriggerType_ChangeSkillEff)
     if changeSkillID:
         skillID = changeSkillID
-    battleType = AttackCommon.GetBattleType(attacker, curSkill)
     #无目标类技能
     if not defender:
         #玩家处理
@@ -1698,7 +1700,7 @@
     if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
         return
     
-    faintRate = PlayerControl.GetFaintRate(attacker)
+    faintRate = GameObj.GetFaintRate(attacker)
     if not faintRate:
         #GameWorld.DebugLog("没有击晕概率!", attacker.GetID())
         return
@@ -1724,7 +1726,7 @@
     if GameObj.GetHP(defender) <= 0:
         return
 
-    tagFaintRate = PlayerControl.GetFaintDefRate(defender) if defender.GetGameObjType() == IPY_GameWorld.gotPlayer else 0
+    tagFaintRate = GameObj.GetFaintDefRate(defender) if defender.GetGameObjType() == IPY_GameWorld.gotPlayer else 0
 
     # 添加最高60%击晕效果
     maxRate = IpyGameDataPY.GetFuncCfg("PassiveSkillFaint", 1)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index 7f2d67d..375d744 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -97,7 +97,7 @@
     curPet = curPlayer.GetPetMgr().GetFightPet()
     tagPet = None
     
-    GameWorld.DebugLog("执行回合制战斗: mapID=%s,funcLineID=%s,tagPlayerID=%s,tagObjID=%s" 
+    GameWorld.DebugLog("===== 执行回合制战斗: mapID=%s,funcLineID=%s,tagPlayerID=%s,tagObjID=%s" 
                        % (mapID, funcLineID, tagPlayerID, tagObj.GetID()), playerID)
     GameWorld.DebugLog("curPlayer.GetSightLevel=%s,tagObj.GetSightLevel=%s" 
                        % (curPlayer.GetSightLevel(), tagObj.GetSightLevel()), playerID)
@@ -117,16 +117,23 @@
         for gameObj in objList:
             TurnFightObjStartInit(gameObj)
             
-    curSpeed = 0
-    tagSpeed = 0
-    orderList = [1, 2] if curSpeed >= tagSpeed else [2, 1]
-    GameWorld.DebugLog("playerHP=%s,tagHP=%s,curSpeed=%s,tagSpeed=%s" 
-                       % (GameObj.GetHP(curPlayer), GameObj.GetHP(tagObj), curSpeed, tagSpeed), playerID)
+    curAtkSpeed = GameObj.GetAtkSpeed(curPlayer)
+    tagAtkSpeed = GameObj.GetAtkSpeed(tagObj)
+    orderList = [1, 2] if curAtkSpeed >= tagAtkSpeed else [2, 1]
+    GameWorld.DebugLog("playerHP=%s,tagHP=%s,curAtkSpeed=%s,tagAtkSpeed=%s" 
+                       % (GameObj.GetHP(curPlayer), GameObj.GetHP(tagObj), curAtkSpeed, tagAtkSpeed), playerID)
     
     isWin = None
     for turnNum in range(1, turnMax + 1):
-        GameWorld.DebugLog("回合制战斗轮次: %s" % turnNum, playerID)
+        GameWorld.DebugLog("----- 回合制战斗轮次: %s -----" % turnNum, playerID)
         SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Fighting, turnNum, turnMax)
+        
+        # 回合开始: 做一些每回合重置逻辑或者某些根据回合触发的效果等
+        for objList in factionObjDict.values():
+            for gameObj in objList:
+                TurnFightObjTurnStart(gameObj, turnNum)
+                
+        # 回合战斗: 轮流依次攻击
         for index in range(factionObjMax):
             for faction in orderList:
                 objList = factionObjDict[faction]
@@ -135,7 +142,7 @@
                 gameObj = objList[index]
                 if not gameObj:
                     continue
-                gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, turnNum)                
+                
                 tagGameObj = tagObj if faction == 1 else curPlayer
                 objType = gameObj.GetGameObjType()
                 objID = gameObj.GetID()
@@ -144,17 +151,13 @@
                 
                 GameWorld.DebugLog("    行动: turnNum=%s,index=%s,faction=%s,objType=%s,objID=%s,tagObjType=%s,tagObjID=%s" 
                                    % (turnNum, index, faction, objType, objID, tagObjType, tagObjID), playerID)
-                if objType == IPY_GameWorld.gotPlayer: 
-                    PlayerAttack(gameObj, tagGameObj, tick)
-                else:
-                    NPCAttack(gameObj, tagGameObj, tick)
-                    
+                DoAttack(gameObj, tagGameObj, tick)
+                
                 if tagGameObj and GameObj.GetHP(tagGameObj) > 0:
-                    GameWorld.DebugLog("        playerHP=%s,tagHP=%s" % (GameObj.GetHP(curPlayer), GameObj.GetHP(tagObj)), playerID)
                     continue
                 
                 isWin = faction == 1
-                GameWorld.DebugLog("        tagObjType=%s,tagObjID=%s,被击杀,结束战斗: isWin=%s" % (tagObjType, tagObjID, isWin), playerID)
+                GameWorld.DebugLog("        tagObjType=%s,tagObjID=%s,被击杀,结束战斗: isWin=%s" % (tagObjType, tagObjID, isWin))
                 break
             
             if isWin != None:
@@ -170,7 +173,7 @@
         for gameObj in objList:
             TurnFightObjOverReset(gameObj)
             
-    GameWorld.DebugLog("回合制战斗结束: mapID=%s,funcLineID=%s,tagPlayerID=%s,isWin=%s,overState=%s" 
+    GameWorld.DebugLog("===== 回合制战斗结束: mapID=%s,funcLineID=%s,tagPlayerID=%s,isWin=%s,overState=%s" 
                        % (mapID, funcLineID, tagPlayerID, isWin, overState), playerID)
     return
 
@@ -195,11 +198,31 @@
         pass
     return
 
+def TurnFightObjTurnStart(gameObj, turnNum):
+    ## 回合制战斗实例 - 每回合开始时处理
+    if not gameObj:
+        return
+    
+    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, turnNum)
+    # 重置连击、反击数
+    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, 0)
+    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, 0)
+    
+    objType = gameObj.GetGameObjType()
+    if objType == IPY_GameWorld.gotPlayer:
+        pass
+    
+    elif objType == IPY_GameWorld.gotNPC:
+        pass
+    
+    return
+
 def TurnFightObjOverReset(gameObj):
     ## 回合制战斗实例结束重置
     if not gameObj:
         return
     gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, 0)
+    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0)
     
     objType = gameObj.GetGameObjType()
     if objType == IPY_GameWorld.gotPlayer:
@@ -212,17 +235,107 @@
             
     return
 
+def DoAttack(curObj, tagObj, tick):
+    curID = curObj.GetID()
+    tagID = tagObj.GetID()
+    if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer: 
+        atkRet = PlayerAttack(curObj, tagObj, tick)
+    else:
+        atkRet = NPCAttack(curObj, tagObj, tick)
+        
+    turnBattleType = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
+    curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 无论攻击成功与否都重置战斗类型
+    
+    if not atkRet:
+        return
+    
+    if turnBattleType == ChConfig.TurnBattleType_Combo:
+        comboNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1
+        curObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum)
+        GameWorld.DebugLog("            连击: comboID=%s,comboNum=%s" % (curID, comboNum))
+    elif turnBattleType == ChConfig.TurnBattleType_AtkBack:
+        atkBackNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1
+        curObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum)
+        GameWorld.DebugLog("            反击: atkBackID=%s,atkBackNum=%s" % (curID, atkBackNum))
+        
+    GameWorld.DebugLog("            curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, GameObj.GetHP(curObj), tagID, GameObj.GetHP(tagObj)))
+    
+    # 反击,反击可打断连击,所以优先判断
+    if CanAtkBack(curObj, tagObj):
+        DoAttack(tagObj, curObj, tick)
+        return
+    
+    # 连击
+    if CanCombo(curObj, tagObj):
+        DoAttack(curObj, tagObj, tick)
+        
+    return
+
+def CanAtkBack(atkObj, defObj):
+    ## 可否反击
+    
+    defAtkBackRate = GameObj.GetAtkBackRate(defObj) # 防方反击率
+    atkBackNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) # 已反击次数
+    if atkBackNum > 10:
+        # 内置最高反击数防范
+        return False
+    if atkBackNum > 0:
+        validPerList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 4)
+        vaildPer = validPerList[atkBackNum - 1] if len(validPerList) >= atkBackNum else 0
+        defAtkBackRate = int(defAtkBackRate * vaildPer / 100.0)
+        
+    atkAtkBackDefRate = GameObj.GetAtkBackDefRate(atkObj) # 攻方抵抗反击率
+    atkBackRate = max(0, defAtkBackRate - atkAtkBackDefRate)
+    if atkBackRate <= 0 or not GameWorld.CanHappen(atkBackRate):
+        GameWorld.DebugLog("            无法反击: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)" 
+                           % (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate))
+        return False
+    GameWorld.DebugLog("            可以反击: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)" 
+                       % (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate))
+    defObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_AtkBack)
+    return True
+
+def CanCombo(atkObj, defObj):
+    ## 可否连击
+    
+    atkComboRate = GameObj.GetComboRate(atkObj) # 攻方连击率
+    comboNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) # 已连击次数
+    if comboNum > 10:
+        # 内置最高连击数防范
+        return False
+    if comboNum > 0:
+        validPerList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 3)
+        vaildPer = validPerList[comboNum - 1] if len(validPerList) >= comboNum else 0
+        atkComboRate = int(atkComboRate * vaildPer / 100.0)
+        
+    defComboReduce = GameObj.GetComboDefRate(defObj) # 防方抵抗连击率
+    comboRate = max(0, atkComboRate - defComboReduce)
+    if comboRate <= 0 or not GameWorld.CanHappen(comboRate):
+        GameWorld.DebugLog("            无法连击: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)" 
+                           % (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce))
+        return False
+    GameWorld.DebugLog("            可以连击: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)" 
+                       % (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce))
+    atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_Combo)
+    return True
+
 def NPCAttack(curObj, tagObj, tick):
     ## NPC攻击
     if not curObj:
         return
     tagDist = 0
+    atkRet = AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick)
     #---优先释放技能---
-    if not AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick):
+    if not atkRet:
         #普通攻击
-        isOK = BaseAttack.Attack(curObj, tagObj, None, tick)
-        GameWorld.DebugLog("        NPC普通攻击: curID=%s,tagID=%s,isOK=%s" % (curObj.GetID(), tagObj.GetID(), isOK))
-    return
+        atkRet = BaseAttack.Attack(curObj, tagObj, None, tick)
+        if atkRet:
+            GameWorld.DebugLog("        NPC普通攻击: curID=%s,tagID=%s,atkRet=%s" % (curObj.GetID(), tagObj.GetID(), atkRet))
+        else:
+            GameWorld.DebugLog("        NPC攻击失败: curID=%s,tagID=%s,atkRet=%s" % (curObj.GetID(), tagObj.GetID(), atkRet))
+    else:
+        GameWorld.DebugLog("        NPC技能攻击: curID=%s,tagID=%s,atkRet=%s" % (curObj.GetID(), tagObj.GetID(), atkRet))
+    return atkRet
 
 def PlayerAttack(curPlayer, tagObj, tick):
     ## 玩家攻击, 参考技能使用 #def UseSkillEx(index, clientData, tick):
@@ -246,6 +359,7 @@
     #PlayerControl.SetIsNeedProcess(curPlayer, True)
     #PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paAttack)
     
+    useSkillResult = False
     skillMgr = curPlayer.GetSkillManager()
     for skillID in skillList:
         curSkill = skillMgr.FindSkillBySkillID(skillID)
@@ -265,12 +379,13 @@
         if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick):
             GameWorld.DebugLog("        技能攻击失败%s" % skillID, playerID)
             continue
+        useSkillResult = True
         GameWorld.DebugLog("        技能攻击成功%s" % skillID, playerID)
         
         break
     
     curPlayer.ClearUseSkillRec()
-    return
+    return useSkillResult
 
 def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0):
     clientPack = ChPyNetSendPack.tagMCTurnFightState()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 4ad6a4e..be5f30c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -74,7 +74,7 @@
 Def_BuffValue_Count = 3     # buff记录的value个数
 
 #游戏对象属性--------------------------------------------
-Def_Calc_AllAttrType_MAX = 166
+Def_Calc_AllAttrType_MAX = 171
 #基本属性BUFF计算,顺序与 ObjProperty_AttrByIndex 对应,同时也为buff效果ID同步通知策划
 TYPE_Calc_AttrList = (
 TYPE_Calc_Metal,                        # 金 1
@@ -254,6 +254,11 @@
 TYPE_Calc_FamilyWarHPPer,                # 仙盟联赛生命加成
 TYPE_Calc_FamilyWarAtkPer,               # 仙盟联赛攻击加成
 TYPE_Calc_FamilySitExpPer,               # 仙盟打坐经验加成 165
+TYPE_Calc_ComboDefRate,                  # 抗连击概率
+TYPE_Calc_AtkBackRate,                   # 反击概率
+TYPE_Calc_AtkBackDefRate,                # 抗反击概率
+TYPE_Calc_SuckHPPer,                     # 吸血比率
+TYPE_Calc_SuckHPDefPer,                  # 抗吸血比率 170
 ) = range(1, Def_Calc_AllAttrType_MAX)
 
 ## 支持大数值属性,超过20E
@@ -3047,8 +3052,18 @@
     Def_ShopType_LongSale,    #远程贩售
 ) = range(1, 2+1)
 
+# 回合攻击战斗类型
+(
+TurnBattleType_Normal, # 普通
+TurnBattleType_Combo, # 连击
+TurnBattleType_AtkBack, # 反击
+) = range(3)
+
 #---Obj字典-------
 Def_Obj_Dict_TurnFightNum = 'TurnFightNum' # 回合制战斗当前轮次
+Def_Obj_Dict_TurnComboNum = 'TurnComboNum' # 本回合已累计连击次数
+Def_Obj_Dict_TurnAtkBackNum = 'TurnAtkBackNum' # 本回合已累计反击次数
+Def_Obj_Dict_TurnBattleType = 'TurnBattleType' # 本次攻击战斗类型:TurnBattleType_xxx
 
 #---NPC字典-------
 #每道龙卷风最终坐标
@@ -4475,6 +4490,11 @@
 AttrName_PetAtk = "PetAtk"  # 灵宠攻击
 AttrName_PetSkillAtkRate = "PetSkillAtkRate"  # 灵宠技能
 AttrName_PetDamPer = "PetDamPer"  # 灵宠伤害增加
+AttrName_ComboDefRate = "ComboDefRate"  # 抗连击概率
+AttrName_AtkBackRate = "AtkBackRate"  # 反击概率
+AttrName_AtkBackDefRate = "AtkBackDefRate"  # 抗反击概率
+AttrName_SuckHPPer = "SuckHPPer"  # 吸血比率
+AttrName_SuckHPDefPer = "SuckHPDefPer"  # 抗吸血比率
 
 #物品效果(ID或指定类型)对应的属性计算信息 {效果(ID/指定类型):[[属性索引, ...], 是否基础属性,(非)线性]}
 #对应 Def_Calc_AllAttrType_MAX
@@ -4663,6 +4683,16 @@
     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],
+    AttrName_ComboDefRate:[[TYPE_Calc_ComboDefRate], False, TYPE_Linear],
+    ShareDefine.Def_Effect_AtkBackRate:[[TYPE_Calc_AtkBackRate], False, TYPE_Linear],
+    AttrName_AtkBackRate:[[TYPE_Calc_AtkBackRate], False, TYPE_Linear],
+    ShareDefine.Def_Effect_AtkBackDefRate:[[TYPE_Calc_AtkBackDefRate], False, TYPE_Linear],
+    AttrName_AtkBackDefRate:[[TYPE_Calc_AtkBackDefRate], False, TYPE_Linear],
+    ShareDefine.Def_Effect_SuckHPPer:[[TYPE_Calc_SuckHPPer], False, TYPE_Linear],
+    AttrName_SuckHPPer:[[TYPE_Calc_SuckHPPer], False, TYPE_Linear],
+    ShareDefine.Def_Effect_SuckHPDefPer:[[TYPE_Calc_SuckHPDefPer], False, TYPE_Linear],
+    AttrName_SuckHPDefPer:[[TYPE_Calc_SuckHPDefPer], False, TYPE_Linear],
     
     #战斗非线性
     ShareDefine.Def_Effect_SuperHitPer:[[TYPE_Calc_SuperHit], False, TYPE_NoLinear],
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
index 4d4d88d..78078e5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -178,3 +178,93 @@
     gameObj.SetDict(ChConfig.Def_PlayerKey_BloodShiledHurt, value % ShareDefine.Def_PerPointValue)
     gameObj.SetDict(ChConfig.Def_PlayerKey_BloodShiledHurtEx, value / ShareDefine.Def_PerPointValue)
     return
+
+def GetAtkSpeed(gameObj):
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        return gameObj.GetBattleValEx1()
+    return gameObj.GetDictByKey(ChConfig.AttrName_AtkSpeed)
+def SetAtkSpeed(gameObj, value):
+    ## 攻击速度
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        gameObj.SetBattleValEx1(value, True)
+    else:
+        gameObj.SetDict(ChConfig.AttrName_AtkSpeed, value)
+    return
+
+#---暴击概率---- 都是用 gameObj.GetSuperHitRate() gameObj.SetSuperHitRate()
+def GetSuperHitRateReduce(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_SuperHitRateReduce)
+def SetSuperHitRateReduce(gameObj, value): 
+    ## 抗暴击概率
+    gameObj.SetDict(ChConfig.Def_PlayerKey_SuperHitRateReduce, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuperHitRateReduce, value)
+    return
+
+def GetFaintRate(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintRate)
+def SetFaintRate(gameObj, value):
+    ## 击晕概率
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrFaintRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_FaintRate, value)
+    return
+def GetFaintDefRate(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintDefRate)
+def SetFaintDefRate(gameObj, value):
+    ## 抗击晕概率
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrFaintDefRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_FaintDefRate, value)
+    return
+
+def GetComboRate(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrComboRate)
+def SetComboRate(gameObj, value):
+    ## 连击概率
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrComboRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_ComboRate, value)
+    return
+def GetComboDefRate(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_ComboDefRate)
+def SetComboDefRate(gameObj, value):
+    ## 抗连击概率
+    gameObj.SetDict(ChConfig.AttrName_ComboDefRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_ComboDefRate, value)
+    return
+def GetComboDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrComboDamPer)
+def SetComboDamPer(gameObj, value):
+    ## 连击伤害
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrComboDamPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_ComboDamPer, value)
+    return
+
+def GetAtkBackRate(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_AtkBackRate)
+def SetAtkBackRate(gameObj, value):
+    ## 反击概率
+    gameObj.SetDict(ChConfig.AttrName_AtkBackRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_AtkBackRate, value)
+    return
+def GetAtkBackDefRate(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_AtkBackDefRate)
+def SetAtkBackDefRate(gameObj, value):
+    ## 抗反击概率
+    gameObj.SetDict(ChConfig.AttrName_AtkBackDefRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_AtkBackDefRate, value)
+    return
+
+def GetSuckHPPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_SuckHPPer)
+def SetSuckHPPer(gameObj, value):
+    ## 吸血比率
+    gameObj.SetDict(ChConfig.AttrName_SuckHPPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuckHPPer, value)
+    return
+def GetSuckHPDefPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_SuckHPDefPer)
+def SetSuckHPDefPer(gameObj, value):
+    ## 抗吸血比率
+    gameObj.SetDict(ChConfig.AttrName_SuckHPDefPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuckHPDefPer, value)
+    return
+
+    
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index f72d89f..bf88d17 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -511,6 +511,16 @@
                         ("DWORD", "NPCID", 1),
                         ("BYTE", "FightPowerLackAtkLimit", 0),
                         ("DWORD", "SuppressFightPower", 0),
+                        ("DWORD", "AtkSpeed", 0),
+                        ("DWORD", "SuperHitRateReduce", 0),
+                        ("DWORD", "FaintRate", 0),
+                        ("DWORD", "FaintDefRate", 0),
+                        ("DWORD", "ComboRate", 0),
+                        ("DWORD", "ComboDefRate", 0),
+                        ("DWORD", "AtkBackRate", 0),
+                        ("DWORD", "AtkBackDefRate", 0),
+                        ("DWORD", "SuckHPPer", 0),
+                        ("DWORD", "SuckHPDefPer", 0),
                         ),
 
                 "NPCRealmStrengthen":(
@@ -724,6 +734,8 @@
                         ("DWORD", "DataMapID", 1),
                         ("WORD", "LineID", 1),
                         ("DWORD", "NPCID", 0),
+                        ("DWORD", "SummerNPCID", 0),
+                        ("list", "AwardItemList", 0),
                         ),
 
                 "FBHelpBattle":(
@@ -3224,12 +3236,32 @@
     def __init__(self):
         self.NPCID = 0
         self.FightPowerLackAtkLimit = 0
-        self.SuppressFightPower = 0
+        self.SuppressFightPower = 0
+        self.AtkSpeed = 0
+        self.SuperHitRateReduce = 0
+        self.FaintRate = 0
+        self.FaintDefRate = 0
+        self.ComboRate = 0
+        self.ComboDefRate = 0
+        self.AtkBackRate = 0
+        self.AtkBackDefRate = 0
+        self.SuckHPPer = 0
+        self.SuckHPDefPer = 0
         return
         
     def GetNPCID(self): return self.NPCID # NPCID
     def GetFightPowerLackAtkLimit(self): return self.FightPowerLackAtkLimit # 战力不足限制攻击
-    def GetSuppressFightPower(self): return self.SuppressFightPower # 推荐/压制战力
+    def GetSuppressFightPower(self): return self.SuppressFightPower # 推荐/压制战力
+    def GetAtkSpeed(self): return self.AtkSpeed # 攻击速度
+    def GetSuperHitRateReduce(self): return self.SuperHitRateReduce # 抗暴击概率
+    def GetFaintRate(self): return self.FaintRate # 击晕概率
+    def GetFaintDefRate(self): return self.FaintDefRate # 抗击晕概率
+    def GetComboRate(self): return self.ComboRate # 连击概率
+    def GetComboDefRate(self): return self.ComboDefRate # 抗连击概率
+    def GetAtkBackRate(self): return self.AtkBackRate # 反击概率
+    def GetAtkBackDefRate(self): return self.AtkBackDefRate # 抗反击概率
+    def GetSuckHPPer(self): return self.SuckHPPer # 吸血比率
+    def GetSuckHPDefPer(self): return self.SuckHPDefPer # 抗吸血比率
 
 # 成长型境界怪物表
 class IPY_NPCRealmStrengthen():
@@ -3664,12 +3696,16 @@
     def __init__(self):
         self.DataMapID = 0
         self.LineID = 0
-        self.NPCID = 0
+        self.NPCID = 0
+        self.SummerNPCID = 0
+        self.AwardItemList = []
         return
         
     def GetDataMapID(self): return self.DataMapID # 数据地图ID
     def GetLineID(self): return self.LineID # 功能线路ID
-    def GetNPCID(self): return self.NPCID # NPCID
+    def GetNPCID(self): return self.NPCID # NPCID
+    def GetSummerNPCID(self): return self.SummerNPCID # 召唤兽ID
+    def GetAwardItemList(self): return self.AwardItemList # 过关奖励列表,[[物品ID,个数,是否拍品], ...]
 
 # 副本助战表
 class IPY_FBHelpBattle():
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 42d8693..b517a41 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -4048,7 +4048,21 @@
         #初始化状态
         curNPC.SetSpeed(curNPC.GetOrgSpeed())
         curNPC.SetAtkInterval(curNPC.GetBaseAtkInterval())
-
+        
+        #扩展属性
+        npcDataEx = GetNPCDataEx(curNPC.GetNPCID())
+        if npcDataEx:
+            GameObj.SetAtkSpeed(curNPC, npcDataEx.GetAtkSpeed())
+            GameObj.SetSuperHitRateReduce(curNPC, npcDataEx.GetSuperHitRateReduce())
+            GameObj.SetFaintRate(curNPC, npcDataEx.GetFaintRate())
+            GameObj.SetFaintDefRate(curNPC, npcDataEx.GetFaintDefRate())
+            GameObj.SetComboRate(curNPC, npcDataEx.GetComboRate())
+            GameObj.SetComboDefRate(curNPC, npcDataEx.GetComboDefRate())
+            GameObj.SetAtkBackRate(curNPC, npcDataEx.GetAtkBackRate())
+            GameObj.SetAtkBackDefRate(curNPC, npcDataEx.GetAtkBackDefRate())
+            GameObj.SetSuckHPPer(curNPC, npcDataEx.GetSuckHPPer())
+            GameObj.SetSuckHPDefPer(curNPC, npcDataEx.GetSuckHPDefPer())
+            
 #        #先清空异常
 #        if curNPC.GetAbnormalState() != IPY_GameWorld.sctInvalid:
 #            curNPC.SetAbnormalState(IPY_GameWorld.sctInvalid)
@@ -4090,38 +4104,21 @@
         GameObj.SetMaxHP(curNPC, PropDict["MaxHP"])
         curNPC.SetHit(PropDict["Hit"])
         curNPC.SetMiss(PropDict["Miss"])
+        GameObj.SetAtkSpeed(curNPC, PropDict.get("AtkSpeed", 0))
         
-#        curPlayerPropDict["SkillAtkRate"] = curPlayer.GetSkillAtkRate() # 技能攻击比例加成
-#        curPlayerPropDict["SkillAtkRateReduce"] = PlayerControl.GetSkillAtkRateReduce(curPlayer) # 技能攻击比例减少
-#        curPlayerPropDict["LuckyHitRate"] = curPlayer.GetLuckyHitRate() # 会心一击几率
-#        curPlayerPropDict["LuckyHitVal"] = curPlayer.GetLuckyHitVal() # 会心一击伤害固定值
-#        curPlayerPropDict["LuckyHitRateReduce"] = PlayerControl.GetLuckyHitRateReduce(curPlayer) # 会心一击概率抗性
-#        curPlayerPropDict["LuckyHitReduce"] = PlayerControl.GetLuckyHitReduce(curPlayer) # 会心一击伤害减免固定值
-#        curPlayerPropDict["SuperHitRate"] = curPlayer.GetSuperHitRate() # 暴击概率
-#        curPlayerPropDict["SuperHit"] = curPlayer.GetSuperHit() # 暴击伤害固定值
-#        curPlayerPropDict["SuperHitRateReduce"] = PlayerControl.GetSuperHitRateReduce(curPlayer) # 暴击概率抗性
-#        curPlayerPropDict["SuperHitReduce"] = PlayerControl.GetSuperHitReduce(curPlayer) # 暴击伤害抗性固定值
-#        curPlayerPropDict["IceAtk"] = curPlayer.GetIceAtk() # 真实伤害            固定值
-#        curPlayerPropDict["IceDef"] = curPlayer.GetIceDef() # 真实伤害防御        固定值
-#        curPlayerPropDict["IgnoreDefRate"] = curPlayer.GetIgnoreDefRate() # 无视防御几率
-#        curPlayerPropDict["IgnoreDefRateReduce"] = PlayerControl.GetIgnoreDefRateReduce(curPlayer) # 无视防御概率抗性
-#        curPlayerPropDict["IgnoreDefReducePer"] = PlayerControl.GetIgnoreDefReducePer(curPlayer) # 无视防御伤害减免
-#        curPlayerPropDict["DamagePVE"] = PlayerControl.GetDamagePVE(curPlayer) # 伤害输出计算固定值PVE
-#        curPlayerPropDict["DamagePerPVP"] = PlayerControl.GetDamagePerPVP(curPlayer) # 伤害输出计算百分比PVP
-#        curPlayerPropDict["DamagePerPVPReduce"] = PlayerControl.GetDamagePerPVPReduce(curPlayer) # 伤害输出计算百分比PVP减少
-#        curPlayerPropDict["DamagePVP"] = PlayerControl.GetDamagePVP(curPlayer) # PVP固定伤害
-#        curPlayerPropDict["DamagePVPReduce"] = PlayerControl.GetDamagePVPReduce(curPlayer) # PVP固定减伤
-#        curPlayerPropDict["FinalHurt"] = PlayerControl.GetFinalHurt(curPlayer) # 最终固定伤害增加
-#        curPlayerPropDict["FinalHurtReduce"] = PlayerControl.GetFinalHurtReduce(curPlayer) # 最终固定伤害减少
-#        curPlayerPropDict["FinalHurtPer"] = PlayerControl.GetFinalHurtPer(curPlayer) # 最终伤害百分比
-#        curPlayerPropDict["FinalHurtReducePer"] = PlayerControl.GetFinalHurtReducePer(curPlayer) # 最终伤害减少百分比
-#        curPlayerPropDict["OnlyFinalHurt"] = PlayerControl.GetOnlyFinalHurt(curPlayer) # 额外输出伤害
-#        curPlayerPropDict["DamChanceDef"] = PlayerControl.GetDamChanceDef(curPlayer) # 20%的概率抵御伤害比率
-#        curPlayerPropDict["NPCHurtAddPer"] = PlayerControl.GetNPCHurtAddPer(curPlayer) # 对怪物伤害加成
-#        curPlayerPropDict["AtkBackHPPer"] = PlayerControl.GetAtkBackHPPer(curPlayer) # 攻击回复血量固定值
-#        curPlayerPropDict["PVPAtkBackHP"] = PlayerControl.GetPVPAtkBackHP(curPlayer) # PVP攻击回血
-#        curPlayerPropDict["FaintRate"] = PlayerControl.GetFaintRate(curPlayer) # 触发击晕
-#        curPlayerPropDict["FaintDefRate"] = PlayerControl.GetFaintDefRate(curPlayer) # 击晕抵抗
+        curNPC.SetSuperHitRate(PropDict["SuperHitRate"])
+        GameObj.SetSuperHitRateReduce(curNPC, PropDict["SuperHitRateReduce"])
+        GameObj.SetFaintRate(curNPC, PropDict["FaintRate"])
+        GameObj.SetFaintDefRate(curNPC, PropDict["FaintDefRate"])
+        GameObj.SetComboRate(curNPC, PropDict.get("ComboRate", 0)) # 后面加的属性做兼容
+        GameObj.SetComboDefRate(curNPC, PropDict.get("ComboDefRate", 0))
+        GameObj.SetAtkBackRate(curNPC, PropDict.get("AtkBackRate", 0))
+        GameObj.SetAtkBackDefRate(curNPC, PropDict.get("AtkBackDefRate", 0))
+        GameObj.SetSuckHPPer(curNPC, PropDict.get("SuckHPPer", 0))
+        GameObj.SetSuckHPDefPer(curNPC, PropDict.get("SuckHPDefPer", 0))
+        
+        GameWorld.DebugLog("SetPVPNPCPlayerAttr: objID=%s,NPCID=%s,pvpPlayerID=%s,maxHP=%s" 
+                           % (curNPC.GetID(), curNPC.GetNPCID(), pvpPlayerID, GameObj.GetMaxHP(curNPC)))
         return
     
     def SetHelpBattleRobotRebornAttr(self, fightPower):
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 eb86a44..790fbfe 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -5362,7 +5362,7 @@
     def __SetAtkInterval(self):
         curPlayer = self.__Player
         
-        atkSpeed = GetAtkSpeed(curPlayer)
+        atkSpeed = GameObj.GetAtkSpeed(curPlayer)
         
         formula = IpyGameDataPY.GetFuncCfg("AtkInterval")
         atkInterval = 0 if not formula else eval(FormulaControl.GetCompileFormula("AtkInterval", formula))
@@ -6834,18 +6834,6 @@
 def SetSpeedValue(curPlayer, value):
     curPlayer.SetDict(ChConfig.Def_PlayerKey_SpeedValue, value)
     SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_SpeedValue, value, True) # 移动速度值暂定广播周围玩家
-
-##获取玩家攻击速度,用于计算攻击间隔
-# @param curPlayer 玩家实例
-# @return 玩家攻击速度
-def GetAtkSpeed(curPlayer):
-    return curPlayer.GetBattleValEx1()
-
-##设置玩家攻击速度,用于计算攻击间隔
-# @param curPlayer 玩家实例
-# @return None
-def SetAtkSpeed(curPlayer, value):
-    curPlayer.SetBattleValEx1(value, True)
     
 #---攻击回复血量比率----
 ## 获取玩家攻击回复血量比率
@@ -6935,11 +6923,6 @@
 ## 抗卓越一击概率
 def GetGreatHitRateReduce(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_GreatHitRateReduce)
 def SetGreatHitRateReduce(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_GreatHitRateReduce, value)
-## 抗暴击概率
-def GetSuperHitRateReduce(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_SuperHitRateReduce)
-def SetSuperHitRateReduce(curPlayer, value): 
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_SuperHitRateReduce, value)
-    SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_SuperHitRateReduce, value)
 ## 抗无视防御概率
 def GetIgnoreDefRateReduce(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_IgnoreDefRateReduce)
 def SetIgnoreDefRateReduce(curPlayer, value):
@@ -7155,17 +7138,6 @@
 def SetReduceBackHPPer(curPlayer, value):
     curPlayer.SetDict(ChConfig.Def_PlayerKey_ReduceBackHPPer, value)
 
-#---触发击晕----
-def GetFaintRate(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintRate)
-def SetFaintRate(curPlayer, value):
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrFaintRate, value)
-    SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_FaintRate, value)
-#---击晕抵抗----
-def GetFaintDefRate(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintDefRate)
-def SetFaintDefRate(curPlayer, value):
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrFaintDefRate, value)
-    SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_FaintDefRate, value)
-    
 #---触发定身----
 def GetAtkerFreezed(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrAtkerFreezed)
 def SetAtkerFreezed(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrAtkerFreezed, value)
@@ -7174,17 +7146,6 @@
 def GetAddAngry(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrAddAngry)
 def SetAddAngry(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrAddAngry, value)
 
-#---连击几率----
-def GetComboRate(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrComboRate)
-def SetComboRate(curPlayer, value):
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrComboRate, value)
-    SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_ComboRate, value)
-#---连击伤害----
-def GetComboDamPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrComboDamPer)
-def SetComboDamPer(curPlayer, value):
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrComboDamPer, value)
-    SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_ComboDamPer, value)
-    
 #---技能攻击比例减少----
 def GetSkillAtkRateReduce(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_SkillAtkRateReduce)
 def SetSkillAtkRateReduce(curPlayer, value):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
index 65abdbd..b94a061 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
@@ -316,7 +316,7 @@
     petMinAtk = PlayerControl.GetPetMinAtk(curPlayer)   #灵宠最小攻击
     petMaxAtk = PlayerControl.GetPetMaxAtk(curPlayer)   #灵宠最大攻击
     petDamPer = GameObj.GetPetDamPer(curPlayer)   #灵宠增加伤害
-    atkSpeed = PlayerControl.GetAtkSpeed(curPlayer) # 攻击速度
+    atkSpeed = GameObj.GetAtkSpeed(curPlayer) # 攻击速度
     aIgnoreDefRate = curPlayer.GetIgnoreDefRate()  # 无视防御比率
     aLuckyHit = curPlayer.GetLuckyHitVal()  # 会心一击固定值
     aLuckyHitRate = curPlayer.GetLuckyHitRate() # 会心一击概率
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
index eaa2a5f..8d9d4b7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -185,6 +185,7 @@
     curPlayerPropDict["MaxHP"] = GameObj.GetMaxHP(curPlayer)
     curPlayerPropDict["Hit"] = curPlayer.GetHit()
     curPlayerPropDict["Miss"] = curPlayer.GetMiss()
+    curPlayerPropDict["AtkSpeed"] = GameObj.GetAtkSpeed(curPlayer)
     curPlayerPropDict["SkillAtkRate"] = curPlayer.GetSkillAtkRate() # 技能攻击比例加成
     curPlayerPropDict["SkillAtkRateReduce"] = PlayerControl.GetSkillAtkRateReduce(curPlayer) # 技能攻击比例减少
     curPlayerPropDict["LuckyHitRate"] = curPlayer.GetLuckyHitRate() # 会心一击几率
@@ -193,7 +194,7 @@
     curPlayerPropDict["LuckyHitReduce"] = PlayerControl.GetLuckyHitReduce(curPlayer) # 会心一击伤害减免固定值
     curPlayerPropDict["SuperHitRate"] = curPlayer.GetSuperHitRate() # 暴击概率
     curPlayerPropDict["SuperHit"] = curPlayer.GetSuperHit() # 暴击伤害固定值
-    curPlayerPropDict["SuperHitRateReduce"] = PlayerControl.GetSuperHitRateReduce(curPlayer) # 暴击概率抗性
+    curPlayerPropDict["SuperHitRateReduce"] = GameObj.GetSuperHitRateReduce(curPlayer) # 暴击概率抗性
     curPlayerPropDict["SuperHitReduce"] = PlayerControl.GetSuperHitReduce(curPlayer) # 暴击伤害抗性固定值
     curPlayerPropDict["IceAtk"] = curPlayer.GetIceAtk() # 真实伤害            固定值
     curPlayerPropDict["IceDef"] = curPlayer.GetIceDef() # 真实伤害防御        固定值
@@ -214,8 +215,14 @@
     curPlayerPropDict["NPCHurtAddPer"] = PlayerControl.GetNPCHurtAddPer(curPlayer) # 对怪物伤害加成
     curPlayerPropDict["AtkBackHPPer"] = PlayerControl.GetAtkBackHPPer(curPlayer) # 攻击回复血量固定值
     curPlayerPropDict["PVPAtkBackHP"] = PlayerControl.GetPVPAtkBackHP(curPlayer) # PVP攻击回血
-    curPlayerPropDict["FaintRate"] = PlayerControl.GetFaintRate(curPlayer) # 触发击晕
-    curPlayerPropDict["FaintDefRate"] = PlayerControl.GetFaintDefRate(curPlayer) # 击晕抵抗
+    curPlayerPropDict["FaintRate"] = GameObj.GetFaintRate(curPlayer) # 触发击晕
+    curPlayerPropDict["FaintDefRate"] = GameObj.GetFaintDefRate(curPlayer) # 击晕抵抗
+    curPlayerPropDict["ComboRate"] = GameObj.GetComboRate(curPlayer) # 连击
+    curPlayerPropDict["ComboDefRate"] = GameObj.GetComboDefRate(curPlayer) # 抗连击
+    curPlayerPropDict["AtkBackRate"] = GameObj.GetAtkBackRate(curPlayer) # 反击
+    curPlayerPropDict["AtkBackDefRate"] = GameObj.GetAtkBackDefRate(curPlayer) # 抗反击
+    curPlayerPropDict["SuckHPPer"] = GameObj.GetSuckHPPer(curPlayer) # 吸血比率
+    curPlayerPropDict["SuckHPDefPer"] = GameObj.GetSuckHPDefPer(curPlayer) # 抗吸血比率
     
     #推送提醒
     curPlayerPropDict[ChConfig.Def_PDict_GeTuiSet] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GeTuiSet)
@@ -320,7 +327,7 @@
         petClassLVList.append({"id":petNPCID, 'lv':classLV})
         
     petInfo["PetLV"] = petClassLVList
-    petInfo["AtkSpeed"] = PlayerControl.GetAtkSpeed(curPlayer)
+    petInfo["AtkSpeed"] = GameObj.GetAtkSpeed(curPlayer)
     return petInfo
 
 ## 坐骑信息
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 1e462d0..acec481 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -694,6 +694,12 @@
 Def_Effect_FamilyWarAtkPer = 164 # 仙盟联赛攻击加成
 Def_Effect_FamilySitExpPer = 165 # 仙盟打坐经验加成
 
+Def_Effect_ComboDefRate = 210 # 抗连击概率
+Def_Effect_AtkBackRate = 211 # 反击概率
+Def_Effect_AtkBackDefRate = 212 # 抗反击概率
+Def_Effect_SuckHPPer = 213 # 吸血比率
+Def_Effect_SuckHPDefPer = 214 # 抗吸血比率
+
 #增加%d物理伤害值,其中a值为伤害值
 Def_Effect_AddAtk = 1005
 #增加%d魔法伤害值,其中a值为伤害值
@@ -1060,7 +1066,12 @@
 CDBPlayerRefresh_JiYuan, # 机缘币  245
 CDBPlayerRefresh_BTGMYuE, # BTGM余额  246
 CDBPlayerRefresh_SuccessScore, # 成就积分  247
-) = range(146, 248)
+CDBPlayerRefresh_ComboDefRate, # 抗连击概率 248
+CDBPlayerRefresh_AtkBackRate, # 反击概率 249
+CDBPlayerRefresh_AtkBackDefRate, # 抗反击概率 250
+CDBPlayerRefresh_SuckHPPer, # 吸血比率 251
+CDBPlayerRefresh_SuckHPDefPer, # 抗吸血比率 252
+) = range(146, 253)
 
 TYPE_Price_Gold_Paper_Money = 5    # 金钱类型,(先用礼券,再用金子)
 TYPE_Price_Family_Contribution = 6 # 战盟贡献度(活跃度转换得来)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
index c03979f..61b5aca 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
@@ -45,11 +45,11 @@
    #[lambda curObj:curObj.GetMAtkMin(), lambda curObj, value:curObj.SetMAtkMin(value), IPY_PlayerDefine.CDBPlayerRefresh_MAtkMin, 0, 0],  # 最小魔攻
    #[lambda curObj:curObj.GetMAtkMax(), lambda curObj, value:curObj.SetMAtkMax(value), IPY_PlayerDefine.CDBPlayerRefresh_MAtkMax, 0, 0],  # 最大魔攻
    [lambda curObj:PlayerControl.GetSpeedNotBuff(curObj), lambda curObj, value:PlayerControl.SetSpeedNotBuff(curObj, value), 0, 0, 0],  # 移动速度
-   [lambda curObj:PlayerControl.GetAtkSpeed(curObj), lambda curObj, value:PlayerControl.SetAtkSpeed(curObj, value), IPY_PlayerDefine.CDBPlayerRefresh_BattleValEx1, 1, 1],  # 攻击速度
+   [lambda curObj:GameObj.GetAtkSpeed(curObj), lambda curObj, value:GameObj.SetAtkSpeed(curObj, value), IPY_PlayerDefine.CDBPlayerRefresh_BattleValEx1, 1, 1],  # 攻击速度
    
    [lambda curObj:curObj.GetSuperHitRate(), lambda curObj, value:curObj.SetSuperHitRate(value), IPY_PlayerDefine.CDBPlayerRefresh_SuperHitRate, 1, 0],     # 暴击概率
    [lambda curObj:curObj.GetSuperHit(), lambda curObj, value:curObj.SetSuperHit(value), IPY_PlayerDefine.CDBPlayerRefresh_SuperHit, 1, 0],                 # 暴击伤害固定值
-   [lambda curObj:PlayerControl.GetSuperHitRateReduce(curObj), lambda curObj, value:PlayerControl.SetSuperHitRateReduce(curObj, value), ShareDefine.CDBPlayerRefresh_SuperHitRateReduce, 1, 0],# 暴击概率抗性
+   [lambda curObj:GameObj.GetSuperHitRateReduce(curObj), lambda curObj, value:GameObj.SetSuperHitRateReduce(curObj, value), ShareDefine.CDBPlayerRefresh_SuperHitRateReduce, 1, 0],# 暴击概率抗性
    [lambda curObj:PlayerControl.GetSuperHitReduce(curObj), lambda curObj, value:PlayerControl.SetSuperHitReduce(curObj, value), ShareDefine.CDBPlayerRefresh_SuperHitReduce, 1, 0],  # 暴击伤害抗性固定值
    
    [lambda curObj:curObj.GetGreatHitRate(), lambda curObj, value:curObj.SetGreatHitRate(value), 0, 0, 0],                                        # 卓越一击几率
@@ -94,12 +94,12 @@
    [lambda curObj:curObj.GetDamageBackRate(), lambda curObj, value:curObj.SetDamageBackRate(value), IPY_PlayerDefine.CDBPlayerRefresh_DamageBackRate, 1, 0],                                    # 反伤百分比
    [lambda curObj:PlayerControl.GetDamChanceDef(curObj), lambda curObj, value:PlayerControl.SetDamChanceDef(curObj, value), ShareDefine.CDBPlayerRefresh_DamChanceDef, 1, 0],            # 20%的概率抵御伤害比率
    [lambda curObj:PlayerControl.GetShieldMPCostRate(curObj), lambda curObj, value:PlayerControl.SetShieldMPCostRate(curObj, value), 0, 0, 0],    # 魔法盾伤害吸收蓝耗比率
-   [lambda curObj:PlayerControl.GetFaintRate(curObj), lambda curObj, value:PlayerControl.SetFaintRate(curObj, value), ShareDefine.CDBPlayerRefresh_FaintRate, 1, 0],                  # 触发击晕
-   [lambda curObj:PlayerControl.GetFaintDefRate(curObj), lambda curObj, value:PlayerControl.SetFaintDefRate(curObj, value), ShareDefine.CDBPlayerRefresh_FaintDefRate, 1, 0],            # 击晕抵抗
+   [lambda curObj:GameObj.GetFaintRate(curObj), lambda curObj, value:GameObj.SetFaintRate(curObj, value), ShareDefine.CDBPlayerRefresh_FaintRate, 1, 0],                  # 触发击晕
+   [lambda curObj:GameObj.GetFaintDefRate(curObj), lambda curObj, value:GameObj.SetFaintDefRate(curObj, value), ShareDefine.CDBPlayerRefresh_FaintDefRate, 1, 0],            # 击晕抵抗
    [lambda curObj:PlayerControl.GetAtkerFreezed(curObj), lambda curObj, value:PlayerControl.SetAtkerFreezed(curObj, value), 0, 0, 0],            # 触发定身
    [lambda curObj:PlayerControl.GetAddAngry(curObj), lambda curObj, value:PlayerControl.SetAddAngry(curObj, value), 0, 0, 0],                    # 攻击增加额外仇恨
-   [lambda curObj:PlayerControl.GetComboRate(curObj), lambda curObj, value:PlayerControl.SetComboRate(curObj, value), ShareDefine.CDBPlayerRefresh_ComboRate, 0, 0],                  # 连击几率
-   [lambda curObj:PlayerControl.GetComboDamPer(curObj), lambda curObj, value:PlayerControl.SetComboDamPer(curObj, value), ShareDefine.CDBPlayerRefresh_ComboDamPer, 0, 0],              # 连击伤害
+   [lambda curObj:GameObj.GetComboRate(curObj), lambda curObj, value:GameObj.SetComboRate(curObj, value), ShareDefine.CDBPlayerRefresh_ComboRate, 0, 0],                  # 连击几率
+   [lambda curObj:GameObj.GetComboDamPer(curObj), lambda curObj, value:GameObj.SetComboDamPer(curObj, value), ShareDefine.CDBPlayerRefresh_ComboDamPer, 0, 0],              # 连击伤害
 
    [lambda curObj:curObj.GetHPRestorePer(), lambda curObj, value:curObj.SetHPRestorePer(value), IPY_PlayerDefine.CDBPlayerRefresh_HPRestorePer, 1, 0],                                    # 自动回复生命
    [lambda curObj:curObj.GetKillBackHP(), lambda curObj, value:curObj.SetKillBackHP(value), 0, 0, 0],                                        # 击杀回血
@@ -205,6 +205,11 @@
    [lambda curObj:PlayerControl.GetFamilyWarHPPer(curObj), lambda curObj, value:PlayerControl.SetFamilyWarHPPer(curObj, value), 0, 0, 0],      # 仙盟联赛生命加成
    [lambda curObj:PlayerControl.GetFamilyWarAtkPer(curObj), lambda curObj, value:PlayerControl.SetFamilyWarAtkPer(curObj, value), 0, 0, 0],      # 仙盟联赛攻击加成
    [lambda curObj:PlayerControl.GetFamilySitExpPer(curObj), lambda curObj, value:PlayerControl.SetFamilySitExpPer(curObj, value), 0, 0, 0],      # 仙盟打坐经验加成
+   [lambda curObj:GameObj.GetComboDefRate(curObj), lambda curObj, value:GameObj.SetComboDefRate(curObj, value), ShareDefine.CDBPlayerRefresh_ComboDefRate, 1, 0],    # 抗连击概率
+   [lambda curObj:GameObj.GetAtkBackRate(curObj), lambda curObj, value:GameObj.SetAtkBackRate(curObj, value), ShareDefine.CDBPlayerRefresh_AtkBackRate, 1, 0],    # 反击概率
+   [lambda curObj:GameObj.GetAtkBackDefRate(curObj), lambda curObj, value:GameObj.SetAtkBackDefRate(curObj, value), ShareDefine.CDBPlayerRefresh_AtkBackDefRate, 1, 0],    # 抗反击概率
+   [lambda curObj:GameObj.GetSuckHPPer(curObj), lambda curObj, value:GameObj.SetSuckHPPer(curObj, value), ShareDefine.CDBPlayerRefresh_SuckHPPer, 1, 0],    # 吸血比率
+   [lambda curObj:GameObj.GetSuckHPDefPer(curObj), lambda curObj, value:GameObj.SetSuckHPDefPer(curObj, value), ShareDefine.CDBPlayerRefresh_SuckHPDefPer, 1, 0],    # 抗吸血比率
 ]
 
 ## 通过索引获得属性值
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4075.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4075.py
index b70950c..2accc52 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4075.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4075.py
@@ -13,7 +13,7 @@
 #
 #---------------------------------------------------------------------
 
-import PlayerControl
+import GameObj
 import AttackCommon
 
 def CheckCanHappen(attacker, defender, effect, curSkill):
@@ -25,5 +25,5 @@
     
 
 def GetValue(attacker, defender, effect):
-    return max(PlayerControl.GetAtkSpeed(attacker) - 10000, 0)/100*effect.GetEffectValue(0)
+    return max(GameObj.GetAtkSpeed(attacker) - 10000, 0)/100*effect.GetEffectValue(0)
 

--
Gitblit v1.8.0