Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion src/main/java/com/dermoha/networkstorage/gui/TerminalGUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
import com.dermoha.networkstorage.util.ItemUtils;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.*;
Expand Down Expand Up @@ -81,6 +83,31 @@ public void updateInventory() {
return true;
}

// Check enchantments of enchanted books
if (item.hasItemMeta()) {
ItemMeta meta = item.getItemMeta();

// Normal Item Enchants
if (meta.hasEnchants()) {
for (Map.Entry<Enchantment, Integer> enchEntry : meta.getEnchants().entrySet()) {
if (ItemUtils.matchesEnchantment(enchEntry.getKey(), enchEntry.getValue(), lowerCaseFilter)) {
return true;
}
}
}

// Enchanted Books
if (meta instanceof EnchantmentStorageMeta storageMeta) {
if (storageMeta.hasStoredEnchants()) {
for (Map.Entry<Enchantment, Integer> enchEntry : storageMeta.getStoredEnchants().entrySet()) {
if (ItemUtils.matchesEnchantment(enchEntry.getKey(), enchEntry.getValue(), lowerCaseFilter)) {
return true;
}
}
}
}
}

// Fallback check for formatted English name
return getItemDisplayName(item).toLowerCase().contains(lowerCaseFilter);
})
Expand All @@ -89,7 +116,7 @@ public void updateInventory() {

switch (sortType) {
case ALPHABETICAL:
sortedItems.sort(Comparator.comparing(a -> getItemDisplayName(a.getKey()), String.CASE_INSENSITIVE_ORDER));
sortedItems.sort(Comparator.comparing(a -> ItemUtils.getSortableName(a.getKey()), String.CASE_INSENSITIVE_ORDER));
break;
case COUNT_DESC:
sortedItems.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
Expand Down
97 changes: 97 additions & 0 deletions src/main/java/com/dermoha/networkstorage/util/ItemUtils.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
package com.dermoha.networkstorage.util;

import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

public final class ItemUtils {

private ItemUtils() {
Expand All @@ -29,4 +36,94 @@ public static void applyCustomModelData(ItemMeta meta, Integer customModelData)
meta.setCustomModelData(customModelData);
}
}

public static boolean matchesEnchantment(Enchantment enchantment, int level, String lowerCaseFilter) {
String formattedName = formatEnchantmentName(enchantment).toLowerCase();
String rawName = enchantment.getKey().getKey().toLowerCase();
String levelStr = String.valueOf(level);
String romanLevel = toRoman(level).toLowerCase();

String[] filterParts = lowerCaseFilter.trim().split("\\s+");
boolean hasNamePart = false;
boolean hasLevelPart = false;

for (String part : filterParts) {
if (formattedName.contains(part) || rawName.contains(part)) {
hasNamePart = true;
}
if (part.equals(levelStr) || part.equals(romanLevel)) {
hasLevelPart = true;
}
}

if (hasNamePart && hasLevelPart) return true;

return filterParts.length == 1 && (hasNamePart || hasLevelPart);
}

public static String formatEnchantmentName(Enchantment enchantment) {
String rawName = enchantment.getKey().getKey();
String[] words = rawName.replace('_', ' ').toLowerCase().split(" ");
StringBuilder displayName = new StringBuilder();

for (String word : words) {
if (!word.isEmpty()) {
if (!displayName.isEmpty()) {
displayName.append(" ");
}
displayName.append(Character.toUpperCase(word.charAt(0))).append(word.substring(1)).append(word.substring(1));
}
}
return displayName.toString();
}

// feel free to replace if something better is available
public static String toRoman(int number) {
if (number <= 0) return "";
if (number == 1) return "I";
if (number == 2) return "II";
if (number == 3) return "III";
if (number == 4) return "IV";
if (number == 5) return "V";
if (number == 6) return "VI";
if (number == 7) return "VII";
if (number == 8) return "VIII";
if (number == 9) return "IX";
if (number == 10) return "X";
return String.valueOf(number);
}

public static String getSortableName(ItemStack item) {
String displayName = getItemDisplayName(item);

if (item.hasItemMeta()) {
ItemMeta meta = item.getItemMeta();
if (meta != null) {
List<String> enchants = new ArrayList<>();

if (meta instanceof EnchantmentStorageMeta storageMeta) {
if (storageMeta.hasStoredEnchants()) {
for (Map.Entry<Enchantment, Integer> entry : storageMeta.getStoredEnchants().entrySet()) {
String name = formatEnchantmentName(entry.getKey());
String levelStr = String.format("%03d", entry.getValue());
enchants.add(name + " " + levelStr);
}
}
} else if (meta.hasEnchants()) {
for (Map.Entry<Enchantment, Integer> entry : meta.getEnchants().entrySet()) {
String name = formatEnchantmentName(entry.getKey());
String levelStr = String.format("%03d", entry.getValue());
enchants.add(name + " " + levelStr);
}
}

if (!enchants.isEmpty()) {
Collections.sort(enchants);
return displayName + " - " + enchants.getFirst();
}
}
}

return displayName;
}
}