diff --git a/src/main/java/kamkeel/npcs/controllers/ProfileController.java b/src/main/java/kamkeel/npcs/controllers/ProfileController.java index 80637fe15..3cfac441c 100644 --- a/src/main/java/kamkeel/npcs/controllers/ProfileController.java +++ b/src/main/java/kamkeel/npcs/controllers/ProfileController.java @@ -725,34 +725,35 @@ public class ProfileController implements IProfileController { public void verifySlotQuests(EntityPlayer player) { Profile profile = getProfile(player); - if(profile == null) + if (profile == null) { return; + } - HashMap universalFinished = new HashMap<>(); - for(ISlot profileSlot : profile.getSlots().values()){ - IPlayerData playerData = getSlotPlayerData(player, profileSlot.getId()); - if(playerData != null){ - PlayerQuestData playerQuestData = (PlayerQuestData) playerData.getQuestData(); - for(int id : playerQuestData.finishedQuests.keySet()){ - IQuest quest = QuestController.Instance.get(id); - if(quest != null){ - Quest quest1 = (Quest) quest; - if(quest1.profileOptions.enableOptions && quest1.profileOptions.completeControl == EnumProfileSync.Shared){ - long complete = playerQuestData.finishedQuests.get(id); - if(universalFinished.containsKey(id)){ - complete = Math.max(universalFinished.get(id), complete); - } - universalFinished.put(id, complete); - } - } + Map universalFinished = new HashMap<>(); + for (Integer questId : QuestController.Instance.sharedQuests.keySet()) { + long maxTime = 0; + for (ISlot slot : profile.getSlots().values()) { + IPlayerData data = getSlotPlayerData(player, slot.getId()); + if (data == null) { + continue; + } + PlayerQuestData questData = (PlayerQuestData) data.getQuestData(); + Long t = questData.finishedQuests.get(questId); + if (t != null && t > maxTime) { + maxTime = t; } } + if (maxTime > 0) { + universalFinished.put(questId, maxTime); + } } - for(ISlot profileSlot : profile.getSlots().values()){ - IPlayerData playerData = getSlotPlayerData(player, profileSlot.getId()); - if(playerData != null){ - PlayerQuestData playerQuestData = (PlayerQuestData) playerData.getQuestData(); - playerQuestData.finishedQuests.putAll(universalFinished); + + // Push the universal shared completion times into every slot. + for (ISlot slot : profile.getSlots().values()) { + IPlayerData data = getSlotPlayerData(player, slot.getId()); + if (data != null) { + PlayerQuestData questData = (PlayerQuestData) data.getQuestData(); + questData.finishedQuests.putAll(universalFinished); } } } @@ -767,7 +768,6 @@ public class ProfileController implements IProfileController { if (playerData != null) { PlayerQuestData questData = (PlayerQuestData) playerData.getQuestData(); Long existing = questData.finishedQuests.get(questId); - // Only update if this completion time is newer. if (existing == null || completeTime > existing) { questData.finishedQuests.put(questId, completeTime); } diff --git a/src/main/java/noppes/npcs/controllers/QuestController.java b/src/main/java/noppes/npcs/controllers/QuestController.java index 51051bcb4..3b5616e4d 100644 --- a/src/main/java/noppes/npcs/controllers/QuestController.java +++ b/src/main/java/noppes/npcs/controllers/QuestController.java @@ -11,6 +11,7 @@ import noppes.npcs.NoppesStringUtils; import noppes.npcs.api.handler.IQuestHandler; import noppes.npcs.api.handler.data.IQuest; import noppes.npcs.api.handler.data.IQuestCategory; +import noppes.npcs.constants.EnumProfileSync; import noppes.npcs.controllers.data.Quest; import noppes.npcs.controllers.data.QuestCategory; import noppes.npcs.util.NBTJsonUtil; @@ -23,6 +24,7 @@ public class QuestController implements IQuestHandler { public HashMap categoriesSync = new HashMap(); public HashMap categories = new HashMap(); public HashMap quests = new HashMap(); + public HashMap sharedQuests = new HashMap<>(); public static QuestController Instance = new QuestController();; @@ -75,6 +77,9 @@ public class QuestController implements IQuestHandler { } else{ quests.put(id, quest); + if(quest.profileOptions.enableOptions && quest.profileOptions.completeControl == EnumProfileSync.Shared){ + sharedQuests.put(id, quest); + } } } lastUsedCatID++; @@ -209,9 +214,15 @@ public class QuestController implements IQuestHandler { lastUsedQuestID++; quest.id = lastUsedQuestID; } + quests.put(quest.id, quest); category.quests.put(quest.id, quest); + sharedQuests.remove(quest.id); + if(quest.profileOptions.enableOptions && quest.profileOptions.completeControl == EnumProfileSync.Shared){ + sharedQuests.put(quest.id, quest); + } + File dir = new File(getDir(), category.title); if(!dir.exists()) dir.mkdirs();