From 56ccaaab32bd5ad25b3f49386a1afce7984f6ee3 Mon Sep 17 00:00:00 2001 From: therbz <39860014+therbz@users.noreply.github.com> Date: Sat, 7 May 2022 04:15:33 +0100 Subject: [PATCH] Deduct from blocks broken objective (#1953) --- .../quests/listeners/BlockListener.java | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/me/blackvein/quests/listeners/BlockListener.java b/core/src/main/java/me/blackvein/quests/listeners/BlockListener.java index c4d6dbc19..4b6b95897 100644 --- a/core/src/main/java/me/blackvein/quests/listeners/BlockListener.java +++ b/core/src/main/java/me/blackvein/quests/listeners/BlockListener.java @@ -210,7 +210,8 @@ public class BlockListener implements Listener { final ItemStack blockItemStack = new ItemStack(evt.getBlock().getType(), 1, evt.getBlock().getState() .getData().toItemStack().getDurability()); final IQuester quester = plugin.getQuester(player.getUniqueId()); - final ObjectiveType type = ObjectiveType.PLACE_BLOCK; + final ObjectiveType placeType = ObjectiveType.PLACE_BLOCK; + final ObjectiveType breakType = ObjectiveType.BREAK_BLOCK; final Set dispatchedQuestIDs = new HashSet<>(); for (final IQuest quest : plugin.getLoadedQuests()) { if (!evt.isCancelled()) { @@ -218,12 +219,41 @@ public class BlockListener implements Listener { continue; } - if (quester.getCurrentQuestsTemp().containsKey(quest) - && quester.getCurrentStage(quest).containsObjective(type)) { - quester.placeBlock(quest, blockItemStack); + if (quester.getCurrentQuestsTemp().containsKey(quest)) { + IStage currentStage = quester.getCurrentStage(quest); + + if (currentStage.containsObjective(placeType)) quester.placeBlock(quest, blockItemStack); + + if (currentStage.containsObjective(breakType)) { + for (final ItemStack is : quester.getQuestData(quest).blocksBroken) { + if (evt.getBlock().getType().equals(is.getType()) && is.getAmount() > 0) { + ItemStack toBreak = new ItemStack(is.getType(), 64); + for (final ItemStack stack : currentStage.getBlocksToBreak()) { + if (ItemUtil.compareItems(is, stack, true) == 0) { + toBreak = stack; + } + } + + final QuesterPreUpdateObjectiveEvent preEvent + = new QuesterPreUpdateObjectiveEvent((Quester) quester, quest, + new BukkitObjective(placeType, is.getAmount(), toBreak.getAmount())); + plugin.getServer().getPluginManager().callEvent(preEvent); + + final int index = quester.getQuestData(quest).blocksBroken.indexOf(is); + final int newAmount = is.getAmount() - 1; + is.setAmount(newAmount); + quester.getQuestData(quest).blocksBroken.set(index, is); + + final QuesterPostUpdateObjectiveEvent postEvent + = new QuesterPostUpdateObjectiveEvent((Quester) quester, quest, + new BukkitObjective(placeType, newAmount, toBreak.getAmount())); + plugin.getServer().getPluginManager().callEvent(postEvent); + } + } + } } - dispatchedQuestIDs.addAll(quester.dispatchMultiplayerEverything(quest, type, + dispatchedQuestIDs.addAll(quester.dispatchMultiplayerEverything(quest, placeType, (final IQuester q, final IQuest cq) -> { if (!dispatchedQuestIDs.contains(cq.getId())) { q.placeBlock(cq, blockItemStack);