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
519end
Formula 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.