Skip to content

Commit

Permalink
Updated Water Screen Option effect
Browse files Browse the repository at this point in the history
* Behaves like Devotion now.
* Damage beyond Aqua's HP is not reflected back to the master.
* Damage is now properly displayed on Aqua rather than the master.
Thanks to @exneval.
  • Loading branch information
aleos89 committed Jan 12, 2016
1 parent 01ba54c commit b85885c
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 37 deletions.
30 changes: 17 additions & 13 deletions src/map/battle.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,15 +308,21 @@ int battle_delay_damage(unsigned int tick, int amotion, struct block_list *src,
struct delay_damage *dat;
struct status_change *sc;
struct block_list *d_tbl = NULL;
struct block_list *e_tbl = NULL;

nullpo_ret(src);
nullpo_ret(target);

sc = status_get_sc(target);

if (sc && sc->data[SC_DEVOTION] && sc->data[SC_DEVOTION]->val1)
d_tbl = map_id2bl(sc->data[SC_DEVOTION]->val1);
if (sc) {
if (sc->data[SC_DEVOTION] && sc->data[SC_DEVOTION]->val1)
d_tbl = map_id2bl(sc->data[SC_DEVOTION]->val1);
if (sc->data[SC_WATER_SCREEN_OPTION] && sc->data[SC_WATER_SCREEN_OPTION]->val1)
e_tbl = map_id2bl(sc->data[SC_WATER_SCREEN_OPTION]->val1);
}

if( d_tbl && check_distance_bl(target, d_tbl, sc->data[SC_DEVOTION]->val3) &&
if( ((d_tbl && check_distance_bl(target, d_tbl, sc->data[SC_DEVOTION]->val3)) || e_tbl) &&
damage > 0 && skill_id != PA_PRESSURE && skill_id != CR_REFLECTSHIELD )
damage = 0;

Expand Down Expand Up @@ -7134,22 +7140,20 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
else
status_change_end(target, SC_DEVOTION, INVALID_TIMER);
}
if( target->type == BL_PC && (wd.flag&BF_SHORT) && tsc->data[SC_CIRCLE_OF_FIRE_OPTION] ) {
if (target->type == BL_PC && (wd.flag&BF_SHORT) && tsc->data[SC_CIRCLE_OF_FIRE_OPTION]) {
struct elemental_data *ed = ((TBL_PC*)target)->ed;
if( ed ) {

if (ed) {
clif_skill_damage(&ed->bl, target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1, 6);
skill_attack(BF_WEAPON,&ed->bl,&ed->bl,src,EL_CIRCLE_OF_FIRE,tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1,tick,wd.flag);
}
}
if( tsc->data[SC_WATER_SCREEN_OPTION] && tsc->data[SC_WATER_SCREEN_OPTION]->val1 ) {
if (tsc->data[SC_WATER_SCREEN_OPTION]) {
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,wd.amotion,wd.dmotion,damage,wd.div_,(enum e_damage_type)wd.type,wd.damage2);
status_damage(target,e_bl,damage,0,0,0);
// Just show damage in target.
clif_damage(src, target, tick, wd.amotion, wd.dmotion, damage, wd.div_, (enum e_damage_type)wd.type, wd.damage2 );
map_freeblock_unlock();
return ATK_BLOCK;

if (e_bl && !status_isdead(e_bl)) {
clif_damage(e_bl, e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0);
status_fix_damage(NULL, e_bl, damage, 0);
}
}
}
Expand Down
64 changes: 40 additions & 24 deletions src/map/skill.c
Original file line number Diff line number Diff line change
Expand Up @@ -3325,7 +3325,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *

// Instant damage
if( !dmg.amotion ) {
if( (!tsc || (!tsc->data[SC_DEVOTION] && skill_id != CR_REFLECTSHIELD) || skill_id == HW_GRAVITATION) && !shadow_flag )
if( (!tsc || (!tsc->data[SC_DEVOTION] && skill_id != CR_REFLECTSHIELD && !tsc->data[SC_WATER_SCREEN_OPTION]) || skill_id == HW_GRAVITATION) && !shadow_flag )
status_fix_damage(src,bl,damage,dmg.dmotion); //Deal damage before knockback to allow stuff like firewall+storm gust combo.
if( !status_isdead(bl) && additional_effects )
skill_additional_effect(src,bl,skill_id,skill_lv,dmg.flag,dmg.dmg_lv,tick);
Expand All @@ -3348,33 +3348,49 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
battle_delay_damage(tick, dmg.amotion,src,bl,dmg.flag,skill_id,skill_lv,damage,dmg.dmg_lv,dmg.dmotion, additional_effects);
}

if( tsc && tsc->data[SC_DEVOTION] && skill_id != PA_PRESSURE && skill_id != HW_GRAVITATION ) {
struct status_change_entry *sce = tsc->data[SC_DEVOTION];
struct block_list *d_bl = map_id2bl(sce->val1);
if (tsc && skill_id != PA_PRESSURE && skill_id != HW_GRAVITATION) {
if (tsc->data[SC_DEVOTION]) {
struct status_change_entry *sce = tsc->data[SC_DEVOTION];
struct block_list *d_bl = map_id2bl(sce->val1);

if( d_bl && (
(d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == bl->id) ||
(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == bl->id)
) && check_distance_bl(bl, d_bl, sce->val3) )
{
if(!rmdamage){
clif_damage(d_bl,d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0);
status_fix_damage(NULL,d_bl, damage, 0);
if (d_bl && (
(d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == bl->id) ||
(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == bl->id)
) && check_distance_bl(bl, d_bl, sce->val3) )
{
if (!rmdamage) {
clif_damage(d_bl, d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0);
status_fix_damage(NULL, d_bl, damage, 0);
} else {
bool isDevotRdamage = false;

if (battle_config.devotion_rdamage && battle_config.devotion_rdamage > rnd()%100)
isDevotRdamage = true;
// If !isDevotRdamage, reflected magics are done directly on the target not on paladin
// This check is only for magical skill.
// For BF_WEAPON skills types track var rdamage and function battle_calc_return_damage
clif_damage(bl, (!isDevotRdamage) ? bl : d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0);
status_fix_damage(bl, (!isDevotRdamage) ? bl : d_bl, damage, 0);
}
} else {
bool isDevotRdamage = false;
if (battle_config.devotion_rdamage && battle_config.devotion_rdamage > rnd()%100)
isDevotRdamage = true;
// If !isDevotRdamage, reflected magics are done directly on the target not on paladin
// This check is only for magical skill.
// For BF_WEAPON skills types track var rdamage and function battle_calc_return_damage
clif_damage(bl,(!isDevotRdamage) ? bl : d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0);
status_fix_damage(bl,(!isDevotRdamage) ? bl : d_bl, damage, 0);
status_change_end(bl, SC_DEVOTION, INVALID_TIMER);
if (!dmg.amotion)
status_fix_damage(src, bl, damage, dmg.dmotion);
}
}
else {
status_change_end(bl, SC_DEVOTION, INVALID_TIMER);
if( !dmg.amotion )
status_fix_damage(src,bl,damage,dmg.dmotion);
if (tsc->data[SC_WATER_SCREEN_OPTION]) {
struct status_change_entry *sce = tsc->data[SC_WATER_SCREEN_OPTION];
struct block_list *e_bl = map_id2bl(sce->val1);

if (e_bl) {
if (!rmdamage) {
clif_skill_damage(e_bl, e_bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id));
status_fix_damage(NULL, e_bl, damage, 0);
} else {
clif_skill_damage(bl, bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id));
status_fix_damage(bl, bl, damage, 0);
}
}
}
}

Expand Down

0 comments on commit b85885c

Please sign in to comment.