mirror of
https://github.com/ChestShop-authors/ChestShop-3.git
synced 2024-07-02 01:04:42 +02:00
This uses hardcoded widths for the main characters used in Minecraft and might not be precise for some characters but better than the previous 15 char hard limit.
85 lines
2.9 KiB
Java
85 lines
2.9 KiB
Java
package com.Acrobot.ChestShop.Listeners.PreShopCreation;
|
|
|
|
import com.Acrobot.Breeze.Utils.MaterialUtil;
|
|
import com.Acrobot.Breeze.Utils.StringUtil;
|
|
import com.Acrobot.ChestShop.Configuration.Messages;
|
|
import com.Acrobot.ChestShop.Configuration.Properties;
|
|
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
|
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
|
import com.Acrobot.ChestShop.Utils.uBlock;
|
|
import org.bukkit.ChatColor;
|
|
import org.bukkit.block.Chest;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.inventory.ItemStack;
|
|
|
|
import java.util.regex.Matcher;
|
|
|
|
import static com.Acrobot.Breeze.Utils.MaterialUtil.*;
|
|
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.INVALID_ITEM;
|
|
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.ITEM_AUTOFILL;
|
|
import static com.Acrobot.ChestShop.Signs.ChestShopSign.ITEM_LINE;
|
|
import static com.Acrobot.ChestShop.Signs.ChestShopSign.AUTOFILL_CODE;
|
|
|
|
/**
|
|
* @author Acrobot
|
|
*/
|
|
public class ItemChecker implements Listener {
|
|
|
|
@EventHandler(priority = EventPriority.LOWEST)
|
|
public static void onPreShopCreation(PreShopCreationEvent event) {
|
|
String itemCode = event.getSignLine(ITEM_LINE);
|
|
ItemStack item = MaterialUtil.getItem(itemCode);
|
|
|
|
if (item == null) {
|
|
if (Properties.ALLOW_AUTO_ITEM_FILL && itemCode.equals(AUTOFILL_CODE)) {
|
|
Chest chest = uBlock.findConnectedChest(event.getSign());
|
|
if (chest != null) {
|
|
for (ItemStack stack : chest.getInventory().getContents()) {
|
|
if (!MaterialUtil.isEmpty(stack)) {
|
|
item = stack;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (item == null) {
|
|
event.setSignLine(ITEM_LINE, ChatColor.BOLD + ChestShopSign.AUTOFILL_CODE);
|
|
event.setOutcome(ITEM_AUTOFILL);
|
|
event.getPlayer().sendMessage(Messages.prefix(Messages.CLICK_TO_AUTOFILL_ITEM));
|
|
return;
|
|
}
|
|
} else {
|
|
event.setOutcome(INVALID_ITEM);
|
|
return;
|
|
}
|
|
}
|
|
|
|
itemCode = MaterialUtil.getSignName(item);
|
|
|
|
if (StringUtil.getMinecraftStringWidth(itemCode) > MAXIMUM_SIGN_WIDTH) {
|
|
event.setOutcome(INVALID_ITEM);
|
|
return;
|
|
}
|
|
|
|
event.setSignLine(ITEM_LINE, itemCode);
|
|
}
|
|
|
|
private static boolean isSameItem(String newCode, ItemStack item) {
|
|
ItemStack newItem = MaterialUtil.getItem(newCode);
|
|
|
|
return newItem != null && MaterialUtil.equals(newItem, item);
|
|
}
|
|
|
|
private static String getMetadata(String itemCode) {
|
|
Matcher m = METADATA.matcher(itemCode);
|
|
|
|
if (!m.find()) {
|
|
return "";
|
|
}
|
|
|
|
return m.group();
|
|
}
|
|
}
|