From 16abecd38712b22026a85e1119f2f4c38d89a00f Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 17 一月 2020 14:45:18 +0800 Subject: [PATCH] 8364 【恺英】【后端】快速完成秘境探索增加完成提示 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py | 154 ++++++++++++++++++++++++++++++++------------------ 1 files changed, 98 insertions(+), 56 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py index af042e5..cf93871 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py @@ -25,6 +25,7 @@ import OperControlManager import GameObj import CrossPlayerData +import AttackCommon #--------------------------------------------------------------------- #--------------------------------------------------------------------- @@ -51,6 +52,8 @@ and SkillCommon.GetSkillBattleType(curSkill) == ChConfig.Def_BattleRelationType_CommNoBoss: # 释放后 对指定BOSS无效的技能 return True + + buffOwner = AttackCommon.ElfChangeAttacker(buffOwner) # Elf灵为替身攻击,要取玩家的属性 result = AddBuffNoRefreshState(curObj, buffType, curSkill, tick, addBuffValueList, buffOwner, addForce) @@ -79,23 +82,7 @@ return result -#=============================================================================== -# # CanRepeatTime字段个位数 -# ( -# Def_BuffTime_Reset, # 0 重置时间 -# Def_BuffTime_Add, # 1 增加时间 -# Def_BuffTime_Keep, # 2 时间不变 -# Def_BuffTime_Keep_AddValue, # 3 时间不变只增加值,默认为替换更强值 -# ) = range(4) -# -# # CanRepeatTime字段十位数 -# ( -# Def_Buff_Replace_Better, # 相同typeid取最高,如果新的是低级的则不处理 -# Def_Buff_Replace_New, # 相同typeid替换最新,即使是低级的 -# Def_Buff_Coexist, # 不同的释放者可共存 -# ) = range(3) -#=============================================================================== - +# 快捷搜索 CanRepeatTime字段 # buff时间处理类型,个位数 def GetBuffRepeatTimeType(curSkill): return curSkill.GetCanRepeatTime()%10 @@ -104,6 +91,10 @@ def GetBuffReplaceType(curSkill): return curSkill.GetCanRepeatTime()/10 +# buff根据释放者不同判断是否共存buff,百位数 Def_Buff_NoCoexist +def GetBuffCoexistType(curSkill): + return curSkill.GetCanRepeatTime()/10%10 + def GetBuffMaxLayer(curSkill): layerMaxCnt = 0 hasEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_LayerCnt) @@ -111,6 +102,19 @@ layerMaxCnt = hasEffect.GetEffectValue(0) # 能叠加的最大上限 return layerMaxCnt + +# 改变BUFF持续时间 +def ChangeLastTime(attacker, curSkill): + buffTime = curSkill.GetLastTime() + if not attacker: + return buffTime + if curSkill.GetEffect(0).GetEffectID() == ChConfig.Def_Skill_Effect_Burn: + # 灼烧的时间特殊处理 + buffTime = buffTime*(ChConfig.Def_MaxRateValue + PlayerControl.GetBurnTimePer(attacker))/ChConfig.Def_MaxRateValue + + buffTime += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, None, curSkill, ChConfig.TriggerType_BuffTime) + return buffTime + #--------------------------------------------------------------------- ## 增加BUFF 减少BUFF(参数 -> 当前对象,buff类型,当前技能,当前时间,Buff总值->用于持续类技能 , Buff拥有者) @@ -122,7 +126,7 @@ if not SkillCommon.IsBuff(curSkill): GameWorld.ErrLog("%s 不能加这个buff, 因为它是攻击技能! %s-->TypeID = %d"%(curObj.GetName(), curSkill.GetSkillName(), curSkill.GetSkillType())) return False - + buffTuple = SkillCommon.GetBuffManagerByBuffType( curObj, buffType ) #通过类型获取目标的buff管理器为空,则跳出 if buffTuple == (): @@ -146,11 +150,13 @@ #技能类型ID curSkillTypeID = curSkill.GetSkillTypeID() #当前技能持续时间 - curSkillLastTime = curSkill.GetLastTime() + curSkillLastTime = ChangeLastTime(buffOwner, curSkill) #当前技能等级 curSkillLV = curSkill.GetSkillLV() #替换模式 buffReplaceType = GetBuffReplaceType(curSkill) + #共存模式 + buffCoexistType = GetBuffCoexistType(curSkill) #时间处理类型 buffRepeatTimeType = GetBuffRepeatTimeType(curSkill) #用于BUFF满的时候处理刷新逻辑 @@ -179,9 +185,9 @@ if buffSkill.GetSkillTypeID() != curSkillTypeID: continue - if buffReplaceType == ChConfig.Def_Buff_Coexist and buffOwner: + if buffCoexistType == ChConfig.Def_Buff_Coexist and buffOwner: #可同时存在的buff,判断释放者是否不一样 - if buffSkill.GetOwnerID() != buffOwner.GetID() or buffSkill.GetOwnerType() != buffOwner.GetGameObjType(): + if curBuff.GetOwnerID() != buffOwner.GetID() or curBuff.GetOwnerType() != buffOwner.GetGameObjType(): continue #--------------技能类型ID相同 @@ -193,8 +199,8 @@ if buffReplaceType == ChConfig.Def_Buff_Replace_Better: if buffSkillLV > curSkillLV: - # 只取最好的 - continue + # 只取最好的, 不可加直接退出 + return False resultTime = -1 #不改变时间的情况 if buffRepeatTimeType == ChConfig.Def_BuffTime_Reset: @@ -212,31 +218,35 @@ if buffSkillLV == curSkillLV: changeLayer = False - if layerMaxCnt: - curLayerCnt = curBuff.GetLayer() - if curLayerCnt < layerMaxCnt: - if layerCalc == ChConfig.Def_BuffLayer_Add: - curBuff.SetLayer(curLayerCnt + 1) - #BUFF层级变化触发被动 - if buffOwner: - curObj.SetDict(ChConfig.Def_PlayerKey_AddBuffLayer, curBuff.GetLayer()) - PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick) - PassiveBuffEffMng.OnPassiveBuffTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick) - curObj.SetDict(ChConfig.Def_PlayerKey_AddBuffLayer, 0) - else: - curBuff.SetLayer(layerMaxCnt) - changeLayer = True - __BuffCanRemain(buffState, curBuff, i, resultTime, plusValueList, buffOwner) - # 此处考虑下plusValue变强是否刷属性 - #DoAddBuffOver(curObj, curSkill, addBuff, tick) + if layerMaxCnt and curBuff.GetLayer() < layerMaxCnt: + if layerCalc == ChConfig.Def_BuffLayer_Add: + curBuff.SetLayer(curBuff.GetLayer() + 1) + #BUFF层级变化触发被动 + if buffOwner: + curObj.SetDict(ChConfig.Def_PlayerKey_AddBuffLayer, curBuff.GetLayer()) + PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick) + PassiveBuffEffMng.OnPassiveBuffTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick) + curObj.SetDict(ChConfig.Def_PlayerKey_AddBuffLayer, 0) + else: + curBuff.SetLayer(layerMaxCnt) + changeLayer = True + + # Def_Buff_Replace_New和Def_Buff_Recharge 均可走到此逻辑 + __BuffCanRemain(curObj, buffState, curBuff, i, resultTime, plusValueList, buffOwner) + return changeLayer else: + if buffReplaceType == ChConfig.Def_Buff_Recharge: + # 充能型 + __BuffCanRemain(curObj, buffState, curBuff, i, resultTime, plusValueList, buffOwner) + return + processInterval = curBuff.GetProcessInterval() ownerID, ownerType = curBuff.GetOwnerID(), curBuff.GetOwnerType() buffState.DeleteBuffByIndex(i) SkillShell.ClearBuffEffectBySkillID(curObj, buffSkillID, ownerID, ownerType) return __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh, - tick, processInterval, layerMaxCnt, layerCalc) + tick, curSkillLastTime, processInterval, layerMaxCnt, layerCalc) #已经找到同一类型的技能,立即退出不然会导致错乱 return False @@ -254,7 +264,7 @@ isDelRefresh = True return __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh, - tick, 0, layerMaxCnt, layerCalc) + tick, curSkillLastTime, 0, layerMaxCnt, layerCalc) ## 是否血包/蓝包buff @@ -314,15 +324,15 @@ # @param isDelRefresh 外界删除BUFF是否刷新 # @param tick 时间戳 # @return 是否刷新玩家属性 -def __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh, tick, - updProcessInterval, layerMaxCnt, layerCalc): +def __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh, tick, + curSkillLastTime, updProcessInterval, layerMaxCnt, layerCalc): skillID = curSkill.GetSkillID() #是否需要通知客户端 isNotify = True if curSkill.GetClientEffectType() != 0 else False # 增加第四个参数是否立即广播 addBuff = buffState.AddBuff(skillID, tick, isNotify, False) - buffIndex = buffState.GetBuffCount() # buff在管理器中的索引 + if updProcessInterval > 0: # 继承上一个buff的循环记录 addBuff.SetProcessInterval(updProcessInterval) @@ -337,11 +347,7 @@ else: addBuff.SetLayer(layerMaxCnt) - if buffOwner: - addTime = PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(buffOwner, None, curSkill, ChConfig.TriggerType_BuffTime) - if addTime: - #有改变持续时间的技能 - addBuff.SetRemainTime(curSkill.GetLastTime() + addTime) + addBuff.SetRemainTime(curSkillLastTime) # 同步主从技能时间 SyncMasterBuffTime(curObj, addBuff, curSkill) @@ -374,7 +380,7 @@ if triggerType == -1: continue passiveEff = PassiveBuffEffMng.GetPassiveEffManager().InitObjPassiveEff(curObj) - passiveEff.AddBuffInfoByEffect(curEffect, skillID) + passiveEff.AddBuffInfoByEffect(curEffect, skillID, onwerID, onwerType) #添加BUFF后的特殊处理 @@ -404,7 +410,11 @@ #触发被动技能 if buffOwner: PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddBuffOver, tick) - + # 此处不能传技能curSkill 屏蔽被动触发被动限制 + # 暂且特殊处理控制类buff才触发 + if SkillCommon.GetBuffType(curSkill) == IPY_GameWorld.bfActionBuff: + PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(curObj, buffOwner, curSkill, ChConfig.TriggerType_AddBuffOver, False) + #是否是持续性技能 isLstSkill = curSkill.GetSkillType() in ChConfig.Def_LstBuff_List @@ -426,7 +436,7 @@ if not callFunc: continue - callFunc(curObj, addBuff, curEffect, tick) + callFunc(curObj, addBuff, curEffect, tick, buffOwner) return @@ -534,14 +544,15 @@ # @param tick 当前时间 # @return None # @remarks 函数详细说明. -def __BuffCanRemain(buffState, curBuff, buffIndex, resultTime, plusValueList, buffOwner): +def __BuffCanRemain(curObj, buffState, curBuff, buffIndex, resultTime, plusValueList, buffOwner): if resultTime != -1: curBuff.SetRemainTime(resultTime) #重置buff总值 __SetBuffValue(curBuff , plusValueList , buffOwner) buffState.Sync_RefreshBuff(buffIndex, curBuff.GetRemainTime()) - + + DoAddBuffOver(curObj, curBuff.GetSkill(), curBuff, buffOwner, GameWorld.GetGameWorld().GetTick()) return #--------------------------------------------------------------------- @@ -564,6 +575,8 @@ return curBuff, i return None, 0 + + #--------------------------------------------------------------------- ## 刷新BUFF的时间 # @param curBuff 当前BUFF @@ -629,6 +642,9 @@ index = 0 isPlayerTJG = (curObj.GetGameObjType() == IPY_GameWorld.gotPlayer and PlayerTJG.GetIsTJG(curObj)) + + skillIDListInDelBuff = [] # buff消失中需要处理添加buff,外层处理避免错乱 + while index < buffState.GetBuffCount(): curBuff = buffState.GetBuff( index ) if not curBuff: @@ -677,11 +693,34 @@ buffState.DeleteBuffByIndex( index ) SkillShell.ClearBuffEffectBySkillID(curObj, curSkill.GetSkillID(), ownerID, ownerType) + addSkillID = curObj.GetDictByKey(ChConfig.Def_PlayerKey_SkillInDelBuff) + if addSkillID: + skillInfo = [addSkillID, ownerID, ownerType] + if skillInfo not in skillIDListInDelBuff: + skillIDListInDelBuff.append(skillInfo) + curObj.SetDict(ChConfig.Def_PlayerKey_SkillInDelBuff, 0) + + OnSkillAfterBuffDisappear(curObj, skillIDListInDelBuff, tick) + #执行DoBuffDisApper中,标记的玩家处理要求 __DoBuffDisApperByKey( curObj , tick ) return isRefresh, delResult + +# DoBuffDisApper不能做Buff添加和删除逻辑!!!!!不然指针会错乱, 故在外层处理 +def OnSkillAfterBuffDisappear(curObj, skillIDListInDelBuff, tick): + posX, posY = curObj.GetPosX(), curObj.GetPosY() + for skillInfo in skillIDListInDelBuff: + attacker = GameWorld.GetObj(skillInfo[1], skillInfo[2]) + if not attacker: + attacker = curObj + skillData = GameWorld.GetGameData().GetSkillBySkillID(skillInfo[0]) + if not skillData: + continue + + SkillShell.Trigger_UseSkill(attacker, curObj, skillData, tick, posX, posY) + return #--------------------------------------------------------------------- ## 执行buff消失触发逻辑 @@ -963,7 +1002,10 @@ def PYSync_RefreshBuff(gameObj, curBuff, buffType, notifyAll=True, owner = None): sendPack = ChNetSendPack.tagObjAddBuff() - + if not curBuff: + return + if not curBuff.GetSkill(): + return sendPack.ObjType = gameObj.GetGameObjType() sendPack.ObjID = gameObj.GetID(); sendPack.SkillID = curBuff.GetSkill().GetSkillID(); -- Gitblit v1.8.0