2683 子 天赋技能和新增双职业各两个技能 / 【后端】天赋技能 ----- 枪的攻和防
AI222 支持陷阱目标释放技能
| | |
| | |
|
| | | return ChConfig.Def_BattleRelationType_PVE
|
| | |
|
| | | # 判断PK关系是否可攻击 Def_BattleRelationType_CommNoBoss也可攻击 只是攻击无效果
|
| | | def CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | if skillBattleType in [ChConfig.Def_BattleRelationType_Comm, ChConfig.Def_BattleRelationType_CommNoBoss]:
|
| | | return True
|
| | | |
| | | #if battleRelationType in [ChConfig.Def_BattleRelationType_Comm, ChConfig.Def_BattleRelationType_CommNoBoss]:
|
| | | # return True
|
| | | |
| | | if skillBattleType != battleRelationType:
|
| | | # PK模式的判定
|
| | | return False
|
| | | return True
|
| | |
|
| | | ## 获取攻击类型
|
| | | # @param attack 攻击方对象
|
| | |
| | |
|
| | | #攻击触发事件, 该代码应该放在DoAttack函数中处理逻辑比较清晰,也不会破坏GetHurtHP函数
|
| | | #因为DoAttack修改点比较多,暂不迁移,相关攻击事件逻辑,就往此函数中添加
|
| | | AttackEventTrigger(atkObj, defObj, resultHurtType, tick)
|
| | | AttackEventTrigger(atkObj, defObj, curSkill, resultHurtType, tick)
|
| | | #===========================================================================
|
| | | # if atkObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | # GameWorld.DebugAnswer(atkObj, "--%s剩余血量 %s"%(defObj.GetID(), defObj.GetHP()))
|
| | |
| | |
|
| | | # atkSkillPer 包含普攻,所以不是用技能增强处理
|
| | | atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer)
|
| | | |
| | | atkSkillPer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer)
|
| | |
|
| | |
|
| | |
| | | ## 攻击时事件处理,反弹吸血或者额外触发技能等
|
| | | # @param resultHurtType 伤害结构体
|
| | | # @return
|
| | | def AttackEventTrigger(atkObj, defObj, resultHurtType, tick):
|
| | | def AttackEventTrigger(atkObj, defObj, curSkill, resultHurtType, tick):
|
| | |
|
| | | #反弹伤害
|
| | | CalcBounceHP(atkObj, defObj, resultHurtType.LostHP, resultHurtType.HurtType)
|
| | | #吸血
|
| | | CalcSuckBlood(atkObj, defObj, resultHurtType.RealHurtHP, tick)
|
| | | CalcSuckBlood(atkObj, defObj, curSkill, resultHurtType.RealHurtHP, tick)
|
| | |
|
| | | if atkObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | # 记录最后一次伤害值
|
| | |
| | | # @param atkObj 攻击者
|
| | | # @param defObj 防守者
|
| | | # @return None
|
| | | def CalcSuckBlood(atkObj, defObj, hurtValue, tick):
|
| | | def CalcSuckBlood(atkObj, defObj, curSkill, hurtValue, tick):
|
| | |
|
| | | if atkObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return
|
| | |
| | | atkBackHP += PlayerControl.GetPVPAtkBackHP(atkObj)
|
| | | # 百分比吸血
|
| | | atkBackHPPer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, None, ChConfig.TriggerType_Buff_SuckBloodPer)
|
| | | atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, None, ChConfig.TriggerType_Buff_SuckBloodPer)
|
| | | atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
|
| | |
|
| | | atkBackHP += int(hurtValue * atkBackHPPer*1.0 / ChConfig.Def_MaxRateValue)
|
| | |
|
| | |
| | |
|
| | | if curPlayerSkill:
|
| | | SkillCommon.SetSkillRemainTime(curPlayerSkill, PlayerControl.GetReduceSkillCDPer(curPlayer), tick, curPlayer)
|
| | | |
| | | if curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_GiftSkill:
|
| | | UseSkillOver(curPlayer, target, curSkill, tick)
|
| | | return True
|
| | |
|
| | | #玩家进入战斗状态
|
| | |
| | |
|
| | | # 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
|
| | | def OnHurtTypeTriggerSkill(attacker, target, curSkill, tick):
|
| | | |
| | | isSuperHit = False
|
| | | usePassiveSkillResult = True # 第一次判断不能调用,即代表都不可用无需循环
|
| | | usePassiveSkillResultOnSuperHit = True # 暴击对象1V1触发,第一次判断不能调用,即代表都不可用无需循环
|
| | |
| | | if hurtList[1] == IPY_GameWorld.gotPlayer:
|
| | | # 濒死状态触发技能, 不能在GetHurtHP内部触发技能,否则会导致原技能的伤血列表异常
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_WillDead, tick)
|
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(defender, attacker, None, ChConfig.TriggerType_WillDead, tick)
|
| | | continue
|
| | |
|
| | | if usePassiveSkillResult:
|
| | |
| | | # 灵为玩家的替身需要走此逻辑
|
| | | # 技能使用结束,在处理技能逻辑和通知封包之后调用
|
| | | def UseSkillOver(attacker, defender, curSkill, tick):
|
| | | |
| | | # 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
|
| | | OnHurtTypeTriggerSkill(attacker, defender, curSkill, tick)
|
| | |
|
| | |
| | |
|
| | | # 普攻和对敌技能
|
| | | if not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List:
|
| | | |
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick)
|
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick)
|
| | |
|
| | |
| | | continue
|
| | |
|
| | | #放在函数中可多次触发 如SP 触发减速或者伤害,但不能放在攻击计算中,因为伤害型技能会影响伤血列表
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defObj, curSkill, ChConfig.TriggerType_AttackPlayer, tick,
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defObj, curSkill, ChConfig.TriggerType_StormAttackOneByOne, tick,
|
| | | isEnhanceSkill=False, skillIDSet=skillIDSet)
|
| | |
|
| | | DoLogic_AttackResult(attacker, defObj, curSkill, tick)
|
| | |
| | | continue
|
| | | SkillCommon.SetSkillRemainTime(curSkill, 0, tick, attacker)
|
| | |
|
| | | if attackList:
|
| | | PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, attackList[0], curSkill, ChConfig.TriggerType_StormAttackReduceCD)
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, attackList[0], curSkill, ChConfig.TriggerType_StormAttackOver, tick)
|
| | |
|
| | |
|
| | | ## 清空伤血列表
|
| | | # @param 无
|
| | | # @return 无
|
| | |
| | | TriggerType_AttackAddSkillPer, # 所有攻击伤害(SkillPer)增加,含普攻,计算时 5
|
| | | TriggerType_SuperHit, # 暴击时 触发技能
|
| | | TriggerType_SuperHitValue, # 暴击时 增加暴击值
|
| | | TriggerType_AttackPlayer, # 击中玩家(群攻多次触发) 同 TriggerType_HurtObjAddBuff
|
| | | TriggerType_StormAttackOneByOne, # 类剑刃风暴攻击1对1触发技能 |
| | | TriggerType_ReduceCD, # 减少CD
|
| | | TriggerType_SuperHitSkillPer, # 暴击时,增加技能伤害 10
|
| | | TriggerType_AttackAddFinalValue, #增加输出伤害
|
| | |
| | | TriggerType_LuckyHit, # 会心一击时增加会心伤害百分比 50
|
| | | TriggerType_ChangeHurtToHP, # 把受到伤害的xx%转化为生命值 51
|
| | | TriggerType_AddLayer, # BUFF层级增加时 52
|
| | | ) = range(1, 53)
|
| | | TriggerType_ForbidenCure, # 禁止治疗 53
|
| | | TriggerType_PassiveBuffValue, ## 被动buff值计算中二次获取被动值 54
|
| | | TriggerType_AttackKillHappen, ## 对被动技能斩杀的概率增强 55
|
| | | TriggerType_AddBuffOver, # 添加buff之后触发技能 56
|
| | | TriggerType_StormAttackOver, # 类剑刃风暴每攻击一次触发技能 57
|
| | | TriggerType_StormAttackReduceCD, # 类剑刃风暴攻击每攻击一次减少CD 58
|
| | | ) = range(1, 59)
|
| | |
|
| | |
|
| | | # NPC功能类型定义
|
| | |
| | | import IPY_GameWorld
|
| | | import GameObj
|
| | | import GameMap
|
| | | import AttackCommon
|
| | | import SkillCommon
|
| | | import AICommon
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | |
|
| | | npcControl = NPCCommon.NPCControl(curNPC)
|
| | | #刷新自己仇恨度列表
|
| | | npcControl.RefreshAngryList(tick, 500) # 为确保踩陷阱体验,暂定1秒
|
| | | npcControl.RefreshAngryList(tick, 500) # 为确保踩陷阱体验,
|
| | | #遍历仇恨列表找到最近的,并触发
|
| | | for i in range(0, curNPC.GetNPCAngry().GetAngryCount()):
|
| | | curAngry = curNPC.GetNPCAngry().GetAngryValueTag(i)
|
| | |
| | | continue
|
| | |
|
| | | #进入战斗
|
| | | NPCFight(curNPC, npcControl, curObj, tick)
|
| | | if not NPCFight(curNPC, npcControl, curObj, tick):
|
| | | continue
|
| | | return
|
| | |
|
| | | return
|
| | |
| | |
|
| | | if curSkill == None:
|
| | | GameWorld.Log("陷阱 = %s 数据库查找技能失败"%curNPC.GetName())
|
| | | return
|
| | | return True
|
| | | |
| | | battleRelationType = AttackCommon.GetBattleRelationType(curNPC, curObj)
|
| | | |
| | | skillBattleType = SkillCommon.GetSkillBattleType(curSkill)
|
| | | if not AttackCommon.CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | # PK模式的判定
|
| | | return False
|
| | | |
| | | curNPC.SetDict("traptagType", curObj.GetGameObjType())
|
| | | curNPC.SetDict("traptagID", curObj.GetID())
|
| | |
|
| | | #触发技能, 改为统一在死亡时释放技能
|
| | | #SkillShell.NPCUseSkillTag(curNPC, curObj, curSkill, tick)
|
| | |
|
| | | #有玩家进入仇恨列表,,,自爆
|
| | | npcControl.SetKilled()
|
| | | return
|
| | | return True
|
| | |
|
| | | ## NPC死亡
|
| | | # @param curNPC 当前npc
|
| | |
| | | if not curSkill:
|
| | | return
|
| | |
|
| | | curObj = GameWorld.GetObj(curNPC.GetDictByKey("traptagID"), curNPC.GetDictByKey("traptagType"))
|
| | | tick = GameWorld.GetGameWorld().GetTick()
|
| | | if curObj == None or GameObj.GetHP(curObj) <= 0:
|
| | | SkillShell.NPCUseSkill(curNPC, curSkill, tick)
|
| | | return
|
| | | |
| | | AICommon.DoNPCUseSkill(curNPC, curObj, curSkill, 0, tick)
|
| | |
|
| | | GameObj.SetHP(curNPC, 0)
|
| | | return
|
| | |
| | | # @param tick 当前时间
|
| | | # @param value Buff总值->用于持续类技能
|
| | | # @param buffOwner Buff拥有者
|
| | | # @return None
|
| | | # @remarks 函数详细说明.
|
| | | def DoAddBuff( curObj, buffType, curSkill, tick, addBuffValueList = [], buffOwner = None ):
|
| | | # @param addForce 代表是否一定添加buff,避免互相反弹buff
|
| | | def DoAddBuff( curObj, buffType, curSkill, tick, addBuffValueList = [], buffOwner = None, addForce = False ):
|
| | | if curObj == None:
|
| | | # 避免配表错误导致报错
|
| | | return False
|
| | |
| | | # 释放后 对指定BOSS无效的技能
|
| | | return True
|
| | |
|
| | | result = AddBuffNoRefreshState(curObj, buffType, curSkill, tick, addBuffValueList, buffOwner)
|
| | | result = AddBuffNoRefreshState(curObj, buffType, curSkill, tick, addBuffValueList, buffOwner, addForce)
|
| | |
|
| | | if result is not 0:
|
| | | # 被抵消的buff 不处理
|
| | |
| | | #异常
|
| | | else:
|
| | | GameWorld.Log("添加buff刷新失败 curObjType = %s"%(curObjType))
|
| | |
|
| | |
|
| | | return result
|
| | |
|
| | |
| | | ## 增加BUFF 减少BUFF(参数 -> 当前对象,buff类型,当前技能,当前时间,Buff总值->用于持续类技能 , Buff拥有者)
|
| | | # buff的effect在添加和删除的时候处理,buff共存由buff本身决定而不是effect互斥,不再统一调用RefreshPlayerBuffOnAttrAddEffect
|
| | | # plusValueList 改为buff value列表 第一个为增加数值,其他自定义
|
| | | # addForce 表示是否一定会增加buff,避免互相反弹buff
|
| | | # 返回值 返回真刷属性,返回0 代表被抵消buff
|
| | | def AddBuffNoRefreshState( curObj, buffType, curSkill, tick, plusValueList=[] , buffOwner = None ):
|
| | | def AddBuffNoRefreshState( curObj, buffType, curSkill, tick, plusValueList=[], buffOwner = None, addForce = False):
|
| | | if not SkillCommon.IsBuff(curSkill):
|
| | | GameWorld.ErrLog("%s 不能加这个buff, 因为它是攻击技能! %s-->TypeID = %d"%(curObj.GetName(), curSkill.GetSkillName(), curSkill.GetSkillType()))
|
| | | return False
|
| | |
| | | if buffTuple == ():
|
| | | return False
|
| | |
|
| | | if curSkill.GetSkillType() in ChConfig.Def_Debuff_List:
|
| | | if not addForce and curSkill.GetSkillType() in ChConfig.Def_Debuff_List:
|
| | | if PassiveBuffEffMng.OnPassiveSkillHappen(curObj, buffOwner, curSkill, ChConfig.TriggerType_DebuffOff, tick):
|
| | | # 此处必须返回0 用于外层判断被抵消
|
| | | return 0
|
| | | |
| | | if PassiveBuffEffMng.OnPassiveBuffHappen(curObj, buffOwner, curSkill, ChConfig.TriggerType_DebuffOff, tick):
|
| | | # 被动类buff抵消
|
| | | # 此处必须返回0 用于外层判断被抵消
|
| | | return 0
|
| | |
|
| | |
| | | if hasEffect:
|
| | | layerMaxCnt = hasEffect.GetEffectValue(0) # 能叠加的最大上限
|
| | | layerCalc = hasEffect.GetEffectValue(1) # 增加层级还是减少层级 Def_BuffLayer_Add
|
| | |
|
| | |
|
| | | #1 检查是否有相同的BUFF,如果有相同的就刷新时间
|
| | | for i in range( 0, buffCount ):
|
| | |
| | | if curLayerCnt < layerMaxCnt:
|
| | | if layerCalc == ChConfig.Def_BuffLayer_Add:
|
| | | curBuff.SetLayer(curLayerCnt + 1)
|
| | | #BUFF层级变化触发被动
|
| | | if buffOwner:
|
| | | curObj.SetDict("addBuffLayer", curBuff.GetLayer())
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick)
|
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick)
|
| | | curObj.SetDict("addBuffLayer", 0)
|
| | | else:
|
| | | curBuff.SetLayer(layerMaxCnt)
|
| | | changeLayer = True
|
| | | #BUFF层级变化触发被动
|
| | | if buffOwner:
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick)
|
| | | |
| | | __BuffCanRemain(buffState, curBuff, i, resultTime, plusValueList, buffOwner)
|
| | | # 此处考虑下plusValue变强是否刷属性
|
| | | #DoAddBuffOver(curObj, curSkill, addBuff, tick)
|
| | |
| | |
|
| | |
|
| | | #添加BUFF后的特殊处理
|
| | | DoAddBuffOver(curObj, curSkill, addBuff, tick)
|
| | | DoAddBuffOver(curObj, curSkill, addBuff, buffOwner, tick)
|
| | |
|
| | | # 通知客户端
|
| | | buffState.Sync_AddBuffEx()
|
| | |
| | | # @param addBuff 玩家身上的BUFF实例
|
| | | # @param tick 时间戳
|
| | | # @return None
|
| | | def DoAddBuffOver(curObj, curSkill, addBuff, tick):
|
| | | def DoAddBuffOver(curObj, curSkill, addBuff, buffOwner, tick):
|
| | | #触发被动技能
|
| | | if buffOwner:
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddBuffOver, tick)
|
| | | |
| | | #是否是持续性技能
|
| | | isLstSkill = curSkill.GetSkillType() in ChConfig.Def_LstBuff_List
|
| | |
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: buff消失后触发技能
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-10-30 下午03:56:57
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import SkillShell
|
| | | import IPY_GameWorld
|
| | | import GameWorld
|
| | | import GameObj
|
| | |
|
| | | ## BUFF消失后
|
| | | # @param None
|
| | | # @return None
|
| | | def OnBuffDisappear(curObj, curSkill, curBuff, curEffect, tick):
|
| | | # 暂且只有玩家,玩家可以取主动攻击的目标
|
| | | if curObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return
|
| | | defender = GameWorld.GetObj(curObj.GetUseSkillTagID(), curObj.GetUseSkillTagType())
|
| | | if not defender or GameObj.GetHP(defender) <= 0:
|
| | | return
|
| | | if not GameWorld.CanHappen(curEffect.GetEffectValue(1)):
|
| | | return
|
| | | triggerSkill = GameWorld.GetGameData().GetSkillBySkillID(curEffect.GetEffectValue(0))
|
| | | SkillShell.DoLogic_UseSkill(curObj, defender, triggerSkill, tick)
|
| | |
|
| | | return
|
| | | |
| | | |
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # @todo: 佩戴X代以上翅膀,额外添加属性百分比
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-1-20 下午02:50:26
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | #导入
|
| | | import ChConfig
|
| | | import ItemCommon
|
| | | import ShareDefine
|
| | | import IPY_GameWorld
|
| | | import GameWorld
|
| | | import PlayerControl
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | |
|
| | | def OnCalcBuffEx(defender, curEffect, calcDict, curBuff):
|
| | | equipPack = defender.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
|
| | | curWing = equipPack.GetAt(ShareDefine.retWing)
|
| | | |
| | | if not ItemCommon.CheckItemCanUse(curWing):
|
| | | #GameWorld.Log("翅膀不合法,或者没有带翅膀")
|
| | | return
|
| | | |
| | | if curWing.GetItemColor() < curEffect.GetEffectValue(2):
|
| | | return
|
| | | |
| | | attrType = curEffect.GetEffectValue(1)
|
| | | attrTypeList = [attrType]
|
| | | # 攻击力有最大最小 特殊处理
|
| | | if attrType in [ChConfig.TYPE_Calc_AttrATKMin, ChConfig.TYPE_Calc_AttrATKMax]:
|
| | | attrTypeList = [ChConfig.TYPE_Calc_AttrATKMin, ChConfig.TYPE_Calc_AttrATKMax]
|
| | | for tmpType in attrTypeList:
|
| | | calcDict[tmpType] = calcDict.get(tmpType, 0) + curEffect.GetEffectValue(0)
|
| | | return
|
| | |
|
| | |
|
| | | ## 返回buff类型,线性与否
|
| | | # @param |
| | | # @return None
|
| | | # @remarks 函数详细说明. |
| | | def GetCalcType():
|
| | | return ChConfig.TYPE_NoLinear
|
| | |
|
| | |
| | | effect = curEffect.GetEffectValue(0)
|
| | | if curBuff and curBuff.GetLayer():
|
| | | # 层级叠加效果
|
| | | effect = effect*curBuff.GetLayer()()
|
| | | effect = effect*curBuff.GetLayer()
|
| | |
|
| | | # 属性buff效果id对应计算模块字典{效果id:(计算模块名后缀, [属性类型])}
|
| | | suffixName, attrTypeList = BuffSkill.FindBuffAttrByEffectID(curEffect)
|
| | |
| | | # remainTime = skillData.GetCoolDownTime()
|
| | |
|
| | | reduceSkillCDPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, None, curSkill, ChConfig.TriggerType_ReduceCD)
|
| | |
|
| | | # 减CD比率
|
| | | if reduceSkillCDPer > 0:
|
| | | remainTime = int(remainTime * max(0, ShareDefine.Def_MaxRateValue - reduceSkillCDPer) / ShareDefine.Def_MaxRateValue)
|
| | |
| | | if curHP <= 0:
|
| | | return
|
| | |
|
| | | if PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(curObj, None, None, ChConfig.TriggerType_ForbidenCure):
|
| | | # 禁止治疗
|
| | | return
|
| | | |
| | | # 治疗加成
|
| | | curePer = PlayerControl.GetCurePer(curObj) if curObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
|
| | | addValue = int(addValue*curePer*1.0/ChConfig.Def_MaxRateValue)
|
| | |
| | | # 濒死状态触发技能
|
| | | if GameObj.GetHP(curObj) == 0:
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(curObj, None, curSkill, ChConfig.TriggerType_WillDead, tick)
|
| | | |
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(curObj, None, curSkill, ChConfig.TriggerType_WillDead, tick)
|
| | |
|
| | | #无法找到Buff拥有者
|
| | | if not buffOwner:
|
| | |
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | onlySkillID = passiveEffect.GetEffectValue(2) # 单状态不可重复的BUFFID, 层数决定触发次数
|
| | | if onlySkillID:
|
| | | if not defender:
|
| | | return False
|
| | | # 目标身上查找
|
| | | findSkill = GameWorld.GetGameData().GetSkillBySkillID(passiveEffect.GetEffectValue(2))
|
| | | findSkill = GameWorld.GetGameData().GetSkillBySkillID(onlySkillID)
|
| | | if not findSkill:
|
| | | return False
|
| | |
|
| | |
| | | import PassiveBuffEffMng
|
| | | import SkillCommon
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not curSkill:
|
| | | return
|
| | |
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | onlySkillID = passiveEffect.GetEffectValue(2) # 单状态不可重复的BUFFID, 层数决定触发次数
|
| | | if onlySkillID:
|
| | | if not defender:
|
| | |
| | | import GameWorld
|
| | | import GameObj
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | if not defender:
|
| | | return False
|
| | |
|
| | |
| | | import GameWorld
|
| | | import GameObj
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | return True
|
| | |
|
| | |
|
| | |
| | | import BuffSkill
|
| | | import PlayerControl
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | tick = GameWorld.GetGameWorld().GetTick()
|
| | | # 判断间隔
|
| | | if tick - attacker.GetDictByKey("atkRefresh4506") < passiveEffect.GetEffectValue(0):
|
| | |
| | | import IPY_GameWorld
|
| | | import SkillCommon
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | if not defender:
|
| | | return False
|
| | | if defender.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | |
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not curSkill:
|
| | | return False
|
| | |
| | | return False
|
| | |
|
| | | buffManager = buffTuple[0]
|
| | | buff = buffManager.FindBuff(skillID)
|
| | | buff = buffManager.FindBuff(curSkill.GetSkillTypeID())
|
| | | if not buff:
|
| | | return False
|
| | |
|
| | |
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | |
|
| | | return passiveEffect.GetEffectValue(0)
|
| | |
|
| | |
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | |
|
| | | return True
|
| | |
|
| | |
| | | import GameWorld
|
| | | import PlayerControl
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | |
|
| | | return True
|
| | |
|
| | |
| | | import GameWorld
|
| | | import PlayerControl
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | |
|
| | | return True
|
| | |
|
| | |
| | | import ChConfig
|
| | | import GameObj
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | |
|
| | | return True
|
| | |
|
| | |
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not curSkill:
|
| | | return False
|
| | |
| | | import ChConfig |
| | | import GameWorld |
| | | |
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID): |
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | return GameWorld.CanHappen(passiveEffect.GetEffectValue(1)) |
| | | |
| | | |
| | |
| | |
|
| | | import ChConfig
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID):
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | return True
|
| | |
|
| | |
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # @todo: buff中抵消debuff并且反射debuff,层级决定次数
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-1-9 下午09:39:37
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, tagSkill):
|
| | | debuffState = effect.GetEffectValue(1)
|
| | | if debuffState and debuffState != SkillCommon.GetBuffStateType(tagSkill):
|
| | | return False
|
| | | |
| | | if effect.GetEffectValue(2):
|
| | | if SkillCommon.GetBuffType(tagSkill) != ChConfig.Def_SkillBuffList.get(effect.GetEffectValue(2)):
|
| | | return False
|
| | | if not effect.GetEffectValue(0):
|
| | | return True
|
| | | return GameWorld.CanHappen(effect.GetEffectValue(0))
|
| | | |
| | | def DoLogic(attacker, defender, effect, tagSkill, skillID):
|
| | | # 反射debuff
|
| | | if not defender:
|
| | | return
|
| | |
|
| | | findSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not findSkill:
|
| | | return
|
| | | |
| | | buffType = SkillCommon.GetBuffType(findSkill)
|
| | | buffTuple = SkillCommon.GetBuffManagerByBuffType(attacker, buffType)
|
| | | if buffTuple == ():
|
| | | return
|
| | | |
| | | buffManager = buffTuple[0]
|
| | | findBuff = buffManager.FindBuffEx(skillID)
|
| | | if not findBuff:
|
| | | return
|
| | | |
| | | BuffSkill.SetBuffLayer(attacker, findBuff, findBuff.GetLayer()-1, skillTypeID=findSkill.GetSkillTypeID())
|
| | |
|
| | | # 给对方加buff
|
| | | BuffSkill.DoAddBuff(defender, SkillCommon.GetBuffType(tagSkill), tagSkill, |
| | | GameWorld.GetGameWorld().GetTick(), [], attacker, addForce = True)
|
| | | return
|
| | |
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # @todo: 禁止治疗
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-1-9 下午09:39:37
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | return True
|
| | |
|
| | |
|
| | | def GetValue(attacker, defender, passiveEffect):
|
| | | return 1
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # @todo: 进入濒死状态 血量为1, 不触发技能
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2017-12-9 下午09:41:44
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | attacker.SetHP(1)
|
| | |
|
| | | return False
|
| | |
|
| | |
|
| | | def GetSkillData(passiveEffect):
|
| | | return
|
| | |
|
| | | def AfterUsePassiveSkill(attacker, defender, passiveEffect, tick):
|
| | | return
|
| | |
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # @todo: buff中对目标的buff层级达到第几层触发技能
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2017-12-9 下午09:41:44
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | if not defender:
|
| | | return False
|
| | | |
| | | useSkill = skillkwargs['useSkill']
|
| | | skillTypeID = useSkill.GetSkillTypeID() if useSkill else 0
|
| | | if passiveEffect.GetEffectValue(2) and passiveEffect.GetEffectValue(2) != skillTypeID:
|
| | | # 验证关联技能
|
| | | return False
|
| | | return defender.GetDictByKey("addBuffLayer") == passiveEffect.GetEffectValue(0)
|
| | |
|
| | |
|
| | | def GetSkillData(passiveEffect):
|
| | | skillID = passiveEffect.GetEffectValue(1)
|
| | |
|
| | | return GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | |
|
| | |
|
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # @todo: 减CD
|
| | | # @todo: 减CD,添加自身血量判断,自身血量低于百分比,默认0为不受血量影响
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-1-9 下午09:39:37
|
| | |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ItemControler
|
| | | import ChConfig
|
| | | import GameObj
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | return True
|
| | |
|
| | | # 未配置不验证血量百分比
|
| | | hpPer = effect.GetEffectValue(1)
|
| | | if hpPer:
|
| | | if GameObj.GetHP(attacker)*ChConfig.Def_MaxRateValue/GameObj.GetMaxHP(attacker) >= hpPer:
|
| | | return False
|
| | |
|
| | | return True
|
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return effect.GetEffectValue(0)
|
| | |
| | | import GameWorld
|
| | | import GameObj
|
| | | import IPY_GameWorld
|
| | |
|
| | | import PassiveBuffEffMng
|
| | | # 血量低于XX
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if not defender:
|
| | |
| | | if GameObj.GetHP(defender)*ChConfig.Def_MaxRateValue/GameObj.GetMaxHP(defender) >= effect.GetEffectValue(0):
|
| | | return False
|
| | |
|
| | | return GameWorld.CanHappen(effect.GetEffectValue(1))
|
| | | value = effect.GetEffectValue(1)
|
| | |
|
| | | value += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, defender, curSkill, ChConfig.TriggerType_AttackKillHappen)
|
| | |
|
| | | return GameWorld.CanHappen(value)
|
| | |
|
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | |
| | |
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | |
|
| | | result = GameWorld.CanHappen(effect.GetEffectValue(0))
|
| | | if result:
|
| | | GameObj.SetHP(attacker, 1) # 为了避免生命为0时,屏蔽过多逻辑
|
| | | return result
|
| | | return True
|
| | | |
| | | if effect.GetEffectValue(1):
|
| | | #不死血量1,但不触发技能
|
| | | if GameWorld.CanHappen(effect.GetEffectValue(1)):
|
| | | GameObj.SetHP(attacker, 1)
|
| | | return False
|
| | |
|
| | | return False
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # 对目标的buff层级达到第几层触发技能
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-1-9 下午09:39:37
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill): |
| | | |
| | | return defender.GetDictByKey("addBuffLayer") == effect.GetEffectValue(0)
|
| | | |
| | |
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # @todo: 对某个职业提高技能伤害
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-1-9 下午09:39:37
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import IPY_GameWorld
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if not defender:
|
| | | return False
|
| | | |
| | | if defender.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return False
|
| | | |
| | | return defender.GetJob() == effect.GetEffectValue(1)
|
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return effect.GetEffectValue(0)*1.0/ChConfig.Def_MaxRateValue
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # @todo: 减少指定技能的CD,如果有次数控制 需要做成层级buff ----- 类剑刃风暴技能使用
|
| | | # 第三个效果值默认为0,每次都减少CD 则不需要配置成buff; 配置数字则需要和buff层级搭配来控制次数
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-1-9 下午09:39:37
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import IPY_GameWorld
|
| | | import GameWorld
|
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return False
|
| | | |
| | | if effect.GetEffectValue(2):
|
| | | skillID = curSkill.GetSkillID()
|
| | | if SkillCommon.IsBuff(curSkill):
|
| | | buffType = SkillCommon.GetBuffType(curSkill)
|
| | | buffTuple = SkillCommon.GetBuffManagerByBuffType(attacker, buffType)
|
| | | if buffTuple == ():
|
| | | return False
|
| | | |
| | | buffManager = buffTuple[0]
|
| | | findBuff = buffManager.FindBuff(skillID)
|
| | | if findBuff and findBuff.GetLayer() >= effect.GetEffectValue(2):
|
| | | # 超过不再减CD
|
| | | return False
|
| | |
|
| | | return True
|
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | # 此处处理减少CD逻辑
|
| | | skillID = effect.GetEffectValue(0)
|
| | |
|
| | | curSkill = attacker.GetSkillManager().FindSkillBySkillID(skillID)
|
| | | coolDownTime = curSkill.GetCoolDownTime()
|
| | | remainTime = curSkill.GetRemainTime()
|
| | | remainTime = int(max(remainTime - coolDownTime*1.0*effect.GetEffectValue(1)/ChConfig.Def_MaxRateValue, 0))
|
| | |
|
| | | curSkill.SetRemainTime(remainTime)
|
| | | curSkill.SetLastUseTick(GameWorld.GetGameWorld().GetTick())
|
| | | curSkill.Sync_Skill()
|
| | | return 0
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # @todo: # 如被动技能:千幻冥炎真实伤害从2变4倍
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-1-9 下午09:39:37
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import IPY_GameWorld
|
| | | import GameWorld
|
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | |
|
| | | return True
|
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return float(effect.GetEffectValue(0))/ChConfig.Def_MaxRateValue
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 对被动技能斩杀的概率增强
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-10-26 下午03:26:26
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import GameWorld
|
| | | import GameObj
|
| | |
|
| | | # 目标某个状态时触发
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if not defender:
|
| | | return False
|
| | | |
| | | if GameObj.GetPyPlayerState(defender, effect.GetEffectValue(1)):#ChConfig.Def_PlayerState_Stun):
|
| | | #GameWorld.DebugLog("状态触发----%s"%effect.GetEffectValue(1))
|
| | | return True
|
| | | |
| | | return False
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return effect.GetEffectValue(0)
|
| | |
| | | 4050:ChConfig.TriggerType_OneDamage, # 伤害降低到1点
|
| | | 4051:ChConfig.TriggerType_LuckyHit, # 会心一击时增加会心伤害百分比 50
|
| | | 4052:ChConfig.TriggerType_Buff_SuckBloodPer, # 攻击 百分比吸血
|
| | | 4053:ChConfig.TriggerType_AddLayer, # BUFF层级增加时 52
|
| | | 4054:ChConfig.TriggerType_AttackAddSkillPer, # 所有攻击伤害(SkillPer)增加,含普攻,计算时 5
|
| | | 4055:ChConfig.TriggerType_StormAttackReduceCD, # 类剑刃风暴攻击后触发效果
|
| | | 4056:ChConfig.TriggerType_PassiveBuffValue, ## 被动buff值计算中二次获取被动值 54
|
| | | 4057:ChConfig.TriggerType_AttackKillHappen, ## 对被动技能斩杀的概率增强 55
|
| | | 4058:ChConfig.TriggerType_AddBuffOver, # 添加buff之后触发技能 56
|
| | | 4059:ChConfig.TriggerType_StormAttackOneByOne, # 类剑刃风暴攻击1对1触发技能 57
|
| | | 4060:ChConfig.TriggerType_StormAttackOver, # 类剑刃风暴攻击后触发技能 57
|
| | | }
|
| | | return tdict.get(effectID, -1)
|
| | | #===========================================================================
|
| | |
| | | 4513:ChConfig.TriggerType_AttackAddFinalValue, #攻击增加输出伤害11
|
| | | 4515:ChConfig.TriggerType_AddIceAtkPer, # BUFF类:攻击附加真实伤害百分比
|
| | | 4516:ChConfig.TriggerType_ChangeHurtToHP, # BUFF类:buff中把受到伤害的xx%转化为生命值
|
| | | 4517:ChConfig.TriggerType_DebuffOff, # BUFF类: 抵消debuff
|
| | | 4518:ChConfig.TriggerType_ForbidenCure, # BUFF类: 禁止治疗 53
|
| | | 4519:ChConfig.TriggerType_WillDead, # BUFF类: 进入濒死状态 25
|
| | | 4520:ChConfig.TriggerType_AddLayer, # BUFF类: 目标BUFF层级增加时 52
|
| | | 803:ChConfig.TriggerType_BloodShield, # 血盾
|
| | | 806:ChConfig.TriggerType_BloodShield, # 血盾
|
| | | 808:ChConfig.TriggerType_BloodShield, # 血盾
|
| | |
| | | # #===========================================================================
|
| | | # OnPassiveSkillTrigger(attacker, target, ChConfig.TriggerType_AttackOver, tick)
|
| | |
|
| | | # 判断PK关系是否可攻击 Def_BattleRelationType_CommNoBoss也可攻击 只是攻击无效果
|
| | | def CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | if skillBattleType in [ChConfig.Def_BattleRelationType_Comm, ChConfig.Def_BattleRelationType_CommNoBoss]:
|
| | | return True
|
| | | |
| | | #if battleRelationType in [ChConfig.Def_BattleRelationType_Comm, ChConfig.Def_BattleRelationType_CommNoBoss]:
|
| | | #===============================================================================
|
| | | # # 判断PK关系是否可攻击 Def_BattleRelationType_CommNoBoss也可攻击 只是攻击无效果
|
| | | # def CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | # if skillBattleType in [ChConfig.Def_BattleRelationType_Comm, ChConfig.Def_BattleRelationType_CommNoBoss]:
|
| | | # return True
|
| | | |
| | | if skillBattleType != battleRelationType:
|
| | | # PK模式的判定
|
| | | return False
|
| | | return True
|
| | | # |
| | | # #if battleRelationType in [ChConfig.Def_BattleRelationType_Comm, ChConfig.Def_BattleRelationType_CommNoBoss]:
|
| | | # # return True
|
| | | # |
| | | # if skillBattleType != battleRelationType:
|
| | | # # PK模式的判定
|
| | | # return False
|
| | | # return True
|
| | | #===============================================================================
|
| | |
|
| | | # 查找被动技能时的对象
|
| | | def GetPassiveDefender(attacker, defender):
|
| | |
| | | if not attacker:
|
| | | return False
|
| | |
|
| | | stopPassiveSkill = False # 被动技能不能再触发被动技能,但可以触发天赋技能
|
| | | if connSkill:
|
| | | if not connSkill.GetFuncType():
|
| | | # 非功能类技能,避免死循环
|
| | | return False
|
| | | if SkillCommon.isPassiveSkill(connSkill):
|
| | | #GameWorld.DebugLog("被动技能不能再次触发被动技能")
|
| | | return False
|
| | | #return False
|
| | | stopPassiveSkill = True
|
| | |
|
| | | if SkillCommon.GetUsingPassiveSkill(attacker) and triggerType != ChConfig.TriggerType_BuffState:
|
| | | # 防范被动技能触发的 非被动技能
|
| | | GameWorld.DebugLog("被动技能不能再次触发被动技能---%s"%triggerType)
|
| | | return
|
| | | #GameWorld.DebugLog("被动技能释放中不能再次触发被动技能---%s"%triggerType)
|
| | | #return |
| | | stopPassiveSkill = True
|
| | |
|
| | | passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)
|
| | | if not passiveEff:
|
| | |
| | |
|
| | | defender = GetPassiveDefender(attacker, defender)
|
| | |
|
| | | result = False
|
| | | # 当前战斗关系 pvp pve
|
| | | battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)
|
| | | #GameWorld.DebugLog("OnPassiveSkillTrigger-----------%s-%s"%(skills, battleRelationType))
|
| | | for skillTypeID, effectID in skills:
|
| | | if connSkillID == skillTypeID:
|
| | | continue
|
| | | curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)
|
| | | if not curSkill:
|
| | | continue
|
| | |
|
| | | if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
|
| | | # 只有天赋才可以再次被触发
|
| | | continue
|
| | |
|
| | | effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)
|
| | |
| | |
|
| | | if SkillCommon.RefreshSkillRemainTime(curSkill, tick):
|
| | | continue
|
| | | result = True # 代表有效触发,但不关系触发结果
|
| | |
|
| | | skillBattleType = SkillCommon.GetSkillBattleType(curSkill)
|
| | | if not CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | if not AttackCommon.CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | # PK模式的判定
|
| | | continue
|
| | |
|
| | |
| | | skillIDSet.add(skillTypeID)
|
| | | SkillCommon.SetUsingPassiveSkill(attacker, 0)
|
| | |
|
| | | return True
|
| | | # 代表有效触发,但不关系触发结果, 外层根据需求使用,如减少循环判断 |
| | | return result
|
| | |
|
| | |
|
| | | #ntSummon:(3)普通召唤兽,可继承主人基础属性如攻击
|
| | |
| | | if not attacker:
|
| | | return 0
|
| | |
|
| | | stopPassiveSkill = False # 被动技能不能再触发被动技能,但可以触发天赋技能
|
| | | if connSkill and SkillCommon.isPassiveSkill(connSkill):
|
| | | #GameWorld.DebugLog("被动技能不能再次触发被动技能")
|
| | | return 0
|
| | | #return 0
|
| | | stopPassiveSkill = True
|
| | | |
| | | passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)
|
| | | if not passiveEff:
|
| | | return 0
|
| | |
| | | curValue = 0
|
| | |
|
| | | for skillTypeID, effectID in skills:
|
| | | if connSkillID == skillTypeID:
|
| | | continue
|
| | | curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)
|
| | | if not curSkill:
|
| | | continue
|
| | | if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
|
| | | # 只有天赋才可以再次被触发
|
| | | continue |
| | | |
| | | if curSkill.GetCoolDownTime() and SkillCommon.RefreshSkillRemainTime(curSkill, tick):
|
| | | #有配置CD的才判断
|
| | | continue
|
| | |
| | | if not effect:
|
| | | continue
|
| | | skillBattleType = SkillCommon.GetSkillBattleType(curSkill)
|
| | | if not CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | if not AttackCommon.CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | continue
|
| | |
|
| | | pyName = "PassiveSkill_%s" % effectID
|
| | |
| | | #tick = GameWorld.GetGameWorld().GetTick()
|
| | | skillList = []
|
| | | for skillTypeID, effectID in skills:
|
| | | if connSkillID == skillTypeID:
|
| | | continue
|
| | | curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)
|
| | | #if SkillCommon.RefreshSkillRemainTime(curSkill, tick):
|
| | | # continue
|
| | |
| | | if not effect:
|
| | | continue
|
| | | skillBattleType = SkillCommon.GetSkillBattleType(curSkill)
|
| | | if not CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | if not AttackCommon.CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | continue
|
| | |
|
| | | pyName = "PassiveSkill_%s" % effectID
|
| | |
| | | battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)
|
| | |
|
| | | for skillTypeID, effectID in skills:
|
| | | if connSkillID == skillTypeID:
|
| | | continue
|
| | | curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)
|
| | | if not curSkill:
|
| | | continue
|
| | |
| | | if SkillCommon.RefreshSkillRemainTime(curSkill, tick):
|
| | | continue
|
| | | skillBattleType = SkillCommon.GetSkillBattleType(curSkill)
|
| | | if not CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | if not AttackCommon.CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | # PK模式的判定
|
| | | continue
|
| | |
|
| | |
| | | return False
|
| | |
|
| | |
|
| | | # 被动技能触发但无需释放,如抵消debuff,只需走CD即可
|
| | | def OnPassiveBuffHappen(attacker, defender, tagSkill, triggerType, tick):
|
| | | attacker = FindRealAttacker(attacker)
|
| | | if not attacker:
|
| | | return False
|
| | |
|
| | | passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)
|
| | | if not passiveEff:
|
| | | return False
|
| | | buffDict = passiveEff.GetBuffsByTriggerType(triggerType)
|
| | | if not buffDict:
|
| | | return False
|
| | | |
| | | # 当前战斗关系 pvp pve
|
| | | battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)
|
| | | skillBattleType = SkillCommon.GetSkillBattleType(tagSkill)
|
| | | if not AttackCommon.CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | return
|
| | |
|
| | | tagSkillID = tagSkill.GetSkillID() if tagSkill else 0
|
| | | |
| | | for skillID, effectList in buffDict.items():
|
| | | if tagSkillID == skillID:
|
| | | continue
|
| | | for passiveEffect in effectList:
|
| | | # 被动触发的技能
|
| | | pyName = "PassiveBuff_%s"%passiveEffect.GetEffectID()
|
| | | |
| | | callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))
|
| | | if not callFunc:
|
| | | continue
|
| | | |
| | | if not callFunc(attacker, defender, passiveEffect, tagSkill):
|
| | | continue
|
| | | |
| | | callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "DoLogic"))
|
| | | if callFunc:
|
| | | callFunc(attacker, defender, passiveEffect, tagSkill, skillID)
|
| | |
|
| | | return True
|
| | | |
| | | return False
|
| | | #------------------------Buff类 被动触发, 并非全是被动技能-----------------------------------------------
|
| | |
|
| | | #buff类触发释放技能,无CD验证
|
| | |
| | | attacker = FindRealAttacker(attacker)
|
| | | if not attacker:
|
| | | return
|
| | |
|
| | | stopPassiveSkill = False # 被动技能不能再触发被动技能,但可以触发天赋技能
|
| | | if useSkill:
|
| | | if not useSkill.GetFuncType():
|
| | | # 非功能类技能,避免死循环
|
| | | return
|
| | | if SkillCommon.isPassiveSkill(useSkill):
|
| | | #GameWorld.DebugLog("被动技能不能再次触发被动技能")
|
| | | return
|
| | | #return
|
| | | stopPassiveSkill = True
|
| | |
|
| | | if SkillCommon.GetUsingPassiveSkill(attacker):
|
| | | # 防范被动技能触发的 非被动技能
|
| | | GameWorld.DebugLog("被动技能不能再次触发被动技能---%s"%triggerType)
|
| | | return
|
| | | |
| | | #GameWorld.DebugLog("被动技能不能再次触发被动技能---%s"%triggerType)
|
| | | #return
|
| | | stopPassiveSkill = True
|
| | |
|
| | | passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)
|
| | | if not passiveEff:
|
| | |
| | |
|
| | | # 当前战斗关系 pvp pve
|
| | | battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)
|
| | | useSkillID = useSkill.GetSkillID() if useSkill else 0
|
| | |
|
| | | for skillID, effectList in buffDict.items():
|
| | | if skillID == useSkillID:
|
| | | continue
|
| | | for passiveEffect in effectList:
|
| | | # 被动触发的技能
|
| | | pyName = "PassiveBuff_%s"%passiveEffect.GetEffectID()
|
| | | |
| | | curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not curSkill:
|
| | | continue
|
| | | if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
|
| | | # 只有天赋才可以再次被触发
|
| | | continue |
| | | callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))
|
| | | if not callFunc:
|
| | | continue
|
| | |
|
| | | if not callFunc(attacker, defender, passiveEffect, skillID):
|
| | | if not callFunc(attacker, defender, passiveEffect, skillID, useSkill=useSkill):
|
| | | continue
|
| | |
|
| | | callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "GetSkillData"))
|
| | |
| | | continue
|
| | |
|
| | | skillBattleType = SkillCommon.GetSkillBattleType(skillData)
|
| | | if not CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | if not AttackCommon.CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | # PK模式的判定
|
| | | continue
|
| | |
|
| | |
| | | attacker = FindRealAttacker(attacker)
|
| | | if not attacker:
|
| | | return 0
|
| | | |
| | | stopPassiveSkill = False # 被动技能不能再触发被动技能,但可以触发天赋技能
|
| | | if useSkill and SkillCommon.isPassiveSkill(useSkill):
|
| | | #GameWorld.DebugLog("被动技能不能再次触发被动技能")
|
| | | return 0
|
| | | #return 0
|
| | | stopPassiveSkill = True
|
| | |
|
| | |
|
| | | passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)
|
| | | if not passiveEff:
|
| | |
| | | # 当前战斗关系 pvp pve
|
| | | battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)
|
| | | skillBattleType = SkillCommon.GetSkillBattleType(useSkill)
|
| | | if not CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | if not AttackCommon.CheckBattleRelationType(skillBattleType, battleRelationType):
|
| | | return 0
|
| | |
|
| | | useSkillID = useSkill.GetSkillID() if useSkill else 0
|
| | | #tick = GameWorld.GetGameWorld().GetTick()
|
| | | curValue = 0
|
| | |
|
| | | for skillID, effectList in buffDict.items():
|
| | | if skillID == useSkillID:
|
| | | continue
|
| | | curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not curSkill:
|
| | | continue
|
| | | |
| | | for passiveEffect in effectList:
|
| | | if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
|
| | | # 只有天赋才可以再次被触发
|
| | | continue |
| | | |
| | | # 被动触发的技能
|
| | | pyName = "PassiveBuff_%s"%passiveEffect.GetEffectID()
|
| | |
|
| | |
| | | if not callFunc:
|
| | | continue
|
| | |
|
| | | if not callFunc:
|
| | | continue
|
| | | |
| | | # 条件不满足
|
| | | if not callFunc(attacker, defender, passiveEffect, skillID):
|
| | | if not callFunc(attacker, defender, passiveEffect, skillID, useSkill=useSkill):
|
| | | continue
|
| | |
|
| | | callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "GetValue"))
|
| | | if callFunc is None:
|
| | | continue
|
| | |
|
| | | # 如被动技能:千幻冥炎真实伤害从2变4倍
|
| | | curValue += GetPassiveSkillValueByTriggerType(attacker, defender, curSkill, ChConfig.TriggerType_PassiveBuffValue)
|
| | | curValue += callFunc(attacker, defender, passiveEffect)
|
| | |
|
| | | return curValue
|
| | |
| | | if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return False
|
| | |
|
| | | if not curSkill:
|
| | | # 玩家普通也是技能,正常是不会走到这边
|
| | | return False
|
| | | |
| | | useSkillData = attacker.GetUseSkill()
|
| | | if useSkillData and curSkill.GetSkillTypeID() != useSkillData.GetSkillTypeID():
|
| | | # 默认群攻附加触发buff的对象与攻击对象一致
|