From 81bddd246cce5495e4a6584787988398f65e041e Mon Sep 17 00:00:00 2001 From: PikaMug <2267126+PikaMug@users.noreply.github.com> Date: Sun, 17 Jan 2021 03:05:13 -0500 Subject: [PATCH] Return set of progress-applied quest IDs, per #1570 --- .../java/me/blackvein/quests/Quester.java | 55 ++++++++++--------- .../quests/listeners/BlockListener.java | 23 ++++---- 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/main/src/main/java/me/blackvein/quests/Quester.java b/main/src/main/java/me/blackvein/quests/Quester.java index 9d0fe3695..5bc306e04 100644 --- a/main/src/main/java/me/blackvein/quests/Quester.java +++ b/main/src/main/java/me/blackvein/quests/Quester.java @@ -15,12 +15,14 @@ package me.blackvein.quests; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Random; +import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListSet; @@ -4022,38 +4024,41 @@ public class Quester implements Comparable { * @param type The type of objective to progress * @param fun The function to execute, the event call */ - public void dispatchMultiplayerEverything(final Quest quest, final ObjectiveType type, final BiFunction fun) { - if (quest == null) { - return; - } - try { - if (quest.getOptions().getShareProgressLevel() == 1) { - final List mq = getMultiplayerQuesters(quest); - if (mq == null) { - return; - } - for (final Quester q : mq) { - if (q == null) { - continue; + public Set dispatchMultiplayerEverything(final Quest quest, final ObjectiveType type, final BiFunction fun) { + final Set appliedQuestIDs = new HashSet(); + if (quest != null) { + try { + if (quest.getOptions().getShareProgressLevel() == 1) { + final List mq = getMultiplayerQuesters(quest); + if (mq == null) { + return appliedQuestIDs; } - if (quest.getOptions().canShareSameQuestOnly()) { - if (q.getCurrentStage(quest) != null) { - fun.apply(q, quest); + for (final Quester q : mq) { + if (q == null) { + continue; } - } else { - q.getCurrentQuests().forEach((otherQuest, i) -> { - if (otherQuest.getStage(i).containsObjective(type)) { - fun.apply(q, otherQuest); + if (quest.getOptions().canShareSameQuestOnly()) { + if (q.getCurrentStage(quest) != null) { + fun.apply(q, quest); + appliedQuestIDs.add(quest.getId()); } - }); + } else { + q.getCurrentQuests().forEach((otherQuest, i) -> { + if (otherQuest.getStage(i).containsObjective(type)) { + fun.apply(q, otherQuest); + appliedQuestIDs.add(otherQuest.getId()); + } + }); + } } } + } catch (final Exception e) { + plugin.getLogger().severe("Error occurred while dispatching " + type.name() + " for quest ID " + + quest.getId()); + e.printStackTrace(); } - } catch (final Exception e) { - plugin.getLogger().severe("Error occurred while dispatching " + type.name() + " for quest ID " - + quest.getId()); - e.printStackTrace(); } + return appliedQuestIDs; } /** diff --git a/main/src/main/java/me/blackvein/quests/listeners/BlockListener.java b/main/src/main/java/me/blackvein/quests/listeners/BlockListener.java index ed018d3de..d9f93016e 100644 --- a/main/src/main/java/me/blackvein/quests/listeners/BlockListener.java +++ b/main/src/main/java/me/blackvein/quests/listeners/BlockListener.java @@ -13,6 +13,9 @@ package me.blackvein.quests.listeners; +import java.util.HashSet; +import java.util.Set; + import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; @@ -57,7 +60,7 @@ public class BlockListener implements Listener { final ObjectiveType breakType = ObjectiveType.BREAK_BLOCK; final ObjectiveType placeType = ObjectiveType.PLACE_BLOCK; final ObjectiveType cutType = ObjectiveType.CUT_BLOCK; - boolean dispatched = false; + final Set dispatchedQuestIDs = new HashSet(); for (final Quest quest : plugin.getQuests()) { if (evt.isCancelled() == false) { if (!quester.meetsCondition(quest, true)) { @@ -73,13 +76,13 @@ public class BlockListener implements Listener { quester.breakBlock(quest, blockItemStack); // Multiplayer - if (!dispatched) { - quester.dispatchMultiplayerEverything(quest, breakType, (final Quester q, final Quest cq) -> { + if (!dispatchedQuestIDs.contains(quest.getId())) { + dispatchedQuestIDs.addAll(quester.dispatchMultiplayerEverything(quest, breakType, + (final Quester q, final Quest cq) -> { q.breakBlock(cq, blockItemStack); return null; - }); + })); } - dispatched = true; } } @@ -94,10 +97,9 @@ public class BlockListener implements Listener { } } - final ObjectiveType type = ObjectiveType.PLACE_BLOCK; final QuesterPreUpdateObjectiveEvent preEvent = new QuesterPreUpdateObjectiveEvent(quester, quest, - new Objective(type, is.getAmount(), toPlace.getAmount())); + new Objective(placeType, is.getAmount(), toPlace.getAmount())); plugin.getServer().getPluginManager().callEvent(preEvent); final int index = quester.getQuestData(quest).blocksPlaced.indexOf(is); @@ -107,7 +109,7 @@ public class BlockListener implements Listener { final QuesterPostUpdateObjectiveEvent postEvent = new QuesterPostUpdateObjectiveEvent(quester, quest, - new Objective(type, newAmount, toPlace.getAmount())); + new Objective(placeType, newAmount, toPlace.getAmount())); plugin.getServer().getPluginManager().callEvent(postEvent); } } @@ -122,10 +124,9 @@ public class BlockListener implements Listener { } } - final ObjectiveType type = ObjectiveType.PLACE_BLOCK; final QuesterPreUpdateObjectiveEvent preEvent = new QuesterPreUpdateObjectiveEvent(q, cq, - new Objective(type, is.getAmount(), toPlace.getAmount())); + new Objective(placeType, is.getAmount(), toPlace.getAmount())); plugin.getServer().getPluginManager().callEvent(preEvent); final int index = q.getQuestData(cq).blocksPlaced.indexOf(is); @@ -135,7 +136,7 @@ public class BlockListener implements Listener { final QuesterPostUpdateObjectiveEvent postEvent = new QuesterPostUpdateObjectiveEvent(q, cq, - new Objective(type, newAmount, toPlace.getAmount())); + new Objective(placeType, newAmount, toPlace.getAmount())); plugin.getServer().getPluginManager().callEvent(postEvent); } }