From 4ec47a0dab32729d20389078ee78f89b64c12cab Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 22 九月 2025 15:58:57 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(张星彩怒技,觉醒技能;增加buff消失后触发时机;增加效果6007 6008 7001 7002;技能友好目标增加类型2:一定包含自己的友方单位)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 66 ++++++++++--
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6007.py | 19 +++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py | 44 +++++---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py | 8
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py | 8
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py | 29 +++--
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6008.py | 21 ++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py | 30 +++--
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 17 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py | 2
14 files changed, 180 insertions(+), 74 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
index 2297e4b..2fc113a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -37,17 +37,22 @@
self._AffectBuffDict = {} # 被动buff {(触发方式, 有效来源):{buffID:[effID, ...], ...}, ...}
return
- def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0):
+ def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0, connBuff=None):
'''获取可触发的效果列表,技能跟buff根据触发优先级按顺序触发,优先级越高越先执行,相同时技能优先
优先级之后有需要再扩展
@return: [["skill/buff", skillID/buffID, effIDList], ...]
'''
effList = []
- if not connSkillTypeID and connSkill:
- connSkillTypeID = connSkill.GetSkillTypeID()
-
- if connSkill and self._batObj.GetID() == connSkill.GetObjID():
+ if not connSkillTypeID:
+ if connSkill:
+ connSkillTypeID = connSkill.GetSkillTypeID()
+ elif connBuff:
+ skillData = connBuff.GetSkillData()
+ connSkillTypeID = skillData.GetSkillTypeID()
+
+ # SkillData 对象暂时没有 GetObjID
+ if connSkill and hasattr(connSkill, "GetObjID") and self._batObj.GetID() == connSkill.GetObjID():
skillID = connSkill.GetSkillID()
skillManager = self._batObj.GetSkillManager()
# 非对象身上的技能,读取本技能被动触发的效果,一般是主技能拆分的子技能
@@ -62,7 +67,7 @@
triggerSrc = effect.GetTriggerSrc()
if not triggerWay:
continue
- if triggerWay == ChConfig.TriggerWay_CurSkillEff:
+ if triggerWay in ChConfig.TriggerWayNoLoadList:
continue
if triggerSrc != ChConfig.TriggerSrc_SkillSelf:
# 仅添加本技能的
@@ -124,7 +129,7 @@
triggerSrc = effect.GetTriggerSrc()
if not triggerWay:
return
- if triggerWay == ChConfig.TriggerWay_CurSkillEff:
+ if triggerWay in ChConfig.TriggerWayNoLoadList:
return
if triggerSrc in [ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_BuffSelf]:
# buff有效的不加进来
@@ -174,7 +179,7 @@
triggerSrc = effect.GetTriggerSrc()
if not triggerWay:
return
- if triggerWay == ChConfig.TriggerWay_CurSkillEff:
+ if triggerWay in ChConfig.TriggerWayNoLoadList:
return
if triggerSrc in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
# 技能有效的不加进来
@@ -269,8 +274,6 @@
def GetTriggerWay(self): return self._triggerWay
def GetTriggerSrc(self): return self._triggerSrc
#def GetTriggerParams(self, index): return self._triggerParams[index] if len(self._triggerParams) > index else 0
-
-EmptyEffect = SkillEffect(0, [])
class SklllData():
@@ -311,7 +314,7 @@
def GetHappenRate(self): return self._ipyData.GetHappenRate() # 触发概率
def GetEffect(self, index): return self._effList[index] if len(self._effList) > index else 0
def GetEffectCount(self): return len(self._effList)
- def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), EmptyEffect)
+ def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), None)
def GetConnSkill(self): return self._ipyData.GetConnSkill()
def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
def GetIgnoreStates(self): return self._ipyData.GetIgnoreStates() # 无视限制列表
@@ -502,6 +505,7 @@
self._tagObjList = [] # 本次技能目标列表 [BatObj, ...]
self._hurtList = [] # 本次伤血列表,可能同一个对象有多个伤害,如弹射等 [HurtObj, ...]
self._bySkill = None # 由哪个技能触发的
+ self._byBuff = None # 由哪个buff触发的
self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
# 连击相关
@@ -515,6 +519,7 @@
self._batType = 0
self._tagObjList = []
self._bySkill = None
+ self._byBuff = None
self._afterLogicList = []
self.ClearHurtObj()
return
@@ -563,6 +568,8 @@
def SetBatType(self, batType): self._batType = batType
def GetBySkill(self): return self._bySkill
def SetBySkill(self, bySkill): self._bySkill = bySkill
+ def GetByBuff(self): return self._byBuff
+ def SetByBuff(self, byBuff): self._byBuff = byBuff
def GetTagObjList(self): return self._tagObjList # 技能目标列表
def SetTagObjList(self, tagObjList): self._tagObjList = tagObjList
def GetAfterLogicList(self): return self._afterLogicList
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 111c080..be4346b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -1405,7 +1405,7 @@
#GameWorld.DebugLog(" 永久buff不处理! curID=%s,index=%s,skillID=%s" % (curID, index, skillID))
continue
calcTimeline = buff.GetCalcTime()
- passTurn = __calcPassturn(calcTimeline, nowTimeline, False)
+ passTurn = __calcPassturn(calcTimeline, nowTimeline, True)
if passTurn <= 0:
#GameWorld.DebugLog(" passTurn <= 0 passTurn=%s,calcTimeline=%s,nowTimeline=%s,skillID=%s" % (passTurn, calcTimeline, nowTimeline, skillID))
continue
@@ -1424,7 +1424,7 @@
def __calcPassturn(calcTimeline, nowTimeline, equalOK):
## 计算已经过了的回合数
- # @param equalOK: 时间节点相同时是否算1回合,一般技能可以算,buff不算
+ # @param equalOK: 时间节点相同时是否算1回合,一般技能可以算,buff可算可不算,具体看需求调整
calcTurnNum = calcTimeline / TimelineSet
calcTimeNode = calcTimeline % TimelineSet
nowTurnNum = nowTimeline / TimelineSet
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index bd99e5a..7726a8f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1329,7 +1329,8 @@
Def_Calc_MaxHP, # 最大生命值 1
Def_Calc_LastHurt, # 最后一次伤害值 2
Def_Calc_TagMaxHP, # 目标最大生命值 3
-) = range(4)
+Def_Calc_ByBuffValue, # 触发buff的buff值 4
+) = range(5)
#治疗类型(影响公式参数)
Def_CureTypeList = (
@@ -4286,7 +4287,11 @@
TriggerWay_CurSkillEffLst, # 本持续buff结算后额外触发效果,仅该持续buff结算后有效 14
TriggerWay_KillOneObj, # 击杀目标后(单次击杀多目标只触发一次) 15
TriggerWay_KillTagObj, # 击杀每目标后(单次击杀多目标每个目标触发一次) 16
-) = range(1, 1 + 16)
+TriggerWay_BuffDel, # buff消失后 17
+) = range(1, 1 + 17)
+
+# 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
+TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
# 被动触发有效来源
TriggerSrc_Skill = 1 # 身上技能有效
@@ -4299,6 +4304,8 @@
PassiveEff_ChangeHurtType = 6002 # 变更伤害类型: 值1-伤害类型;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
PassiveEff_ChangeHurtMulti = 6003 # 变更伤害倍值(可增可减): 值1-变更倍值;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
PassiveEff_AddSkillPer = 6004 # 增加本次技能万分比: 值1-增加的万分比;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
+PassiveEff_AddSkillTagCnt = 6007 # 增加技能目标数:值1-增加目标个数
+PassiveEff_ImmuneControlBuff = 6008 # 生命值低于x%时免疫控制效果:值1-百分比
# 被动效果ID有触发值时就返回的
PassiveEffHappenValueList = [PassiveEff_ChangeHurtType]
@@ -4306,6 +4313,10 @@
PassiveEffValueMaxList = []
# 被动效果ID触发值取最小值的
PassiveEffValueMinList = []
+
+# 技能效果 - 不需要配置触发方式的
+SkillEff_CureWayEx = 7001 # 额外治疗值计算(对CalcType、SkillPer治疗计算方式扩展): 值1-计算方式;值2-万分比
+SkillEff_HurtShare = 7002 # 均摊伤害
(
TriggerType_BeSuperHit, # 被暴击触发技能 1
@@ -4398,7 +4409,7 @@
TriggerType_ThumpSkillValue, # 重击增加技能固定值伤害 88
TriggerType_HitValue, # 记录命中个数 89
TriggerType_ChangeSkillEff, # 改变技能特效广播 90
-) = range(1, 91)
+) = range(1001, 1091)
#不可以佩戴翅膀的地图
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py
index 3e18e05..ebf27e0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py
@@ -17,7 +17,7 @@
import TurnBuff
-def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
#结算一次扣除1回合
remainTime = max(0, effBuff.GetRemainTime() - 1)
effBuff.SetRemainTime(remainTime)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py
index c68d5a4..0b744f8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py
@@ -20,7 +20,7 @@
import IpyGameDataPY
import TurnSkill
-def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
effectID = curEffect.GetEffectID()
buffState = curEffect.GetEffectValue(0)
needLayers = curEffect.GetEffectValue(1) # 累计达到多少层时才结算
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py
index 5fc2e16..a1df592 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py
@@ -17,7 +17,7 @@
import TurnBuff
-def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
#结算一次扣除1回合
remainLayer = max(0, effBuff.GetLayer() - 1)
effBuff.SetLayer(remainLayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py
index 3293030..34209f9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py
@@ -18,7 +18,7 @@
import TurnSkill
import IpyGameDataPY
-def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
if not skillID:
passiveSkill = effSkill
@@ -28,8 +28,8 @@
return
effectID = curEffect.GetEffectID()
effSkillID = effSkill.GetSkillID()
- return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID)
+ return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID, connBuff)
-def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
effSkill = effBuff.GetSkillData().GetIpyData()
- return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
+ return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py
index 4285c9e..7e30a7d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py
@@ -20,7 +20,7 @@
import GameWorld
import ChConfig
-def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
rate = curEffect.GetEffectValue(0)
if not GameWorld.CanHappen(rate):
#GameWorld.DebugLog("概率进行追击不触发!")
@@ -32,8 +32,8 @@
passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
if not passiveSkill:
return
- return TurnSkill.OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Pursue, bySkill=connSkill)
+ return TurnSkill.OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Pursue, bySkill=connSkill, byBuff=connBuff)
-def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
effSkill = effBuff.GetSkillData().GetIpyData()
- return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
+ return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6007.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6007.py
new file mode 100644
index 0000000..20060e4
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6007.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_6007
+#
+# @todo:增加技能目标数
+# @author hxp
+# @date 2025-09-22
+# @version 1.0
+#
+# 详细描述: 增加技能目标数
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-09-22 16:00"""
+#-------------------------------------------------------------------------------
+
+def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
+ return curEffect.GetEffectValue(0)
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6008.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6008.py
new file mode 100644
index 0000000..65a0d65
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6008.py
@@ -0,0 +1,21 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_6008
+#
+# @todo:生命值低于x%时免疫控制效果
+# @author hxp
+# @date 2025-09-22
+# @version 1.0
+#
+# 详细描述: 生命值低于x%时免疫控制效果
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-09-22 16:00"""
+#-------------------------------------------------------------------------------
+
+def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
+ lowerThanPer = curEffect.GetEffectValue(0)
+ nowPer = attacker.GetHP() / float(attacker.GetMaxHP())
+ return 1 if nowPer < lowerThanPer else 0
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
index b77b72f..bd8ae78 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -22,6 +22,7 @@
import TurnBuffs
import BattleObj
import ObjPool
+import TurnPassive
GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs")
@@ -65,6 +66,13 @@
% (curID, skillID, ownerID, relatedSkillID))
return False
+ #被动触发免疫控制buff
+ if buffSkill.GetSkillType() == ChConfig.Def_SkillType_Action:
+ if TurnPassive.GetTriggerEffectValue(turnFight, batObj, buffOwner, ChConfig.PassiveEff_ImmuneControlBuff, buffSkill):
+ GameWorld.DebugLog("血量低于百分x时免疫控制buff: curID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,hp:%s/%s"
+ % (curID, skillID, ownerID, relatedSkillID, batObj.GetHP(), batObj.GetMaxHP()))
+ return False
+
buffValueList = GetAddBuffValue(turnFight, buffOwner, batObj, buffSkill)
GameWorld.DebugLog("OnAddBuff: curID=%s,skillID=%s,atkType=%s,buffValueList=%s,ownerID=%s,relatedSkillID=%s"
% (curID, skillID, buffSkill.GetAtkType(), buffValueList, ownerID, relatedSkillID))
@@ -241,6 +249,19 @@
buffMgr = batObj.GetBuffManager()
buffID = curBuff.GetBuffID()
skillData = curBuff.GetSkillData()
+
+ # 先删除buff再触发其他内容,防止当前要删除的buff影响后续触发的内容,如无敌buff等,理论上触发的后续内容无敌buff不应该再生效
+ curBuffState = skillData.GetCurBuffState()
+ if curBuffState:
+ buffMgr.DelBuffState(curBuffState, buffID)
+
+ buffMgr.DelBuff(buffID, release)
+ if isSync:
+ SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
+ if afterLogic and relatedSkill:
+ tagObjID = tagObj.GetID() if tagObj else buffObjID
+ relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
+
#buff消失的触发
for effectIndex in range(0, skillData.GetEffectCount()):
curEffect = skillData.GetEffect(effectIndex)
@@ -249,32 +270,19 @@
if not effectID:
continue
- if curEffect.GetTriggerWay():
+ triggerWay = curEffect.GetTriggerWay()
+ if triggerWay:
+ if triggerWay == ChConfig.TriggerWay_BuffDel:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BuffDel, connBuff=curBuff)
+
if curEffect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
haveBuffPassiveEff = True
elif effectID in ChConfig.AttrIDList:
isRefreshAttr = True
- else:
- callFunc = GameWorld.GetExecFunc(TurnBuffs, "Buff_%d.%s" % (effectID, "OnBuffDel"))
- if callFunc:
- callFunc(turnFight, batObj, curBuff, curEffect)
-
if haveBuffPassiveEff:
batObj.GetPassiveEffManager().DelBuffPassiveEffect(buffID)
-
- curBuffState = skillData.GetCurBuffState()
- if curBuffState:
- buffMgr.DelBuffState(curBuffState, buffID)
-
- # 最后删除buff、通知
- buffMgr.DelBuff(buffID, release)
- if isSync:
- SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
- if afterLogic and relatedSkill:
- tagObjID = tagObj.GetID() if tagObj else buffObjID
- relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
if isRefreshAttr:
RefreshBuffAttr(batObj)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py
index f8077ad..5d26677 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py
@@ -22,6 +22,6 @@
calcType = curSkill.GetCalcType()
skillPer = curSkill.GetSkillPer()
skillValue = curSkill.GetSkillValue()
- baseValue = TurnSkill.GetCalcBaseValue(calcType, attacker, defender)
+ baseValue = TurnSkill.GetCalcBaseValue(calcType, attacker, defender, curSkill)
shieldValue = int(baseValue * skillPer / 10000.0) + skillValue
return [shieldValue % ChConfig.Def_PerPointValue, shieldValue / ChConfig.Def_PerPointValue]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
index f91000e..e76260f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -31,11 +31,11 @@
buffEffInfo and GameWorld.DebugLog(" 被动Buff效果: %s" % buffEffInfo)
return
-def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0):
+def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0, connBuff=None, **kwargs):
''' 触发被动效果,可能触发技能、buff,需根据优先级触发
'''
passiveEffMgr = batObj.GetPassiveEffManager()
- effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID)
+ effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID, connBuff)
if not effInfoList:
return
# [["skill/buff", skillID/buffID, effIDList], ...]
@@ -45,15 +45,15 @@
sign = effInfo[0]
if sign == "skill":
skillID, effIDList = effInfo[1:]
- __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill)
+ __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill, connBuff, **kwargs)
elif sign == "buff":
buffID, effIDList = effInfo[1:]
- __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill)
+ __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill, connBuff, **kwargs)
return
-def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None):
+def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None, connBuff=None, **kwargs):
skillMgr = batObj.GetSkillManager()
effSkill = skillMgr.FindSkillByID(skillID)
if not effSkill and connSkill and connSkill.GetSkillID() == skillID:
@@ -65,11 +65,11 @@
curEffect = effSkill.GetEffectByID(effID, triggerWay)
if not curEffect:
continue
- DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
+ DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
return
-def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff=None, **kwargs):
effID = curEffect.GetEffectID()
if not effID:
return
@@ -77,12 +77,14 @@
callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoSkillEffectLogic"))
if not callFunc:
return
- callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
+ callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
return
-def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None):
+def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None, connBuff=None, **kwargs):
buffMgr = batObj.GetBuffManager()
effBuff = buffMgr.GetBuff(buffID)
+ if not effBuff and connBuff and connBuff.GetBuffID() == buffID:
+ effBuff = connBuff
if not effBuff:
return
skillData = effBuff.GetSkillData()
@@ -91,11 +93,11 @@
curEffect = skillData.GetEffectByID(effID, triggerWay)
if not curEffect:
continue
- DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
+ DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs)
return
-def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
effID = curEffect.GetEffectID()
if not effID:
return
@@ -103,10 +105,10 @@
callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoBuffEffectLogic"))
if not callFunc:
return
- callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
+ callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs)
return
-def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None):
+def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None, **kwargs):
''' 获取触发被动的值,一般用于某种条件下才会产生的值,如xx情况下属性变化 或 xx情况下是否发生什么
@param calcEffID: 需要统计的效果ID,可以是属性ID或者其他自定义效果ID
@return: 触发的值,0-没有触发或本身触发的值为0;非0-触发的具体值
@@ -159,7 +161,7 @@
callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "GetHappenValue"))
if not callFunc:
continue
- value = callFunc(atkObj, defObj, effect, effSkill)
+ value = callFunc(atkObj, defObj, effect, effSkill, **kwargs)
if value is None:
continue
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 3d2c457..67bb230 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -45,7 +45,7 @@
## 是否无视防御
return useSkill.GetHurtType() / 10 == 1 # 2为真伤,待扩展
-def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None):
+def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None, byBuff=None):
'''使用技能通用入口
@param useSkill: 使用的技能,注意并不一定是身上的技能,可能只是 SkillData 表数据
@param bySkill: 由哪个技能额外触发的,比如附加触发的技能或被动技能均可能由某个技能触发
@@ -61,11 +61,7 @@
#没有指定目标,则按技能自身的目标逻辑
if not tagObjList:
- tagAim = useSkill.GetTagAim()
- tagFriendly = useSkill.GetTagFriendly()
- tagAffect = useSkill.GetTagAffect()
- tagCount = useSkill.GetTagCount()
- tagObjList = GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount)
+ tagObjList = GetSkillTags(turnFight, curBatObj, useSkill)
rate = useSkill.GetHappenRate()
if rate and rate != ChConfig.Def_MaxRateValue:
for tagObj in tagObjList[::-1]:
@@ -99,6 +95,7 @@
useSkill.SetTagObjList(tagObjList)
useSkill.SetBatType(batType)
useSkill.SetBySkill(bySkill)
+ useSkill.SetByBuff(byBuff)
isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
if isTurnNormalSkill:
@@ -153,15 +150,22 @@
poolMgr.release(useSkill)
return True
-def GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount):
+def GetSkillTags(turnFight, curBatObj, useSkill):
## 获取技能目标
# @return: [主目标, 目标2, ...]
+
+ tagAim = useSkill.GetTagAim()
+ tagFriendly = useSkill.GetTagFriendly()
+ tagAffect = useSkill.GetTagAffect()
+ tagCount = useSkill.GetTagCount()
curFaction = curBatObj.GetFaction()
# 自己,直接返回
if tagAim == ChConfig.SkillTagAim_Self:
return [curBatObj]
+
+ tagCount += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillTagCnt, useSkill)
sneerObj = None # 嘲讽目标
sneerObjID, sneerObjPosNum = 0, 0
@@ -291,6 +295,11 @@
if sneerObj in aimObjList and aimObjList.index(sneerObj) != 0:
aimObjList.remove(sneerObj)
aimObjList.insert(0, sneerObj)
+
+ # 一定包含自己
+ if tagFriendly == 2:
+ if curBatObj not in aimObjList:
+ aimObjList.append(curBatObj)
if tagCount and len(aimObjList) > tagCount:
aimObjList = aimObjList[:tagCount]
@@ -977,7 +986,7 @@
OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
return
-def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0):
+def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None):
'''被动触发使用技能
@param passiveSkill: 释放的被动技能
@param connSkill: 由什么技能引起的
@@ -1003,10 +1012,10 @@
GameWorld.DebugLog(" 概率不触发: tagID=%s,happenRate=%s" % (tagID, happenRate))
return
passiveTagObjList = [tagObj]
- isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill)
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff)
else:
GameWorld.DebugLog("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s" % (effSkillID, effectID, passiveSkillID))
- isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill)
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff)
return isOK
@@ -1184,7 +1193,7 @@
aPursueDamPer /= 10000.0
if calcType != ChConfig.Def_Calc_Attack:
- aAtk = GetCalcBaseValue(calcType, atkObj, defObj)
+ aAtk = GetCalcBaseValue(calcType, atkObj, defObj, curSkill)
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))
@@ -1198,6 +1207,9 @@
elif isDot:
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
GameWorld.DebugLog(" 持续技能伤害=%s" % (hurtValue))
+ elif calcType == ChConfig.Def_Calc_ByBuffValue:
+ hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 2))
+ GameWorld.DebugLog(" 按最后一次buff值计算伤害=%s,calcType=%s,LastHurt=%s" % (hurtValue, calcType, aAtk))
elif calcType != ChConfig.Def_Calc_Attack:
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 1))
GameWorld.DebugLog(" 非按攻击力伤害=%s,calcType=%s,aAtk=%s" % (hurtValue, calcType, aAtk))
@@ -1221,6 +1233,13 @@
hurtValueMax = aAtk * hurtAtkPerMax / 10000.0
hurtValue = min(hurtValue, hurtValueMax)
GameWorld.DebugLog(" 伤害最高限制: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s" % (hurtValue, hurtAtkPerMax, aAtk))
+
+ # 均摊
+ hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
+ if hurtShareEff:
+ tagCnt = max(1, len(curSkill.GetTagObjList()))
+ hurtValue = hurtValue / tagCnt
+ GameWorld.DebugLog(" 目标均摊伤害: hurtValue=%s,tagCnt=%s" % (hurtValue, tagCnt))
hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
return hurtValue, hurtTypes
@@ -1399,9 +1418,22 @@
skillPer = curSkill.GetSkillPer()
#skillValue = curSkill.GetSkillValue()
- cureBaseValue = GetCalcBaseValue(cureType, userObj, tagObj)
-
skillPer += TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
+
+ cureHP = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
+
+ cureWayExEff = curSkill.GetEffectByID(ChConfig.SkillEff_CureWayEx)
+ if cureWayExEff:
+ cureType = cureWayExEff.GetEffectValue(0)
+ skillPer = cureWayExEff.GetEffectValue(1)
+ GameWorld.DebugLog("额外计算治疗方式: cureType=%s,skillPer=%s" % (cureType, skillPer))
+ cureHPEx = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
+ cureHP += cureHPEx
+
+ return max(1, int(cureHP)) # 保底1点
+
+def __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum=False):
+ cureBaseValue = GetCalcBaseValue(cureType, userObj, tagObj, curSkill)
# 回合制
curePer = 0 # 治疗加成
@@ -1430,8 +1462,9 @@
% (cureHP, curSkill.GetSkillID(), cureType, baseValue, skillPer, curePer, cureDefPer, angerOverflow))
return cureHP
-def GetCalcBaseValue(calcType, curObj, tagObj):
+def GetCalcBaseValue(calcType, curObj, tagObj, curSkill):
##获得基础计算值
+ baseValue = 0
if calcType == ChConfig.Def_Calc_Attack:
baseValue = curObj.GetAtk()
elif calcType == ChConfig.Def_Calc_MaxHP:
@@ -1440,6 +1473,11 @@
baseValue = curObj.GetLastHurtValue()
elif calcType == ChConfig.Def_Calc_TagMaxHP:
baseValue = 0 if not tagObj else tagObj.GetMaxHP()
+ elif calcType == ChConfig.Def_Calc_ByBuffValue:
+ byBuff = curSkill.GetByBuff()
+ if byBuff:
+ baseValue = byBuff.GetValue1() + byBuff.GetValue2() * ChConfig.Def_PerPointValue
+ GameWorld.DebugLog("根据buff值: %s" % baseValue)
return baseValue
def DoDOTAttack(turnFight, batObj, curBuff, hurtValue, hurtTypes):
--
Gitblit v1.8.0