PlayerFight.lua 114 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382
  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. BAO_JI = "BAO_JI",
  9. ZHI_MING = "ZHI_MING",
  10. SAN_BEI = "SAN_BEI",
  11. }
  12. PlayerFight = {}
  13. local this = PlayerFight
  14. local FightLog = {}
  15. local ComboSkills = {
  16. [1030001] = 1
  17. }
  18. function excusefightdamage(actor, paramMapList)
  19. -- local magicValue = this.getAttValueWithName(actor, "wandMagicAttackPowerBonus")
  20. -- local mountdamagebonus = this.getAttValueWithName(actor, "mountdamagebonus")
  21. local selfType = getbaseinfo(actor, "mapobjecttype")
  22. if selfType == MapObjectType.PLAYER then
  23. local isQuiverDestory = APIGetInt(actor, "ZC_Quiver_Durability", 1)
  24. if isQuiverDestory == 1 then
  25. return {}
  26. end
  27. end
  28. local fightResults = {}
  29. for _, paramMap in pairs(paramMapList) do
  30. local skillInfo = ConfigDataManager.getTable("cfg_skill_info", "skillID", paramMap.skillid, "skillLevel", paramMap.skilllevel)
  31. paramMap["CfgData"] = next(skillInfo) and skillInfo[1] or {}
  32. local fightResultList = this.ExcuseFightDamage(actor, paramMap)
  33. for _, fightResult in pairs(fightResultList) do
  34. local next_stage = fightResult.next_stage == nil and true or
  35. fightResult.next_stage --是否继续往下计算(触发闪避等不继续计算)
  36. if next_stage == true then
  37. fightResult["target"] = paramMap["target"]
  38. local canAttack, Result = PlayerFight.Damage(actor, paramMap, fightResult) --引擎伤害计算完成后重新计算
  39. if canAttack then
  40. table.concatTable(fightResults, Result)
  41. end
  42. end
  43. end
  44. end
  45. if table.count(paramMapList) > 0 then
  46. this.AttackPassiveSkill(actor, paramMapList)
  47. end
  48. return fightResults
  49. end
  50. -- 兼容旧入口:FightDamageTypeCache
  51. FightDamageTypeCache = FightDamageTypeCache or {}
  52. function FightDamageTypeCache.Cache(...)
  53. return PlayerFight.Cache(...)
  54. end
  55. function FightDamageTypeCache.GetElementalHurtType(caster, key)
  56. return PlayerFight.GetElementalHurtType(caster, key)
  57. end
  58. function FightDamageTypeCache.GetHurtType(caster)
  59. return PlayerFight.GetHurtType(caster)
  60. end
  61. -- hurttype 伤害类型
  62. -- 101 一般攻击
  63. -- 102 幸运一击
  64. -- 103 幸运一击+无视防御
  65. -- 104 卓越一击
  66. -- 105 卓越一击+无视防御
  67. -- 106 无视防御
  68. -- 107 双倍伤害
  69. -- 108 攻击敌方MISS
  70. -- 109 反射伤害(技能伤害反射/卓越属性伤害反射)
  71. -- 110 掉落防护值
  72. -- 111 幸运一击+双倍伤害
  73. -- 112 幸运一击+无视防御+双倍伤害
  74. -- 113 卓越一击+双倍伤害
  75. -- 114 卓越一击+无视防御+双倍伤害
  76. -- 115 无视防御+双倍伤害
  77. -- 116 燃烧
  78. -- 117 中毒
  79. -- 118 治疗
  80. -- 119 回蓝
  81. -- 120 幸运一击+卓越一击
  82. -- 121 幸运一击+卓越一击+双倍伤害
  83. -- 122 幸运一击+卓越一击+双倍伤害+无视防御
  84. -- 123 幸运一击+卓越一击+无视防御
  85. -- 200 神圣伤害
  86. -- 201 黑暗伤害
  87. -- 202 雷电伤害
  88. -- 203 风暴伤害
  89. -- 204 神圣伤害+黑暗伤害
  90. -- 205 神圣伤害+雷电伤害
  91. -- 206 神圣伤害+风暴伤害
  92. -- 207 黑暗伤害+雷电伤害
  93. -- 208 黑暗伤害+风暴伤害
  94. -- 209 雷电伤害+风暴伤害
  95. -- 210 神圣伤害+黑暗伤害+雷电伤害
  96. -- 211 神圣伤害+黑暗伤害+风暴伤害
  97. -- 212 神圣伤害+雷电伤害+风暴伤害
  98. -- 213 黑暗伤害+雷电伤害+风暴伤害
  99. -- 214 神圣伤害+黑暗伤害+雷电伤害+风暴伤害
  100. -- 301 连击技伤害
  101. -- 401 卡牌变身伤害飘字
  102. function PlayerFight.Damage(actor, paramMap, fightResult)
  103. -- local nowTime = os.time()
  104. local caster = paramMap.caster --—— 攻击对象
  105. local target = paramMap.target --—— 受击对象
  106. -- local mapid = paramMap.mapid --—— 地图id
  107. -- local skillid = paramMap.skillid --—— 技能id
  108. -- local skilllevel = paramMap.skilllevel --—— 技能等级
  109. -- local monsterid = paramMap.monsterid --—— 受击怪物id
  110. local castertype = paramMap.castertype --—— 攻击者类型
  111. local targettype = paramMap.targettype --—— 受击者类型
  112. local tAddHurt = {
  113. addHurtNum = 0,
  114. addHurtPct = 0,
  115. }
  116. local casthurt = fightResult.casthurt --攻击者伤害
  117. local targethurt = fightResult.targethurt --受击者伤害
  118. local hurttype = fightResult.hurttype --伤害类型
  119. local repeat1 = fightResult["repeat"] --伤害次数
  120. -- local castershield = fightResult.castershield --攻击者扣除护盾
  121. -- local targetshield = fightResult.targetshield --受击者扣除护盾
  122. -- local targethurtshow = fightResult.targethurtshow --飘字使用的伤害
  123. -- local comboskill = fightResult.comboskill --是否是连击技能
  124. -- local target = fightResult.target --目标对象
  125. EquipGuard.guardHpChange(fightResult.target, targethurt)
  126. local extra_result = {}; --额外的飘字拆分
  127. -- 计算反伤
  128. casthurt = this.ReflexDamage(paramMap, targethurt)
  129. if targettype == MapObjectType.PLAYER and castertype == MapObjectType.PLAYER then
  130. local fightmodel = getbaseinfo(caster, "fightmodel")
  131. if fightmodel == 1 then
  132. return false, {}
  133. elseif fightmodel == 6 then
  134. local pkVal = pk.getpkvalue(target)
  135. if pkVal <= 0 then
  136. return false, {}
  137. end
  138. end
  139. fightResult.targethurt = targethurt --受击者伤害
  140. --伤害后AG和SD操作执行
  141. -- GameEvent.push(EventCfg.onAttackAGAndSD, paramMap, fightResult, extra_result)
  142. AGAndSD.onAttackAGAndSD(paramMap, fightResult, extra_result)
  143. if casthurt > 0 then
  144. casthurt = AGAndSD.onReflexDamage(paramMap, fightResult, extra_result, casthurt)
  145. end
  146. targethurt = fightResult.targethurt
  147. hurttype = fightResult.hurttype
  148. end
  149. --推送攻击前事件
  150. GameEvent.push(EventCfg.AttackDamage, paramMap, fightResult, tAddHurt)
  151. -- 吸血
  152. -- this.RecoverHP(paramMap,targethurt)
  153. -- fightlog(
  154. -- string.joinVar("目标扣血", math.floor(targethurt)) ..
  155. -- string.joinVar("攻击者扣血", math.floor(casthurt)) ..
  156. -- string.joinVar("目标扣护盾", math.floor(targetshield)) ..
  157. -- string.joinVar("攻击者扣护盾", math.floor(castershield)) ..
  158. -- string.joinVar("伤害类型", hurttype) ..
  159. -- string.joinVar("伤害次数", repeat1, true)
  160. -- )
  161. fightResult.casthurt = casthurt --攻击者伤害
  162. fightResult.targethurt = targethurt --受击者伤害
  163. fightResult.targethurtshow = targethurt --飘字使用的伤害
  164. -- if castertype == MapObjectType.PLAYER then
  165. -- info(FightLog, "战斗日志打印")
  166. -- end
  167. -- fightResult.castershield = castershield --攻击者者扣除护盾
  168. -- fightResult.targetshield = targetshield --受击者扣除护盾
  169. fightResult.hurttype = hurttype --伤害类型
  170. -- fightResult["repeat"] = repeat1 --伤害次数
  171. -- fightResult.comboskill = comboskill --是否是连击技能
  172. -- fightResult.target = target --目标对象
  173. local result = { fightResult }
  174. if #extra_result > 0 then
  175. table.concatTable(result, extra_result)
  176. end
  177. -- info("现伤害3",fightResult)
  178. return true, result
  179. end
  180. -- 被动技能
  181. function this.AttackPassiveSkill(actor, paramMapList)
  182. local selfType = getbaseinfo(actor, "mapobjecttype")
  183. if selfType ~= MapObjectType.PLAYER then
  184. return
  185. end
  186. local targetList = {}
  187. local skillId = paramMapList[1].skillid
  188. local skillLevel = paramMapList[1].skilllevel
  189. for _, paramMap in pairs(paramMapList) do
  190. table.insert(targetList, paramMap["target"])
  191. end
  192. PassiveSkill.RoleAttack(actor, targetList, skillId, skillLevel)
  193. end
  194. function this.IsSelfPet(actor, target)
  195. if actor == nil or target == nil then
  196. return false
  197. end
  198. local selfType = getbaseinfo(actor, "mapobjecttype")
  199. local targetType = getbaseinfo(target, "mapobjecttype")
  200. if selfType ~= MapObjectType.PLAYER then
  201. return false
  202. end
  203. if targetType ~= MapObjectType.PET then
  204. return false
  205. end
  206. local masterId = getbaseinfo(target, "master")
  207. local id = getbaseinfo(actor, "id")
  208. if masterId ~= id then
  209. return false
  210. end
  211. return true
  212. end
  213. function this.logTargetAttrInfo(targetActor)
  214. if targetActor == nil then
  215. return
  216. end
  217. local targetAttrInfo = getallattrinfo(targetActor)
  218. if targetAttrInfo == nil then
  219. return
  220. end
  221. local logText = ""
  222. for k, v in pairs(targetAttrInfo) do
  223. local attrId = tonumber(k)
  224. local attrValue = tonumber(v)
  225. if attrValue ~= 0 then
  226. local attrName = ConfigDataManager.getTableValue("cfg_att_info", "attribute", "id", attrId)
  227. if not string.isNullOrEmpty(logText) then
  228. logText = logText .. ","
  229. end
  230. logText = logText .. attrName .. "=" .. attrValue
  231. end
  232. end
  233. if not string.isNullOrEmpty(logText) then
  234. local name = getbaseinfo(targetActor, "rolename")
  235. logText = "攻击目标=" .. name .. ",目标属性【" .. logText .. "】"
  236. end
  237. fightlog(logText)
  238. end
  239. function this.ExcuseFightDamage(actor, paramMap)
  240. --fixme 异步问题,lua队列任务执行时,地图可能已经被销毁
  241. if not mapexists(actor) then
  242. info(actor:toString() .. "执行战斗脚本时,原地图已经被销毁")
  243. return this.BuildFightResult(0, 0, 0, 0, 108, 1)
  244. end
  245. this.initData(paramMap)
  246. fightlog("\n==========================================\n战斗日志\n==========================================")
  247. local caster = paramMap.caster
  248. local castType = paramMap.castertype
  249. local target = paramMap.target
  250. local skillid = paramMap.skillid
  251. -- local targetType = paramMap["targettype"]
  252. local isComboSkill = ComboSkills[skillid] ~= nil
  253. -- if castType == MapObjectType.PLAYER then
  254. -- local comboSkill = getrolefield(caster, "role.roleskill.comboskill")
  255. -- isComboSkill = tonumber(paramMap["skillid"]) == comboSkill.skillCfgId
  256. -- end
  257. if castType >= MapObjectType.PARTNER then
  258. fightlog("不存在的攻击者类型 " .. castType)
  259. local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  260. return { result }
  261. end
  262. --检测没有副本次数 不对BOSS造成伤害 已经删除 有需求重新做
  263. if this.IsSelfPet(actor, target) then
  264. fightlog("攻击自己的召唤兽无效")
  265. local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  266. return { result }
  267. end
  268. -- this.logTargetAttrInfo(target)
  269. -- 庇护判断
  270. if this.CheckBiHuBuff(paramMap) == true then
  271. fightlog("庇护生效,无法对玩家造成伤害")
  272. local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  273. return { result }
  274. end
  275. -- PK值判断
  276. -- if this.CheckPKCanHurt(paramMap) == false then
  277. -- fightlog("pk值较高,无法对玩家造成伤害")
  278. -- local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  279. -- return { result }
  280. -- end
  281. -- 攻城战是否可以攻击
  282. -- if not RolandSeige.CanAttackRolandWall(actor, target, castType, targetType) then
  283. -- local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  284. -- return { result }
  285. -- end
  286. local resultList = {}
  287. -- 计算技能的重复伤害(伤害次数)
  288. local repeatl = this.getRepeatInfo(paramMap)
  289. for i = 1, repeatl, 1 do
  290. -- 计算伤害
  291. local hurtMin = 1
  292. local originDamage, hurtType = this.DamageCalculate(paramMap)
  293. -- -- 新手期锁血
  294. -- if this.noviceProtect(paramMap, originDamage) then
  295. -- local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  296. -- return { result }
  297. -- end
  298. if originDamage <= 0 then
  299. if castType == MapObjectType.PLAYER then
  300. local level = tonumber(getbaseinfo(actor, "level"))
  301. hurtMin = math.max(1, math.floor(level / 10))
  302. end
  303. if isComboSkill ~= true then
  304. local result = this.BuildFightResult(0, hurtMin, 0, 0, hurtType, 1)
  305. return { result }
  306. end
  307. end
  308. local elementalDamage = 0
  309. local elementalType = nil
  310. if castType == MapObjectType.PLAYER or castType == MapObjectType.PET then
  311. -- 元素伤害
  312. elementalDamage, elementalType = this.ElementalHurt(paramMap)
  313. end
  314. -- 火龙附加伤害
  315. originDamage = this.handleHuolong(paramMap, originDamage)
  316. -- 副本修正伤害
  317. --如果元素伤害大于0 则基础伤害覆盖元素伤害 之前对方加的 明显是BUG
  318. -- if elementalDamage > 0 then
  319. -- elementalDamage = originDamage
  320. -- end
  321. local result = {}
  322. if isComboSkill then
  323. -- local skillHurt = APIGetInt(actor, "ZC_LianJiHurt")
  324. originDamage = (getattrinfo(caster, "strength") * 0.5 + getattrinfo(caster, "agility") * 0.5 + getattrinfo(caster, "intelligence") *0.5) *
  325. (1 + getattrinfo(caster, "conboAdditionalRatio")) + originDamage + hurtMin
  326. -- originDamage = originDamage * math.randomFloat(0.9, 1)
  327. result = this.BuildFightResult(0, originDamage, 0, 0, 301, 1, isComboSkill)
  328. end
  329. if not next(result) then
  330. result = this.BuildFightResult(0, originDamage, 0, 0, hurtType, 1, isComboSkill)
  331. end
  332. -- 命中率判断
  333. -- if this.CanHit(paramMap) == false then
  334. -- local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  335. -- return { result }
  336. -- end
  337. if isComboSkill or this.CanHit(paramMap) then
  338. table.insert(resultList, result)
  339. if elementalDamage > 0 then
  340. local elementalResult = this.BuildFightResult(0, elementalDamage, 0, 0, elementalType, 1, isComboSkill)
  341. table.insert(resultList, elementalResult)
  342. end
  343. else
  344. local result = this.BuildFightResult(0, 0, 0, 0, 108, 1)
  345. table.insert(resultList, result)
  346. end
  347. end
  348. -- if paramMap.castertype == MapObjectType.PLAYER then
  349. -- local comboSkill = getrolefield(caster, "role.roleskill.comboskill")
  350. -- if tonumber(skillid) ~= comboSkill.skillCfgId then
  351. -- local skillHurt = 0
  352. -- for _, v in pairs(resultList) do
  353. -- skillHurt = skillHurt + v.targethurt
  354. -- end
  355. -- APISetInt(actor, "ZC_LianJiHurt", skillHurt)
  356. -- end
  357. -- end
  358. if paramMap.castertype == MapObjectType.PLAYER then
  359. local skillHurt = 0
  360. local count = 0
  361. for _, v in pairs(resultList) do
  362. skillHurt = skillHurt + v.targethurt
  363. count = count + 1
  364. end
  365. -- APISetInt(actor, "ZC_DurabilityHurt", skillHurt)
  366. APISetInt(actor, "ZC_DurabilityHurtCount", count)
  367. end
  368. return resultList
  369. end
  370. -- 线上秒杀加日志
  371. function this.LogMiaoSha(actor, target, targetType, hurt, monsterCfgId, skillId)
  372. if targetType == MapObjectType.MONSTER then
  373. local monsterType = tonumber(ConfigDataManager.getTableValue("cfg_monster", "type", "id", monsterCfgId))
  374. if monsterType == 2 or monsterType == 3 then
  375. local maxHp = getbaseinfo(target, "maxhp")
  376. if hurt * 2 >= maxHp then
  377. info(actor:toString() .. "变身对BOSS造成巨额伤害。skillId:" .. skillId .. " ;monsterCfg:" .. monsterCfgId)
  378. end
  379. end
  380. end
  381. end
  382. -- 攻击回血
  383. function this.RecoverHP(paramMap, originDamage)
  384. local caster = paramMap["caster"]
  385. local HPAttackRecover = getattrinfo(caster, "HPAttackRecover")
  386. local HPAttackRecoveronus = getattrinfo(caster, "HPAttackRecoveronus")
  387. local attackBlood = getattrinfo(caster, "attackBlood")
  388. local attackRecover = originDamage * attackBlood
  389. local hpRecover = HPAttackRecover * (1 + HPAttackRecoveronus) + attackRecover
  390. local currentHp = getbaseinfo(caster, "hp")
  391. sethp(caster, hpRecover + currentHp)
  392. end
  393. --计算反伤
  394. -- 163 PVP反射伤害固定值增加 pvpDamageReflexAdd
  395. -- 164 PVP反射伤害固定值减少 pvpDamageReflexReduce
  396. function this.ReflexDamage(paramMap, originDamage)
  397. local casterHurt = 0
  398. local caster = paramMap["caster"]
  399. local target = paramMap["target"]
  400. local damageReflexProbability = getattrinfo(target, "damageReflexProbability")
  401. local damageReflexResistanceProbability = getattrinfo(caster, "damageReflexResistanceProbability")
  402. local rate = damageReflexProbability - damageReflexResistanceProbability
  403. if this.SelectRate(rate) then
  404. local damageReflex = getattrinfo(target, "damageReflex")
  405. local pvpDamageReflexAdd = getattrinfo(target, "pvpDamageReflexAdd")
  406. local pvpDamageReflexReduce = getattrinfo(caster, "pvpDamageReflexReduce")
  407. casterHurt = originDamage * damageReflex + pvpDamageReflexAdd - pvpDamageReflexReduce
  408. casterHurt = math.max(0, casterHurt)
  409. end
  410. return casterHurt
  411. end
  412. --处理重复伤害次数
  413. function this.getRepeatInfo(paramMap)
  414. local valueTimes = paramMap.CfgData.valuetimes
  415. local repeatl = 1
  416. if valueTimes ~= nil or valueTimes ~= "" then
  417. repeatl = RandomUtil.selectKey(valueTimes)
  418. end
  419. repeatl = math.max(repeatl, 1)
  420. return repeatl
  421. end
  422. function this.handleHuolong(paramMap, originDamage)
  423. local caster = paramMap["caster"]
  424. local castMapObjectType = getbaseinfo(caster, "mapobjecttype")
  425. if castMapObjectType ~= MapObjectType.MONSTER then
  426. return originDamage
  427. end
  428. local monsterInfo = getmonsterinfo(caster)
  429. local cfgId = monsterInfo["cfgid"]
  430. if tonumber(cfgId) ~= MonsterConfigId.HUOLONG then
  431. return originDamage
  432. end
  433. local target = paramMap["target"]
  434. local targetMaxHp = getattrinfo(target, "maxHP")
  435. local costHp = targetMaxHp * 0.05
  436. return originDamage + costHp
  437. end
  438. function this.noviceProtect(paramMap, originDamage)
  439. local target = paramMap["target"]
  440. local targetType = paramMap["targettype"]
  441. if targetType ~= MapObjectType.PLAYER then
  442. return false
  443. end
  444. local novice = getplaydef(target, NOVICE_PROTECT)
  445. if not novice then
  446. return false
  447. end
  448. if novice then
  449. local currentHp = getbaseinfo(target, "hp")
  450. local haveHp = currentHp - (originDamage or 0)
  451. local stringHp = ConfigDataManager.getTableValue("cfg_global", "value", "id", "15004")
  452. local hp = tonumber(stringHp)
  453. if haveHp < hp then
  454. return true
  455. end
  456. end
  457. return false
  458. end
  459. function this.initData(paramMap)
  460. local caster = paramMap["caster"]
  461. local originType = {
  462. [HurtTypeDefKeys.YI_BAN] = "1",
  463. [HurtTypeDefKeys.ZHUO_YUE] = "0",
  464. [HurtTypeDefKeys.XING_YUN] = "0",
  465. [HurtTypeDefKeys.WU_SHI] = "0",
  466. [HurtTypeDefKeys.SHUANG_BEI] = "0",
  467. [HurtTypeDefKeys.BAO_JI] = "0",
  468. }
  469. paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] = originType
  470. table.clear(FightLog)
  471. end
  472. function this.GetHurtType(caster)
  473. -- local resultType = getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  474. -- local yiBanGongJi = resultType[HurtTypeDefKeys.YI_BAN]
  475. -- local zhuoYueYiJi = resultType[HurtTypeDefKeys.ZHUO_YUE]
  476. -- local xinYunYiJi = resultType[HurtTypeDefKeys.XING_YUN]
  477. -- local wuShiFangYu = resultType[HurtTypeDefKeys.WU_SHI]
  478. -- local shuangBeiYiJi = resultType[HurtTypeDefKeys.SHUANG_BEI]
  479. -- -- local baoJi = resultType[HurtTypeDefKeys.BAO_JI]
  480. -- local typeString = yiBanGongJi .. zhuoYueYiJi .. xinYunYiJi .. wuShiFangYu .. shuangBeiYiJi --..baoJi
  481. -- local hurtTypeCache = getsysvar(SystemVarConst.NORMAL_DAMAGE_TYPE_CACHE, 0)
  482. -- local type = hurtTypeCache[typeString]
  483. -- if type == nil then
  484. -- error(caster, caster, "获取攻击类型配置失败,结果为", typeString)
  485. -- type = 101
  486. -- end
  487. -- return type
  488. return 0
  489. end
  490. function this.GetElementalHurtType(caster, key)
  491. local elementalCache = getsysvar(SystemVarConst.ELEMENTAL_DAMAGE_TYPE_CACHE, 0)
  492. local type = elementalCache[key]
  493. if type == nil then
  494. if string.contains(key, "1") then
  495. error(caster, caster, "获取元素伤害类型配置失败,结果为", key)
  496. end
  497. type = 101
  498. end
  499. return type
  500. end
  501. function this.BuildFightResult(casthurt, targethurt, castershield, targetshield, hurttype, repeatl, combo)
  502. combo = combo or false
  503. local result = {}
  504. result["comboskill"] = combo
  505. result["casthurt"] = casthurt
  506. result["targethurt"] = targethurt
  507. result["castershield"] = castershield
  508. result["targetshield"] = targetshield
  509. result["hurttype"] = hurttype
  510. result["repeat"] = repeatl
  511. result["targethurtshow"] = targethurt / repeatl --飘字体用的伤害:真实伤害除以次数
  512. local next_stage = true
  513. if hurttype == 108 and targethurt == 0 then
  514. next_stage = false
  515. end
  516. result["next_stage"] = next_stage
  517. result["fightLog"] = FightLog
  518. return result
  519. end
  520. --计算伤害1(六条特殊属性计算)
  521. function this.getDamage1(actor, paramMap)
  522. --基础伤害
  523. local minDC, maxDC = this.GetDCBySkill(paramMap)
  524. local damage = math.randomFloat(minDC, maxDC)
  525. local tab = {
  526. { this.IsXingYunYiJi(paramMap), damage = this.XingYunDamage(paramMap, maxDC), qz = 100 }, --幸运一击
  527. { this.IsZhuoYueYiJi(paramMap), damage = this.ZhuoYueDamage(paramMap, damage), qz = 100 }, --卓越一击
  528. { this.IsShuangBeiYiJi(paramMap), damage = this.ShuangBeiYiJi(paramMap, damage), qz = 100 }, --双倍一击
  529. { this.IsBaoJi(paramMap), damage = this.BaoJi(paramMap, damage), qz = 100 }, --暴击
  530. { this.IsZhiMingYiJi(paramMap), damage = this.ZhiMingYiJi(paramMap, damage), qz = 100 }, --致命一击
  531. { this.IsSanBeiYiJi(paramMap), damage = this.SanBeiYiJi(paramMap, damage), qz = 100 }, --三倍一击
  532. }
  533. local tab1 = {}
  534. for i = 1, #tab do
  535. local bool = tab[i][1]
  536. if bool then
  537. table.insert(tab1, tab[i])
  538. end
  539. end
  540. if next(tab1) then
  541. local index = API.GetQZ(tab1)
  542. return tab1[index].damage
  543. else
  544. return damage
  545. end
  546. end
  547. function this.PlayerCastDamage(actor, paramMap)
  548. local caster = paramMap["caster"]
  549. local target = paramMap["target"]
  550. local armor = getattrinfo(target, "armor")
  551. local targetType = paramMap["targettype"]
  552. local delArmor = 0
  553. if targetType == MapObjectType.PLAYER then
  554. local armorPenetValue = getattrinfo(caster, "armorPenetValue")
  555. local armorPenetRate = getattrinfo(caster, "armorPenetRate")
  556. delArmor = armorPenetValue * (1 + armorPenetRate)
  557. fightlog("防御穿透=" .. delArmor)
  558. end
  559. local var
  560. if this.IsWuShiFangYu(paramMap) then
  561. fightlog("触发 无视防御")
  562. var = 0
  563. else
  564. var = 1
  565. end
  566. fightlog("伤害1=【IF(A六条特殊触发(幸运/卓越一击等),A随机攻击)-(B防御-(PVP防御穿透固定值*(1+PVP防御穿透加成)))/2*IF(A无视防御触发,0,1)】")
  567. local damage1 = this.getDamage1(actor, paramMap) - math.max(0, (armor - delArmor)) / 2 * var +
  568. getattrinfo(caster, "hushichuantoufangyu") -- + hushichuantoufangyu
  569. fightlog("伤害1:" .. damage1)
  570. --伤害2=伤害1 * A使用技能对应技能系数
  571. fightlog("伤害2=伤害1 * A使用技能对应技能系数")
  572. local powerRate = tonumber(paramMap.CfgData.powerrate) or 0
  573. powerRate = powerRate == '' and 0 or (powerRate / 10000)
  574. local damage2 = damage1 * powerRate
  575. fightlog("伤害2:" .. damage2)
  576. --伤害3=伤害2 *(1+A加点伤害加成)
  577. fightlog("伤害3=伤害2 *(1+A加点伤害加成")
  578. local addtion = this.GetJiaDianAddition(paramMap)
  579. local damage3 = damage2 * (1 + addtion)
  580. fightlog("伤害3:" .. damage3)
  581. -- 伤害4=伤害3+A使用技能伤害的固定值 fixedDamage
  582. fightlog("伤害4=伤害3+A使用技能伤害的固定值 fixedDamage")
  583. local fixedDamage = paramMap.CfgData.fixeddamage or 0
  584. fixedDamage = fixedDamage == '' and 0 or fixedDamage
  585. local damage4 = damage3 + fixedDamage
  586. local finalDamage = damage4
  587. -- 处于攻城战副本时,范围伤害修改 删除 有需求重新做
  588. -- A打B最终伤害<保底伤害时,最终伤害=保底伤害=A最大攻击力*可配置系数
  589. fightlog("A打B最终伤害<保底伤害时,最终伤害=保底伤害=(A最大攻击力+最小攻击力)/2*可配置系数")
  590. local minDC, maxDC = this.GetDCBySkill(paramMap)
  591. local factor = tonumber(ConfigDataManager.getTableValue("cfg_global", "value", "id", 7000)) / 10000
  592. local minDamage = (minDC + maxDC) / 2 * factor
  593. local originFinalDamage = finalDamage
  594. if finalDamage < minDamage then
  595. finalDamage = minDamage
  596. end
  597. fightlog("最终伤害:" .. originFinalDamage .. " 保底伤害:" .. minDamage)
  598. return finalDamage
  599. end
  600. -- 元素伤害
  601. function this.ElementalHurt(paramMap)
  602. local caster = paramMap.caster
  603. local target = paramMap.target
  604. local hurtTypeKey
  605. -- 圣光
  606. local shengGuangDamage = 0
  607. local HolyUnMissRate = getattrinfo(caster, "HolyUnMissRate")
  608. local HolyResistUnMissRate = getattrinfo(target, "HolyResistUnMissRate")
  609. local HolyAttack = getattrinfo(caster, "HolyAttack")
  610. if not this.SelectRate(math.max(0, HolyResistUnMissRate - HolyUnMissRate)) and HolyAttack > 0 then
  611. local HolyDamageIncreased = getattrinfo(caster, "HolyDamageIncreased")
  612. local HolyDamageIncreasedBonus = getattrinfo(caster, "HolyDamageIncreasedBonus")
  613. local HolyDamageReduction = getattrinfo(target, "HolyDamageReduction")
  614. local HolyDamageReductionBonus = getattrinfo(target, "HolyDamageReductionBonus")
  615. shengGuangDamage = HolyAttack * (1 + HolyDamageIncreasedBonus - HolyDamageReductionBonus) + HolyDamageIncreased -
  616. HolyDamageReduction
  617. shengGuangDamage = math.max(shengGuangDamage, 0)
  618. if shengGuangDamage > 0 then
  619. hurtTypeKey = "1"
  620. else
  621. hurtTypeKey = "0"
  622. end
  623. else
  624. hurtTypeKey = "0"
  625. end
  626. -- info("圣光伤害="..shengGuangDamage)
  627. -- 黑暗
  628. local heiAnDamage = 0
  629. local DarkUnMissRate = getattrinfo(caster, "DarkUnMissRate")
  630. local DarkResistUnMissRate = getattrinfo(target, "DarkResistUnMissRate")
  631. local DarkAttack = getattrinfo(caster, "DarkAttack")
  632. if not this.SelectRate(math.max(0, DarkResistUnMissRate - DarkUnMissRate)) and DarkAttack > 0 then
  633. local DarkDamageIncreased = getattrinfo(caster, "DarkDamageIncreased")
  634. local DarkDamageIncreasedBonus = getattrinfo(caster, "DarkDamageIncreasedBonus")
  635. local DarkDamageReduction = getattrinfo(target, "DarkDamageReduction")
  636. local DarkDamageReductionBonus = getattrinfo(target, "DarkDamageReductionBonus")
  637. heiAnDamage = DarkAttack * (1 + DarkDamageIncreasedBonus - DarkDamageReductionBonus) + DarkDamageIncreased -
  638. DarkDamageReduction
  639. heiAnDamage = math.max(heiAnDamage, 0)
  640. if heiAnDamage > 0 then
  641. hurtTypeKey = hurtTypeKey .. "1"
  642. else
  643. hurtTypeKey = hurtTypeKey .. "0"
  644. end
  645. else
  646. hurtTypeKey = hurtTypeKey .. "0"
  647. end
  648. -- 雷电
  649. local leiDianDamage = 0
  650. local ThunderUnMissRate = getattrinfo(caster, "ThunderUnMissRate")
  651. local ThunderResistUnMissRate = getattrinfo(target, "ThunderResistUnMissRate")
  652. local ThunderAttack = getattrinfo(caster, "ThunderAttack")
  653. if not this.SelectRate(math.max(0, ThunderResistUnMissRate - ThunderUnMissRate)) and ThunderAttack > 0 then
  654. local ThunderDamageIncreased = getattrinfo(caster, "ThunderDamageIncreased")
  655. local ThunderDamageIncreasedBonus = getattrinfo(caster, "ThunderDamageIncreasedBonus")
  656. local ThunderDamageReduction = getattrinfo(target, "ThunderDamageReduction")
  657. local ThunderDamageReductionBonus = getattrinfo(target, "ThunderDamageReductionBonus")
  658. leiDianDamage = ThunderAttack * (1 + ThunderDamageIncreasedBonus - ThunderDamageReductionBonus) +
  659. ThunderDamageIncreased - ThunderDamageReduction
  660. leiDianDamage = math.max(leiDianDamage, 0)
  661. if leiDianDamage > 0 then
  662. hurtTypeKey = hurtTypeKey .. "1"
  663. else
  664. hurtTypeKey = hurtTypeKey .. "0"
  665. end
  666. else
  667. hurtTypeKey = hurtTypeKey .. "0"
  668. end
  669. -- 风暴
  670. local fengBaoDmage = 0
  671. local StormUnMissRate = getattrinfo(caster, "StormUnMissRate")
  672. local StormResistUnMissRate = getattrinfo(target, "StormResistUnMissRate")
  673. local StormAttack = getattrinfo(caster, "StormAttack")
  674. if not this.SelectRate(math.max(0, StormResistUnMissRate - StormUnMissRate)) and StormAttack > 0 then
  675. local StormDamageIncreased = getattrinfo(caster, "StormDamageIncreased")
  676. local StormDamageIncreasedBonus = getattrinfo(caster, "StormDamageIncreasedBonus")
  677. local StormDamageReduction = getattrinfo(target, "StormDamageReduction")
  678. local StormDamageReductionBonus = getattrinfo(target, "StormDamageReductionBonus")
  679. fengBaoDmage = StormAttack * (1 + StormDamageIncreasedBonus - StormDamageReductionBonus) + StormDamageIncreased -
  680. StormDamageReduction
  681. fengBaoDmage = math.max(fengBaoDmage, 0)
  682. if fengBaoDmage > 0 then
  683. hurtTypeKey = hurtTypeKey .. "1"
  684. else
  685. hurtTypeKey = hurtTypeKey .. "0"
  686. end
  687. else
  688. hurtTypeKey = hurtTypeKey .. "0"
  689. end
  690. local totalDamage = shengGuangDamage + heiAnDamage + leiDianDamage + fengBaoDmage
  691. totalDamage = math.max(0, totalDamage)
  692. -- info("元素伤害="..totalDamage)
  693. -- 伤害类型(飘字)
  694. local hurtType = PlayerFight.GetElementalHurtType(caster, hurtTypeKey)
  695. return totalDamage, hurtType
  696. end
  697. function this.IsWuShiFangYu(paramMap)
  698. --A无视防御概率=A无视防御率 *(1 - B无视防御抵抗)
  699. local caster = paramMap["caster"]
  700. local target = paramMap["target"]
  701. local unMissRate = this.getAttValueWithName(caster, "unMissRate")
  702. local unMissResistanceRate = this.getAttValueWithName(target, "unMissResistanceRate")
  703. local probability = unMissRate * (1 - unMissResistanceRate)
  704. local result = this.SelectRate(probability)
  705. if result then
  706. local resultType = paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE]
  707. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  708. resultType[HurtTypeDefKeys.WU_SHI] = "1"
  709. paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] = resultType
  710. -- setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  711. end
  712. return result
  713. end
  714. function this.IsXingYunYiJi(paramMap)
  715. --A幸运一击触发概率=A幸运一击概率 *(1 - B幸运一击概率抵抗)
  716. local caster = paramMap["caster"]
  717. local target = paramMap["target"]
  718. local criticalDamageChance = getattrinfo(caster, "criticalDamageChance")
  719. local criticalDamageResistanceChance = getattrinfo(target, "criticalDamageResistanceChance")
  720. local probability = criticalDamageChance * (1 - criticalDamageResistanceChance)
  721. local result = this.SelectRate(probability)
  722. if result then
  723. local resultType = paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] --getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  724. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  725. resultType[HurtTypeDefKeys.XING_YUN] = "1"
  726. paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] = resultType
  727. -- setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  728. end
  729. return result
  730. end
  731. function this.XingYunDamage(paramMap, damage)
  732. local caster = paramMap["caster"]
  733. local target = paramMap["target"]
  734. fightlog("触发 幸运一击")
  735. --A幸运攻击=A最大攻击 *(1+A幸运一击伤害加成 - B幸运一击伤害减少)
  736. local criticalDamageBonus = getattrinfo(caster, "criticalDamageBonus")
  737. local criticalDamageReducationBonus = getattrinfo(target, "criticalDamageReducationBonus")
  738. return damage * (1 + criticalDamageBonus - criticalDamageReducationBonus)
  739. end
  740. function this.IsZhuoYueYiJi(paramMap)
  741. --A卓越一击触发概率=A卓越一击概率*(1-B卓越一击概率抵抗)
  742. local caster = paramMap["caster"]
  743. local target = paramMap["target"]
  744. local excellentDamageChance = getattrinfo(caster, "excellentDamageChance")
  745. local excellentDamageResistanceChance = getattrinfo(target, "excellentDamageResistanceChance")
  746. local probability = excellentDamageChance * (1 - excellentDamageResistanceChance)
  747. local result = this.SelectRate(probability)
  748. if result then
  749. local resultType = paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] -- getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  750. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  751. resultType[HurtTypeDefKeys.ZHUO_YUE] = "1"
  752. paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] = resultType
  753. -- setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  754. end
  755. return result
  756. end
  757. function this.ZhuoYueDamage(paramMap, damage)
  758. local caster = paramMap["caster"]
  759. local target = paramMap["target"]
  760. --A卓越攻击=A随机攻击 * IF(A卓越一击触发,A卓越一击伤害系数,0)*(1+A卓越一击伤害加成 - B卓越一击伤害减少)
  761. local coefficient
  762. fightlog("触发 卓越一击")
  763. coefficient = (tonumber(paramMap.CfgData.excellentrate) or 0) / 10000
  764. local excellentDamageBonus = getattrinfo(caster, "excellentDamageBonus")
  765. local excellentDamageReducationBonus = getattrinfo(target, "excellentDamageReducationBonus")
  766. return damage * coefficient * (1 + excellentDamageBonus - excellentDamageReducationBonus)
  767. end
  768. function this.IsShuangBeiYiJi(paramMap)
  769. --A双倍一击触发概率=A双倍一击概率 *(1 - B双倍一击概率抵抗)
  770. local caster = paramMap["caster"]
  771. local target = paramMap["target"]
  772. local doubleDamageChance = getattrinfo(caster, "doubleDamageChance")
  773. local doubleDamageResistanceChance = getattrinfo(target, "doubleDamageResistanceChance")
  774. local probability = doubleDamageChance * (1 - doubleDamageResistanceChance)
  775. local result = this.SelectRate(probability)
  776. if result then
  777. local resultType = paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] --getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  778. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  779. resultType[HurtTypeDefKeys.SHUANG_BEI] = "1"
  780. paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] = resultType
  781. -- setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  782. end
  783. return result
  784. end
  785. function this.ShuangBeiYiJi(paramMap, damage)
  786. local caster = paramMap["caster"]
  787. local target = paramMap["target"]
  788. --A双倍攻击=A随机攻击 * IF(A双倍一击触发,1,0)*(1+A双倍一击伤害加成 - B双倍一击伤害减少)
  789. local coefficient = 1
  790. local doubleDamageBonus = getattrinfo(caster, "doubleDamageBonus")
  791. local doubleDamageReducationBonus = getattrinfo(target, "doubleDamageReducationBonus")
  792. return damage * coefficient * (1 + doubleDamageBonus - doubleDamageReducationBonus)
  793. end
  794. function this.IsBaoJi(paramMap)
  795. --A双倍一击触发概率=A双倍一击概率 *(1 - B双倍一击概率抵抗)
  796. local caster = paramMap["caster"]
  797. local target = paramMap["target"]
  798. local criticalStrikeChance = getattrinfo(caster, "criticalStrikeChance")
  799. local criticalStrikeResistanceChance = getattrinfo(target, "criticalStrikeResistanceChance")
  800. local probability = criticalStrikeChance * (1 - criticalStrikeResistanceChance)
  801. local result = this.SelectRate(probability)
  802. if result then
  803. local resultType = paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] --getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  804. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  805. resultType[HurtTypeDefKeys.BAO_JI] = "1"
  806. paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] = resultType
  807. -- setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  808. end
  809. return result
  810. end
  811. function this.BaoJi(paramMap, damage)
  812. local caster = paramMap["caster"]
  813. local target = paramMap["target"]
  814. local coefficient = 1
  815. --A暴击=A随机攻击 * IF(A暴击触发,1,0)*(1+A暴击伤害加成 - B暴击伤害减少)
  816. local criticalStrikeBonus = getattrinfo(caster, "criticalStrikeBonus")
  817. local criticalStrikeReducationBonus = getattrinfo(target, "criticalStrikeReducationBonus")
  818. return damage * coefficient * (1 + criticalStrikeBonus - criticalStrikeReducationBonus)
  819. end
  820. function this.IsZhiMingYiJi(paramMap)
  821. --A致命一击触发概率=A致命一击概率 *(1 - B致命一击概率抵抗)
  822. local caster = paramMap["caster"]
  823. local target = paramMap["target"]
  824. local doubleDamageChance = getattrinfo(caster, "deadlyStrikeChance")
  825. local doubleDamageResistanceChance = getattrinfo(target, "deadlyStrikeResistanceChance")
  826. local probability = doubleDamageChance * (1 - doubleDamageResistanceChance)
  827. local result = this.SelectRate(probability)
  828. if result then
  829. local resultType = paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] -- getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  830. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  831. resultType[HurtTypeDefKeys.ZHI_MING] = "1"
  832. paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] = resultType
  833. -- setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  834. end
  835. return result
  836. end
  837. function this.ZhiMingYiJi(paramMap, damage)
  838. local caster = paramMap["caster"]
  839. local target = paramMap["target"]
  840. --A致命一击=A随机攻击 * IF(A致命一击触发,1,0)*(1+A致命一击伤害加成 - B致命一击伤害减少)
  841. local coefficient = 1
  842. local deadlyStrikeBonus = getattrinfo(caster, "deadlyStrikeBonus")
  843. local deadlyStrikeReducationBonus = getattrinfo(target, "deadlyStrikeReducationBonus")
  844. return damage * coefficient * (1 + deadlyStrikeBonus - deadlyStrikeReducationBonus)
  845. end
  846. function this.IsSanBeiYiJi(paramMap)
  847. --A三倍一击触发概率=A三倍一击概率 *(1 - B三倍一击概率抵抗)
  848. local caster = paramMap["caster"]
  849. local target = paramMap["target"]
  850. local doubleDamageChance = getattrinfo(caster, "tripleDamageChance")
  851. local doubleDamageResistanceChance = getattrinfo(target, "tripleDamageResistanceChance")
  852. local probability = doubleDamageChance * (1 - doubleDamageResistanceChance)
  853. local result = this.SelectRate(probability)
  854. if result then
  855. local resultType = paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] -- getplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE)
  856. resultType[HurtTypeDefKeys.YI_BAN] = "0"
  857. resultType[HurtTypeDefKeys.SAN_BEI] = "1"
  858. paramMap[PlayerDefKey.PLAYER_FIGHT_HURT_TYPE] = resultType
  859. -- setplaydef(caster, PlayerDefKey.PLAYER_FIGHT_HURT_TYPE, resultType)
  860. end
  861. return result
  862. end
  863. function this.SanBeiYiJi(paramMap, damage)
  864. local caster = paramMap["caster"]
  865. local target = paramMap["target"]
  866. --A三倍攻击=A随机攻击 * IF(A三倍一击触发,1,0)*(1+A三倍一击伤害加成 - B三倍一击伤害减少)
  867. local coefficient = 1
  868. local tripleDamageReduce = getattrinfo(caster, "tripleDamageReduce")
  869. local tripleDamageReducationBonus = getattrinfo(target, "tripleDamageReducationBonus")
  870. return damage * coefficient * (1 + tripleDamageReduce - tripleDamageReducationBonus)
  871. end
  872. function this.IfAttackedMutipleMonster(paramMap)
  873. local caster = paramMap["caster"]
  874. local target = paramMap["target"]
  875. local castType = paramMap["castertype"]
  876. local targetType = paramMap["targettype"]
  877. if castType ~= 2 or targetType ~= 1 then
  878. return false
  879. end
  880. local monsterId = caster:toString()
  881. local lastDataList = getplaydef(target, LastAttakedByMonster)
  882. local nowMillis = getbaseinfo("now")
  883. if type(lastDataList) ~= "table" then
  884. setplaydef(target, LastAttakedByMonster, { monsterId, nowMillis })
  885. return false
  886. end
  887. local lastMonsterId = lastDataList[1]
  888. local lastMillis = lastDataList[2]
  889. local duration = nowMillis - lastMillis
  890. if lastMonsterId == monsterId or duration < 1000 then
  891. setplaydef(target, LastAttakedByMonster, { monsterId, nowMillis })
  892. return false
  893. end
  894. setplaydef(target, LastAttakedByMonster, { monsterId, nowMillis })
  895. return true
  896. end
  897. function this.GetJiaDianAddition(paramMap)
  898. local caster = paramMap["caster"]
  899. local injuryType = tonumber(paramMap.CfgData.injurytype) or 0
  900. if injuryType == 1 then
  901. local addtion = getattrinfo(caster, "PhysicalDamage")
  902. return addtion
  903. elseif injuryType == 2 then
  904. local addtion = getattrinfo(caster, "MagicDamage")
  905. return addtion
  906. elseif injuryType == 3 then
  907. local addtion = getattrinfo(caster, "freeAtt8")
  908. return addtion
  909. else
  910. local maxDC = getattrinfo(caster, "maxDC")
  911. local maxMC = getattrinfo(caster, "maxMC")
  912. local maxCurDC = getattrinfo(caster, "maximumCurseAttackPower")
  913. if maxDC >= maxMC and maxDC >= maxCurDC then
  914. local addtion = getattrinfo(caster, "PhysicalDamage")
  915. return addtion
  916. elseif maxMC >= maxDC and maxMC >= maxCurDC then
  917. local addtion = getattrinfo(caster, "MagicDamage")
  918. return addtion
  919. elseif maxCurDC >= maxDC and maxCurDC >= maxMC then
  920. local addtion = getattrinfo(caster, "freeAtt8")
  921. return addtion
  922. end
  923. error("不存在的伤害类型" .. injuryType .. "skillId:" .. skillId)
  924. return 0
  925. end
  926. end
  927. function this.GetDCBySkill(paramMap)
  928. local caster = paramMap["caster"]
  929. local injuryType = tonumber(paramMap.CfgData.injurytype)
  930. if injuryType == 1 then
  931. local maxDC = getattrinfo(caster, "maxDC")
  932. local minDC = getattrinfo(caster, "minDC")
  933. return minDC, maxDC
  934. elseif injuryType == 2 then
  935. local maxMC = getattrinfo(caster, "maxMC")
  936. local minMC = getattrinfo(caster, "minMC")
  937. return minMC, maxMC
  938. elseif injuryType == 3 then
  939. local maxMC = getattrinfo(caster, "maximumCurseAttackPower")
  940. local minMC = getattrinfo(caster, "minimumCurseAttackPower")
  941. return minMC, maxMC
  942. else
  943. local maxDC = getattrinfo(caster, "maxDC")
  944. local maxMC = getattrinfo(caster, "maxMC")
  945. local maxCurDC = getattrinfo(caster, "maximumCurseAttackPower")
  946. if maxDC >= maxMC and maxDC >= maxCurDC then
  947. local minDC = getattrinfo(caster, "minDC")
  948. return minDC, maxDC
  949. elseif maxMC >= maxDC and maxMC >= maxCurDC then
  950. local minMC = getattrinfo(caster, "minMC")
  951. return minMC, maxMC
  952. elseif maxCurDC >= maxDC and maxCurDC >= maxMC then
  953. local minCurDC = getattrinfo(caster, "minimumCurseAttackPower")
  954. return minCurDC, maxCurDC
  955. end
  956. return 0, 0
  957. end
  958. end
  959. function this.CanHit(paramMap)
  960. local caster = paramMap.caster
  961. local target = paramMap.target
  962. local hitRate
  963. local missRate
  964. if paramMap.castertype == MapObjectType.MONSTER or paramMap.targettype == MapObjectType.MONSTER then
  965. --pve
  966. -- 209011 攻击率
  967. hitRate = this.getAttValueWithName(caster, "hitRate")
  968. -- 101 PVE攻击率加成
  969. local pvehitRateBonus = this.getAttValueWithName(caster, "pvehitRateBonus")
  970. if pvehitRateBonus > 0 then
  971. hitRate = hitRate * (1 + pvehitRateBonus)
  972. end
  973. -- 211011 防御率
  974. missRate = this.getAttValueWithName(target, "missRate")
  975. -- -- 103 PVE防御率加成
  976. -- local missRateBonus = this.getAttValueWithName(target, "missRateBonus")
  977. -- if missRateBonus > 0 then
  978. -- missRate = missRate * (1 + missRateBonus)
  979. -- end
  980. else
  981. --pvp
  982. -- 152/210011 PVP攻击率
  983. hitRate = this.getAttValueWithName(caster, "pvpattackRate")
  984. -- 153 PVP攻击率加成
  985. local attackRateBonus = this.getAttValueWithName(caster, "attackRateBonus")
  986. if attackRateBonus > 0 then
  987. hitRate = hitRate * (1 + attackRateBonus)
  988. end
  989. -- 154 PVP防御率
  990. missRate = this.getAttValueWithName(target, "eraRate")
  991. -- 155 PVP防御率加成
  992. local eraRateBonus = this.getAttValueWithName(target, "eraRateBonus")
  993. if eraRateBonus > 0 then
  994. missRate = missRate * (1 + eraRateBonus)
  995. end
  996. end
  997. local basicMiss = 0 --getattrinfo(target, "freeAtt10")
  998. local probability
  999. if hitRate == 0 then
  1000. probability = 0
  1001. else
  1002. probability = 1 - missRate / hitRate
  1003. end
  1004. -- if missRate + hitRate == 0 then
  1005. -- probability = 1
  1006. -- else
  1007. -- probability = 1 - (1 - 1 / ((missRate - hitRate) / (missRate + hitRate) * 0.8 + 1)) - basicMiss
  1008. -- end
  1009. local hit = this.RandomResult(probability)
  1010. fightlog("命中概率:" .. string.numToPercent(probability) .. " 命中结果:" .. tostring(hit))
  1011. return hit
  1012. end
  1013. function this.SelectRate(probability)
  1014. local randomNum = math.random()
  1015. if randomNum <= probability then
  1016. return true
  1017. else
  1018. return false
  1019. end
  1020. end
  1021. function this.CheckPKCanHurt(paramMap)
  1022. -- local caster = paramMap["caster"]
  1023. -- local target = paramMap["target"]
  1024. -- local castType = paramMap["castertype"]
  1025. -- local targetType = paramMap["targettype"]
  1026. -- if castType == 1 and targetType == 1 then
  1027. -- -- PK值判断是否可以造成伤害
  1028. -- local pkValue = tonumber(pk.getpkvalue(caster))
  1029. -- local pkCountTableInfo = ConfigDataManager.getTable("cfg_pk_count", "pvpDamage", 1)
  1030. -- if pkCountTableInfo and #pkCountTableInfo > 0 then
  1031. -- local maxPkValue = 0
  1032. -- for _, v in ipairs(pkCountTableInfo) do
  1033. -- local nameColor = tostring(v["namecolor"])
  1034. -- local split = string.split(nameColor, "#")
  1035. -- local minValue = tonumber(split[1])
  1036. -- local maxValue = tonumber(split[2])
  1037. -- if pkValue >= minValue and pkValue <= maxValue then
  1038. -- -- PK值在此区间内不造成伤害
  1039. -- tipinfo(caster, "pk值较高,无法对玩家造成伤害")
  1040. -- return false
  1041. -- end
  1042. -- maxPkValue = maxPkValue > maxValue and maxPkValue or maxValue
  1043. -- end
  1044. -- if pkValue and pkValue ~= 0 and pkValue > maxPkValue then
  1045. -- tipinfo(caster, "pk值较高,无法对玩家造成伤害")
  1046. -- return false
  1047. -- end
  1048. -- else
  1049. -- error("pkCountTableInfo is null")
  1050. -- end
  1051. -- -- PK值判断end
  1052. -- end
  1053. return true
  1054. end
  1055. function this.CheckBiHuBuff(paramMap)
  1056. local castType = paramMap.castertype
  1057. local targetType = paramMap.targettype
  1058. -- 受击不是玩家,不享受庇护
  1059. if targetType ~= MapObjectType.PLAYER and targetType ~= MapObjectType.PET then
  1060. return false
  1061. end
  1062. -- 攻击不是玩家,不享受庇护
  1063. if castType ~= MapObjectType.PLAYER and castType ~= MapObjectType.PET then
  1064. return false
  1065. end
  1066. -- 不享受庇护buff的地图
  1067. -- local maps = ConfigDataManager.getTableValue("cfg_global", "value", "id", "2000004")
  1068. -- if table.contains(string.split(maps, "#", true), paramMap.mapid) then
  1069. -- return false
  1070. -- end
  1071. -- 不在0~8点,不享受庇护
  1072. local h = TimeUtil.GetTodayHour()
  1073. if h < 23 and h >= 8 then
  1074. return false
  1075. end
  1076. local caster = paramMap.caster
  1077. local target = paramMap.target
  1078. -- local debuffId = ConfigDataManager.getTableValue("cfg_global", "value", "id", "2000003")
  1079. local buffId = 104001 -- tonumber(ConfigDataManager.getTableValue("cfg_global", "value", "id", "260004")) --减少读表消耗
  1080. -- 被击者有庇护buff,享受庇护
  1081. if hasbuff(target, buffId) then
  1082. messagebox(caster, "被击者有庇护buff,享受庇护")
  1083. return true
  1084. end
  1085. -- local delbuff = false
  1086. -- if hasbuff(caster, buffId) then
  1087. -- -- delbuff = true
  1088. -- return true
  1089. -- end
  1090. -- local bossType = ConfigDataManager.getTableValue("cfg_monster", "type", "id", paramMap.monsterid) --减少消耗放前端检测BOSS
  1091. -- if targetType == MapObjectType.MONSTER and tonumber(bossType) == 3 then -- BOSS
  1092. -- delbuff = true
  1093. -- end
  1094. -- if delbuff then
  1095. -- tipinfo(caster, "庇护buff被移除,庇护失效")
  1096. -- Buffer.HandleBiHu(caster, buffId, 1)
  1097. -- end
  1098. return false
  1099. end
  1100. function this.AfterCalcuDamage(paramMap, finalDamage)
  1101. -- 如果攻击的怪物是秘境副本的BOSS则累加记录实时伤害
  1102. local caster = paramMap["caster"]
  1103. local target = paramMap["target"]
  1104. local castType = paramMap["castertype"]
  1105. local targetType = paramMap["targettype"]
  1106. if castType == 1 and targetType == 2 then
  1107. local monsterId = paramMap["monsterid"]
  1108. -- local bossChallenge = ConfigDataManager.getTable("cfg_BOSS_challenge", "monsterType", BossType.SECRET_REALM_BOSS)
  1109. -- for i = 1, #bossChallenge do
  1110. -- if tonumber(monsterId) == tonumber(bossChallenge[i].monsterid) then
  1111. -- -- 存储实时伤害
  1112. -- SecretRealm.savePlayerHurtInfo(caster, target, finalDamage < 0 and 1 or finalDamage)
  1113. -- end
  1114. -- end
  1115. if SecretRealm.isSecretRealmBoss(monsterId) then
  1116. -- 存储实时伤害
  1117. SecretRealm.savePlayerHurtInfo(caster, target, finalDamage < 0 and 1 or finalDamage)
  1118. end
  1119. -- 保存战盟boos造成伤害的玩家
  1120. WarAlliance.savePlayerInvloveInfo(caster, target, finalDamage, monsterId)
  1121. end
  1122. end
  1123. --计算对怪伤害加成 返回 monsterDamageValueAdd,monsterDamageRateAdd 固定值增伤 百分比曾伤
  1124. function PlayerFight.getMonsterDamageAdd(actor, paramMap)
  1125. local caster = paramMap.caster --—— 攻击对象
  1126. local target = paramMap.target --—— 受击对象
  1127. local castertype = getbaseinfo(caster, "mapobjecttype")
  1128. local targettype = getbaseinfo(target, "mapobjecttype")
  1129. local monsterDamageValueAdd = 0 --增伤固定值
  1130. local monsterDamageRateAdd = 0 --增伤万分比(小数)
  1131. if castertype ~= MapObjectType.PLAYER and castertype ~= MapObjectType.PET then
  1132. fightlog("-----------------------攻击方对象不是玩家-----------------------")
  1133. return monsterDamageValueAdd, monsterDamageRateAdd
  1134. end
  1135. if targettype ~= MapObjectType.MONSTER then
  1136. fightlog("-----------------------受击对象不是怪物-----------------------")
  1137. return monsterDamageValueAdd, monsterDamageRateAdd
  1138. end
  1139. local logText = "" --伤害日志
  1140. local monsterInfo = getmonsterinfo(target)
  1141. local monsterId = monsterInfo.cfgid
  1142. --monsterType =1 小怪 2=黄金怪 3=boss 4=超级BOSS
  1143. local monsterType = ConfigDataManager.getTableValue("cfg_monster", "type", "id", monsterId)
  1144. if string.isNullOrEmpty(monsterType) then
  1145. monsterType = "1"
  1146. end
  1147. monsterType = tonumber(monsterType)
  1148. logText = logText .. "-----------------------攻击怪物-----------------------------"
  1149. local pveshanghaizengjiaValue = getattrinfo(caster, "pveshanghaizengjiaValue") or 0
  1150. if pveshanghaizengjiaValue > 0 then
  1151. monsterDamageValueAdd = monsterDamageValueAdd + pveshanghaizengjiaValue
  1152. logText = logText .. string.joinVar("104 pve伤害增加", math.floor(pveshanghaizengjiaValue))
  1153. end
  1154. local pveshanghaijiachengRate = getattrinfo(caster, "pveshanghaijiachengRate") or 0
  1155. if pveshanghaijiachengRate > 0 then
  1156. monsterDamageRateAdd = monsterDamageRateAdd + pveshanghaijiachengRate
  1157. logText = logText .. string.joinVar("105 pve伤害加成", math.floor(pveshanghaijiachengRate))
  1158. end
  1159. if monsterType == 1 then
  1160. local duixiaoguaishanghaizengjiaValue = getattrinfo(caster, "duixiaoguaishanghaizengjiaValue") or 0
  1161. if duixiaoguaishanghaizengjiaValue > 0 then
  1162. monsterDamageValueAdd = monsterDamageValueAdd + duixiaoguaishanghaizengjiaValue
  1163. logText = logText .. string.joinVar("110 对小怪伤害增加", math.floor(duixiaoguaishanghaizengjiaValue))
  1164. end
  1165. local duixiaoguaishanghaijiachengRate = getattrinfo(caster, "duixiaoguaishanghaijiachengRate") or 0
  1166. if duixiaoguaishanghaijiachengRate > 0 then
  1167. monsterDamageRateAdd = monsterDamageRateAdd + duixiaoguaishanghaijiachengRate
  1168. logText = logText .. string.joinVar("111 对小怪伤害加成", math.floor(duixiaoguaishanghaijiachengRate))
  1169. end
  1170. elseif monsterType == 2 then
  1171. local duihuangjinguaishanghaizengjiaValue = getattrinfo(caster, "duihuangjinguaishanghaizengjiaValue") or 0
  1172. if duihuangjinguaishanghaizengjiaValue > 0 then
  1173. monsterDamageValueAdd = monsterDamageValueAdd + duihuangjinguaishanghaizengjiaValue
  1174. logText = logText .. string.joinVar("114 对黄金怪伤害增加", math.floor(duihuangjinguaishanghaizengjiaValue))
  1175. end
  1176. local duihuangjinguaishanghaijiachengRate = getattrinfo(caster, "duihuangjinguaishanghaijiachengRate") or 0
  1177. if duihuangjinguaishanghaijiachengRate > 0 then
  1178. monsterDamageRateAdd = monsterDamageRateAdd + duihuangjinguaishanghaijiachengRate
  1179. logText = logText .. string.joinVar("115 对黄金怪伤害加成", math.floor(duihuangjinguaishanghaijiachengRate))
  1180. end
  1181. elseif monsterType == 3 then
  1182. local duibossshanghaizengjiaValue = getattrinfo(caster, "duibossshanghaizengjiaValue")
  1183. if duibossshanghaizengjiaValue > 0 then
  1184. monsterDamageValueAdd = monsterDamageValueAdd + duibossshanghaizengjiaValue
  1185. logText = logText .. string.joinVar("118 对BOSS伤害增加", math.floor(duibossshanghaizengjiaValue))
  1186. end
  1187. local duibossshanghaijiachengRate = getattrinfo(caster, "duibossshanghaijiachengRate")
  1188. if duibossshanghaijiachengRate > 0 then
  1189. monsterDamageRateAdd = monsterDamageRateAdd + duibossshanghaijiachengRate
  1190. logText = logText .. string.joinVar("119 对BOSS伤害加成", math.floor(duibossshanghaijiachengRate))
  1191. end
  1192. elseif monsterType == 4 then
  1193. local duichaojibossshanghaizengjiaValue = getattrinfo(caster, "duichaojibossshanghaizengjiaValue")
  1194. if duichaojibossshanghaizengjiaValue > 0 then
  1195. monsterDamageValueAdd = monsterDamageValueAdd + duichaojibossshanghaizengjiaValue
  1196. logText = logText .. string.joinVar("122 对超级BOSS伤害增加", math.floor(duichaojibossshanghaizengjiaValue))
  1197. end
  1198. local duichaojibossshanghaijiachengRate = getattrinfo(caster, "duichaojibossshanghaijiachengRate")
  1199. if duichaojibossshanghaijiachengRate > 0 then
  1200. monsterDamageRateAdd = monsterDamageRateAdd + duichaojibossshanghaijiachengRate
  1201. logText = logText .. string.joinVar("123 对超级BOSS伤害加成", math.floor(duichaojibossshanghaijiachengRate))
  1202. end
  1203. end
  1204. fightlog(
  1205. logText ..
  1206. string.joinVar("对怪伤害最终固定值", math.floor(monsterDamageValueAdd)) ..
  1207. string.joinVar("对怪伤害最终万分比", math.floor(monsterDamageRateAdd))
  1208. )
  1209. return monsterDamageValueAdd, monsterDamageRateAdd
  1210. end
  1211. --计算对怪伤害减免 返回 monsterDamageValueDel,monsterDamageRateDel 固定值减伤 百分比减伤
  1212. function PlayerFight.getMonsterDamageDel(actor, paramMap)
  1213. local caster = paramMap.caster --—— 攻击对象
  1214. local target = paramMap.target --—— 受击对象
  1215. local castertype = getbaseinfo(caster, "mapobjecttype")
  1216. local targettype = getbaseinfo(target, "mapobjecttype")
  1217. local monsterDamageValueDel = 0 --减伤固定值
  1218. local monsterDamageRateDel = 0 --减伤万分比(小数)
  1219. local logText = ""
  1220. if castertype ~= MapObjectType.MONSTER then
  1221. fightlog("-----------------------攻击方对象不是怪物-----------------------")
  1222. return monsterDamageValueDel, monsterDamageRateDel
  1223. end
  1224. if targettype ~= MapObjectType.PLAYER and targettype ~= MapObjectType.PET then
  1225. fightlog("-----------------------受击方对象不是玩家-----------------------")
  1226. return monsterDamageValueDel, monsterDamageRateDel
  1227. end
  1228. logText = logText .. "-----------------------被怪物攻击-----------------------------"
  1229. local monsterInfo = getmonsterinfo(caster)
  1230. local monsterId = monsterInfo.cfgid
  1231. --monsterType =1 小怪 2=黄金怪 3=boss 4=超级BOSS
  1232. local monsterType = ConfigDataManager.getTableValue("cfg_monster", "type", "id", monsterId)
  1233. if string.isNullOrEmpty(monsterType) then
  1234. monsterType = "1"
  1235. end
  1236. monsterType = tonumber(monsterType)
  1237. local pveshanghaijianshaoValue = getattrinfo(target, "pveshanghaijianshaoValue") or 0
  1238. if pveshanghaijianshaoValue > 0 then
  1239. monsterDamageValueDel = monsterDamageValueDel + pveshanghaijianshaoValue
  1240. logText = logText .. string.joinVar("106 pve伤害减少", math.floor(pveshanghaijianshaoValue))
  1241. end
  1242. -- 107 pve伤害减免 PVE伤害减免万分比 pveshanghaijianmianRate
  1243. local pveshanghaijianmianRate = getattrinfo(target, "pveshanghaijianmianRate") or 0
  1244. if pveshanghaijianmianRate > 0 then
  1245. monsterDamageRateDel = monsterDamageRateDel + pveshanghaijianmianRate
  1246. logText = logText .. string.joinVar("107 pve伤害减免", math.floor(pveshanghaijianmianRate))
  1247. end
  1248. if monsterType == 1 then
  1249. local xiaoguaishanghaijianshaoValue = getattrinfo(target, "xiaoguaishanghaijianshaoValue")
  1250. if xiaoguaishanghaijianshaoValue > 0 then
  1251. monsterDamageValueDel = monsterDamageValueDel + xiaoguaishanghaijianshaoValue
  1252. logText = logText .. string.joinVar("112 小怪伤害减少", math.floor(xiaoguaishanghaijianshaoValue))
  1253. end
  1254. local xiaoguaishanghaijianmianRate = getattrinfo(target, "xiaoguaishanghaijianmianRate")
  1255. if xiaoguaishanghaijianmianRate > 0 then
  1256. monsterDamageRateDel = xiaoguaishanghaijianmianRate
  1257. logText = logText .. string.joinVar("113 小怪伤害减免", math.floor(xiaoguaishanghaijianmianRate))
  1258. end
  1259. elseif monsterType == 2 then
  1260. local huangjinguaishanghaijianshaoValue = getattrinfo(target, "huangjinguaishanghaijianshaoValue")
  1261. if huangjinguaishanghaijianshaoValue > 0 then
  1262. monsterDamageValueDel = monsterDamageValueDel + huangjinguaishanghaijianshaoValue
  1263. logText = logText .. string.joinVar("116 黄金怪伤害减少", math.floor(huangjinguaishanghaijianshaoValue))
  1264. end
  1265. local huangjinguaishanghaijianmianRate = getattrinfo(target, "huangjinguaishanghaijianmianRate")
  1266. if huangjinguaishanghaijianmianRate > 0 then
  1267. monsterDamageRateDel = huangjinguaishanghaijianmianRate
  1268. logText = logText .. string.joinVar("117 黄金怪伤害减免", math.floor(huangjinguaishanghaijianmianRate))
  1269. end
  1270. elseif monsterType == 3 then
  1271. local bossshanghaijianshaoValue = getattrinfo(target, "bossshanghaijianshaoValue")
  1272. if bossshanghaijianshaoValue > 0 then
  1273. monsterDamageValueDel = monsterDamageValueDel + bossshanghaijianshaoValue
  1274. logText = logText .. string.joinVar("120 BOSS伤害减少", math.floor(bossshanghaijianshaoValue))
  1275. end
  1276. local bossshanghaijianmianRate = getattrinfo(target, "bossshanghaijianmianRate")
  1277. if bossshanghaijianmianRate > 0 then
  1278. monsterDamageRateDel = bossshanghaijianmianRate
  1279. logText = logText .. string.joinVar("121 BOSS伤害减免", math.floor(bossshanghaijianmianRate))
  1280. end
  1281. elseif monsterType == 4 then
  1282. local chaojibossshanghaijianshaoValue = getattrinfo(target, "chaojibossshanghaijianshaoValue")
  1283. if chaojibossshanghaijianshaoValue > 0 then
  1284. monsterDamageValueDel = monsterDamageValueDel + chaojibossshanghaijianshaoValue
  1285. logText = logText .. string.joinVar("124 超级BOSS伤害减少", math.floor(chaojibossshanghaijianshaoValue))
  1286. end
  1287. local chaojibossshanghaijianmianRate = getattrinfo(target, "chaojibossshanghaijianmianRate")
  1288. if chaojibossshanghaijianmianRate > 0 then
  1289. monsterDamageRateDel = chaojibossshanghaijianmianRate
  1290. logText = logText .. string.joinVar("125 超级BOSS伤害减免", math.floor(chaojibossshanghaijianmianRate))
  1291. end
  1292. end
  1293. fightlog(
  1294. logText ..
  1295. string.joinVar("受怪减免最终固定值", math.floor(monsterDamageValueDel)) ..
  1296. string.joinVar("受怪减免最终百分比", math.floor(monsterDamageRateDel))
  1297. )
  1298. return monsterDamageValueDel, monsterDamageRateDel
  1299. end
  1300. --计算PVP伤害 返回 PVPDamageValue,PVPDamageRate PVP固定值总加成-总减免 PVP百分比总加成-总减免
  1301. function PlayerFight.getPVPDamage(actor, paramMap)
  1302. local caster = paramMap.caster --—— 攻击对象
  1303. local target = paramMap.target --—— 受击对象
  1304. local castertype = getbaseinfo(caster, "mapobjecttype")
  1305. local targettype = getbaseinfo(target, "mapobjecttype")
  1306. local PVPDamageValue = 0 --A PVP固定值总加成-B总减免
  1307. local PVPDamageRate = 0 --A PVP百分比总加成-B总减免
  1308. if castertype ~= MapObjectType.PLAYER and castertype ~= MapObjectType.PET then
  1309. fightlog("----------------PVP-------攻击方对象不是玩家-----------------------")
  1310. return PVPDamageValue, PVPDamageRate
  1311. end
  1312. if targettype ~= MapObjectType.PLAYER then
  1313. fightlog("----------------PVP-------受击对象不是玩家-----------------------")
  1314. return PVPDamageValue, PVPDamageRate
  1315. end
  1316. -- 对固定职业的加减伤
  1317. local tab = {
  1318. [1] = {
  1319. add = "duijianshishanghaizengjiaValue",
  1320. del = "duijianshishanghaijianshaoValue",
  1321. addRate = "duijianshishanghaijiachengRate",
  1322. delRate = "duijianshishanghaijianmianRate"
  1323. },
  1324. [2] = {
  1325. add = "duifashishanghaizengjiaValue",
  1326. del = "duifashishanghaijianshaoValue",
  1327. addRate = "duifashishanghaijiachengRate",
  1328. delRate = "duifashishanghaijianmianRate"
  1329. },
  1330. [3] = {
  1331. add = "duigongjianshoushanghaizengjiaValue",
  1332. del = "duigongjianshoushanghaijianshaoValue",
  1333. addRate = "duigongjianshoushanghaijiachengRate",
  1334. delRate = "duigongjianshoushanghaijianmianRate"
  1335. },
  1336. [4] = {
  1337. add = "duimojianshishanghaizengjiaValue",
  1338. del = "duimojianshishanghaijianshaoValue",
  1339. addRate = "duimojianshishanghaijiachengRate",
  1340. delRate = "duimojianshishanghaijianmianRate"
  1341. },
  1342. [5] = {
  1343. add = "duishengdaoshishanghaizengjiaValue",
  1344. del = "duishengdaoshishanghaijianshaoValue",
  1345. addRate = "duishengdaoshishanghaijiachengRate",
  1346. delRate = "duishengdaoshishanghaijianmianRate"
  1347. },
  1348. [6] = {
  1349. add = "duizhaohuanshishanghaizengjiaValue",
  1350. del = "duizhaohuanshishanghaijianshaoValue",
  1351. addRate = "duizhaohuanshishanghaijiachengRate",
  1352. delRate = "duizhaohuanshishanghaijianmianRate"
  1353. }
  1354. }
  1355. local casterCareer = getbaseinfo(caster, "getbasecareer")
  1356. local targerCareer = getbaseinfo(target, "getbasecareer")
  1357. local del = getattrinfo(target, tab[casterCareer].del) or 0
  1358. local delRate = getattrinfo(target, tab[casterCareer].delRate) or 0
  1359. local add = getattrinfo(caster, tab[targerCareer].add) or 0
  1360. local addRate = getattrinfo(caster, tab[targerCareer].addRate) or 0
  1361. PVPDamageValue = PVPDamageValue + math.max(0, add - del)
  1362. PVPDamageRate = PVPDamageRate + math.max(0, addRate - delRate)
  1363. -- 156 pvp伤害增加
  1364. -- 158 pvp伤害减少
  1365. local pvpDamageAdd = getattrinfo(caster, "pvpDamageAdd") or 0
  1366. local pvpDamageReduce = getattrinfo(target, "pvpDamageReduce") or 0
  1367. PVPDamageValue = PVPDamageValue + math.max(0, pvpDamageAdd - pvpDamageReduce)
  1368. -- 157 PVP伤害加成 计算伤害3 damageBonus
  1369. -- 159 PVP伤害减免 计算伤害3 damageReductionBonus
  1370. local damageBonus = getattrinfo(caster, "damageBonus") or 0
  1371. local damageReductionBonus = getattrinfo(target, "damageReductionBonus") or 0
  1372. PVPDamageRate = PVPDamageRate + math.max(0, damageBonus - damageReductionBonus)
  1373. -- 161 PVP出血伤害固定值
  1374. -- 162 PVP出血伤害抵抗固定值
  1375. local pvpBleedDamageAdd = getattrinfo(caster, "pvpBleedDamageAdd") or 0
  1376. local pvpBleedDamageReduce = getattrinfo(target, "pvpBleedDamageReduce") or 0
  1377. PVPDamageValue = PVPDamageValue + math.max(0, pvpBleedDamageAdd - pvpBleedDamageReduce)
  1378. return PVPDamageValue, PVPDamageRate
  1379. end
  1380. --计算技能伤害 返回 SkillDamageValue,SkillDamageRate 技能固定值总加成-总减免 技能百分比总加成-总减免
  1381. function PlayerFight.getSkillDamage(actor, paramMap)
  1382. local caster = paramMap.caster --—— 攻击对象
  1383. local target = paramMap.target --—— 受击对象
  1384. local castertype = getbaseinfo(caster, "mapobjecttype")
  1385. local targettype = getbaseinfo(target, "mapobjecttype")
  1386. local SkillDamageValue = 0 --A 技能固定值总加成-B总减免
  1387. local SkillDamageRate = 0 --A 技能百分比总加成-B总减免
  1388. if castertype == MapObjectType.PLAYER and targettype == MapObjectType.PLAYER then
  1389. --描述:
  1390. --type 1:need无效 2:need=职业 3:need=技能名称
  1391. --pct 1=计算百分比 0=计算固定值
  1392. --add=增加伤害的属性英文名 del 降低伤害的属性英文名
  1393. local tab = {
  1394. -- 500 技能伤害增加 技能伤害绝对值 jinengshanghaizengjiaValue
  1395. -- 502 技能伤害减少 被技能伤害减少绝对值 jinengshanghaijianshaoValue
  1396. { add = "jinengshanghaizengjiaValue", del = "jinengshanghaijianshaoValue", type = 1, need = "", pct = 0 },
  1397. -- 501 技能伤害加成 技能伤害万分比 jinengshanghaijiachengRate
  1398. -- 503 技能伤害减免 被技能伤害减免万分比 jinengshanghaijianmianRate
  1399. { add = "jinengshanghaijiachengRate", del = "jinengshanghaijianmianRate", type = 1, need = "", pct = 1 },
  1400. -- 504 剑士技能伤害增加 剑士技能伤害绝对值 jianshijinengshanghaizengjiaValue
  1401. -- 506 剑士技能伤害减少 被剑士技能伤害减少绝对值 jianshijinengshanghaijianshaoValue
  1402. { add = "jianshijinengshanghaizengjiaValue", del = "jianshijinengshanghaijianshaoValue", type = 2, need = 1, pct = 0 },
  1403. -- 508 法师技能伤害增加 法师技能伤害绝对值 fashijinengshanghaizengjiaValue
  1404. -- 510 法师技能伤害减少 被法师技能伤害减少绝对值 fashijinengshanghaijianshaoValue
  1405. { add = "fashijinengshanghaizengjiaValue", del = "fashijinengshanghaijianshaoValue", type = 2, need = 2, pct = 0 },
  1406. -- 512 弓箭手技能伤害增加 弓箭手技能伤害绝对值 gongjianshoujinengshanghaizengjiaValue
  1407. -- 514 弓箭手技能伤害减少 被弓箭手技能伤害减少绝对值 gongjianshoujinengshanghaijianshaoValue
  1408. { add = "gongjianshoujinengshanghaizengjiaValue", del = "gongjianshoujinengshanghaijianshaoValue", type = 2, need = 3, pct = 0 },
  1409. -- 516 魔剑士技能伤害增加 魔剑士技能伤害绝对值 mojianshijinengshanghaizengjiaValue
  1410. -- 518 魔剑士技能伤害减少 被魔剑士技能伤害减少绝对值 mojianshijinengshanghaijianshaoValue
  1411. { add = "mojianshijinengshanghaizengjiaValue", del = "mojianshijinengshanghaijianshaoValue", type = 2, need = 4, pct = 0 },
  1412. -- 520 召唤师技能伤害增加 召唤师技能伤害绝对值 zhaohuanshijinengshanghaizengjiaValue
  1413. -- 522 召唤师技能伤害减少 被召唤师技能伤害减少绝对值 zhaohuanshijinengshanghaijianshaoValue
  1414. { add = "zhaohuanshijinengshanghaizengjiaValue", del = "zhaohuanshijinengshanghaijianshaoValue", type = 2, need = 5, pct = 0 },
  1415. -- 524 圣导师技能伤害增加 圣导师技能伤害绝对值 shengdaoshijinengshanghaizengjiaValue
  1416. -- 526 圣导师技能伤害减少 被圣导师技能伤害减少绝对值 shengdaoshijinengshanghaijianshaoValue
  1417. { add = "shengdaoshijinengshanghaizengjiaValue", del = "shengdaoshijinengshanghaijianshaoValue", type = 2, need = 6, pct = 0 },
  1418. -- 505 剑士技能伤害加成 剑士技能伤害万分比 jianshijinengshanghaijiachengRate
  1419. -- 507 剑士技能伤害减免 被剑士技能伤害减免万分比 jianshijinengshanghaijianmianRate
  1420. { add = "jianshijinengshanghaijiachengRate", del = "jianshijinengshanghaijianmianRate", type = 2, need = 1, pct = 1 },
  1421. -- 509 法师技能伤害加成 法师技能伤害万分比 fashijinengshanghaijiachengRate
  1422. -- 511 法师技能伤害减免 被法师技能伤害减免万分比 fashijinengshanghaijianmianRate
  1423. { add = "fashijinengshanghaijiachengRate", del = "fashijinengshanghaijianmianRate", type = 2, need = 2, pct = 1 },
  1424. -- 513 弓箭手技能伤害加成 弓箭手技能伤害万分比 gongjianshoujinengshanghaijiachengRate
  1425. -- 515 弓箭手技能伤害减免 被弓箭手技能伤害减免万分比 gongjianshoujinengshanghaijianmianRate
  1426. { add = "gongjianshoujinengshanghaijiachengRate", del = "gongjianshoujinengshanghaijianmianRate", type = 2, need = 3, pct = 1 },
  1427. -- 517 魔剑士技能伤害加成 魔剑士技能伤害万分比 mojianshijinengshanghaijiachengRate
  1428. -- 519 魔剑士技能伤害减免 被魔剑士技能伤害减免万分比 mojianshijinengshanghaijianmianRate
  1429. { add = "mojianshijinengshanghaijiachengRate", del = "mojianshijinengshanghaijianmianRate", type = 2, need = 4, pct = 1 },
  1430. -- 521 召唤师技能伤害加成 召唤师技能伤害万分比 zhaohuanshijinengshanghaijiachengRate
  1431. -- 523 召唤师技能伤害减免 被召唤师技能伤害减免万分比 zhaohuanshijinengshanghaijianmianRate
  1432. { add = "zhaohuanshijinengshanghaijiachengRate", del = "zhaohuanshijinengshanghaijianmianRate", type = 2, need = 5, pct = 1 },
  1433. -- 525 圣导师技能伤害加成 圣导师技能伤害万分比 shengdaoshijinengshanghaijiachengRate
  1434. -- 527 圣导师技能伤害减免 被圣导师技能伤害减免万分比 shengdaoshijinengshanghaijianmianRate
  1435. { add = "shengdaoshijinengshanghaijiachengRate", del = "shengdaoshijinengshanghaijianmianRate", type = 2, need = 6, pct = 1 },
  1436. -- 528 升龙击伤害增加 升龙击伤害绝对值 shenglongjishanghaizengjiaValue
  1437. -- 530 升龙击伤害减少 被升龙击伤害减少绝对值 shenglongjishanghaijianshaoValue
  1438. { add = "shenglongjishanghaizengjiaValue", del = "shenglongjishanghaijianshaoValue", type = 3, need = "升龙击", pct = 0 },
  1439. -- 529 升龙击伤害加成 升龙击伤害万分比 shenglongjishanghaijiachengRate
  1440. -- 531 升龙击伤害减免 被升龙击伤害减免万分比 shenglongjishanghaijianmianRate
  1441. { add = "shenglongjishanghaijiachengRate", del = "shenglongjishanghaijianmianRate", type = 3, need = "升龙击", pct = 1 },
  1442. -- 532 地裂斩伤害增加 地裂斩伤害绝对值 diliezhanshanghaizengjiaValue
  1443. -- 534 地裂斩伤害减少 被地裂斩伤害减少绝对值 diliezhanshanghaijianshaoValue
  1444. { add = "diliezhanshanghaizengjiaValue", del = "diliezhanshanghaijianshaoValue", type = 3, need = "地裂斩", pct = 0 },
  1445. -- 533 地裂斩伤害加成 地裂斩伤害万分比 diliezhanshanghaijiachengRate
  1446. -- 535 地裂斩伤害减免 被地裂斩伤害减免万分比 diliezhanshanghaijianmianRate
  1447. { add = "diliezhanshanghaijiachengRate", del = "diliezhanshanghaijianmianRate", type = 3, need = "地裂斩", pct = 1 },
  1448. -- 536 旋风斩伤害增加 旋风斩伤害绝对值 xuanfengzhanshanghaizengjiaValue
  1449. -- 538 旋风斩伤害减少 被旋风斩伤害减少绝对值 xuanfengzhanshanghaijianshaoValue
  1450. { add = "xuanfengzhanshanghaizengjiaValue", del = "xuanfengzhanshanghaijianshaoValue", type = 3, need = "旋风斩", pct = 0 },
  1451. -- 537 旋风斩伤害加成 旋风斩伤害万分比 xuanfengzhanshanghaijiachengRate
  1452. -- 539 旋风斩伤害减免 被旋风斩伤害减免万分比 xuanfengzhanshanghaijianmianRate
  1453. { add = "xuanfengzhanshanghaijiachengRate", del = "xuanfengzhanshanghaijianmianRate", type = 3, need = "旋风斩", pct = 1 },
  1454. -- 540 牙突刺伤害增加 牙突刺伤害绝对值 yatucishanghaizengjiaValue
  1455. -- 542 牙突刺伤害减少 被牙突刺伤害减少绝对值 yatucishanghaijianshaoValue
  1456. { add = "yatucishanghaizengjiaValue", del = "yatucishanghaijianshaoValue", type = 3, need = "牙突刺", pct = 0 },
  1457. -- 541 牙突刺伤害加成 牙突刺伤害万分比 yatucishanghaijiachengRate
  1458. -- 543 牙突刺伤害减免 被牙突刺伤害减免万分比 yatucishanghaijianmianRate
  1459. { add = "yatucishanghaijiachengRate", del = "yatucishanghaijianmianRate", type = 3, need = "牙突刺", pct = 1 },
  1460. -- 544 天地十字剑伤害增加 天地十字剑伤害绝对值 tiandishizijianshanghaizengjiaValue
  1461. -- 546 天地十字剑伤害减少 被天地十字剑伤害减少绝对值 tiandishizijianshanghaijianshaoValue
  1462. { add = "tiandishizijianshanghaizengjiaValue", del = "tiandishizijianshanghaijianshaoValue", type = 3, need = "天地十字剑", pct = 0 },
  1463. -- 545 天地十字剑伤害加成 天地十字剑伤害万分比 tiandishizijianshanghaijiachengRate
  1464. -- 547 天地十字剑伤害减免 被天地十字剑伤害减免万分比 tiandishizijianshanghaijianmianRate
  1465. { add = "tiandishizijianshanghaijiachengRate", del = "tiandishizijianshanghaijianmianRate", type = 3, need = "天地十字剑", pct = 1 },
  1466. -- 548 霹雳回旋斩伤害增加 霹雳回旋斩伤害绝对值 pilihuixuanzhanshanghaizengjiaValue
  1467. -- 550 霹雳回旋斩伤害减少 被霹雳回旋斩伤害减少绝对值 pilihuixuanzhanshanghaijianshaoValue
  1468. { add = "pilihuixuanzhanshanghaizengjiaValue", del = "pilihuixuanzhanshanghaijianshaoValue", type = 3, need = "霹雳回旋斩", pct = 0 },
  1469. -- 549 霹雳回旋斩伤害加成 霹雳回旋斩伤害万分比 pilihuixuanzhanshanghaijiachengRate
  1470. -- 551 霹雳回旋斩伤害减免 被霹雳回旋斩伤害减免万分比 pilihuixuanzhanshanghaijianmianRate
  1471. { add = "pilihuixuanzhanshanghaijiachengRate", del = "pilihuixuanzhanshanghaijianmianRate", type = 3, need = "霹雳回旋斩", pct = 1 },
  1472. -- 552 袭风刺伤害增加 袭风刺伤害绝对值 xifengcishanghaizengjiaValue
  1473. -- 554 袭风刺伤害减少 被袭风刺伤害减少绝对值 xifengcishanghaijianshaoValue
  1474. { add = "xifengcishanghaizengjiaValue", del = "xifengcishanghaijianshaoValue", type = 3, need = "袭风刺", pct = 0 },
  1475. -- 553 袭风刺伤害加成 袭风刺伤害万分比 xifengcishanghaijiachengRate
  1476. -- 555 袭风刺伤害减免 被袭风刺伤害减免万分比 xifengcishanghaijianmianRate
  1477. { add = "xifengcishanghaijiachengRate", del = "xifengcishanghaijianmianRate", type = 3, need = "袭风刺", pct = 1 },
  1478. -- 556 雷霆裂闪伤害增加 雷霆裂闪伤害绝对值 leitinglieshanshanghaizengjiaValue
  1479. -- 558 雷霆裂闪伤害减少 被雷霆裂闪伤害减少绝对值 leitinglieshanshanghaijianshaoValue
  1480. { add = "leitinglieshanshanghaizengjiaValue", del = "leitinglieshanshanghaijianshaoValue", type = 3, need = "雷霆裂闪", pct = 0 },
  1481. -- 557 雷霆裂闪伤害加成 雷霆裂闪伤害万分比 leitinglieshanshanghaijiachengRate
  1482. -- 559 雷霆裂闪伤害减免 被雷霆裂闪伤害减免万分比 leitinglieshanshanghaijianmianRate
  1483. { add = "leitinglieshanshanghaijiachengRate", del = "leitinglieshanshanghaijianmianRate", type = 3, need = "雷霆裂闪", pct = 1 },
  1484. -- 560 致命一击伤害增加 致命一击伤害绝对值 zhimingyijishanghaizengjiaValue
  1485. -- 562 致命一击伤害减少 被致命一击伤害减少绝对值 zhimingyijishanghaijianshaoValue
  1486. { add = "zhimingyijishanghaizengjiaValue", del = "zhimingyijishanghaijianshaoValue", type = 3, need = "致命一击", pct = 0 },
  1487. -- 561 致命一击伤害加成 致命一击伤害万分比 zhimingyijishanghaijiachengRate
  1488. -- 563 致命一击伤害减免 被致命一击伤害减免万分比 zhimingyijishanghaijianmianRate
  1489. { add = "zhimingyijishanghaijiachengRate", del = "zhimingyijishanghaijianmianRate", type = 3, need = "致命一击", pct = 1 },
  1490. -- 564 山崩地裂伤害增加 山崩地裂伤害绝对值 shanbengdilieshanghaizengjiaValue
  1491. -- 566 山崩地裂伤害减少 被山崩地裂伤害减少绝对值 shanbengdilieshanghaijianshaoValue
  1492. { add = "shanbengdilieshanghaizengjiaValue", del = "shanbengdilieshanghaijianshaoValue", type = 3, need = "山崩地裂", pct = 0 },
  1493. -- 565 山崩地裂伤害加成 山崩地裂伤害万分比 shanbengdilieshanghaijiachengRate
  1494. -- 567 山崩地裂伤害减免 被山崩地裂伤害减免万分比 shanbengdilieshanghaijianmianRate
  1495. { add = "shanbengdilieshanghaijiachengRate", del = "shanbengdilieshanghaijianmianRate", type = 3, need = "山崩地裂", pct = 1 },
  1496. -- 568 能量球伤害增加 能量球伤害绝对值 nengliangqiushanghaizengjiaValue
  1497. -- 570 能量球伤害减少 被能量球伤害减少绝对值 nengliangqiushanghaijianshaoValue
  1498. { add = "nengliangqiushanghaizengjiaValue", del = "nengliangqiushanghaijianshaoValue", type = 3, need = "能量球", pct = 0 },
  1499. -- 569 能量球伤害加成 能量球伤害万分比 nengliangqiushanghaijiachengRate
  1500. -- 571 能量球伤害减免 被能量球伤害减免万分比 nengliangqiushanghaijianmianRate
  1501. { add = "nengliangqiushanghaijiachengRate", del = "nengliangqiushanghaijianmianRate", type = 3, need = "能量球", pct = 1 },
  1502. -- 572 火球伤害增加 火球伤害绝对值 huoqiushanghaizengjiaValue
  1503. -- 574 火球伤害减少 被火球伤害减少绝对值 huoqiushanghaijianshaoValue
  1504. { add = "huoqiushanghaizengjiaValue", del = "huoqiushanghaijianshaoValue", type = 3, need = "火球", pct = 0 },
  1505. -- 573 火球伤害加成 火球伤害万分比 huoqiushanghaijiachengRate
  1506. -- 575 火球伤害减免 被火球伤害减免万分比 huoqiushanghaijianmianRate
  1507. { add = "huoqiushanghaijiachengRate", del = "huoqiushanghaijianmianRate", type = 3, need = "火球", pct = 1 },
  1508. -- 576 真空波伤害增加 真空波伤害绝对值 zhenkongboshanghaizengjiaValue
  1509. -- 578 真空波伤害减少 被真空波伤害减少绝对值 zhenkongboshanghaijianshaoValue
  1510. { add = "zhenkongboshanghaizengjiaValue", del = "zhenkongboshanghaijianshaoValue", type = 3, need = "真空波", pct = 0 },
  1511. -- 577 真空波伤害加成 真空波伤害万分比 zhenkongboshanghaijiachengRate
  1512. -- 579 真空波伤害减免 被真空波伤害减免万分比 zhenkongboshanghaijianmianRate
  1513. { add = "zhenkongboshanghaijiachengRate", del = "zhenkongboshanghaijianmianRate", type = 3, need = "真空波", pct = 1 },
  1514. -- 580 掌心雷伤害增加 掌心雷伤害绝对值 zhangxinleishanghaizengjiaValue
  1515. -- 582 掌心雷伤害减少 被掌心雷伤害减少绝对值 zhangxinleishanghaijianshaoValue
  1516. { add = "zhangxinleishanghaizengjiaValue", del = "zhangxinleishanghaijianshaoValue", type = 3, need = "掌心雷", pct = 0 },
  1517. -- 581 掌心雷伤害加成 掌心雷伤害万分比 zhangxinleishanghaijiachengRate
  1518. -- 583 掌心雷伤害减免 被掌心雷伤害减免万分比 zhangxinleishanghaijianmianRate
  1519. { add = "zhangxinleishanghaijiachengRate", del = "zhangxinleishanghaijianmianRate", type = 3, need = "掌心雷", pct = 1 },
  1520. -- 584 龙卷风伤害增加 龙卷风伤害绝对值 longjuanfengshanghaizengjiaValue
  1521. -- 586 龙卷风伤害减少 被龙卷风伤害减少绝对值 longjuanfengshanghaijianshaoValue
  1522. { add = "longjuanfengshanghaizengjiaValue", del = "longjuanfengshanghaijianshaoValue", type = 3, need = "龙卷风", pct = 0 },
  1523. -- 585 龙卷风伤害加成 龙卷风伤害万分比 longjuanfengshanghaijiachengRate
  1524. -- 587 龙卷风伤害减免 被龙卷风伤害减免万分比 longjuanfengshanghaijianmianRate
  1525. { add = "longjuanfengshanghaijiachengRate", del = "longjuanfengshanghaijianmianRate", type = 3, need = "龙卷风", pct = 1 },
  1526. -- 588 陨石伤害增加 陨石伤害绝对值 yunshishanghaizengjiaValue
  1527. -- 590 陨石伤害减少 被陨石伤害减少绝对值 yunshishanghaijianshaoValue
  1528. { add = "yunshishanghaizengjiaValue", del = "yunshishanghaijianshaoValue", type = 3, need = "陨石", pct = 0 },
  1529. -- 589 陨石伤害加成 陨石伤害万分比 yunshishanghaijiachengRate
  1530. -- 591 陨石伤害减免 被陨石伤害减免万分比 yunshishanghaijianmianRate
  1531. { add = "yunshishanghaijiachengRate", del = "yunshishanghaijianmianRate", type = 3, need = "陨石", pct = 1 },
  1532. -- 592 火龙伤害增加 火龙伤害绝对值 huolongshanghaizengjiaValue
  1533. -- 594 火龙伤害减少 被火龙伤害减少绝对值 huolongshanghaijianshaoValue
  1534. { add = "huolongshanghaizengjiaValue", del = "huolongshanghaijianshaoValue", type = 3, need = "火龙", pct = 0 },
  1535. -- 593 火龙伤害加成 火龙伤害万分比 huolongshanghaijiachengRate
  1536. -- 595 火龙伤害减免 被火龙伤害减免万分比 huolongshanghaijianmianRate
  1537. { add = "huolongshanghaijiachengRate", del = "huolongshanghaijianmianRate", type = 3, need = "火龙", pct = 1 },
  1538. -- 596 黑龙波伤害增加 黑龙波伤害绝对值 heilongboshanghaizengjiaValue
  1539. -- 598 黑龙波伤害减少 被黑龙波伤害减少绝对值 heilongboshanghaijianshaoValue
  1540. { add = "heilongboshanghaizengjiaValue", del = "heilongboshanghaijianshaoValue", type = 3, need = "黑龙波", pct = 0 },
  1541. -- 597 黑龙波伤害加成 黑龙波伤害万分比 heilongboshanghaijiachengRate
  1542. -- 599 黑龙波伤害减免 被黑龙波伤害减免万分比 heilongboshanghaijianmianRate
  1543. { add = "heilongboshanghaijiachengRate", del = "heilongboshanghaijianmianRate", type = 3, need = "黑龙波", pct = 1 },
  1544. -- 600 毁灭烈焰伤害增加 毁灭烈焰伤害绝对值 huimielieyanshanghaizengjiaValue
  1545. -- 602 毁灭烈焰伤害减少 被毁灭烈焰伤害减少绝对值 huimielieyanshanghaijianshaoValue
  1546. { add = "huimielieyanshanghaizengjiaValue", del = "huimielieyanshanghaijianshaoValue", type = 3, need = "毁灭烈焰", pct = 0 },
  1547. -- 601 毁灭烈焰伤害加成 毁灭烈焰伤害万分比 huimielieyanshanghaijiachengRate
  1548. -- 603 毁灭烈焰伤害减免 被毁灭烈焰伤害减免万分比 huimielieyanshanghaijianmianRate
  1549. { add = "huimielieyanshanghaijiachengRate", del = "huimielieyanshanghaijianmianRate", type = 3, need = "毁灭烈焰", pct = 1 },
  1550. -- 604 暴风雪术伤害增加 暴风雪术伤害绝对值 baofengxueshushanghaizengjiaValue
  1551. -- 606 暴风雪术伤害减少 被暴风雪术伤害减少绝对值 baofengxueshushanghaijianshaoValue
  1552. { add = "baofengxueshushanghaizengjiaValue", del = "baofengxueshushanghaijianshaoValue", type = 3, need = "暴风雪术", pct = 0 },
  1553. -- 605 暴风雪术伤害加成 暴风雪术伤害万分比 baofengxueshushanghaijiachengRate
  1554. -- 607 暴风雪术伤害减免 被暴风雪术伤害减免万分比 baofengxueshushanghaijianmianRate
  1555. { add = "baofengxueshushanghaijiachengRate", del = "baofengxueshushanghaijianmianRate", type = 3, need = "暴风雪术", pct = 1 },
  1556. -- 608 地狱火伤害增加 地狱火伤害绝对值 diyuhuoshanghaizengjiaValue
  1557. -- 610 地狱火伤害减少 被地狱火伤害减少绝对值 diyuhuoshanghaijianshaoValue
  1558. { add = "diyuhuoshanghaizengjiaValue", del = "diyuhuoshanghaijianshaoValue", type = 3, need = "地狱火", pct = 0 },
  1559. -- 609 地狱火伤害加成 地狱火伤害万分比 diyuhuoshanghaijiachengRate
  1560. -- 611 地狱火伤害减免 被地狱火伤害减免万分比 diyuhuoshanghaijianmianRate
  1561. { add = "diyuhuoshanghaijiachengRate", del = "diyuhuoshanghaijianmianRate", type = 3, need = "地狱火", pct = 1 },
  1562. -- 612 爆炎伤害增加 爆炎伤害绝对值 baoyanshanghaizengjiaValue
  1563. -- 614 爆炎伤害减少 被爆炎伤害减少绝对值 baoyanshanghaijianshaoValue
  1564. { add = "baoyanshanghaizengjiaValue", del = "baoyanshanghaijianshaoValue", type = 3, need = "爆炎", pct = 0 },
  1565. -- 613 爆炎伤害加成 爆炎伤害万分比 baoyanshanghaijiachengRate
  1566. -- 615 爆炎伤害减免 被爆炎伤害减免万分比 baoyanshanghaijianmianRate
  1567. { add = "baoyanshanghaijiachengRate", del = "baoyanshanghaijianmianRate", type = 3, need = "爆炎", pct = 1 },
  1568. -- 616 冰封伤害增加 冰封伤害绝对值 bingfengshanghaizengjiaValue
  1569. -- 618 冰封伤害减少 被冰封伤害减少绝对值 bingfengshanghaijianshaoValue
  1570. { add = "bingfengshanghaizengjiaValue", del = "bingfengshanghaijianshaoValue", type = 3, need = "冰封", pct = 0 },
  1571. -- 617 冰封伤害加成 冰封伤害万分比 bingfengshanghaijiachengRate
  1572. -- 619 冰封伤害减免 被冰封伤害减免万分比 bingfengshanghaijianmianRate
  1573. { add = "bingfengshanghaijiachengRate", del = "bingfengshanghaijianmianRate", type = 3, need = "冰封", pct = 1 },
  1574. -- 620 毒咒伤害增加 毒咒伤害绝对值 duzhoushanghaizengjiaValue
  1575. -- 622 毒咒伤害减少 被毒咒伤害减少绝对值 duzhoushanghaijianshaoValue
  1576. { add = "duzhoushanghaizengjiaValue", del = "duzhoushanghaijianshaoValue", type = 3, need = "毒咒", pct = 0 },
  1577. -- 621 毒咒伤害加成 毒咒伤害万分比 duzhoushanghaijiachengRate
  1578. -- 623 毒咒伤害减免 被毒咒伤害减免万分比 duzhoushanghaijianmianRate
  1579. { add = "duzhoushanghaijiachengRate", del = "duzhoushanghaijianmianRate", type = 3, need = "毒咒", pct = 1 },
  1580. -- 624 极光伤害增加 极光伤害绝对值 jiguangshanghaizengjiaValue
  1581. -- 626 极光伤害减少 被极光伤害减少绝对值 jiguangshanghaijianshaoValue
  1582. { add = "jiguangshanghaizengjiaValue", del = "jiguangshanghaizengjiaValue", type = 3, need = "极光", pct = 0 },
  1583. -- 625 极光伤害加成 极光伤害万分比 jiguangshanghaijiachengRate
  1584. -- 627 极光伤害减免 被极光伤害减免万分比 jiguangshanghaijianmianRate
  1585. { add = "jiguangshanghaijiachengRate", del = "jiguangshanghaijianmianRate", type = 3, need = "极光", pct = 1 },
  1586. -- 628 穿透箭伤害增加 穿透箭伤害绝对值 chuantoujianshanghaizengjiaValue
  1587. -- 630 穿透箭伤害减少 被穿透箭伤害减少绝对值 chuantoujianshanghaijianshaoValue
  1588. { add = "chuantoujianshanghaizengjiaValue", del = "chuantoujianshanghaijianshaoValue", type = 3, need = "穿透箭", pct = 0 },
  1589. -- 629 穿透箭伤害加成 穿透箭伤害万分比 chuantoujianshanghaijiachengRate
  1590. -- 631 穿透箭伤害减免 被穿透箭伤害减免万分比 chuantoujianshanghaijianmianRate
  1591. { add = "chuantoujianshanghaijiachengRate", del = "chuantoujianshanghaijianmianRate", type = 3, need = "穿透箭", pct = 1 },
  1592. -- 632 多重箭伤害增加 多重箭伤害绝对值 duochongjianshanghaizengjiaValue
  1593. -- 634 多重箭伤害减少 被多重箭伤害减少绝对值 duochongjianshanghaijianshaoValue
  1594. { add = "duochongjianshanghaizengjiaValue", del = "duochongjianshanghaijianshaoValue", type = 3, need = "多重箭", pct = 0 },
  1595. -- 633 多重箭伤害加成 多重箭伤害万分比 duochongjianshanghaijiachengRate
  1596. -- 635 多重箭伤害减免 被多重箭伤害减免万分比 duochongjianshanghaijianmianRate
  1597. { add = "duochongjianshanghaijiachengRate", del = "duochongjianshanghaijianmianRate", type = 3, need = "多重箭", pct = 1 },
  1598. -- 636 冰封箭伤害增加 冰封箭伤害绝对值 bingfengjianshanghaizengjiaValue
  1599. -- 638 冰封箭伤害减少 被冰封箭伤害减少绝对值 bingfengjianshanghaijianshaoValue
  1600. { add = "bingfengjianshanghaizengjiaValue", del = "bingfengjianshanghaijianshaoValue", type = 3, need = "冰封箭", pct = 0 },
  1601. -- 637 冰封箭伤害加成 冰封箭伤害万分比 bingfengjianshanghaijiachengRate
  1602. -- 639 冰封箭伤害减免 被冰封箭伤害减免万分比 bingfengjianshanghaijianmianRate
  1603. { add = "bingfengjianshanghaijiachengRate", del = "bingfengjianshanghaijianmianRate", type = 3, need = "冰封箭", pct = 1 },
  1604. -- 640 五重箭伤害增加 五重箭伤害绝对值 wuchongjianshanghaizengjiaValue
  1605. -- 642 五重箭伤害减少 被五重箭伤害减少绝对值 wuchongjianshanghaijianshaoValue
  1606. { add = "wuchongjianshanghaizengjiaValue", del = "wuchongjianshanghaijianshaoValue", type = 3, need = "五重箭", pct = 0 },
  1607. -- 641 五重箭伤害加成 五重箭伤害万分比 wuchongjianshanghaijiachengRate
  1608. -- 643 五重箭伤害减免 被五重箭伤害减免万分比 wuchongjianshanghaijianmianRate
  1609. { add = "wuchongjianshanghaijiachengRate", del = "wuchongjianshanghaijianmianRate", type = 3, need = "五重箭", pct = 1 },
  1610. }
  1611. local casterCareer = getbaseinfo(caster, "getbasecareer")
  1612. local targerCareer = getbaseinfo(target, "getbasecareer")
  1613. local name = paramMap.CfgData.name
  1614. for i = 1, #tab do
  1615. local type = tab[i].type
  1616. local need = tab[i].need
  1617. local pct = tab[i].pct
  1618. local add = 0
  1619. local del = 0
  1620. if type == 1 then
  1621. add = getattrinfo(caster, tab[i].add)
  1622. del = getattrinfo(target, tab[i].del)
  1623. elseif type == 2 then
  1624. if targerCareer == need then
  1625. add = getattrinfo(caster, tab[i].add)
  1626. end
  1627. if casterCareer == need then
  1628. del = getattrinfo(target, tab[i].del)
  1629. end
  1630. elseif type == 3 then
  1631. if name ~= "" then
  1632. if string.find(name, need) then
  1633. add = getattrinfo(caster, tab[i].add)
  1634. del = getattrinfo(target, tab[i].del)
  1635. end
  1636. end
  1637. end
  1638. if pct == 0 then
  1639. SkillDamageValue = SkillDamageValue + math.max(0, add - del)
  1640. else
  1641. SkillDamageRate = SkillDamageRate + math.max(0, add - del)
  1642. end
  1643. end
  1644. -- 160 PVP伤害吸收 计算伤害3 absorbDamageToPlayers
  1645. local absorbDamageToPlayers = getattrinfo(target, "absorbDamageToPlayers")
  1646. if absorbDamageToPlayers > 0 then
  1647. SkillDamageRate = math.max(0, SkillDamageRate - absorbDamageToPlayers)
  1648. end
  1649. end
  1650. return SkillDamageValue, SkillDamageRate
  1651. end
  1652. function fightlog(desc)
  1653. table.insert(FightLog, desc .. "\n")
  1654. end
  1655. -- 服务器启动调用,缓存表数据
  1656. function this.Cache()
  1657. local normalCache = {}
  1658. local elementalCache = {}
  1659. local tableList = ConfigDataManager.getList("cfg_damage_number")
  1660. for index, valueMap in ipairs(tableList) do
  1661. local id = valueMap["id"]
  1662. local attributeA = valueMap["attributea"]
  1663. local attributeB = valueMap["attributeb"]
  1664. local attributeC = valueMap["attributec"]
  1665. local attributeD = valueMap["attributed"]
  1666. local attributeE = valueMap["attributee"]
  1667. local keyString = attributeA .. attributeB .. attributeC .. attributeD .. attributeE
  1668. if string.contains(keyString, "1") then
  1669. if normalCache[keyString] ~= nil then
  1670. gameDebug.assertPrint(false, "cfg_damage_number缓存战斗飘字类型重复,id:" .. id .. ";key:" .. keyString)
  1671. end
  1672. normalCache[keyString] = id
  1673. end
  1674. -- 元素伤害
  1675. local attributeF = valueMap["attributef"]
  1676. local attributeG = valueMap["attributeg"]
  1677. local attributeH = valueMap["attributeh"]
  1678. local attributeI = valueMap["attributei"]
  1679. local elementalKey = attributeF .. attributeG .. attributeH .. attributeI
  1680. if string.contains(elementalKey, "1") then
  1681. if elementalCache[elementalKey] ~= nil then
  1682. gameDebug.assertPrint(false, "cfg_damage_number缓存元素战斗飘字类型重复,id:" .. ";key:" .. elementalKey)
  1683. end
  1684. elementalCache[elementalKey] = id
  1685. end
  1686. end
  1687. setsysvar(SystemVarConst.NORMAL_DAMAGE_TYPE_CACHE, normalCache)
  1688. setsysvar(SystemVarConst.ELEMENTAL_DAMAGE_TYPE_CACHE, elementalCache)
  1689. end
  1690. ---------------------------------------------------------------------------------------------------------------
  1691. function this.DamageCalculate(paramMap)
  1692. local minAtt, maxAtt = this.getMaxAndMinDamage(paramMap) -- 最大\最小攻击力
  1693. fightlog("-----------------------基础攻击力: " .. minAtt .. "~" .. maxAtt .. "-----------------------")
  1694. -- 配置技能攻击力
  1695. local peizhiSkillDamage = this.getPeiZhiSkillDamage(paramMap)
  1696. minAtt = minAtt + peizhiSkillDamage
  1697. maxAtt = maxAtt + peizhiSkillDamage
  1698. -- 技能攻击力
  1699. local skillDamage = this.getSkillDamage(paramMap)
  1700. minAtt = minAtt + skillDamage
  1701. maxAtt = maxAtt + skillDamage
  1702. -- 攻击力加成
  1703. local damageRate = this.getDamageRate(paramMap)
  1704. minAtt = minAtt + damageRate
  1705. maxAtt = maxAtt + damageRate
  1706. -- 攻击力加成Buff
  1707. local damageRate = this.getDamageBuff(paramMap)
  1708. minAtt = minAtt + damageRate
  1709. maxAtt = maxAtt + damageRate
  1710. local damage = 0
  1711. local hurtTypeTable = { 0, 0, 0, 0, 0 }
  1712. -- 幸运一击
  1713. if this.isLuckyAttack(paramMap) == true then
  1714. damage = this.luckyAttackDamage(paramMap, maxAtt)
  1715. hurtTypeTable[3] = 1
  1716. else
  1717. damage = math.random(math.ceil(minAtt), math.ceil(maxAtt))
  1718. end
  1719. fightlog("----------------------计算伤害: " .. damage .. "-----------------------")
  1720. fightlog("----------------------计算伤害: " .. damage .. "-----------------------")
  1721. -- 双倍伤害
  1722. local isDouble = this.isDoubleAttack(paramMap)
  1723. if isDouble == true then
  1724. hurtTypeTable[5] = 1
  1725. end
  1726. --无视防御
  1727. if this.isUnMissAttack(paramMap) == false then
  1728. damage = this.unMissAttackDamage(paramMap, damage, false, isDouble)
  1729. else
  1730. damage = this.unMissAttackDamage(paramMap, damage, true, isDouble)
  1731. hurtTypeTable[4] = 1
  1732. end
  1733. --翅膀 坐骑 buff
  1734. damage = this.petAndMountAttackDamage(paramMap, damage)
  1735. --减伤
  1736. damage = this.delAttackDamage(paramMap, damage)
  1737. --盾牌
  1738. damage = this.shieldAttackDamage(paramMap, damage)
  1739. --吸收
  1740. damage = this.reductionAttackDamage(paramMap, damage)
  1741. --真实伤害
  1742. damage = this.realAttackDamage(paramMap, damage)
  1743. -- 卓越一击
  1744. if this.isExcellentAttack(paramMap) == true then
  1745. damage = this.excellentAttackDamage(paramMap, damage)
  1746. hurtTypeTable[2] = 1
  1747. end
  1748. --怪物保底伤害
  1749. local castertype = getbaseinfo(paramMap.caster, "mapobjecttype")
  1750. if castertype == MapObjectType.MONSTER then
  1751. local monInfo = getmonsterinfo(paramMap.caster)
  1752. local monsterConfig = monInfo.cfgid
  1753. local guaranteedDamage = ConfigDataManager.getTableValue("cfg_monster", "guaranteedDamage", "id", monsterConfig)
  1754. if string.isNullOrEmpty(guaranteedDamage) then
  1755. guaranteedDamage = "0"
  1756. end
  1757. damage = math.max(tonumber(guaranteedDamage) or 0, damage)
  1758. end
  1759. --怪物最大伤害
  1760. local targettype = getbaseinfo(paramMap.target, "mapobjecttype")
  1761. if targettype == MapObjectType.MONSTER then
  1762. local monInfo = getmonsterinfo(paramMap.target)
  1763. local monsterConfig = monInfo.cfgid
  1764. local MaxDamage = ConfigDataManager.getTableValue("cfg_monster", "MaxDamage", "id", monsterConfig)
  1765. if not string.isNullOrEmpty(MaxDamage) then
  1766. damage = math.min(tonumber(MaxDamage) or 0, damage)
  1767. end
  1768. end
  1769. -- 伤害字体
  1770. local typeString = ""
  1771. for _, value in pairs(hurtTypeTable) do
  1772. typeString = typeString .. value
  1773. end
  1774. local hurtTypeCache = getsysvar(SystemVarConst.NORMAL_DAMAGE_TYPE_CACHE, 0)
  1775. local type = hurtTypeCache[typeString] or 101
  1776. fightlog("-----------------------计算伤害: " .. damage .. "-----------------------")
  1777. return damage, type
  1778. end
  1779. -- 获取最大最小攻击力
  1780. function this.getMaxAndMinDamage(paramMap)
  1781. local skillId = paramMap.skillid
  1782. local skillLevel = paramMap.skilllevel
  1783. local skillInfo = ConfigDataManager.getById("cfg_skill", skillId)
  1784. if not next(skillInfo) then
  1785. return 0, 0
  1786. end
  1787. local powerSource = string.isNullOrEmpty(skillInfo.powersource) and 0 or tonumber(skillInfo.powersource)
  1788. local caster = paramMap.caster --—— 攻击对象
  1789. local petid = getbaseinfo(caster, "configid")
  1790. if petid == 60000612 then
  1791. local min = this.getAttValueWithName(caster, "skyhawksMinimumAttackPower")
  1792. local max = this.getAttValueWithName(caster, "skyhawksMaximumAttackPower")
  1793. return min, max
  1794. end
  1795. if powerSource == 1 then
  1796. return this.getAttValueWithName(caster, "minDC"), this.getAttValueWithName(caster, "maxDC")
  1797. end
  1798. if powerSource == 2 then
  1799. return this.getAttValueWithName(caster, "minMC"), this.getAttValueWithName(caster, "maxMC")
  1800. end
  1801. if powerSource == 3 then
  1802. local min = this.getAttValueWithName(caster, "minimumCurseAttackPower") +
  1803. this.getAttValueWithName(caster, "minMC")
  1804. local max = this.getAttValueWithName(caster, "maximumCurseAttackPower") +
  1805. this.getAttValueWithName(caster, "maxMC")
  1806. return min, max
  1807. end
  1808. local maxDC = this.getAttValueWithName(caster, "maxDC")
  1809. local maxMC = this.getAttValueWithName(caster, "maxMC")
  1810. local maxCurDC = this.getAttValueWithName(caster, "maximumCurseAttackPower")
  1811. if maxDC >= maxMC and maxDC >= maxCurDC then
  1812. return this.getAttValueWithName(caster, "minDC"), maxDC
  1813. elseif maxMC >= maxDC and maxMC >= maxCurDC then
  1814. return this.getAttValueWithName(caster, "minMC"), maxMC
  1815. elseif maxCurDC >= maxDC and maxCurDC >= maxMC then
  1816. return this.getAttValueWithName(caster, "minimumCurseAttackPower"), maxCurDC
  1817. end
  1818. return 0, 0
  1819. end
  1820. -- 获取配置技能的攻击力
  1821. function this.getPeiZhiSkillDamage(paramMap)
  1822. local caster = paramMap.caster --—— 攻击对象
  1823. local skillPower = tonumber(paramMap.CfgData.skillpower) or 0
  1824. local skillattpower = paramMap.CfgData.skillattpower
  1825. if not string.isNullOrEmpty(skillattpower) then
  1826. local caster = paramMap.caster --—— 攻击对象
  1827. local attInfos = string.putIntIntMap({}, skillattpower, "#", "|")
  1828. for key, value in pairs(attInfos) do
  1829. local currentValue = this.getAttValueWithId(caster, key)
  1830. skillPower = skillPower + math.ceil(currentValue / value)
  1831. end
  1832. end
  1833. -- local skillDamage = this.getAttValueWithName(caster, "skillDamage")
  1834. -- skillPower = skillPower * (1 + skillDamage)
  1835. fightlog("-----------------------配置技能攻击力: " .. skillPower .. "-----------------------")
  1836. return skillPower
  1837. end
  1838. -- 获取技能的攻击力
  1839. function this.getSkillDamage(paramMap)
  1840. local caster = paramMap.caster --—— 攻击对象
  1841. local isPVP = this.getIsPVP(paramMap)
  1842. local damage = this.getAttValueWithName(caster, "skillDamageAdd")
  1843. if isPVP == true then
  1844. damage = damage + this.getAttValueWithName(caster, "pvpskillattackadd")
  1845. else
  1846. damage = damage + this.getAttValueWithName(caster, "skillDamageAdd")
  1847. end
  1848. fightlog("-----------------------技能攻击力: " .. damage .. "-----------------------")
  1849. return damage
  1850. end
  1851. -- 是否是PVP
  1852. function this.getIsPVP(paramMap)
  1853. local caster = paramMap.caster --—— 攻击对象
  1854. local target = paramMap.target --—— 受击对象
  1855. local castertype = getbaseinfo(caster, "mapobjecttype")
  1856. local targettype = getbaseinfo(target, "mapobjecttype")
  1857. local isPVP = true
  1858. if castertype == MapObjectType.MONSTER or targettype == MapObjectType.MONSTER then
  1859. isPVP = false
  1860. end
  1861. return isPVP
  1862. end
  1863. -- 获取攻击力加成
  1864. function this.getDamageRate(paramMap)
  1865. local caster = paramMap.caster --—— 攻击对象
  1866. local isPVP = this.getIsPVP(paramMap)
  1867. local AtkUpPercent = this.getAttValueWithName(caster, "AtkUpPercent")
  1868. if isPVP == true then
  1869. AtkUpPercent = AtkUpPercent + this.getAttValueWithName(caster, "pvpattackadd")
  1870. else
  1871. AtkUpPercent = AtkUpPercent + this.getAttValueWithName(caster, "pveattackadd")
  1872. end
  1873. fightlog("-----------------------攻击力加成: " .. AtkUpPercent .. "-----------------------")
  1874. return AtkUpPercent
  1875. end
  1876. -- 获取攻击力加成Buff
  1877. function this.getDamageBuff(paramMap)
  1878. local caster = paramMap.caster --—— 攻击对象
  1879. local AtkUpPercent = this.getAttValueWithName(caster, "AtkUpBuff")
  1880. return AtkUpPercent
  1881. end
  1882. -- 是否触发幸运一击
  1883. function this.isLuckyAttack(paramMap)
  1884. local caster = paramMap.caster --—— 攻击对象
  1885. local target = paramMap.target --—— 受击对象
  1886. local criticalDamageChance = this.getAttValueWithName(caster, "criticalDamageChance")
  1887. local criticalDamageResistanceChance = this.getAttValueWithName(target, "criticalDamageResistanceChance")
  1888. local probability = criticalDamageChance * (1 - criticalDamageResistanceChance)
  1889. local result = this.RandomResult(probability)
  1890. fightlog("-----------------------是否触发幸运一击: " .. (result == true and 1 or 0) .. "-----------------------")
  1891. return result
  1892. end
  1893. -- 幸运一击的攻击力
  1894. function this.luckyAttackDamage(paramMap, maxAtt)
  1895. local caster = paramMap.caster --—— 攻击对象
  1896. local target = paramMap.target --—— 受击对象
  1897. local criticalDamageAdd = this.getAttValueWithName(caster, "criticalDamageAdd")
  1898. local criticalDamageReduce = this.getAttValueWithName(target, "criticalDamageReduce")
  1899. local criticalDamageBonus = this.getAttValueWithName(caster, "criticalDamageBonus")
  1900. local criticalDamageReducationBonus = this.getAttValueWithName(target, "criticalDamageReducationBonus")
  1901. local result = (maxAtt + criticalDamageAdd - criticalDamageReduce) *
  1902. (1 + criticalDamageBonus - criticalDamageReducationBonus)
  1903. fightlog("-----------------------幸运一击伤害: " .. result .. "-----------------------")
  1904. return result
  1905. end
  1906. -- 是否触发卓越一击
  1907. function this.isExcellentAttack(paramMap)
  1908. local caster = paramMap.caster --—— 攻击对象
  1909. local target = paramMap.target --—— 受击对象
  1910. local excellentDamageChance = this.getAttValueWithName(caster, "excellentDamageChance")
  1911. local excellentDamageResistanceChance = this.getAttValueWithName(target, "excellentDamageResistanceChance")
  1912. local probability = excellentDamageChance * (1 - excellentDamageResistanceChance)
  1913. local result = this.RandomResult(probability)
  1914. fightlog("-----------------------是否触发卓越一击: " .. (result == true and 1 or 0) .. "-----------------------")
  1915. return result
  1916. end
  1917. -- 卓越一击的攻击力
  1918. function this.excellentAttackDamage(paramMap, damage)
  1919. local excellentRate = (tonumber(paramMap.CfgData.excellentrate) or 0) / 10000
  1920. local caster = paramMap.caster --—— 攻击对象
  1921. local target = paramMap.target --—— 受击对象
  1922. local excellentDamageAdd = this.getAttValueWithName(caster, "excellentDamageAdd")
  1923. local excellentDamageReduce = this.getAttValueWithName(target, "excellentDamageReduce")
  1924. local excellentDamageBonus = this.getAttValueWithName(caster, "excellentDamageBonus")
  1925. local excellentDamageReducationBonus = this.getAttValueWithName(target, "excellentDamageReducationBonus")
  1926. local result = (damage + excellentDamageAdd - excellentDamageReduce) *
  1927. (1 + excellentDamageBonus + excellentRate - excellentDamageReducationBonus)
  1928. fightlog("-----------------------卓越一击伤害: " .. result .. "-----------------------")
  1929. return result
  1930. end
  1931. -- 是否触发双倍伤害
  1932. function this.isDoubleAttack(paramMap)
  1933. local caster = paramMap.caster
  1934. local target = paramMap.target
  1935. local doubleDamageChance = this.getAttValueWithName(caster, "doubleDamageChance")
  1936. local doubleDamageResistanceChance = this.getAttValueWithName(target, "doubleDamageResistanceChance")
  1937. local probability = doubleDamageChance * (1 - doubleDamageResistanceChance)
  1938. local result = this.RandomResult(probability)
  1939. fightlog("-----------------------是否触发双倍伤害: " .. (result == true and 1 or 0) .. "-----------------------")
  1940. return result
  1941. end
  1942. -- 是否触发无视防御
  1943. function this.isUnMissAttack(paramMap)
  1944. local caster = paramMap.caster --—— 攻击对象
  1945. local target = paramMap.target --—— 受击对象
  1946. local unMissRate = this.getAttValueWithName(caster, "unMissRate") -- 无视防御的概率, 万分之
  1947. local resistUnMissRate = this.getAttValueWithName(target, "resistUnMissRate") -- 抵抗无视防御几率 万分之
  1948. local probability = unMissRate * (1 - resistUnMissRate)
  1949. local result = this.RandomResult(probability)
  1950. fightlog("-----------------------是否触发无视防御: " .. (result == true and 1 or 0) .. "-----------------------")
  1951. return result
  1952. end
  1953. -- 无视防御的攻击力
  1954. function this.unMissAttackDamage(paramMap, damage, isUnMiss, isDouble)
  1955. local caster = paramMap.caster --—— 攻击对象
  1956. local target = paramMap.target --—— 受击对象
  1957. local ignoringIncreasedDefenseDamage = this.getAttValueWithName(caster, "ignoringIncreasedDefenseDamage")
  1958. local result = damage + ignoringIncreasedDefenseDamage
  1959. local isPVP = this.getIsPVP(paramMap)
  1960. if isPVP == true then
  1961. result = result + this.getAttValueWithName(caster, "pvpdamageadda")
  1962. else
  1963. result = result + this.getAttValueWithName(caster, "pveDamageAdd")
  1964. end
  1965. fightlog("-----------------------判定PVP伤害增加后的伤害: " .. result .. "-----------------------")
  1966. if isUnMiss == false then
  1967. result = result - this.getAttValueWithName(target, "armor")
  1968. if isPVP == true then
  1969. result = result - this.getAttValueWithName(caster, "pvparmor")
  1970. else
  1971. result = result - this.getAttValueWithName(caster, "pvearmor")
  1972. end
  1973. fightlog("-----------------------判定防御后的伤害: " .. result .. "-----------------------")
  1974. end
  1975. if result < 0 then
  1976. result = 0
  1977. end
  1978. local powerRate = tonumber(paramMap.CfgData.powerrate) or 0 -- 技能威力 万分之
  1979. local skillDamage = this.getAttValueWithName(caster, "skillDamage")
  1980. result = (powerRate / 10000 + skillDamage) * result
  1981. fightlog("-----------------------判定skill后的伤害: " .. result .. "-----------------------")
  1982. if isDouble == true then
  1983. local doubleDamageBonus = this.getAttValueWithName(caster, "doubleDamageBonus") --双倍伤害加成 万分之
  1984. local doubleDamageReducationBonus = this.getAttValueWithName(target, "doubleDamageReducationBonus") -- 双倍伤害减免 万分之
  1985. local doubleDamageAdd = this.getAttValueWithName(caster, "doubleDamageAdd") -- 双倍伤害增加 固定数值
  1986. local doubleDamageReduce = this.getAttValueWithName(target, "doubleDamageReduce") -- 双倍伤害减少 固定数值
  1987. result = result * (2 + doubleDamageBonus - doubleDamageReducationBonus) + doubleDamageAdd - doubleDamageReduce
  1988. fightlog("-----------------------判定双倍伤害后的伤害: " .. result .. "-----------------------")
  1989. end
  1990. return result
  1991. end
  1992. -- 翅膀 坐骑 buff
  1993. function this.petAndMountAttackDamage(paramMap, damage)
  1994. local caster = paramMap.caster --—— 攻击对象
  1995. local mountdamagebonus = this.getAttValueWithName(caster, "mountdamagebonus") -- 坐骑伤害提升 万分比
  1996. local wingdamagebonus = this.getAttValueWithName(caster, "wingdamagebonus") -- 翅膀伤害提升 万分比
  1997. local buffdamagebonus = this.getAttValueWithName(caster, "buffdamagebonus") -- buff伤害提升 万分比
  1998. local damageRate = this.getAttValueWithName(caster, "damageRate") -- 伤害提升 万分比
  1999. local result = (1 + mountdamagebonus + wingdamagebonus + buffdamagebonus + damageRate) * damage
  2000. fightlog("----------------------判定翅膀、坐骑后的伤害: " .. result .. "-----------------------")
  2001. return result
  2002. end
  2003. -- 减伤
  2004. function this.delAttackDamage(paramMap, damage)
  2005. local caster = paramMap.caster --—— 攻击对象
  2006. local target = paramMap.target --—— 受击对象
  2007. local fixedDamageAdd = this.getAttValueWithName(caster, "fixedDamageAdd") --- 固定伤害增加
  2008. local fixedDamageReduce = this.getAttValueWithName(target, "fixedDamageReduce") --- 固定伤害减少
  2009. local result = damage + fixedDamageAdd - fixedDamageReduce
  2010. if result < 0 then result = 0 end
  2011. local isPVP = this.getIsPVP(paramMap)
  2012. if isPVP == true then
  2013. result = result - this.getAttValueWithName(target, "pvpDamageReduce") --- pvp伤害减少
  2014. else
  2015. result = result - this.getAttValueWithName(caster, "pveDamageReduce") --- pve伤害减少
  2016. end
  2017. if result < 0 then result = 0 end
  2018. local damageRateDecrement = this.getAttValueWithName(target, "damageRateDecrement") --- 伤害减免, 百分比
  2019. result = result * (1 - damageRateDecrement)
  2020. fightlog("----------------------判定减伤后的伤害: " .. result .. "-----------------------")
  2021. return result
  2022. end
  2023. -- 盾牌
  2024. function this.shieldAttackDamage(paramMap, damage)
  2025. local target = paramMap.target --—— 受击对象
  2026. local shielddamagebonus = this.getAttValueWithName(target, "shielddamagebonus") -- 盾牌减伤 百分比
  2027. local result = (1 - shielddamagebonus) * damage
  2028. fightlog("----------------------判定盾牌减伤后的伤害: " .. result .. "-----------------------")
  2029. return result
  2030. end
  2031. -- 吸收
  2032. function this.reductionAttackDamage(paramMap, damage)
  2033. local target = paramMap.target --—— 受击对象
  2034. local mountdamagereduction = 1 - this.getAttValueWithName(target, "mountdamagereduction")
  2035. local wingdamagereduction = 1 - this.getAttValueWithName(target, "wingdamagereduction")
  2036. local buffdamagereduction = 1 - this.getAttValueWithName(target, "buffdamagereduction")
  2037. local guarddamagereduction = 1 - this.getAttValueWithName(target, "guarddamagereduction")
  2038. local damageAbsorb = 1 - this.getAttValueWithName(target, "damageAbsorb")
  2039. local result = mountdamagereduction * wingdamagereduction * buffdamagereduction * guarddamagereduction * damageAbsorb *
  2040. damage
  2041. fightlog("----------------------判定吸收后的伤害: " .. result .. "-----------------------")
  2042. return result
  2043. end
  2044. -- 真实伤害
  2045. function this.realAttackDamage(paramMap, damage)
  2046. local caster = paramMap.caster --—— 攻击对象
  2047. local target = paramMap.target --—— 受击对象
  2048. local isPVP = this.getIsPVP(paramMap)
  2049. local result = damage
  2050. if isPVP == true then
  2051. local truedamagebonus = this.getAttValueWithName(caster, "truedamagebonus")
  2052. local truedamagereductionpercentbonus = this.getAttValueWithName(target, "truedamagereductionpercentbonus")
  2053. result = result * (1 + truedamagebonus - truedamagereductionpercentbonus)
  2054. result = result + this.getAttValueWithName(caster, "pvptruedamage") -- PVP真实伤害 固定数值
  2055. result = result - this.getAttValueWithName(target, "pvptruedamagepercent") -- PVP真伤减免 固定数值
  2056. else
  2057. result = result + this.getAttValueWithName(caster, "pvetruedamagereduction") -- PVE真实伤害 固定数值
  2058. result = result - this.getAttValueWithName(target, "pvetruedamagereductionpercent") -- PVE真伤减免 固定数值
  2059. end
  2060. fightlog("----------------------判定真实伤害后的伤害: " .. result .. "-----------------------")
  2061. return result
  2062. end
  2063. function this.getAttValueWithName(target, attName)
  2064. return (getattrinfo(target, attName) or 0)
  2065. end
  2066. function this.getAttValueWithId(target, attId)
  2067. local attName = attrid2name(attId) or ""
  2068. return this.getAttValueWithName(target, attName)
  2069. end
  2070. -- [0,1)
  2071. function this.RandomResult(probability)
  2072. local randomNum = math.random()
  2073. return randomNum <= probability
  2074. end
  2075. ---玩家战斗触发
  2076. function PlayerFight.AttackTrigger(actor, fightRet)
  2077. this.UpdateFightTask(actor, fightRet)
  2078. end
  2079. ---更新战斗相关任务
  2080. function this.UpdateFightTask(actor, fightRet)
  2081. local taskCfgList = ConfigDataManager.getTable("cfg_task_target", "taskgoaltype", TaskTargetType.HURT_MAP_MONSTER)
  2082. if table.isNullOrEmpty(taskCfgList) then
  2083. return
  2084. end
  2085. local targetHurt = tonumber(fightRet["targethurt"])
  2086. local mapCfgId = tonumber(fightRet["mapcfgid"])
  2087. local targetCfgId = tonumber(fightRet["targetcfgid"])
  2088. local flush = false
  2089. for _, taskCfg in pairs(taskCfgList) do
  2090. local monsterLimit = tonumber(taskCfg["taskgoalparam"])
  2091. local mapLimit = tonumber(taskCfg["taskgoalparam2"])
  2092. if targetCfgId == monsterLimit and mapCfgId == mapLimit then
  2093. flush = true
  2094. break
  2095. end
  2096. end
  2097. -- 触发刷新任务
  2098. if flush then
  2099. local taskParam = {
  2100. monsterid = targetCfgId,
  2101. mapid = mapCfgId,
  2102. hurt = targetHurt
  2103. }
  2104. -- 触发任务目标
  2105. TaskHandler.TriggerTaskGoal(actor, TaskTargetType.HURT_MAP_MONSTER, taskParam)
  2106. end
  2107. end