From 2c117dc6bd78581cf871a83bf522d4bce97b6fba Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期三, 08 五月 2019 17:12:25 +0800
Subject: [PATCH] 6457 宝藏副本视野设置

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py |  207 +++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 150 insertions(+), 57 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 c826690..88f9e7d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
@@ -18,13 +18,13 @@
 import GameBuffs
 import ChConfig
 import FBLogic
-import ReadChConfig
 import SkillShell
 import PassiveBuffEffMng
 import ChNetSendPack
 import PlayerTJG
 import OperControlManager
 import GameObj
+import CrossPlayerData
 #---------------------------------------------------------------------
 
 #---------------------------------------------------------------------
@@ -35,18 +35,24 @@
 #  @param tick 当前时间
 #  @param value Buff总值->用于持续类技能
 #  @param buffOwner Buff拥有者
-#  @return None
-#  @remarks 函数详细说明.
-def DoAddBuff( curObj, buffType, curSkill, tick, addBuffValueList = [], buffOwner = None ):
+#  @param addForce 代表是否一定添加buff,避免互相反弹buff
+def DoAddBuff( curObj, buffType, curSkill, tick, addBuffValueList = [], buffOwner = None, addForce = False ):
     if curObj == None:
         # 避免配表错误导致报错
         return False
+
+    if GameWorld.GetMap().GetMapID() == ChConfig.Def_FBMapID_GatherSoul and curObj.GetGameObjType() == IPY_GameWorld.gotNPC:
+        if curSkill.GetSkillTypeID() != 23052:
+            #GameWorld.DebugLog('聚魂副本玩家不能对怪物上buff curSkill=%s,buffOwner=%s'%(curSkill.GetSkillTypeID(),buffOwner.GetID()))
+            return True
+        #GameWorld.DebugLog('聚魂副本对怪物上buff curSkill=%s,buffOwner=%s'%(curSkill.GetSkillTypeID(),buffOwner.GetID()))
+        
     if curObj.GetGameObjType() == IPY_GameWorld.gotNPC and curObj.GetIsBoss() not in ChConfig.Def_SkillAttack_NPCIsBoss \
     and SkillCommon.GetSkillBattleType(curSkill) == ChConfig.Def_BattleRelationType_CommNoBoss:
         # 释放后 对指定BOSS无效的技能
         return True
     
-    result = AddBuffNoRefreshState(curObj, buffType, curSkill, tick, addBuffValueList, buffOwner)
+    result = AddBuffNoRefreshState(curObj, buffType, curSkill, tick, addBuffValueList, buffOwner, addForce)
     
     if result is not 0:
         # 被抵消的buff 不处理
@@ -69,28 +75,11 @@
         #异常
         else:
             GameWorld.Log("添加buff刷新失败 curObjType = %s"%(curObjType))
-
-            
+    
     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
@@ -98,6 +87,10 @@
 # buff替换逻辑,十位数
 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
@@ -107,12 +100,26 @@
 
     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拥有者)
 #  buff的effect在添加和删除的时候处理,buff共存由buff本身决定而不是effect互斥,不再统一调用RefreshPlayerBuffOnAttrAddEffect
 #  plusValueList 改为buff value列表 第一个为增加数值,其他自定义
+#  addForce 表示是否一定会增加buff,避免互相反弹buff
 #  返回值 返回真刷属性,返回0 代表被抵消buff
-def AddBuffNoRefreshState( curObj, buffType, curSkill, tick, plusValueList=[] , buffOwner = None ):
+def AddBuffNoRefreshState( curObj, buffType, curSkill, tick, plusValueList=[], buffOwner = None, addForce = False):
     if not SkillCommon.IsBuff(curSkill):
         GameWorld.ErrLog("%s 不能加这个buff, 因为它是攻击技能! %s-->TypeID = %d"%(curObj.GetName(), curSkill.GetSkillName(), curSkill.GetSkillType()))
         return False
@@ -122,11 +129,16 @@
     if buffTuple == ():
         return False
     
-    if curSkill.GetSkillType() in ChConfig.Def_Debuff_List:
+    if not addForce and curSkill.GetSkillType() in ChConfig.Def_Debuff_List:
         if PassiveBuffEffMng.OnPassiveSkillHappen(curObj, buffOwner, curSkill, ChConfig.TriggerType_DebuffOff, tick):
             # 此处必须返回0 用于外层判断被抵消
             return 0
         
