ChestShop-3/src/main/java/com/Acrobot/ChestShop/Utils/ItemUtil.java

100 lines
3.5 KiB
Java

package com.Acrobot.ChestShop.Utils;
import com.Acrobot.Breeze.Utils.InventoryUtil;
import com.Acrobot.Breeze.Utils.MaterialUtil;
import com.Acrobot.ChestShop.ChestShop;
import com.Acrobot.ChestShop.Events.ItemParseEvent;
import com.Acrobot.ChestShop.Events.ItemStringQueryEvent;
import org.bukkit.Bukkit;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
import static com.Acrobot.Breeze.Utils.MaterialUtil.MAXIMUM_SIGN_WIDTH;
import static com.Acrobot.Breeze.Utils.StringUtil.getMinecraftStringWidth;
public class ItemUtil {
/**
* Get a list with item information
*
* @param items The items to get the information from
* @return The list, including the amount and names of the items
*/
public static String getItemList(ItemStack[] items) {
ItemStack[] mergedItems = InventoryUtil.mergeSimilarStacks(items);
List<String> itemText = new ArrayList<>();
for (ItemStack item : mergedItems) {
itemText.add(item.getAmount() + " " + getName(item));
}
return String.join(", ", itemText);
}
/**
* Returns item's name
*
* @param itemStack ItemStack to name
* @return ItemStack's name
*/
public static String getName(ItemStack itemStack) {
return getName(itemStack, 0);
}
/**
* Returns item's name, with a maximum width
*
* @param itemStack ItemStack to name
* @param maxWidth The max width that the name should have; 0 or below if it should be unlimited
* @return ItemStack's name
*/
public static String getName(ItemStack itemStack, int maxWidth) {
String code = ChestShop.callEvent(new ItemStringQueryEvent(itemStack, maxWidth)).getItemString();
if (code != null) {
if (maxWidth > 0) {
int codeWidth = getMinecraftStringWidth(code);
if (codeWidth > maxWidth) {
int exceeding = codeWidth - maxWidth;
int poundIndex = code.indexOf('#');
int colonIndex = code.indexOf(':');
String material = code;
String rest = "";
if (poundIndex > 0 && (colonIndex < 0 || poundIndex < colonIndex)) {
material = code.substring(0, poundIndex);
rest = code.substring(poundIndex);
} else if (colonIndex > 0 && (poundIndex < 0 || colonIndex < poundIndex)) {
material = code.substring(0, colonIndex);
rest = code.substring(colonIndex);
}
code = MaterialUtil.getShortenedName(material, getMinecraftStringWidth(material) - exceeding) + rest;
}
}
ItemParseEvent parseEvent = new ItemParseEvent(code);
Bukkit.getPluginManager().callEvent(parseEvent);
ItemStack codeItem = parseEvent.getItem();
if (!MaterialUtil.equals(itemStack, codeItem)) {
throw new IllegalArgumentException("Cannot generate code for item " + itemStack
+ " with maximum length of " + maxWidth
+ " (code " + code + " results in item " + codeItem + ")");
}
}
return code;
}
/**
* Returns item's name, just like on the sign
*
* @param itemStack ItemStack to name
* @return ItemStack's name
*/
public static String getSignName(ItemStack itemStack) {
return getName(itemStack, MAXIMUM_SIGN_WIDTH);
}
}