package sh.okx.rankup.gui; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; 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.ItemMeta; import sh.okx.rankup.Rankup; import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.MessageBuilder; import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.ranks.Rank; import java.util.Arrays; import java.util.stream.Collectors; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class Gui implements InventoryHolder { @Getter private Inventory inventory; @Getter private ItemStack rankup; @Getter private ItemStack cancel; @Getter private boolean prestige; public static Gui of(Player player, Rank oldRank, Rank rank, Rankup plugin) { ConfigurationSection config = plugin.getConfig().getConfigurationSection("gui"); ItemStack[] items = new ItemStack[config.getInt("rows") * 9]; ItemStack fill = getItem(plugin, "rankup", player, oldRank, rank); ItemStack cancel = getItem(plugin, "cancel", player, oldRank, rank); ItemStack rankup = getItem(plugin, "rankup", player, oldRank, rank); addItem(items, config.getConfigurationSection("rankup"), rankup); addItem(items, config.getConfigurationSection("cancel"), cancel); addItem(items, config.getConfigurationSection("fill"), fill); Gui gui = new Gui(); gui.prestige = oldRank instanceof Prestige; gui.rankup = rankup; gui.cancel = cancel; Inventory inventory = Bukkit.createInventory(gui, items.length, plugin.getMessage(oldRank, gui.prestige ? Message.PRESTIGE_TITLE : Message.TITLE) .replaceRanks(player, oldRank, rank) .replaceFromTo(oldRank) .toString()); inventory.setContents(items); gui.inventory = inventory; return gui; } private static ItemStack getItem(Rankup plugin, String name, Player player, Rank oldRank, Rank rank) { ConfigurationSection section = plugin.getConfig().getConfigurationSection("gui").getConfigurationSection(name); boolean legacy = !Bukkit.getVersion().contains("1.13"); String materialName = section.getString("material").toUpperCase(); // handle default material correctly on older versions if (legacy && materialName.equals("BLACK_STAINED_GLASS_PANE")) { materialName = "STAINED_GLASS_PANE:15"; } ItemStack item; if (legacy) { String[] parts = materialName.split(":"); Material material = Material.valueOf(parts[0]); short type = parts.length > 1 ? Short.parseShort(parts[1]) : 0; item = new ItemStack(material, 1, type); } else { Material material = Material.valueOf(materialName); item = new ItemStack(material); } if (item.getType() == Material.AIR && section.getName().equalsIgnoreCase("fill")) { return item; } ItemMeta meta = item.getItemMeta(); if (section.contains("lore")) { meta.setLore(Arrays.stream(format(plugin, section.getString("lore"), player, oldRank, rank).split("\n")) .map(string -> ChatColor.RESET + string) .collect(Collectors.toList())); } if (section.contains("name")) { meta.setDisplayName(ChatColor.RESET + format(plugin, section.getString("name"), player, oldRank, rank)); } item.setItemMeta(meta); return item; } private static String format(Rankup plugin, String message, Player player, Rank oldRank, Rank rank) { return plugin.replaceMoneyRequirements(new MessageBuilder(ChatColor.translateAlternateColorCodes('&', message)) .replaceRanks(player, oldRank, rank), player, oldRank) .toString(); } private static void addItem(ItemStack[] items, ConfigurationSection section, ItemStack item) { if (section.getName().equalsIgnoreCase("fill")) { for (int i = 0; i < items.length; i++) { if (items[i] == null) { items[i] = item; } } return; } String[] locations = section.getString("index").split(" "); for (String location : locations) { String[] parts = location.split("-"); if (parts.length == 1) { items[Integer.parseInt(parts[0])] = item; } else { for (int i = Integer.parseInt(parts[0]); i <= Integer.parseInt(parts[1]); i++) { items[i] = item; } } } } public void open(Player player) { player.openInventory(inventory); } }