+        if PassiveBuffEffMng.OnPassiveBuffHappen(curObj, buffOwner, curSkill, ChConfig.TriggerType_DebuffOff, tick):
+            # 被动类buff抵消
+            # 此处必须返回0 用于外层判断被抵消
+            return 0
+
     buffState = buffTuple[0]
     maxBuffCount = buffTuple[1]
     buffCount = buffState.GetBuffCount()
@@ -135,15 +147,20 @@
     #技能类型ID
     curSkillTypeID = curSkill.GetSkillTypeID()
     #当前技能持续时间
-    curSkillLastTime = curSkill.GetLastTime()
+    curSkillLastTime = ChangeLastTime(buffOwner, curSkill)
     #当前技能等级
     curSkillLV = curSkill.GetSkillLV()
     #替换模式
     buffReplaceType = GetBuffReplaceType(curSkill)
+    #共存模式 
+    buffCoexistType = GetBuffCoexistType(curSkill)
     #时间处理类型
     buffRepeatTimeType = GetBuffRepeatTimeType(curSkill) 
     #用于BUFF满的时候处理刷新逻辑
     isDelRefresh = False
+    
+    # 向跨服发送数据
+    CrossPlayerData.SendMergeData_Buff(curObj, curSkillID, plusValueList)
     
     # buff层级
     layerMaxCnt = 0
@@ -152,6 +169,7 @@
     if hasEffect:
         layerMaxCnt = hasEffect.GetEffectValue(0)   # 能叠加的最大上限
         layerCalc = hasEffect.GetEffectValue(1)     # 增加层级还是减少层级 Def_BuffLayer_Add
+
     
     #1 检查是否有相同的BUFF,如果有相同的就刷新时间
     for i in range( 0, buffCount ):
@@ -164,9 +182,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相同
@@ -178,8 +196,8 @@
         
         if buffReplaceType == ChConfig.Def_Buff_Replace_Better:
             if buffSkillLV > curSkillLV:
-                # 只取最好的
-                continue
+                # 只取最好的, 不可加直接退出
+                return False
         
         resultTime = -1 #不改变时间的情况
         if buffRepeatTimeType == ChConfig.Def_BuffTime_Reset:
@@ -197,29 +215,36 @@
                 
         if buffSkillLV == curSkillLV:
             changeLayer = False
-            if layerMaxCnt:
-                curLayerCnt = curBuff.GetLayer()
-                if curLayerCnt < layerMaxCnt:
-                    if layerCalc == ChConfig.Def_BuffLayer_Add:
-                        curBuff.SetLayer(curLayerCnt + 1)
-                    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
@@ -237,7 +262,7 @@
         isDelRefresh = True
     
     return __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh, 
-                     tick, 0, layerMaxCnt, layerCalc)
+                     tick, curSkillLastTime, 0, layerMaxCnt, layerCalc)
 
 
 ## 是否血包/蓝包buff
@@ -297,14 +322,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.AddBuffEx(skillID, tick, isNotify)
-    buffIndex = buffState.GetBuffCount()    # buff在管理器中的索引
+    # 增加第四个参数是否立即广播
+    addBuff = buffState.AddBuff(skillID, tick, isNotify, False)
+    
     if updProcessInterval > 0:
         # 继承上一个buff的循环记录
         addBuff.SetProcessInterval(updProcessInterval)
@@ -319,11 +345,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)
@@ -360,10 +382,12 @@
 
         
     #添加BUFF后的特殊处理
-    DoAddBuffOver(curObj, curSkill, addBuff, tick)
+    DoAddBuffOver(curObj, curSkill, addBuff, buffOwner, tick)
         
     # 通知客户端
-    buffState.Sync_AddBuffEx()
+    #buffState.Sync_AddBuffEx()
+    if isNotify:
+        PYSync_RefreshBuff(curObj, addBuff, SkillCommon.GetBuffType(curSkill), notifyAll=False, owner = buffOwner)
 
     #检查是否属于刷新BUFF
     #===========================================================================
@@ -380,7 +404,11 @@
 # @param addBuff 玩家身上的BUFF实例
 # @param tick 时间戳
 # @return None 
-def DoAddBuffOver(curObj, curSkill, addBuff, tick):
+def DoAddBuffOver(curObj, curSkill, addBuff, buffOwner, tick):
+    #触发被动技能
+    if buffOwner:
+        PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddBuffOver, tick)
+    
     #是否是持续性技能
     isLstSkill = curSkill.GetSkillType() in ChConfig.Def_LstBuff_List
     
