|
@@ -3382,6 +3382,9 @@ int skill_area_sub(struct block_list *bl, va_list ap)
|
|
|
flag = va_arg(ap,int);
|
|
|
func = va_arg(ap,SkillFunc);
|
|
|
|
|
|
+ if (src == bl && !(flag&BCT_SELF))
|
|
|
+ return 0;
|
|
|
+
|
|
|
if(battle_check_target(src,bl,flag) > 0) {
|
|
|
// several splash skills need this initial dummy packet to display correctly
|
|
|
if (flag&SD_PREAMBLE && skill_area_temp[2] == 0)
|
|
@@ -9577,16 +9580,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
break;
|
|
|
|
|
|
case WM_VOICEOFSIREN:
|
|
|
- if( flag&1 ) {
|
|
|
- tick = (status_get_lv(bl) > 150 ? 150 : status_get_lv(bl)) / 10 + (dstsd ? (dstsd->status.job_level > 50 ? 50 : dstsd->status.job_level) / 5 : 0);
|
|
|
- sc_start2(src,bl,type,100,skill_lv,src->id,skill_get_time(skill_id,skill_lv) - (1000 * tick));
|
|
|
- } else {
|
|
|
- int rate = 6 * skill_lv + ((sd) ? pc_checkskill(sd,WM_LESSON) * 2 + (sd->status.job_level > 50 ? 50 : sd->status.job_level) / 2 : skill_get_max(WM_LESSON));
|
|
|
-
|
|
|
- if (rnd()%100 < rate) {
|
|
|
- map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
|
|
|
- clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
|
|
- }
|
|
|
+ if (flag&1)
|
|
|
+ sc_start2(src,bl,type,skill_area_temp[5],skill_lv,src->id,skill_area_temp[6]);
|
|
|
+ else {
|
|
|
+ // Success chance: (Skill Level x 6) + (Voice Lesson Skill Level x 2) + (Caster’s Job Level / 2) %
|
|
|
+ skill_area_temp[5] = skill_lv * 6 + ((sd) ? pc_checkskill(sd, WM_LESSON) : skill_get_max(WM_LESSON)) * 2 + (sd ? sd->status.job_level : 50) / 2;
|
|
|
+ skill_area_temp[6] = skill_get_time(skill_id,skill_lv);
|
|
|
+ map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ALLWOS|1, skill_castend_nodamage_id);
|
|
|
+ clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -9794,24 +9795,29 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
|
|
|
case SO_ARRULLO:
|
|
|
{
|
|
|
- // [(15 + 5 * Skill Level) + ( Caster's INT / 5 ) + ( Caster's Job Level / 5 ) - ( Target's INT / 6 ) - ( Target's LUK / 10 )] %
|
|
|
- int rate = (15 + 5 * skill_lv) + status_get_int(src)/5 + (sd ? sd->status.job_level : 0);
|
|
|
- rate -= status_get_int(bl)/6 - status_get_luk(bl)/10;
|
|
|
+ // Success chance: [(15 + 5 * Skill Level) + ( Caster's INT / 5 ) + ( Caster's Job Level / 5 ) - ( Target's INT / 6 ) - ( Target's LUK / 10 )] %
|
|
|
+ int rate = (15 + 5 * skill_lv) * 1000 + status_get_int(src) * 200 + (sd ? sd->status.job_level * 200 : 0) - status_get_int(bl) * 1000 / 6 - status_get_luk(bl) * 100;
|
|
|
+ struct status_data *bstatus = status_get_base_status(bl);
|
|
|
+ // Resistance: {(Target’s Base Level / 20) + (Target’s Base INT / 40)} seconds
|
|
|
+ int duration = skill_get_time(skill_id, skill_lv) - (status_get_baselevel_limit(bl, 150) * 50 + bstatus->int_ * 25);
|
|
|
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
- sc_start2(src,bl, type, rate, skill_lv, 1, skill_get_time(skill_id, skill_lv));
|
|
|
+ status_change_start(src,bl,type,rate,skill_lv,0,0,0,max(duration,5000),SCSTART_NORATEDEF|SCSTART_NOTICKDEF); // Avoid general resistance
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case WM_LULLABY_DEEPSLEEP:
|
|
|
- if( flag&1 ){
|
|
|
- //[(Skill Level x 4) + (Voice Lessons Skill Level x 2) + (Caster's Base Level / 15) + (Caster's Job Level / 5)] %
|
|
|
- int rate = (4 * skill_lv) + ((sd) ? pc_checkskill(sd,WM_LESSON)*2 + sd->status.job_level/5 : skill_get_max(WM_LESSON)) + status_get_lv(src) / 15;
|
|
|
- if( bl != src )
|
|
|
- sc_start(src,bl,type,rate,skill_lv,skill_get_time(skill_id,skill_lv));
|
|
|
- } else {
|
|
|
+ if (flag&1) {
|
|
|
+ struct status_data *bstatus = status_get_base_status(bl);
|
|
|
+ // Resistance: {(Target’s Base Level / 20) + (Target’s Base INT / 20)} seconds
|
|
|
+ int duration = skill_area_temp[6] - (status_get_baselevel_limit(bl, 150) * 50 + bstatus->int_ * 50);
|
|
|
+ status_change_start(src,bl,type,skill_area_temp[5],skill_lv,0,0,0,max(duration,5000),SCSTART_NORATEDEF|SCSTART_NOTICKDEF); // Avoid general resistance
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // Success chance: [(Skill Level x 4) + (Voice Lessons Skill Level x 2) + (Caster's Base Level / 15) + (Caster's Job Level / 5)] %
|
|
|
+ skill_area_temp[5] = (4 * skill_lv * 1000) + ((sd) ? pc_checkskill(sd,WM_LESSON) : skill_get_max(WM_LESSON)) * 2000 + (status_get_lv(src) * 1000 / 15) + (sd ? sd->status.job_level * 200 : 0);
|
|
|
+ skill_area_temp[6] = skill_get_time(skill_id,skill_lv);
|
|
|
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
- map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR,
|
|
|
- src, skill_id, skill_lv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id);
|
|
|
+ map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ALLWOS|1, skill_castend_nodamage_id);
|
|
|
}
|
|
|
break;
|
|
|
|