Skip to content

Commit

Permalink
Add smelting task types
Browse files Browse the repository at this point in the history
Closes #244
  • Loading branch information
Krakenied authored and LMBishop committed Apr 19, 2022
1 parent 74fa10e commit 8110d8e
Show file tree
Hide file tree
Showing 8 changed files with 352 additions and 11 deletions.
Expand Up @@ -17,10 +17,7 @@
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;
Expand Down Expand Up @@ -217,10 +214,21 @@ public void onEnable() {
// 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);
Expand Down Expand Up @@ -286,6 +294,8 @@ public void onEnable() {
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));
Expand Down
@@ -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 {
Expand All @@ -11,4 +13,7 @@ public interface VersionSpecificHandler {

boolean isPlayerOnStrider(Player player);

int getAvailableSpace(Player player, ItemStack newItemStack);

boolean isFurnaceInventoryType(InventoryType type);
}
@@ -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;
}
}
Expand Up @@ -3,7 +3,7 @@
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() {
Expand Down
@@ -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 {

Expand All @@ -18,4 +23,29 @@ public boolean isPlayerGliding(Player player) {
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;
}
}
@@ -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 {

Expand All @@ -15,7 +19,22 @@ public boolean isPlayerGliding(Player player) {
}

@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;
}
}
@@ -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);
}
}
}
}
}
}

}

0 comments on commit 8110d8e

Please sign in to comment.