|
@@ -5065,14 +5065,13 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
break;
|
|
break;
|
|
|
|
|
|
case GC_PHANTOMMENACE:
|
|
case GC_PHANTOMMENACE:
|
|
- if( flag&1 )
|
|
|
|
- { // Only Hits Invisible Targets
|
|
|
|
- struct status_change *tsc2 = status_get_sc(bl);
|
|
|
|
- if(tsc2 && (tsc2->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC__SHADOWFORM])) {
|
|
|
|
|
|
+ if (flag&1) { // Only Hits Invisible Targets
|
|
|
|
+ if(tsc && (tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD])) {
|
|
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
|
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
|
- status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
|
|
|
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
}
|
|
}
|
|
|
|
+ if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
|
|
|
+ status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER); // Should only end, no damage dealt.
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case WL_CHAINLIGHTNING:
|
|
case WL_CHAINLIGHTNING:
|
|
@@ -5274,12 +5273,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
|
|
|
case RA_SENSITIVEKEEN:
|
|
case RA_SENSITIVEKEEN:
|
|
if( bl->type != BL_SKILL ) { // Only Hits Invisible Targets
|
|
if( bl->type != BL_SKILL ) { // Only Hits Invisible Targets
|
|
- struct status_change * tsc2 = status_get_sc(bl);
|
|
|
|
- if (tsc2 && ((tsc2->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc2->data[SC_CAMOUFLAGE] || tsc2->data[SC_STEALTHFIELD] || tsc2->data[SC__SHADOWFORM])) {
|
|
|
|
- status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
|
|
|
- status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
|
|
|
- skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
|
|
- }
|
|
|
|
|
|
+ if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD])) {
|
|
|
|
+ status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
|
|
|
+ skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
|
|
+ }
|
|
|
|
+ if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
|
|
|
+ status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER); // Should only end, no damage dealt.
|
|
} else {
|
|
} else {
|
|
struct skill_unit *su = NULL;
|
|
struct skill_unit *su = NULL;
|
|
struct skill_unit_group* sg;
|
|
struct skill_unit_group* sg;
|
|
@@ -5304,7 +5303,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
|
|
status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
|
|
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
|
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
|
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
|
|
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
|
|
- status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
|
|
|
|
|
+ if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
|
|
|
+ status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
|
sc_start(src,bl, SC_INFRAREDSCAN, 10000, skill_lv, skill_get_time(skill_id, skill_lv));
|
|
sc_start(src,bl, SC_INFRAREDSCAN, 10000, skill_lv, skill_get_time(skill_id, skill_lv));
|
|
} else {
|
|
} else {
|
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
|
@@ -5389,7 +5389,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
if( flag&1 ) { //by default cloaking skills are remove by aoe skills so no more checking/removing except hiding and cloaking exceed.
|
|
if( flag&1 ) { //by default cloaking skills are remove by aoe skills so no more checking/removing except hiding and cloaking exceed.
|
|
skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
|
|
skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
|
|
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
|
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
|
- status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
|
|
|
|
|
+ if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
|
|
|
+ status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
|
} else {
|
|
} else {
|
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
|
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
|
|
@@ -9358,15 +9359,17 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
|
|
|
case SC_BODYPAINT:
|
|
case SC_BODYPAINT:
|
|
if( flag&1 ) {
|
|
if( flag&1 ) {
|
|
- if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC__SHADOWFORM])) {
|
|
|
|
|
|
+ if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD])) {
|
|
status_change_end(bl,SC_HIDING,INVALID_TIMER);
|
|
status_change_end(bl,SC_HIDING,INVALID_TIMER);
|
|
status_change_end(bl,SC_CLOAKING,INVALID_TIMER);
|
|
status_change_end(bl,SC_CLOAKING,INVALID_TIMER);
|
|
status_change_end(bl,SC_CLOAKINGEXCEED,INVALID_TIMER);
|
|
status_change_end(bl,SC_CLOAKINGEXCEED,INVALID_TIMER);
|
|
status_change_end(bl,SC_CAMOUFLAGE,INVALID_TIMER);
|
|
status_change_end(bl,SC_CAMOUFLAGE,INVALID_TIMER);
|
|
- status_change_end(bl,SC__SHADOWFORM,INVALID_TIMER);
|
|
|
|
- sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
|
|
|
- sc_start(src, bl, SC_BLIND, 53 + 2 * skill_lv, skill_lv, skill_get_time2(skill_id, skill_lv));
|
|
|
|
|
|
+ if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
|
|
|
+ status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
|
}
|
|
}
|
|
|
|
+ // Attack Speed decrease and Blind happen to everyone around caster, not just hidden targets.
|
|
|
|
+ sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
|
|
|
+ sc_start(src, bl, SC_BLIND, 53 + 2 * skill_lv, skill_lv, skill_get_time2(skill_id, skill_lv));
|
|
} else {
|
|
} else {
|
|
clif_skill_nodamage(src, bl, skill_id, 0, 1);
|
|
clif_skill_nodamage(src, bl, skill_id, 0, 1);
|
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR,
|
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR,
|
|
@@ -10370,7 +10373,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
|
|
status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
|
|
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
|
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
|
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
|
|
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
|
|
- status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
|
|
|
|
|
+ if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
|
|
|
+ status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
|
status_change_end(bl, SC_MARIONETTE, INVALID_TIMER);
|
|
status_change_end(bl, SC_MARIONETTE, INVALID_TIMER);
|
|
status_change_end(bl, SC_HARMONIZE, INVALID_TIMER);
|
|
status_change_end(bl, SC_HARMONIZE, INVALID_TIMER);
|
|
}
|
|
}
|
|
@@ -13572,7 +13576,8 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns
|
|
status_change_end(bl,SC_CLOAKING,INVALID_TIMER);
|
|
status_change_end(bl,SC_CLOAKING,INVALID_TIMER);
|
|
status_change_end(bl,SC_CLOAKINGEXCEED,INVALID_TIMER);
|
|
status_change_end(bl,SC_CLOAKINGEXCEED,INVALID_TIMER);
|
|
status_change_end(bl,SC_CAMOUFLAGE,INVALID_TIMER);
|
|
status_change_end(bl,SC_CAMOUFLAGE,INVALID_TIMER);
|
|
- status_change_end(bl,SC__SHADOWFORM,INVALID_TIMER);
|
|
|
|
|
|
+ if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
|
|
|
+ status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/* Enable this if kRO fix the current skill. Currently no damage on undead and demon monster. [Jobbie]
|
|
/* Enable this if kRO fix the current skill. Currently no damage on undead and demon monster. [Jobbie]
|