summaryrefslogtreecommitdiff
path: root/src/map/skill.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/skill.c')
-rw-r--r--src/map/skill.c51
1 files changed, 36 insertions, 15 deletions
diff --git a/src/map/skill.c b/src/map/skill.c
index 72a100e5d..74e254333 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -2761,12 +2761,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
case NPC_COMBOATTACK:
case NPC_GUIDEDATTACK:
case NPC_POISON:
- case NPC_BLINDATTACK:
- case NPC_SILENCEATTACK:
- case NPC_STUNATTACK:
- case NPC_PETRIFYATTACK:
- case NPC_CURSEATTACK:
- case NPC_SLEEPATTACK:
case NPC_RANDOMATTACK:
case NPC_WATERATTACK:
case NPC_GROUNDATTACK:
@@ -2814,6 +2808,20 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
case HFLI_SBR44: //[orn]
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
break;
+ case NPC_BLINDATTACK:
+ case NPC_SILENCEATTACK:
+ case NPC_STUNATTACK:
+ case NPC_PETRIFYATTACK:
+ case NPC_CURSEATTACK:
+ case NPC_SLEEPATTACK:
+ if (flag&1 || skill_get_splash(skillid, skilllv) < 1)
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ else
+ map_foreachinrange(skill_area_sub, bl,
+ skill_get_splash(skillid, skilllv),BL_CHAR,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ break;
case LK_JOINTBEAT: // decide the ailment first (affects attack damage and effect)
switch( rand()%6 ){
@@ -3502,14 +3510,21 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
break;
case PR_LEXDIVINA:
- if (tsc && tsc->count && tsc->data[type].timer != -1) {
- status_change_end(bl,type, -1);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- } else
- clif_skill_nodamage (src, bl, skillid, skilllv,
- sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
+ if (flag&1 || (i = skill_get_splash(skillid, skilllv)) < 1)
+ {
+ if (tsc && tsc->count && tsc->data[type].timer != -1) {
+ status_change_end(bl,type, -1);
+ clif_skill_nodamage (src, bl, skillid, skilllv, 1);
+ } else
+ clif_skill_nodamage (src, bl, skillid, skilllv,
+ sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
+ break;
+ }
+ //Affect all targets on splash area.
+ map_foreachinrange(skill_area_sub, bl, i, BL_CHAR,
+ src, skillid, skilllv, tick, flag|1,
+ skill_castend_damage_id);
break;
-
case SA_ABRACADABRA:
{
int abra_skillid = 0, abra_skilllv;
@@ -4069,8 +4084,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
case GS_SPREADATTACK:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_area_temp[1] = bl->id;
+ //Mob casted skills should also hit skills.
map_foreachinrange(skill_area_sub, bl,
- skill_get_splash(skillid, skilllv), BL_CHAR,
+ skill_get_splash(skillid, skilllv), md?BL_CHAR|BL_SKILL:BL_CHAR,
src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
skill_castend_damage_id);
break;
@@ -4661,8 +4677,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
}
break;
case SA_DISPELL:
+ if (flag&1 || (i = skill_get_splash(skillid, skilllv)) < 1)
{
- int i;
clif_skill_nodamage(src,bl,skillid,skilllv,1);
i = tstatus->mdef;
if (i >= 100 ||
@@ -4698,7 +4714,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
if(i==SC_BERSERK) tsc->data[i].val2=0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0.
status_change_end(bl,i,-1);
}
+ break;
}
+ //Affect all targets on splash area.
+ map_foreachinrange(skill_area_sub, bl, i, BL_CHAR,
+ src, skillid, skilllv, tick, flag|1,
+ skill_castend_damage_id);
break;
case TF_BACKSLIDING: //This is the correct implementation as per packet logging information. [Skotlex]