From e17fcba64e93fceb1459b12cbe70663039d40314 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 11 一月 2024 18:22:45 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(回合战斗buff持续时间处理及持续性buff定时触发时机处理支持;增加回合战斗死亡及复活支持;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py |  127 +++++++++++++++++++++++++++--------------
 1 files changed, 83 insertions(+), 44 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
index 6bad0d9..58321d4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -2423,53 +2423,79 @@
     if not buffStateCount:
         return
     
-    turnNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightNum) # 回合编号,大于0同时也代表回合制中
-    
-    #buff持续效果
-    for i in range(0, buffStateCount):
+    #buff持续效果,回合下可能删除buff,倒序遍历
+    for i in range(0, buffStateCount)[::-1]:
         curBuff = buffState.GetBuff(i)
+        ProcessSinglePersistBuff(curObj, buffState, curBuff, tick)
         
-        if not curBuff:
-            #在以下处理过程中, 对方有可能死亡, 如果死亡, 会清空buff, 导致这里取得None
-            #所以一定要continue 
-            continue
-        
-        curBuffSkill = curBuff.GetSkill()
-        
-        if not __BuffCanProcess(curObj, curBuffSkill):
-            continue
-
-        processBuffTick = GetProcessBuffTick(curBuffSkill, curObj)
-        
-        #---验证触发间隔TICK---
-        if turnNum > 0:
-            GameWorld.DebugLog("    buffProcess: objID=%s,skillID=%s,turnNum=%s" % (curObj.GetID(), curBuffSkill.GetSkillID(), turnNum))
-        else:
-            if tick - curBuff.GetProcessInterval() <= processBuffTick:
-                continue
-        curBuff.SetProcessInterval(tick)
-        
-        
-        #得到当前buff
-        for effIndex in range(0, curBuffSkill.GetEffectCount()):
-            #得到当前效果
-            curEffect = curBuffSkill.GetEffect(effIndex)
-            curEffectID = curEffect.GetEffectID()
-            
-            if not curEffectID:
-                continue
-            
-            processStr = "BuffProcess_%d.%s"%(curEffectID, "ProcessBuff")
-            
-            callBuffProcessFunc = GameWorld.GetExecFunc(GameBuffs, processStr)
-            
-            if not callBuffProcessFunc:
-                continue
-            
-            callBuffProcessFunc(curObj, curBuff, curEffect, processBuffTick, tick)
-    
     #执行ProcessBuff中设定的玩家字典
     __DoProcessBuff_PlayerKey(curObj, tick)
+    return
+
+def ProcessSinglePersistBuff(curObj, buffState, curBuff, tick, turnForce=False):
+    '''处理单个持续性buff,可能会删除buff,调用时如果是循环遍历,需注意遍历顺序,防止buff删除后索引错乱
+    @param turnForce: 回合下强制立刻执行
+    '''
+    if not curBuff:
+        return
+    curBuffSkill = curBuff.GetSkill()
+    
+    if not __BuffCanProcess(curObj, curBuffSkill):
+        return
+    
+    processBuffTick = GetProcessBuffTick(curBuffSkill, curObj)
+    
+    isDel = False
+    remainTime = None
+    timeLine = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline)
+    #---验证触发间隔TICK---
+    if timeLine > 0:
+        turnNum, actionNum = timeLine / 100, timeLine % 100
+        if not turnForce and actionNum != 0:
+            # 持续型buff暂仅支持回合开始时处理
+            return
+        remainTime = curBuff.GetRemainTime() - ChConfig.Def_PerTurnTick # 每处理一次固定算一回合
+        if remainTime <= 0:
+            isDel = True
+        GameWorld.DebugLog("    回合buffProcess: objID=%s,skillID=%s,remainTime=%s,turnNum=%s" % (curObj.GetID(), curBuffSkill.GetSkillID(), remainTime, turnNum))
+    else:
+        if tick - curBuff.GetProcessInterval() <= processBuffTick:
+            return
+    curBuff.SetProcessInterval(tick)
+    
+    #得到当前buff
+    for effIndex in range(0, curBuffSkill.GetEffectCount()):
+        #得到当前效果
+        curEffect = curBuffSkill.GetEffect(effIndex)
+        curEffectID = curEffect.GetEffectID()
+        
+        if not curEffectID:
+            continue
+        
+        processStr = "BuffProcess_%d.%s"%(curEffectID, "ProcessBuff")
+        
+        callBuffProcessFunc = GameWorld.GetExecFunc(GameBuffs, processStr)
+        
+        if not callBuffProcessFunc:
+            continue
+        
+        callBuffProcessFunc(curObj, curBuff, curEffect, processBuffTick, tick)
+        
+    # 剩余时间需效果处理后再设置
+    if remainTime != None:
+        curBuff.SetRemainTime(remainTime)
+        
+    if not isDel:
+        return
+    
+    GameWorld.DebugLog("    buffProcess后删除buff: objID=%s,skillID=%s,turnNum=%s" % (curObj.GetID(), curBuffSkill.GetSkillID(), turnNum))
+    skillID = curBuffSkill.GetSkillID()
+    skillTypeID = curBuffSkill.GetSkillTypeID()
+    ownerID, ownerType = curBuff.GetOwnerID(), curBuff.GetOwnerType()
+    BuffSkill.DoBuffDisApper(curObj, curBuff, tick)
+    buffState.DeleteBuffByTypeID(skillTypeID)
+    SkillShell.ClearBuffEffectBySkillID(curObj, skillID, ownerID, ownerType)
+    return
 
 #---------------------------------------------------------------------
 ##执行ProcessBuff中设定的玩家字典
@@ -3410,10 +3436,23 @@
 def CheeckTrigSkillandTag(attacker, exSkill, defender, tick):
     #再次验证附加技能是否对目标可用
     if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
+        skillTag = GetSkillAffectTag(exSkill)
         #该技能是对自己使用的 防守者应该改为攻击者
-        if GetSkillAffectTag(exSkill) in [ChConfig.Def_UseSkillTag_Self,
+        if skillTag in [ChConfig.Def_UseSkillTag_Self,
                                           ChConfig.Def_UseSkillTag_SelfAndFriend]:
             return True, attacker
+        
+        # 召唤兽对主人释放技能
+        if skillTag == ChConfig.Def_UseSkillTag_SummonMaster:
+            if not NPCCommon.IsSummonNPC(attacker):
+                return False, None
+            curSummonOwner =  NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, attacker)    
+            if curSummonOwner == None:
+                curSummonOwner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotNPC, attacker)
+            if curSummonOwner == None:
+                return False, None
+            return True, curSummonOwner
+        
         return True, defender
     
     #该技能是对自己使用的 防守者应该改为攻击者

--
Gitblit v1.8.0