@@ -605,6 +633,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:
@@ -653,11 +684,28 @@
         buffState.DeleteBuffByIndex( index )
         SkillShell.ClearBuffEffectBySkillID(curObj, curSkill.GetSkillID(), ownerID, ownerType)
         
+        addSkillID = curObj.GetDictByKey(ChConfig.Def_PlayerKey_SkillInDelBuff) 
+        if addSkillID and addSkillID not in skillIDListInDelBuff:
+            skillIDListInDelBuff.append(addSkillID)
+        
+    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 skillID in skillIDListInDelBuff:
+        skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
+        if not skillData:
+            continue
+        
+        SkillShell.Trigger_UseSkill(curObj, curObj, skillData, tick, posX, posY)
+    return
 
 #---------------------------------------------------------------------
 ## 执行buff消失触发逻辑
@@ -708,6 +756,47 @@
     if passiveEff:
         passiveEff.DelBuffInfo(skillData)
     return
+
+
+#---------------------------------------------------------------------
+## 执行buff消失触发逻辑,不处理buff的功能逻辑,只处理需要的必须状态逻辑
+#  如不处理buff的 伤害,爆炸等,但必须处理恢复眩晕状态等
+def DoBuffDisApperEx( curObj, curBuff, tick ):
+    #这个函数里面不能做Buff添加和删除逻辑!!!!!不然指针会错乱
+    curSkill = curBuff.GetSkill()
+
+    skillData = GameWorld.GetGameData().GetSkillBySkillID(curSkill.GetSkillID())
+    
+    #是否是持续性技能
+    isLstSkill = curSkill.GetSkillType() in ChConfig.Def_LstBuff_List
+    
+    PassiveBuffEffMng.OnPassiveSkillTrigger(curObj, None, curSkill, ChConfig.TriggerType_BuffDisappear, tick)
+    
+    #buff消失的触发
+    for effectIndex in range( 0, curSkill.GetEffectCount() ):
+        curEffect = curSkill.GetEffect( effectIndex )
+        effectID = curEffect.GetEffectID()
+        
+        if not effectID:
+            continue
+        
+        if isLstSkill:
+            callFunc = GameWorld.GetExecFunc( GameBuffs, "BuffProcess_%d.%s"%( effectID, "OnBuffDisappearEx") )
+            if not callFunc:
+                callFunc = GameWorld.GetExecFunc( GameBuffs, "Buff_%d.%s"%( effectID, "OnBuffDisappearEx") )
+        else:        
+            callFunc = GameWorld.GetExecFunc( GameBuffs, "Buff_%d.%s"%( effectID, "OnBuffDisappearEx") )
+        
+        if not callFunc:
+            continue
+        
+        callFunc( curObj, curSkill, curBuff, curEffect, tick )
+            
+    passiveEff = PassiveBuffEffMng.GetPassiveEffManager().GetPassiveEff(curObj)
+    if passiveEff:
+        passiveEff.DelBuffInfo(skillData)
+    return
+
 #---------------------------------------------------------------------
 ## buff消失
 #  @param curObj 当前目标
@@ -896,9 +985,8 @@
     
     return DelBuffBySkillID(curObj, skillID, tick)
 
-def PYSync_RefreshBuff(gameObj, curBuff, buffType):
+def PYSync_RefreshBuff(gameObj, curBuff, buffType, notifyAll=True, owner = None):
     sendPack = ChNetSendPack.tagObjAddBuff()
-    sendPack
 
     sendPack.ObjType = gameObj.GetGameObjType()
     sendPack.ObjID = gameObj.GetID();
@@ -909,7 +997,12 @@
     sendPack.Value1 = curBuff.GetValue1();
     sendPack.Value2 = curBuff.GetValue2();
     sendPack.Layer = curBuff.GetLayer();
-    gameObj.NotifyAll(sendPack.GetBuffer(), sendPack.GetLength());
-    
+    if owner:
+        sendPack.OwnerID = owner.GetID()
+        sendPack.OwnerType = owner.GetGameObjType()
+    if notifyAll or gameObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
+        gameObj.NotifyAll(sendPack.GetBuffer(), sendPack.GetLength());
+    else:
+        PlayerControl.PyNotifyAll(gameObj, sendPack, notifySelf=True, notifyCnt=-1)
     
     
\ No newline at end of file

--
Gitblit v1.8.0