hxp
2020-01-17 16abecd38712b22026a85e1119f2f4c38d89a00f
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
@@ -18,7 +18,6 @@
import GameBuffs
import ChConfig
import FBLogic
import ReadChConfig
import SkillShell
import PassiveBuffEffMng
import ChNetSendPack
@@ -26,6 +25,7 @@
import OperControlManager
import GameObj
import CrossPlayerData
import AttackCommon
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -52,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)
    
@@ -80,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
@@ -105,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)
@@ -112,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拥有者)
@@ -123,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 == ():
@@ -147,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满的时候处理刷新逻辑
@@ -180,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相同
@@ -194,8 +199,8 @@
        
        if buffReplaceType == ChConfig.Def_Buff_Replace_Better:
            if buffSkillLV > curSkillLV:
                # 只取最好的
                continue
                # 只取最好的, 不可加直接退出
                return False
        
        resultTime = -1 #不改变时间的情况
        if buffRepeatTimeType == ChConfig.Def_BuffTime_Reset:
@@ -213,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("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
@@ -255,7 +264,7 @@
        isDelRefresh = True
    
    return __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh, 
                     tick, 0, layerMaxCnt, layerCalc)
                     tick, curSkillLastTime, 0, layerMaxCnt, layerCalc)
## 是否血包/蓝包buff
@@ -315,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)
@@ -338,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)
@@ -375,7 +380,7 @@
        if triggerType == -1:
            continue
        passiveEff = PassiveBuffEffMng.GetPassiveEffManager().InitObjPassiveEff(curObj)
        passiveEff.AddBuffInfoByEffect(curEffect, skillID)
        passiveEff.AddBuffInfoByEffect(curEffect, skillID, onwerID, onwerType)
        
    #添加BUFF后的特殊处理
@@ -405,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
    
@@ -427,7 +436,7 @@
        if not callFunc:
            continue
        
        callFunc(curObj, addBuff, curEffect, tick)
        callFunc(curObj, addBuff, curEffect, tick, buffOwner)
    
    return
@@ -535,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
#---------------------------------------------------------------------
@@ -565,6 +575,8 @@
        return curBuff, i
    
    return None, 0
#---------------------------------------------------------------------
## 刷新BUFF的时间
#  @param curBuff 当前BUFF
@@ -630,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:
@@ -678,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消失触发逻辑
@@ -964,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();