Fixes Magnetic field behavior (#5423)
* Fixes #5401. * Minor optimizations to core skill behavior. * Adjusts the status timer to be stored in val4. * Impose a unit lock before doing status damage. * Check for status state before attempting to reapply the status timer. Thanks to @LotusRO!
This commit is contained in:
parent
2794aeeed1
commit
00c02479db
@ -5913,10 +5913,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
map_foreachinallrange(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_foreachinallrange(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);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NC_MAGNETICFIELD:
|
|
||||||
sc_start2(src,bl,SC_MAGNETICFIELD,100,skill_lv,src->id,skill_get_time(skill_id,skill_lv));
|
|
||||||
break;
|
|
||||||
case SC_FATALMENACE:
|
case SC_FATALMENACE:
|
||||||
if( flag&1 )
|
if( flag&1 )
|
||||||
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);
|
||||||
@ -10227,10 +10223,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NC_MAGNETICFIELD:
|
case NC_MAGNETICFIELD:
|
||||||
clif_skill_damage(src,bl,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE);
|
if (flag & 1) {
|
||||||
if (map_flag_vs(src->m)) // Doesn't affect the caster in non-PVP maps [exneval]
|
sc_start2(src, bl, SC_MAGNETICFIELD, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv));
|
||||||
sc_start2(src,bl,type,100,skill_lv,src->id,skill_get_time(skill_id,skill_lv));
|
} else {
|
||||||
map_foreachinallrange(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);
|
if (map_flag_vs(src->m)) // Doesn't affect the caster in non-PVP maps [exneval]
|
||||||
|
sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv));
|
||||||
|
map_foreachinallrange(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_nodamage_id);
|
||||||
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NC_REPAIR:
|
case NC_REPAIR:
|
||||||
|
@ -11564,8 +11564,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
|||||||
tick_time = 5000; // [GodLesZ] tick time
|
tick_time = 5000; // [GodLesZ] tick time
|
||||||
break;
|
break;
|
||||||
case SC_MAGNETICFIELD:
|
case SC_MAGNETICFIELD:
|
||||||
val3 = tick / 1000;
|
|
||||||
tick_time = 1000; // [GodLesZ] tick time
|
tick_time = 1000; // [GodLesZ] tick time
|
||||||
|
val4 = tick / tick_time;
|
||||||
break;
|
break;
|
||||||
case SC_INSPIRATION:
|
case SC_INSPIRATION:
|
||||||
val2 = (sd?sd->status.job_level:50);
|
val2 = (sd?sd->status.job_level:50);
|
||||||
@ -14510,14 +14510,17 @@ TIMER_FUNC(status_change_timer){
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SC_MAGNETICFIELD:
|
case SC_MAGNETICFIELD:
|
||||||
if (--(sce->val3) >= 0) {
|
if (--(sce->val4) >= 0) {
|
||||||
struct block_list *src = map_id2bl(sce->val2);
|
struct block_list *src = map_id2bl(sce->val2);
|
||||||
|
|
||||||
if (!src || (src && (status_isdead(src) || src->m != bl->m)))
|
if (!src || (src && (status_isdead(src) || src->m != bl->m)))
|
||||||
break;
|
break;
|
||||||
|
map_freeblock_lock();
|
||||||
if (!status_charge(bl, 0, 50))
|
if (!status_charge(bl, 0, 50))
|
||||||
status_zap(bl, 0, status->sp);
|
status_zap(bl, 0, status->sp);
|
||||||
sc_timer_next(1000 + tick);
|
if (sc->data[type])
|
||||||
|
sc_timer_next(1000 + tick);
|
||||||
|
map_freeblock_unlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user