From 2560077959fd4d841ce35cb65e2367e568b3b08b Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 19 一月 2024 17:26:02 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(调整闪避公式计算方式;灵宠及反击必命中;普攻暴击后可触发被动;调整击晕优先级提前到其他被动触发前;NPC新增触发被动方式;) 1. 调整闪避公式计算方式,改为是否闪避,简化公式; 2. 增加灵宠及反击必命中;部分触发类伤害技能可通过技能ExAttr2配置必命中; 3. 普攻暴击后可触发被动; 4. 调整击晕优先级提前到反击和其他被动触发前;不然可能导致被攻击方先触发了反击或某些被动后再被击晕;最大击晕概率配置由6000调整为9000; 5. NPC支持被击、闪避、击晕、暴击、连击、反击前、反击后可触发被动; 6. 回血量增加支持按已损失血量百分比恢复;
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py | 4 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py | 11 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py | 65 +++++++++++----
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py | 52 +++++-------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py | 38 +++++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py | 6 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py | 30 ++++---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 9 +
9 files changed, 141 insertions(+), 76 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index 4249d16..96ac4d5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -2066,12 +2066,12 @@
if curSkill and atkObjType == IPY_GameWorld.gotPlayer and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_NormalAttack:
aHit = aHit*IpyGameDataPY.GetFuncCfg("FightHappenRate", 2)
- aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
- aHitSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HitSuccess)
+ #aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
+ #aHitSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HitSuccess)
dMiss = GameObj.GetMissRate(defObj)#defObj.GetMiss()
dMiss += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissPer)
- dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0
- dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)
+ #dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0
+ #dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)
skillID = curSkill.GetSkillID() if curSkill else 0
@@ -2101,6 +2101,7 @@
if suppressNPCFightPower:
suppressFightPower = max(0, suppressNPCFightPower - PlayerControl.GetFightPower(defObj))
+ turnFightTimeline = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline)
mustHit = False
petNPCOwner = None
helpBattleFormatKey = ""
@@ -2118,11 +2119,18 @@
helpBattleFormatKey = "HelpRobot_Def"
if atkObjType == IPY_GameWorld.gotNPC and PetControl.IsPetNPC(atkObj):
mustHit = True
+ GameWorld.DebugLog(" 灵宠必命中")
petNPCOwner = PetControl.GetPetNPCOwner(atkObj)
+ if turnFightTimeline:
+ if atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType) == ChConfig.TurnBattleType_AtkBack:
+ mustHit = True
+ GameWorld.DebugLog(" 反击必命中: atkID=%s,defID=%s" % (atkObj.GetID(), defObj.GetID()))
+ if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn):
+ mustHit = True
+ GameWorld.DebugLog(" 技能必命中: skillID=%s" % skillID)
#命中公式 攻击方类型不同,公式不同
- hitFormula = ReadChConfig.GetChConfig('CalcCanHit')
-
+ missRateFormula = ReadChConfig.GetChConfig('CalcCanHit')
if not mustHit and not PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill,
ChConfig.TriggerType_Buff_MustBeHit):
# 技能对指定BOSS无效果的返回MISS
@@ -2135,12 +2143,10 @@
GameObj.GetPyPlayerState(defObj, ChConfig.Def_PlayerState_MissSneerAtk):
return 0, ChConfig.Def_HurtType_Miss
- #添加是否必命中
- if not IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn) \
- and eval(hitFormula) < 0:
+ missRate = eval(missRateFormula)
+ if GameWorld.CanHappen(missRate):
return 0, ChConfig.Def_HurtType_Miss
-
-
+
hurtType, hurtTypeResultDict = CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState, curSkill)
#GameWorld.DebugLog("GetHurtHP hurtType=%s, hurtTypeResultDict=%s" % (hurtType, hurtTypeResultDict))
isLuckyHit, aLuckyHit, dLuckyHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_LuckyHit] # 幸运一击
@@ -2365,7 +2371,7 @@
hurtFormulaKey = helpBattleFormatKey
# 回合战斗
- if atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
+ if turnFightTimeline:
hurtFormulaKey = "TurnFight"
if hurtFormulaKey not in hurtDist:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
index f3a4525..9903f9f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
@@ -1264,7 +1264,7 @@
__DoPlayerBeAttacked(attacker, defender, curSkill, tick)
elif defenderType == IPY_GameWorld.gotNPC:
- __DoNPCBeAttacked(defender, curSkill, tick)
+ __DoNPCBeAttacked(attacker, defender, curSkill, tick)
else:
GameWorld.Log("被攻击错误 : %d " % defender.GetGameObjType())
@@ -1591,23 +1591,15 @@
# 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
-def OnHurtTypeTriggerSkill(attacker, target, curSkill, tick):
+def OnHurtTypeTriggerSkill(attacker, target, curSkill, skillHurtLists, tick):
usePassiveSkillResult = True # 第一次判断不能调用,即代表都不可用无需循环
usePassiveSkillResultOnSuperHit = True # 暴击对象1V1触发,第一次判断不能调用,即代表都不可用无需循环
-
- skillHurtLists = [] # 内部触发清除g_skillHurtList
- for i in xrange(g_skillHurtList.GetHurtCount()):
- hurtObj = g_skillHurtList.GetHurtAt(i)
- if not hurtObj:
- continue
-
- skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()])
#命中个数记录特殊处理
PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, target, curSkill, ChConfig.TriggerType_HitValue)
# #持续攻击类BUFF 类剑刃风暴是先给自身一个持续性buff,这一次不算伤害不可触发
- if curSkill and ChConfig.Def_SkillType_LstPlsBuffAtk != curSkill.GetSkillType():
+ if not curSkill or (curSkill and ChConfig.Def_SkillType_LstPlsBuffAtk != curSkill.GetSkillType()):
#只对第一目标造成某伤害类型时触发技能, 需先存储 skillHurtLists
OnHurtTypeTriggerSkillFirstObj(attacker, curSkill, tick)
@@ -1664,8 +1656,41 @@
# 技能使用结束,在处理技能逻辑和通知封包之后调用
def UseSkillOver(attacker, defender, curSkill, tick):
+ defHurtType = 0
+ atkID = attacker.GetID()
+ defID = defender.GetID() if defender else 0
+ skillHurtLists = [] # 内部触发清除g_skillHurtList
+ for i in xrange(g_skillHurtList.GetHurtCount()):
+ hurtObj = g_skillHurtList.GetHurtAt(i)
+ if not hurtObj:
+ continue
+ skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()])
+ if defID == hurtObj.GetObjID():
+ defHurtType = hurtObj.GetAttackType()
+
+ isAtkSkill = (not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PassiveSkillWithSP)
+ # 优先处理击晕
+ if isAtkSkill:
+ if defHurtType != ChConfig.Def_HurtType_Miss: # 非闪避才可触发
+ AttackFaintRate(attacker, defender, curSkill, tick)
+
+ # 回合制下
+ turnBattleType = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
+ if turnBattleType:
+ attacker.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 直接重置,不然后续触发逻辑可能被视为连击
+ if turnBattleType == ChConfig.TurnBattleType_Combo:
+ comboNum = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1
+ attacker.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum)
+ GameWorld.DebugLog(" 连击: atkID=%s,comboNum=%s" % (atkID, comboNum))
+ PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_Combo, tick)
+ elif turnBattleType == ChConfig.TurnBattleType_AtkBack:
+ atkBackNum = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1
+ attacker.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum)
+ GameWorld.DebugLog(" 反击: atkID=%s,atkBackNum=%s" % (atkID, atkBackNum))
+ PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AtkBackAft, tick)
+
# 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
- OnHurtTypeTriggerSkill(attacker, defender, curSkill, tick)
+ OnHurtTypeTriggerSkill(attacker, defender, curSkill, skillHurtLists, tick)
# 普通或者可以主动释放的攻击性技能
if not curSkill or (curSkill.GetSkillType() == ChConfig.Def_SkillType_Atk and\
@@ -1676,14 +1701,13 @@
PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_Buff_AttackSubLayer, tick)
# 普攻和对敌技能, 此处暂且特殊处理Def_SkillFuncType_PassiveSkillWithSP,待优化
- if not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PassiveSkillWithSP:
+ if isAtkSkill:
PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick)
PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick)
# TriggerType_AttackOver 和 TriggerType_AttackOverPassive 根据触发的被动buff效果顺序而定
PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOverPassive, tick)
- AttackFaintRate(attacker, defender, curSkill, tick)
else:
PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SkillOverNoAttack, tick)
@@ -1740,11 +1764,11 @@
lastTick = attacker.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintCD)
remainTick = faintCD - (tick - lastTick)
if remainTick > 0:
- GameWorld.DebugLog("击晕CD中! rate=%s,剩余tick=%s" % (rate, remainTick), attacker.GetID())
+ GameWorld.DebugLog(" 击晕CD中! rate=%s,剩余tick=%s,atkID=%s" % (rate, remainTick, attacker.GetID()))
return
attacker.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, tick)
- GameWorld.DebugLog("可触发击晕! rate=%s,tagID=%s" % (rate, defender.GetID()), attacker.GetID())
- SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick)
+ GameWorld.DebugLog(" 可触发击晕! rate=%s,atkID=%s,defID=%s" % (rate, attacker.GetID(), defender.GetID()))
+ SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick, buffOwner=attacker)
return
@@ -1985,7 +2009,7 @@
# @param tick 当前时间
# @return None
# @remarks 函数详细说明.
-def __DoNPCBeAttacked(curNPC, curSkill, tick):
+def __DoNPCBeAttacked(attacker, curNPC, curSkill, tick):
#NPC已经死亡
if GameObj.GetHP(curNPC) <= 0:
return
@@ -2004,6 +2028,11 @@
# 被击添加不让主动移动,应用AI1
if curNPC.GetIsBoss() == 0:
curNPC.SetDict("NPCBeAttackedAI1", tick)
+
+ # 回合制下NPC被击可触发
+ if (not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List) and curNPC.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
+ PassiveBuffEffMng.OnPassiveSkillTrigger(curNPC, attacker, None, ChConfig.TriggerType_BeAttackOver, tick)
+
return
# 客户端搜索对象的链式攻击
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 94ee677..09f657b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -264,7 +264,7 @@
tagObjID = tagGameObj.GetID()
tagHP = GameObj.GetHP(tagGameObj)
- GameWorld.DebugLog(" ★回合%s.%s %s 行动 : objType-ID-HP(%s-%s-%s),curAtk=%s, tagType-ID-HP(%s-%s-%s)"
+ GameWorld.DebugLog("★回合%s.%s %s 行动 : objType-ID-HP(%s-%s-%s),curAtk=%s, tagType-ID-HP(%s-%s-%s)"
% (turnNum, actionNum, objName, objType, objID, curHP, gameObj.GetMaxAtk(), tagObjType, tagObjID, tagHP))
if not DoAttack(gameObj, tagGameObj, tick):
@@ -708,31 +708,26 @@
% (curObj.GetID(), tagObj.GetID(), skillID, hurtType, hurtValue, totalHurt, GameObj.GetHP(tagObj)))
return
-def DoAttack(curObj, tagObj, tick):
+def DoAttack(curObj, tagObj, tick, turnBattleType=ChConfig.TurnBattleType_Normal):
curID = curObj.GetID()
tagID = tagObj.GetID()
+ objName = GetObjName(curObj)
+ GameWorld.DebugLog(" ● %s DoAttack: curID=%s,tagID=%s,turnBattleType=%s" % (objName, curID, tagID, turnBattleType))
+ if turnBattleType == ChConfig.TurnBattleType_AtkBack:
+ PassiveBuffEffMng.OnPassiveSkillTrigger(curObj, tagObj, None, ChConfig.TriggerType_AtkBackBef, tick)
+
+ curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, turnBattleType)
if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
atkOK = PlayerAttack(curObj, tagObj, tick)
elif curObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID):
atkOK = PlayerMirrorAttack(curObj, tagObj, tick)
else:
atkOK = NPCAttack(curObj, tagObj, tick)
-
- turnBattleType = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 无论攻击成功与否都重置战斗类型
if not atkOK:
return
- if turnBattleType == ChConfig.TurnBattleType_Combo:
- comboNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1
- curObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum)
- GameWorld.DebugLog(" 连击: comboID=%s,comboNum=%s" % (curID, comboNum))
- elif turnBattleType == ChConfig.TurnBattleType_AtkBack:
- atkBackNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1
- curObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum)
- GameWorld.DebugLog(" 反击: atkBackID=%s,atkBackNum=%s" % (curID, atkBackNum))
-
curHP = GameObj.GetHP(curObj)
tagHP = GameObj.GetHP(tagObj)
GameWorld.DebugLog(" curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, curHP, tagID, tagHP))
@@ -741,12 +736,12 @@
# 反击,反击可打断连击,所以优先判断
if CanAtkBack(curObj, tagObj):
- DoAttack(tagObj, curObj, tick)
+ DoAttack(tagObj, curObj, tick, ChConfig.TurnBattleType_AtkBack)
return True
# 连击
if CanCombo(curObj, tagObj):
- DoAttack(curObj, tagObj, tick)
+ DoAttack(curObj, tagObj, tick, ChConfig.TurnBattleType_Combo)
return True
@@ -773,7 +768,6 @@
return False
GameWorld.DebugLog(" 可以反击: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)"
% (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate))
- defObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_AtkBack)
return True
def CanCombo(atkObj, defObj):
@@ -797,7 +791,6 @@
return False
GameWorld.DebugLog(" 可以连击: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)"
% (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce))
- atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_Combo)
return True
def NPCAttack(curObj, tagObj, tick):
@@ -805,7 +798,6 @@
if not curObj:
return
- objName = "● %s" % GetObjName(curObj)
#有值代表灵宠上阵位置,判断是否有概率攻击
fightPlaceNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
if fightPlaceNum > 0:
@@ -833,18 +825,17 @@
#普通攻击
atkOK = BaseAttack.Attack(curObj, tagObj, None, tick)
if atkOK:
- GameWorld.DebugLog(" %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
+ GameWorld.DebugLog(" 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
else:
- GameWorld.DebugLog(" %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
+ GameWorld.DebugLog(" 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
else:
- GameWorld.DebugLog(" %s 技能攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK))
+ GameWorld.DebugLog(" 技能攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
return atkOK
def PlayerMirrorAttack(playerNPC, tagObj, tick):
## 玩家镜像攻击
playerID = playerNPC.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID)
- objName = "● %s" % GetObjName(playerNPC)
tagObjID = tagObj.GetID()
autoUseSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {})
@@ -865,17 +856,17 @@
continue
if not AICommon.DoNPCUseSkill(playerNPC, tagObj, curSkill, tagDist, tick):
- GameWorld.DebugLog(" %s 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
+ GameWorld.DebugLog(" 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
continue
- GameWorld.DebugLog(" %s 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
+ GameWorld.DebugLog(" 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
return skillID
#普通攻击
atkOK = BaseAttack.Attack(playerNPC, tagObj, None, tick)
if atkOK:
- GameWorld.DebugLog(" %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
+ GameWorld.DebugLog(" 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
else:
- GameWorld.DebugLog(" %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
+ GameWorld.DebugLog(" 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
return atkOK
@@ -887,7 +878,6 @@
posX, posY = tagPosX, tagPosY = curPlayer.GetPosX(), curPlayer.GetPosY()
tagObjType, tagObjID = tagObj.GetGameObjType(), tagObj.GetID()
- objName = "● %s" % GetObjName(curPlayer)
curPlayer.ClearUseSkillRec()
curPlayer.SetAttackTargetPos(posX, posY)
curPlayer.SetUseSkillPosX(tagPosX)
@@ -917,10 +907,10 @@
curPlayer.SetUseSkill(curSkill.GetSkillData())
useSkillData = curPlayer.GetUseSkill()
if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick):
- GameWorld.DebugLog(" %s 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
+ GameWorld.DebugLog(" 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
continue
useSkillResult = True
- GameWorld.DebugLog(" %s 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID))
+ GameWorld.DebugLog(" 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
break
@@ -931,9 +921,9 @@
atkOK = BaseAttack.Attack(curPlayer, tagObj, None, tick)
if atkOK:
useSkillResult = True
- GameWorld.DebugLog(" %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
+ GameWorld.DebugLog(" 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
else:
- GameWorld.DebugLog(" %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
+ GameWorld.DebugLog(" 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
return useSkillResult
def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0, msg=""):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 1209e91..24c6030 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1194,7 +1194,8 @@
Def_Cure_HurtValue, # 伤害值 4
Def_Cure_TagMaxHP, # 目标最大生命值 5
Def_Cure_TagAtk, # 目标攻击力 6
-) = range(7)
+Def_Cure_LostHP, # 已损失生命 7
+) = range(8)
#回魔类型(影响公式参数)
Def_RestoreTypeList = (
@@ -5090,7 +5091,11 @@
TriggerType_HitValue, # 记录命中个数 89
TriggerType_ChangeSkillEff, # 改变技能特效广播 90
TriggerType_TurnNum, # 回合触发 91
-) = range(1, 92)
+TriggerType_Faint, # 击晕触发 92
+TriggerType_Combo, # 连击触发 93
+TriggerType_AtkBackBef, # 反击前触发 94
+TriggerType_AtkBackAft, # 反击后触发 95
+) = range(1, 96)
#不可以佩戴翅膀的地图
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
index 78245d1..2f41f42 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -152,13 +152,6 @@
gameObj.SetDict(ChConfig.Def_PlayerKey_CurState, 0)
return
-def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)
-def SetPetDamPer(gameObj, value):
- gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)
- if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
- PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetDamPer, value)
- return
-
def GetLastHurtValue(gameObj):
## 最后一击伤害值
hurt = gameObj.GetDictByKey(ChConfig.Def_PlayerKey_LastHurtValue)
@@ -179,6 +172,37 @@
gameObj.SetDict(ChConfig.Def_PlayerKey_BloodShiledHurtEx, value / ShareDefine.Def_PerPointValue)
return
+## ---------------------------------------------------------
+def ClearBattleEffect(gameObj):
+ gameObj.ClearBattleEffect()
+ # 其他py层自定义战斗属性,由于EffGetSet中不是所有属性接口均通用,固这里先手动调用
+ SetPetDamPer(gameObj, 0)
+ SetFinalHurtPer(gameObj, 0)
+ SetFinalHurtReducePer(gameObj, 0)
+ SetAtkSpeed(gameObj, 0)
+ SetSuperHitRateReduce(gameObj, 0)
+ SetSuperHitReduce(gameObj, 0)
+ SetFaintRate(gameObj, 0)
+ SetFaintDefRate(gameObj, 0)
+ SetComboRate(gameObj, 0)
+ SetComboDefRate(gameObj, 0)
+ SetComboDamPer(gameObj, 0)
+ SetAtkBackRate(gameObj, 0)
+ SetAtkBackDefRate(gameObj, 0)
+ SetSuckHPPer(gameObj, 0)
+ SetSuckHPDefPer(gameObj, 0)
+ SetAtkBackHP(gameObj, 0)
+ SetCurePer(gameObj, 0)
+ SetCureDefPer(gameObj, 0)
+ return
+
+def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)
+def SetPetDamPer(gameObj, value):
+ gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)
+ if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+ PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetDamPer, value)
+ return
+
def GetFinalHurtPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_FinalHurtPer)
def SetFinalHurtPer(gameObj, value):
## 最终伤害百分比
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 9e9374d..240cb37 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -4109,7 +4109,7 @@
curNPC = self.__Instance
maxHPBef = GameObj.GetMaxHP(curNPC)
#清空NPC战斗属性
- curNPC.ClearBattleEffect()
+ GameObj.ClearBattleEffect(curNPC)
#--------------------------------------------
#重置NPC战斗属性
curNPC.ResetNPCBattleState()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
index eea964f..66117f9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
@@ -440,7 +440,12 @@
# 暂且特殊处理控制类buff才触发
if SkillCommon.GetBuffType(curSkill) == IPY_GameWorld.bfActionBuff:
PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(curObj, buffOwner, curSkill, ChConfig.TriggerType_AddBuffOver, False)
-
+
+ # 击晕触发
+ if curSkill.GetSkillTypeID() == ChConfig.Def_SkillID_AtkerFaint:
+ GameWorld.DebugLog(" 被击晕: curID=%s,atkID=%s" % (curObj.GetID(), buffOwner.GetID()))
+ PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, None, ChConfig.TriggerType_Faint, tick)
+
#是否是持续性技能
isLstSkill = curSkill.GetSkillType() in ChConfig.Def_LstBuff_List
@@ -712,8 +717,8 @@
remainTime = curBuffRemainTime
if passTurnNum > 0: # 最小单位1回合,有满1回合才减时长
remainTime = curBuffRemainTime - ChConfig.Def_PerTurnTick * passTurnNum
- GameWorld.DebugLog(" 刷新回合buff时间: objID=%s,skillID=%s,remainTime=%s,calcTick=%s,timeline=%s,passTurnNum=%s"
- % (curObj.GetID(), curSkill.GetSkillID(), remainTime, calcTick, turnFightTimeline, passTurnNum))
+ GameWorld.DebugLog(" 刷新回合buff时间: objID=%s,skillID=%s(%s),layer=%s,remainTime=%s,calcTick=%s,timeline=%s,passTurnNum=%s"
+ % (curObj.GetID(), curSkill.GetSkillID(), curSkill.GetSkillName(), curBuff.GetLayer(), remainTime, calcTick, turnFightTimeline, passTurnNum))
curBuff.SetCalcStartTick(turnFightTimeline)
curBuff.SetRemainTime(remainTime)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
index 82737c0..319816a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
@@ -1670,7 +1670,7 @@
# @param skillLV 技能等级
# @return None or True
# @remarks 函数详细说明.
-def AddBuffBySkillType(curObj , skillType , tick , skillLV=None):
+def AddBuffBySkillType(curObj , skillType , tick , skillLV=None, buffOwner=None):
curSkill = None
if skillLV == None :
@@ -1700,7 +1700,7 @@
# GameWorld.ErrLog("SkillBuff_AddBuffValue.AddBuffValue")
#===========================================================================
- return BuffSkill.DoAddBuff(curObj , buffType, curSkill , tick, [addBuffValue])
+ return BuffSkill.DoAddBuff(curObj , buffType, curSkill , tick, [addBuffValue], buffOwner)
## 查找技能并添加buff(不刷新)
@@ -2235,6 +2235,8 @@
cureBaseValue = 0 if not tagObj else GameObj.GetMaxHP(tagObj)
elif cureType == ChConfig.Def_Cure_TagAtk:
cureBaseValue = 0 if not tagObj else GetCureBaseValue(tagObj, curSkill)
+ elif cureType == ChConfig.Def_Cure_LostHP:
+ cureBaseValue = max(0, GameObj.GetMaxHP(userObj) - GameObj.GetHP(userObj))
#这边写死了效果1,基本已经定型
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
index 9f6f1b9..c081357 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -435,7 +435,11 @@
4109:ChConfig.TriggerType_SkillValue, # 增加技能伤害固定值 82
4110:ChConfig.TriggerType_ChangeSkillEff, # 改变技能特效
4111:ChConfig.TriggerType_AttackOver, # 攻击(对敌技能)后被动技能被触发 4
+ 4112:ChConfig.TriggerType_Faint, # 击晕触发 92
5000:ChConfig.TriggerType_TurnNum, # 回合触发 91
+ 5001:ChConfig.TriggerType_Combo, # 连击触发 93
+ 5002:ChConfig.TriggerType_AtkBackBef, # 反击前触发 94
+ 5003:ChConfig.TriggerType_AtkBackAft, # 反击后触发 95
}
return tdict.get(effectID, -1)
#===========================================================================
--
Gitblit v1.8.0