This commit is contained in:
Luca
2021-11-22 13:05:43 +01:00
parent ff6c6cf8ec
commit a7e07a123b
56 changed files with 1479 additions and 195 deletions

View File

@ -0,0 +1,52 @@
package rip.tilly.bedwars.utils.menu;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public abstract class Button {
public static Button placeholder(final Material material, final byte data, String... title) {
return (new Button() {
public ItemStack getButtonItem(Player player) {
ItemStack it = new ItemStack(material, 1, data);
ItemMeta meta = it.getItemMeta();
meta.setDisplayName(StringUtils.join(title));
it.setItemMeta(meta);
return it;
}
});
}
public static void playFail(Player player) {
player.playSound(player.getLocation(), Sound.DIG_GRASS, 20F, 0.1F);
}
public static void playSuccess(Player player) {
player.playSound(player.getLocation(), Sound.NOTE_PIANO, 20F, 15F);
}
public static void playNeutral(Player player) {
player.playSound(player.getLocation(), Sound.CLICK, 20F, 1F);
}
public abstract ItemStack getButtonItem(Player player);
public void clicked(Player player, int slot, ClickType clickType, int hotbarButton) {
}
public boolean shouldCancel(Player player, int slot, ClickType clickType) {
return (true);
}
public boolean shouldUpdate(Player player, int slot, ClickType clickType) {
return (false);
}
}

View File

@ -0,0 +1,150 @@
package rip.tilly.bedwars.utils.menu;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitTask;
import rip.tilly.bedwars.BedWars;
import java.util.HashMap;
import java.util.Map;
@Getter @Setter
public abstract class Menu {
public static Map<String, Menu> currentlyOpenedMenus = new HashMap<>();
@Getter private Map<Integer, Button> buttons = new HashMap<>();
private boolean autoUpdate = false;
private boolean updateAfterClick = true;
private boolean closedByMenu = false;
private boolean placeholder = false;
private Button placeholderButton = Button.placeholder(Material.STAINED_GLASS_PANE, (byte) 7, " ");
private BukkitTask task;
private ItemStack createItemStack(Player player, Button button) {
ItemStack item = button.getButtonItem(player);
if (item.getType() != Material.SKULL) {
ItemMeta meta = item.getItemMeta();
if (meta != null && meta.hasDisplayName()) {
meta.setDisplayName(meta.getDisplayName() + "§b§c§d§e");
}
item.setItemMeta(meta);
}
return item;
}
public void openMenu(final Player player) {
this.buttons = this.getButtons(player);
Menu previousMenu = Menu.currentlyOpenedMenus.get(player.getName());
Inventory inventory = null;
int size = this.getSize() == -1 ? this.size(this.buttons) : this.getSize();
boolean update = false;
String title = this.getTitle(player);
if (title.length() > 32) {
title = title.substring(0, 32);
}
if (player.getOpenInventory() != null) {
if (previousMenu == null) {
player.closeInventory();
} else {
int previousSize = player.getOpenInventory().getTopInventory().getSize();
if (previousSize == size && player.getOpenInventory().getTopInventory().getTitle().equals(title)) {
inventory = player.getOpenInventory().getTopInventory();
update = true;
} else {
previousMenu.setClosedByMenu(true);
player.closeInventory();
}
}
}
if (inventory == null) {
inventory = Bukkit.createInventory(player, size, title);
}
inventory.setContents(new ItemStack[inventory.getSize()]);
currentlyOpenedMenus.put(player.getName(), this);
for (Map.Entry<Integer, Button> buttonEntry : this.buttons.entrySet()) {
inventory.setItem(buttonEntry.getKey(), createItemStack(player, buttonEntry.getValue()));
}
if (this.isPlaceholder()) {
for (int index = 0; index < size; index++) {
if (this.buttons.get(index) == null) {
this.buttons.put(index, this.placeholderButton);
inventory.setItem(index, this.placeholderButton.getButtonItem(player));
}
}
}
if (update) {
player.updateInventory();
} else {
player.openInventory(inventory);
}
this.setClosedByMenu(false);
if (autoUpdate && task == null) {
task = BedWars.getInstance().getServer().getScheduler().runTaskTimer(BedWars.getInstance(), () -> this.openMenu(player), 0, 20L);
}
}
public int size(Map<Integer, Button> buttons) {
int highest = 0;
for (int buttonValue : buttons.keySet()) {
if (buttonValue > highest) {
highest = buttonValue;
}
}
return (int) (Math.ceil((highest + 1) / 9D) * 9D);
}
public int getSlot(int x, int y) {
return ((9 * y) + x);
}
public int getSize() {
return -1;
}
public abstract String getTitle(Player player);
public abstract Map<Integer, Button> getButtons(Player player);
public void onClose(Player player) {
if (task != null) {
task.cancel();
}
}
public void fillEmptySlots(Map<Integer, Button> buttons, ItemStack itemStack) {
int bound = getSize();
for (int slot = 0; slot < bound; slot++) {
if (buttons.get(slot) == null) {
buttons.put(slot, new Button() {
@Override
public ItemStack getButtonItem(Player player) {
return itemStack;
}
});
}
}
}
}