package be.isach.ultracosmetics.menu;
import be.isach.ultracosmetics.UltraCosmetics;
import be.isach.ultracosmetics.UltraCosmeticsData;
import be.isach.ultracosmetics.config.MessageManager;
import be.isach.ultracosmetics.config.SettingsManager;
import be.isach.ultracosmetics.cosmetics.Category;
import be.isach.ultracosmetics.cosmetics.Cosmetic;
import be.isach.ultracosmetics.cosmetics.type.CosmeticMatType;
import be.isach.ultracosmetics.player.UltraPlayer;
import be.isach.ultracosmetics.util.ItemFactory;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.material.MaterialData;
import java.util.ArrayList;
import java.util.List;
/**
* A cosmetic menu.
*
* @author iSach
* @since 08-09-2016
*/
public abstract class CosmeticMenu<T extends CosmeticMatType> extends Menu {
public final static int[] COSMETICS_SLOTS = {
10, 11, 12, 13, 14, 15, 16,
19, 20, 21, 22, 23, 24, 25,
28, 29, 30, 31, 32, 33, 34
};
private Category category;
public CosmeticMenu(UltraCosmetics ultraCosmetics, Category category) {
super(ultraCosmetics);
this.category = category;
}
@Override
public void open(UltraPlayer player) {
open(player, 1);
}
public void open(UltraPlayer player, int page) {
if (page > getMaxPages()) {
page = getMaxPages();
}
if (page < 1) {
page = 1;
}
Inventory inventory = Bukkit.createInventory(null, getSize(), getMaxPages() == 1 ? getName() : getName(page));
// Cosmetic items.
int i = 0;
int from = 21 * (page - 1) + 1;
int to = 21 * page;
for (int h = from; h <= to; h++) {
if (h > enabled().size()) {
break;
}
T cosmeticMatType = enabled().get(h - 1);
if (!cosmeticMatType.isEnabled()) {
continue;
}
if (SettingsManager.getConfig().getBoolean("No-Permission.Dont-Show-Item")
&& !player.hasPermission(cosmeticMatType.getPermission())) {
continue;
}
if (SettingsManager.getConfig().getBoolean("No-Permission.Custom-Item.enabled")
&& !player.hasPermission(cosmeticMatType.getPermission())) {
Material material = Material.valueOf((String) SettingsManager.getConfig().get("No-Permission.Custom-Item.Type"));
Byte data = Byte.valueOf(String.valueOf(SettingsManager.getConfig().get("No-Permission.Custom-Item.Data")));
String name = ChatColor.translateAlternateColorCodes('&', String.valueOf(SettingsManager.getConfig().get("No-Permission.Custom-Item.Name")).replace("{cosmetic-name}", cosmeticMatType.getName()));
List<String> npLore = SettingsManager.getConfig().getStringList("No-Permission.Custom-Item.Lore");
String[] array = new String[npLore.size()];
npLore.toArray(array);
putItem(inventory, COSMETICS_SLOTS[i], ItemFactory.create(material, data, name, array), clickData -> {
Player clicker = clickData.getClicker().getBukkitPlayer();
clicker.sendMessage(MessageManager.getMessage("No-Permission"));
clicker.closeInventory();
});
i++;
continue;
}
String toggle = category.getActivateMenu();
if (getCosmetic(player) != null && getCosmetic(player).getType() == cosmeticMatType) {
toggle = category.getDeactivateMenu();
}
String typeName = getTypeName(cosmeticMatType, player);
ItemStack is = ItemFactory.create(cosmeticMatType.getMaterial(), cosmeticMatType.getData(), toggle + " " + typeName);
if (getCosmetic(player) != null && getCosmetic(player).getType() == cosmeticMatType) {
is = ItemFactory.addGlow(is);
}
ItemMeta itemMeta = is.getItemMeta();
List<String> loreList = new ArrayList<>();
if (cosmeticMatType.showsDescription()) {
loreList.add("");
loreList.addAll(cosmeticMatType.getDescription());
loreList.add("");
}
if (SettingsManager.getConfig().getBoolean("No-Permission.Show-In-Lore")) {
String yesOrNo = player.hasPermission(cosmeticMatType.getPermission()) ? "Yes" : "No";
String s = SettingsManager.getConfig().getString("No-Permission.Lore-Message-" + yesOrNo);
loreList.add(ChatColor.translateAlternateColorCodes('&', s));
}
itemMeta.setLore(loreList);
is.setItemMeta(itemMeta);
is = filterItem(is, cosmeticMatType, player);
putItem(inventory, COSMETICS_SLOTS[i], is, (data) -> {
UltraPlayer ultraPlayer = data.getClicker();
ItemStack clicked = data.getClicked();
int currentPage = getCurrentPage(ultraPlayer);
if (UltraCosmeticsData.get().shouldCloseAfterSelect()) {
ultraPlayer.getBukkitPlayer().closeInventory();
}
if (UltraCosmeticsData.get().isAmmoEnabled() && data.getAction() == InventoryAction.PICKUP_HALF) {
StringBuilder sb = new StringBuilder();
for (int k = 1; k < clicked.getItemMeta().getDisplayName().split(" ").length; k++) {
sb.append(clicked.getItemMeta().getDisplayName().split(" ")[k]);
try {
if (clicked.getItemMeta().getDisplayName().split(" ")[k + 1] != null)
sb.append(" ");
} catch (Exception ignored) {
}
}
if (getCosmetic(ultraPlayer) == null) {
toggleOff(ultraPlayer);
}
toggleOn(ultraPlayer, cosmeticMatType, getUltraCosmetics());
if (getCategory() == Category.GADGETS) {
if (ultraPlayer.getCurrentGadget().getType().requiresAmmo()) {
ultraPlayer.getCurrentGadget().lastPage = currentPage;
ultraPlayer.getCurrentGadget().openAmmoPurchaseMenu();
ultraPlayer.getCurrentGadget().openGadgetsInvAfterAmmo = true;
}
}
return;
}
if (clicked.getItemMeta().getDisplayName().startsWith(category.getDeactivateMenu())) {
toggleOff(ultraPlayer);
if (!UltraCosmeticsData.get().shouldCloseAfterSelect()) {
open(ultraPlayer, currentPage);
}
} else if (clicked.getItemMeta().getDisplayName().startsWith(category.getActivateMenu())) {
toggleOff(ultraPlayer);
StringBuilder sb = new StringBuilder();
String name = clicked.getItemMeta().getDisplayName().replaceFirst(category.getActivateMenu(), "");
int j = name.split(" ").length;
if (name.contains("(")) {
j--;
}
for (int k = 1; k < j; k++) {
sb.append(name.split(" ")[k]);
try {
if (clicked.getItemMeta().getDisplayName().split(" ")[k + 1] != null)
sb.append(" ");
} catch (Exception ignored) {
}
}
toggleOn(ultraPlayer, cosmeticMatType, getUltraCosmetics());
if (category == Category.GADGETS &&
ultraPlayer.getCurrentGadget() != null &&
UltraCosmeticsData.get().isAmmoEnabled() && ultraPlayer.getAmmo(ultraPlayer.getCurrentGadget().getType().toString().toLowerCase()) < 1 && ultraPlayer.getCurrentGadget().getType().requiresAmmo()) {
ultraPlayer.getCurrentGadget().lastPage = currentPage;
ultraPlayer.getCurrentGadget().openAmmoPurchaseMenu();
} else {
if (!UltraCosmeticsData.get().shouldCloseAfterSelect()) {
open(ultraPlayer, currentPage);
}
}
}
});
i++;
}
// Previous page item.
if (page > 1) {
MaterialData materialData = ItemFactory.createFromConfig("Categories.Previous-Page-Item");
int finalPage = page;
putItem(inventory, getSize() - 18, ItemFactory.create(materialData.getItemType(), materialData.getData(),
MessageManager.getMessage("Menu.Previous-Page")), (data) -> open(player, finalPage - 1));
}
// Next page item.
if (page < getMaxPages()) {
MaterialData materialData = ItemFactory.createFromConfig("Categories.Next-Page-Item");
int finalPage = page;
putItem(inventory, getSize() - 10, ItemFactory.create(materialData.getItemType(), materialData.getData(),
MessageManager.getMessage("Menu.Next-Page")), (data) -> open(player, finalPage + 1));
}
// Clear cosmetic item.
MaterialData materialData = ItemFactory.createFromConfig("Categories.Clear-Cosmetic-Item");
String message = MessageManager.getMessage(category.getClearConfigPath());
ItemStack itemStack = ItemFactory.create(materialData.getItemType(), materialData.getData(), message);
putItem(inventory, inventory.getSize() - 4, itemStack, data -> {
toggleOff(player);
open(player, getCurrentPage(player));
});
// Go Back to Main Menu Arrow.
if (getCategory().hasGoBackArrow()) {
MaterialData backData = ItemFactory.createFromConfig("Categories.Back-Main-Menu-Item");
ItemStack item = ItemFactory.create(backData.getItemType(), backData.getData(),
MessageManager.getMessage("Menu.Main-Menu"));
putItem(inventory, inventory.getSize() - 6, item, (data) -> {
getUltraCosmetics().openMainMenu(player);
});
}
putItems(inventory, player, page);
ItemFactory.fillInventory(inventory);
player.getBukkitPlayer().openInventory(inventory);
}
public T getCosmeticType(String name) {
for (T effectType : enabled()) {
if (effectType.getConfigName().replace(" ", "").equals(name.replace(" ", ""))) {
return effectType;
}
}
return null;
}
/**
* @param ultraPlayer The menu owner.
* @return The current page of the menu opened by ultraPlayer.
*/
protected int getCurrentPage(UltraPlayer ultraPlayer) {
Player player = ultraPlayer.getBukkitPlayer();
String title = player.getOpenInventory().getTopInventory().getTitle();
if (player.getOpenInventory() != null
&& title.startsWith(getName())
&& !title.equals(getName())) {
String s = player.getOpenInventory().getTopInventory().getTitle()
.replace(getName() + " " + ChatColor.GRAY + "" + ChatColor.ITALIC + "(", "")
.replace("/" + getMaxPages() + ")", "");
return Integer.parseInt(s);
}
return 0;
}
/**
* Gets the max amount of pages.
*
* @return the maximum amount of pages.
*/
protected int getMaxPages() {
int max = 21;
int i = enabled().size();
if (i % max == 0) return i / max;
double j = i / 21;
int h = (int) Math.floor(j * 100) / 100;
return h + 1;
}
protected int getItemsPerPage() {
return 12;
}
/**
* This method can be overridden
* to modify an itemstack of a
* category being placed in the
* inventory.
*
* @param itemStack Item Stack being placed.
* @param cosmeticType The Cosmetic Type.
* @param player The Inventory Opener.
* @return The new item stack filtered.
*/
protected ItemStack filterItem(ItemStack itemStack, T cosmeticType, UltraPlayer player) {
return itemStack;
}
protected String getTypeName(T cosmeticType, UltraPlayer ultraPlayer) {
return cosmeticType.getName();
}
/**
* @param page The page to open.
* @return The name of the menu with page detailed.
*/
protected String getName(int page) {
return MessageManager.getMessage("Menus." + category.getConfigPath()) + " " + ChatColor.GRAY + "" + ChatColor.ITALIC + "(" + page + "/" + getMaxPages() + ")";
}
@Override
protected int getSize() {
int listSize = enabled().size();
int slotAmount = 54;
if (listSize < 22) {
slotAmount = 54;
}
if (listSize < 15) {
slotAmount = 45;
}
if (listSize < 8) {
slotAmount = 36;
}
return slotAmount;
}
@Override
protected void putItems(Inventory inventory, UltraPlayer ultraPlayer) {
//--
}
/**
* @return The name of the menu.
*/
@Override
protected String getName() {
return MessageManager.getMessage("Menus." + category.getConfigPath());
}
public Category getCategory() {
return category;
}
/**
* Puts items in the inventory.
*
* @param inventory Inventory.
* @param ultraPlayer Inventory Owner.
* @param page Page to open.
*/
abstract protected void putItems(Inventory inventory, UltraPlayer ultraPlayer, int page);
abstract public List<T> enabled();
abstract protected void toggleOn(UltraPlayer ultraPlayer, T type, UltraCosmetics ultraCosmetics);
abstract protected void toggleOff(UltraPlayer ultraPlayer);
abstract protected Cosmetic getCosmetic(UltraPlayer ultraPlayer);
}