diff options
Diffstat (limited to 'bukkit')
8 files changed, 352 insertions, 11 deletions
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 3d47e120..aa202b61 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java @@ -17,10 +17,7 @@ import com.leonardobishop.quests.bukkit.hook.title.Title; import com.leonardobishop.quests.bukkit.hook.title.Title_Bukkit; import com.leonardobishop.quests.bukkit.hook.title.Title_BukkitNoTimings; import com.leonardobishop.quests.bukkit.hook.title.Title_Other; -import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler; -import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler16; -import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler8; -import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler9; +import com.leonardobishop.quests.bukkit.hook.versionspecific.*; import com.leonardobishop.quests.bukkit.item.ParsedQuestItem; import com.leonardobishop.quests.bukkit.item.QuestItem; import com.leonardobishop.quests.bukkit.item.QuestItemRegistry; @@ -217,10 +214,21 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests { // TODO move above to version specific handlers if (version <= 8) { versionSpecificHandler = new VersionSpecificHandler8(); - } else if (version <= 16) { - versionSpecificHandler = new VersionSpecificHandler9(); - } else { - versionSpecificHandler = new VersionSpecificHandler16(); + } else switch (version) { + case 9: + case 10: + case 11: + case 12: + case 13: + versionSpecificHandler = new VersionSpecificHandler9(); + break; + case 14: + case 15: + versionSpecificHandler = new VersionSpecificHandler14(); + break; + default: + versionSpecificHandler = new VersionSpecificHandler16(); + break; } questsConfig.setItemGetter(itemGetter); @@ -286,6 +294,8 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests { taskTypeManager.registerTaskType(new PlayerkillingTaskType(this)); taskTypeManager.registerTaskType(new FishingTaskType(this)); taskTypeManager.registerTaskType(new FishingCertainTaskType(this)); + taskTypeManager.registerTaskType(new SmeltingTaskType(this)); + taskTypeManager.registerTaskType(new SmeltingCertainTaskType(this)); taskTypeManager.registerTaskType(new InventoryTaskType(this)); taskTypeManager.registerTaskType(new ConsumeTaskType(this)); taskTypeManager.registerTaskType(new WalkingTaskType(this)); 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 4e3cdade..69fd029f 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 @@ -1,6 +1,8 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.ItemStack; //TODO move titles, itemgetter, other version specific shite in here public interface VersionSpecificHandler { @@ -11,4 +13,7 @@ public interface VersionSpecificHandler { boolean isPlayerOnStrider(Player player); + int getAvailableSpace(Player player, ItemStack newItemStack); + + boolean isFurnaceInventoryType(InventoryType type); } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler14.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler14.java new file mode 100644 index 00000000..659f7fa9 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler14.java @@ -0,0 +1,16 @@ +package com.leonardobishop.quests.bukkit.hook.versionspecific; + +import org.bukkit.event.inventory.InventoryType; + +public class VersionSpecificHandler14 extends VersionSpecificHandler9 implements VersionSpecificHandler { + + @Override + public int getMinecraftVersion() { + return 14; + } + + @Override + public boolean isFurnaceInventoryType(InventoryType type) { + return type == InventoryType.BLAST_FURNACE || type == InventoryType.FURNACE || type == InventoryType.SMOKER; + } +} 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 b2b61070..ce9973a4 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,7 +3,7 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; -public class VersionSpecificHandler16 extends VersionSpecificHandler9 implements VersionSpecificHandler { +public class VersionSpecificHandler16 extends VersionSpecificHandler14 implements VersionSpecificHandler { @Override public int getMinecraftVersion() { 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 7a094fbc..d382418a 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 @@ -1,6 +1,11 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +import java.util.HashMap; public class VersionSpecificHandler8 implements VersionSpecificHandler { @@ -18,4 +23,29 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler { public boolean isPlayerOnStrider(Player player) { return false; } + + @Override + public int getAvailableSpace(Player player, ItemStack newItemStack) { + int availableSpace = 0; + PlayerInventory inventory = player.getInventory(); + HashMap<Integer, ? extends ItemStack> itemStacksWithSameMaterial = inventory.all(newItemStack.getType()); + for (ItemStack existingItemStack : itemStacksWithSameMaterial.values()) { + if (newItemStack.isSimilar(existingItemStack)) { + availableSpace += (newItemStack.getMaxStackSize() - existingItemStack.getAmount()); + } + } + + for (ItemStack existingItemStack : inventory.getContents()) { + if (existingItemStack == null) { + availableSpace += newItemStack.getMaxStackSize(); + } + } + + return availableSpace; + } + + @Override + public boolean isFurnaceInventoryType(InventoryType type) { + return type == InventoryType.FURNACE; + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler9.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler9.java index 8eff41f0..80145598 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler9.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler9.java @@ -1,6 +1,10 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +import java.util.HashMap; public class VersionSpecificHandler9 extends VersionSpecificHandler8 implements VersionSpecificHandler { @@ -15,7 +19,22 @@ public class VersionSpecificHandler9 extends VersionSpecificHandler8 implements } @Override - public boolean isPlayerOnStrider(Player player) { - return false; + public int getAvailableSpace(Player player, ItemStack newItemStack) { + int availableSpace = 0; + PlayerInventory inventory = player.getInventory(); + HashMap<Integer, ? extends ItemStack> itemStacksWithSameMaterial = inventory.all(newItemStack.getType()); + for (ItemStack existingItemStack : itemStacksWithSameMaterial.values()) { + if (newItemStack.isSimilar(existingItemStack)) { + availableSpace += (newItemStack.getMaxStackSize() - existingItemStack.getAmount()); + } + } + + for (ItemStack existingItemStack : inventory.getStorageContents()) { + if (existingItemStack == null) { + availableSpace += newItemStack.getMaxStackSize(); + } + } + + return availableSpace; } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmeltingCertainTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmeltingCertainTaskType.java new file mode 100644 index 00000000..fcbce83b --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmeltingCertainTaskType.java @@ -0,0 +1,151 @@ +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.ParsedQuestItem; +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.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +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.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class SmeltingCertainTaskType extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + private final Table<String, String, QuestItem> fixedQuestItemCache = HashBasedTable.create(); + + public SmeltingCertainTaskType(BukkitQuestsPlugin plugin) { + super("smeltingcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Smelt or cook a set amount of certain item."); + this.plugin = plugin; + } + + @Override + public @NotNull List<ConfigProblem> validateConfig(@NotNull String root, @NotNull HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) + TaskUtils.configValidateItemStack(root + ".item", config.get("item"), problems, false, "item"); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true, false, "data"); + return problems; + } + + @Override + public void onReady() { + fixedQuestItemCache.clear(); + } + + @SuppressWarnings("deprecation") + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onInventoryClick(InventoryClickEvent event) { + ItemStack item = event.getCurrentItem(); + ItemStack cursor = event.getCursor(); + InventoryType inventoryType = event.getInventory().getType(); + + if (event.getRawSlot() != 2 || !plugin.getVersionSpecificHandler().isFurnaceInventoryType(inventoryType) + || item == null || item.getType() == Material.AIR || event.getAction() == InventoryAction.NOTHING + || event.getAction() == InventoryAction.COLLECT_TO_CURSOR && cursor != null && cursor.getAmount() == cursor.getMaxStackSize() + || event.getClick() == ClickType.NUMBER_KEY && event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD + || !(event.getWhoClicked() instanceof Player)) { + return; + } + + Player player = (Player) event.getWhoClicked(); + + int eventAmount = item.getAmount(); + if (event.isShiftClick()) { + eventAmount = Math.min(eventAmount, plugin.getVersionSpecificHandler().getAvailableSpace(player, item)); + if (eventAmount == 0) { + return; + } + } + + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + if (task.getConfigValue("mode") != null + && !inventoryType.toString().equalsIgnoreCase(task.getConfigValue("mode").toString())) { + continue; + } + + QuestItem qi; + Object configItem = task.getConfigValue("item"); + Object configData = task.getConfigValue("data"); + + if ((qi = fixedQuestItemCache.get(quest.getId(), task.getId())) == null) { + if (configItem instanceof ConfigurationSection) { + qi = plugin.getConfiguredQuestItem("", (ConfigurationSection) configItem); + } else { + Material material = Material.getMaterial(String.valueOf(configItem)); + if (material == null) { + continue; + } + + ItemStack is; + if (configData != null) { + is = new ItemStack(material, 1, ((Integer) configData).shortValue()); + } else { + is = new ItemStack(material, 1); + } + qi = new ParsedQuestItem("parsed", null, is); + } + fixedQuestItemCache.put(quest.getId(), task.getId(), qi); + } + + if (qi.compareItemStack(item)) { + int smeltedItemsNeeded = (int) task.getConfigValue("amount"); + + int progressItemsSmelted; + if (taskProgress.getProgress() == null) { + progressItemsSmelted = 0; + } else { + progressItemsSmelted = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressItemsSmelted + eventAmount); + + if (((int) taskProgress.getProgress()) >= smeltedItemsNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + } + +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmeltingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmeltingTaskType.java new file mode 100644 index 00000000..391d5f5f --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmeltingTaskType.java @@ -0,0 +1,110 @@ +package com.leonardobishop.quests.bukkit.tasktype.type; + +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; +import com.leonardobishop.quests.bukkit.util.TaskUtils; +import com.leonardobishop.quests.common.config.ConfigProblem; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +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.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class SmeltingTaskType extends BukkitTaskType { + + private final BukkitQuestsPlugin plugin; + + public SmeltingTaskType(BukkitQuestsPlugin plugin) { + super("smelting", TaskUtils.TASK_ATTRIBUTION_STRING, "Smelt or cook a set amount of any item."); + this.plugin = plugin; + } + + @Override + public @NotNull List<ConfigProblem> validateConfig(@NotNull String root, @NotNull HashMap<String, Object> config) { + ArrayList<ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onInventoryClick(InventoryClickEvent event) { + ItemStack item = event.getCurrentItem(); + ItemStack cursor = event.getCursor(); + InventoryType inventoryType = event.getInventory().getType(); + + if (event.getRawSlot() != 2 || !plugin.getVersionSpecificHandler().isFurnaceInventoryType(inventoryType) + || item == null || item.getType() == Material.AIR || event.getAction() == InventoryAction.NOTHING + || event.getAction() == InventoryAction.COLLECT_TO_CURSOR && cursor != null && cursor.getAmount() == cursor.getMaxStackSize() + || event.getClick() == ClickType.NUMBER_KEY && event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD + || !(event.getWhoClicked() instanceof Player)) { + return; + } + + Player player = (Player) event.getWhoClicked(); + + int eventAmount = item.getAmount(); + if (event.isShiftClick()) { + eventAmount = Math.min(eventAmount, plugin.getVersionSpecificHandler().getAvailableSpace(player, item)); + if (eventAmount == 0) { + return; + } + } + + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + if (task.getConfigValue("mode") != null + && !inventoryType.toString().equalsIgnoreCase(task.getConfigValue("mode").toString())) { + continue; + } + + int smeltedItemsNeeded = (int) task.getConfigValue("amount"); + + int progressItemsSmelted; + if (taskProgress.getProgress() == null) { + progressItemsSmelted = 0; + } else { + progressItemsSmelted = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressItemsSmelted + eventAmount); + + if (((int) taskProgress.getProgress()) >= smeltedItemsNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} |
