From 225c3a53759d5739989272549203d4676c666e9f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 30 一月 2026 14:08:01 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(命格buff改为只给命格自身添加;命格buff基础属性加成支持计算到武将身上;命格战斗属性支持计算到武将战斗中;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py | 44 +++++++++++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/TurnFight.py | 70 ++++++++++-------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 32 +++++++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py | 3 +
4 files changed, 101 insertions(+), 48 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/TurnFight.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/TurnFight.py
index 80940c1..c062c76 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/TurnFight.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/TurnFight.py
@@ -235,20 +235,8 @@
mgObj = batLineup.getMinggeObj()
if mgObj:
objName = "命格 ID:%s" % mgObj.GetID()
- GameWorld.DebugAnswer(curPlayer, "--- %s" % objName)
- skillMgr = mgObj.GetSkillManager()
- skillIDList = skillMgr.GetSkillIDList()
- GameWorld.DebugAnswer(curPlayer, "技能: %s,%s" % (len(skillIDList), skillIDList))
- buffMgr = mgObj.GetBuffManager()
- GameWorld.DebugAnswer(curPlayer, "Buff: %s" % buffMgr.GetBuffCount())
- for index in range(buffMgr.GetBuffCount()):
- buff = buffMgr.GetBuffByIndex(index)
- buffName = GameWorld.CodeToGbk(buff.GetSkillData().GetSkillName())
- GameWorld.DebugAnswer(curPlayer, "ID:%s,%s(%s),回合:%s,层:%s,V:%s,来源:%s,光环:%s"
- % (buff.GetBuffID(), buffName, buff.GetSkillID(), buff.GetRemainTime(), buff.GetLayer(),
- [buff.GetValue1(), buff.GetValue2(), buff.GetValue3()], buff.GetOwnerID(), buff.GetHaloObjIDList()
- ))
-
+ __printObj(curPlayer, mgObj, objName)
+
posObjIDDict = batLineup.getPosObjIDDict()
for posNum in posNumList:
objID = posObjIDDict.get(posNum)
@@ -256,31 +244,35 @@
continue
batObj = batObjMgr.getBatObj(objID)
objName = TurnAttack.GetObjName(batObj)
- GameWorld.DebugAnswer(curPlayer, "--- %s%s" % (objName, "" if batObj.IsAlive() else " [被击杀]"))
- GameWorld.DebugAnswer(curPlayer, "HP:%s/%s" % (batObj.GetHP(), batObj.GetMaxHP()))
- GameWorld.DebugAnswer(curPlayer, "攻:%s,防:%s,怒:%s" % (batObj.GetAtk(), batObj.GetDef(), batObj.GetXP()))
- attrStr = ""
- attrDict = batObj.GetBatAttrDict()
- attrIDList = attrDict.keys()
- attrIDList.sort()
- for attrID in attrIDList:
- attrValue = attrDict[attrID]
- if attrValue:
- attrStr += "%s=%s;" % (attrID, attrValue)
- GameWorld.DebugAnswer(curPlayer, "属性:%s" % attrStr)
- skillMgr = batObj.GetSkillManager()
- skillIDList = skillMgr.GetSkillIDList()
- GameWorld.DebugAnswer(curPlayer, "技能: %s,%s" % (len(skillIDList), skillIDList))
- buffMgr = batObj.GetBuffManager()
- GameWorld.DebugAnswer(curPlayer, "Buff: %s" % buffMgr.GetBuffCount())
- for index in range(buffMgr.GetBuffCount()):
- buff = buffMgr.GetBuffByIndex(index)
- buffName = GameWorld.CodeToGbk(buff.GetSkillData().GetSkillName())
- GameWorld.DebugAnswer(curPlayer, "ID:%s,%s(%s),回合:%s,层:%s,V:%s,来源:%s,光环:%s"
- % (buff.GetBuffID(), buffName, buff.GetSkillID(), buff.GetRemainTime(), buff.GetLayer(),
- [buff.GetValue1(), buff.GetValue2(), buff.GetValue3()], buff.GetOwnerID(), buff.GetHaloObjIDList()
- ))
-
+ __printObj(curPlayer, batObj, objName)
+
+ return
+
+def __printObj(curPlayer, batObj, objName):
+ GameWorld.DebugAnswer(curPlayer, "--- %s%s" % (objName, "" if batObj.IsAlive() else " [被击杀]"))
+ GameWorld.DebugAnswer(curPlayer, "HP:%s/%s" % (batObj.GetHP(), batObj.GetMaxHP()))
+ GameWorld.DebugAnswer(curPlayer, "攻:%s,防:%s,怒:%s" % (batObj.GetAtk(), batObj.GetDef(), batObj.GetXP()))
+ attrStr = ""
+ attrDict = batObj.GetBatAttrDict()
+ attrIDList = attrDict.keys()
+ attrIDList.sort()
+ for attrID in attrIDList:
+ attrValue = attrDict[attrID]
+ if attrValue:
+ attrStr += "%s=%s;" % (attrID, attrValue)
+ GameWorld.DebugAnswer(curPlayer, "属性:%s" % attrStr)
+ skillMgr = batObj.GetSkillManager()
+ skillIDList = skillMgr.GetSkillIDList()
+ GameWorld.DebugAnswer(curPlayer, "技能: %s,%s" % (len(skillIDList), skillIDList))
+ buffMgr = batObj.GetBuffManager()
+ GameWorld.DebugAnswer(curPlayer, "Buff: %s" % buffMgr.GetBuffCount())
+ for index in range(buffMgr.GetBuffCount()):
+ buff = buffMgr.GetBuffByIndex(index)
+ buffName = GameWorld.CodeToGbk(buff.GetSkillData().GetSkillName())
+ GameWorld.DebugAnswer(curPlayer, "ID:%s,%s(%s),回合:%s,层:%s,V:%s,来源:%s,光环:%s"
+ % (buff.GetBuffID(), buffName, buff.GetSkillID(), buff.GetRemainTime(), buff.GetLayer(),
+ [buff.GetValue1(), buff.GetValue2(), buff.GetValue3()], buff.GetOwnerID(), buff.GetHaloObjIDList()
+ ))
return
def __doFightTest(curPlayer, msgList):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py
index ebbfb19..1ca0c26 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py
@@ -102,4 +102,7 @@
if calcType == 2: # 减少,其他默认增加
attrValue = -attrValue
+ if effBuff:
+ attrValue *= max(1, effBuff.GetLayer())
+
return attrValue
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
index 3cf34db..46afd48 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -179,12 +179,15 @@
continue
buffID = buff.GetBuffID()
nowLayerCnt = buff.GetLayer()
- GameWorld.DebugLogEx(" 已经存在该buff: buffID=%s,skillTypeID=%s,ownerID=%s,buffRepeat=%s", buffID, skillTypeID, ownerID, buffRepeat)
+ GameWorld.DebugLogEx(" 已经存在该buff: buffID=%s,skillTypeID=%s,ownerID=%s,buffRepeat=%s,nowLayerCnt=%s/%s", buffID, skillTypeID, ownerID, buffRepeat, nowLayerCnt, maxLayerCnt)
resetAddTiming = False # 一般只有覆盖的才重新计算回合,视为重新添加
remainTime = buffSkill.GetLastTime()
updLayerCnt = addLayerCnt
if buffRepeat == 3: # 叠加层级
+ if maxLayerCnt and nowLayerCnt >= maxLayerCnt:
+ GameWorld.DebugLogEx(" 已达最大层数: nowLayerCnt=%s/%s", nowLayerCnt, maxLayerCnt)
+ return
updLayerCnt = nowLayerCnt + addLayerCnt
if maxLayerCnt and updLayerCnt > maxLayerCnt:
updLayerCnt = maxLayerCnt
@@ -584,9 +587,14 @@
befHP = batObj.GetHP()
befMaxHP = batObj.GetMaxHP()
+ isMingge = batObj.GetPosNum() == ChConfig.TFPosNum_Mingge
+ mgObj = None
+ if not isMingge:
+ mgObj = batObj.GetTFBatLineup().getMinggeObj()
+ mgObjID = mgObj.GetID() if mgObj else 0
batAttrDict = batObj.ResetBattleEffect()
- GameWorld.DebugLogEx("RefreshBuffAttr ID:%s,atk=%s,def=%s,hp=%s/%s,batAttrDict=%s",
- objID, batObj.GetAtk(), batObj.GetDef(), befHP, befMaxHP, batAttrDict)
+ GameWorld.DebugLogEx("RefreshBuffAttr ID:%s,atk=%s,def=%s,hp=%s/%s,isMingge=%s(%s),batAttrDict=%s",
+ objID, batObj.GetAtk(), batObj.GetDef(), befHP, befMaxHP, isMingge, mgObjID, batAttrDict)
skbufAttrDict = {}
@@ -661,11 +669,22 @@
objID = batObj.GetID()
# 先计算百分比加成或降低的
+ mgHaveAttrPer = False # 命格加成对友军有效
perIDList = ChConfig.AttrPerDict.values()
for attrID, attrPerID in ChConfig.AttrPerDict.items():
- if attrPerID not in skbufAttrDict:
+ attrPerValue = 0
+ if attrPerID in skbufAttrDict:
+ attrPerValue += skbufAttrDict[attrPerID] # 可能是负值
+ if mgObj:
+ attrPerValue += mgObj.GetBatAttrValue(attrPerID)
+ if attrPerValue:
+ GameWorld.DebugLogEx(" 命格额外加成: attrID=%s,attrPerID=%s,attrPerValue=%s", attrID, attrPerID, attrPerValue)
+ elif isMingge and attrPerValue:
+ mgHaveAttrPer = True
+ batObj.SetBatAttrValue(attrPerID, attrPerValue)
+ GameWorld.DebugLogEx(" 命格保存加成: attrID=%s,attrPerID=%s,attrPerValue=%s", attrID, attrPerID, attrPerValue)
+ if not attrPerValue:
continue
- attrPerValue = skbufAttrDict[attrPerID] # 可能是负值
attrValue = batObj.GetBatAttrValue(attrID, False)
if attrValue <= 0:
continue
@@ -697,6 +716,21 @@
batObj.SetHP(aftHP, isNotify)
GameWorld.DebugLogEx(" befHP=%s/%s, aftHP=%s/%s", befHP, befMaxHP, aftHP, aftMaxHP)
GameWorld.DebugLogEx(" 最终属性 ID:%s,atk=%s,def=%s,hp=%s/%s,%s", objID, batObj.GetAtk(), batObj.GetDef(), aftHP, aftMaxHP, batObj.GetBatAttrDict())
+
+ # 命格刷属性
+ if mgHaveAttrPer and isMingge and not isInit:
+ batLineup = batObj.GetTFBatLineup()
+ batObjMgr = BattleObj.GetBatObjMgr()
+ heroObjIDList = batLineup.getBatHeroObjIDList()
+ GameWorld.DebugLogEx("命格有加成属性同步刷新本阵容武将属性: heroObjIDList=%s", heroObjIDList)
+ for heroObjID in heroObjIDList:
+ heroObj = batObjMgr.getBatObj(heroObjID)
+ if not heroObj:
+ continue
+ if not heroObj.IsAlive():
+ continue
+ RefreshBuffAttr(heroObj)
+
return
def SyncBuffRefresh(turnFight, curBatObj, curBuff, relatedSkillID=0, isNewAdd=False):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
index d206ba3..6debe17 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -2154,6 +2154,8 @@
pmType = GetPMType(atkObj, curSkill)
ignoreDef = IsIgnoreDef(curSkill)
batType = curSkill.GetBatType()
+ atkMGObj = atkObj.GetTFBatLineup().getMinggeObj()
+ defMGObj = defObj.GetTFBatLineup().getMinggeObj()
changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtType, curSkill)
if not changeHurtType:
@@ -2185,6 +2187,8 @@
if not isDot:
aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRateDef)
dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRate)
+ if defMGObj:
+ dMissRate += defMGObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRate)
missNum = curSkill.GetTagMissNum(defID)
if dMissRate > 0:
missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
@@ -2213,7 +2217,8 @@
aSuperDamPer = IpyGameDataPY.GetFuncCfg("SuperHitCfg", 2) * 10000
aSuperDamPer += atkObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPer)
aSuperDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SuperDamPer, curSkill)
-
+ if atkMGObj:
+ aSuperDamPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPer)
dSuperDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPerDef)
if isParry:
@@ -2242,6 +2247,9 @@
aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
+ if defMGObj:
+ dFinalDamPerDef += defMGObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef)
+
#招架 - 无视攻击方最终增伤百分比
dZhaojia = defObj.GetBatAttrValue(ChConfig.AttrID_Zhaojia)
aZhaojiaDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ZhaojiaDef)
@@ -2289,6 +2297,8 @@
aDOTPer += atkObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPer)
dDOTPerDef += defObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPerDef)
GameWorld.DebugLogEx("是灼烧: aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
+ if atkMGObj:
+ aDOTPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_DOTPer)
#aAddSkillPer = 0 # 技能增伤
dBatDamPerDef = 0 # 战斗增减伤
@@ -2296,7 +2306,9 @@
aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddBatDamPerByTagLostHP, curSkill)
aBatDamPer += addBatDamPer
-
+ if atkMGObj:
+ aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkMGObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
+
# 物法增减伤
if pmType == IPY_GameWorld.ghtMag: # 法伤
aPMDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_MagDamPer)
@@ -2320,12 +2332,15 @@
if batType == ChConfig.TurnBattleType_Combo:
aComboDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_ComboDamPer)
dComboDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_ComboDamPerDef)
-
+ if atkMGObj:
+ aComboDamPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_ComboDamPer)
aPursueDamPer, dPursueDamPerDef = 0, 0 # 追击增伤
if batType == ChConfig.TurnBattleType_Pursue:
aPursueDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PursueDamPer)
dPursueDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_PursueDamPerDef)
-
+ if atkMGObj:
+ aPursueDamPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_PursueDamPer)
+
aPVPDamPer, dPVPDamPerDef = 0, 0 # PVP
if turnFight.isPVP() > 0:
aPVPDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PVPDamPer)
@@ -2929,6 +2944,12 @@
connSkillTypeID = buff.GetSkillTypeID()
damBackPer += TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_AddDamBackPerByBuffLayer, connSkillTypeID=connSkillTypeID)
+ defMGObj = defObj.GetTFBatLineup().getMinggeObj()
+ if defMGObj:
+ mgBuffMgr = defMGObj.GetBuffManager()
+ for buff in mgBuffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
+ damBackPer += buff.GetValue1() * max(1, buff.GetLayer())
+
if damBackPer <= 0:
return
@@ -2957,7 +2978,10 @@
# dot施法者已死亡不再吸血
return
+ atkMGObj = atkObj.GetTFBatLineup().getMinggeObj()
aSuckHPPer = atkObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPer)
+ if atkMGObj:
+ aSuckHPPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPer)
aCurePer = atkObj.GetBatAttrValue(ChConfig.AttrID_CurePer)
dSuckHPPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPerDef)
--
Gitblit v1.8.0