129 【战斗】战斗系统-服务端(庞统技能;增加触发方式被连击18,被追击19;增加buff状态限制管理支持,写死硬控中无法格挡、闪避、行动;)
| | |
| | | BYTE TriggerWay3; //触发方式
|
| | | BYTE TriggerSrc3; //有效来源
|
| | | WORD CoolDownTime; //技能冷却时间
|
| | | list IgnoreStates; //无视限制列表
|
| | | WORD BuffStateLimit; //Buff状态限制组
|
| | | BYTE CurBuffState; //Buff״ֵ̬
|
| | | WORD LastTime; //持续时间
|
| | | BYTE LayerCnt; //Buff层数
|
| | |
| | | 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() # 无视限制列表
|
| | | def GetBuffStateLimit(self): return self._ipyData.GetBuffStateLimit()
|
| | | def GetCurBuffState(self): return self._ipyData.GetCurBuffState()
|
| | | def GetLastTime(self): return self._ipyData.GetLastTime() # 持续时间
|
| | | def GetLayerCnt(self): return self._ipyData.GetLayerCnt()
|
| | |
| | | def GetEffectByID(self, effID, triggerWay=0): return self._skillData.GetEffectByID(effID, triggerWay)
|
| | | def GetConnSkill(self): return self._skillData.GetConnSkill()
|
| | | def GetCoolDownTime(self): return self._skillData.GetCoolDownTime()
|
| | | def GetIgnoreStates(self): return self._skillData.GetIgnoreStates() # 无视限制列表
|
| | | def GetBuffStateLimit(self): return self._skillData.GetBuffStateLimit()
|
| | | def GetCurBuffState(self): return self._skillData.GetCurBuffState()
|
| | | def GetLastTime(self): return self._skillData.GetLastTime() # 持续时间
|
| | | def GetLayerCnt(self): return self._skillData.GetLayerCnt()
|
| | |
| | | return True
|
| | | return False
|
| | |
|
| | | def IsInControlled(self):
|
| | | ## 是否被控制中
|
| | | for state in ChConfig.InControlledStateList:
|
| | | def IsInControlled(self): return self.IsInBuffStateGroup(1) or self.IsInBuffStateGroup(2) # 是否被控制中
|
| | | def IsInControlledHard(self): return self.IsInBuffStateGroup(1) # 是否被硬控中
|
| | | def IsInBuffStateGroup(self, buffStateGroup):
|
| | | '''是否在某个状态组中
|
| | | 已定义的组: 1 - 硬控组;2 - 软控组;3 - 限制普攻组;4 - 限制怒技组;5 - 限制被动动态组
|
| | | '''
|
| | | buffStateGroupDict = IpyGameDataPY.GetFuncEvalCfg("BuffStateGroup", 1, {})
|
| | | if buffStateGroup not in buffStateGroupDict:
|
| | | return
|
| | | for state in buffStateGroupDict[buffStateGroup]:
|
| | | if self._buffMgr.IsInBuffState(state):
|
| | | return True
|
| | | return False
|
| | | return state
|
| | | return
|
| | |
|
| | | def CanAction(self):
|
| | | ## 是否可以行动
|
| | | if not self.IsAlive():
|
| | | return False
|
| | | if self.IsInControlled():
|
| | | if self.IsInControlledHard():
|
| | | return False
|
| | | return True
|
| | |
|
| | |
| | | BatObjState_Stone, # 石化 12
|
| | | BatObjState_Disarm, # 缴械 13
|
| | | BatObjState_ParryYJ, # 格挡印记 14
|
| | | ) = range(15)
|
| | |
|
| | | # 被控制的状态列表,无法行动,处于某些控制类buff影响状态下,如晕眩,冰冻,石化
|
| | | InControlledStateList = [BatObjState_Frozen, BatObjState_Stun, BatObjState_Stone]
|
| | | BatObjState_Weak, # 虚弱 15
|
| | | BatObjState_Charm, # 魅惑 16
|
| | | BatObjState_Chaos, # 混乱 17
|
| | | ) = range(18)
|
| | |
|
| | | #玩家状态定义,不能超过31个,如超过,需扩展多个key支持
|
| | | Def_PlayerStateList = (
|
| | |
| | | TriggerWay_KillOneObj, # 击杀目标后(单次击杀多目标只触发一次) 15
|
| | | TriggerWay_KillTagObj, # 击杀每目标后(单次击杀多目标每个目标触发一次) 16
|
| | | TriggerWay_BuffDel, # buff消失后 17
|
| | | ) = range(1, 1 + 17)
|
| | | TriggerWay_BeCombo, # 被连击时 18
|
| | | TriggerWay_BePursue, # 被追击时 19
|
| | | ) = range(1, 1 + 19)
|
| | |
|
| | | # 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
|
| | | TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
|
| | |
| | | ("BYTE", "TriggerWay3", 0),
|
| | | ("BYTE", "TriggerSrc3", 0),
|
| | | ("WORD", "CoolDownTime", 0),
|
| | | ("list", "IgnoreStates", 0),
|
| | | ("WORD", "BuffStateLimit", 0),
|
| | | ("BYTE", "CurBuffState", 0),
|
| | | ("WORD", "LastTime", 0),
|
| | | ("BYTE", "LayerCnt", 0),
|
| | |
| | | def GetTriggerWay3(self): return self.attrTuple[28] # 触发方式 BYTE
|
| | | def GetTriggerSrc3(self): return self.attrTuple[29] # 有效来源 BYTE
|
| | | def GetCoolDownTime(self): return self.attrTuple[30] # 技能冷却时间 WORD
|
| | | def GetIgnoreStates(self): return self.attrTuple[31] # 无视限制列表 list
|
| | | def GetBuffStateLimit(self): return self.attrTuple[31] # Buff状态限制组 WORD
|
| | | def GetCurBuffState(self): return self.attrTuple[32] # Buff״ֵ̬ BYTE
|
| | | def GetLastTime(self): return self.attrTuple[33] # 持续时间 WORD
|
| | | def GetLayerCnt(self): return self.attrTuple[34] # Buff层数 BYTE
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_5013
|
| | | #
|
| | | # @todo:触发释放技能(buff施法方对该buff携带方进行释放技能)
|
| | | # @author hxp
|
| | | # @date 2025-09-23
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 触发释放技能(buff施法方对该buff携带方进行释放技能)
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-09-23 11:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import TurnSkill
|
| | | import IpyGameDataPY
|
| | | import BattleObj
|
| | |
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
|
| | | ownerID = effBuff.GetOwnerID()
|
| | | if not ownerID:
|
| | | return
|
| | | buffOwner = BattleObj.GetBatObjMgr().getBatObj(ownerID)
|
| | | if not buffOwner or not buffOwner.IsAlive():
|
| | | return
|
| | | effSkill = effBuff.GetSkillData().GetIpyData()
|
| | | skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
|
| | | if not skillID:
|
| | | passiveSkill = effSkill
|
| | | else:
|
| | | passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
| | | if not passiveSkill:
|
| | | return
|
| | | effectID = curEffect.GetEffectID()
|
| | | effSkillID = effSkill.GetSkillID()
|
| | | return TurnSkill.OnUsePassiveSkill(turnFight, buffOwner, batObj, passiveSkill, connSkill, effSkillID, effectID, connBuff)
|
| | |
| | | if not skillID:
|
| | | return
|
| | |
|
| | | if not curBatObj.CanAction():
|
| | | return
|
| | | |
| | | buffStateLimit = useSkill.GetBuffStateLimit()
|
| | | if buffStateLimit:
|
| | | limitState = curBatObj.IsInBuffStateGroup(buffStateLimit)
|
| | | if limitState:
|
| | | GameWorld.DebugLog("技能使用处于buff状态限制中! skillID=%s,buffStateLimit=%s,limitState=%s" % (skillID, buffStateLimit, limitState))
|
| | | return
|
| | | |
| | | #没有指定目标,则按技能自身的目标逻辑
|
| | | if not tagObjList:
|
| | | tagObjList = GetSkillTags(turnFight, curBatObj, useSkill)
|
| | |
| | | tagObj = batObjMgr.getBatObj(tagObjID)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, buffObj, ChConfig.TriggerWay_ShieldBroken, tagObj, connSkillTypeID=buffSkillTypeID)
|
| | |
|
| | | batType = useSkill.GetBatType()
|
| | | for tagObj in useSkill.GetTagObjList():
|
| | | tagID = tagObj.GetID()
|
| | | if tagID in effIgnoreObjIDList:
|
| | |
| | | # 使用技能后
|
| | | if isUseSkill:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_UseSkillOver, tagObj, connSkill=useSkill)
|
| | | |
| | | # 连击
|
| | | if batType == ChConfig.TurnBattleType_Combo:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeCombo, curObj, connSkill=useSkill)
|
| | | # 追击
|
| | | elif batType == ChConfig.TurnBattleType_Pursue:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
|
| | |
|
| | | if killObjList:
|
| | | tagObj = killObjList[0]
|
| | |
| | | GameWorld.DebugLog("XP必命中! curXP=%s,angerOverflow=%s" % (curXP, angerOverflow))
|
| | |
|
| | | #命中公式 攻击方类型不同,公式不同
|
| | | if isTurnNormalSkill and not mustHit:
|
| | | if isTurnNormalSkill and not mustHit and not defObj.IsInControlledHard():
|
| | | aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中
|
| | | dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_MissRate) # 闪避率
|
| | | missNum = curSkill.GetTagMissNum(defID)
|
| | |
| | | return False
|
| | |
|
| | | def CanParry(turnFight, atkObj, defObj, curSkill):
|
| | | if defObj.IsInControlled():
|
| | | #被控制无法格挡
|
| | | if defObj.IsInControlledHard():
|
| | | #被硬控无法格挡
|
| | | return False
|
| | |
|
| | | defID = defObj.GetID()
|