Browse Source

Fixed #831
* Magnetic Field will now properly drain SP and lock targets.

aleos89 9 years ago
parent
commit
3f8055dcc2
1 changed files with 10 additions and 15 deletions
  1. 10 15
      src/map/status.c

+ 10 - 15
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;