aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src/main/java
diff options
context:
space:
mode:
authorKrakenied <Krakenied1@gmail.com>2024-02-23 10:18:50 +0100
committerLeonardo Bishop <13875753+LMBishop@users.noreply.github.com>2024-03-09 16:17:14 +0000
commitd2d5202866c3ba76e14c291291ca18235bd8e225 (patch)
treeb92969315c21f9b6d3b32f337a653721cab44fc6 /bukkit/src/main/java
parent32004ae042c7a8b2a24c9f7648bfbfba0e3bc261 (diff)
Add item option to mining task type
Diffstat (limited to 'bukkit/src/main/java')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java42
1 files changed, 37 insertions, 5 deletions
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<String, String, QuestItem> 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) {