|  |  |  | 
|---|
|  |  |  | 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拥有者) | 
|---|
|  |  |  | 
|---|
|  |  |  | #技能类型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(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 | 
|---|
|  |  |  | 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(buffState, curBuff, i, resultTime, plusValueList, buffOwner) | 
|---|
|  |  |  | # 此处考虑下plusValue变强是否刷属性 | 
|---|
|  |  |  | #DoAddBuffOver(curObj, curSkill, addBuff, tick) | 
|---|
|  |  |  | return changeLayer | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | if buffReplaceType == ChConfig.Def_Buff_Recharge: | 
|---|
|  |  |  | # 充能型 | 
|---|
|  |  |  | __BuffCanRemain(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.OnPassiveBuffTrigger(curObj, buffOwner, None, ChConfig.TriggerType_AddBuffOver, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #是否是持续性技能 | 
|---|
|  |  |  | isLstSkill = curSkill.GetSkillType() in ChConfig.Def_LstBuff_List | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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消失触发逻辑 | 
|---|
|  |  |  | #  @param curObj 当前OBj | 
|---|