|
@@ -1574,8 +1574,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
|
#endif
|
|
#endif
|
|
case SP_SOULEXPLOSION:
|
|
case SP_SOULEXPLOSION:
|
|
// Adjust these based on any possible PK damage rates.
|
|
// Adjust these based on any possible PK damage rates.
|
|
- if (battle_config.pk_mode > 0 && src->type == BL_PC && bl->type == BL_PC && damage > 0 && map_getmapflag(bl->m, MF_PVP))
|
|
|
|
- damage = battle_calc_zone_damage_rate(*bl, damage, flag);
|
|
|
|
|
|
+ if (battle_config.pk_mode > 0 && map_getmapflag(bl->m, MF_PVP))
|
|
|
|
+ damage = battle_calc_pk_damage(*src, *bl, damage, skill_id, flag);
|
|
|
|
|
|
return damage; //These skills bypass everything else.
|
|
return damage; //These skills bypass everything else.
|
|
}
|
|
}
|
|
@@ -1584,8 +1584,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
|
// So can defense sphere's but what the heck is that??? [Rytech]
|
|
// So can defense sphere's but what the heck is that??? [Rytech]
|
|
if (skill_id == SJ_NOVAEXPLOSING && !(tsc && (tsc->getSCE(SC_SAFETYWALL) || tsc->getSCE(SC_MILLENNIUMSHIELD)))) {
|
|
if (skill_id == SJ_NOVAEXPLOSING && !(tsc && (tsc->getSCE(SC_SAFETYWALL) || tsc->getSCE(SC_MILLENNIUMSHIELD)))) {
|
|
// Adjust this based on any possible PK damage rates.
|
|
// Adjust this based on any possible PK damage rates.
|
|
- if (battle_config.pk_mode > 0 && src->type == BL_PC && bl->type == BL_PC && damage > 0 && map_getmapflag(bl->m, MF_PVP))
|
|
|
|
- damage = battle_calc_zone_damage_rate(*bl, damage, flag);
|
|
|
|
|
|
+ if (battle_config.pk_mode > 0 && map_getmapflag(bl->m, MF_PVP))
|
|
|
|
+ damage = battle_calc_pk_damage(*src, *bl, damage, skill_id, flag);
|
|
|
|
|
|
return damage;
|
|
return damage;
|
|
}
|
|
}
|
|
@@ -1944,8 +1944,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
|
} //End of caster SC_ check
|
|
} //End of caster SC_ check
|
|
|
|
|
|
//PK damage rates
|
|
//PK damage rates
|
|
- if (battle_config.pk_mode > 0 && src->type == BL_PC && bl->type == BL_PC && damage > 0 && map_getmapflag(bl->m, MF_PVP))
|
|
|
|
- damage = battle_calc_zone_damage_rate(*bl, damage, flag);
|
|
|
|
|
|
+ if (battle_config.pk_mode > 0 && map_getmapflag(bl->m, MF_PVP))
|
|
|
|
+ damage = battle_calc_pk_damage(*src, *bl, damage, skill_id, flag);
|
|
|
|
|
|
if(battle_config.skill_min_damage && damage > 0 && damage < div_) {
|
|
if(battle_config.skill_min_damage && damage > 0 && damage < div_) {
|
|
if ((flag&BF_WEAPON && battle_config.skill_min_damage&1)
|
|
if ((flag&BF_WEAPON && battle_config.skill_min_damage&1)
|
|
@@ -2098,6 +2098,31 @@ int64 battle_calc_gvg_damage(struct block_list *src,struct block_list *bl,int64
|
|
return i64max(battle_calc_zone_damage_rate(*bl, damage, flag), 1);
|
|
return i64max(battle_calc_zone_damage_rate(*bl, damage, flag), 1);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Calculates PK related damage adjustments (between players only).
|
|
|
|
+ * @param src: Source object
|
|
|
|
+ * @param bl: Target object
|
|
|
|
+ * @param damage: Damage being done
|
|
|
|
+ * @param skill_id: Skill used
|
|
|
|
+ * @param flag: Battle flag type
|
|
|
|
+ * @return Modified damage
|
|
|
|
+ */
|
|
|
|
+int64 battle_calc_pk_damage(block_list &src, block_list &bl, int64 damage, uint16 skill_id, int flag) {
|
|
|
|
+ if (damage == 0) // No reductions to make.
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ if (battle_config.pk_mode == 0) // PK mode is disabled.
|
|
|
|
+ return damage;
|
|
|
|
+
|
|
|
|
+ if (skill_get_inf2(skill_id, INF2_IGNOREPKREDUCTION)) //Skills with no pk damage reduction.
|
|
|
|
+ return damage;
|
|
|
|
+
|
|
|
|
+ if (src.type == BL_PC && bl.type == BL_PC)
|
|
|
|
+ return i64max(battle_calc_zone_damage_rate(bl, damage, flag), 1);
|
|
|
|
+ else
|
|
|
|
+ return damage;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* HP/SP drain calculation
|
|
* HP/SP drain calculation
|
|
* @param damage Damage inflicted to the enemy
|
|
* @param damage Damage inflicted to the enemy
|
|
@@ -8878,8 +8903,8 @@ int64 battle_calc_return_damage(struct block_list* tbl, struct block_list *src,
|
|
rdamage = battle_calc_gvg_damage(src, tbl, rdamage, skill_id, flag);
|
|
rdamage = battle_calc_gvg_damage(src, tbl, rdamage, skill_id, flag);
|
|
else if (mapdata->getMapFlag(MF_BATTLEGROUND))
|
|
else if (mapdata->getMapFlag(MF_BATTLEGROUND))
|
|
rdamage = battle_calc_bg_damage(src, tbl, rdamage, skill_id, flag);
|
|
rdamage = battle_calc_bg_damage(src, tbl, rdamage, skill_id, flag);
|
|
- else if (battle_config.pk_mode > 0 && src->type == BL_PC && tbl->type == BL_PC && damage > 0 && mapdata->getMapFlag(MF_PVP))
|
|
|
|
- rdamage = battle_calc_zone_damage_rate(*tbl, damage, flag);
|
|
|
|
|
|
+ else if (battle_config.pk_mode > 0 && mapdata->getMapFlag(MF_PVP))
|
|
|
|
+ damage = battle_calc_pk_damage(*src, *tbl, damage, skill_id, flag);
|
|
|
|
|
|
// Skill damage adjustment
|
|
// Skill damage adjustment
|
|
int skill_damage = battle_skill_damage(src, tbl, skill_id);
|
|
int skill_damage = battle_skill_damage(src, tbl, skill_id);
|