205 lines
6.8 KiB
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);
|
|
}
|
|
} |