diff --git a/README.md b/README.md index 67a854d..1c78253 100644 --- a/README.md +++ b/README.md @@ -142,8 +142,12 @@ The type is the type of criterion. By default, these are the default criterion t - string parameter `search`, the exact string to search for in the guide - `multiblockcraft` - for crafting an item in a multiblock - - has an item parameter `item`, the item to craft - - has an integer parameter `amount`, the number of times to craft it (not how many items are to be crafted) + - has an integer parameter `amount`, the number of times to craft (not how many items are to be crafted) + - (optional) has an item parameter `item`, the item to craft + - if not present, any item crafted with the multiblock will complete the criterion + - (optional) has a string parameter `multiblock`, the slimefun id of the multiblock to craft + - if not present, any multiblock can be used to craft the item to complete the criterion + - you may specify neither an item nor multiblock, in which case any multiblock craft done by the player will increment the criterion #### rewards diff --git a/src/main/java/me/char321/sfadvancements/api/criteria/MultiBlockCraftCriterion.java b/src/main/java/me/char321/sfadvancements/api/criteria/MultiBlockCraftCriterion.java index ba5a9c2..8c003b9 100644 --- a/src/main/java/me/char321/sfadvancements/api/criteria/MultiBlockCraftCriterion.java +++ b/src/main/java/me/char321/sfadvancements/api/criteria/MultiBlockCraftCriterion.java @@ -6,8 +6,11 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; +import javax.annotation.Nullable; + public class MultiBlockCraftCriterion extends Criterion { - private final ItemStack item; + @Nullable private final ItemStack item; + @Nullable private final String machineId; public static MultiBlockCraftCriterion loadFromConfig(ConfigurationSection config) { String id = config.getName(); @@ -29,28 +32,39 @@ public static MultiBlockCraftCriterion loadFromConfig(ConfigurationSection confi name = ChatColor.translateAlternateColorCodes('&', name); - ItemStack item = ConfigUtils.getItem(config, "item"); - if (item == null) { - SFAdvancements.warn("unknown item for multiblock craft criterion " + id); - return null; + + ItemStack item = null; + if (config.contains("item", true)) { + item = ConfigUtils.getItem(config, "item"); + if (item == null) { + SFAdvancements.warn("unknown item for multiblock craft criterion " + id); + return null; + } } - return new MultiBlockCraftCriterion(id, amount, name, item); + String machineid = config.getString("multiblock"); + + return new MultiBlockCraftCriterion(id, amount, name, item, machineid); } /** * - * @param id - * @param count - * @param name - * @param item the output item of the multiblock craft + * @param item the output item of the multiblock craft. + * @param machineId multiblock machine id */ - public MultiBlockCraftCriterion(String id, int count, String name, ItemStack item) { + public MultiBlockCraftCriterion(String id, int count, String name, @Nullable ItemStack item, @Nullable String machineId) { super(id, count, name); this.item = item; + this.machineId = machineId; } + @Nullable public ItemStack getItem() { return item; } + + @Nullable + public String getMachineId() { + return machineId; + } } diff --git a/src/main/java/me/char321/sfadvancements/core/criteria/completer/MultiBlockCraftCriterionCompleter.java b/src/main/java/me/char321/sfadvancements/core/criteria/completer/MultiBlockCraftCriterionCompleter.java index 246c870..082ff58 100644 --- a/src/main/java/me/char321/sfadvancements/core/criteria/completer/MultiBlockCraftCriterionCompleter.java +++ b/src/main/java/me/char321/sfadvancements/core/criteria/completer/MultiBlockCraftCriterionCompleter.java @@ -1,28 +1,26 @@ package me.char321.sfadvancements.core.criteria.completer; import io.github.thebusybiscuit.slimefun4.api.events.MultiBlockCraftEvent; -import io.github.thebusybiscuit.slimefun4.api.events.ResearchUnlockEvent; -import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile; -import io.github.thebusybiscuit.slimefun4.api.researches.Research; import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; import me.char321.sfadvancements.SFAdvancements; import me.char321.sfadvancements.api.criteria.Criterion; import me.char321.sfadvancements.api.criteria.MultiBlockCraftCriterion; -import me.char321.sfadvancements.api.criteria.ResearchCriterion; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.inventory.ItemStack; -import java.util.*; +import java.util.EnumMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; public class MultiBlockCraftCriterionCompleter implements CriterionCompleter, Listener { private final Map> criteria = new EnumMap<>(Material.class); + private final Set nonMaterialCriteria = new HashSet<>(); public MultiBlockCraftCriterionCompleter() { Bukkit.getPluginManager().registerEvents(this, SFAdvancements.instance()); @@ -30,17 +28,26 @@ public MultiBlockCraftCriterionCompleter() { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMultiBlockCraft(MultiBlockCraftEvent e) { - performCriteria(e.getPlayer(), e.getOutput()); + performCriteria(e.getPlayer(), e.getMachine().getId(), e.getOutput()); } - private void performCriteria(Player player, ItemStack output) { + private void performCriteria(Player player, String machineId, ItemStack output) { + for (MultiBlockCraftCriterion criterion : nonMaterialCriteria) { + String machineId1 = criterion.getMachineId(); + if (machineId1 == null || machineId1.equals(machineId)) { + criterion.perform(player); + } + } + Set allcriteria = criteria.get(output.getType()); if (allcriteria == null) { return; } for (MultiBlockCraftCriterion criterion : allcriteria) { - if (SlimefunUtils.isItemSimilar(output, criterion.getItem(), false, false)) { + String machineId1 = criterion.getMachineId(); + if ((machineId1 == null || machineId1.equals(machineId)) && + SlimefunUtils.isItemSimilar(output, criterion.getItem(), false, false)) { criterion.perform(player); } } @@ -53,8 +60,12 @@ public void register(Criterion criterion) { } MultiBlockCraftCriterion criterion1 = ((MultiBlockCraftCriterion) criterion); - Material material = criterion1.getItem().getType(); - criteria.computeIfAbsent(material, k -> new HashSet<>()).add(criterion1); + ItemStack item = criterion1.getItem(); + if (item == null) { + nonMaterialCriteria.add(criterion1); + } else { + criteria.computeIfAbsent(item.getType(), k -> new HashSet<>()).add(criterion1); + } } @Override @@ -65,5 +76,6 @@ public Class getCriterionClass() { @Override public void reload() { criteria.clear(); + nonMaterialCriteria.clear(); } } diff --git a/src/main/java/me/char321/sfadvancements/util/Utils.java b/src/main/java/me/char321/sfadvancements/util/Utils.java index 2fb3a11..553c006 100644 --- a/src/main/java/me/char321/sfadvancements/util/Utils.java +++ b/src/main/java/me/char321/sfadvancements/util/Utils.java @@ -2,6 +2,7 @@ import me.char321.sfadvancements.SFAdvancements; import me.char321.sfadvancements.api.Advancement; +import net.md_5.bungee.api.chat.TranslatableComponent; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -16,12 +17,14 @@ import java.util.Locale; import java.util.Map; +@SuppressWarnings("unused") public class Utils { private Utils() {} public static ItemStack makeShiny(ItemStack item) { item = item.clone(); ItemMeta im = item.getItemMeta(); + //noinspection DataFlowIssue im.addEnchant(Enchantment.DURABILITY, 1, false); im.addItemFlags(ItemFlag.HIDE_ENCHANTS); item.setItemMeta(im); @@ -70,6 +73,18 @@ public static Map getContents(Inventory inv) { return contents; } + public static TranslatableComponent getItemName(ItemStack item) { + return getItemName(item.getType()); + } + + public static TranslatableComponent getItemName(Material type) { + if (type.isBlock()) { + return new TranslatableComponent("block.minecraft."+type.getKey().getKey()); + } else { + return new TranslatableComponent("item.minecraft."+type.getKey().getKey()); + } + } + public static void runSync(Runnable runnable) { Bukkit.getScheduler().runTask(SFAdvancements.instance(), runnable); } diff --git a/src/main/java/me/char321/sfadvancements/vanilla/VanillaHook.java b/src/main/java/me/char321/sfadvancements/vanilla/VanillaHook.java index dbc030f..f014082 100644 --- a/src/main/java/me/char321/sfadvancements/vanilla/VanillaHook.java +++ b/src/main/java/me/char321/sfadvancements/vanilla/VanillaHook.java @@ -4,9 +4,9 @@ import me.char321.sfadvancements.api.Advancement; import me.char321.sfadvancements.api.AdvancementGroup; import me.char321.sfadvancements.api.criteria.Criterion; -import me.char321.sfadvancements.core.criteria.progress.PlayerProgress; import me.char321.sfadvancements.util.Utils; -import net.roxeez.advancement.AdvancementCreator; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; import net.roxeez.advancement.AdvancementManager; import net.roxeez.advancement.display.Icon; import net.roxeez.advancement.trigger.TriggerType; @@ -17,8 +17,6 @@ import org.bukkit.inventory.meta.ItemMeta; import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; import java.util.List; import java.util.Map; @@ -61,6 +59,7 @@ private static void registerGroups(AdvancementManager manager) { ItemStack item = group.getDisplayItem(); String background = group.getBackground(); ItemMeta meta = item.getItemMeta(); + //noinspection DataFlowIssue display.setTitle(meta.getDisplayName()); List lore = meta.getLore(); if (lore == null) { @@ -105,8 +104,17 @@ private static void registerAdvancement(AdvancementManager manager, Advancement vadvancement.setDisplay(display -> { ItemStack item = advancement.getDisplay(); ItemMeta meta = item.getItemMeta(); - display.setTitle(meta.getDisplayName()); - display.setDescription(getDescriptionFor(meta.getLore(), advancement)); + BaseComponent title; + String description; + //noinspection DataFlowIssue + if (meta.hasDisplayName()) { + title = new TextComponent(meta.getDisplayName()); + } else { + title = Utils.getItemName(item); + } + description = getDescriptionFor(meta.getLore(), advancement); + display.setTitle(title); + display.setDescription(description); display.setIcon(new Icon(item)); display.setHidden(advancement.isHidden()); display.setAnnounce(false); @@ -120,7 +128,7 @@ private static void registerAdvancement(AdvancementManager manager, Advancement } private static String getDescriptionFor(List lore, Advancement adv) { - lore = new ArrayList<>(lore); + lore = lore == null ? new ArrayList<>() : new ArrayList<>(lore); for (int i = lore.size() - 1; i >= 0; i--) { if ("%criteria%".equals(lore.get(i))) { lore.remove(i);