10019 【砍树】回合战斗(增加抗连击、反击、抗反击、吸血、抗吸血属性,玩家及NPC属性接口通用;连击、反击属性效果支持;)
15个文件已修改
513 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 157 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4075.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,个数,是否拍品], ...]
};
//副本助战表
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 # 战盟贡献度(活跃度转换得来)
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)
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)
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()
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],
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
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():
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):
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):
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() # 会心一击概率
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
## 坐骑信息
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 # 战盟贡献度(活跃度转换得来)
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],    # 抗吸血比率
]
## 通过索引获得属性值
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)