From c35e176a3b05f745600c6e60f168313d2b9e7b30 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 17 九月 2025 12:00:19 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(司马懿技能;增加按层级结算持续buff效果5003;增加非按攻击力计算伤害支持;技能伤害增加可限制最大攻击力百分比上限配置;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 80 ++++++++++++++++++++++++---------------
1 files changed, 49 insertions(+), 31 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
index 1aea3dd..25b07f3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -77,8 +77,8 @@
return
bySkillID = bySkill.GetSkillID() if bySkill else 0
- GameWorld.DebugLog("使用技能: curID=%s,skillID=%s,tagCnt=%s,batType=%s,bySkillID=%s"
- % (curBatObj.GetID(), skillID, len(tagObjList), batType, bySkillID))
+ GameWorld.DebugLog("使用技能: curID=%s,skillID=%s,tagCnt=%s,batType=%s,bySkillID=%s,HP:%s/%s"
+ % (curBatObj.GetID(), skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP()))
# 以下为技能可以使用的处理,之后的逻辑默认技能使用成功
poolMgr = ObjPool.GetPoolMgr()
@@ -659,7 +659,7 @@
def DoBeAttackResult(turnFight, curObj, useSkill, isUseSkill=False):
'''被攻击结果
@param curObj: 施法方或buff归属方
- @param isUseSkill: 是否是直接使用技能的攻击结果
+ @param isUseSkill: 是否是直接使用技能的攻击结果,否则视为持续性的
'''
curID = curObj.GetID()
@@ -736,8 +736,7 @@
FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, killObjList, useSkill, turnFight.mapID, turnFight.funcLineID)
# 优先触发本技能额外效果,注:仅该技能释放后该技能的额外效果视为主技能的效果,优先级最高
- if isUseSkill:
- __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList)
+ __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList, isUseSkill)
# ========== 以下触发被动 ==========
@@ -846,15 +845,20 @@
Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID)
return
-def __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList):
+def __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList, isUseSkill):
## 执行本技能/buff释放后额外效果
for index in xrange(useSkill.GetEffectCount()):
curEffect = useSkill.GetEffect(index)
- if curEffect.GetTriggerWay() != ChConfig.TriggerWay_CurSkillEff:
- continue
-
+ triggerWay = curEffect.GetTriggerWay()
+ if isUseSkill:
+ if triggerWay != ChConfig.TriggerWay_CurSkillEff:
+ continue
+ else:
+ if triggerWay != ChConfig.TriggerWay_CurSkillEffLst:
+ continue
+
effID = curEffect.GetEffectID()
- GameWorld.DebugLog("执行额外技能效果: %s, missObjIDList=%s" % (effID, missObjIDList))
+ GameWorld.DebugLog("执行额外技能效果: %s, triggerWay=%s,missObjIDList=%s" % (effID, triggerWay, missObjIDList))
if effID == 5010:
# 额外技能效果
__doUseEnhanceSkill(turnFight, curObj, useSkill, curEffect, missObjIDList)
@@ -997,6 +1001,7 @@
hurtObj.SetLostHP(lostHP)
hurtObj.SetCurHP(remainHP)
defObj.SetHP(remainHP)
+ atkObj.SetLastHurtValue(hurtValue)
GameWorld.DebugLog(" 伤血: atkID=%s,defID=%s,hurtValue=%s,realHurtHP=%s,lostHP=%s,%s/%s"
% (atkID, defID, hurtValue, realHurtHP, lostHP, defObj.GetHP(), defObj.GetMaxHP()))
TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, skillID)
@@ -1024,23 +1029,21 @@
atkID = atkObj.GetID()
defID = defObj.GetID()
+ calcType = curSkill.GetCalcType() # 伤害计算方式 0-按攻击
isTurnNormalSkill = SkillCommon.isTurnNormalSkill(curSkill)
isAngerSkill = SkillCommon.isAngerSkill(curSkill)
isDot = ("damageoftime" in kwargs)
angerOverflow = 0 # 怒气溢出值
- mustHit = False
+ mustHit = False # 是否必命中
if isAngerSkill:
mustHit = True
curXP = atkObj.GetXP()
angerOverflow = max(atkObj.GetXP() - IpyGameDataPY.GetFuncCfg("AngerXP", 2), 0)
GameWorld.DebugLog("XP必命中! curXP=%s,angerOverflow=%s" % (curXP, angerOverflow))
- if isDot:
- mustHit = True
-
#命中公式 攻击方类型不同,公式不同
- if not mustHit:
+ if isTurnNormalSkill and not mustHit:
aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中
dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_MissRate) # 闪避率
missNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnMissNum)
@@ -1052,13 +1055,15 @@
hurtTypes = pow(2, ChConfig.HurtType_Normal)
- #calcType = curSkill.GetCalcType() 目前暂时按攻击算伤害,之后可以扩展其他
-
isSuperHit, isParry, isStun = False, False, False
aSuperDamPer, dSuperDamPerDef = 0, 0
+ # 暴击(dot除外)
if not isDot:
isSuperHit = CanSuperHit(turnFight, atkObj, defObj, curSkill) # 是否暴击
- isParry = (isTurnNormalSkill and CanParry(turnFight, atkObj, defObj, curSkill)) # 是否格挡,仅针对普攻
+
+ # 闪避、击晕、格挡
+ if isTurnNormalSkill:
+ isParry = CanParry(turnFight, atkObj, defObj, curSkill) # 是否格挡
isStun = CanStun(turnFight, atkObj, defObj, curSkill) # 是否击晕
if isSuperHit:
@@ -1078,10 +1083,10 @@
#参与运算的数值
#rand = random.random() #种子数 0~1
- aAtk = atkObj.GetBatAttrValue(ChConfig.AttrID_Atk) # 攻击方最大攻击
+ aAtk = atkObj.GetAtk() # 攻击方最大攻击
dHP = defObj.GetHP()
- dDef = 0 if ignoreDef else defObj.GetBatAttrValue(ChConfig.AttrID_Def) # 防守方防御力
+ dDef = 0 if ignoreDef else defObj.GetDef() # 防守方防御力
aFinalDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPer) # 最终加成
dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
@@ -1121,19 +1126,24 @@
aFinalDamPer /= 10000.0
dFinalDamPerDef /= 10000.0
- GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s,aAddSkillPer=%s"
- % (atkID, defID, skillID, atkSkillPer, aAtk, dDef, dHP, hurtTypes, aAddSkillPer))
+ if calcType != ChConfig.Def_Calc_Attack:
+ aAtk = GetCalcBaseValue(calcType, atkObj, defObj)
+ GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s,aAddSkillPer=%s"
+ % (atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, hurtTypes, aAddSkillPer))
# 持续性伤害
- if isDot:
- hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
- GameWorld.DebugLog(" 持续技能伤害=%s" % (hurtValue))
- elif isTurnNormalSkill:
+ if isTurnNormalSkill:
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 1))
GameWorld.DebugLog(" 普攻技能伤害=%s" % (hurtValue))
elif isAngerSkill:
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2))
GameWorld.DebugLog(" 怒气技能伤害=%s" % (hurtValue))
+ elif isDot:
+ hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
+ GameWorld.DebugLog(" 持续技能伤害=%s" % (hurtValue))
+ elif calcType != ChConfig.Def_Calc_Attack:
+ hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 1))
+ GameWorld.DebugLog(" 非按攻击力伤害=%s,calcType=%s,aAtk=%s" % (hurtValue, calcType, aAtk))
else:
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 4))
GameWorld.DebugLog(" 其他伤害=%s" % (hurtValue))
@@ -1147,6 +1157,13 @@
if multiValue and multiValue != 1:
hurtValue = int(hurtValue * multiValue)
GameWorld.DebugLog(" 伤害倍值: hurtValue=%s,multiValue=%s" % (hurtValue, multiValue))
+
+ hurtAtkPerMax = curSkill.GetHurtAtkPerMax() # 最大万分比,限制最终伤害不超过攻击力万分率
+ if hurtAtkPerMax:
+ aAtk = atkObj.GetAtk()
+ hurtValueMax = aAtk * hurtAtkPerMax / 10000.0
+ hurtValue = min(hurtValue, hurtValueMax)
+ GameWorld.DebugLog(" 伤害最高限制: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s" % (hurtValue, hurtAtkPerMax, aAtk))
hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
return hurtValue, hurtTypes
@@ -1340,8 +1357,8 @@
baseValue = curObj.GetAtk()
elif calcType == ChConfig.Def_Calc_MaxHP:
baseValue = curObj.GetMaxHP()
- #elif cureType == ChConfig.Def_Calc_HurtValue:
- # baseValue = GameObj.GetLastHurtValue(userObj)
+ elif calcType == ChConfig.Def_Calc_LastHurt:
+ baseValue = curObj.GetLastHurtValue()
elif calcType == ChConfig.Def_Calc_TagMaxHP:
baseValue = 0 if not tagObj else tagObj.GetMaxHP()
return baseValue
@@ -1361,6 +1378,7 @@
atkObj = buffOwner
defObj = batObj
+ atkID = ownerID
defID = defObj.GetID()
tagObjList = [defObj]
@@ -1371,8 +1389,8 @@
hurtObj = useSkill.AddHurtObj(defID)
dHP = defObj.GetHP()
- GameWorld.DebugLog("结算dot: defID=%s,buffID=%s,skillID=%s,ownerID=%s,hurtValue=%s,hurtTypes=%s,dHP=%s"
- % (defID, buffID, skillID, ownerID, hurtValue, hurtTypes, dHP))
+ GameWorld.DebugLog("结算dot: atkID=%s,defID=%s,buffID=%s,skillID=%s,ownerID=%s,hurtValue=%s,hurtTypes=%s,dHP=%s"
+ % (atkID, defID, buffID, skillID, ownerID, hurtValue, hurtTypes, dHP))
hurtValue, realHurtHP = CalcHurtHPWithBuff(turnFight, atkObj, defObj, useSkill, hurtValue)
# dot的反弹、吸血待定
@@ -1380,7 +1398,7 @@
remainHP = max(0, dHP - realHurtHP) # 剩余血量
lostHP = dHP - remainHP # 实际掉血量
defObj.SetHP(remainHP)
-
+ atkObj.SetLastHurtValue(hurtValue)
GameWorld.DebugLog(" hurtValue=%s,realHurtHP=%s,lostHP=%s,%s/%s" % (hurtValue, realHurtHP, lostHP, defObj.GetHP(), defObj.GetMaxHP()))
hurtObj.SetHurtTypes(hurtTypes)
--
Gitblit v1.8.0