From 6fcf3513ccde191e067c8dfd8279cccedf95eb77 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期五, 17 五月 2019 19:22:25 +0800
Subject: [PATCH] 6603 【后端】【2.0】增加新版的sp和被动技能 - 新版
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py | 223 +++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 165 insertions(+), 58 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..cd6970a 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,14 @@
import GameBuffs
import ChConfig
import FBLogic
-import ReadChConfig
import SkillShell
import PassiveBuffEffMng
import ChNetSendPack
import PlayerTJG
import OperControlManager
import GameObj
+import CrossPlayerData
+import AttackCommon
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -35,18 +36,26 @@
# @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)
+ buffOwner = AttackCommon.ElfChangeAttacker(buffOwner) # Elf灵为替身攻击,要取玩家的属性
+
+ result = AddBuffNoRefreshState(curObj, buffType, curSkill, tick, addBuffValueList, buffOwner, addForce)
if result is not 0:
# 被抵消的buff 不处理
@@ -69,28 +78,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 +90,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 +103,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 +132,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 +150,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 +172,7 @@
if hasEffect:
layerMaxCnt = hasEffect.GetEffectValue(0) # 能叠加的最大上限
layerCalc = hasEffect.GetEffectValue(1) # 增加层级还是减少层级 Def_BuffLayer_Add
+
#1 检查是否有相同的BUFF,如果有相同的就刷新时间
for i in range( 0, buffCount ):
@@ -164,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相同
@@ -178,8 +199,8 @@
if buffReplaceType == ChConfig.Def_Buff_Replace_Better:
if buffSkillLV > curSkillLV:
- # 只取最好的
- continue
+ # 只取最好的, 不可加直接退出
+ return False
resultTime = -1 #不改变时间的情况
if buffRepeatTimeType == ChConfig.Def_BuffTime_Reset:
@@ -197,29 +218,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 +265,7 @@
isDelRefresh = True
return __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh,
- tick, 0, layerMaxCnt, layerCalc)
+ tick, curSkillLastTime, 0, layerMaxCnt, layerCalc)
## 是否血包/蓝包buff
@@ -297,14 +325,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 +348,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)
@@ -356,14 +381,16 @@
if triggerType == -1:
continue
passiveEff = PassiveBuffEffMng.GetPassiveEffManager().InitObjPassiveEff(curObj)
- passiveEff.AddBuffInfoByEffect(curEffect, skillID)
+ passiveEff.AddBuffInfoByEffect(curEffect, skillID, onwerID, onwerType)
#添加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 +407,15 @@
# @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)
+ # 此处不能传技能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
@@ -540,6 +575,8 @@
return curBuff, i
return None, 0
+
+
#---------------------------------------------------------------------
## 刷新BUFF的时间
# @param curBuff 当前BUFF
@@ -605,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:
@@ -653,11 +693,33 @@
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消失触发逻辑
@@ -708,6 +770,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 +999,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 +1011,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