hxp
2025-09-15 ffb198b68f7e75f4fb2046189f1e7b2992d2ebac
129 【战斗】战斗系统-服务端(于禁技能,支持格挡印记;)
5个文件已修改
88 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -226,6 +226,7 @@
    def GetEffectID(self): return self._effID
    def GetEffectValue(self, index): return self._values[index] if len(self._values) > index else 0
    def GetEffectValueCount(self): return len(self._values)
    def GetEffectValues(self): return self._values # 直接返回整个效果values
    def GetTriggerWay(self): return self._triggerWay
    def GetTriggerSrc(self): return self._triggerSrc
    #def GetTriggerParams(self, index): return self._triggerParams[index] if len(self._triggerParams) > index else 0
@@ -401,13 +402,13 @@
        return
    
    def GetBuff(self, buffID): return self._buffIDDict.get(buffID, None)
    def FindBuffBySkillID(self, skillID):
    def FindBuffListBySkillID(self, skillID):
        ## 返回该技能ID的所有buff列表
        skillData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
        if not skillData:
            return []
        return self.FindBuffBySkillTypeID(skillData.GetSkillTypeID())
    def FindBuffBySkillTypeID(self, skillTypeID):
        return self.FindBuffListBySkillTypeID(skillData.GetSkillTypeID())
    def FindBuffListBySkillTypeID(self, skillTypeID):
        ## 返回该技能TypeID的所有buff列表
        if skillTypeID not in self._skillTypeIDBuffIDs:
            return []
@@ -417,6 +418,13 @@
                continue
            buffs.append(self._buffIDDict[buffID])
        return buffs
    def FindBuffByState(self, state):
        ## 查找某种buff状态的buff
        buffIDList = self._buffStateDict.get(state, [])
        if not buffIDList:
            return
        buffID = buffIDList[0]
        return self._buffIDDict.get(buffID, None)
    
    def AddBuffState(self, state, buffID):
        ## 添加buff影响的状态,ChConfig.BatObjStateList
@@ -640,6 +648,10 @@
        TurnPassive.RefreshPassive(self)
        return
    
    def TurnReset(self):
        ## 回合重置
        self._skillTurnUseCntDict = {}
    def UpdInitBatAttr(self, initAttrDict, skillIDList):
        ## 更新战斗属性,一般只有主阵容需要更新,战斗中养成、装备变化等引起的主阵容属性变更时需要实时更新
        self._initAttrDict = initAttrDict
@@ -803,10 +815,6 @@
        ## 统计治疗
        self.cureStat += cureValue
        return self.cureStat
    def TurnReset(self):
        ## 回合重置
        self._skillTurnUseCntDict = {}
    
class BattleObjMgr():
    ## 战斗对象管理器
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -814,6 +814,8 @@
            continue
        GameWorld.DebugLog("    重置武将: %s, HP:%s/%s, XP:%s" % (objName, batObj.GetHP(), batObj.GetMaxHP(), batObj.GetXP()))
        
        batObj.TurnReset()
        # 清除buff
        buffMgr = batObj.GetBuffManager()
        buffMgr.ClearBuff()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3140,7 +3140,9 @@
    BatObjState_LimitSkill, # 沉默 10
    BatObjState_LimitAddHP, # 禁疗 11
    BatObjState_Stone, # 石化 12
) = range(13)
    BatObjState_Disarm, # 缴械 13
    BatObjState_ParryYJ, # 格挡印记 14
) = range(15)
# 被控制的状态列表,无法行动,处于某些控制类buff影响状态下,如晕眩,冰冻,石化
InControlledStateList = [BatObjState_Frozen, BatObjState_Stun, BatObjState_Stone]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -62,6 +62,11 @@
    
    skillTypeID = buffSkill.GetSkillTypeID()
    buffRepeat = buffSkill.GetBuffRepeat()
    addLayerCnt = buffSkill.GetLayerCnt()
    addLayerEff = buffSkill.GetEffectByID(6001)
    if addLayerEff:
        addLayerCnt = GameWorld.GetResultByWeightList(addLayerEff.GetEffectValues(), addLayerCnt)
    #buff重复获得时的叠加规则
    #以下规则默认针对的是相同施法者,即相同来源的处理
    #如果有针对不同施法者的规则会说明
