From f611ba2ca93e527c98b2d05ffefdcc21a6ed0bd1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 30 十月 2025 15:42:49 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(何太后技能;优化孙坚技能buff额外属性逻辑;增加技能计算伤害类型6-按自残血量值;增加效果7008 5021 5022;)
---
/dev/null | 67 ----------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py | 25 ++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py | 26 +++---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py | 8 +-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py | 8 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5021.py | 50 ++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 38 +++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 15 ++-
8 files changed, 149 insertions(+), 88 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
index ad21950..efea606 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -361,6 +361,7 @@
self._value2 = 0
self._value3 = 0
self._isCopy = 0 # 是否复制的buff
+ self._effExDict = {} # 效果ID额外数值 {effID:value, ...} # 计算方式取决于本buff技能中属性效果ID的配置
return
def onRelease(self):
@@ -399,6 +400,9 @@
def SetValue3(self, value): self._value3 = value
def GetIsCopy(self): return self._isCopy
def SetIsCopy(self, isCopy): self._isCopy = isCopy
+ def GetEffectValueEx(self, effID): return self._effExDict.get(effID, 0)
+ def ResetEffectValueEx(self): self._effExDict = {}
+ def AddEffectValueEx(self, effID, valueEx): self._effExDict[effID] = self._effExDict.get(effID, 0) + valueEx
class BuffManager():
## 战斗对象buff管理器
@@ -781,6 +785,7 @@
self._buffMgr = ObjPool.GetPoolMgr().acquire(BuffManager, self)
self._passiveEffMgr = ObjPool.GetPoolMgr().acquire(PassiveEffManager, self)
self._lastHurtValue = 0
+ self._harmSelfHP = 0 # 自残值
self._mainTagIDList = [] # 主技能目标ID列表,一般用于技能拆分成多个技能效果时,子技能可能会用到主技能的对象做逻辑
self._timing = 0 # 当前武将时间节点: 0-回合前;1-回合后
@@ -1017,6 +1022,9 @@
def GetLastHurtValue(self): return self._lastHurtValue
def SetLastHurtValue(self, lastHurtValue): self._lastHurtValue = lastHurtValue
+ def GetHarmSelfHP(self): return self._harmSelfHP
+ def SetHarmSelfHP(self, harmSelfHP): self._harmSelfHP = harmSelfHP
+
def GetMainTagIDList(self): return self._mainTagIDList
def SetMainTagIDList(self, mainTagIDList): self._mainTagIDList = mainTagIDList
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index ac77507..f0eb727 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -973,7 +973,8 @@
HurtType_Miss, # 闪避 9
HurtType_PoisonCureHurt, # 伤害毒奶 10
HurtType_PoisonCureSuck, # 吸血毒奶 11
-) = range(12)
+HurtType_HarmSelf, # 自残 12
+) = range(13)
#伤害类型
(
@@ -1330,7 +1331,8 @@
Def_Calc_TagMaxHP, # 目标最大生命值 3
Def_Calc_ByBuffValue, # 触发buff的buff值 4
Def_Calc_TagLostHP, # 目标已损失生命 5
-) = range(6)
+Def_Calc_HarmSelfHP, # 按本次自残耗血值 6
+) = range(7)
#治疗类型(影响公式参数)
Def_CureTypeList = (
@@ -3030,7 +3032,10 @@
BatObjState_DamBackShield, # 荆棘盾 22
BatObjState_BurnPlus, # 玄火(灼烧2) 23
BatObjState_PoisonCure, # 焚血(毒奶) 24
-) = range(1 + 24)
+ BatObjState_RebornLimit, # 无法复活 25
+ BatObjState_26, # 脆弱 26
+ BatObjState_27, # 阴咒 27
+) = range(1 + 27)
#玩家状态定义,不能超过31个,如超过,需扩展多个key支持
Def_PlayerStateList = (
@@ -4044,7 +4049,8 @@
TriggerWay_UseSkillOverOne, # 使用技能后(多目标仅触发一次)20
TriggerWay_AttackOverDirectOne, # 直接攻击后(除dot或buff外的攻击,多目标仅触发一次)21
TriggerWay_BeAnyEffect, # 受到任意效果时(除直接攻击外的任意效果,如buff、dot、治疗、额外怒技)22
-) = range(1, 1 + 22)
+TriggerWay_BuffAddByOwner, # buff添加时(施法者触发) 23
+) = range(1, 1 + 23)
# 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
@@ -4090,6 +4096,7 @@
SkillEff_MustHit = 7005 # 技能必命中
SkillEff_ActionUseInvalid = 7006 # 行动时不可释放技能(可连击、反击、追击)
SkillEff_AngerSkillNoXP = 7007 # 无论多少怒气均可释放该怒气技能
+SkillEff_UseSkillHarmSelf = 7008 # 释放技能时自残(先扣血)
(
TriggerType_BeSuperHit, # 被暴击触发技能 1
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
index cbff1bf..93c6f86 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -717,17 +717,17 @@
family = familyMgr.GetAt(index)
if not family:
continue
- familyID = family.GetID()
+ #familyID = family.GetID()
lvMin = family.GetJoinLVMin()
if lvMin and realmLV < lvMin:
- GameWorld.DebugLog(" 官职不足的不处理! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID)
+ #GameWorld.DebugLog(" 官职不足的不处理! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID)
continue
if family.GetJoinReview():
- GameWorld.DebugLog(" 需要审核的不处理! familyID=%s" % familyID, playerID)
+ #GameWorld.DebugLog(" 需要审核的不处理! familyID=%s" % familyID, playerID)
continue
MemberMax = GetFamilySetting(family.GetLV(), "MemberMax")
if family.GetCount() >= MemberMax:
- GameWorld.DebugLog(" 成员已满的不处理! familyID=%s" % familyID, playerID)
+ #GameWorld.DebugLog(" 成员已满的不处理! familyID=%s" % familyID, playerID)
continue
#直接加入
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5021.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5021.py
new file mode 100644
index 0000000..f1ae02c
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5021.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_5021
+#
+# @todo:额外增加buff效果ID/属性ID值(每击中x状态目标)
+# @author hxp
+# @date 2025-10-30
+# @version 1.0
+#
+# 详细描述: 额外增加buff效果ID/属性ID值(每击中x状态目标)
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-10-30 16:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
+ if not connSkill or not connBuff:
+ return
+
+ bySkill = connSkill.GetBySkill()
+ if not bySkill:
+ return
+
+ attrID = curEffect.GetEffectValue(0)
+ attrValue = curEffect.GetEffectValue(1)
+ checkInStateList = curEffect.GetEffectValue(2)
+ if not checkInStateList or not attrID or not attrValue:
+ return
+
+ hitCnt = 0
+ effIgnoreObjIDList = bySkill.GetEffIgnoreObjIDList()
+ tagObjList = bySkill.GetTagObjList()
+ for tagObj in tagObjList:
+ tagID = tagObj.GetID()
+ if tagID in effIgnoreObjIDList:
+ #GameWorld.DebugLog(" 闪避或免疫的目标: tagID=%s" % (tagID))
+ continue
+ if not tagObj.CheckInState(checkInStateList):
+ #GameWorld.DebugLog(" 不在状态下的目标: tagID=%s not in state:%s" % (tagID, checkInStateList))
+ continue
+ hitCnt += 1
+
+ attrValue *= hitCnt
+ connBuff.AddEffectValueEx(attrID, attrValue)
+ GameWorld.DebugLog("每击中x状态目标额外增加buff效果ID/属性ID值: hitCnt=%s,attrID=%s,attrValue=%s" % (hitCnt, attrID, attrValue))
+ return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py
new file mode 100644
index 0000000..9a62939
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_5022
+#
+# @todo:额外增加buff效果ID/属性ID值
+# @author hxp
+# @date 2025-10-30
+# @version 1.0
+#
+# 详细描述: 额外增加buff效果ID/属性ID值
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-10-30 16:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
+ attrID = curEffect.GetEffectValue(0)
+ attrValue = curEffect.GetEffectValue(1)
+ GameWorld.DebugLog("额外增加buff效果ID/属性ID值: attrID=%s,attrValue=%s" % (attrID, attrValue))
+ connBuff.AddEffectValueEx(attrID, attrValue)
+ return True
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 aa8ad4f..d101084 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -184,13 +184,13 @@
buff.SetRemainTime(buffSkill.GetLastTime())
buff.SetLayer(updLayerCnt)
buff.SetBuffValueList(buffValueList)
+ buff.ResetEffectValueEx()
if afterLogic and bySkill:
bySkill.AddAfterLogic(ChConfig.AfterLogic_AddBuff, [batObj, buff, buffOwner])
elif isSync:
SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID, isNewAdd=True)
- if nowLayerCnt != updLayerCnt:
- RefreshBuffEffect(turnFight, batObj, buff, False)
+ RefreshBuffEffect(turnFight, batObj, buff, buffSkill, buffOwner, refreshType=2)
return buff
return __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic, setLayerCnt=addLayerCnt, isSync=isSync)
@@ -223,11 +223,13 @@
elif isSync:
SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID, isNewAdd=True)
- RefreshBuffEffect(turnFight, batObj, buff, True)
+ RefreshBuffEffect(turnFight, batObj, buff, buffSkill, buffOwner, refreshType=1)
return buff
-def RefreshBuffEffect(turnFight, batObj, curBuff, isNewBuff=False):
+def RefreshBuffEffect(turnFight, batObj, curBuff, buffSkill=None, buffOwner=None, refreshType=0):
## 刷新buff效果
+ # @param buffSkill: 添加该buff时对应的buff技能ID,可能为None,如非添加时的刷新
+ # @param refreshType: 0-普通刷新;1-新添加刷新;2-覆盖刷新
isRefreshAttr = False # 是否刷属性
@@ -241,12 +243,15 @@
continue
if curEffect.GetTriggerWay():
- if curEffect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf] and isNewBuff:
+ if curEffect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf] and refreshType == 1:
passiveEffMgr.AddBuffPassiveEffect(curBuff, skillData, curEffect)
elif effectID in ChConfig.AttrIDList:
isRefreshAttr = True
+ if refreshType and buffSkill and buffOwner:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, buffOwner, ChConfig.TriggerWay_BuffAddByOwner, connSkill=buffSkill, connBuff=curBuff)
+
if isRefreshAttr:
RefreshBuffAttr(batObj)
@@ -258,7 +263,7 @@
curBuff.SetLayer(updLayer)
relatedSkillID = relatedSkill.GetSkillID() if relatedSkill else 0
SyncBuffRefresh(turnFight, batObj, curBuff, relatedSkillID)
- RefreshBuffEffect(turnFight, batObj, curBuff, False)
+ RefreshBuffEffect(turnFight, batObj, curBuff)
return
DoBuffDel(turnFight, batObj, curBuff, relatedSkill)
return
@@ -359,19 +364,14 @@
buff = buffMgr.GetBuffByIndex(index)
layer = max(1, buff.GetLayer())
skillData = buff.GetSkillData()
- atkType = skillData.GetAtkType()
- if atkType:
- callFunc = GameWorld.GetExecFunc(TurnBuffs, "BuffAtkType_%d.%s" % (atkType, "CalcBuffAttrEx"))
- if callFunc:
- callFunc(batObj, buff, skillData, layer, buffAttrDict)
-
+
for eIndex in range(skillData.GetEffectCount()):
effect = skillData.GetEffect(eIndex)
effID = effect.GetEffectID()
if effID not in ChConfig.AttrIDList:
continue
attrID = effID
- attrValue = effect.GetEffectValue(0) * layer
+ attrValue = (effect.GetEffectValue(0) + buff.GetEffectValueEx(attrID)) * layer
calcType = effect.GetEffectValue(1)
if calcType == 2: # 减少,其他默认增加
attrValue = -attrValue
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1005.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1005.py
deleted file mode 100644
index f15fd29..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1005.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package Skill.TurnBuffs.BuffAtkType_1005
-#
-# @todo:额外属性
-# @author hxp
-# @date 2025-10-27
-# @version 1.0
-#
-# 详细描述: 额外属性,效果1值配置:[击中x状态]|增加属性ID|每击中1个增加属性值
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2025-10-27 17:00"""
-#-------------------------------------------------------------------------------
-
-import GameWorld
-
-def CalcBuffValue(turnFight, attacker, defender, curSkill):
- bySkill = curSkill.GetBySkill()
- if not bySkill:
- return
-
- effect = curSkill.GetEffect(0)
- checkInStateList = effect.GetEffectValue(0)
- attrIDEx = effect.GetEffectValue(1)
- attrValueEx = effect.GetEffectValue(2)
- #GameWorld.DebugLog("BuffAtkType_1005 检查额外属性: checkInStateList=%s,attrIDEx=%s,attrValueEx=%s" % (checkInStateList, attrIDEx, attrValueEx))
- if not checkInStateList or not attrIDEx or not attrValueEx:
- return
-
- hitCnt = 0
- effIgnoreObjIDList = bySkill.GetEffIgnoreObjIDList()
- tagObjList = bySkill.GetTagObjList()
- for tagObj in tagObjList:
- tagID = tagObj.GetID()
- if tagID in effIgnoreObjIDList:
- #GameWorld.DebugLog(" 闪避或免疫的目标: tagID=%s" % (tagID))
- continue
- if not tagObj.CheckInState(checkInStateList):
- #GameWorld.DebugLog(" 不在状态下的目标: tagID=%s not in state:%s" % (tagID, checkInStateList))
- continue
- hitCnt += 1
- #GameWorld.DebugLog(" hitCnt=%s,tagID=%s" % (hitCnt, tagID))
-
- if hitCnt <= 0:
- return
-
- return [hitCnt]
-
-def CalcBuffAttrEx(batObj, buff, skillData, layer, buffAttrDict):
- ## 计算buff额外属性
- hitCnt = buff.GetValue1()
- effect = skillData.GetEffect(0)
- attrID = effect.GetEffectValue(1)
- attrValue = effect.GetEffectValue(2) * hitCnt * layer
- if not attrID or not attrValue:
- return
- calcType = effect.GetEffectValue(3)
- if calcType == 2: # 减少,其他默认增加
- attrValue = -attrValue
- buffAttrDict[attrID] = buffAttrDict.get(attrID, 0) + attrValue
- GameWorld.DebugLog(" buff额外属性: skillID=%s,hitCnt=%s,attrID=%s,attrValue=%s" % (skillData.GetSkillID(), hitCnt, attrID, attrValue))
- return
-
-
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 a1ba7d3..0f82ce0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -521,6 +521,9 @@
atkType = useSkill.GetAtkType()
GameWorld.DebugLog("__doUseSkill: curID=%s,skillID=%s,atkType=%s" % (curBatObj.GetID(), useSkill.GetSkillID(), atkType))
+
+ __doHarmSelf(turnFight, curBatObj, useSkill)
+
# 通用攻击
if atkType == 1:
SkillModule_1(turnFight, curBatObj, useSkill)
@@ -549,6 +552,36 @@
elif atkType == 9:
SkillModule_9(turnFight, curBatObj, useSkill)
+ return
+
+def __doHarmSelf(turnFight, curBatObj, useSkill):
+ harmEff = useSkill.GetEffectByID(ChConfig.SkillEff_UseSkillHarmSelf)
+ if not harmEff:
+ return
+ harmPer = harmEff.GetEffectValue(0) # 自残百分比
+ noEnoughDo = harmEff.GetEffectValue(1) # 不足时扣除方式 0-不扣;1-自杀;2-扣剩1点
+ curHP = curBatObj.GetHP()
+ maxHP = curBatObj.GetMaxHP()
+ harmHP = int(maxHP * harmPer / 100.0)
+ lostHP = harmHP
+ if curHP <= harmHP:
+ if noEnoughDo == 0:
+ lostHP = 0
+ elif noEnoughDo == 2:
+ lostHP -= 1
+
+ updHP = max(curHP - lostHP, 0)
+ curBatObj.SetHP(updHP, False)
+ GameWorld.DebugLog("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s"
+ % (curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo))
+
+ curBatObj.SetHarmSelfHP(harmHP) # 无视实际扣血量,直接更新
+
+ # 单独通知前端表现
+ hurtTypes = pow(2, ChConfig.HurtType_HarmSelf)
+ diffType, diffValue = 0, lostHP
+ skillID = relatedSkillID = useSkill.GetSkillID()
+ Sync_PropertyRefreshView(turnFight, curBatObj, ChConfig.AttrID_HP, updHP, diffValue, diffType, skillID, relatedSkillID, hurtTypes)
return
def SkillModule_1(turnFight, curBatObj, useSkill):
@@ -1400,6 +1433,7 @@
hurtTypes |= pow(2, ChConfig.HurtType_Parry)
if ignoreDef:
+ GameWorld.DebugLog("无视防御/真实伤害!")
hurtTypes |= pow(2, ChConfig.HurtType_IgnoreDef)
if isStun:
@@ -1822,6 +1856,10 @@
if byBuff:
baseValue = byBuff.GetValue1() + byBuff.GetValue2() * ChConfig.Def_PerPointValue
GameWorld.DebugLog("根据buff值: %s" % baseValue)
+ elif calcType == ChConfig.Def_Calc_HarmSelfHP:
+ baseValue = curObj.GetHarmSelfHP()
+ GameWorld.DebugLog("根据自残值: %s" % baseValue)
+
return baseValue
def DoDOTAttack(turnFight, batObj, curBuff, hurtValue, hurtTypes, **kwargs):
--
Gitblit v1.8.0