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);
|
||||
}
|
||||
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:
|
||||
if( flag&1 )
|
||||
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;
|
||||
|
||||
case NC_MAGNETICFIELD:
|
||||
clif_skill_damage(src,bl,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE);
|
||||
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_damage_id);
|
||||
if (flag & 1) {
|
||||
sc_start2(src, bl, SC_MAGNETICFIELD, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv));
|
||||
} else {
|
||||
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;
|
||||
|
||||
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
|
||||
break;
|
||||
case SC_MAGNETICFIELD:
|
||||
val3 = tick / 1000;
|
||||
tick_time = 1000; // [GodLesZ] tick time
|
||||
val4 = tick / tick_time;
|
||||
break;
|
||||
case SC_INSPIRATION:
|
||||
val2 = (sd?sd->status.job_level:50);
|
||||
@ -14510,14 +14510,17 @@ TIMER_FUNC(status_change_timer){
|
||||
break;
|
||||
|
||||
case SC_MAGNETICFIELD:
|
||||
if (--(sce->val3) >= 0) {
|
||||
if (--(sce->val4) >= 0) {
|
||||
struct block_list *src = map_id2bl(sce->val2);
|
||||
|
||||
if (!src || (src && (status_isdead(src) || src->m != bl->m)))
|
||||
break;
|
||||
map_freeblock_lock();
|
||||
if (!status_charge(bl, 0, 50))
|
||||
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;
|
||||
}
|
||||
break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user