From a67162a2a331f325f6cf8a59df63fa3ad7785532 Mon Sep 17 00:00:00 2001 From: Krakenied Date: Wed, 9 Aug 2023 03:41:38 +0200 Subject: Better support for smithing task type in 1.20 --- .../quests/bukkit/BukkitQuestsPlugin.java | 3 +- .../versionspecific/VersionSpecificHandler.java | 5 ++++ .../versionspecific/VersionSpecificHandler16.java | 12 ++++++++ .../versionspecific/VersionSpecificHandler20.java | 30 +++++++++++++++++++ .../versionspecific/VersionSpecificHandler8.java | 11 +++++++ .../bukkit/tasktype/type/SmithingTaskType.java | 34 ++++++++++++++++++++-- 6 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java index 98ed3f1c..4ec47044 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java @@ -301,7 +301,8 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests { case 9, 10 -> versionSpecificHandler = new VersionSpecificHandler9(); case 11, 12, 13, 14, 15 -> versionSpecificHandler = new VersionSpecificHandler11(); case 16 -> versionSpecificHandler = new VersionSpecificHandler16(); - default -> versionSpecificHandler = new VersionSpecificHandler17(); + case 17, 18, 19 -> versionSpecificHandler = new VersionSpecificHandler17(); + default -> versionSpecificHandler = new VersionSpecificHandler20(); } questsConfig.setItemGetter(itemGetter); diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java index 480d0d12..e2395961 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java @@ -3,6 +3,7 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.SmithItemEvent; import org.bukkit.inventory.ItemStack; //TODO move titles, itemgetter, other version specific shite in here @@ -30,4 +31,8 @@ public interface VersionSpecificHandler { boolean isCaveVinesPlantWithBerries(BlockData blockData); ItemStack getItemInMainHand(Player player); + + ItemStack[] getSmithItems(SmithItemEvent event); + + String getSmithMode(SmithItemEvent event); } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java index 6a9a4e0d..438ae592 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java @@ -3,6 +3,10 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.SmithItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.SmithingInventory; +import org.bukkit.inventory.SmithingRecipe; public class VersionSpecificHandler16 extends VersionSpecificHandler11 implements VersionSpecificHandler { @@ -25,4 +29,12 @@ public class VersionSpecificHandler16 extends VersionSpecificHandler11 implement public boolean isOffHandEmpty(Player player) { return player.getInventory().getItemInOffHand().getAmount() == 0; } + + @Override + public ItemStack[] getSmithItems(SmithItemEvent event) { + return new ItemStack[]{ + event.getInventory().getInputEquipment(), + event.getInventory().getInputMineral() + }; + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java new file mode 100644 index 00000000..e27a1652 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java @@ -0,0 +1,30 @@ +package com.leonardobishop.quests.bukkit.hook.versionspecific; + +import org.bukkit.event.inventory.SmithItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Recipe; +import org.bukkit.inventory.SmithingTransformRecipe; +import org.bukkit.inventory.SmithingTrimRecipe; + +public class VersionSpecificHandler20 extends VersionSpecificHandler17 implements VersionSpecificHandler { + @Override + public ItemStack[] getSmithItems(SmithItemEvent event) { + return new ItemStack[]{ + event.getInventory().getInputEquipment(), + event.getInventory().getInputMineral(), + event.getInventory().getInputTemplate() + }; + } + + @Override + public String getSmithMode(SmithItemEvent event) { + Recipe recipe = event.getInventory().getRecipe(); + if (recipe instanceof SmithingTransformRecipe) { + return "transform"; + } else if (recipe instanceof SmithingTrimRecipe) { + return "trim"; + } else { + return null; + } + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java index dc552ee6..c2877f1d 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java @@ -4,6 +4,7 @@ import org.bukkit.block.data.BlockData; import org.bukkit.entity.Horse; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.SmithItemEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; @@ -76,4 +77,14 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler { public ItemStack getItemInMainHand(Player player) { return player.getItemInHand(); } + + @Override + public ItemStack[] getSmithItems(SmithItemEvent event) { + return new ItemStack[0]; + } + + @Override + public String getSmithMode(SmithItemEvent event) { + return null; + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmithingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmithingTaskType.java index 6c0404dc..56101d1e 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmithingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmithingTaskType.java @@ -20,6 +20,8 @@ import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.SmithItemEvent; import org.bukkit.inventory.ItemStack; +import java.util.Arrays; + public final class SmithingTaskType extends BukkitTaskType { private final BukkitQuestsPlugin plugin; @@ -35,6 +37,10 @@ public final class SmithingTaskType extends BukkitTaskType { super.addConfigValidator(TaskUtils.useItemStackConfigValidator(this, "item")); super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "data")); super.addConfigValidator(TaskUtils.useBooleanConfigValidator(this, "exact-match")); + super.addConfigValidator(TaskUtils.useAcceptedValuesConfigValidator(this, Arrays.asList( + "transform", + "trim" + ), "mode")); } @Override @@ -66,18 +72,28 @@ public final class SmithingTaskType extends BukkitTaskType { int eventAmount = item.getAmount(); if (event.isShiftClick() && event.getClick() != ClickType.CONTROL_DROP) { // https://github.com/LMBishop/Quests/issues/317 // https://cdn.discordapp.com/attachments/510553623022010371/1011483223446007849/unknown.png - eventAmount *= Math.min(event.getInventory().getInputEquipment().getAmount(), event.getInventory().getInputMineral().getAmount()); + eventAmount *= getSmithItemMultiplier(event); eventAmount = Math.min(eventAmount, plugin.getVersionSpecificHandler().getAvailableSpace(player, item)); if (eventAmount == 0) { return; } } + final String recipeType = plugin.getVersionSpecificHandler().getSmithMode(event); + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this, TaskConstraintSet.ALL)) { Quest quest = pendingTask.quest(); Task task = pendingTask.task(); TaskProgress taskProgress = pendingTask.taskProgress(); + if (recipeType != null) { + final String mode = (String) task.getConfigValue("mode"); + if (!recipeType.equals(mode)) { + super.debug("Specific mode is required, but the actual mode '" + recipeType + "' does not match, continuing...", quest.getId(), task.getId(), player.getUniqueId()); + continue; + } + } + QuestItem qi; if ((qi = fixedQuestItemCache.get(quest.getId(), task.getId())) == null) { QuestItem fetchedItem = TaskUtils.getConfigQuestItem(task, "item", "data"); @@ -85,7 +101,7 @@ public final class SmithingTaskType extends BukkitTaskType { qi = fetchedItem; } - super.debug("Player smithed " + eventAmount + " of " + item.getType(), quest.getId(), task.getId(), player.getUniqueId()); + super.debug("Player smithed " + eventAmount + " of " + item.getType(), quest.getId(), task.getId(), player.getUniqueId()); boolean exactMatch = TaskUtils.getConfigBoolean(task, "exact-match", true); if (!qi.compareItemStack(item, exactMatch)) { @@ -106,4 +122,18 @@ public final class SmithingTaskType extends BukkitTaskType { TaskUtils.sendTrackAdvancement(player, quest, taskProgress); } } + + private int getSmithItemMultiplier(SmithItemEvent event) { + int min = -1; + for (ItemStack item : this.plugin.getVersionSpecificHandler().getSmithItems(event)) { + if (item == null) { + continue; + } + int amount = item.getAmount(); + if ((min < 0 && amount > 0) || (min > 0 && amount < min)) { + min = amount; + } + } + return Math.max(min, 1); + } } -- cgit v1.2.3-70-g09d2