From d2d5202866c3ba76e14c291291ca18235bd8e225 Mon Sep 17 00:00:00 2001 From: Krakenied Date: Fri, 23 Feb 2024 10:18:50 +0100 Subject: Add item option to mining task type --- .../bukkit/tasktype/type/MiningTaskType.java | 42 +++++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) (limited to 'bukkit/src/main/java') diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java index 8cef018b..18cd0d72 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java @@ -1,8 +1,11 @@ package com.leonardobishop.quests.bukkit.tasktype.type; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import com.leonardobishop.quests.bukkit.hook.coreprotect.AbstractCoreProtectHook; import com.leonardobishop.quests.bukkit.hook.playerblocktracker.AbstractPlayerBlockTrackerHook; +import com.leonardobishop.quests.bukkit.item.QuestItem; import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; import com.leonardobishop.quests.bukkit.util.TaskUtils; import com.leonardobishop.quests.bukkit.util.constraint.TaskConstraintSet; @@ -10,7 +13,6 @@ import com.leonardobishop.quests.common.player.QPlayer; import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress; import com.leonardobishop.quests.common.quest.Quest; import com.leonardobishop.quests.common.quest.Task; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; @@ -23,6 +25,7 @@ import org.bukkit.inventory.ItemStack; public final class MiningTaskType extends BukkitTaskType { private final BukkitQuestsPlugin plugin; + private final Table fixedQuestItemCache = HashBasedTable.create(); public MiningTaskType(BukkitQuestsPlugin plugin) { super("blockbreak", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of a block.", "blockbreakcertain"); @@ -31,6 +34,7 @@ public final class MiningTaskType extends BukkitTaskType { super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); super.addConfigValidator(TaskUtils.useMaterialListConfigValidator(this, TaskUtils.MaterialListConfigValidatorMode.BLOCK, "block", "blocks")); + super.addConfigValidator(TaskUtils.useItemStackConfigValidator(this, "item")); super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "data")); super.addConfigValidator(TaskUtils.useBooleanConfigValidator(this, "check-playerblocktracker")); super.addConfigValidator(TaskUtils.useBooleanConfigValidator(this, "check-coreprotect")); @@ -40,6 +44,11 @@ public final class MiningTaskType extends BukkitTaskType { super.addConfigValidator(TaskUtils.useBooleanConfigValidator(this, "allow-silk-touch")); } + @Override + public void onReady() { + fixedQuestItemCache.clear(); + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { Player player = event.getPlayer(); @@ -53,7 +62,6 @@ public final class MiningTaskType extends BukkitTaskType { } Block block = event.getBlock(); - Material material = block.getType(); ItemStack item = plugin.getVersionSpecificHandler().getItemInMainHand(player); boolean silkTouchPresent = item != null && item.getEnchantmentLevel(Enchantment.SILK_TOUCH) > 0; @@ -62,10 +70,11 @@ public final class MiningTaskType extends BukkitTaskType { Task task = pendingTask.task(); TaskProgress taskProgress = pendingTask.taskProgress(); - super.debug("Player mined block " + material.name(), quest.getId(), task.getId(), player.getUniqueId()); + super.debug("Player mined block " + block.getType(), quest.getId(), task.getId(), player.getUniqueId()); boolean allowSilkTouch = TaskUtils.getConfigBoolean(task, "allow-silk-touch", true); if (!allowSilkTouch && silkTouchPresent) { + super.debug("allow-silk-touch is enabled, continuing...", quest.getId(), task.getId(), player.getUniqueId()); continue; } @@ -76,6 +85,30 @@ public final class MiningTaskType extends BukkitTaskType { continue; } + if (task.hasConfigKey("item")) { + if (item == null) { + super.debug("Specific item is required, player has no item in hand; continuing...", quest.getId(), task.getId(), player.getUniqueId()); + continue; + } + + super.debug("Specific item is required; player held item is of type '" + item.getType() + "'", quest.getId(), task.getId(), player.getUniqueId()); + + QuestItem qi; + if ((qi = fixedQuestItemCache.get(quest.getId(), task.getId())) == null) { + QuestItem fetchedItem = TaskUtils.getConfigQuestItem(task, "item", "data"); + fixedQuestItemCache.put(quest.getId(), task.getId(), fetchedItem); + qi = fetchedItem; + } + + boolean exactMatch = TaskUtils.getConfigBoolean(task, "exact-match", true); + if (!qi.compareItemStack(item, exactMatch)) { + super.debug("Item does not match required item, continuing...", quest.getId(), task.getId(), player.getUniqueId()); + continue; + } else { + super.debug("Item matches required item", quest.getId(), task.getId(), player.getUniqueId()); + } + } + boolean playerBlockTrackerEnabled = TaskUtils.getConfigBoolean(task, "check-playerblocktracker"); if (playerBlockTrackerEnabled) { @@ -154,14 +187,13 @@ public final class MiningTaskType extends BukkitTaskType { } Block block = event.getBlock(); - Material material = block.getType(); for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this, TaskConstraintSet.ALL)) { Quest quest = pendingTask.quest(); Task task = pendingTask.task(); TaskProgress taskProgress = pendingTask.taskProgress(); - super.debug("Player placed block " + material.name(), quest.getId(), task.getId(), player.getUniqueId()); + super.debug("Player placed block " + block.getType(), quest.getId(), task.getId(), player.getUniqueId()); boolean reverseIfPlaced = TaskUtils.getConfigBoolean(task, "reverse-if-placed"); if (!reverseIfPlaced) { -- cgit v1.2.3-70-g09d2