From d9820f9f7f09c14d270b4cbbe649369c043be7e4 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 16 四月 2019 20:14:45 +0800
Subject: [PATCH] 860312 关闭渠道返利
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py | 256 +++++++++++++++++++++++++++++++--------------------
1 files changed, 155 insertions(+), 101 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 2be3515..e48063b 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
@@ -288,6 +288,8 @@
#if FBLogic.DoFBOnKill_Player_ValuePrize(curPlayer, defender, tick):
__GiveKill_Player_ValuePrize(curPlayer, defender, tick)
+ NPCCommon.OnPlayerKillNPCPlayer(curPlayer, defender, tick)
+
#执行副本杀人逻辑
if FBLogic.DoFBOnKill_Player(curPlayer, defender, tick):
return
@@ -1262,7 +1264,7 @@
# Def_HurtType_SuperHit,
# Def_HurtType_Miss,
# ) = range(0, 3)
-# #类型: 0-普通 1-致命一击 2-躲闪
+# #类型: 0-普通 1-暴击 2-躲闪
#===============================================================================
## 伤害结构体类
@@ -1303,11 +1305,13 @@
ChConfig.Def_HurtType_SuperHit:[False, 0, 0],
ChConfig.Def_HurtType_Parry:[False, 0, 0],
ChConfig.Def_HurtType_Zhuxian:[False, 0, 0],
+ ChConfig.Def_HurtType_DeadlyHit:[False, 0, 0],
}
calcTypeList = []
if atkObjType == IPY_GameWorld.gotPlayer:
- calcTypeList += [ChConfig.Def_HurtType_LuckyHit, ChConfig.Def_HurtType_SuperHit, ChConfig.Def_HurtType_Zhuxian]
+ calcTypeList += [ChConfig.Def_HurtType_LuckyHit, ChConfig.Def_HurtType_SuperHit,
+ ChConfig.Def_HurtType_Zhuxian, ChConfig.Def_HurtType_DeadlyHit]
if defObjType == IPY_GameWorld.gotPlayer:
calcTypeList += [ChConfig.Def_HurtType_Parry]
# 暂时只计算玩家
@@ -1320,7 +1324,8 @@
ChConfig.Def_HurtType_LuckyHit:lambda aObj, dObj, hState:__HurtTypeHappen_LuckyHit(aObj, dObj, hState),
ChConfig.Def_HurtType_SuperHit:lambda aObj, dObj, hState:__HurtTypeHappen_SuperHit(aObj, dObj, hState),
ChConfig.Def_HurtType_Parry:lambda aObj, dObj, hState:__HurtTypeHappen_Parry(aObj, dObj, hState),
- ChConfig.Def_HurtType_Zhuxian:lambda aObj, dObj, hState:__HurtTypeHappen_Zhuxian(aObj, dObj, hState),
+ #ChConfig.Def_HurtType_Zhuxian:lambda aObj, dObj, hState:__HurtTypeHappen_Zhuxian(aObj, dObj, hState),
+ ChConfig.Def_HurtType_DeadlyHit:lambda aObj, dObj, hState:__HurtTypeHappen_Deadly(aObj, dObj, hState),
}
hadCheckList = [] # 已经处理过的伤害类型列表
@@ -1328,7 +1333,7 @@
for mutexHurtTypeList in mutexList:
curMHHappen = False # 当前互斥列表是否有触发的
for hType in mutexHurtTypeList:
- if hType not in calcTypeList:
+ if hType not in calcTypeList or hType not in happenFunc:
continue
if hType in hadCheckList:
continue
@@ -1344,7 +1349,7 @@
# 再算优先级列表里
for hType in priorityList:
- if hType not in calcTypeList:
+ if hType not in calcTypeList or hType not in happenFunc:
continue
if hType not in hadCheckList:
hadCheckList.append(hType)
@@ -1360,11 +1365,11 @@
def __HurtTypeHappen_LuckyHit(atkObj, defObj, happenState):
- ''' 判断伤害类型是否发生 - 幸运一击
- @return: 是否触发, 触发时伤害计算值, 触发时防守方的伤害减免值
+ ''' 判断伤害类型是否发生 - 会心一击
+ @return: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
'''
if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_LuckyHit):
- return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReducePer(defObj)
+ return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReduce(defObj)
aLuckyHitRate = atkObj.GetLuckyHitRate()
dLuckyHitRateReduce = PlayerControl.GetLuckyHitRateReduce(defObj)
@@ -1374,16 +1379,16 @@
if atkLuckyHitRate <= 0:
return
if GameWorld.CanHappen(atkLuckyHitRate):
- return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReducePer(defObj)
+ return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReduce(defObj)
return
def __HurtTypeHappen_SuperHit(atkObj, defObj, happenState):
''' 判断伤害类型是否发生 - 暴击
- @return: 是否触发, 触发时伤害计算值, 触发时防守方的伤害减免值
+ @return: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
'''
if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_SuperHit):
- return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReducePer(defObj)
+ return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReduce(defObj)
aSuperHitRate = atkObj.GetSuperHitRate()
dSuperHitRateReduce = PlayerControl.GetSuperHitRateReduce(defObj)
@@ -1393,7 +1398,7 @@
if superHitRate <= 0:
return
if GameWorld.CanHappen(superHitRate):
- return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReducePer(defObj)
+ return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReduce(defObj)
return
def __HurtTypeHappen_Parry(atkObj, defObj, happenState):
@@ -1407,15 +1412,22 @@
return True, 0, chanceDefPer
return
-def __HurtTypeHappen_Zhuxian(atkObj, defObj, happenState):
- """诛仙一击"""
- rate = PlayerControl.GetZhuXianRate(atkObj)
- if not rate:
- return
-
- if GameWorld.CanHappen(rate):
- return True, PlayerControl.GetZhuXianHurtPer(atkObj), 0
+#def __HurtTypeHappen_Zhuxian(atkObj, defObj, happenState):
+# """诛仙一击"""
+# rate = PlayerControl.GetZhuXianRate(atkObj)
+# if not rate:
+# return
+#
+# if GameWorld.CanHappen(rate):
+# return True, PlayerControl.GetZhuXianHurtPer(atkObj), 0
+# return
+
+# 致命一击
+def __HurtTypeHappen_Deadly(atkObj, defObj, happenState):
+ if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, None, ChConfig.TriggerType_IsDealy):
+ return True, 0, 0
return
+
def ChangeSkillHurtPer(atkObj, defObj, curSkill, skillPer):
@@ -1713,6 +1725,9 @@
elif defObj.GetType() == ChConfig.ntHelpBattleRobot:
remainHP = min(dHP, max(GameObj.GetMaxHP(defObj)/2, remainHP)) # 助战机器人剩余血量不能少于一半
GameObj.SetHP(defObj, remainHP)
+
+ elif defObj.GetType() == ChConfig.ntMonsterTime:
+ UpdateTimeMonsterHP(defObj, tick)
else:
#防守方是怪物NPC,只扣其血
@@ -1744,6 +1759,59 @@
return resultHurtType
+def UpdateTimeMonsterHP(curNPC, tick):
+ '''
+ NPC总血量 = 单人每秒掉血量*理论击杀所需时间
+ 掉血值 = 单人每秒掉血量*min(攻击人数, 最大人数)*衰减万分率/10000
+ '''
+
+ npcID = curNPC.GetNPCID()
+ ipyData = IpyGameDataPY.GetIpyGameData("NPCTimeLostHP", npcID)
+ if not ipyData:
+ return
+
+ lastLostHPTick = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_TimeLostHPTick)
+ curNPC.SetDict(ChConfig.Def_NPC_Dict_TimeLostHPTick, tick)
+ if not lastLostHPTick or tick - lastLostHPTick >= 2000:
+ passTick = 1000
+ else:
+ passTick = tick - lastLostHPTick
+
+ if passTick <= 0:
+ return
+
+ effPlayerCount = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_TimeLostHPPlayerCount)
+ refreshPlayerCountTick = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_TimeLostHPPlayerCountTick)
+ if not refreshPlayerCountTick or tick - refreshPlayerCountTick >= 3000:
+ curNPC.SetDict(ChConfig.Def_NPC_Dict_TimeLostHPPlayerCountTick, tick)
+ effPlayerCount = 0
+ for i in xrange(curNPC.GetInSightObjCount()):
+ seeObj = curNPC.GetInSightObjByIndex(i)
+ if seeObj == None :
+ continue
+ if not seeObj.GetVisible():
+ continue
+ seeObjType = seeObj.GetGameObjType()
+ if seeObjType == IPY_GameWorld.gotPlayer:
+ effPlayerCount += 1
+ curNPC.SetDict(ChConfig.Def_NPC_Dict_TimeLostHPPlayerCount, effPlayerCount)
+ #GameWorld.DebugLog("刷新影响人数: effPlayerCount=%s" % effPlayerCount)
+
+ lostHPPerSecond = ipyData.GetLostHPPerSecond()
+ maxPlayerCount = ipyData.GetMaxPlayerCount()
+ reduceRate = ipyData.GetReduceRate()
+ if effPlayerCount > 1:
+ hurtValuePerSecond = lostHPPerSecond * min(maxPlayerCount, effPlayerCount) * reduceRate / 10000.0
+ else:
+ hurtValuePerSecond = lostHPPerSecond
+ lostHPTotal = int(hurtValuePerSecond * passTick / 1000.0)
+
+ remainHP = min(GameObj.GetMaxHP(curNPC), max(0, GameObj.GetHP(curNPC) - lostHPTotal))
+ GameObj.SetHP(curNPC, remainHP, isByTime=True)
+ #GameWorld.DebugLog("怪物按时间掉血: npcID=%s,effPlayerCount=%s,hurtValuePerSecond=%s,passTick=%s,lostHPTotal=%s"
+ # % (npcID, effPlayerCount, hurtValuePerSecond, passTick, lostHPTotal))
+ return
+
# 计算伤害后,因各种buff和状态的影响处理
def CalcHurtHPWithBuff(atkObj, defObj, hurtValue, curSkill, tick):
# 优先处理神兵护盾
@@ -1761,17 +1829,14 @@
# 用于回血
findBuff.SetValue(int(findBuff.GetValue() + absortValue))
+ if defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbValue):
+ defObj.SetDict(ChConfig.Def_PlayerKey_AbsorbValue, 0) #吸收的单次伤害,单次伤害必须清空
if defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldValue):
# 麒麟护盾吸收伤害,将抵消的伤害存储
absortValue = int(defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldValue)/float(ShareDefine.Def_MaxRateValue)*hurtValue)
hurtValue -= absortValue
+ defObj.SetDict(ChConfig.Def_PlayerKey_AbsorbValue, absortValue) #吸收的单次伤害
- # 吸收至指定血量比例值
- absorbHurt = defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShield)
- if absorbHurt <= defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldMax):
- maxValue = min(absorbHurt + absortValue, defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldMax))
- defObj.SetDict(ChConfig.Def_PlayerKey_AbsorbShield, maxValue) # 记录护盾吸收的伤害用于爆炸
-
# 天罡护法,将期间受到的伤害总值用于回血,不改变伤害
curEffect, plusValue, skillID2 = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_StoreBlood)
if skillID2:
@@ -1850,7 +1915,15 @@
atkObjType = atkObj.GetGameObjType()
defObjType = defObj.GetGameObjType()
-
+ aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType) # 获取境界
+ if defObjType == IPY_GameWorld.gotNPC and ChConfig.IsGameBoss(defObj) and dRealmLV > aRealmLV:
+ if atkObjType == IPY_GameWorld.gotPlayer:
+ GameWorld.DebugLog("BossRealmHint%s-%s"%(dRealmLV, aRealmLV))
+ PlayerControl.NotifyCode(atkObj, 'BossRealmHint', [dRealmLV])
+
+ # 攻击高境界的BOSS 伤害固定为1
+ return 1, ChConfig.Def_HurtType_Normal
+
atkType = GetBattleType(atkObj, curSkill)
happenState = happenState if happenState else SkillShell.GetHappenState(curSkill)
happenState += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HappenState)
@@ -1877,11 +1950,13 @@
#当攻击方为NPC,防守方为玩家时,计算压制等级 及 压制战力
if atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer:
- if curSkill and curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_RealmSuppress:
- # 境界压制技能不对高等级境界玩家产生攻击
- aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType)
- if aRealmLV <= dRealmLV:
- return 0, ChConfig.Def_HurtType_Immune # 免疫
+ #=======================================================================
+ # if curSkill and curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_RealmSuppress:
+ # # 境界压制技能不对高等级境界玩家产生攻击
+ # aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType)
+ # if aRealmLV <= dRealmLV:
+ # return 0, ChConfig.Def_HurtType_Immune # 免疫
+ #=======================================================================
atkIsBoss = 1 if ChConfig.IsGameBoss(atkObj) else 0
if NPCCommon.GetIsLVSuppress(atkObj):
@@ -1935,7 +2010,10 @@
isSuperHit, aSuperHit, dSuperHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_SuperHit] # 暴击
dDamChanceDef = hurtTypeResultDict[ChConfig.Def_HurtType_Parry][2] # 抵御, 大于0代表触发抵御效果
isZhuxianHit, aZhuxianHurtPer, dZhuxianReducePer = hurtTypeResultDict[ChConfig.Def_HurtType_Zhuxian] # 诛仙一击
-
+ isDeadlyHit = hurtTypeResultDict[ChConfig.Def_HurtType_DeadlyHit][0] # 致命一击
+ aSuperHitPer = PlayerControl.GetSuperHitPer(atkObj) if isSuperHit else 0 # 暴击伤害加成万分率
+ aLuckyHitPer = PlayerControl.GetLuckyHitPer(atkObj) if isLuckyHit else 0 # 会心一击伤害加成万分率
+
if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_OneDamage):
return 1, hurtType
@@ -1947,9 +2025,17 @@
# 改变技能伤害
atkSkillPer, atkSkillValue = ChangeSkillHurt(atkObj, defObj, curSkill, atkSkillPer, atkSkillValue)
-
atkSkillPer = ChangeSkillHurtPer(atkObj, defObj, curSkill, atkSkillPer)
+ # --- 新增普通攻击的数值和技能攻击的数值,根据类型各自计算
+ if atkObjType == IPY_GameWorld.gotPlayer:
+ if not curSkill or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_NormalAttack:
+ atkSkillPer += float(PlayerControl.GetNormalHurtPer(atkObj))/ChConfig.Def_MaxRateValue
+ atkSkillValue += PlayerControl.GetNormalHurt(atkObj)
+ elif curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_FbPassiveSkill]:
+ atkSkillPer += float(PlayerControl.GetFabaoHurtPer(atkObj))/ChConfig.Def_MaxRateValue
+ atkSkillValue += PlayerControl.GetFabaoHurt(atkObj)
+
# atkSkillPer 包含普攻,所以不是用技能增强处理
atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer)
@@ -1974,7 +2060,7 @@
if isLuckyHit:
- # 会心一击时增加会心伤害百分比
+ # 会心一击时增加会心伤害固定值
aLuckyHit += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_LuckyHit)
aLuckyHit -= PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, curSkill, ChConfig.TriggerType_BeLuckyHitSubPer)
aLuckyHit = max(aLuckyHit, 0)
@@ -2000,10 +2086,12 @@
if atkObjType == IPY_GameWorld.gotPlayer:
aIgnoreDefRate = atkObj.GetIgnoreDefRate() # 无视防御比率
aSkillAtkRate = atkObj.GetSkillAtkRate() # 技能攻击力加成
- aDamagePer = PlayerControl.GetDamagePer(atkObj) # 外层伤害加成
+ aDamagePVP = PlayerControl.GetDamagePVP(atkObj) # PVP固定伤害
+ aDamagePVE = PlayerControl.GetDamagePVE(atkObj) # PVE固定伤害
+
# 被动技能增加伤害
- aDamagePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddDamagePer)
- aDamagePer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddDamagePer)
+ #aDamagePVP += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddDamagePer)
+ #aDamagePVP += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddDamagePer)
aNPCHurtAddPer = PlayerControl.GetNPCHurtAddPer(atkObj) # PVE伤害加成
aDamagePerPVP = PlayerControl.GetDamagePerPVP(atkObj) # 外层PVP伤害加成
@@ -2026,8 +2114,9 @@
aSkillAtkRate += atkObj.GetSkillAtkRate()
aNPCHurtAddPer = 0 # PVE伤害加成
- aDamagePer = 0 # 外层伤害加成
aDamagePerPVP = 0 # 外层PVP伤害加成
+ aDamagePVP = 0 # PVP固定伤害
+ aDamagePVE = 0 # PVE固定伤害
aFinalHurt = NPCCommon.GetFinalHurt(atkObj) # 最终固定伤害
aFightPower = NPCCommon.GetSuppressFightPower(atkObj)
@@ -2035,21 +2124,24 @@
if defObjType == IPY_GameWorld.gotPlayer:
dIgnoreDefRateReduce = PlayerControl.GetIgnoreDefRateReduce(defObj) # 无视防御比率抗性
dSkillAtkRateReduce = PlayerControl.GetSkillAtkRateReduce(defObj) # 技能攻击力减少
- dDamReduce = defObj.GetDamageReduceRate() # 外层减伤
- dDamReduce += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_DamageReduce)
+ dDamagePVPReduce = PlayerControl.GetDamagePVPReduce(defObj) # PVP固定减伤
+ #dDamReduce += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_DamageReduce)
dDamagePerPVPReduce = PlayerControl.GetDamagePerPVPReduce(defObj) # 外层PVP减伤
dDamagePerPVPReduce += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_DamageReducePVP)
dFinalHurtReduce = PlayerControl.GetFinalHurtReduce(defObj) # 最终固定伤害减少
dBeHurtPer = PlayerControl.GetBeHurtPer(defObj) # 加深受到伤害百分比
dFightPower = defObj.GetFightPower()
+ dFinalHurtReducePer = PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, curSkill, ChConfig.TriggerType_dFinalHurtReducePer)
+
else:
dIgnoreDefRateReduce = 0 # 无视防御比率抗性
dSkillAtkRateReduce = 0 # 技能攻击力减少
- dDamReduce = 0 # 外层减伤
+ dDamagePVPReduce = 0 # PVP固定减伤
dDamagePerPVPReduce = 0 # 外层PVP减伤
dFinalHurtReduce = 0 # 最终固定伤害减少
dBeHurtPer = 0
dFightPower = NPCCommon.GetSuppressFightPower(defObj)
+ dFinalHurtReducePer = 0 # 最终伤害减少百分比 默认0
#攻击字典 { 攻击类型 : '公式' }
hurtDist = ReadChConfig.GetEvalChConfig('CalcAttackValue')
@@ -2066,59 +2158,20 @@
suppressFPFormula = hurtDist[suppressFormulaKeyFP]
suppressValueFP = eval(FormulaControl.GetCompileFormula(suppressFormulaKeyFP, suppressFPFormula))
- # 境界压制百分比
- SuppressValueRealmRate = 10000 # 默认值
- suppressRealm = 0
- if atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotPlayer:
- RealmGroupList = IpyGameDataPY.GetFuncEvalCfg("RealmGroup", 1)
- aRealmLV, dRealmLV = atkObj.GetOfficialRank(), defObj.GetOfficialRank()
- aRealmGroup, dRealmGroup = 0, 0
- for g, gMaxRealmLV in enumerate(RealmGroupList, 1):
- if aRealmLV and aRealmLV <= gMaxRealmLV and not aRealmGroup:
- aRealmGroup = g
- if dRealmLV and dRealmLV <= gMaxRealmLV and not dRealmGroup:
- dRealmGroup = g
- suppressRealm = aRealmGroup - dRealmGroup
- suppressFormulaKeyRealm = "PVPSuppressValueRealm"
- if suppressFormulaKeyRealm in hurtDist:
- SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressFormulaKeyRealm, hurtDist[suppressFormulaKeyRealm])))
- #GameWorld.DebugLog("境界压制:aRealmLV=%s,dRealmLV=%s,aRealmGroup=%s,dRealmGroup=%s,SuppressValueRealmRate=%s"
- # % (aRealmLV, dRealmLV, aRealmGroup, dRealmGroup, SuppressValueRealmRate))
-
- elif atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer:
- # EVP 境界压制
- aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType)
- if aRealmLV + dRealmLV != 0:
- #有压制
- suppressRealm = aRealmLV - dRealmLV # 存在负数
- suppressRealmHurtPer = GetRealmHurtPer(aRealmLV, dRealmLV, 2) # 境界压制加成百分比,存在负数
- suppressFormulaKeyRealm = "EVPSuppressValueRealm"
- if suppressFormulaKeyRealm in hurtDist:
- SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressFormulaKeyRealm, hurtDist[suppressFormulaKeyRealm])))
-
- elif atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotNPC:
- # PVE 境界压制
- aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType)
- if aRealmLV + dRealmLV != 0:
- #有压制
- suppressRealm = aRealmLV - dRealmLV # 存在负数
- suppressRealmHurtPer = GetRealmHurtPer(aRealmLV, dRealmLV, 3) # 境界压制加成百分比,存在负数
- suppressFormulaKeyRealm = "PVESuppressValueRealm"
- if suppressFormulaKeyRealm in hurtDist:
- SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressFormulaKeyRealm, hurtDist[suppressFormulaKeyRealm])))
+ # 境界压制规则
+ # 1. 其中一方无境界等级则无效, 如普通NPC
+ # 2. 宠物和召唤兽(如水元素)有效, 取主人
+ # 3. 玩家地境界低于BOSS则伤害固定为1 (在函数入口处已处理)
+ # 4. 其他情况统一境界压制 境界差*2%
+ if aRealmLV == 0 or dRealmLV == 0:
+ SuppressValueRealmRate = 10000
+ else:
+ SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula("SuppressValueRealm", hurtDist["SuppressValueRealm"])))
# 骑宠争夺最终伤害衰减
if defObjType == IPY_GameWorld.gotNPC and FamilyRobBoss.IsHorsePetRobBoss(defObj.GetNPCID()):
- ownerPlayer = None
- # 召唤兽和宠物需要从人物获取状态
- if atkObj.GetGameObjType() == IPY_GameWorld.gotNPC:
- if atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
- ownerPlayer = PetControl.GetPetOwner(atkObj)
- elif atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotSummon:
- ownerPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, atkObj)
- else:
- ownerPlayer = atkObj
+ ownerPlayer, npcObjType = GetAttackPlayer(atkObj)
if ownerPlayer:
findBuff = SkillCommon.FindBuffByID(ownerPlayer, ChConfig.Def_SkillID_HorsePetRobBossKillCntBuff)[0]
@@ -2183,14 +2236,20 @@
# 获取双方境界值
def GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType):
if atkObjType == IPY_GameWorld.gotNPC:
- aRealmLV = NPCCommon.GetRealmLV(atkObj)
- if aRealmLV == 0:
- # 0代表不要压制
- return 0, 0
+ ownerPlayer, npcObjType = GetAttackPlayer(atkObj)
+ if ownerPlayer:
+ # 召唤兽和宠物取主人境界,可以是攻击方需提取
+ aRealmLV = ownerPlayer.GetOfficialRank()
+ else:
+ aRealmLV = NPCCommon.GetRealmLV(atkObj)
+ if aRealmLV == 0:
+ # 0代表不要压制
+ return 0, 0
else:
aRealmLV = atkObj.GetOfficialRank()
if defObjType == IPY_GameWorld.gotNPC:
+ # 召唤兽和宠物取主人境界,但是宠物和人物召唤兽不可被攻击,故不需要
dRealmLV = NPCCommon.GetRealmLV(defObj)
if dRealmLV == 0:
# 0代表不要压制
@@ -2517,6 +2576,7 @@
1 全体模式 IPY_GameWorld.amAll 对所有玩家都是敌对,家族区域同盟玩家除外
2 防卫模式 IPY_GameWorld.amCountry 本服玩家友好,他服玩家都是敌对
5 强制模式 IPY_GameWorld.amFamily 队友、仙盟成员、同阵营友好,其他玩家敌对
+ 7 锁定单一目标模式 IPY_GameWorld.amContest 只对选中目标有伤害, 目前只用于部分BOSS争夺地图
场景区域
普通区域 IPY_GameWorld.gatNormal 可根据不同PK模式PK,击杀玩家有惩罚
@@ -2557,12 +2617,6 @@
if GetIsNewGuy(tagPlayer):
return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_NotAttackNewGuy
-
- #攻守双方同一队伍,不可PK,可加增益buff
- #if curPlayerAreaType not in [ShareDefine.gatManor] and CanAlikeTeam(curPlayer, tagPlayer):
- # #副本队友特殊判断
- # if not PlayerCanAttackTeamerInFB(curPlayer, tagPlayer):
- # return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_NotAttackTeam
#恶意攻击的玩家默认都是敌人, 无论什么模式
if IsMaliciousAttackPlayer(curPlayer, tagPlayer):
--
Gitblit v1.8.0