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 | 194 +++++++++++++++++++++++++++++++++++------------
1 files changed, 143 insertions(+), 51 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 4a90148..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
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -40,10 +41,19 @@
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
+
+ buffOwner = AttackCommon.ElfChangeAttacker(buffOwner) # Elf灵为替身攻击,要取玩家的属性
result = AddBuffNoRefreshState(curObj, buffType, curSkill, tick, addBuffValueList, buffOwner, addForce)
@@ -72,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
@@ -97,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)
@@ -104,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拥有者)
@@ -139,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
@@ -169,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相同
@@ -183,8 +199,8 @@
if buffReplaceType == ChConfig.Def_Buff_Replace_Better:
if buffSkillLV > curSkillLV:
- # 只取最好的
- continue
+ # 只取最好的, 不可加直接退出
+ return False
resultTime = -1 #不改变时间的情况
if buffRepeatTimeType == ChConfig.Def_BuffTime_Reset:
@@ -202,31 +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)
- #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
+ 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
@@ -244,7 +265,7 @@
isDelRefresh = True
return __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh,
- tick, 0, layerMaxCnt, layerCalc)
+ tick, curSkillLastTime, 0, layerMaxCnt, layerCalc)
## 是否血包/蓝包buff
@@ -304,15 +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.AddBuff(skillID, tick, isNotify, False)
- buffIndex = buffState.GetBuffCount() # buff在管理器中的索引
+
if updProcessInterval > 0:
# 继承上一个buff的循环记录
addBuff.SetProcessInterval(updProcessInterval)
@@ -327,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)
@@ -364,7 +381,7 @@
if triggerType == -1:
continue
passiveEff = PassiveBuffEffMng.GetPassiveEffManager().InitObjPassiveEff(curObj)
- passiveEff.AddBuffInfoByEffect(curEffect, skillID)
+ passiveEff.AddBuffInfoByEffect(curEffect, skillID, onwerID, onwerType)
#添加BUFF后的特殊处理
@@ -373,7 +390,7 @@
# 通知客户端
#buffState.Sync_AddBuffEx()
if isNotify:
- PYSync_RefreshBuff(curObj, addBuff, SkillCommon.GetBuffType(curSkill), notifyAll=False)
+ PYSync_RefreshBuff(curObj, addBuff, SkillCommon.GetBuffType(curSkill), notifyAll=False, owner = buffOwner)
#检查是否属于刷新BUFF
#===========================================================================
@@ -394,7 +411,11 @@
#触发被动技能
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
@@ -554,6 +575,8 @@
return curBuff, i
return None, 0
+
+
#---------------------------------------------------------------------
## 刷新BUFF的时间
# @param curBuff 当前BUFF
@@ -619,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:
@@ -667,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消失触发逻辑
@@ -722,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 当前目标
@@ -910,7 +999,7 @@
return DelBuffBySkillID(curObj, skillID, tick)
-def PYSync_RefreshBuff(gameObj, curBuff, buffType, notifyAll=True):
+def PYSync_RefreshBuff(gameObj, curBuff, buffType, notifyAll=True, owner = None):
sendPack = ChNetSendPack.tagObjAddBuff()
sendPack.ObjType = gameObj.GetGameObjType()
@@ -922,6 +1011,9 @@
sendPack.Value1 = curBuff.GetValue1();
sendPack.Value2 = curBuff.GetValue2();
sendPack.Layer = curBuff.GetLayer();
+ 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:
--
Gitblit v1.8.0