Pārlūkot izejas kodu

Follow up to ee12429

The incomplete count was not updated before moving the memory that way the counter had the wrong value.
Also the memory manager would complain that the pointer is invalid when we have zero achievements.

Thanks to @CairoLee
Lemongrass3110 7 gadi atpakaļ
vecāks
revīzija
8310253b84
1 mainītis faili ar 8 papildinājumiem un 3 dzēšanām
  1. 8 3
      src/map/achievement.c

+ 8 - 3
src/map/achievement.c

@@ -128,14 +128,19 @@ bool achievement_remove(struct map_session_data *sd, int achievement_id)
 		return false;
 	}
 
+	if (!sd->achievement_data.achievements[i].completed)
+		sd->achievement_data.incompleteCount--;
+
 	if (i != sd->achievement_data.count - 1)
 		memmove(&sd->achievement_data.achievements[i], &sd->achievement_data.achievements[i + 1], sizeof(struct achievement) * (sd->achievement_data.count - 1 - i));
 
 	aFree(&sd->achievement_data.achievements[sd->achievement_data.count-1]);
 	sd->achievement_data.count--;
-	if (!sd->achievement_data.achievements[i].completed)
-		sd->achievement_data.incompleteCount--;
-	RECREATE(sd->achievement_data.achievements, struct achievement, sd->achievement_data.count);
+	if( sd->achievement_data.count == 0 ){
+		sd->achievement_data.achievements = NULL;
+	}else{
+		RECREATE(sd->achievement_data.achievements, struct achievement, sd->achievement_data.count);
+	}
 	sd->achievement_data.save = true;
 
 	// Send a removed fake achievement