From 3beded4a9ae2e126158d89a4e7048f595ea0bc1b Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 25 八月 2025 12:01:24 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(技能触发来源触发逻辑优化;增加承伤盾支持,0428通知buff相关值;增加嘲讽支持,优化技能选择目标逻辑;增加连击、反击、格挡、暴击、通用击晕支持;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py | 226 ++++++-------------------------------------------------- 1 files changed, 26 insertions(+), 200 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py index 31df10d..a12550f 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py @@ -267,12 +267,12 @@ batObj = batObjMgr.getBatObj(objID) if not batObj: continue - if batObj.GetHP() > 0: + if batObj.IsAlive(): allKilled = False break if allKilled: - self.winFaction = ChConfig.Def_FactionA if faction == ChConfig.Def_FactionB else ChConfig.Def_FactionA + self.winFaction = ChConfig.Def_FactionA if faction == ChConfig.Def_FactionB else ChConfig.Def_FactionB DoTurnFightOver(self.guid) return self.winFaction @@ -556,7 +556,7 @@ batObjMgr = BattleObj.GetBatObjMgr() initXP = IpyGameDataPY.GetFuncCfg("AngerXP", 1) - atkBackSkillIDList = IpyGameDataPY.GetFuncEvalCfg("ParryCfg", 3) + atkBackSkillIDList = IpyGameDataPY.GetFuncEvalCfg("ParryCfg", 2) for posNumKey, heroInfo in heroDict.items(): posNum = int(posNumKey) @@ -597,6 +597,7 @@ batObj.SetLineupPos(posNum, num) batObj.SetFightPower(fightPower) batObj.SetLV(lv) + batObj.SetAtkDistType(atkDistType) if npcID: batObj.SetNPCID(npcID) elif lineupPlayerID: @@ -1112,6 +1113,7 @@ return def OnTimelineChange(turnFight): + ## 每个时间节点变化时处理 nowTimeline = turnFight.getTimeline() @@ -1120,8 +1122,14 @@ for batLineup in batFaction.lineupDict.values(): for objID in batLineup.posObjIDDict.values(): batObj = batObjMgr.getBatObj(objID) - if not batObj or batObj.GetHP() <= 0: + #GameWorld.DebugLog("OnTimelineChange! objID=%s" % (objID)) + if not batObj or not batObj.IsAlive(): continue + + batObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, 0) + batObj.SetDict(ChConfig.Def_Obj_Dict_TurnMissNum, 0) + batObj.SetDict(ChConfig.Def_Obj_Dict_TurnParryNum, 0) + curID = batObj.GetID() skillManager = batObj.GetSkillManager() for index in range(0, skillManager.GetSkillCount()): @@ -1148,10 +1156,12 @@ remainTime = buff.GetRemainTime() if not remainTime: # 永久buff不处理 + #GameWorld.DebugLog(" 永久buff不处理! curID=%s,index=%s,skillID=%s" % (curID, index, buff.GetSkillID())) continue calcTimeline = buff.GetCalcTime() passTurn = __calcPassturn(calcTimeline, nowTimeline, False) if passTurn <= 0: + #GameWorld.DebugLog(" passTurn <= 0 passTurn=%s,calcTimeline=%s,nowTimeline=%s,skillID=%s" % (passTurn, calcTimeline, nowTimeline, buff.GetSkillID())) continue updRemainTime = max(0, remainTime - passTurn) @@ -1194,40 +1204,6 @@ return TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnStart) - -# SetTimeline(gameObj, turnNum, 0) -# # 重置连击、反击数 -# gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, 0) -# gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, 0) -# gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnParryNum, 0) -# gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnMissNum, 0) -# gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkAddXPCount, 0) -# gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnXPUseState, 0) -# gameObj.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, 0) # 击晕CD -# -# objType = gameObj.GetGameObjType() -# objID = gameObj.GetID() -# objName = GetObjName(gameObj) -# GameWorld.DebugLog("ObjPerTurnStart: 回合%s, %s objType-ID-HP(%s-%s-%s)" % (turnNum, objName, objType, objID, GameObj.GetHP(gameObj))) -# -# # 每回合开始减技能CD -# skillManager = gameObj.GetSkillManager() -# for i in range(skillManager.GetSkillCount()): -# skill = skillManager.GetSkillByIndex(i) -# remainTime = skill.GetRemainTime() -# if not remainTime: -# continue -# skillID = skill.GetSkillID() -# updRemainTime = max(0, remainTime - ChConfig.Def_PerTurnTick) -# skill.SetRemainTime(updRemainTime) -# GameWorld.DebugLog(" skillID=%s,remainTime=%s,updRemainTime=%s" % (skillID, remainTime, updRemainTime)) -# -# # 刷新定时处理的buff效果 -# SkillShell.ProcessPersistBuff(gameObj, tick) -# -# PassiveBuffEffMng.OnPassiveSkillTrigger(gameObj, tagObj, None, ChConfig.TriggerType_TurnNum, tick) -# -# __logGameObjAttr(gameObj) return def TurnFightPerTurnBigEnd(turnFight, batObj, turnNum): @@ -1271,6 +1247,8 @@ def AddTurnObjHurtValue(curBatObj, tagBatObj, hurtValue, lostHP, skillID=0, isBounce=False): ## 回合对象添加伤害值 # @param isBounce: 是否反弹伤害 + if hurtValue <= 0: + return curID = curBatObj.GetID() tagID = tagBatObj.GetID() if curID != tagID: @@ -1279,7 +1257,7 @@ % (curID, tagID, skillID, hurtValue, lostHP, updStatValue, tagBatObj.GetHP(), isBounce)) if tagBatObj: - updStatValue = tagBatObj.StatDefValue(lostHP) + updStatValue = tagBatObj.StatDefValue(hurtValue) GameWorld.DebugLog(" 统计承伤: curID=%s,tagID=%s,skillID=%s,hurtValue=%s,lostHP=%s,updStatValue=%s,curHP=%s,isBounce=%s" % (tagID, curID, skillID, hurtValue, lostHP, updStatValue, tagBatObj.GetHP(), isBounce)) @@ -1303,12 +1281,11 @@ objName = GetObjName(curBatObj) # 是否可行动状态判断 - canAction = True - + canAction = curBatObj.CanAction() if not canAction: GameWorld.DebugLog("★回合%s %s 当前状态不可行动!" % (turnNum, objName)) return - + atk = curBatObj.GetAtk() curXP = curBatObj.GetXP() GameWorld.DebugLog("★回合%s %s 行动 : atk=%s,curHP=%s/%s,curXP=%s" % (turnNum, objName, atk, curHP, curBatObj.GetMaxHP(), curXP)) @@ -1338,6 +1315,9 @@ if SkillCommon.isAngerSkill(useSkill): if curXP < xpMax: continue + if curBatObj.IsInState(ChConfig.BatObjState_Sneer): + GameWorld.DebugLog("嘲讽状态下,无法主动释放怒技!") # 可被动释放怒技,如怒技追击 + continue useCnt = -1 # xp技能优先释放 else: useCnt = curBatObj.GetSkillUseCnt(skillID) @@ -1354,166 +1334,12 @@ TurnPassive.OnTriggerPassiveEffect(turnFight, curBatObj, ChConfig.TriggerWay_HeroActionEnd) return True -def DoAttack(curBatObj, tagBatObj, tick, turnBattleType=ChConfig.TurnBattleType_Normal, useSkill=None): -# curID = curBatObj.GetID() -# npcID = curBatObj.GetNPCID() -# objName = GetObjName(curBatObj) -# GameWorld.DebugLog(" ● %s DoAttack: curID=%s,,turnBattleType=%s" % (objName, curID, turnBattleType)) -# -# atkOK = False -# curBatObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, turnBattleType) -# -# if turnBattleType == ChConfig.TurnBattleType_AtkBack: -# if not tagBatObj: -# return -# skillManager = curBatObj.GetSkillManager() -# for index in range(0, skillManager.GetSkillCount()): -# skill = skillManager.GetSkillByIndex(index) -# if not skill: -# continue -# if skill.GetFuncType() == ChConfig.Def_SkillFuncType_AtkbackSkill: -# useSkill = skill -# break -# atkOK = SkillShell.DoLogic_UseSkill(curBatObj, tagBatObj, useSkill, tick) -# elif turnBattleType == ChConfig.TurnBattleType_Combo: -# if not tagBatObj: -# return -# atkOK = SkillShell.DoLogic_UseSkill(curBatObj, tagBatObj, useSkill, tick) -# else: -# curXP = GameObj.GetXP(curBatObj) -# xpMax = IpyGameDataPY.GetFuncCfg("AngerXP", 2) -# skillManager = curBatObj.GetSkillManager() -# useSkillList = [] -# #GameWorld.DebugLog('skillCount=%s' % skillManager.GetSkillCount(), npcID) -# for index in range(0, skillManager.GetSkillCount()): -# useSkill = skillManager.GetSkillByIndex(index) -# if not useSkill: -# continue -# if useSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_AtkbackSkill]: -# #基础普攻不能主动释放,目前仅用于反击 -# continue -# #被动技能无法使用 -# if SkillCommon.isPassiveSkill(useSkill): -# continue -# #还在冷却时间内无法释放 -# if useSkill.GetRemainTime(): -# continue -# skillID = useSkill.GetSkillID() -# # 常规攻击优先xp -# if SkillCommon.isAngerSkill(useSkill) and turnBattleType == ChConfig.TurnBattleType_Normal: -# if curXP < xpMax: -# continue -# useCnt = -1 # xp技能优先释放 -# else: -# useCnt = curBatObj.GetDictByKey(ChConfig.Def_NPC_Dict_SkillUseCnt % skillID) # 该技能已使用次数 -# useSkillList.append([useCnt, index, skillID, useSkill]) -# -# useSkillList.sort() # 按使用次数优先升序排,使用次数低的优先判断使用 -# #GameWorld.DebugLog(' 技能使用顺序 = useSkillList%s' % str(useSkillList), npcID) -# -# for useInfo in useSkillList: -# useSkill = useInfo[-1] -# #skillID = useSkill.GetSkillID() -# atkOK, tagBatObj = OnUseSkill(curBatObj, useSkill, tick) -# if atkOK: -# break -# -# curBatObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 无论攻击成功与否都重置战斗类型 -# -# tagID = 0 -# tagHP = 0 -# if tagObj: -# tagID = tagObj.GetID() -# tagHP = GameObj.GetHP(tagObj) -# GameWorld.DebugLog(' atkOK=%s,tagID=%s,tagHP=%s' % (atkOK, tagID, tagHP), npcID) -# if not atkOK: -# return -# -# if not tagObj: -# return -# -# if GameObj.GetFaction(curNPC) == GameObj.GetFaction(tagObj): -# # 同阵营直接返回,不处理连击、反击 -# return True -# -# curHP = GameObj.GetHP(curNPC) -# tagHP = GameObj.GetHP(tagObj) -# tagID = tagObj.GetID() -# GameWorld.DebugLog(" curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, curHP, tagID, tagHP)) -# if tagHP <= 0 or curHP <= 0: -# return True -# -# # 反击,反击可打断连击,所以优先判断 -# if CanAtkBack(curNPC, tagObj): -# DoAttack(tagObj, curNPC, tick, ChConfig.TurnBattleType_AtkBack) -# return True -# -# # 连击 -# if CanCombo(curNPC, tagObj): -# DoAttack(curNPC, tagObj, tick, ChConfig.TurnBattleType_Combo, useSkill) -# - return True - -def CanAtkBack(atkObj, defObj): - ## 可否反击 - posNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightPosInfo) % 100 - if posNum <= 0: - GameWorld.DebugLog(" 被非主战单位攻击时无法触发反击: atkID=%s,posNum=%s" % (atkObj.GetID(), posNum)) - return False - atkDistType = AttackCommon.GetAtkDistType(defObj) - if atkDistType == ChConfig.AtkDistType_Long: - if not IpyGameDataPY.GetFuncCfg("ParryCfg", 2): - GameWorld.DebugLog(" 远程单位不可反击: defID=%s" % (defObj.GetID())) - return False - defAtkBackRate = GameObj.GetAtkBackRate(defObj) # 防方反击率 - atkBackNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) # 已反击次数 - if atkBackNum > 10: - # 内置最高反击数防范 - return False - if atkBackNum > 0: - validPerList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 4) - vaildPer = validPerList[atkBackNum - 1] if len(validPerList) >= atkBackNum else 0 - defAtkBackRate = int(defAtkBackRate * vaildPer / 100.0) - - atkAtkBackDefRate = GameObj.GetAtkBackDefRate(atkObj) # 攻方抵抗反击率 - atkBackRate = max(0, defAtkBackRate - atkAtkBackDefRate) - if atkBackRate <= 0 or not GameWorld.CanHappen(atkBackRate): - GameWorld.DebugLog(" 无法反击: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)" - % (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate)) - return False - GameWorld.DebugLog(" 可以反击: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)" - % (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate)) - return True - -def CanCombo(atkObj, defObj): - ## 可否连击 - - atkComboRate = GameObj.GetComboRate(atkObj) # 攻方连击率 - comboNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) # 已连击次数 - if comboNum > 10: - # 内置最高连击数防范 - return False - if comboNum > 0: - validPerList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 3) - vaildPer = validPerList[comboNum - 1] if len(validPerList) >= comboNum else 0 - atkComboRate = int(atkComboRate * vaildPer / 100.0) - - defComboReduce = GameObj.GetComboDefRate(defObj) # 防方抵抗连击率 - comboRate = max(0, atkComboRate - defComboReduce) - if comboRate <= 0 or not GameWorld.CanHappen(comboRate): - GameWorld.DebugLog(" 无法连击: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)" - % (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce)) - return False - GameWorld.DebugLog(" 可以连击: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)" - % (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce)) - return True - def SetObjKilled(turnFight, gameObj, killer=None, useSkill=None): objID = gameObj.GetID() - GameWorld.DebugLog(" %s 回合战斗主体被击杀: curID=%s" % (GetObjName(gameObj), objID)) - gameObj.SetHP(0) killerObjID = killer.GetID() if killer else 0 skillID = useSkill.GetSkillID() if useSkill else 0 + GameWorld.DebugLog(" %s 回合战斗主体被击杀: curID=%s,killerObjID=%s,skillID=%s" % (GetObjName(gameObj), objID, killerObjID, skillID)) + gameObj.SetDead() clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCTurnFightObjDead) clientPack.ObjID = objID @@ -1551,7 +1377,7 @@ turnFight.costTime = time.time() - turnFight.startTime winFaction = turnFight.winFaction - GameWorld.DebugLog("--- 战斗结束处理 --- %s, winFaction=%s, costTime=%ss" % (guid, winFaction, turnFight.costTime)) + GameWorld.DebugLog("--- 战斗结束处理 ---, winFaction=%s, costTime=%ss, %s" % (winFaction, turnFight.costTime, guid)) # 统计明细 batObjMgr = BattleObj.GetBatObjMgr() @@ -1577,7 +1403,7 @@ atkHurt = batObj.hurtStat defHurt = batObj.defStat cureHP = batObj.cureStat - GameWorld.DebugLog(" Pos:%s ID=%s-%s-%s,,HP=%s/%s, 输出=%s,承伤=%s,治疗=%s" + GameWorld.DebugLog(" Pos:%s ID=%s,npcID=%s,heroID=%s,HP=%s/%s, 输出=%s,承伤=%s,治疗=%s" % (posNum, objID, npcID, heroID, batObj.GetHP(), batObj.GetMaxHP(), atkHurt, defHurt, cureHP)) lineupStatInfo[str(posNum)] = {"ObjID":objID, "HeroID":heroID, "NPCID":npcID, "AtkHurt":atkHurt, "DefHurt":defHurt, "CureHP":cureHP} -- Gitblit v1.8.0