diff options
Diffstat (limited to 'bukkit')
| -rw-r--r-- | bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BrewingTaskType.java | 98 |
1 files changed, 65 insertions, 33 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BrewingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BrewingTaskType.java index 3939b09b..c0ac8670 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BrewingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BrewingTaskType.java @@ -1,6 +1,9 @@ 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.item.QuestItem; import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; import com.leonardobishop.quests.bukkit.util.TaskUtils; import com.leonardobishop.quests.common.player.QPlayer; @@ -16,72 +19,101 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.inventory.BrewEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; import java.util.HashMap; +import java.util.List; import java.util.UUID; public final class BrewingTaskType extends BukkitTaskType { private final BukkitQuestsPlugin plugin; private final HashMap<Location, UUID> brewingStands = new HashMap<>(); + private final Table<String, String, QuestItem> fixedQuestItemCache = HashBasedTable.create(); public BrewingTaskType(BukkitQuestsPlugin plugin) { - super("brewing", TaskUtils.TASK_ATTRIBUTION_STRING, "Brew a potion."); + super("brewing", TaskUtils.TASK_ATTRIBUTION_STRING, "Brew a potion using specific ingredient."); this.plugin = plugin; super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useItemStackConfigValidator(this, "ingredient")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "data")); } + @Override + public void onReady() { + fixedQuestItemCache.clear(); + } + + @SuppressWarnings("ConstantConditions") @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(PlayerInteractEvent event) { - if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { - if (event.getClickedBlock().getType() == Material.BREWING_STAND) { - brewingStands.put(event.getClickedBlock().getLocation(), event.getPlayer().getUniqueId()); - } + public void onPlayerInteract(PlayerInteractEvent event) { + if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == Material.BREWING_STAND) { + brewingStands.put(event.getClickedBlock().getLocation(), event.getPlayer().getUniqueId()); } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BrewEvent event) { + public void onBrew(BrewEvent event) { UUID uuid; - if ((uuid = brewingStands.get(event.getBlock().getLocation())) != null) { - Player player = Bukkit.getPlayer(uuid); + if ((uuid = brewingStands.get(event.getBlock().getLocation())) == null) { + return; + } - if (player == null || player.hasMetadata("NPC")) { - return; - } + Player player = Bukkit.getPlayer(uuid); + if (player == null || player.hasMetadata("NPC")) { + return; + } - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); + if (qPlayer == null) { + return; + } - for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player.getPlayer(), qPlayer, this, TaskUtils.TaskConstraint.WORLD)) { - Quest quest = pendingTask.quest(); - Task task = pendingTask.task(); - TaskProgress taskProgress = pendingTask.taskProgress(); + final ItemStack ingredient = event.getContents().getIngredient(); + final ItemStack[] contents = event.getContents().getContents(); + final List<ItemStack> results = event.getResults(); - super.debug("Player brewed potion", quest.getId(), task.getId(), player.getUniqueId()); + int eventAmount = 0; + for (int i = 0; i < results.size(); i++) { + if (contents[i] != null && !contents[i].isSimilar(results.get(i))) { + eventAmount++; + } + } - int progress = 0; + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this, TaskUtils.TaskConstraint.WORLD)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); - for (int i = 0; i < 3; i++) { - if (event.getContents().getItem(i) != null) { - progress = TaskUtils.incrementIntegerTaskProgress(taskProgress); - super.debug("Incrementing task progress for brewed potion in slot " + i + " (now " + progress + ")", quest.getId(), task.getId(), player.getUniqueId()); - } else { - super.debug("Slot " + i + " does not have a brewed potion", quest.getId(), task.getId(), player.getUniqueId()); - } + if (task.hasConfigKey("ingredient")) { + QuestItem qi; + if ((qi = fixedQuestItemCache.get(quest.getId(), task.getId())) == null) { + QuestItem fetchedItem = TaskUtils.getConfigQuestItem(task, "ingredient", "data"); + fixedQuestItemCache.put(quest.getId(), task.getId(), fetchedItem); + qi = fetchedItem; } - int potionsNeeded = (int) task.getConfigValue("amount"); + super.debug("Player brewed " + eventAmount + " potions" + (ingredient != null ? " using " + ingredient.getType() : ""), quest.getId(), task.getId(), player.getUniqueId()); - if (progress >= potionsNeeded) { - super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId()); - taskProgress.setCompleted(true); + if (!qi.compareItemStack(ingredient)) { + super.debug("Ingredient does not match, continuing...", quest.getId(), task.getId(), player.getUniqueId()); + continue; } } + + int amount = (int) task.getConfigValue("amount"); + + int progress = TaskUtils.getIntegerTaskProgress(taskProgress); + taskProgress.setProgress(progress + eventAmount); + super.debug("Updating task progress (now " + (progress + eventAmount) + ")", quest.getId(), task.getId(), player.getUniqueId()); + + if ((int) taskProgress.getProgress() >= amount) { + super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId()); + taskProgress.setProgress(amount); + taskProgress.setCompleted(true); + } } } |
