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:
Aleos 2020-10-07 09:45:58 -04:00 committed by GitHub
parent 2794aeeed1
commit 00c02479db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 11 deletions

View File

@ -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:

View File

@ -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;