PlayerFightQJ4.lua 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. local LastAttakedByMonster = "@上次被怪物攻击的变量"
  2. local HurtTypeDefKeys = {
  3. YI_BAN = "YI_BAN",
  4. ZHUO_YUE = "ZHUO_YUE",
  5. XING_YUN = "XING_YUN",
  6. WU_SHI = "WU_SHI",
  7. SHUANG_BEI = "SHUANG_BEI"
  8. }
  9. FightDamageTypeCache = {}
  10. local this = {}
  11. local FightLog = {}
  12. function excusefightdamage(actor, paramMapList)
  13. local fightResults = {}
  14. for _, paramMap in pairs(paramMapList) do
  15. local fightResultList = this.ExcuseFightDamage(actor, paramMap)
  16. for _, fightResult in pairs(fightResultList) do
  17. fightResult["target"] = paramMap["target"]
  18. table.insert(fightResults, fightResult)
  19. end
  20. end
  21. if table.count(paramMapList) > 0 then
  22. this.AttackPassiveSkill(actor, paramMapList)
  23. end
  24. return fightResults
  25. end
  26. -- 被动技能
  27. function this.AttackPassiveSkill(actor, paramMapList)
  28. local selfType = getbaseinfo(actor, "mapobjecttype")
  29. if selfType ~= MapObjectType.PLAYER then
  30. return
  31. end
  32. local targetList = {}
  33. local skillId = paramMapList[1].skillid
  34. local skillLevel = paramMapList[1].skilllevel
  35. for _, paramMap in pairs(paramMapList) do
  36. table.insert(targetList, paramMap["target"])
  37. end
  38. PassiveSkill.RoleAttack(actor, targetList, skillId, skillLevel)
  39. end
  40. function this.IsSelfPet(actor, target)
  41. if actor == nil or target == nil then
  42. return false
  43. end
  44. local selfType = getbaseinfo(actor, "mapobjecttype")
  45. local targetType = getbaseinfo(target, "mapobjecttype")
  46. if selfType ~= MapObjectType.PLAYER then
  47. return false
  48. end
  49. if targetType ~= MapObjectType.PET then
  50. return false
  51. end
  52. local masterId = getbaseinfo(target, "master")
  53. local id = getbaseinfo(actor, "id")
  54. if masterId ~= id then
  55. return false
  56. end
  57. return true
  58. end
  59. function this.logTargetAttrInfo(targetActor)
  60. if targetActor == nil then
  61. return
  62. end
  63. local targetAttrInfo = getallattrinfo(targetActor)
  64. if targetAttrInfo == nil then
  65. return
  66. end
  67. local logText = ""
  68. for k, v in pairs(targetAttrInfo) do
  69. local attrId = tonumber(k)
  70. local attrValue = tonumber(v)
  71. if attrValue ~= 0 then
  72. local attrName = ConfigDataManager.getTableValue("cfg_att_info", "attribute", "id", attrId)
  73. if not string.isNullOrEmpty(logText) then
  74. logText = logText .. ","
  75. end
  76. logText = logText .. attrName .. "=" .. attrValue
  77. end
  78. end
  79. if not string.isNullOrEmpty(logText) then
  80. local name = getbaseinfo(targetActor, "rolename")
  81. logText = "攻击目标=" .. name .. ",目标属性【" .. logText .. "】"
  82. end
  83. fightlog(logText)
  84. end
  85. function this.ExcuseFightDamage(actor, paramMap)
  86. --fixme 异步问题,lua队列任务执行时,地图可能已经被销毁
  87. if not mapexists(actor) then
  88. info(actor:toString() .. "执行战斗脚本时,原地图已经被销毁")
  89. return this.BuildFightResult(0, 0, 0, 0, 108, 1)
  90. end
  91. --fightlog("\n==========================================\n战斗日志\n==========================================")
  92. this.initData(paramMap)
  93. local castType = paramMap["castertype"]
  94. local targetType = paramMap["targettype"]
  95. local target = paramMap["target"]
  96. if this.IsSelfPet(actor, target) then
  97. fightlog("攻击自己的召唤兽无效")
  98. local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  99. return { result }
  100. end
  101. this.logTargetAttrInfo(target)
  102. if this.CanHit(paramMap) == false then
  103. local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  104. return { result }
  105. end
  106. if this.CheckPKCanHurt(paramMap) == false then
  107. fightlog("pk值较高,无法对玩家造成伤害")
  108. local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  109. return { result }
  110. end
  111. -- 攻城战是否可以攻击
  112. if not RolandSeige.CanAttackRolandWall(actor, target, castType, targetType) then
  113. local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  114. return { result }
  115. end
  116. local originDamage
  117. local elementalDamage = 0
  118. local elementalType
  119. if castType == MapObjectType.PLAYER or castType == MapObjectType.PET then
  120. --攻击者是玩家或者宠物
  121. originDamage = this.PlayerCastDamage(actor, paramMap)
  122. -- 元素伤害
  123. elementalDamage, elementalType = this.ElementalHurt(paramMap)
  124. elseif castType == 2 then
  125. --攻击者是怪物
  126. originDamage = this.MonsterCastDamage(actor, paramMap)
  127. else
  128. error("this.ExcuseFightDamage=>不存在的攻击者类型", castType)
  129. local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  130. return { result }
  131. end
  132. originDamage = EquipGem.handleGemAttrs(actor, target, originDamage, castType, targetType)
  133. originDamage = this.handleHuolong(paramMap, originDamage)
  134. originDamage = this.noviceProtect(paramMap, originDamage)
  135. if originDamage == 0 then
  136. local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  137. return { result }
  138. end
  139. local originDamage, repeatl = this.getRepeatInfo(paramMap, originDamage)
  140. -- 副本修正伤害
  141. originDamage = this.DupFixDamage(originDamage, paramMap)
  142. elementalDamage = this.DupFixDamage(elementalDamage, paramMap)
  143. -- 反伤
  144. local casterHurt = this.ReflexDamage(paramMap, originDamage + elementalDamage)
  145. this.AfterCalcuDamage(paramMap, originDamage + elementalDamage)
  146. this.RecoverHP(paramMap, originDamage + elementalDamage)
  147. local resultList = {}
  148. local result = {}
  149. local isComboSkill = Skill.isComboSkill(actor, tonumber(paramMap["skillid"]))
  150. if isComboSkill then
  151. result = this.BuildFightResult(casterHurt, originDamage, 0, 0, 301, repeatl, isComboSkill)
  152. elseif TransferCard.GetCurrentTransfermation(actor) > 0 then
  153. -- 变身状态秒杀日志
  154. this.LogMiaoSha(actor, target, targetType, originDamage, paramMap.monsterid, paramMap["skillid"])
  155. result = this.BuildFightResult(casterHurt, originDamage, 0, 0, 401, repeatl, isComboSkill)
  156. else
  157. result = this.BuildFightResult(casterHurt, originDamage, 0, 0, FightDamageTypeCache.GetHurtType(actor), repeatl, isComboSkill)
  158. end
  159. table.insert(resultList, result)
  160. if elementalDamage > 0 then
  161. local elementalResult = this.BuildFightResult(0, elementalDamage, 0, 0, elementalType, 1, isComboSkill)
  162. table.insert(resultList, elementalResult)
  163. end
  164. return resultList
  165. end
  166. -- 副本修正伤害
  167. function this.DupFixDamage(originDamage, paramMap)
  168. local caster = paramMap.caster
  169. local targetType = paramMap.targettype
  170. if targetType == MapObjectType.MONSTER then
  171. if RolandSeige.IsPlayerInRoland(caster) then
  172. return 1
  173. end
  174. end
  175. return originDamage
  176. end
  177. -- 线上秒杀加日志
  178. function this.LogMiaoSha(actor, target, targetType, hurt, monsterCfgId, skillId)
  179. if targetType == MapObjectType.MONSTER then
  180. local monsterType = tonumber(ConfigDataManager.getTableValue("cfg_monster", "type", "id", monsterCfgId))
  181. if monsterType == 2 or monsterType == 3 then
  182. local maxHp = getbaseinfo(target, "maxhp")
  183. if hurt * 2 >= maxHp then
  184. info(actor:toString() .. "变身对BOSS造成巨额伤害。skillId:" .. skillId .. " ;monsterCfg:" .. monsterCfgId)
  185. end
  186. end
  187. end
  188. end
  189. -- 攻击回血
  190. function this.RecoverHP(paramMap, originDamage)
  191. local caster = paramMap["caster"]
  192. local HPAttackRecover = getattrinfo(caster, "HPAttackRecover")
  193. local HPAttackRecoveronus = getattrinfo(caster, "HPAttackRecoveronus")
  194. local attackBlood = getattrinfo(caster, "attackBlood")
  195. local attackRecover = originDamage * attackBlood
  196. local hpRecover = HPAttackRecover * (1 + HPAttackRecoveronus) + attackRecover
  197. local currentHp = getbaseinfo(caster, "hp")
  198. sethp(caster, hpRecover + currentHp)
  199. end
  200. function this.ReflexDamage(paramMap, originDamage)
  201. local casterHurt = 0
  202. local caster = paramMap["caster"]
  203. local target = paramMap["target"]
  204. local damageReflexProbability = getattrinfo(target, "damageReflexProbability")
  205. local damageReflexResistanceProbability = getattrinfo(caster, "damageReflexResistanceProbability")
  206. local rate = damageReflexProbability - damageReflexResistanceProbability
  207. if this.SelectRate(rate) then
  208. local damageReflex = getattrinfo(target, "damageReflex")
  209. local pvpDamageReflexAdd = getattrinfo(target, "pvpDamageReflexAdd")
  210. local pvpDamageReflexReduce = getattrinfo(caster, "pvpDamageReflexReduce")
  211. casterHurt = originDamage * damageReflex + pvpDamageReflexAdd - pvpDamageReflexReduce
  212. casterHurt = math.max(0, casterHurt)
  213. end
  214. return casterHurt
  215. end
  216. --处理重复伤害次数
  217. function this.getRepeatInfo(paramMap, originDamage)
  218. local skillId = paramMap["skillid"]
  219. local skillLevel = paramMap["skilllevel"]
  220. local valueTimes = ConfigDataManager.getTableValue("cfg_skill_info", "valueTimes", "skillID", skillId, "skillLevel", skillLevel)
  221. local repeatl = RandomUtil.selectKey(valueTimes)
  222. repeatl = math.max(repeatl, 1)
  223. originDamage = originDamage * repeatl
  224. return originDamage, repeatl
  225. end
  226. function this.handleHuolong(paramMap, originDamage)
  227. local caster = paramMap["caster"]
  228. local castMapObjectType = getbaseinfo(caster, "mapobjecttype")
  229. if castMapObjectType ~= MapObjectType.MONSTER then
  230. return originDamage
  231. end
  232. local monsterInfo = getmonsterinfo(caster)
  233. local cfgId = monsterInfo["cfgid"]
  234. if tonumber(cfgId) ~= MonsterConfigId.HUOLONG then
  235. return originDamage
  236. end
  237. local target = paramMap["target"]
  238. local targetMaxHp = getattrinfo(target, "maxHP")
  239. local costHp = targetMaxHp * 0.05
  240. return originDamage + costHp
  241. end
  242. function this.noviceProtect(paramMap, originDamage)
  243. local target = paramMap["target"]
  244. local targetType = paramMap["targettype"]
  245. if targetType ~= MapObjectType.PLAYER then
  246. return originDamage
  247. end
  248. local novice = getplaydef(target, NOVICE_PROTECT)
  249. if not novice then
  250. return originDamage
  251. end
  252. if novice then
  253. local currentHp = getbaseinfo(target, "hp")
  254. local haveHp = currentHp - originDamage
  255. local stringHp = ConfigDataManager.getTableValue("cfg_global", "value", "id", "15004")
  256. local hp = tonumber(stringHp)
  257. if haveHp < hp then
  258. return 0
  259. end
  260. end
  261. return originDamage
  262. end
  263. function this.initData(paramMap)
  264. local caster = paramMap["caster"]
  265. local originType = {
  266. [HurtTypeDefKeys.YI_BAN] = "1",
  267. [HurtTypeDefKeys.ZHUO_YUE] = "0",
  268. [HurtTypeDefKeys.XING_YUN] = "0",
  269. [HurtTypeDefKeys.WU_SHI] = "0",
  270. [HurtTypeDefKeys.SHUANG_BEI] = "0",
  271. }
  272. setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, originType)
  273. table.clear(FightLog)
  274. end
  275. function FightDamageTypeCache.GetHurtType(caster)
  276. local resultType = getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  277. local yiBanGongJi = resultType[HurtTypeDefKeys.YI_BAN]
  278. local zhuoYueYiJi = resultType[HurtTypeDefKeys.ZHUO_YUE]
  279. local xinYunYiJi = resultType[HurtTypeDefKeys.XING_YUN]
  280. local wuShiFangYu = resultType[HurtTypeDefKeys.WU_SHI]
  281. local shuangBeiYiJi = resultType[HurtTypeDefKeys.SHUANG_BEI]
  282. local typeString = yiBanGongJi .. zhuoYueYiJi .. xinYunYiJi .. wuShiFangYu .. shuangBeiYiJi
  283. local hurtTypeCache = getsysvar(SystemVarConst.NORMAL_DAMAGE_TYPE_CACHE, 0)
  284. local type = hurtTypeCache[typeString]
  285. if type == nil then
  286. error(caster, caster, "获取攻击类型配置失败,结果为", typeString)
  287. type = 101
  288. end
  289. return type
  290. end
  291. function FightDamageTypeCache.GetElementalHurtType(caster, key)
  292. local elementalCache = getsysvar(SystemVarConst.ELEMENTAL_DAMAGE_TYPE_CACHE, 0)
  293. local type = elementalCache[key]
  294. if type == nil then
  295. if string.contains(key, "1") then
  296. error(caster, caster, "获取元素伤害类型配置失败,结果为", key)
  297. end
  298. type = 101
  299. end
  300. return type
  301. end
  302. function this.BuildFightResult(casthurt, targethurt, castershield, targetshield, hurttype, repeatl, combo)
  303. combo = combo or false
  304. local result = {}
  305. result["comboskill"] = combo
  306. result["casthurt"] = casthurt
  307. result["targethurt"] = targethurt
  308. result["castershield"] = castershield
  309. result["targetshield"] = targetshield
  310. result["hurttype"] = hurttype
  311. result["repeat"] = repeatl
  312. result["targethurtshow"] = targethurt / repeatl --飘字体用的伤害:真实伤害除以次数
  313. fightlog(string.joinVar("目标扣血", math.floor(targethurt)) .. string.joinVar("攻击者扣血", math.floor(casthurt)) .. string.joinVar("目标扣护盾", math.floor(targetshield)) .. string.joinVar("攻击者扣护盾", math.floor(castershield)) .. string.joinVar("伤害类型", hurttype) .. string.joinVar("伤害次数", repeatl, true))
  314. result["fightLog"] = FightLog
  315. return result
  316. end
  317. function this.PlayerCastDamage(actor, paramMap)
  318. local caster = paramMap["caster"]
  319. local target = paramMap["target"]
  320. local armor = getattrinfo(target, "armor")
  321. local targetType = paramMap["targettype"]
  322. local armorPenetrate = 0
  323. if targetType == MapObjectType.PLAYER then
  324. armorPenetrate = getattrinfo(caster, "armorPenetrate")
  325. end
  326. local var
  327. if this.IsWuShiFangYu(paramMap) then
  328. fightlog("触发 无视防御")
  329. var = 0
  330. else
  331. var = 1
  332. end
  333. --伤害1=【IF(A幸运一击触发,A幸运攻击,A随机攻击)-(B防御-APVP防御穿透)/2*IF(A无视防御触发,0,1)】+A卓越攻击+A双倍攻击
  334. fightlog("伤害1=【IF(A幸运一击触发,A幸运攻击,A随机攻击)-(B防御-APVP防御穿透)/2*IF(A无视防御触发,0,1)】+A卓越攻击+A双倍攻击")
  335. local damage1 = this.XingYunDamage(paramMap) - math.max(0, (armor - armorPenetrate)) / 2 * var + this.ZhuoYueDamage(paramMap) + this.ShuangBeiYiJi(paramMap)
  336. fightlog("伤害1:" .. damage1)
  337. --伤害2=伤害1 * A使用技能对应技能系数 *(1+A技能伤害加成百分比 - B技能伤害减少百分比)
  338. fightlog("伤害2=伤害1 * A使用技能对应技能系数 *(1+A技能伤害加成百分比 - B技能伤害减少百分比)")
  339. local skillId = paramMap["skillid"]
  340. local skillLevel = paramMap["skilllevel"]
  341. local powerRate = tonumber(ConfigDataManager.getTableValue("cfg_skill_info", "powerRate", "skillID", skillId, "skillLevel", skillLevel))
  342. powerRate = powerRate == nil and 0 or powerRate
  343. powerRate = powerRate / 10000
  344. local freeAtt6 = getattrinfo(caster, "freeAtt6")
  345. local freeAtt7 = getattrinfo(target, "freeAtt7")
  346. local damage2 = damage1 * powerRate * (1 + freeAtt6 - freeAtt7)
  347. fightlog("伤害2:" .. damage2)
  348. --伤害3=伤害2 *(1+A加点伤害加成)*(1+A伤害加成 - B伤害吸收)*(1 - B伤害减少)*【1+IF(B为怪物,A对怪伤害加成,0)*【1+IF(B为玩家,A对玩家伤害加成,0)-IF(B为玩家,B对玩家伤害吸收,0)】*【1-IF(B为玩家,B对玩家伤害减免,0)】
  349. fightlog("伤害3=伤害2 *(1+A加点伤害加成)*(1+A伤害加成 - B伤害吸收)*(1 - B伤害减少)*【1+IF(B为怪物,A对怪伤害加成,0)*【1+IF(B为玩家,A对玩家伤害加成,0)-IF(B为玩家,B对玩家伤害吸收,0)】*【1-IF(B为玩家,B对玩家伤害减免,0)】")
  350. local addtion = this.GetJiaDianAddition(paramMap)
  351. local damageRate = getattrinfo(caster, "damageRate")
  352. local damageAbsorb = getattrinfo(target, "damageAbsorb")
  353. local damageRateDecrement = getattrinfo(target, "damageRateDecrement")
  354. local damage3 = damage2 * (1 + addtion) * (1 + damageRate - damageAbsorb) * (1 - damageRateDecrement)
  355. local damage3 = this.buffDecrement(target,damage3)
  356. if paramMap["targettype"] == 2 then
  357. local damageIncreaseRate = getattrinfo(caster, "damageIncreaseRate")
  358. damage3 = damage3 * (1 + damageIncreaseRate)
  359. end
  360. if paramMap["targettype"] == 1 then
  361. local damageBonus = getattrinfo(caster, "damageIncreaseRate")
  362. local damageReductionBonus = getattrinfo(target, "damageReductionBonus")
  363. local absorbDamageToPlayers = getattrinfo(target, "absorbDamageToPlayers")
  364. damage3 = damage3 * (1 + damageBonus - absorbDamageToPlayers) * (1 - damageReductionBonus)
  365. end
  366. fightlog("伤害3:" .. damage3)
  367. -- 伤害4=伤害3+A技能伤害加成固定值 - B技能伤害减少固定值
  368. fightlog("伤害4=伤害3+A技能伤害加成固定值+A技能伤害固定值 - B技能伤害减少固定值")
  369. local freeAtt1 = getattrinfo(caster, "freeAtt1")
  370. local freeAtt2 = getattrinfo(target, "freeAtt2")
  371. local fixedDamage = tonumber(ConfigDataManager.getTableValue("cfg_skill_info", "fixedDamage", "skillID", skillId, "skillLevel", skillLevel))
  372. if fixedDamage == nil then
  373. fixedDamage = 0
  374. end
  375. local damage4 = damage3 + freeAtt1 + fixedDamage - freeAtt2
  376. fightlog("伤害4:" .. damage4)
  377. local finalDamage = 0
  378. if targetType == MapObjectType.PLAYER then
  379. -- 最终伤害=伤害4+APVP出血伤害固定值-BPVP出血伤害抵抗固定值
  380. fightlog("最终伤害=伤害4+APVP出血伤害固定值-BPVP出血伤害抵抗固定值")
  381. local pvpBleedDamageAdd = getattrinfo(caster, "pvpBleedDamageAdd")
  382. local pvpBleedDamageReduce = getattrinfo(target, "pvpBleedDamageReduce")
  383. finalDamage = damage4 + math.max(0, pvpBleedDamageAdd - pvpBleedDamageReduce)
  384. elseif targetType == MapObjectType.MONSTER then
  385. -- 最终伤害=伤害4+A对怪伤害增加固定值
  386. fightlog("最终伤害=伤害4+A对怪伤害增加固定值")
  387. local pveDamageAdd = getattrinfo(caster, "pveDamageAdd")
  388. finalDamage = damage4 + pveDamageAdd
  389. end
  390. -- 处于攻城战副本时,范围伤害修改
  391. finalDamage = this.RolandSeigeAOECal(actor, skillId, finalDamage)
  392. -- A打B最终伤害<保底伤害时,最终伤害=保底伤害=A最大攻击力*可配置系数
  393. fightlog("A打B最终伤害<保底伤害时,最终伤害=保底伤害=A最大攻击力*可配置系数")
  394. local minDC, maxDC = this.GetDCBySkill(paramMap)
  395. local factor = tonumber(ConfigDataManager.getTableValue("cfg_global", "value", "id", 7000)) / 10000
  396. local minDamage = maxDC * factor
  397. local originFinalDamage = finalDamage
  398. if finalDamage < minDamage then
  399. finalDamage = minDamage
  400. end
  401. fightlog("最终伤害:" .. originFinalDamage .. " 保底伤害:" .. minDamage)
  402. return finalDamage
  403. end
  404. --- 目标属性概率减伤
  405. function this.buffDecrement(actor,damage)
  406. local damageRateDecrement5 = getattrinfo(actor, "damageRateDecrement5")
  407. if damageRateDecrement5 ~= 0 then
  408. local successRate = math.random(0, 100)
  409. if successRate <= 5 then
  410. damage = damage * (1 - damageRateDecrement5)
  411. end
  412. end
  413. local damageRateDecrement10 = getattrinfo(actor, "damageRateDecrement10")
  414. if damageRateDecrement10 ~= 0 then
  415. local successRate = math.random(0, 100)
  416. if successRate <= 10 then
  417. damage = damage * (1 - damageRateDecrement10)
  418. end
  419. end
  420. return damage
  421. end
  422. function this.RolandSeigeAOECal(actor, skillId, originDamage)
  423. if RolandSeige.IsPlayerInRoland(actor) then
  424. local aoe = tonumber(ConfigDataManager.getTableValue("cfg_skill", "aoe", "id", skillId))
  425. if aoe == 1 then
  426. local rate = tonumber(ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.ROLAND_SEIGE.AOE_DAMAGE_FIX))
  427. return originDamage * (rate / 100)
  428. end
  429. end
  430. return originDamage
  431. end
  432. function this.MonsterCastDamage(actor, paramMap)
  433. local caster = paramMap["caster"]
  434. local target = paramMap["target"]
  435. local armor = getattrinfo(target, "armor")
  436. --伤害1=【IF(A幸运一击触发,A幸运攻击,A随机攻击)】+A卓越攻击+A双倍攻击
  437. fightlog("伤害1=【IF(A幸运一击触发,A幸运攻击,A随机攻击)】+A卓越攻击+A双倍攻击")
  438. local damage1 = this.XingYunDamage(paramMap) + this.ZhuoYueDamage(paramMap) + this.ShuangBeiYiJi(paramMap)
  439. fightlog("伤害1:" .. damage1)
  440. --伤害2=伤害1 * A使用技能对应技能系数 *(1+A技能伤害加成百分比 - B技能伤害减少百分比)
  441. fightlog("伤害2=伤害1 * A使用技能对应技能系数 *(1+A技能伤害加成百分比 - B技能伤害减少百分比)")
  442. local skillId = paramMap["skillid"]
  443. local skillLevel = paramMap["skilllevel"]
  444. local powerRate = tonumber(ConfigDataManager.getTableValue("cfg_skill_info", "powerRate", "skillID", skillId, "skillLevel", skillLevel))
  445. powerRate = powerRate == nil and 0 or powerRate
  446. powerRate = powerRate / 10000
  447. local freeAtt6 = getattrinfo(caster, "freeAtt6")
  448. local freeAtt7 = getattrinfo(target, "freeAtt7")
  449. local damage2 = damage1 * powerRate * (1 + freeAtt6 - freeAtt7)
  450. fightlog("伤害2:" .. damage2)
  451. --伤害3=伤害2 *(1+A加点伤害加成)*(1+A伤害加成 - B伤害吸收)*(1 - B伤害减少)*(1 - B对怪伤害减少百分比)*【1 - IF(受多只怪物攻击,B多怪减伤百分比,0)】
  452. fightlog("伤害3=伤害2 *(1+A加点伤害加成)*(1+A伤害加成 - B伤害吸收)*(1 - B伤害减少)*(1 - B对怪伤害减少百分比)*【1 - IF(受多只怪物攻击,B多怪减伤百分比,0)】")
  453. local addtion = this.GetJiaDianAddition(paramMap)
  454. local damageRate = getattrinfo(caster, "damageRate")
  455. local damageAbsorb = getattrinfo(target, "damageAbsorb")
  456. local damageRateDecrement = getattrinfo(target, "damageRateDecrement")
  457. local damageReceiveDecrement = getattrinfo(target, "damageReceiveDecrement")
  458. local damage3 = damage2 * (1 + addtion) * (1 + damageRate - damageAbsorb) * (1 - damageRateDecrement) * (1 - damageReceiveDecrement)
  459. local damage3 = this.buffDecrement(target,damage3)
  460. if this.IfAttackedMutipleMonster(paramMap) then
  461. local freeAtt9 = getattrinfo(target, "freeAtt9")
  462. damage3 = damage3 * (1 - freeAtt9)
  463. end
  464. fightlog("伤害3:" .. damage3)
  465. -- 伤害4=伤害3 - B防御/2*IF(A无视防御触发,0,1)+A技能伤害加成固定值 - B技能伤害减少固定值
  466. fightlog("伤害4=伤害3 - B防御/2*IF(A无视防御触发,0,1)+A技能伤害加成固定值 - B技能伤害减少固定值")
  467. if this.IsWuShiFangYu(paramMap) == false then
  468. damage3 = damage3 - armor / 2
  469. end
  470. local freeAtt1 = getattrinfo(caster, "freeAtt1")
  471. local freeAtt2 = getattrinfo(target, "freeAtt2")
  472. local damage4 = damage3 + freeAtt1 - freeAtt2
  473. fightlog("伤害4:" .. damage4)
  474. -- 最终伤害=伤害4-B对怪伤害减少固定值
  475. fightlog("最终伤害=伤害4-B对怪伤害减少固定值")
  476. local pveDamageReduce = getattrinfo(target, "pveDamageReduce")
  477. local finalDamage = damage4 - pveDamageReduce
  478. --todo 保底伤害 怪物打玩家最终伤害<保底伤害时,最终伤害=保底伤害(怪物属性表配置)
  479. fightlog("怪物打玩家最终伤害<保底伤害时,最终伤害=保底伤害(怪物属性表配置)")
  480. local monInfo = getmonsterinfo(caster)
  481. local monsterConfig = monInfo["cfgid"]
  482. local minDamage = tonumber(ConfigDataManager.getTableValue("cfg_monster", "guaranteedDamage", "id", monsterConfig))
  483. if finalDamage < minDamage then
  484. finalDamage = minDamage
  485. end
  486. fightlog("最终伤害:" .. finalDamage .. " 保底伤害:" .. minDamage)
  487. return finalDamage
  488. end
  489. -- 元素伤害
  490. function this.ElementalHurt(paramMap)
  491. local caster = paramMap.caster
  492. local target = paramMap.target
  493. local hurtTypeKey
  494. -- 圣光
  495. local shengGuangDamage = 0
  496. local HolyUnMissRate = getattrinfo(caster, "HolyUnMissRate")
  497. local HolyResistUnMissRate = getattrinfo(target, "HolyResistUnMissRate")
  498. local HolyAttack = getattrinfo(caster, "HolyAttack")
  499. if not this.SelectRate(math.max(0, HolyResistUnMissRate - HolyUnMissRate)) and HolyAttack > 0 then
  500. local HolyDamageIncreased = getattrinfo(caster, "HolyDamageIncreased")
  501. local HolyDamageIncreasedBonus = getattrinfo(caster, "HolyDamageIncreasedBonus")
  502. local HolyDamageReduction = getattrinfo(target, "HolyDamageReduction")
  503. local HolyDamageReductionBonus = getattrinfo(target, "HolyDamageReductionBonus")
  504. shengGuangDamage = HolyAttack * (1 + HolyDamageIncreasedBonus - HolyDamageReductionBonus) + HolyDamageIncreased - HolyDamageReduction
  505. shengGuangDamage = math.max(shengGuangDamage, 0)
  506. if shengGuangDamage > 0 then
  507. hurtTypeKey = "1"
  508. else
  509. hurtTypeKey = "0"
  510. end
  511. else
  512. hurtTypeKey = "0"
  513. end
  514. -- 黑暗
  515. local heiAnDamage = 0
  516. local DarkUnMissRate = getattrinfo(caster, "DarkUnMissRate")
  517. local DarkResistUnMissRate = getattrinfo(target, "DarkResistUnMissRate")
  518. local DarkAttack = getattrinfo(caster, "DarkAttack")
  519. if not this.SelectRate(math.max(0, DarkResistUnMissRate - DarkUnMissRate)) and DarkAttack > 0 then
  520. local DarkDamageIncreased = getattrinfo(caster, "DarkDamageIncreased")
  521. local DarkDamageIncreasedBonus = getattrinfo(caster, "DarkDamageIncreasedBonus")
  522. local DarkDamageReduction = getattrinfo(target, "DarkDamageReduction")
  523. local DarkDamageReductionBonus = getattrinfo(target, "DarkDamageReductionBonus")
  524. heiAnDamage = DarkAttack * (1 + DarkDamageIncreasedBonus - DarkDamageReductionBonus) + DarkDamageIncreased - DarkDamageReduction
  525. heiAnDamage = math.max(heiAnDamage, 0)
  526. if heiAnDamage > 0 then
  527. hurtTypeKey = hurtTypeKey .. "1"
  528. else
  529. hurtTypeKey = hurtTypeKey .. "0"
  530. end
  531. else
  532. hurtTypeKey = hurtTypeKey .. "0"
  533. end
  534. -- 雷电
  535. local leiDianDamage = 0
  536. local ThunderUnMissRate = getattrinfo(caster, "ThunderUnMissRate")
  537. local ThunderResistUnMissRate = getattrinfo(target, "ThunderResistUnMissRate")
  538. local ThunderAttack = getattrinfo(caster, "ThunderAttack")
  539. if not this.SelectRate(math.max(0, ThunderResistUnMissRate - ThunderUnMissRate)) and ThunderAttack > 0 then
  540. local ThunderDamageIncreased = getattrinfo(caster, "ThunderDamageIncreased")
  541. local ThunderDamageIncreasedBonus = getattrinfo(caster, "ThunderDamageIncreasedBonus")
  542. local ThunderDamageReduction = getattrinfo(target, "ThunderDamageReduction")
  543. local ThunderDamageReductionBonus = getattrinfo(target, "ThunderDamageReductionBonus")
  544. leiDianDamage = ThunderAttack * (1 + ThunderDamageIncreasedBonus - ThunderDamageReductionBonus) + ThunderDamageIncreased - ThunderDamageReduction
  545. leiDianDamage = math.max(leiDianDamage, 0)
  546. if leiDianDamage > 0 then
  547. hurtTypeKey = hurtTypeKey .. "1"
  548. else
  549. hurtTypeKey = hurtTypeKey .. "0"
  550. end
  551. else
  552. hurtTypeKey = hurtTypeKey .. "0"
  553. end
  554. -- 风暴
  555. local fengBaoDmage = 0
  556. local StormUnMissRate = getattrinfo(caster, "StormUnMissRate")
  557. local StormResistUnMissRate = getattrinfo(target, "StormResistUnMissRate")
  558. local StormAttack = getattrinfo(caster, "StormAttack")
  559. if not this.SelectRate(math.max(0, StormResistUnMissRate - StormUnMissRate)) and StormAttack > 0 then
  560. local StormDamageIncreased = getattrinfo(caster, "StormDamageIncreased")
  561. local StormDamageIncreasedBonus = getattrinfo(caster, "StormDamageIncreasedBonus")
  562. local StormDamageReduction = getattrinfo(target, "StormDamageReduction")
  563. local StormDamageReductionBonus = getattrinfo(target, "StormDamageReductionBonus")
  564. fengBaoDmage = StormAttack * (1 + StormDamageIncreasedBonus - StormDamageReductionBonus) + StormDamageIncreased - StormDamageReduction
  565. fengBaoDmage = math.max(fengBaoDmage, 0)
  566. if fengBaoDmage > 0 then
  567. hurtTypeKey = hurtTypeKey .. "1"
  568. else
  569. hurtTypeKey = hurtTypeKey .. "0"
  570. end
  571. else
  572. hurtTypeKey = hurtTypeKey .. "0"
  573. end
  574. local totalDamage = shengGuangDamage + heiAnDamage + leiDianDamage + fengBaoDmage
  575. totalDamage = math.max(0, totalDamage)
  576. -- 伤害类型(飘字)
  577. local hurtType = FightDamageTypeCache.GetElementalHurtType(caster, hurtTypeKey)
  578. return totalDamage, hurtType
  579. end
  580. function this.XingYunDamage(paramMap)
  581. local caster = paramMap["caster"]
  582. local target = paramMap["target"]
  583. local minDC, maxDC = this.GetDCBySkill(paramMap)
  584. if this.IsXingYunYiJi(paramMap) then
  585. fightlog("触发 幸运一击")
  586. --A幸运攻击=A最大攻击 *(1+A幸运一击伤害加成 - B幸运一击伤害减少)
  587. local criticalDamageBonus = getattrinfo(caster, "criticalDamageBonus")
  588. local criticalDamageReducationBonus = getattrinfo(target, "criticalDamageReducationBonus")
  589. return maxDC * (1 + criticalDamageBonus - criticalDamageReducationBonus)
  590. else
  591. return math.randomFloat(minDC, maxDC)
  592. end
  593. end
  594. function this.ZhuoYueDamage(paramMap)
  595. local caster = paramMap["caster"]
  596. local target = paramMap["target"]
  597. local skillId = paramMap["skillid"]
  598. local skillLevel = paramMap["skilllevel"]
  599. local minDC, maxDC = this.GetDCBySkill(paramMap)
  600. --A卓越攻击=A随机攻击 * IF(A卓越一击触发,A卓越一击伤害系数,0)*(1+A卓越一击伤害加成 - B卓越一击伤害减少)
  601. local coefficient
  602. if this.IsZhuoYueYiJi(paramMap) then
  603. fightlog("触发 卓越一击")
  604. coefficient = tonumber(ConfigDataManager.getTableValue("cfg_skill_info", "excellentRate", "skillID", skillId, "skillLevel", skillLevel))
  605. if coefficient == nil then
  606. coefficient = 0
  607. else
  608. coefficient = coefficient / 10000
  609. end
  610. else
  611. coefficient = 0
  612. end
  613. local excellentDamageBonus = getattrinfo(caster, "excellentDamageBonus")
  614. local excellentDamageReducationBonus = getattrinfo(target, "excellentDamageReducationBonus")
  615. return math.randomFloat(minDC, maxDC) * coefficient * (1 + excellentDamageBonus - excellentDamageReducationBonus)
  616. end
  617. function this.ShuangBeiYiJi(paramMap)
  618. local caster = paramMap["caster"]
  619. local target = paramMap["target"]
  620. local minDC, maxDC = this.GetDCBySkill(paramMap)
  621. --A双倍攻击=A随机攻击 * IF(A双倍一击触发,1,0)*(1+A双倍一击伤害加成 - B双倍一击伤害减少)
  622. local coefficient
  623. if this.IsShuangBeiYiJi(paramMap) then
  624. fightlog("触发 双倍一击")
  625. coefficient = 1
  626. else
  627. coefficient = 0
  628. end
  629. local doubleDamageBonus = getattrinfo(caster, "doubleDamageBonus")
  630. local doubleDamageReducationBonus = getattrinfo(target, "doubleDamageReducationBonus")
  631. return math.randomFloat(minDC, maxDC) * coefficient * (1 + doubleDamageBonus - doubleDamageReducationBonus)
  632. end
  633. function this.IfAttackedMutipleMonster(paramMap)
  634. local caster = paramMap["caster"]
  635. local target = paramMap["target"]
  636. local castType = paramMap["castertype"]
  637. local targetType = paramMap["targettype"]
  638. if castType ~= 2 or targetType ~= 1 then
  639. return false
  640. end
  641. local monsterId = caster:toString()
  642. local lastDataList = getplaydef(target, LastAttakedByMonster)
  643. local nowMillis = getbaseinfo("now")
  644. if type(lastDataList) ~= "table" then
  645. setplaydef(target, LastAttakedByMonster, { monsterId, nowMillis })
  646. return false
  647. end
  648. local lastMonsterId = lastDataList[1]
  649. local lastMillis = lastDataList[2]
  650. local duration = nowMillis - lastMillis
  651. if lastMonsterId == monsterId or duration < 1000 then
  652. setplaydef(target, LastAttakedByMonster, { monsterId, nowMillis })
  653. return false
  654. end
  655. setplaydef(target, LastAttakedByMonster, { monsterId, nowMillis })
  656. return true
  657. end
  658. function this.GetJiaDianAddition(paramMap)
  659. local caster = paramMap["caster"]
  660. local skillId = paramMap["skillid"]
  661. local skillLevel = paramMap["skilllevel"]
  662. local injuryType = tonumber(ConfigDataManager.getTableValue("cfg_skill_info", "injuryType", "skillID", skillId, "skillLevel", skillLevel))
  663. if injuryType == 1 then
  664. local addtion = getattrinfo(caster, "PhysicalDamage")
  665. return addtion
  666. elseif injuryType == 2 then
  667. local addtion = getattrinfo(caster, "MagicDamage")
  668. return addtion
  669. elseif injuryType == 3 then
  670. local addtion = getattrinfo(caster, "freeAtt8")
  671. return addtion
  672. else
  673. local maxDC = getattrinfo(caster, "maxDC")
  674. local maxMC = getattrinfo(caster, "maxMC")
  675. local maxCurDC = getattrinfo(caster, "maximumCurseAttackPower")
  676. if maxDC >= maxMC and maxDC >= maxCurDC then
  677. local addtion = getattrinfo(caster, "PhysicalDamage")
  678. return addtion
  679. elseif maxMC >= maxDC and maxMC >= maxCurDC then
  680. local addtion = getattrinfo(caster, "MagicDamage")
  681. return addtion
  682. elseif maxCurDC >= maxDC and maxCurDC >= maxMC then
  683. local addtion = getattrinfo(caster, "freeAtt8")
  684. return addtion
  685. end
  686. error("不存在的伤害类型" .. injuryType .. "skillId:" .. skillId)
  687. return 0
  688. end
  689. end
  690. function this.GetDCBySkill(paramMap)
  691. local caster = paramMap["caster"]
  692. local skillId = paramMap["skillid"]
  693. local skillLevel = paramMap["skilllevel"]
  694. local injuryType = tonumber(ConfigDataManager.getTableValue("cfg_skill_info", "injuryType", "skillID", skillId, "skillLevel", skillLevel))
  695. if injuryType == 1 then
  696. local maxDC = getattrinfo(caster, "maxDC")
  697. local minDC = getattrinfo(caster, "minDC")
  698. return minDC, maxDC
  699. elseif injuryType == 2 then
  700. local maxMC = getattrinfo(caster, "maxMC")
  701. local minMC = getattrinfo(caster, "minMC")
  702. return minMC, maxMC
  703. elseif injuryType == 3 then
  704. local maxMC = getattrinfo(caster, "maximumCurseAttackPower")
  705. local minMC = getattrinfo(caster, "minimumCurseAttackPower")
  706. return minMC, maxMC
  707. else
  708. local maxDC = getattrinfo(caster, "maxDC")
  709. local maxMC = getattrinfo(caster, "maxMC")
  710. local maxCurDC = getattrinfo(caster, "maximumCurseAttackPower")
  711. if maxDC >= maxMC and maxDC >= maxCurDC then
  712. local minDC = getattrinfo(caster, "minDC")
  713. return minDC, maxDC
  714. elseif maxMC >= maxDC and maxMC >= maxCurDC then
  715. local minMC = getattrinfo(caster, "minMC")
  716. return minMC, maxMC
  717. elseif maxCurDC >= maxDC and maxCurDC >= maxMC then
  718. local minCurDC = getattrinfo(caster, "minimumCurseAttackPower")
  719. return minCurDC, maxCurDC
  720. end
  721. return 0, 0
  722. end
  723. end
  724. function this.CanHit(paramMap)
  725. local caster = paramMap["caster"]
  726. local target = paramMap["target"]
  727. local castType = paramMap["castertype"]
  728. local targetType = paramMap["targettype"]
  729. local hitRate
  730. local missRate
  731. if castType == 2 or targetType == 2 then
  732. --pve
  733. hitRate = getattrinfo(caster, "hitRate")
  734. missRate = getattrinfo(target, "missRate")
  735. else
  736. --pvp
  737. hitRate = getattrinfo(caster, "pvpattackRate")
  738. missRate = getattrinfo(target, "eraRate")
  739. end
  740. local basicMiss = getattrinfo(target, "freeAtt10")
  741. --todo 命中概率=1 - (1 - 1 / ((B防御率 - A攻击率) / (B防御率 + A攻击率) * 0.8 + 1)) - B基础闪避率
  742. fightlog("命中概率=1 - (1 - 1 / ((B防御率 - A攻击率) / (B防御率 + A攻击率) * 0.8 + 1)) - B基础闪避率")
  743. fightlog("A攻击率:" .. hitRate .. " B防御率:" .. missRate .. " B基础闪避率:" .. basicMiss)
  744. local probability
  745. if missRate + hitRate == 0 then
  746. probability = 1
  747. else
  748. probability = 1 - (1 - 1 / ((missRate - hitRate) / (missRate + hitRate) * 0.8 + 1)) - basicMiss
  749. end
  750. local hit = this.SelectRate(probability)
  751. fightlog("命中概率:" .. string.numToPercent(probability) .. " 命中:" .. tostring(hit))
  752. return hit
  753. end
  754. function this.IsXingYunYiJi(paramMap)
  755. --A幸运一击触发概率=A幸运一击概率 *(1 - B幸运一击概率抵抗)
  756. local caster = paramMap["caster"]
  757. local target = paramMap["target"]
  758. local criticalDamageChance = getattrinfo(caster, "criticalDamageChance")
  759. local criticalDamageResistanceChance = getattrinfo(target, "criticalDamageResistanceChance")
  760. local probability = criticalDamageChance * (1 - criticalDamageResistanceChance)
  761. local result = this.SelectRate(probability)
  762. if result then
  763. local resultType = getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  764. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  765. resultType[HurtTypeDefKeys.XING_YUN] = "1"
  766. setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  767. end
  768. return result
  769. end
  770. function this.IsZhuoYueYiJi(paramMap)
  771. --A卓越一击触发概率=A卓越一击概率*(1-B卓越一击概率抵抗)
  772. local caster = paramMap["caster"]
  773. local target = paramMap["target"]
  774. local excellentDamageChance = getattrinfo(caster, "excellentDamageChance")
  775. local excellentDamageResistanceChance = getattrinfo(target, "excellentDamageResistanceChance")
  776. local probability = excellentDamageChance * (1 - excellentDamageResistanceChance)
  777. local result = this.SelectRate(probability)
  778. if result then
  779. local resultType = getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  780. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  781. resultType[HurtTypeDefKeys.ZHUO_YUE] = "1"
  782. setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  783. end
  784. return result
  785. end
  786. function this.IsWuShiFangYu(paramMap)
  787. --A无视防御概率=A无视防御率 *(1 - B无视防御抵抗)
  788. local caster = paramMap["caster"]
  789. local target = paramMap["target"]
  790. local unMissRate = getattrinfo(caster, "unMissRate")
  791. local unMissResistanceRate = getattrinfo(target, "unMissResistanceRate")
  792. local probability = unMissRate * (1 - unMissResistanceRate)
  793. local result = this.SelectRate(probability)
  794. if result then
  795. local resultType = getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  796. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  797. resultType[HurtTypeDefKeys.WU_SHI] = "1"
  798. setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  799. end
  800. return result
  801. end
  802. function this.IsShuangBeiYiJi(paramMap)
  803. --A双倍一击触发概率=A双倍一击概率 *(1 - B双倍一击概率抵抗)
  804. local caster = paramMap["caster"]
  805. local target = paramMap["target"]
  806. local doubleDamageChance = getattrinfo(caster, "doubleDamageChance")
  807. local doubleDamageResistanceChance = getattrinfo(target, "doubleDamageResistanceChance")
  808. local probability = doubleDamageChance * (1 - doubleDamageResistanceChance)
  809. local result = this.SelectRate(probability)
  810. if result then
  811. local resultType = getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  812. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  813. resultType[HurtTypeDefKeys.SHUANG_BEI] = "1"
  814. setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  815. end
  816. return result
  817. end
  818. function this.SelectRate(probability)
  819. local randomNum = math.random()
  820. if randomNum <= probability then
  821. return true
  822. else
  823. return false
  824. end
  825. end
  826. function this.CheckPKCanHurt(paramMap)
  827. local caster = paramMap["caster"]
  828. local target = paramMap["target"]
  829. local castType = paramMap["castertype"]
  830. local targetType = paramMap["targettype"]
  831. if castType == 1 and targetType == 1 then
  832. -- PK值判断是否可以造成伤害
  833. local pkValue = tonumber(pk.getpkvalue(caster))
  834. local pkCountTableInfo = ConfigDataManager.getTable("cfg_pk_count", "pvpDamage", 1)
  835. if pkCountTableInfo and #pkCountTableInfo > 0 then
  836. local maxPkValue = 0
  837. for _, v in ipairs(pkCountTableInfo) do
  838. local nameColor = tostring(v["namecolor"])
  839. local split = string.split(nameColor, "#")
  840. local minValue = tonumber(split[1])
  841. local maxValue = tonumber(split[2])
  842. if pkValue >= minValue and pkValue <= maxValue then
  843. -- PK值在此区间内不造成伤害
  844. tipinfo(caster, "pk值较高,无法对玩家造成伤害")
  845. return false
  846. end
  847. maxPkValue = maxPkValue > maxValue and maxPkValue or maxValue
  848. end
  849. if pkValue and pkValue ~= 0 and pkValue > maxPkValue then
  850. tipinfo(caster, "pk值较高,无法对玩家造成伤害")
  851. return false
  852. end
  853. else
  854. error("pkCountTableInfo is null")
  855. end
  856. -- PK值判断end
  857. end
  858. return true
  859. end
  860. function this.AfterCalcuDamage(paramMap, finalDamage)
  861. -- 如果攻击的怪物是秘境副本的BOSS则累加记录实时伤害
  862. local caster = paramMap["caster"]
  863. local target = paramMap["target"]
  864. local castType = paramMap["castertype"]
  865. local targetType = paramMap["targettype"]
  866. if castType == 1 and targetType == 2 then
  867. local monsterId = paramMap["monsterid"]
  868. local bossChallenge = ConfigDataManager.getTable("cfg_BOSS_challenge", "monsterType", BossType.SECRET_REALM_BOSS)
  869. for i = 1, #bossChallenge do
  870. if tonumber(monsterId) == tonumber(bossChallenge[i].monsterid) then
  871. -- 存储实时伤害
  872. SecretRealm.savePlayerHurtInfo(caster, target, finalDamage < 0 and 1 or finalDamage)
  873. end
  874. end
  875. -- 保存战盟boos造成伤害的玩家
  876. WarAlliance.savePlayerInvloveInfo(caster, target, finalDamage, monsterId)
  877. end
  878. end
  879. function fightlog(desc)
  880. table.insert(FightLog, desc .. "\n")
  881. end
  882. -- 服务器启动调用,缓存表数据
  883. function FightDamageTypeCache.Cache()
  884. local normalCache = {}
  885. local elementalCache = {}
  886. local tableList = ConfigDataManager.getList("cfg_damage_number")
  887. for index, valueMap in ipairs(tableList) do
  888. local id = valueMap["id"]
  889. local attributeA = valueMap["attributea"]
  890. local attributeB = valueMap["attributeb"]
  891. local attributeC = valueMap["attributec"]
  892. local attributeD = valueMap["attributed"]
  893. local attributeE = valueMap["attributee"]
  894. local keyString = attributeA .. attributeB .. attributeC .. attributeD .. attributeE
  895. if string.contains(keyString, "1") then
  896. if normalCache[keyString] ~= nil then
  897. gameDebug.assertPrint(false, "cfg_damage_number缓存战斗飘字类型重复,id:" .. id .. ";key:" .. keyString)
  898. end
  899. normalCache[keyString] = id
  900. end
  901. -- 元素伤害
  902. local attributeF = valueMap["attributef"]
  903. local attributeG = valueMap["attributeg"]
  904. local attributeH = valueMap["attributeh"]
  905. local attributeI = valueMap["attributei"]
  906. local elementalKey = attributeF .. attributeG .. attributeH .. attributeI
  907. if string.contains(elementalKey, "1") then
  908. if elementalCache[elementalKey] ~= nil then
  909. gameDebug.assertPrint(false, "cfg_damage_number缓存元素战斗飘字类型重复,id:" .. ";key:" .. elementalKey)
  910. end
  911. elementalCache[elementalKey] = id
  912. end
  913. end
  914. setsysvar(SystemVarConst.NORMAL_DAMAGE_TYPE_CACHE, normalCache)
  915. setsysvar(SystemVarConst.ELEMENTAL_DAMAGE_TYPE_CACHE, elementalCache)
  916. end