|
@@ -254,11 +254,15 @@ struct block_list* battle_getenemyarea(struct block_list *src, int x, int y, int
|
|
|
* @param dmg_lv: State of the attack (miss, etc.)
|
|
|
* @param attack_type: Type of the attack (BF_NORMAL|BF_SKILL|BF_SHORT|BF_LONG|BF_WEAPON|BF_MAGIC|BF_MISC)
|
|
|
* @param additional_effects: Whether additional effect should be applied
|
|
|
+* @param isspdamage: If the damage is done to SP
|
|
|
* @param tick: Current tick
|
|
|
*------------------------------------------*/
|
|
|
-void battle_damage(struct block_list *src, struct block_list *target, int64 damage, int delay, uint16 skill_lv, uint16 skill_id, enum damage_lv dmg_lv, unsigned short attack_type, bool additional_effects, unsigned int tick) {
|
|
|
+void battle_damage(struct block_list *src, struct block_list *target, int64 damage, int delay, uint16 skill_lv, uint16 skill_id, enum damage_lv dmg_lv, unsigned short attack_type, bool additional_effects, unsigned int tick, bool isspdamage) {
|
|
|
map_freeblock_lock();
|
|
|
- status_fix_damage(src, target, damage, delay); // We have to separate here between reflect damage and others [icescope]
|
|
|
+ if (isspdamage)
|
|
|
+ status_fix_spdamage(src, target, damage, delay);
|
|
|
+ else
|
|
|
+ status_fix_damage(src, target, damage, delay); // We have to separate here between reflect damage and others [icescope]
|
|
|
if (attack_type && !status_isdead(target) && additional_effects)
|
|
|
skill_additional_effect(src, target, skill_id, skill_lv, attack_type, dmg_lv, tick);
|
|
|
if (dmg_lv > ATK_BLOCK && attack_type)
|
|
@@ -285,6 +289,7 @@ struct delay_damage {
|
|
|
unsigned short attack_type;
|
|
|
bool additional_effects;
|
|
|
enum bl_type src_type;
|
|
|
+ bool isspdamage;
|
|
|
};
|
|
|
|
|
|
int battle_delay_damage_sub(int tid, unsigned int tick, int id, intptr_t data)
|
|
@@ -312,7 +317,7 @@ int battle_delay_damage_sub(int tid, unsigned int tick, int id, intptr_t data)
|
|
|
check_distance_bl(src, target, dat->distance) ) //Check to see if you haven't teleported. [Skotlex]
|
|
|
{
|
|
|
//Deal damage
|
|
|
- battle_damage(src, target, dat->damage, dat->delay, dat->skill_lv, dat->skill_id, dat->dmg_lv, dat->attack_type, dat->additional_effects, tick);
|
|
|
+ battle_damage(src, target, dat->damage, dat->delay, dat->skill_lv, dat->skill_id, dat->dmg_lv, dat->attack_type, dat->additional_effects, tick, dat->isspdamage);
|
|
|
} else if( !src && dat->skill_id == CR_REFLECTSHIELD ) { // it was monster reflected damage, and the monster died, we pass the damage to the character as expected
|
|
|
map_freeblock_lock();
|
|
|
status_fix_damage(target, target, dat->damage, dat->delay);
|
|
@@ -328,7 +333,7 @@ int battle_delay_damage_sub(int tid, unsigned int tick, int id, intptr_t data)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int battle_delay_damage(unsigned int tick, int amotion, struct block_list *src, struct block_list *target, int attack_type, uint16 skill_id, uint16 skill_lv, int64 damage, enum damage_lv dmg_lv, int ddelay, bool additional_effects)
|
|
|
+int battle_delay_damage(unsigned int tick, int amotion, struct block_list *src, struct block_list *target, int attack_type, uint16 skill_id, uint16 skill_lv, int64 damage, enum damage_lv dmg_lv, int ddelay, bool additional_effects, bool isspdamage)
|
|
|
{
|
|
|
struct delay_damage *dat;
|
|
|
struct status_change *sc;
|
|
@@ -353,7 +358,7 @@ int battle_delay_damage(unsigned int tick, int amotion, struct block_list *src,
|
|
|
|
|
|
if ( !battle_config.delay_battle_damage || amotion <= 1 ) {
|
|
|
//Deal damage
|
|
|
- battle_damage(src, target, damage, ddelay, skill_lv, skill_id, dmg_lv, attack_type, additional_effects, gettick());
|
|
|
+ battle_damage(src, target, damage, ddelay, skill_lv, skill_id, dmg_lv, attack_type, additional_effects, gettick(), isspdamage);
|
|
|
return 0;
|
|
|
}
|
|
|
dat = ers_alloc(delay_damage_ers, struct delay_damage);
|
|
@@ -368,6 +373,7 @@ int battle_delay_damage(unsigned int tick, int amotion, struct block_list *src,
|
|
|
dat->distance = distance_bl(src, target) + (battle_config.snap_dodge ? 10 : AREA_SIZE);
|
|
|
dat->additional_effects = additional_effects;
|
|
|
dat->src_type = src->type;
|
|
|
+ dat->isspdamage = isspdamage;
|
|
|
if (src->type != BL_PC && amotion > 1000)
|
|
|
amotion = 1000; //Aegis places a damage-delay cap of 1 sec to non player attacks. [Skotlex]
|
|
|
|
|
@@ -4893,11 +4899,11 @@ struct Damage battle_calc_attack_gvg_bg(struct Damage wd, struct block_list *src
|
|
|
if( rdamage > 0 ) { //Item reflect gets calculated before any mapflag reducing is applicated
|
|
|
struct block_list *d_bl = battle_check_devotion(src);
|
|
|
|
|
|
- rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd.amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0);
|
|
|
+ rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd.amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
|
|
|
if( tsd )
|
|
|
- battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_, is_infinite_defense(src,wd.flag));
|
|
|
+ battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
|
|
|
//Use Reflect Shield to signal this kind of skill trigger [Skotlex]
|
|
|
- battle_delay_damage(tick, wd.amotion, target, (!d_bl) ? src : d_bl, 0, CR_REFLECTSHIELD, 0, rdamage, ATK_DEF, rdelay, true);
|
|
|
+ battle_delay_damage(tick, wd.amotion, target, (!d_bl) ? src : d_bl, 0, CR_REFLECTSHIELD, 0, rdamage, ATK_DEF, rdelay, true, false);
|
|
|
skill_additional_effect(target, (!d_bl) ? src : d_bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL, ATK_DEF, tick);
|
|
|
}
|
|
|
}
|
|
@@ -4961,7 +4967,7 @@ struct Damage battle_calc_weapon_final_atk_modifiers(struct Damage wd, struct bl
|
|
|
)
|
|
|
{
|
|
|
ATK_RATER(wd.damage, 50)
|
|
|
- status_fix_damage(target,src,wd.damage,clif_damage(target,src,gettick(),0,0,wd.damage,0,DMG_NORMAL,0));
|
|
|
+ status_fix_damage(target,src,wd.damage,clif_damage(target,src,gettick(),0,0,wd.damage,0,DMG_NORMAL,0,false));
|
|
|
clif_skill_nodamage(target,target,ST_REJECTSWORD,tsc->data[SC_REJECTSWORD]->val1,1);
|
|
|
if( --(tsc->data[SC_REJECTSWORD]->val3) <= 0 )
|
|
|
status_change_end(target, SC_REJECTSWORD, INVALID_TIMER);
|
|
@@ -4977,7 +4983,7 @@ struct Damage battle_calc_weapon_final_atk_modifiers(struct Damage wd, struct bl
|
|
|
skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->data[SC_CRESCENTELBOW]->val1), unit_getdir(src), 0);
|
|
|
clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage,
|
|
|
1, SR_CRESCENTELBOW_AUTOSPELL, tsc->data[SC_CRESCENTELBOW]->val1, 6); // This is how official does
|
|
|
- clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0);
|
|
|
+ clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
|
|
|
status_damage(target, src, rdamage, 0, 0, 0);
|
|
|
status_damage(src, target, rdamage/10, 0, 0, 1);
|
|
|
status_change_end(target, SC_CRESCENTELBOW, INVALID_TIMER);
|
|
@@ -5160,11 +5166,11 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
|
|
|
if( attack_type == BF_WEAPON && tsc->data[SC_REFLECTDAMAGE] ) // Don't reflect your own damage (Grand Cross)
|
|
|
map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,wd->flag);
|
|
|
else if( attack_type == BF_WEAPON || attack_type == BF_MISC) {
|
|
|
- rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0);
|
|
|
+ rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
|
|
|
if( tsd )
|
|
|
- battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_, is_infinite_defense(src,wd->flag));
|
|
|
+ battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
|
|
|
// It appears that official servers give skill reflect damage a longer delay
|
|
|
- battle_delay_damage(tick, wd->amotion, target, (!d_bl) ? src : d_bl, 0, CR_REFLECTSHIELD, 0, rdamage, ATK_DEF, rdelay ,true);
|
|
|
+ battle_delay_damage(tick, wd->amotion, target, (!d_bl) ? src : d_bl, 0, CR_REFLECTSHIELD, 0, rdamage, ATK_DEF, rdelay ,true, false);
|
|
|
skill_additional_effect(target, (!d_bl) ? src : d_bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL, ATK_DEF, tick);
|
|
|
}
|
|
|
}
|
|
@@ -6786,12 +6792,69 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i
|
|
|
return cap_value(min(rdamage,max_damage),INT_MIN,INT_MAX);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Calculate vanish from target
|
|
|
+ * @param sd: Player with vanish item
|
|
|
+ * @param target: Target to vanish HP/SP
|
|
|
+ * @param wd: Reference to Damage struct
|
|
|
+ */
|
|
|
+void battle_vanish(struct map_session_data *sd, struct block_list *target, struct Damage *wd)
|
|
|
+{
|
|
|
+ struct status_data *tstatus;
|
|
|
+ int hp = 0, sp = 0, race = status_get_race(target);
|
|
|
+ short vrate_hp = 0, vrate_sp = 0, v_hp = 0, v_sp = 0;
|
|
|
+ uint8 i = 0;
|
|
|
+
|
|
|
+ nullpo_retv(sd);
|
|
|
+ nullpo_retv(target);
|
|
|
+
|
|
|
+ tstatus = status_get_status_data(target);
|
|
|
+ wd->isspdamage = false;
|
|
|
+
|
|
|
+ hp = (sd->bonus.hp_vanish_rate * 10) + sd->hp_vanish_race[race].rate + sd->hp_vanish_race[RC_ALL].rate;
|
|
|
+ vrate_hp = cap_value(hp, 0, SHRT_MAX);
|
|
|
+ hp = sd->bonus.hp_vanish_per + sd->hp_vanish_race[race].per + sd->hp_vanish_race[RC_ALL].per;
|
|
|
+ v_hp = cap_value(hp, SHRT_MIN, SHRT_MAX);
|
|
|
+
|
|
|
+ sp = (sd->bonus.sp_vanish_rate * 10) + sd->sp_vanish_race[race].rate + sd->sp_vanish_race[RC_ALL].rate;
|
|
|
+ vrate_sp = cap_value(sp, 0, SHRT_MAX);
|
|
|
+ sp = sd->bonus.sp_vanish_per + sd->sp_vanish_race[race].per + sd->sp_vanish_race[RC_ALL].per;
|
|
|
+ v_sp = cap_value(sp, SHRT_MIN, SHRT_MAX);
|
|
|
+
|
|
|
+ if (wd->flag) {
|
|
|
+ // The HP and SP vanish bonus from these items can't stack because of the special damage display.
|
|
|
+ if (v_hp && vrate_hp && (vrate_hp >= 10000 || rnd()%10000 < vrate_hp))
|
|
|
+ i = 1;
|
|
|
+ if (v_sp && vrate_sp && (vrate_sp >= 10000 || rnd()%10000 < vrate_sp))
|
|
|
+ i = 2;
|
|
|
+
|
|
|
+ if (i == 1) {
|
|
|
+ wd->damage = apply_rate(tstatus->max_hp, v_hp);
|
|
|
+ wd->damage2 = 0;
|
|
|
+ }
|
|
|
+ if (i == 2) {
|
|
|
+ wd->damage = apply_rate(tstatus->max_sp, v_sp);
|
|
|
+ wd->damage2 = 0;
|
|
|
+ wd->isspdamage = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (v_hp && vrate_hp && (vrate_hp >= 10000 || rnd()%10000 < vrate_hp))
|
|
|
+ i |= 1;
|
|
|
+ if (v_sp && vrate_sp && (vrate_sp >= 10000 || rnd()%10000 < vrate_sp))
|
|
|
+ i |= 2;
|
|
|
+
|
|
|
+ if (i)
|
|
|
+ status_percent_damage(&sd->bl, target, (i&1) ? (int8)(-v_hp) : 0, (i&2) ? (int8)(-v_sp) : 0, false);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*===========================================
|
|
|
* Perform battle drain effects (HP/SP loss)
|
|
|
*-------------------------------------------*/
|
|
|
-void battle_drain(struct map_session_data *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int class_, bool infdef)
|
|
|
+void battle_drain(struct map_session_data *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int class_)
|
|
|
{
|
|
|
struct weapon_data *wd;
|
|
|
+ struct Damage d;
|
|
|
int64 *damage;
|
|
|
int thp = 0, // HP gained
|
|
|
tsp = 0, // SP gained
|
|
@@ -6799,32 +6862,14 @@ void battle_drain(struct map_session_data *sd, struct block_list *tbl, int64 rda
|
|
|
//rsp = 0, // SP reduced from target
|
|
|
hp = 0, sp = 0;
|
|
|
uint8 i = 0;
|
|
|
- short vrate_hp = 0, vrate_sp = 0, v_hp = 0, v_sp = 0;
|
|
|
|
|
|
if (!CHK_RACE(race) && !CHK_CLASS(class_))
|
|
|
return;
|
|
|
|
|
|
- // Check for vanish HP/SP. !CHECKME: Which first, drain or vanish?
|
|
|
- hp = (sd->bonus.hp_vanish_rate*10) + sd->hp_vanish_race[race].rate + sd->hp_vanish_race[RC_ALL].rate;
|
|
|
- vrate_hp = cap_value(hp, 0, SHRT_MAX);
|
|
|
- hp = sd->bonus.hp_vanish_per + sd->hp_vanish_race[race].per + sd->hp_vanish_race[RC_ALL].per;
|
|
|
- v_hp = cap_value(hp, SHRT_MIN, SHRT_MAX);
|
|
|
+ memset(&d, 0, sizeof(d));
|
|
|
|
|
|
- sp = (sd->bonus.sp_vanish_rate*10) + sd->sp_vanish_race[race].rate + sd->sp_vanish_race[RC_ALL].rate;
|
|
|
- vrate_sp = cap_value(sp, 0, SHRT_MAX);
|
|
|
- sp = sd->bonus.sp_vanish_per + sd->sp_vanish_race[race].per + sd->sp_vanish_race[RC_ALL].per;
|
|
|
- v_sp = cap_value(sp, INT8_MIN, INT8_MAX);
|
|
|
-
|
|
|
- if (v_hp > 0 && vrate_hp > 0 && (vrate_hp >= 10000 || rnd()%10000 < vrate_hp))
|
|
|
- i |= 1;
|
|
|
- if (v_sp > 0 && vrate_sp > 0 && (vrate_sp >= 10000 || rnd()%10000 < vrate_sp))
|
|
|
- i |= 2;
|
|
|
- if (i) {
|
|
|
- if (infdef)
|
|
|
- status_zap(tbl, v_hp ? v_hp/100 : 0, v_sp ? v_sp/100 : 0);
|
|
|
- else
|
|
|
- status_percent_damage(&sd->bl, tbl, (i&1 ? (int8)(-v_hp): 0), (i&2 ? (int8)(-v_sp) : 0), false);
|
|
|
- }
|
|
|
+ // Check for vanish HP/SP. !CHECKME: Which first, drain or vanish?
|
|
|
+ battle_vanish(sd, tbl, &d);
|
|
|
|
|
|
// Check for drain HP/SP
|
|
|
hp = sp = i = 0;
|
|
@@ -6908,12 +6953,12 @@ int battle_damage_area(struct block_list *bl, va_list ap) {
|
|
|
if( bl != src && battle_check_target(src,bl,BCT_ENEMY) > 0 ) {
|
|
|
map_freeblock_lock();
|
|
|
if( src->type == BL_PC )
|
|
|
- battle_drain((TBL_PC*)src, bl, damage, damage, status_get_race(bl), status_get_class_(bl), is_infinite_defense(bl,flag));
|
|
|
+ battle_drain((TBL_PC*)src, bl, damage, damage, status_get_race(bl), status_get_class_(bl));
|
|
|
if( amotion )
|
|
|
- battle_delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true);
|
|
|
+ battle_delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true,false);
|
|
|
else
|
|
|
status_fix_damage(src,bl,damage,0);
|
|
|
- clif_damage(bl,bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0);
|
|
|
+ clif_damage(bl,bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false);
|
|
|
skill_additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
|
|
|
map_freeblock_unlock();
|
|
|
}
|
|
@@ -7007,7 +7052,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|
|
uint16 skill_lv = tsc->data[SC_AUTOCOUNTER]->val1;
|
|
|
|
|
|
clif_skillcastcancel(target); //Remove the casting bar. [Skotlex]
|
|
|
- clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0); //Display MISS.
|
|
|
+ clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
|
|
status_change_end(target, SC_AUTOCOUNTER, INVALID_TIMER);
|
|
|
skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0);
|
|
|
return ATK_BLOCK;
|
|
@@ -7021,7 +7066,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|
|
status_change_end(target, SC_BLADESTOP_WAIT, INVALID_TIMER);
|
|
|
if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
|
|
|
{ //Target locked.
|
|
|
- clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0); //Display MISS.
|
|
|
+ clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
|
|
clif_bladestop(target, src->id, 1);
|
|
|
sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
|
|
|
return ATK_BLOCK;
|
|
@@ -7101,6 +7146,9 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|
|
|
|
|
wd = battle_calc_attack(BF_WEAPON, src, target, 0, 0, flag);
|
|
|
|
|
|
+ if (sd && wd.damage + wd.damage2 > 0)
|
|
|
+ battle_vanish(sd, target, &wd);
|
|
|
+
|
|
|
if( sc && sc->count ) {
|
|
|
if (sc->data[SC_EXEEDBREAK]) {
|
|
|
wd.damage *= sc->data[SC_EXEEDBREAK]->val2 / 100;
|
|
@@ -7143,7 +7191,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- wd.dmotion = clif_damage(src, target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , (enum e_damage_type)wd.type, wd.damage2);
|
|
|
+ wd.dmotion = clif_damage(src, target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , (enum e_damage_type)wd.type, wd.damage2, wd.isspdamage);
|
|
|
|
|
|
if (sd && sd->bonus.splash_range > 0 && damage > 0)
|
|
|
skill_castend_damage_id(src, target, 0, 1, tick, 0);
|
|
@@ -7168,7 +7216,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|
|
if( wd.dmg_lv > ATK_BLOCK )
|
|
|
skill_counter_additional_effect(src, target, 0, 0, wd.flag, tick);
|
|
|
} else
|
|
|
- battle_delay_damage(tick, wd.amotion, src, target, wd.flag, 0, 0, damage, wd.dmg_lv, wd.dmotion, true);
|
|
|
+ battle_delay_damage(tick, wd.amotion, src, target, wd.flag, 0, 0, damage, wd.dmg_lv, wd.dmotion, true, wd.isspdamage);
|
|
|
if( tsc ) {
|
|
|
if( tsc->data[SC_DEVOTION] ) {
|
|
|
struct status_change_entry *sce = tsc->data[SC_DEVOTION];
|
|
@@ -7179,7 +7227,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|
|
(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == target->id)
|
|
|
) && check_distance_bl(target, d_bl, sce->val3) )
|
|
|
{
|
|
|
- clif_damage(d_bl, d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0);
|
|
|
+ clif_damage(d_bl, d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0, false);
|
|
|
status_fix_damage(NULL, d_bl, damage, 0);
|
|
|
}
|
|
|
else
|
|
@@ -7197,7 +7245,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|
|
struct block_list *e_bl = map_id2bl(tsc->data[SC_WATER_SCREEN_OPTION]->val1);
|
|
|
|
|
|
if (e_bl && !status_isdead(e_bl)) {
|
|
|
- clif_damage(e_bl, e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0);
|
|
|
+ clif_damage(e_bl, e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false);
|
|
|
status_fix_damage(NULL, e_bl, damage, 0);
|
|
|
}
|
|
|
}
|
|
@@ -7305,9 +7353,9 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|
|
|
|
|
if (wd.flag & BF_WEAPON && src != target && damage > 0) {
|
|
|
if (battle_config.left_cardfix_to_right)
|
|
|
- battle_drain(sd, target, wd.damage, wd.damage, tstatus->race, tstatus->class_, is_infinite_defense(target,wd.flag));
|
|
|
+ battle_drain(sd, target, wd.damage, wd.damage, tstatus->race, tstatus->class_);
|
|
|
else
|
|
|
- battle_drain(sd, target, wd.damage, wd.damage2, tstatus->race, tstatus->class_, is_infinite_defense(target,wd.flag));
|
|
|
+ battle_drain(sd, target, wd.damage, wd.damage2, tstatus->race, tstatus->class_);
|
|
|
}
|
|
|
}
|
|
|
|