Formula
CommonFun.DoCalcDamage
formula.lua
1function CommonFun.DoCalcDamage(srcUser, targetUser, params, logger)
2 local damage = 0
3 local damageType
4 local RealDamage = targetUser:GetProperty("RealDamage")
5 if targetUser:HasBuffID(96050_LEX_AETERNA_:MAX_STACK_0) and 1 <= RealDamage then
6 local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
7 if skillID == 359_RUNE_KNIGHT:PRESSURE then
8 RealDamage = RealDamage - 1
9 end
10 end
11 local MaxHp = targetUser:GetProperty("MaxHp")
12 local BaseLv = targetUser.BaseLv
13 local BaseLv1 = srcUser.BaseLv
14 local TransformID = srcUser:GetProperty("TransformID")
15 local MRefine = srcUser:GetProperty("MRefine")
16 local skillParams = Table_Skill[params.skillIDAndLevel]
17 local damageParamList = skillParams.Damage
18 for i = 1, #damageParamList do
19 local damageParam = damageParamList[i]
20 local func = CommonFun.CalcDamageFuncs[damageParam.type]
21 if nil ~= func then
22 local partDamage, partDamageType = func(srcUser, targetUser, params, damageParam, logger)
23 local elementDam = CommonFun.DoCalcElementDam(srcUser, targetUser, params, damageParam)
24 local stateDam = CommonFun.DoCalcStateEffectDam(srcUser, targetUser)
25 local srcAtkElement = CommonFun.GetUserAtkAttr(srcUser, targetUser, params, damageParam)
26 if (targetUser:HasBuffID(116813_WHITE_BARRIER_SNARE_:MAX_STACK_0) or targetUser:HasBuffID(116817_WHITE_BARRIER_SLOW_:MAX_STACK_0) or targetUser:HasBuffID(186150_WHITE_BARRIER_COMPOUND_MAGIC_SLOW_:MAX_STACK_0) or targetUser:HasBuffID(156111_WHITE_BARRIER_:MAX_STACK_0) or targetUser:HasBuffID(135271_SOUL_OF_THE_WIZARD_WHITE_BARRIER_:MAX_STACK_0) or targetUser:HasBuffID(232130_WHITE_BARRIER_:MAX_STACK_0) or targetUser:HasBuffID(116810_WHITE_IMPRISON_SNARE_:MAX_STACK_0) and targetUser.boss == false and targetUser.mini == false) and 0 < partDamage then
27 local Numjianyu = srcUser:GetRunePoint(223021_AESIR_DIVINE_DESTRUCTION_SLASH_AND_DRAGON_SLASH_CAN_DEAL_20_DMG_TO_ENEMY_UNITS_IN_THE_WHITE_IMPRISON_STATE)
28 local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
29 local GemValue = srcUser:GetGemValue(21161_NEW_THOUGHT_ELEMENTAL_BALL_THOUGHT_ATK_PERCENTAGE)
30 if skillID == 1915_HUNTER:RAGNA_BLADE or skillID == 1908_HUNTER:DRAG_SLAVE or skillID == 1941_SNIPER:DIVINE_DESTRUCTION_SLASH_LIGHTNING_BOLT_SMASH then
31 if 1 <= Numjianyu and targetUser:HasBuffID(116810_WHITE_IMPRISON_SNARE_:MAX_STACK_0) then
32 partDamage = partDamage * Numjianyu * 0.2
33 else
34 partDamage = 0
35 partDamageType = CommonFun.DamageType.WeaponBlock
36 end
37 elseif skillID == 1164_THIEF:TETRA_VORTEX then
38 if targetUser:HasBuffID(116810_WHITE_IMPRISON_SNARE_:MAX_STACK_0) and srcUser:HasBuffID(22000010_ELEMENTAL_EDDY_CAN_ATTACK_WHITE_PRISON_:MAX_STACK_0) then
39 elseif 0 < GemValue and srcAtkElement == 8 then
40 elseif 0 < GemValue and srcAtkElement ~= 8 then
41 partDamage = 0
42 else
43 partDamage = 0
44 partDamageType = CommonFun.DamageType.WeaponBlock
45 end
46 elseif srcAtkElement ~= 8 then
47 partDamage = 0
48 partDamageType = CommonFun.DamageType.WeaponBlock
49 end
50 end
51 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
52 if srcAtkElement == 5 or srcAtkElement == 6 or srcAtkElement == 8 then
53 if targetUser:HasBuffID(154910_3274_:MAX_STACK_0) then
54 partDamage = 0
55 end
56 if srcAtkElement == 6 and targetUser:HasBuffID(107441_SACRED_IMMUNITY_:MAX_STACK_0) then
57 partDamage = 0
58 end
59 end
60 if srcAtkElement == 3 and (targetUser:HasBuffID(154920_3276_:MAX_STACK_0) or targetUser:HasBuffID(107437_WATER_IMMUNITY_:MAX_STACK_0)) then
61 partDamage = 0
62 end
63 if srcAtkElement == 4 and (targetUser:HasBuffID(154920_3276_:MAX_STACK_0) or targetUser:HasBuffID(10570_FIRE_DAMAGE_IMMUNITY_:MAX_STACK_0) or targetUser:HasBuffID(107439_FIRE_IMMUNITY_:MAX_STACK_0)) then
64 partDamage = 0
65 end
66 if srcAtkElement == 1 or srcAtkElement == 2 then
67 if targetUser:HasBuffID(154930_3278_:MAX_STACK_0) then
68 partDamage = 0
69 end
70 if srcAtkElement == 1 and targetUser:HasBuffID(107433_WIND_IMMUNITY_:MAX_STACK_0) then
71 partDamage = 0
72 end
73 if srcAtkElement == 2 and targetUser:HasBuffID(107435_NEGATE_EARTH_:MAX_STACK_0) then
74 partDamage = 0
75 end
76 end
77 if (srcAtkElement == 7 or srcAtkElement == 9) and targetUser:HasBuffID(154940_3280_:MAX_STACK_0) then
78 partDamage = 0
79 end
80 if srcAtkElement == 10 and (targetUser:HasBuffID(154940_3280_:MAX_STACK_0) or targetUser:HasBuffID(10580_POISON_DAMAGE_IMMUNITY_:MAX_STACK_0)) then
81 partDamage = 0
82 end
83 end
84 if srcAtkElement == 1 and targetUser:HasBuffID(49160_WIND_ANCIENT_RELICS_:MAX_STACK_0) and 0 < partDamage then
85 partDamage = partDamage * 0.4
86 end
87 if srcAtkElement == 2 and targetUser:HasBuffID(49170_EARTH_ANCIENT_RELICS_:MAX_STACK_0) then
88 partDamage = partDamage * 0.4
89 end
90 if srcAtkElement == 3 and targetUser:HasBuffID(49180_WATER_ANCIENT_RELICS_:MAX_STACK_0) then
91 partDamage = partDamage * 0.4
92 end
93 if srcAtkElement == 4 and targetUser:HasBuffID(49190_FIRE_ANCIENT_RELICS_:MAX_STACK_0) then
94 partDamage = partDamage * 0.4
95 end
96 if srcAtkElement == 6 and targetUser:HasBuffID(49270_HOLY_ATTRIBUTE_ANCIENT_RELIC_:MAX_STACK_0) and 0 < partDamage then
97 partDamage = partDamage * 0.4
98 end
99 if srcAtkElement == 7 and targetUser:HasBuffID(49280_DARK_ATTRIBUTE_ANCIENT_RELIC_:MAX_STACK_0) then
100 partDamage = partDamage * 0.4
101 end
102 if srcAtkElement == 8 and targetUser:HasBuffID(49290_GHOST_ANCIENT_RELICS_:MAX_STACK_0) then
103 partDamage = partDamage * 0.4
104 end
105 if srcAtkElement == 10 and targetUser:HasBuffID(49300_POISON_ATTRIBUTE_ANCIENT_RELIC_:MAX_STACK_0) then
106 partDamage = partDamage * 0.4
107 end
108 if srcAtkElement == 5 and targetUser:HasBuffID(49310_NEUTRAL_ANCIENT_RELIC_:MAX_STACK_0) then
109 partDamage = partDamage * 0.4
110 end
111 if (srcAtkElement == 3 or srcAtkElement == 4) and targetUser:HasBuffID(159570_FROST_:MAX_STACK_0) then
112 partDamage = partDamage * 0.8
113 end
114 if (srcAtkElement == 2 or srcAtkElement == 4) and targetUser:HasBuffID(159571_FLAME_:MAX_STACK_0) then
115 partDamage = partDamage * 0.8
116 end
117 if (srcAtkElement == 1 or srcAtkElement == 2) and targetUser:HasBuffID(159572_GREAT_LAND_:MAX_STACK_0) then
118 partDamage = partDamage * 0.8
119 end
120 if (srcAtkElement == 1 or srcAtkElement == 3) and targetUser:HasBuffID(159573_HIGHWIND_:MAX_STACK_0) then
121 partDamage = partDamage * 0.8
122 end
123 if srcAtkElement ~= 8 and targetUser:HasBuffID(159574_UNREAL_:MAX_STACK_0) then
124 partDamage = partDamage * 0.8
125 end
126 if srcAtkElement == 6 and targetUser:HasBuffID(159575_PILGRIMAGE_:MAX_STACK_0) then
127 partDamage = partDamage * 0.8
128 end
129 if srcUser:HasBuffID(178100_TOXIN_PROFICIENCY_:MAX_STACK_0) and targetUser:HasBuffID(177930_DEGENERATE_CORRUPTION_:MAX_STACK_12) then
130 local fuhua = targetUser:GetBuffLayer(177930_DEGENERATE_CORRUPTION_:MAX_STACK_12)
131 partDamage = partDamage * (1 + math.min(fuhua * 0.2, 0.6))
132 end
133 partDamage = partDamage * elementDam * stateDam
134 damage = damage + partDamage
135 if nil ~= partDamageType then
136 damageType = partDamageType
137 end
138 else
139 logger.error(string.format("CommonFun.CalcDamageFuncs[%s] is nil", tostring(damageParam.type)))
140 end
141 end
142 damage = math.floor(damage)
143 if 0 < damage and targetUser:GetNpcID() == 30043_YEAR_YEAR then
144 local damageParam = damageParamList[1]
145 if damageParam ~= nil and damageParam.type ~= 8002 then
146 return 1, CommonFun.DamageType.Normal
147 end
148 end
149 if 0 < damage and (targetUser:GetNpcID() == 56008_GOMORA_GOMORA or targetUser:GetNpcID() == 56009_BALTAN_BALTAN or targetUser:GetNpcID() == 56010_GOLZA_GOLZA or targetUser:GetNpcID() == 56011_BEMSTAR_BEMSTAR or targetUser:GetNpcID() == 56012_ELEKING_ELEKING or targetUser:GetNpcID() == 56013_KING_JOE_KING_JOE) then
150 local damageParam = damageParamList[1]
151 if damageParam ~= nil and damageParam.type ~= 8020 and damageParam.type ~= 8021 then
152 return 1, CommonFun.DamageType.Normal
153 end
154 end
155 if 0 < damage and (targetUser:GetNpcID() == 56107_THE_FOURTH_ANGEL_THE_FOURTH_ANGEL or targetUser:GetNpcID() == 56108_THE_TENTH_ANGEL_THE_TENTH_ANGEL or targetUser:GetNpcID() == 56109_THE_SIXTH_ANGEL_THE_SIXTH_ANGEL) then
156 local damageParam = damageParamList[1]
157 if damageParam ~= nil and damageParam.type ~= 8010 and damageParam.type ~= 8011 then
158 return 1, CommonFun.DamageType.Normal
159 end
160 end
161 if targetUser:HasBuffID(155031_3294_:MAX_STACK_0) then
162 local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
163 if skillID == 79338_:MURDER_OF_ILLUSORY_CROWS then
164 return 0, CommonFun.DamageType.Miss
165 end
166 end
167 if srcUser:GetNpcID() == 300102_BRAGI or srcUser:GetNpcID() == 301300_BRAGI or srcUser:GetNpcID() == 301301_BRAGI or srcUser:GetNpcID() == 301302_BRAGI or srcUser:GetNpcID() == 301303_BRAGI then
168 local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
169 if skillID == 79342_:BALLAD_OF_ONE_THOUGHT then
170 local targetid = targetUser:GetGuid()
171 local distance = srcUser:GetDistance(targetid)
172 if distance <= 7 then
173 return 0, CommonFun.DamageType.None
174 end
175 end
176 end
177 if srcUser.boss and targetUser.boss == false then
178 local mapid, maptype = srcUser:GetMapInfo()
179 if maptype == 5 then
180 return math.floor(damage * (1 + RealDamage)), damageType
181 elseif srcUser:GetNpcID() == 291100_NIGHTMARE_OF_EDDGA or srcUser:GetNpcID() == 291200_NIGHTMARE_OF_EDDGA or srcUser:GetNpcID() == 291300_NIGHTMARE_OF_EDDGA or srcUser:GetNpcID() == 292100_SHADOW_OF_STROUF or srcUser:GetNpcID() == 292200_SHADOW_OF_STROUF or srcUser:GetNpcID() == 292300_SHADOW_OF_STROUF or srcUser:GetNpcID() == 293100_SHADOW_OF_MORROC or srcUser:GetNpcID() == 293200_SHADOW_OF_MORROC or srcUser:GetNpcID() == 293300_SHADOW_OF_MORROC then
182 return math.floor(damage * (1 + RealDamage)), damageType
183 elseif srcUser:GetNpcID() == 294104_RUNEMASTER or srcUser:GetNpcID() == 294105_DEMON_KING or srcUser:GetNpcID() == 294204_RUNEMASTER or srcUser:GetNpcID() == 294205_DEMON_KING or srcUser:GetNpcID() == 294304_RUNEMASTER or srcUser:GetNpcID() == 294305_DEMON_KING or srcUser:GetNpcID() == 295107_DARK_ASSASSIN_CROSS_EREMES or srcUser:GetNpcID() == 295207_DARK_ASSASSIN_CROSS_EREMES or srcUser:GetNpcID() == 295307_DARK_ASSASSIN_CROSS_EREMES then
184 return math.floor(damage * (1 + RealDamage)) + math.floor(MaxHp * math.random(1, 5) / 100) * (1 + (BaseLv1 - BaseLv) / 200), damageType
185 elseif BaseLv <= BaseLv1 and 70 <= BaseLv1 then
186 return math.floor(damage * (1 + RealDamage)) + math.floor(BaseLv1 * math.random(10, 25) + MRefine * 5 + MaxHp * math.random(1, 5) / 100) * (1 + (BaseLv1 - BaseLv) / 200), damageType
187 else
188 return math.floor(damage * (1 + RealDamage)) + math.floor(BaseLv1 * math.random(10, 25) + MRefine * 5 + MaxHp * math.random(1, 5) / 100) * (1 - (BaseLv - BaseLv1) / 200), damageType
189 end
190 end
191 if targetUser.boss and srcUser:GetNpcID() == 0 and BaseLv >= BaseLv1 then
192 return math.floor(damage * (1 + RealDamage)) * (1 - (BaseLv - BaseLv1) / 200), damageType
193 end
194 if TransformID ~= 0 then
195 local AttrEffect = srcUser:GetProperty("AttrEffect2")
196 local bits = CommonFun.getBits(AttrEffect)
197 local temp = false
198 if bits[CommonFun.AttrEffect2.BoliBianshen] == 1 or bits[CommonFun.AttrEffect2.GonghuiBianshen] == 1 then
199 temp = true
200 end
201 if bits[CommonFun.AttrEffect2.BCatBianshen] == 1 and targetUser:GetNpcID() == 30043_YEAR_YEAR then
202 temp = true
203 end
204 if 240000 <= TransformID and TransformID <= 240050 then
205 temp = true
206 end
207 if bits[CommonFun.AttrEffect2.UltraMan] == 1 and (targetUser:GetNpcID() == 56008_GOMORA_GOMORA or targetUser:GetNpcID() == 56009_BALTAN_BALTAN or targetUser:GetNpcID() == 56010_GOLZA_GOLZA or targetUser:GetNpcID() == 56011_BEMSTAR_BEMSTAR or targetUser:GetNpcID() == 56012_ELEKING_ELEKING or targetUser:GetNpcID() == 56013_KING_JOE_KING_JOE) then
208 temp = true
209 end
210 if bits[CommonFun.AttrEffect2.UltraMan] == 1 and (targetUser:GetNpcID() == 56107_THE_FOURTH_ANGEL_THE_FOURTH_ANGEL or targetUser:GetNpcID() == 56108_THE_TENTH_ANGEL_THE_TENTH_ANGEL or targetUser:GetNpcID() == 56109_THE_SIXTH_ANGEL_THE_SIXTH_ANGEL) then
211 temp = true
212 end
213 if TransformID == 62052 or TransformID == 62143 or TransformID == 62142 then
214 temp = true
215 end
216 if TransformID == 56634 or TransformID == 56635 then
217 temp = true
218 end
219 if TransformID == 455003 or TransformID == 455004 or TransformID == 455005 or TransformID == 280118 or TransformID == 280119 or TransformID == 280120 then
220 temp = true
221 end
222 if 80089 <= TransformID and TransformID <= 80094 then
223 temp = true
224 end
225 if temp == false then
226 return 6
227 end
228 end
229 local index = params.hitedIndex
230 if 100 <= index and math.floor(params.skillIDAndLevel / 1000) == 144 then
231 local Buff1 = srcUser:HasBuffID(45000130_DOUBLE_HEALING_:MAX_STACK_0)
232 local Num0 = srcUser:GetRunePoint(52001_AESIR_SKILL_LEVEL_OF_DOUBLE_HEALING_1_AFTER_CASTING_THE_PRIEST_RECEIVES_DOUBLE_HEALING_FOR_10_SECONDS_THE_NEXT_HEALING_SPELL_WILL_CURE_ONE_MORE_PARTY_MEMBER_WITH_THE_LOWEST_HP_THE_RECOVERY_VALUE_EQUALS_TO_10_OF_YOUR_HEALING_AMOUNT)
233 local Num1 = srcUser:GetRunePoint(52040_AESIR_SKILL_LEVEL_OF_DOUBLE_HEALING_1_AFTER_CASTING_THE_PRIEST_RECEIVES_DOUBLE_HEALING_FOR_10_SECONDS_THE_NEXT_HEALING_SPELL_WILL_CURE_ONE_MORE_PARTY_MEMBER_WITH_THE_LOWEST_HP_THE_RECOVERY_VALUE_EQUALS_TO_10_OF_YOUR_HEALING_AMOUNT)
234 local Num2 = srcUser:GetRunePoint(52041_AESIR_SKILL_LEVEL_OF_DOUBLE_HEALING_1_AFTER_CASTING_THE_PRIEST_RECEIVES_DOUBLE_HEALING_FOR_10_SECONDS_THE_NEXT_HEALING_SPELL_WILL_CURE_ONE_MORE_PARTY_MEMBER_WITH_THE_LOWEST_HP_THE_RECOVERY_VALUE_EQUALS_TO_10_OF_YOUR_HEALING_AMOUNT)
235 local Num3 = srcUser:GetRunePoint(52042_AESIR_SKILL_LEVEL_OF_DOUBLE_HEALING_1_AFTER_CASTING_THE_PRIEST_RECEIVES_DOUBLE_HEALING_FOR_10_SECONDS_THE_NEXT_HEALING_SPELL_WILL_CURE_ONE_MORE_PARTY_MEMBER_WITH_THE_LOWEST_HP_THE_RECOVERY_VALUE_EQUALS_TO_10_OF_YOUR_HEALING_AMOUNT)
236 local Num4 = srcUser:GetRunePoint(52003_AESIR_DURATION_OF_DOUBLE_HEALING_3_SECONDS_RECOVERY_VALUE_OF_DOUBLE_HEALING_3)
237 local RuneDamage = (Num0 + Num1 + Num2 + Num3) * 0.1 + Num4 * 0.03
238 local BuffRate = 0
239 if Buff1 == true then
240 BuffRate = RuneDamage
241 end
242 return damage * BuffRate, damageType
243 end
244 if damage < 0 then
245 RealDamage = 0
246 end
247 if index ~= 1 and (math.floor(params.skillIDAndLevel / 1000) == 74 or math.floor(params.skillIDAndLevel / 1000) == 79 or math.floor(params.skillIDAndLevel / 1000) == 107 or math.floor(params.skillIDAndLevel / 1000) == 1902) then
248 local Num1 = srcUser:GetRunePoint(22070_AESIR_SPLASH_DAMAGE_OF_ELEMENT_DIFFUSION_2)
249 local Num2 = srcUser:GetRunePoint(22033_AESIR_SPLASH_DAMAGE_OF_ELEMENT_DIFFUSION_2)
250 local Num3 = srcUser:GetRunePoint(22080_AESIR_FIRE_BOLT_COLD_BOLT_LIGHTNING_BOLT_SPLASHES_TO_3_TARGETS_DEALING_SPLASH_DAMAGE_EQUAL_TO_5_SKILL_DAMAGE_SP_COST_25)
251 local Num4 = srcUser:GetRunePoint(223008_AESIR_SPLASH_DAMAGE_OF_ELEMENT_DIFFUSION_2)
252 local Num5 = srcUser:GetRunePoint(223012_AESIR_MAKE_FLAME_ARROW_TO_SPLASH_AT_3_NEARBY_TARGETS_SPLASH_DMG_IS_EQUAL_TO_5_OF_SKILL_DMG_SP_CONSUMPTION_25)
253 local RuneDamage = (Num1 + Num2 + Num4) * 0.02 + (Num3 + Num5) * 0.05
254 return math.floor(damage * RuneDamage * (1 + RealDamage)), damageType
255 end
256 return math.floor(damage * (1 + RealDamage)), damageType
257endFormula Graph
Connected Archive Data
See which cards, equipment, headwears, buffs, and other archived records connect to this formula.
Loading graph filters
CommonFun.DoCalcDamage
commonfun-docalcdamage
Nodes
0
Edges
0
Related Nodes
Select at least one node type.
