Core/src/main/java/eu/univento/core/api/items/NamedInventory.java

205 lines
6.8 KiB
Java

package eu.univento.core.api.items;
import eu.univento.core.api.items.events.NamedPageClickEvent;
import eu.univento.core.api.player.CustomPlayer;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
/**
* @author joethei
* @version 0.1
*/
public class NamedInventory extends ClickInventory{
protected Page currentPage;
protected HashMap<ItemStack, Page> pageDirectors;
protected HashMap<Page, ItemStack[]> pages;
public NamedInventory(final CustomPlayer player) {
this(null, player);
}
public NamedInventory(final CustomPlayer player, final boolean dymanicInventory) {
this(player);
}
public NamedInventory(final String inventoryName, final CustomPlayer player) {
super(inventoryName, player);
this.pageDirectors = new HashMap<>();
this.pages = new HashMap<>();
}
public Page getCurrentPage() {
return this.currentPage;
}
public ItemStack[] getPage(final Page page) {
return this.pages.get(page);
}
public Page getPage(final String pageName) {
for (final Page page : this.pages.keySet()) {
if (page.getPageName().equals(pageName)) {
return page;
}
}
return null;
}
public Page getPageLink(final ItemStack item) {
return this.pageDirectors.get(item);
}
public HashMap<Page, ItemStack[]> getPages() {
return this.pages;
}
@Override
public String getTitle() {
return this.currentPage.getPageDisplayTitle();
}
public void linkPage(final ItemStack item, final Page page) {
this.pageDirectors.put(item, page);
}
public void linkPage(final ItemStack item, final String pageName) {
final Page page = this.getPage(pageName);
if (page != null) {
this.linkPage(item, page);
}
}
@Override
protected void onInventoryClick(final InventoryClickEvent event) {
final ItemStack item = event.getCurrentItem();
if (this.checkInMenu(event.getRawSlot())) {
if (item != null && this.pageDirectors.containsKey(item)) {
event.setCancelled(true);
this.setPage(this.pageDirectors.get(item));
return;
}
int slot = event.getSlot();
if (this.isPlayerInventory()) {
slot -= 9;
if (slot < 0) {
slot += 36;
}
}
final NamedPageClickEvent itemClickEvent = new NamedPageClickEvent(this, this.currentPage, slot, event);
if (!this.isModifiable()) {
itemClickEvent.setCancelled(true);
}
Bukkit.getPluginManager().callEvent(itemClickEvent);
if (itemClickEvent.isCancelled()) {
event.setCancelled(true);
}
}
else if (!this.isModifiable() && event.isShiftClick() && item != null && item.getType() != Material.AIR) {
for (int slot = 0; slot < this.currentInventory.getSize(); ++slot) {
final ItemStack invItem = this.currentInventory.getItem(slot);
if (invItem == null || invItem.getType() == Material.AIR || (invItem.isSimilar(item) && invItem.getAmount() < invItem.getMaxStackSize())) {
event.setCancelled(true);
break;
}
}
}
}
public void openInventory() {
if (this.isInUse()) {
return;
}
if (this.isPlayerInventory()) {
this.saveContents();
}
if (this.currentPage == null) {
if (this.pages.isEmpty()) {
this.pages.put(new Page("Inventory"), new ItemStack[0]);
}
this.currentPage = this.pages.keySet().iterator().next();
}
if (this.currentInventory == null) {
final ItemStack[] pageItems = this.getPage(this.currentPage);
if (this.isPlayerInventory()) {
this.currentInventory = this.getPlayer().getInventory();
}
else {
this.currentInventory = Bukkit.createInventory(null, pageItems.length, this.getTitle());
}
this.setItems(pageItems);
}
this.openInventory();
}
public void removePage(final Page page) {
this.pages.remove(page);
}
public void setPage(final Page newPage) {
if (this.pages.containsKey(newPage)) {
final Page oldPage = this.currentPage;
this.currentPage = newPage;
if (this.isInUse()) {
final ItemStack[] pageItems = this.pages.get(this.currentPage);
if (!this.isPlayerInventory() && (pageItems.length != this.currentInventory.getSize() || !oldPage.getPageDisplayTitle().equals(this.getTitle()))) {
(this.currentInventory = Bukkit.createInventory(null, pageItems.length, this.getTitle())).setContents(pageItems);
this.openInventory();
}
else {
this.setItems(pageItems);
}
}
}
}
public void setPage(final Page page, ItemStack... items) {
if (items.length % 9 != 0) {
items = Arrays.copyOf(items, (int)(Math.ceil(items.length / 9.0) * 9.0));
}
if (items.length > (this.isPlayerInventory() ? 36 : 54)) {
throw new RuntimeException("A inventory size of " + items.length + " was passed when the max is " + (this.isPlayerInventory() ? 36 : 54));
}
this.pages.put(page, items);
if (this.currentPage == null) {
this.currentPage = page;
}
else if (this.currentPage.equals(page)) {
this.setPage(page);
}
}
public void setPage(final Page page, final List<ItemStack> items) {
this.setPage(page, (ItemStack[])items.toArray(new ItemStack[items.size()]));
}
public void setPage(final String pageName) {
final Page page = this.getPage(pageName);
if (page != null) {
this.setPage(page);
}
}
@Override
public NamedInventory setPlayerInventory() {
super.setPlayerInventory();
return this;
}
@Override
public void setTitle(final String newTitle) {
if (newTitle != null && this.getCurrentPage() != null && !this.getCurrentPage().getPageDisplayTitle().equals(newTitle)) {
this.setPage(new Page(this.getCurrentPage().getPageName(), newTitle), this.getPage(this.getCurrentPage()));
}
}
public void unlinkPage(final ItemStack item) {
this.pageDirectors.remove(item);
}
}