aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'bukkit/src/main/java')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java26
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java5
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler14.java16
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java2
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java30
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler9.java23
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmeltingCertainTaskType.java151
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmeltingTaskType.java110
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);
+ }
+ }
+ }
+ }
+ }
+
+}