| | |
| | | import GameBuffs
|
| | | import ChConfig
|
| | | import FBLogic
|
| | | import ReadChConfig
|
| | | import SkillShell
|
| | | import PassiveBuffEffMng
|
| | | import ChNetSendPack
|
| | |
| | | import OperControlManager
|
| | | import GameObj
|
| | | import CrossPlayerData
|
| | | import AttackCommon
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | 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)
|
| | |
|
| | |
| | | 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
|
| | |
| | | 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)
|
| | |
| | | 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拥有者)
|
| | |
| | | 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 == ():
|
| | |
| | | #技能类型ID
|
| | | curSkillTypeID = curSkill.GetSkillTypeID()
|
| | | #当前技能持续时间
|
| | | curSkillLastTime = curSkill.GetLastTime()
|
| | | curSkillLastTime = ChangeLastTime(buffOwner, curSkill)
|
| | | #当前技能等级
|
| | | curSkillLV = curSkill.GetSkillLV()
|
| | | #替换模式
|
| | | buffReplaceType = GetBuffReplaceType(curSkill)
|
| | | #共存模式 |
| | | buffCoexistType = GetBuffCoexistType(curSkill)
|
| | | #时间处理类型
|
| | | buffRepeatTimeType = GetBuffRepeatTimeType(curSkill)
|
| | | #用于BUFF满的时候处理刷新逻辑
|
| | |
| | | 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相同
|
| | |
| | |
|
| | | if buffReplaceType == ChConfig.Def_Buff_Replace_Better:
|
| | | if buffSkillLV > curSkillLV:
|
| | | # 只取最好的
|
| | | continue
|
| | | # 只取最好的, 不可加直接退出
|
| | | return False
|
| | |
|
| | | resultTime = -1 #不改变时间的情况
|
| | | if buffRepeatTimeType == ChConfig.Def_BuffTime_Reset:
|
| | |
| | |
|
| | | 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("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
|
| | | __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
|
| | |
| | | isDelRefresh = True
|
| | |
|
| | | return __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh,
|
| | | tick, 0, layerMaxCnt, layerCalc)
|
| | | tick, curSkillLastTime, 0, layerMaxCnt, layerCalc)
|
| | |
|
| | |
|
| | | ## 是否血包/蓝包buff
|
| | |
| | | # @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)
|
| | |
| | | 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)
|
| | |
| | | if triggerType == -1:
|
| | | continue
|
| | | passiveEff = PassiveBuffEffMng.GetPassiveEffManager().InitObjPassiveEff(curObj)
|
| | | passiveEff.AddBuffInfoByEffect(curEffect, skillID)
|
| | | passiveEff.AddBuffInfoByEffect(curEffect, skillID, onwerID, onwerType)
|
| | |
|
| | |
|
| | | #添加BUFF后的特殊处理
|
| | |
| | | #触发被动技能
|
| | | 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
|
| | |
|
| | |
| | | if not callFunc:
|
| | | continue
|
| | |
|
| | | callFunc(curObj, addBuff, curEffect, tick)
|
| | | callFunc(curObj, addBuff, curEffect, tick, buffOwner)
|
| | |
|
| | | return
|
| | |
|
| | |
| | | # @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
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | return curBuff, i
|
| | |
|
| | | return None, 0
|
| | |
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | ## 刷新BUFF的时间
|
| | | # @param curBuff 当前BUFF
|
| | |
| | |
|
| | | 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:
|
| | |
| | | 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消失触发逻辑
|
| | |
| | |
|
| | | 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();
|