@@ -86,30 +91,45 @@
            # 删除相同状态的buff
            DoBuffDel(turnFight, batObj, buff, bySkill, afterLogic, buffOwner)
    else:
        buffList = buffMgr.FindBuffBySkillTypeID(skillTypeID)
        buffList = buffMgr.FindBuffListBySkillTypeID(skillTypeID)
        if buffList:
            for buff in buffList:
                if not buff:
                    continue
                if buff.GetOwnerID() != ownerID:
                    continue
                GameWorld.DebugLog("    已经存在该buff,默认覆盖: buffID=%s,skillTypeID=%s,ownerID=%s" % (buff.GetBuffID(), skillTypeID, ownerID))
                buffID = buff.GetBuffID()
                GameWorld.DebugLog("    已经存在该buff: buffID=%s,skillTypeID=%s,ownerID=%s,buffRepeat=%s" % (buffID, skillTypeID, ownerID, buffRepeat))
                updLayerCnt = addLayerCnt
                if buffRepeat == 3: # 叠加层级
                    nowLayerCnt = buff.GetLayer()
                    maxLayerCnt = buffSkill.GetLayerMax()
                    updLayerCnt = nowLayerCnt + addLayerCnt
                    if maxLayerCnt and updLayerCnt > maxLayerCnt:
                        updLayerCnt = maxLayerCnt
                    GameWorld.DebugLog("        叠加层级: nowLayerCnt=%s,addLayerCnt=%s,updLayerCnt=%s" % (nowLayerCnt, addLayerCnt, updLayerCnt))
                else:
                    GameWorld.DebugLog("        默认覆盖")
                # 重置回合、CD、值等
                buff.SetCalcTime(turnFight.getTimeline())
                buff.SetRemainTime(buffSkill.GetLastTime())
                buff.SetLayer(buffSkill.GetLayerCnt())
                buff.SetLayer(updLayerCnt)
                buff.SetBuffValueList(buffValueList)
                if afterLogic and bySkill:
                    bySkill.AddAfterLogic(ChConfig.AfterLogic_AddBuff, [batObj, buff, buffOwner])
                else:
                    SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID, isNewAdd=True)
                    
                break
            return True
        
    __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic)
    __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic, setLayerCnt=addLayerCnt)
    return True
def __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill=None, afterLogic=False):
def __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill=None, afterLogic=False, setLayerCnt=0):
    curID = batObj.GetID()
    skillID = buffSkill.GetSkillID()
    buff = buffMgr.AddBuff(skillID)
@@ -125,7 +145,7 @@
    buff.SetOwnerID(ownerID)
    buff.SetCalcTime(turnFight.getTimeline())
    buff.SetRemainTime(buffSkill.GetLastTime())
    buff.SetLayer(buffSkill.GetLayerCnt())
    buff.SetLayer(setLayerCnt)
    buff.SetBuffValueList(buffValueList)
    curBuffState = buffSkill.GetCurBuffState()
    if curBuffState:
@@ -175,6 +195,21 @@
        
    return
def DecBuffLayer(turnFight, batObj, curBuff, decLayer=1, relatedSkillID=0):
    ## 减少buff层级
    curLayer = curBuff.GetLayer()
    if not curLayer:
        return
    updLayer = max(0, curLayer - decLayer)
    curBuff.SetLayer(updLayer)
    if updLayer > 0:
        SyncBuffRefresh(turnFight, batObj, curBuff, relatedSkillID)
        return
    objID = batObj.GetID()
    buffID = curBuff.GetBuffID()
    SyncBuffDel(turnFight, objID, buffID, relatedSkillID)
    return
def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None):
    '''删除buff
    @param relatedSkill: 关联的技能
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -1065,7 +1065,7 @@
    aSuperDamPer, dSuperDamPerDef = 0, 0
    if not isDot:
        isSuperHit = CanSuperHit(atkObj, defObj) # 是否暴击
        isParry = (isTurnNormalSkill and CanParry(atkObj, defObj)) # 是否格挡,仅针对普攻
        isParry = (isTurnNormalSkill and CanParry(turnFight, atkObj, defObj, curSkill)) # 是否格挡,仅针对普攻
        isStun = CanStun(turnFight, atkObj, defObj, curSkill) # 是否击晕
        
    if isSuperHit:
@@ -1169,10 +1169,19 @@
    TurnBuff.DoAddBuffBySkillID(turnFight, defObj, stunSkillID, atkObj, curSkill, afterLogic=True)
    return True
def CanParry(atkObj, defObj):
def CanParry(turnFight, atkObj, defObj, curSkill):
    if defObj.IsInControlled():
        #被控制无法格挡
        return False
    # 格挡印记
    buffMgr = defObj.GetBuffManager()
    parryYJBuff = buffMgr.FindBuffByState(ChConfig.BatObjState_ParryYJ)
    if parryYJBuff and parryYJBuff.GetLayer():
        GameWorld.DebugLog("格挡印记格挡了: buffID=%s,buffLayer=%s" % (parryYJBuff.GetBuffID(), parryYJBuff.GetLayer()))
        TurnBuff.DecBuffLayer(turnFight, defObj, parryYJBuff, 1, curSkill.GetSkillID())
        return True
    aParryRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ParryRateDef)
    dParryRate = defObj.GetBatAttrValue(ChConfig.AttrID_ParryRate)
    parryNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnParryNum)