From e17fcba64e93fceb1459b12cbe70663039d40314 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 11 一月 2024 18:22:45 +0800 Subject: [PATCH] 10019 【砍树】回合战斗(回合战斗buff持续时间处理及持续性buff定时触发时机处理支持;增加回合战斗死亡及复活支持;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py | 127 +++++++++++++++++++++++++++-------------- 1 files changed, 83 insertions(+), 44 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py index 6bad0d9..58321d4 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py @@ -2423,53 +2423,79 @@ if not buffStateCount: return - turnNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightNum) # 回合编号,大于0同时也代表回合制中 - - #buff持续效果 - for i in range(0, buffStateCount): + #buff持续效果,回合下可能删除buff,倒序遍历 + for i in range(0, buffStateCount)[::-1]: curBuff = buffState.GetBuff(i) + ProcessSinglePersistBuff(curObj, buffState, curBuff, tick) - if not curBuff: - #在以下处理过程中, 对方有可能死亡, 如果死亡, 会清空buff, 导致这里取得None - #所以一定要continue - continue - - curBuffSkill = curBuff.GetSkill() - - if not __BuffCanProcess(curObj, curBuffSkill): - continue - - processBuffTick = GetProcessBuffTick(curBuffSkill, curObj) - - #---验证触发间隔TICK--- - if turnNum > 0: - GameWorld.DebugLog(" buffProcess: objID=%s,skillID=%s,turnNum=%s" % (curObj.GetID(), curBuffSkill.GetSkillID(), turnNum)) - else: - if tick - curBuff.GetProcessInterval() <= processBuffTick: - continue - curBuff.SetProcessInterval(tick) - - - #得到当前buff - for effIndex in range(0, curBuffSkill.GetEffectCount()): - #得到当前效果 - curEffect = curBuffSkill.GetEffect(effIndex) - curEffectID = curEffect.GetEffectID() - - if not curEffectID: - continue - - processStr = "BuffProcess_%d.%s"%(curEffectID, "ProcessBuff") - - callBuffProcessFunc = GameWorld.GetExecFunc(GameBuffs, processStr) - - if not callBuffProcessFunc: - continue - - callBuffProcessFunc(curObj, curBuff, curEffect, processBuffTick, tick) - #执行ProcessBuff中设定的玩家字典 __DoProcessBuff_PlayerKey(curObj, tick) + return + +def ProcessSinglePersistBuff(curObj, buffState, curBuff, tick, turnForce=False): + '''处理单个持续性buff,可能会删除buff,调用时如果是循环遍历,需注意遍历顺序,防止buff删除后索引错乱 + @param turnForce: 回合下强制立刻执行 + ''' + if not curBuff: + return + curBuffSkill = curBuff.GetSkill() + + if not __BuffCanProcess(curObj, curBuffSkill): + return + + processBuffTick = GetProcessBuffTick(curBuffSkill, curObj) + + isDel = False + remainTime = None + timeLine = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline) + #---验证触发间隔TICK--- + if timeLine > 0: + turnNum, actionNum = timeLine / 100, timeLine % 100 + if not turnForce and actionNum != 0: + # 持续型buff暂仅支持回合开始时处理 + return + remainTime = curBuff.GetRemainTime() - ChConfig.Def_PerTurnTick # 每处理一次固定算一回合 + if remainTime <= 0: + isDel = True + GameWorld.DebugLog(" 回合buffProcess: objID=%s,skillID=%s,remainTime=%s,turnNum=%s" % (curObj.GetID(), curBuffSkill.GetSkillID(), remainTime, turnNum)) + else: + if tick - curBuff.GetProcessInterval() <= processBuffTick: + return + curBuff.SetProcessInterval(tick) + + #得到当前buff + for effIndex in range(0, curBuffSkill.GetEffectCount()): + #得到当前效果 + curEffect = curBuffSkill.GetEffect(effIndex) + curEffectID = curEffect.GetEffectID() + + if not curEffectID: + continue + + processStr = "BuffProcess_%d.%s"%(curEffectID, "ProcessBuff") + + callBuffProcessFunc = GameWorld.GetExecFunc(GameBuffs, processStr) + + if not callBuffProcessFunc: + continue + + callBuffProcessFunc(curObj, curBuff, curEffect, processBuffTick, tick) + + # 剩余时间需效果处理后再设置 + if remainTime != None: + curBuff.SetRemainTime(remainTime) + + if not isDel: + return + + GameWorld.DebugLog(" buffProcess后删除buff: objID=%s,skillID=%s,turnNum=%s" % (curObj.GetID(), curBuffSkill.GetSkillID(), turnNum)) + skillID = curBuffSkill.GetSkillID() + skillTypeID = curBuffSkill.GetSkillTypeID() + ownerID, ownerType = curBuff.GetOwnerID(), curBuff.GetOwnerType() + BuffSkill.DoBuffDisApper(curObj, curBuff, tick) + buffState.DeleteBuffByTypeID(skillTypeID) + SkillShell.ClearBuffEffectBySkillID(curObj, skillID, ownerID, ownerType) + return #--------------------------------------------------------------------- ##执行ProcessBuff中设定的玩家字典 @@ -3410,10 +3436,23 @@ def CheeckTrigSkillandTag(attacker, exSkill, defender, tick): #再次验证附加技能是否对目标可用 if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer: + skillTag = GetSkillAffectTag(exSkill) #该技能是对自己使用的 防守者应该改为攻击者 - if GetSkillAffectTag(exSkill) in [ChConfig.Def_UseSkillTag_Self, + if skillTag in [ChConfig.Def_UseSkillTag_Self, ChConfig.Def_UseSkillTag_SelfAndFriend]: return True, attacker + + # 召唤兽对主人释放技能 + if skillTag == ChConfig.Def_UseSkillTag_SummonMaster: + if not NPCCommon.IsSummonNPC(attacker): + return False, None + curSummonOwner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, attacker) + if curSummonOwner == None: + curSummonOwner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotNPC, attacker) + if curSummonOwner == None: + return False, None + return True, curSummonOwner + return True, defender #该技能是对自己使用的 防守者应该改为攻击者 -- Gitblit v1.8.0