I'm not a hundred percent sure, when this happens, but under some circumstances (or always?), every quest that is inserted into completedRedoableQuests gets the same cooldown (the first entry of completedQuestTimes).

This commit changes the current behaviour, it fetches both lists (completedRedoableQuests/redoableQuestNames and completedQuestTimes/redoableQuestTimes) and matches them together (the first entry of redoableQuestNames gets matched with the first entry of redoableQuestTimes and so on).

If there is not the same amount of entries in both lists, a warning gets printed to the console informing about the possible cooldown-loss.

If there are more entries in redoableQuestNames than in redoableQuestTimes, the missing cooldown a reset with the current timestamp, if there a more entries in redoableQuestTimes than in redoableQuestNames the unnecessary timestamps get deleted and the next save (as they are not in the hashmap).

The warning and the fail-safe-behaviour should never occur but it's better to be safe than sorry.
This commit is contained in:
ghac 2017-07-15 16:39:26 +02:00
parent abd696aed6
commit 95625d5bf3

View File

@ -1899,16 +1899,19 @@ public class Quester {
return false; return false;
} }
hardClear(); hardClear();
if (data.contains("completedRedoableQuests")) { if (data.contains("completedRedoableQuests") && data.contains("completedQuestTimes")) {
for (String s : data.getStringList("completedRedoableQuests")) { List<String> redoableQuestNames = data.getStringList("completedRedoableQuests");
for (Object o : data.getList("completedQuestTimes")) { List<Object> redoableQuestTimes = (List<Object>) data.getList("completedQuestTimes");
for (Quest q : plugin.quests) {
if (q.name.equalsIgnoreCase(s)) { if (redoableQuestNames.size() != redoableQuestTimes.size()) {
completedTimes.put(q.name, (Long) o); plugin.getLogger().log(Level.WARNING, "completedRedoableQuests has " + redoableQuestNames.size() + " Entries but completedQuestTimes has " + redoableQuestTimes.size() + " Entries for player " + id.toString() + ". This will cause errors, trying to prevent complete data loss now.");
break;
}
}
} }
for (int i = 0; i < redoableQuestNames.size(); i++) {
if (i < redoableQuestTimes.size())
completedTimes.put(redoableQuestNames.get(i), (Long) redoableQuestTimes.get(i));
else
completedTimes.put(redoableQuestNames.get(i), System.currentTimeMillis()); // This will cause the cooldown to be reset but at least, the rest of the data does not get lost
} }
} }
if (data.contains("amountsCompletedQuests")) { if (data.contains("amountsCompletedQuests")) {