From fcd97e3cf3c73c6e82a8ea36aae554053209ac75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Ulf=20J=C3=B8rgensen?= Date: Sun, 1 Jan 2017 17:54:03 +0100 Subject: [PATCH] Setup basic framework for lore sorting --- .../massivecraft/massivecore/MassiveCore.java | 2 + .../massivecore/MassiveCoreMConf.java | 22 +++- .../type/enumeration/TypeMaterial.java | 7 +- .../engine/EngineMassiveCoreLorePriority.java | 88 +++++++++++++ .../event/EventMassiveCoreLorePriority.java | 117 ++++++++++++++++++ .../massivecore/util/InventoryUtil.java | 60 ++++++++- 6 files changed, 286 insertions(+), 10 deletions(-) create mode 100644 src/com/massivecraft/massivecore/engine/EngineMassiveCoreLorePriority.java create mode 100644 src/com/massivecraft/massivecore/event/EventMassiveCoreLorePriority.java diff --git a/src/com/massivecraft/massivecore/MassiveCore.java b/src/com/massivecraft/massivecore/MassiveCore.java index 73026d1c..85371b33 100644 --- a/src/com/massivecraft/massivecore/MassiveCore.java +++ b/src/com/massivecraft/massivecore/MassiveCore.java @@ -41,6 +41,7 @@ import com.massivecraft.massivecore.engine.EngineMassiveCoreCommandRegistration; import com.massivecraft.massivecore.engine.EngineMassiveCoreDatabase; import com.massivecraft.massivecore.engine.EngineMassiveCoreDestination; import com.massivecraft.massivecore.engine.EngineMassiveCoreGank; +import com.massivecraft.massivecore.engine.EngineMassiveCoreLorePriority; import com.massivecraft.massivecore.engine.EngineMassiveCoreMain; import com.massivecraft.massivecore.engine.EngineMassiveCorePlayerLeave; import com.massivecraft.massivecore.engine.EngineMassiveCorePlayerState; @@ -283,6 +284,7 @@ public class MassiveCore extends MassivePlugin EngineMassiveCoreDatabase.class, EngineMassiveCoreDestination.class, EngineMassiveCoreGank.class, + EngineMassiveCoreLorePriority.class, EngineMassiveCoreMain.class, EngineMassiveCorePlayerLeave.class, EngineMassiveCorePlayerState.class, diff --git a/src/com/massivecraft/massivecore/MassiveCoreMConf.java b/src/com/massivecraft/massivecore/MassiveCoreMConf.java index 58ac1f27..075aa88d 100644 --- a/src/com/massivecraft/massivecore/MassiveCoreMConf.java +++ b/src/com/massivecraft/massivecore/MassiveCoreMConf.java @@ -1,5 +1,12 @@ package com.massivecraft.massivecore; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.bukkit.permissions.Permissible; + +import com.massivecraft.massivecore.collections.MassiveMap; import com.massivecraft.massivecore.command.editor.annotation.EditorName; import com.massivecraft.massivecore.command.editor.annotation.EditorType; import com.massivecraft.massivecore.command.type.TypeMillisDiff; @@ -9,11 +16,6 @@ import com.massivecraft.massivecore.util.MUtil; import com.massivecraft.massivecore.util.PermissionUtil; import com.massivecraft.massivecore.util.TimeUnit; import com.massivecraft.massivecore.xlib.mongodb.WriteConcern; -import org.bukkit.permissions.Permissible; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; @EditorName("config") public class MassiveCoreMConf extends Entity @@ -159,4 +161,14 @@ public class MassiveCoreMConf extends Entity public boolean mcstatsEnabled = true; + // -------------------------------------------- // + // LORE SORTING + // -------------------------------------------- // + + public boolean loreSortOnInventoryClick = false; + public boolean loreSortOnInventoryOpen = false; + + public Map lorePrioritiesPrefix = new MassiveMap<>(); + public Map lorePrioritiesRegex = new MassiveMap<>(); + } diff --git a/src/com/massivecraft/massivecore/command/type/enumeration/TypeMaterial.java b/src/com/massivecraft/massivecore/command/type/enumeration/TypeMaterial.java index d5d1d4ba..8aa691f2 100644 --- a/src/com/massivecraft/massivecore/command/type/enumeration/TypeMaterial.java +++ b/src/com/massivecraft/massivecore/command/type/enumeration/TypeMaterial.java @@ -1,11 +1,10 @@ package com.massivecraft.massivecore.command.type.enumeration; -import java.util.Set; - -import org.bukkit.Material; - import com.massivecraft.massivecore.collections.MassiveSet; import com.massivecraft.massivecore.util.Txt; +import org.bukkit.Material; + +import java.util.Set; public class TypeMaterial extends TypeEnum { diff --git a/src/com/massivecraft/massivecore/engine/EngineMassiveCoreLorePriority.java b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreLorePriority.java new file mode 100644 index 00000000..1312d1e3 --- /dev/null +++ b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreLorePriority.java @@ -0,0 +1,88 @@ +package com.massivecraft.massivecore.engine; + +import java.util.Map.Entry; + +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.inventory.ItemStack; + +import com.massivecraft.massivecore.Engine; +import com.massivecraft.massivecore.MassiveCoreMConf; +import com.massivecraft.massivecore.event.EventMassiveCoreLorePriority; +import com.massivecraft.massivecore.util.InventoryUtil; +import com.massivecraft.massivecore.util.MUtil; + +public class EngineMassiveCoreLorePriority extends Engine +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static EngineMassiveCoreLorePriority i = new EngineMassiveCoreLorePriority(); + public static EngineMassiveCoreLorePriority get() { return i; } + + // -------------------------------------------- // + // SORT LORE + // -------------------------------------------- // + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void sortItemLore(InventoryClickEvent event) + { + if (!MassiveCoreMConf.get().loreSortOnInventoryClick) return; + + HumanEntity human = event.getWhoClicked(); + if (MUtil.isntPlayer(human)) return; + + ItemStack item = event.getCurrentItem(); + if (InventoryUtil.isNothing(item)) return; + + InventoryUtil.sortLore(item); + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void sortItemLore(InventoryOpenEvent event) + { + if (!MassiveCoreMConf.get().loreSortOnInventoryOpen) return; + + HumanEntity human = event.getPlayer(); + if (MUtil.isntPlayer(human)) return; + + InventoryUtil.sortLore(event.getView().getTopInventory()); + InventoryUtil.sortLore(event.getView().getBottomInventory()); + } + + // -------------------------------------------- // + // CONFIG PRIORITIES + // -------------------------------------------- // + + @EventHandler(priority = EventPriority.HIGHEST) + public void setLorePriorities(EventMassiveCoreLorePriority event) + { + this.setPrioritiesPrefix(event); + this.setPrioritiesRegex(event); + } + + public void setPrioritiesRegex(EventMassiveCoreLorePriority event) + { + for (Entry prefixEntry : MassiveCoreMConf.get().lorePrioritiesRegex.entrySet()) + { + String regex = prefixEntry.getKey(); + int priority = prefixEntry.getValue(); + event.setPriorityByRegex(regex, priority); + } + } + + public void setPrioritiesPrefix(EventMassiveCoreLorePriority event) + { + for (Entry prefixEntry : MassiveCoreMConf.get().lorePrioritiesPrefix.entrySet()) + { + String prefix = prefixEntry.getKey(); + int priority = prefixEntry.getValue(); + event.setPriorityByPrefix(prefix, priority); + } + } + +} diff --git a/src/com/massivecraft/massivecore/event/EventMassiveCoreLorePriority.java b/src/com/massivecraft/massivecore/event/EventMassiveCoreLorePriority.java new file mode 100644 index 00000000..978a6a67 --- /dev/null +++ b/src/com/massivecraft/massivecore/event/EventMassiveCoreLorePriority.java @@ -0,0 +1,117 @@ +package com.massivecraft.massivecore.event; + +import java.util.AbstractMap.SimpleEntry; +import java.util.Collections; +import java.util.List; +import java.util.Map.Entry; +import java.util.regex.Pattern; + +import org.bukkit.ChatColor; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import com.massivecraft.massivecore.collections.MassiveList; +import com.massivecraft.massivecore.predicate.Predicate; + +public class EventMassiveCoreLorePriority extends EventMassiveCore +{ + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + + public static int PRIORITY_DEFAULT = 0; + + // Any lore added by a MassiveX plugin should start with this string and then be followed by its own unique sequence of characters. + public static String LORE_PREFIX = ChatColor.BLACK.toString() + ChatColor.GOLD + ChatColor.WHITE; + + // -------------------------------------------- // + // REQUIRED EVENT CODE + // -------------------------------------------- // + + private static final HandlerList handlers = new HandlerList(); + @Override public HandlerList getHandlers() { return handlers; } + public static HandlerList getHandlerList() { return handlers; } + + // -------------------------------------------- // + // FIELD + // -------------------------------------------- // + + private final ItemStack item; + public ItemStack getItem() { return this.item; } + + private final List> lore; + public List> getLore() { return this.lore; } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public EventMassiveCoreLorePriority(ItemStack item) + { + if (item == null) throw new NullPointerException("item"); + this.item = item; + this.lore = getLoreEntries(item); + } + + private static List> getLoreEntries(ItemStack item) + { + ItemMeta meta = item.getItemMeta(); + if ( ! meta.hasLore()) return Collections.emptyList(); + + List> ret = new MassiveList<>(); + for (String line : meta.getLore()) + { + ret.add(new SimpleEntry(line, PRIORITY_DEFAULT)); + } + return ret; + } + + // -------------------------------------------- // + // UTILITY SORT + // -------------------------------------------- // + + public void setPriorityByPredicate(Predicate predicate, int priority) + { + // Look over all the lore ... + for (Entry loreEntry : this.getLore()) + { + String line = loreEntry.getKey(); + + // ... and if predicate matches ... + if ( ! predicate.apply(line)) continue; + + // ... set priority. + loreEntry.setValue(priority); + } + } + + public void setPriorityByPrefix(final String prefix, int priority) + { + Predicate predicate = new Predicate() + { + @Override public boolean apply(String type) + { + return type.startsWith(prefix); + } + }; + this.setPriorityByPredicate(predicate, priority); + } + + public void setPriorityByRegex(final Pattern pattern, int priority) + { + Predicate predicate = new Predicate() + { + @Override public boolean apply(String type) + { + return pattern.matcher(type).matches(); + } + }; + this.setPriorityByPredicate(predicate, priority); + } + + public void setPriorityByRegex(final String regex, int priority) + { + setPriorityByRegex(Pattern.compile(regex), priority); + } +} diff --git a/src/com/massivecraft/massivecore/util/InventoryUtil.java b/src/com/massivecraft/massivecore/util/InventoryUtil.java index bc6849de..28c39260 100644 --- a/src/com/massivecraft/massivecore/util/InventoryUtil.java +++ b/src/com/massivecraft/massivecore/util/InventoryUtil.java @@ -1,12 +1,13 @@ package com.massivecraft.massivecore.util; +import java.util.AbstractMap.SimpleEntry; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; -import java.util.AbstractMap.SimpleEntry; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -27,6 +28,9 @@ import org.bukkit.material.MaterialData; import com.massivecraft.massivecore.MassiveCore; import com.massivecraft.massivecore.collections.MassiveList; +import com.massivecraft.massivecore.comparator.ComparatorComparable; +import com.massivecraft.massivecore.comparator.ComparatorEntryValue; +import com.massivecraft.massivecore.event.EventMassiveCoreLorePriority; import com.massivecraft.massivecore.mixin.MixinInventory; public class InventoryUtil @@ -1194,4 +1198,58 @@ public class InventoryUtil setLore(item, Arrays.asList(lore)); } + public static void addLore(ItemStack item, Collection lore) + { + List lines = getLore(item); + if (lines == null) lines = new MassiveList<>(); + lines.addAll(lore); + InventoryUtil.setLore(item, lines); + } + + public static void addLore(ItemStack item, String... lore) + { + addLore(item, Arrays.asList(lore)); + } + + // -------------------------------------------- // + // SORT LORE + // -------------------------------------------- // + + public static List getSortedLore(ItemStack item) + { + if ( ! item.getItemMeta().hasLore()) return Collections.emptyList(); + + EventMassiveCoreLorePriority event = new EventMassiveCoreLorePriority(item); + event.run(); + + List> entries = event.getLore(); + // Note: Comparator cast is necessary for Maven to compile, even if the IDE doesn't complain. + Comparator> comparator = (Comparator) ComparatorEntryValue.get(ComparatorComparable.get()); + Collections.sort(entries, comparator); + + List ret = new MassiveList<>(); + for (Entry entry : entries) + { + ret.add(entry.getKey()); + } + return ret; + } + + public static void sortLore(ItemStack item) + { + if (item == null) return; + if ( ! item.getItemMeta().hasLore()) return; + + List lore = getSortedLore(item); + InventoryUtil.setLore(item, lore); + } + public static void sortLore(Iterable items) + { + if (items == null) return; + for (ItemStack item : items) + { + sortLore(item); + } + } + }