diff --git a/src/map/status.c b/src/map/status.c index 70d5d6ce04..5a93117c09 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -1227,7 +1227,7 @@ void initChangeTables(void) StatusChangeStateTable[SC_ELECTRICSHOCKER] |= SCS_NOMOVE; StatusChangeStateTable[SC_BITE] |= SCS_NOMOVE; StatusChangeStateTable[SC_THORNSTRAP] |= SCS_NOMOVE; - StatusChangeStateTable[SC_MAGNETICFIELD] |= SCS_NOMOVE|SCS_NOMOVECOND; + StatusChangeStateTable[SC_MAGNETICFIELD] |= SCS_NOMOVE; StatusChangeStateTable[SC__MANHOLE] |= SCS_NOMOVE; StatusChangeStateTable[SC_CURSEDCIRCLE_ATKER] |= SCS_NOMOVE; StatusChangeStateTable[SC_CURSEDCIRCLE_TARGET] |= SCS_NOMOVE; @@ -4244,8 +4244,7 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, enum sc || (sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF) || (sc->data[SC_CRYSTALIZE] && bl->type != BL_MOB) || (sc->data[SC_CAMOUFLAGE] && sc->data[SC_CAMOUFLAGE]->val1 < 3) - || (sc->data[SC_MAGNETICFIELD] && sc->data[SC_MAGNETICFIELD]->val2 != bl->id) - ) + ) sc->cant.move += ( start ? 1 : ((sc->cant.move)? -1:0) ); } @@ -12383,19 +12382,15 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) break; case SC_MAGNETICFIELD: - { - if( --(sce->val3) <= 0 ) - break; // Time out - if( sce->val2 == bl->id ) { - if( !status_charge(bl,0,50) ) - break; // No more SP status should end, and in the next second will end for the other affected players - } else { - struct block_list *src = map_id2bl(sce->val2); - struct status_change *ssc; - if( !src || (ssc = status_get_sc(src)) == NULL || !ssc->data[SC_MAGNETICFIELD] ) - break; // Source no more under Magnetic Field - } + if (--(sce->val3) >= 0) { + struct block_list *src = map_id2bl(sce->val2); + + if (!src || (src && (status_isdead(src) || src->m != bl->m))) + break; + if (!status_charge(bl, 0, 50)) + status_zap(bl, 0, status->sp); sc_timer_next(1000 + tick, status_change_timer, bl->id, data); + return 0; } break;