Formula
CommonFun.CalcBaseDamage
formula.lua
1function CommonFun.CalcBaseDamage(srcUser, targetUser, params, logger)
2 if nil == srcUser then
3 logger.error(string.format("srcUser is nil"))
4 return 0, CommonFun.DamageType.None
5 end
6 if nil == targetUser then
7 logger.error(string.format("targetUser is nil"))
8 return 0, CommonFun.DamageType.None
9 end
10 if nil == Table_Skill then
11 logger.error("Table_Skill is nil")
12 return 0, CommonFun.DamageType.None
13 end
14 local skillParams = Table_Skill[params.skillIDAndLevel]
15 if nil == skillParams then
16 logger.error(string.format("Table_Skill[%d] is nil", params.skillIDAndLevel))
17 return 0, CommonFun.DamageType.None
18 end
19 local paramList = skillParams.Damage
20 if nil == paramList or #paramList <= 0 then
21 return 0, CommonFun.DamageType.None
22 end
23 local mapid, maptype = srcUser:GetMapInfo()
24 local iscrit = CommonFun.IsCrit(srcUser, targetUser, skillParams)
25 local damageType = CommonFun.DamageType.Normal
26 local damage, forceDamageType = CommonFun.DoCalcDamage(srcUser, targetUser, params, logger)
27 local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
28 if srcUser:HasBuffID(107480_REAPER_DAMAGE_CONVERTED_TO_LIFE_LOSS_:MAX_STACK_0) == false and skillID == 4855_PHANTOM_DANCER:TEMPORAL_EROSION_BUBBLE and skillID == 4856_PHANTOM_DANCER:TEMPORAL_EROSION_BUBBLE and skillID == 4857_PHANTOM_DANCER:SINGULARITY_OF_SILENCE and skillID == 4858_PHANTOM_DANCER:SINGULARITY_OF_SILENCE then
29 local miss_dam, miss_damtype = CommonFun.CheckMissAndBlock(srcUser, targetUser, params, skillParams, iscrit, damage)
30 if miss_damtype ~= nil then
31 return miss_dam, miss_damtype
32 end
33 if nil ~= forceDamageType then
34 damageType = forceDamageType
35 if CommonFun.DamageType.None == damageType or CommonFun.DamageType.Miss == damageType or CommonFun.DamageType.Block == damageType then
36 return damage, damageType
37 end
38 elseif 0 == damage then
39 return 0, CommonFun.DamageType.WeaponBlock
40 elseif damage < 0 then
41 damageType = CommonFun.DamageType.Treatment
42 end
43 end
44 if nil ~= forceDamageType then
45 damageType = forceDamageType
46 end
47 if (damageType == nil or damageType == CommonFun.DamageType.Normal or damageType == CommonFun.DamageType.Crit) and iscrit and CommonFun.RollType.Attack == skillParams.RollType and (srcUser:IsAttackSkill(params.skillIDAndLevel) or srcUser:IsExtraNormalSkill(params.skillIDAndLevel)) then
48 damageType = CommonFun.DamageType.Crit
49 damage = CommonFun.ModifyCriDamage(srcUser, targetUser, params, logger, skillParams, damage)
50 end
51 local GetNpcID = targetUser:GetNpcID()
52 local GetSelfID = srcUser:GetNpcID()
53 if 0 < damage and GetNpcID == 30034_SPASHIRE and srcUser:HasBuffID(121_SPASHIRE_ANALYZE_WEAKNESS_EMPTY_BUFF_:MAX_STACK_0) then
54 local Atk = srcUser:GetProperty("Atk")
55 local MAtk = srcUser:GetProperty("MAtk")
56 damage = damage + (Atk + MAtk) * 2.5
57 end
58 if targetUser:HasBuffID(10740_TREASURE_CHEST_CROCODILE_DMG_REDUC_:MAX_STACK_0) and srcUser:HasBuffID(10741_IGNORE_TREASURE_CHEST_CROCODILE_DMG_REDUC_:MAX_STACK_0) == false then
59 damage = 0.2
60 end
61 local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
62 damage = CommonFun.ModifyRealDam(srcUser, targetUser, params, skillParams, damage, skillID, maptype)
63 if GetNpcID == 40021_EMPERIUM or GetNpcID == 40022_EMPERIUM or GetNpcID == 55000_EMPERIUM or GetNpcID == 40023_SHADOW_OF_MORROC or GetNpcID == 40024_VALKYRIE_SENTRY_TOWER or GetNpcID == 40026_VALKYRIE_S_WATCHTOWER_INNER then
64 local forcetype
65 damage, forcetype = CommonFun.ModifyMetalNpcDamage(srcUser, targetUser, params, damage, skillID, GetNpcID)
66 if forcetype ~= nil then
67 return damage, forcetype
68 end
69 end
70 local AttrEffect2 = targetUser:GetProperty("AttrEffect")
71 local bits2 = CommonFun.getBits(AttrEffect2)
72 if 0 < damage and (targetUser:GetNpcID() == 56941_DOAKUDAR or targetUser:GetNpcID() == 56942_IKUSABE_WATARU) and srcUser:GetNpcID() ~= 56941_DOAKUDAR and srcUser:GetNpcID() ~= 56942_IKUSABE_WATARU then
73 return 1, CommonFun.DamageType.Normal
74 end
75 if 0 < damage and targetUser:GetNpcID() == 300100_SHARKEY_SHARKEY and srcUser:HasBuffID(180220_DAMAGE_DEALT_TO_SHARKEY_30_:MAX_STACK_0) then
76 damage = damage * 1.3
77 end
78 if 0 < damage and srcUser:GetNpcID() == 300100_SHARKEY_SHARKEY and targetUser:HasBuffID(180219_DAMAGE_RECEIVED_FROM_SHARKEY_50_:MAX_STACK_0) then
79 damage = damage * 0.5
80 end
81 if 0 < damage and targetUser:GetNpcID() == 300101_KAVAHIR_KAVAHIR and srcUser:HasBuffID(180518_DMG_DEALT_TO_BOSS_25_:MAX_STACK_0) then
82 damage = damage * 1.25
83 end
84 if 0 < damage and srcUser:GetNpcID() == 300101_KAVAHIR_KAVAHIR and targetUser:HasBuffID(180517_DMG_RECEIVED_FROM_BOSS_30_:MAX_STACK_0) then
85 damage = damage * 0.7
86 end
87 if (targetUser:HasBuffID(100660_STEEL_BODY_:MAX_STACK_0) == true or targetUser:HasBuffID(21430114_STEEL_BODY_:MAX_STACK_0) == true) and 0 < damage then
88 local GemValue = targetUser:GetProperty("JinGangRate")
89 local JGBH = 1
90 JGBH = 0.15 - GemValue
91 local skilllv_ab = srcUser:GetLernedSkillLevel(306_LORD_KNIGHT:ASURA_STRIKE)
92 if 5 < skilllv_ab and skillID == 306_LORD_KNIGHT:ASURA_STRIKE or skillID == 3303_LIGHTBRINGER:SKY_BREAKING_DRAGON_FIST or skillID == 819_HIGH_WIZARD:SKY_BREAKING_DRAGON_FIST then
93 JGBH = 1
94 end
95 damage = math.floor(damage * JGBH)
96 end
97 if targetUser:HasBuffID(117105_CURSED_CIRCLE_SELF_PEAK_:MAX_STACK_0) == true and 0 < damage then
98 local skilllv_zfz = targetUser:GetBuffLevel(117105_CURSED_CIRCLE_SELF_PEAK_:MAX_STACK_0)
99 local ZFZ = 1
100 ZFZ = 1 - 0.15 * (skilllv_zfz - 5)
101 damage = math.floor(damage * ZFZ)
102 end
103 if targetUser:HasBuffID(31790_LOVE_GODDESS_:MAX_STACK_0) and 0 < damage then
104 damage = damage * 1.2
105 end
106 local targetEnemyNum = targetUser:GetRangeEnemy(5)
107 if targetUser:HasBuffID(59240_SAKRAY_CARD_:MAX_STACK_0) and 1 <= targetEnemyNum and 0 < damage then
108 damage = damage * (1 - math.min(targetEnemyNum * 0.02, 0.1))
109 end
110 local PermeationCard = 0.5
111 if srcUser:HasBuffID(59300_STRIKE_OF_INFILTRATION_CARD_:MAX_STACK_0) and srcUser:HasBuffID(81004900_STRIKE_OF_INFILTRATION_CARD_:MAX_STACK_0) then
112 PermeationCard = 0.8
113 end
114 if 0 < damage and srcUser:HasBuffID(59300_STRIKE_OF_INFILTRATION_CARD_:MAX_STACK_0) and bits2[CommonFun.AttrEffect.IgnoreFarSkill] == 1 and skillParams.Launch_Range ~= nil and CommonFun.IsLongSkill(skillParams.Launch_Range) == true and skillParams.RollType == 1 and skillID == 2227_STELLAR_HUNTER:CRACK_SHOT and skillID == 2243_STELLAR_HUNTER:ABSOLUTE_PENETRATION and skillID == 2251_STELLAR_HUNTER:FORCED_DISPEL and skillID == 2741_SAINT:FIRE_STRIKE and skillID == 4717_SHADOW_CHASER:SOLAR_AURA_SKYFIRE and skillID == 4718_SHADOW_CHASER:SOLAR_AURA_SKYFIRE and skillID == 4702_SHADOW_CHASER:SCORCHING_REALM and skillID == 4714_SHADOW_CHASER:SOLAR_AURA then
115 damage = damage * PermeationCard
116 end
117 if targetUser:HasBuffID(136240_GLORY_OF_THE_MOON_SYNC_NINE_SCREENS_:MAX_STACK_0) then
118 local MoonReduc = targetUser:GetProperty("MoonReduc")
119 if CommonFun.GetMoonMark(srcUser, targetUser) then
120 damage = damage * (1 - MoonReduc)
121 end
122 end
123 if srcUser:HasBuffID(136581_10798_:MAX_STACK_0) ~= true and targetUser:HasBuffID(136580_FLOWER_S_PROTECTION_:MAX_STACK_0) and 0 < damage then
124 local TreeReduc = targetUser:GetProperty("TreeReduc")
125 damage = damage * (1 - TreeReduc)
126 end
127 if targetUser:HasBuffID(136600_10805_:MAX_STACK_0) or targetUser:HasBuffID(136522_10788_:MAX_STACK_0) and 0 < damage then
128 local DragonReduc = targetUser:GetProperty("DragonReduc")
129 damage = damage * (1 - DragonReduc)
130 end
131 if targetUser:HasBuffID(165542_HEART_TAKING_:MAX_STACK_0) and 0 < damage then
132 damage = damage * 1.5
133 end
134 if targetUser:HasBuffID(166580_DOUBLE_EDGE_SWORD_:MAX_STACK_0) and 0 < damage then
135 damage = damage * 1.3
136 end
137 if CommonFun.RollType.Attack == skillParams.RollType and targetUser:HasBuffID(10110_NEUTRAL_BARRIER_:MAX_STACK_0) and 0 < damage then
138 damage = damage * 0.01
139 end
140 if targetUser:HasBuffID(90003554_HEILION_BRACELET_TIER_5_:MAX_STACK_0) and 0 < damage then
141 local MaxHp = targetUser:GetProperty("MaxHp")
142 local Hp = targetUser:GetProperty("Hp")
143 if 0.9 <= Hp / MaxHp then
144 damage = damage * 0.5
145 end
146 end
147 if targetUser:HasBuffID(58560_WASTELAND_LORD_CARD_:MAX_STACK_0) and 0 < damage then
148 local MaxHp = targetUser:GetProperty("MaxHp")
149 local Hp = targetUser:GetProperty("Hp")
150 if 0.8 <= Hp / MaxHp then
151 damage = damage * 0.5
152 end
153 end
154 if (targetUser:GetBuffActive(90007245) or targetUser:HasBuffLayer(90007245, EBUFFERLAYER_SHADOW)) and 0 < damage then
155 local MaxHp = targetUser:GetProperty("MaxHp")
156 local HpM = targetUser:GetProperty("Hp")
157 local hpperM = HpM / MaxHp
158 damage = damage * (1 - math.floor((1 - hpperM) / 2 * 10) * 0.01)
159 end
160 local targetTeamNum = targetUser:GetRangeTeammate(5)
161 if targetUser:HasBuffID(29650_MEMORY_FOURTH_SET_2_:MAX_STACK_0) and 1 <= targetTeamNum then
162 damage = damage * 0.97
163 elseif targetUser:HasBuffID(29651_MEMORY_FOURTH_SET_2_:MAX_STACK_0) and 1 <= targetTeamNum then
164 damage = damage * 0.94
165 elseif targetUser:HasBuffID(29652_MEMORY_FOURTH_SET_2_:MAX_STACK_0) and 1 <= targetTeamNum then
166 damage = damage * 0.85
167 end
168 if targetUser:HasBuffID(135240_SPIRIT_OF_FORGIVENESS_:MAX_STACK_0) == true then
169 local skilllv_sz = targetUser:GetBuffLevel(135240_SPIRIT_OF_FORGIVENESS_:MAX_STACK_0)
170 damage = damage * (1 - 0.1 * skilllv_sz)
171 end
172 if targetUser:HasBuffID(135361_SOUL_LINK_:MAX_STACK_0) or targetUser:HasBuffID(135363_SOUL_LINK_SELF_:MAX_STACK_0) then
173 local SoulNum = targetUser:GetProperty("Soul_Linker")
174 damage = damage / math.max(1, SoulNum)
175 end
176 if targetUser:HasBuffID(30031100_CONSTELLATION_SEAL_RESONANCE_:MAX_STACK_0) and 0 < damage then
177 local mateNum = targetUser:GetMapTeammateNum()
178 local fentan = 1
179 if targetUser:HasBuffID(30031101_CONSTELLATION_SEAL_RESONANCE_:MAX_STACK_0) then
180 fentan = 0.9
181 elseif targetUser:HasBuffID(30031102_CONSTELLATION_SEAL_RESONANCE_:MAX_STACK_0) then
182 fentan = 0.75
183 elseif targetUser:HasBuffID(30031103_CONSTELLATION_SEAL_RESONANCE_:MAX_STACK_0) then
184 fentan = 0.6
185 end
186 damage = damage / math.max(1, mateNum) * fentan
187 end
188 if targetUser:HasBuffID(63180_3002770_SSR_HEADWEAR_1_:MAX_STACK_0) and 0 < damage then
189 local MaxHpsrcUser = srcUser:GetProperty("MaxHp")
190 local MaxHptargetUser = targetUser:GetProperty("MaxHp")
191 local MaxHp_hpper = MaxHptargetUser / MaxHpsrcUser
192 if 1 < MaxHp_hpper then
193 damage = damage * 0.95
194 end
195 end
196 if 0 < damage and targetUser:HasBuffID(64350_2982_:MAX_STACK_0) then
197 local StateEffectGashapon = srcUser:GetProperty("StateEffect")
198 local bits = CommonFun.getBits(StateEffectGashapon)
199 if bits[CommonFun.StateEffect.Poison] == 1 then
200 damage = damage * 0.9
201 end
202 end
203 if targetUser:HasBuffID(90003164_8995_:MAX_STACK_0) and targetUser:InMoveStatus() == true and 0 < damage then
204 damage = damage * 0.7
205 end
206 if targetUser:HasBuffID(90003984_EARL_S_ILLUSION_GARMENTS_TIER_5_:MAX_STACK_0) and targetUser:InMoveStatus() == true and 0 < damage then
207 damage = damage * 0.95
208 end
209 if targetUser:HasBuffID(56510_KING_OF_BEASTS_CARD_:MAX_STACK_0) then
210 local guid = targetUser:GetGuid()
211 local Debuff_Layer = srcUser:GetBuffLayerByIDAndFromID(96083, guid)
212 damage = damage * (1 - 0.06 * Debuff_Layer)
213 end
214 if 0 < damage and targetUser:GetBuffActive(107463) then
215 local Bufflv = targetUser:GetBuffLevel(107463_BALL_VANGUARD_EMPTY_BUFF_:MAX_STACK_0)
216 if (targetUser:HasBuffID(210010_HOLD_ADDING_BUFF_:MAX_STACK_0) or targetUser:HasBuffID(210200_CAPTURE_THE_CHESS_PIECE_:MAX_STACK_0)) and targetUser:InMoveStatus() == true then
217 damage = damage * (1 - 0.07 * Bufflv)
218 end
219 end
220 if (maptype == PVP_MAPS) and 0 < damage then
221 damage = damage * 0.8
222 end
223 damage = CommonFun.ModifyShapeDamage(srcUser, targetUser, skillParams, damage)
224 if srcUser:HasBuffID(187550_DEALS_ADDITIONAL_DMG_AGAINST_ENEMIES_BELOW_30_HP_:MAX_STACK_3) and (mapid == VOID_WASTELAND or mapid == VOID_PRISON or mapid == VOID_TEMPLE) then
225 local MaxHpMijing = targetUser:GetProperty("MaxHp")
226 local layerMijing = srcUser:GetBuffLayer(187550_DEALS_ADDITIONAL_DMG_AGAINST_ENEMIES_BELOW_30_HP_:MAX_STACK_3)
227 local HpMijing = targetUser:GetProperty("Hp")
228 if HpMijing <= MaxHpMijing * 0.3 then
229 damage = damage * (1 + layerMijing * 0.2)
230 end
231 end
232 local NoHurtRatio = targetUser:GetProperty("NoHurtRatio")
233 if 0 < NoHurtRatio and NoHurtRatio ~= nil and 0 < damage then
234 local Str_qy = targetUser:GetProperty("Str")
235 local Vit_qy = targetUser:GetProperty("Vit")
236 if damage <= (Str_qy + Vit_qy) * NoHurtRatio then
237 if srcUser.isServerCall then
238 targetUser:AddBuff(136732_UNSCATHED_PERFORMANCE_:MAX_STACK_0, targetUser:GetGuid())
239 end
240 return 0, CommonFun.DamageType.Barrier
241 end
242 end
243 if targetUser:HasBuffID(128120_END_OF_SUN_AND_MOON_:MAX_STACK_0) and srcUser:HasBuffID(128123_6038_:MAX_STACK_0) == false and 0 < damage then
244 local Ensemble = targetUser:GetProperty("Ensemble")
245 damage = damage * (1 - Ensemble % 1000 * 0.1)
246 end
247 if srcUser:HasBuffID(128120_END_OF_SUN_AND_MOON_:MAX_STACK_0) and targetUser:HasBuffID(128123_6038_:MAX_STACK_0) == false and 0 < damage then
248 local GemValue1 = srcUser:GetGemValue(102162_PERFORMER_S_DMG_TO_ENEMY_UNITS_OUTSIDE_DEMISE_OF_SUN_AND_MOON_S_RANGE_PERCENTAGE)
249 local GemValue2 = srcUser:GetGemValue(112162_PERFORMER_S_DMG_TO_ENEMY_UNITS_OUTSIDE_DEMISE_OF_SUN_AND_MOON_S_RANGE_PERCENTAGE)
250 damage = damage * (1 + GemValue1 / 100000 + GemValue2 / 100000)
251 end
252 if targetUser:HasBuffID(131530_CONCENTRIC_SEA_SPIRIT_:MAX_STACK_0) then
253 local skill_lv = targetUser:GetBuffLevel(131530_CONCENTRIC_SEA_SPIRIT_:MAX_STACK_0)
254 local MaxHp = targetUser:GetProperty("MaxHp")
255 local SeaJudgePer = targetUser:GetProperty("SeaJudgePer")
256 local SeaReducPer = targetUser:GetProperty("SeaReducPer")
257 if damage >= MaxHp * (0.2 - SeaJudgePer) then
258 damage = damage * (1 - skill_lv * 0.03 - SeaReducPer)
259 if srcUser.isServerCall then
260 targetUser:AddBuff(131531_CONCENTRIC_SEA_SPIRIT_EFFECT_:MAX_STACK_0, targetUser:GetGuid())
261 if targetUser:HasBuffID(22000090_SEASOUL_HEART_S_DOLAN_TRICK_:MAX_STACK_0) then
262 targetUser:AddBuff(131502_6041_:MAX_STACK_0, srcUser:GetGuid())
263 targetUser:AddBuff(131503_6041_:MAX_STACK_0, srcUser:GetGuid())
264 end
265 end
266 end
267 end
268 local WeaponType = targetUser:GetEquipedWeaponType()
269 if WeaponType == 250 and 0 < damage then
270 local WeaponType2 = srcUser:GetEquipedWeaponType()
271 if WeaponType2 == 180 or WeaponType2 == 250 then
272 local Baw = targetUser:GetProperty("BaWangRate")
273 damage = damage * (1 - Baw)
274 end
275 end
276 if CommonFun.LaunchType.LongAttack == skillParams.Launch_Type and (targetUser:HasBuffID(115004_DEFENDING_AURA_:MAX_STACK_0) or targetUser:HasBuffID(115080_DEFENDING_AURA_:MAX_STACK_0)) then
277 local targetid = targetUser:GetGuid()
278 local distance = srcUser:GetDistance(targetid)
279 if 2 <= distance then
280 local BuffNum = targetUser:GetBuffLevel(115080_DEFENDING_AURA_:MAX_STACK_0)
281 if BuffNum == 0 then
282 BuffNum = targetUser:GetBuffLevel(115004_DEFENDING_AURA_:MAX_STACK_0)
283 end
284 damage = math.floor(damage * (1 - (0.15 * BuffNum - 0.05)))
285 end
286 end
287 if targetUser:HasBuffID(137840_MAINTAIN_ORDER_:MAX_STACK_0) then
288 local targetid = targetUser:GetGuid()
289 local distance = srcUser:GetDistance(targetid)
290 if 5 < distance then
291 local Bufflv = targetUser:GetBuffLevel(137840_MAINTAIN_ORDER_:MAX_STACK_0)
292 damage = damage * (1 - Bufflv * 0.08)
293 end
294 end
295 if targetUser:HasBuffID(138751_23_:MAX_STACK_0) and (srcUser:HasBuffID(138701_DOOM_:MAX_STACK_0) or srcUser:HasBuffID(138730_OTHERSHORE_DOOM_:MAX_STACK_0)) then
296 local fromid_1 = srcUser:GetBuffFromID(138701_DOOM_:MAX_STACK_0)
297 local fromid_2 = srcUser:GetBuffFromID(138730_OTHERSHORE_DOOM_:MAX_STACK_0)
298 local guid = targetUser:GetGuid()
299 if fromid_1 == guid or fromid_2 == guid then
300 damage = damage * 0.7
301 end
302 end
303 if CommonFun.RollType.Attack == skillParams.RollType and targetUser:HasBuffID(139760_SOLAR_BARRIER_PHYSICAL_:MAX_STACK_0) and targetUser:HasBuffID(139610_POWER_OF_THE_SUN_:MAX_STACK_0) and targetUser:HasBuffID(139763_SOLAR_BARRIER_PHYSICAL_:MAX_STACK_0) == false then
304 local lieyang = targetUser:GetBuffLevel(139764_SOLAR_BARRIER_LEVEL_:MAX_STACK_0)
305 if lieyang == 10 then
306 damage = damage * 0.01
307 else
308 damage = damage * (0.5 - lieyang * 0.05)
309 end
310 end
311 if CommonFun.RollType.Magic == skillParams.RollType and targetUser:HasBuffID(139750_SOLAR_BARRIER_MAGIC_:MAX_STACK_0) and targetUser:HasBuffID(139610_POWER_OF_THE_SUN_:MAX_STACK_0) and targetUser:HasBuffID(139753_SOLAR_BARRIER_MAGIC_:MAX_STACK_0) == false then
312 local lieyang2 = targetUser:GetBuffLevel(139764_SOLAR_BARRIER_LEVEL_:MAX_STACK_0)
313 if lieyang2 == 10 then
314 damage = damage * 0.01
315 else
316 damage = damage * (0.5 - lieyang2 * 0.05)
317 end
318 end
319 if targetUser:HasBuffID(140050_IMPERMANENCE_:MAX_STACK_0) and 0 < damage then
320 local wuchang = targetUser:GetBuffLevel(140050_IMPERMANENCE_:MAX_STACK_0)
321 local random_wuchang = srcUser:GetRandom()
322 local Luk = targetUser:GetProperty("Luk")
323 local Final_wuchang = math.max(0.01, (100 - Luk / 10 - random_wuchang * math.max(0.79 + wuchang * 0.04 - Luk / 1000, 0)) / 100)
324 damage = damage * Final_wuchang
325 end
326 if srcUser:HasBuffID(139680_SUNNY_:MAX_STACK_0) or targetUser:HasBuffID(139680_SUNNY_:MAX_STACK_0) then
327 local targetRace = targetUser.race
328 local targetDefElement = targetUser:GetProperty("DefAttr")
329 if targetRace == 3 or targetRace == 5 or targetDefElement == 7 or targetDefElement == 9 then
330 damage = damage * 1.25
331 end
332 end
333 if srcUser:HasBuffID(136780_11105_:MAX_STACK_0) and targetUser:HasBuffID(136781_11106_:MAX_STACK_0) and srcUser:HasBuffID(136724_ABSOLUTE_STR_LEVEL_7_:MAX_STACK_0) then
334 damage = damage * 1.5
335 end
336 if srcUser:HasBuffID(136781_11106_:MAX_STACK_0) and targetUser:HasBuffID(136780_11105_:MAX_STACK_0) and targetUser:HasBuffID(136724_ABSOLUTE_STR_LEVEL_7_:MAX_STACK_0) then
337 damage = damage * 0.5
338 end
339 if targetUser:HasBuffID(140003_DAMAGE_TAKEN_BY_MONSTERS_INCREASES_:MAX_STACK_0) or targetUser:HasBuffID(140000_DESTINY_DEATH_:MAX_STACK_0) then
340 local fromid_1 = targetUser:GetBuffFromID(140003_DAMAGE_TAKEN_BY_MONSTERS_INCREASES_:MAX_STACK_0)
341 local fromid_2 = targetUser:GetBuffFromID(140000_DESTINY_DEATH_:MAX_STACK_0)
342 local guid = srcUser:GetGuid()
343 local Master = srcUser:GetMasterUser()
344 if Master ~= nil then
345 guid = Master:GetGuid()
346 end
347 local Mingding = targetUser:GetBuffLevel(140003_DAMAGE_TAKEN_BY_MONSTERS_INCREASES_:MAX_STACK_0)
348 local Mingding1 = targetUser:GetBuffLevel(140000_DESTINY_DEATH_:MAX_STACK_0)
349 local GemValueMingding = srcUser:GetGemValue(218101_THE_PROPORTION_OF_ADDITIONAL_DAMAGE_TAKEN_BY_THE_TARGET_FROM_THE_NAMELESS_CAUSED_BY_DESTINY_DEATH_PERCENTAGE)
350 if Master ~= nil then
351 GemValueMingding = Master:GetGemValue(218101_THE_PROPORTION_OF_ADDITIONAL_DAMAGE_TAKEN_BY_THE_TARGET_FROM_THE_NAMELESS_CAUSED_BY_DESTINY_DEATH_PERCENTAGE)
352 end
353 if fromid_1 == guid or fromid_2 == guid then
354 damage = damage * (1 + GemValueMingding / 100000 + Mingding * 0.1 + Mingding1 * 0.1)
355 end
356 end
357 if targetUser:HasBuffID(140930_ENCHANTING_RESISTANCE_MONSTER_DAMAGE_REDUCTION_:MAX_STACK_0) and srcUser:GetNpcID() == 0 and srcUser:GetGender() == 2 and 0 < damage then
358 local BuffLv = targetUser:GetBuffLevel(140930_ENCHANTING_RESISTANCE_MONSTER_DAMAGE_REDUCTION_:MAX_STACK_0)
359 local Profession = srcUser:GetProfressionID()
360 if Profession ~= 815 then
361 damage = damage * (1 - 0.05 * BuffLv)
362 end
363 end
364 if srcUser:HasBuffID(140872_ATTACK_SPEED_AND_CAP_INCREASED_:MAX_STACK_0) then
365 local chongjing = srcUser:GetBuffLayer(140872_ATTACK_SPEED_AND_CAP_INCREASED_:MAX_STACK_0)
366 local skilllv_cj = srcUser:GetLernedSkillLevel(4783_PHANTOM_DANCER:LIARIS_FREESE)
367 if chongjing == skilllv_cj * 10 then
368 damage = damage * (1 + 0.1 * skilllv_cj)
369 end
370 end
371 if targetUser:HasBuffID(141210_GYPSY_OF_THE_WIND_DAMAGE_REDUCTION_WHILE_MOVING_:MAX_STACK_0) and targetUser:InMoveStatus() == true and 0 < damage then
372 local wuji = targetUser:GetBuffLevel(141210_GYPSY_OF_THE_WIND_DAMAGE_REDUCTION_WHILE_MOVING_:MAX_STACK_0)
373 local zhuanwu = 1
374 if targetUser:GetBuffActive(90007054) == true then
375 zhuanwu = 2
376 end
377 damage = damage * (1 - wuji * 0.03 * zhuanwu)
378 end
379 if (srcUser:HasBuffID(141801_ATTUNEMENT_OF_FATE_1_:MAX_STACK_0) or srcUser:HasBuffID(141800_ATTUNEMENT_OF_FATE_:MAX_STACK_0)) and 0 < damage then
380 local count = 0
381 if targetUser:HasBuffID(141811_ATTUNEMENT_OF_FATE_1_:MAX_STACK_0) then
382 count = count + 1
383 end
384 if targetUser:HasBuffID(141812_ATTUNEMENT_OF_FATE_2_:MAX_STACK_0) then
385 count = count + 1
386 end
387 if targetUser:HasBuffID(141813_ATTUNEMENT_OF_FATE_3_:MAX_STACK_0) then
388 count = count + 1
389 end
390 if targetUser:HasBuffID(141814_ATTUNEMENT_OF_FATE_4_:MAX_STACK_0) then
391 count = count + 1
392 end
393 if targetUser:HasBuffID(141815_ATTUNEMENT_OF_FATE_5_:MAX_STACK_0) then
394 count = count + 1
395 end
396 if targetUser:HasBuffID(141816_ATTUNEMENT_OF_FATE_6_:MAX_STACK_0) then
397 count = count + 1
398 end
399 if targetUser:HasBuffID(141817_ATTUNEMENT_OF_FATE_7_:MAX_STACK_0) then
400 count = count + 1
401 end
402 if targetUser:HasBuffID(141818_ATTUNEMENT_OF_FATE_8_:MAX_STACK_0) then
403 count = count + 1
404 end
405 if targetUser:HasBuffID(141819_ATTUNEMENT_OF_FATE_10_:MAX_STACK_0) then
406 count = count + 1
407 end
408 damage = damage * (1 + count * 0.1)
409 end
410 if srcUser:HasBuffID(107480_REAPER_DAMAGE_CONVERTED_TO_LIFE_LOSS_:MAX_STACK_0) == false and skillID == 4855_PHANTOM_DANCER:TEMPORAL_EROSION_BUBBLE and skillID == 4856_PHANTOM_DANCER:TEMPORAL_EROSION_BUBBLE and skillID == 4857_PHANTOM_DANCER:SINGULARITY_OF_SILENCE and skillID == 4858_PHANTOM_DANCER:SINGULARITY_OF_SILENCE then
411 local AttrEffect3 = targetUser:GetProperty("AttrEffect2")
412 local bits3 = CommonFun.getBits(AttrEffect3)
413 if bits3[CommonFun.AttrEffect2.MDamageTo1] == 1 and CommonFun.RollType.Magic == skillParams.RollType then
414 return 1, CommonFun.DamageType.Normal
415 end
416 if bits3[CommonFun.AttrEffect2.DamageTo1] == 1 and CommonFun.RollType.Attack == skillParams.RollType then
417 return 1, CommonFun.DamageType.Normal
418 end
419 end
420 local raid_dam_forcetype
421 damage, raid_dam_forcetype = CommonFun.ModifyDamageBySpecialRaid(srcUser, targetUser, damage, params)
422 if raid_dam_forcetype ~= nil then
423 return damage, raid_dam_forcetype
424 end
425 damage = CommonFun.ModifyNumberDamage(srcUser, targetUser, params, logger, damage)
426 damage = CommonFun.ModifyFinalDamage(srcUser, targetUser, params, logger, damage)
427 if 0 < damage and (GetNpcID == 81000_GOMORA or GetNpcID == 81001_BALTAN or GetNpcID == 81002_GOLZA or GetNpcID == 81003_BEMSTAR or GetNpcID == 81004_ELEKING or GetNpcID == 81005_KING_JOE) then
428 damage = CommonFun.calcATMDam(srcUser, targetUser, params, logger)
429 return damage, damageType
430 end
431 if 0 < damage and (GetNpcID == 250300_SORROW_POLYMER or GetNpcID == 250310_WORRY_POLYMER or GetNpcID == 250330_HEART_OF_SORROW or GetNpcID == 260300_SORROW_POLYMER or GetNpcID == 260310_WORRY_POLYMER or GetNpcID == 260330_HEART_OF_SORROW or GetNpcID == 270300_SORROW_POLYMER or GetNpcID == 270310_WORRY_POLYMER or GetNpcID == 270330_HEART_OF_SORROW) then
432 damage = damage * CommonFun.calcBOSSFinalDam(srcUser, targetUser, params, logger)
433 end
434 if targetUser:HasBuffID(159530_STICK_TO_:MAX_STACK_0) and 0 < damage then
435 local Limit_Dam = targetUser:GetProperty("MaxHp")
436 if damage < Limit_Dam * 0.02 then
437 damage = 0
438 end
439 end
440 damage = CommonFun.ModifyDamageBySpecialNpc(srcUser, damage, GetNpcID, params)
441 if GetSelfID == 0 and (GetNpcID == 301200_GRAND_ALTAR or GetNpcID == 301201_GRAVEL_ALTAR or GetNpcID == 301202_HOLY_LIGHT_FEATHER or GetNpcID == 301203_DARK_NIGHT_FEATHER or GetNpcID == 301204_OCEAN_ALTAR or GetNpcID == 301205_BLADDERWRACK_ALTAR or GetNpcID == 301206_LAVA_ALTAR) then
442 return 0, CommonFun.DamageType.Miss
443 end
444 if targetUser:HasBuffID(32290_DISTANCE_BETWEEN_THE_GREAT_WALL_AND_THE_MOON_:MAX_STACK_0) and 0 < damage and targetUser:HasBuffID(135251_SOUL_OF_THE_TAEKWON_NO_SP_COST_:MAX_STACK_0) == false then
445 local pvpRatio = 5
446 if maptype == PVP_MAPS then
447 pvpRatio = 20
448 end
449 local Sp = targetUser:GetProperty("Sp")
450 if Sp > damage / pvpRatio then
451 damage = damage / pvpRatio
452 return damage, CommonFun.DamageType.Normal_Sp
453 elseif 0 < Sp and Sp < damage / pvpRatio then
454 damage = damage - Sp * pvpRatio
455 local Hp = targetUser:GetProperty("Hp")
456 if damage >= Hp then
457 return damage, damageType
458 end
459 if srcUser.isServerCall then
460 srcUser:AddBuff(32291_DISTANCE_BETWEEN_THE_GREAT_WALL_AND_THE_MOON_:MAX_STACK_0, targetUser:GetGuid())
461 end
462 end
463 end
464 if srcUser:HasBuffID(154690_GOOD_LUCK_SPIRIT_EMPTY_BUFF_:MAX_STACK_0) and srcUser:IsAttackSkill(params.skillIDAndLevel) == false and 0 < damage then
465 local skilllv_luk = srcUser:GetBoKiSkillLv(4520)
466 local skilllv_lukdam = srcUser:GetBoKiSkillLv(4521)
467 local Rate = skilllv_luk * 3
468 if CommonFun.IsInRate(Rate, srcUser:GetRandom()) then
469 damage = damage * (1.3 + skilllv_lukdam * 0.03)
470 damageType = CommonFun.DamageType.Crit
471 local skilllv_lukzs = srcUser:GetBoKiSkillLv(4522)
472 if 0 < skilllv_lukzs and srcUser.isServerCall then
473 srcUser:AddBuff(154340_GOOD_LUCK_SERIOUS_INJURY_MASTER_:MAX_STACK_0, targetUser:GetGuid())
474 end
475 end
476 end
477 local magic_cri_dam, magic_cri_type = CommonFun.ModifyMagicCriDam(srcUser, targetUser, params, skillParams, damage)
478 if magic_cri_type ~= nil then
479 return magic_cri_dam, magic_cri_type
480 end
481 damage = math.floor(damage)
482 local count = params.hitedCount
483 local index = params.hitedIndex
484 if skillParams.Logic_Param.spotter ~= nil and index ~= 1 then
485 local spotter = srcUser:GetSpotter(params.skillIDAndLevel) + skillParams.Logic_Param.spotter
486 return math.min(damage * spotter, 2147483647), damageType
487 end
488 if skillID == 252_LORD_KNIGHT:STORM_GUST and count == 1 and srcUser:HasBuffID(20410160_SPLASH_DMG_CONCENTRATES_:MAX_STACK_0) then
489 local spotter = srcUser:GetSpotter(params.skillIDAndLevel) + skillParams.Logic_Param.spotter
490 return math.min(damage * (1 + spotter * 0.5 * 2), 2147483647), damageType
491 end
492 if damage >= 2147483647 and (mapid == PONAPE_SECRET_REALM or mapid == WHITESTAR_AIRSHIP or mapid == PALACE_OF_GHOST_-_EPIC_SPIRIT or mapid == QUAINT_COTTAGE or mapid == ELEGANT_HOUSE or mapid == GARDEN or mapid == TOWER_OF_EVILNESS_V or mapid == TOWER_OF_HEAT_V or mapid == TOWER_OF_WORLDLINE_V or mapid == TOWER_OF_DOOM_V or mapid == DARK_FINALE_-_EPIC_SPIRIT or mapid == SPACE_OF_TIME_-_EPIC_SPIRIT or mapid == TOWER_OF_EVILNESS_IV or mapid == TOWER_OF_HEAT_IV or mapid == TOWER_OF_WORLDLINE_IV or mapid == TOWER_OF_DOOM_IV or mapid == ABYSSAL_LAKE or srcUser:InDamReduceRaid() == true and srcUser:IsUserCamp() == true) then
493 elseif damage >= 2147483647 then
494 damage = 2147483647
495 end
496 if skillParams.Logic == "SkillLockedTarget" and skillParams.Logic_Param.range == nil and srcUser:HasBuffID(311000_ELEMENTAL_FOCUS_:MAX_STACK_0) then
497 local rate1 = srcUser:GetBuffLayer(311010_ELEMENTAL_FOCUS_:MAX_STACK_10)
498 local rate2 = srcUser:GetBuffLayer(311200_ELEMENTAL_FOCUS_CRIT_RATE_:MAX_STACK_0) * 10
499 local rate = rate1
500 if rate1 == 10 then
501 rate = rate1 + rate2
502 end
503 local baoshang = 2
504 if rate1 == 10 then
505 baoshang = srcUser:GetBuffLayer(311100_ELEMENTAL_FOCUS_CRIT_DMG_:MAX_STACK_0) * 0.2 + 2
506 end
507 if CommonFun.IsInRate(rate, srcUser:GetRandom()) then
508 damage = damage * baoshang
509 damageType = CommonFun.DamageType.Crit
510 if srcUser:HasBuffID(311300_ELEMENTAL_FOCUS_CRITICAL_HIT_:MAX_STACK_0) and srcUser.isServerCall then
511 srcUser:AddBuff(311301_ELEMENTAL_FOCUS_CRITICAL_HIT_INCREASES_PIERCING_:MAX_STACK_10, srcUser:GetGuid())
512 end
513 if srcUser:HasBuffID(311400_DAMAGE_ON_CRITICAL_HITS_:MAX_STACK_0) and srcUser.isServerCall then
514 srcUser:AddBuff(311401_DAMAGE_ON_CRITICAL_HITS_:MAX_STACK_0, targetUser:GetGuid())
515 end
516 end
517 end
518 return damage, damageType
519endFormula Graph
Connected Archive Data
See which cards, equipment, headwears, buffs, and other archived records connect to this formula.
Loading graph filters
CommonFun.CalcBaseDamage
commonfun-calcbasedamage
Nodes
0
Edges
0
Related Nodes
Select at least one node type.
