From 225c3a53759d5739989272549203d4676c666e9f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 30 一月 2026 14:08:01 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(命格buff改为只给命格自身添加;命格buff基础属性加成支持计算到武将身上;命格战斗属性支持计算到武将战斗中;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 165 +++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 136 insertions(+), 29 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 6851048..6debe17 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -163,8 +163,8 @@
angerOverflow = curBatObj.GetAngerOverflow()
bySkillID = bySkill.GetSkillID() if bySkill else 0
- GameWorld.DebugLogEx("◆使用技能: curID=%s,skillID=%s,tagCnt=%s,batType=%s,bySkillID=%s,HP:%s/%s,angerOverflow=%s,curXP=%s,oneActionUseCnt=%s",
- objID, skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
+ GameWorld.DebugLogEx("◆使用技能: skillID=%s,curID=%s,tagCnt=%s,batType=%s,bySkillID=%s,HP:%s/%s,angerOverflow=%s,curXP=%s,oneActionUseCnt=%s",
+ skillID, objID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
# 以下为技能可以使用的处理,之后的逻辑默认技能使用成功
if isinstance(useSkill, IpyGameDataPY.IPY_Skill):
@@ -1422,6 +1422,7 @@
relatedSkillID = useSkill.GetSkillID()
delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
beControlledHardDict = {} # 受控目标 {objID:buff, ...}
+ beDotBuffDict = {} # 被添加dot的目标 {objID:buff, ...}
afterLogicList = useSkill.GetAfterLogicList()
for logicType, logicData in afterLogicList:
if logicType == ChConfig.AfterLogic_DelBuff:
@@ -1446,6 +1447,8 @@
if buffOwner.GetID() == curID:
if triggerType == ChConfig.TriggerWay_BeControlledHard:
beControlledHardDict[batObj.GetID()] = buff
+ elif triggerType == ChConfig.TriggerWay_AddDOTBuff:
+ beDotBuffDict[batObj.GetID()] = buff
# 统计击杀
killObjList = [] # 击杀其他阵营目标列表
@@ -1566,6 +1569,10 @@
# ========== 以下触发被动 ==========
+ curBatLineup = curObj.GetTFBatLineup()
+ curMGObj = curBatLineup.getMinggeObj()
+ mgTriggerWayList = [] # 命格本次技能已触发方式列表,命格固定只触发一次
+
# buff消失后置处理的被动,优先处理,如破盾,区别于被动方式 ChConfig.TriggerWay_BuffDel(立即触发)
for buffObjID, buff, tagObjID, afterTriggerData in delBuffAfterEffList:
triggerWay, effInfoList = afterTriggerData
@@ -1612,6 +1619,9 @@
TurnBuff.DoBuffByRevive(turnFight, tagObj)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Revive, curObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_InBattlefield, curObj, connSkill=useSkill)
+ if reviveObjList and curMGObj:
+ tagObj = reviveObjList[0]
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Revive, tagObj, connSkill=useSkill, byFriendObj=curObj)
# 曹仁防护触发,暂写死
for tagObj in caorenProtectList:
@@ -1630,8 +1640,6 @@
triggerOne = False
batType = useSkill.GetBatType()
isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
- curBatLineup = curObj.GetTFBatLineup()
- curMGObj = curBatLineup.getMinggeObj()
for tagObj in tagObjListAll:
tagID = tagObj.GetID()
@@ -1639,7 +1647,11 @@
if tagID in missObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeMiss, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill)
-
+ tagMGObj = tagObj.GetTFBatLineup().getMinggeObj()
+ if tagMGObj and ChConfig.TriggerWay_Miss not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Miss)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagMGObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill, byBatObj=tagObj)
+
# 免疫
if tagID in immuneObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_ImmuneHurt, curObj, connSkill=useSkill)
@@ -1687,40 +1699,64 @@
if tagID in stunObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeStun, curObj, connSkill=useSkill)
-
+ if curMGObj and ChConfig.TriggerWay_Stun not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Stun)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill, byBatObj=curObj)
+
# 控制
if tagID in beControlledHardDict:
buff = beControlledHardDict[tagID]
if buff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
- if curMGObj:
+ if curMGObj and ChConfig.TriggerWay_Frozen not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Frozen)
TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Frozen, tagObj, connSkill=useSkill, byBatObj=curObj)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeControlledHard, curObj, connSkill=useSkill, connBuff=buff)
+ # 附加dot
+ if tagID in beDotBuffDict:
+ if curMGObj and ChConfig.TriggerWay_AddDOTBuff not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_AddDOTBuff)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_AddDOTBuff, tagObj, connSkill=useSkill, byBatObj=curObj)
+
# 暴击
if tagID in superHitObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuperHit, curObj, connSkill=useSkill)
-
+ if curMGObj and ChConfig.TriggerWay_SuperHit not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_SuperHit)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill, byBatObj=curObj)
+
# 格挡
if tagID in parryObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeParry, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill)
-
+ tagMGObj = tagObj.GetTFBatLineup().getMinggeObj()
+ if tagMGObj and ChConfig.TriggerWay_Parry not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Parry)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagMGObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill, byBatObj=tagObj)
+
# 吸血
if tagID in suckObjIDList:
if not triggerOne:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuckHP, curObj, connSkill=useSkill)
-
+ if curMGObj and ChConfig.TriggerWay_SuckHPOne not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_SuckHPOne)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill, byBatObj=curObj)
+
# 连击
if batType == ChConfig.TurnBattleType_Combo:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeCombo, curObj, connSkill=useSkill)
+ if curMGObj and ChConfig.TriggerWay_Combo not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Combo)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill, byBatObj=curObj)
# 追击
elif batType == ChConfig.TurnBattleType_Pursue:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
if isAttackDirect:
- if curMGObj:
+ if curMGObj and ChConfig.TriggerWay_PursueAtk not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_PursueAtk)
TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_PursueAtk, tagObj, connSkill=useSkill, byBatObj=curObj)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
# 反击
@@ -2031,7 +2067,7 @@
@param effectID: 被动效果ID
注:可能由A引起触发B技能的效果释放技能C
'''
- if not passiveSkill:
+ if not passiveSkill or not batObj:
return
if isinstance(passiveSkill, int):
passiveSkillID = passiveSkill
@@ -2048,9 +2084,11 @@
bySkillID = connBuff.GetSkillID()
passiveSkillID = passiveSkill.GetSkillID()
if passiveSkillID == bySkillID:
- #GameWorld.DebugLogEx("###被动触发技能不触发自身,防止死循环! effSkillID=%s,effectID=%s,passiveSkillID=%s", effSkillID, effectID, passiveSkillID)
- return
-
+ if not connSkill or connSkill.GetObjID() == batObj.GetID():
+ GameWorld.DebugLogEx("###被动触发技能不触发自身,防止死循环! effSkillID=%s,effectID=%s,passiveSkillID=%s", effSkillID, effectID, passiveSkillID)
+ return
+ # 不同施法者的相同技能ID可触发,如双方都有相同武将相同技能的情况下,如吕玲绮
+
if hasattr(passiveSkill, "GetRemainTime") and passiveSkill.GetRemainTime() > 0:
#GameWorld.DebugLogEx("被动触发技能CD中! skillID=%s,RemainTime=%s", passiveSkillID, passiveSkill.GetRemainTime())
return
@@ -2116,6 +2154,8 @@
pmType = GetPMType(atkObj, curSkill)
ignoreDef = IsIgnoreDef(curSkill)
batType = curSkill.GetBatType()
+ atkMGObj = atkObj.GetTFBatLineup().getMinggeObj()
+ defMGObj = defObj.GetTFBatLineup().getMinggeObj()
changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtType, curSkill)
if not changeHurtType:
@@ -2132,23 +2172,33 @@
isAngerSkill = SkillCommon.isAngerSkill(curSkill)
isDot = ("damageoftime" in kwargs)
- mustHit = False # 是否必命中
- if not isTurnNormalSkill: # 仅普攻判断是否闪避
- mustHit = True
-
- angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
-
- #命中公式 攻击方类型不同,公式不同
- if not mustHit and not curSkill.GetEffectByID(ChConfig.SkillEff_MustHit) and not defObj.IsInControlledHard():
+ # 常规闪避 - 仅针对普攻
+ if isTurnNormalSkill and not curSkill.GetEffectByID(ChConfig.SkillEff_MustHit) and not defObj.IsInControlledHard():
aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中
dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_MissRate) # 闪避率
missNum = curSkill.GetTagMissNum(defID)
missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
if GameWorld.CanHappen(missRate):
GameWorld.DebugLogEx("闪避了! missRate=%s,dMissRate=%s,aMissRateDef=%s,missNum=%s", missRate, dMissRate, aMissRateDef, missNum)
- curSkill.SetTagMissNum(defID, missRate + 1)
+ curSkill.SetTagMissNum(defID, missNum + 1)
return 0, pow(2, ChConfig.HurtAtkType_Miss)
+ # 绝对闪避 - 除dot外的所有技能,因为绝对闪避不触发常规闪避的被动,所以在常规闪避后判断
+ if not isDot:
+ aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRateDef)
+ dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRate)
+ if defMGObj:
+ dMissRate += defMGObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRate)
+ missNum = curSkill.GetTagMissNum(defID)
+ if dMissRate > 0:
+ missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
+ if GameWorld.CanHappen(missRate):
+ GameWorld.DebugLogEx("绝对闪避了! missRate=%s,dAbsoluteMissRate=%s,aAbsoluteMissRateDef=%s,missNum=%s", missRate, dMissRate, aMissRateDef, missNum)
+ curSkill.SetTagMissNum(defID, missNum + 1)
+ return 0, pow(2, ChConfig.HurtAtkType_AbsoluteMiss)
+
+ angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
+
hurtTypes = pow(2, ChConfig.HurtAtkType_Hurt)
isSuperHit, isParry, isStun = False, False, False
@@ -2167,7 +2217,8 @@
aSuperDamPer = IpyGameDataPY.GetFuncCfg("SuperHitCfg", 2) * 10000
aSuperDamPer += atkObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPer)
aSuperDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SuperDamPer, curSkill)
-
+ if atkMGObj:
+ aSuperDamPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPer)
dSuperDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPerDef)
if isParry:
@@ -2196,6 +2247,9 @@
aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
+ if defMGObj:
+ dFinalDamPerDef += defMGObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef)
+
#招架 - 无视攻击方最终增伤百分比
dZhaojia = defObj.GetBatAttrValue(ChConfig.AttrID_Zhaojia)
aZhaojiaDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ZhaojiaDef)
@@ -2243,6 +2297,8 @@
aDOTPer += atkObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPer)
dDOTPerDef += defObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPerDef)
GameWorld.DebugLogEx("是灼烧: aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
+ if atkMGObj:
+ aDOTPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_DOTPer)
#aAddSkillPer = 0 # 技能增伤
dBatDamPerDef = 0 # 战斗增减伤
@@ -2250,7 +2306,9 @@
aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddBatDamPerByTagLostHP, curSkill)
aBatDamPer += addBatDamPer
-
+ if atkMGObj:
+ aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkMGObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
+
# 物法增减伤
if pmType == IPY_GameWorld.ghtMag: # 法伤
aPMDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_MagDamPer)
@@ -2274,12 +2332,15 @@
if batType == ChConfig.TurnBattleType_Combo:
aComboDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_ComboDamPer)
dComboDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_ComboDamPerDef)
-
+ if atkMGObj:
+ aComboDamPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_ComboDamPer)
aPursueDamPer, dPursueDamPerDef = 0, 0 # 追击增伤
if batType == ChConfig.TurnBattleType_Pursue:
aPursueDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PursueDamPer)
dPursueDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_PursueDamPerDef)
-
+ if atkMGObj:
+ aPursueDamPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_PursueDamPer)
+
aPVPDamPer, dPVPDamPerDef = 0, 0 # PVP
if turnFight.isPVP() > 0:
aPVPDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PVPDamPer)
@@ -2879,10 +2940,16 @@
damBackPer = 0
buffMgr = defObj.GetBuffManager()
for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
- damBackPer += buff.GetValue1()
+ damBackPer += buff.GetValue1() * max(1, buff.GetLayer())
connSkillTypeID = buff.GetSkillTypeID()
damBackPer += TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_AddDamBackPerByBuffLayer, connSkillTypeID=connSkillTypeID)
+ defMGObj = defObj.GetTFBatLineup().getMinggeObj()
+ if defMGObj:
+ mgBuffMgr = defMGObj.GetBuffManager()
+ for buff in mgBuffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
+ damBackPer += buff.GetValue1() * max(1, buff.GetLayer())
+
if damBackPer <= 0:
return
@@ -2911,7 +2978,10 @@
# dot施法者已死亡不再吸血
return
+ atkMGObj = atkObj.GetTFBatLineup().getMinggeObj()
aSuckHPPer = atkObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPer)
+ if atkMGObj:
+ aSuckHPPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPer)
aCurePer = atkObj.GetBatAttrValue(ChConfig.AttrID_CurePer)
dSuckHPPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPerDef)
@@ -3103,6 +3173,43 @@
useSkill.ResetUseRec()
return
+def DoHurtExAtk(turnFight, atkObj, defObj, hurtValue, skillID, hurtTypes=0):
+ ## 额外结算指定伤害
+ skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
+ if not skillIpyData:
+ return
+
+ atkID = atkObj.GetID()
+ defID = defObj.GetID()
+
+ # 结算需要同步标签
+ useTag = "Skill_%s_%s_Dot_%s" % (atkID, skillID, atkObj.GetIncrementValue()) # 复用dot的标签
+ Sync_TurnFightTag(turnFight, useTag, 0)
+
+ dHP = defObj.GetHP()
+ dMaxHP = defObj.GetMaxHP()
+ GameWorld.DebugLogEx("额外结算指定伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,,dHP=%s/%s",
+ atkID, defID, skillID, hurtValue, dHP, dMaxHP)
+
+ useSkill = BattleObj.PySkill(skillIpyData, atkID)
+ useSkill.SetTagObjList([defObj])
+ useSkill.SetBatType(ChConfig.TurnBattleType_Dot) # 要修改表现的话等前端同步修改
+
+ hurtTypes |= pow(2, ChConfig.HurtAtkType_Hurt) # 确保有基础的伤害类型
+ hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
+ calcHurtResults = [[defObj, hurtValue, hurtTypes, immuneHurt]]
+ DoSkillHurtHP(turnFight, atkObj, useSkill, calcHurtResults, "HurtExAtk")
+
+ Sync_UseSkill(turnFight, atkObj, useSkill)
+
+ DoBeAttackResult(turnFight, atkObj, useSkill)
+
+ # 通知结束标签
+ Sync_TurnFightTag(turnFight, useTag, 1)
+
+ useSkill.ResetUseRec()
+ return True
+
def Sync_TurnFightTag(turnFight, useTag, sign):
## 通知技能标签
clientPack = ChPyNetSendPack.tagSCTurnFightTag()
--
Gitblit v1.8.0