1package com.dreamfirestudios.dreamcore.DreamSmartInvs;
3import com.dreamfirestudios.dreamcore.DreamCore;
4import com.dreamfirestudios.dreamcore.DreamSmartInvs.content.InventoryContents;
5import com.dreamfirestudios.dreamcore.DreamSmartInvs.content.InventoryProvider;
6import com.dreamfirestudios.dreamcore.DreamSmartInvs.opener.InventoryOpener;
7import org.bukkit.Bukkit;
8import org.bukkit.entity.Player;
9import org.bukkit.event.Event;
10import org.bukkit.event.inventory.InventoryCloseEvent;
11import org.bukkit.event.inventory.InventoryType;
12import org.bukkit.inventory.Inventory;
14import java.util.ArrayList;
16import java.util.Optional;
17import java.util.concurrent.CompletableFuture;
22 private InventoryType type;
23 private int rows, columns;
24 private boolean closeable;
25 private List<Integer> clickableTiles =
new ArrayList<>();
26 private boolean bottomClickable =
false;
28 private InventoryProvider provider;
31 private List<InventoryListener<? extends Event>> listeners;
35 this.manager = manager;
38 public CompletableFuture<Inventory>
open(Player player) {
39 return open(player, 0);
41 public CompletableFuture<Inventory>
open(Player player,
int page) {
43 Optional<SmartInventory> oldInv = this.manager.
getInventory(player);
45 if (oldInv.isPresent()) {
48 inv.getListeners().stream()
49 .filter(listener -> listener.getType() == InventoryCloseEvent.class)
50 .forEach(listener -> ((InventoryListener<InventoryCloseEvent>) listener)
51 .accept(new InventoryCloseEvent(player.getOpenInventory())));
53 this.manager.setInventory(player, null);
58 InventoryContents contents =
new InventoryContents.Impl(
this, player.getUniqueId());
59 contents.pagination().page(page);
64 return this.provider.init(player, contents).thenApplyAsync(v -> {
67 if (!this.manager.
getContents(player).equals(Optional.of(contents))) {
72 InventoryOpener opener =
this.manager.findOpener(type)
73 .orElseThrow(() ->
new IllegalStateException(
"No opener found for the inventory type " + type.name()));
74 Inventory handle = opener.open(
this, player);
78 }
catch (Exception e) {
85 @SuppressWarnings(
"unchecked")
86 public
void close(Player player) {
89 .filter(listener -> listener.getType() == InventoryCloseEvent.class)
90 .forEach(listener -> ((InventoryListener<InventoryCloseEvent>) listener)
91 .accept(new InventoryCloseEvent(player.getOpenInventory())));
92 this.manager.setInventory(player, null);
93 player.closeInventory();
94 this.manager.setContents(player, null);
98 public String
getId() {
return id; }
100 public InventoryType
getType() {
return type; }
107 public void setCloseable(
boolean closeable) { this.closeable = closeable; }
110 public Optional<SmartInventory>
getParent() {
return Optional.ofNullable(parent); }
114 List<InventoryListener<? extends Event>> getListeners() {
return listeners; }
120 private String
id =
"unknown";
121 private String title =
"";
122 private InventoryType type = InventoryType.CHEST;
123 private int rows = 6, columns = 9;
124 private boolean closeable =
true;
125 private List<Integer> clickableTiles =
new ArrayList<>();
126 private boolean bottomClickable =
false;
129 private InventoryProvider provider;
132 private List<InventoryListener<? extends Event>> listeners =
new ArrayList<>();
142 clickableTiles.add(slot);
147 clickableTiles.addAll(slot);
152 bottomClickable = clickable;
168 this.columns = columns;
173 this.closeable = closeable;
178 this.provider = provider;
183 this.parent = parent;
193 this.manager = manager;
198 if(this.provider ==
null)
199 throw new IllegalStateException(
"The provider of the SmartInventory.Builder must be set.");
204 throw new IllegalStateException(
"The manager of the SmartInventory.Builder must be set, "
205 +
"or the SmartInvs should be loaded as a plugin.");
209 inv.title = this.title;
210 inv.type = this.type;
211 inv.rows = this.rows;
212 inv.columns = this.columns;
213 inv.closeable = this.closeable;
214 inv.provider = this.provider;
215 inv.parent = this.parent;
216 inv.listeners = this.listeners;
217 inv.clickableTiles = this.clickableTiles;
218 inv.bottomClickable = this.bottomClickable;
static SmartInvsPlugin SmartInvsPlugin
static DreamCore DreamCore
void setContents(Player p, InventoryContents contents)
Optional< SmartInventory > getInventory(Player p)
Optional< InventoryContents > getContents(Player p)
void handleInventoryOpenError(SmartInventory inventory, Player player, Exception exception)
void setInventory(Player p, SmartInventory inv)
Builder addClickable(int slot)
Builder manager(InventoryManager manager)
Builder title(String title)
Builder closeable(boolean closeable)
Builder bottomClickable(boolean clickable)
Builder parent(SmartInventory parent)
Builder provider(InventoryProvider provider)
Builder addClickable(List< Integer > slot)
Builder type(InventoryType type)
Builder listener(InventoryListener<? extends Event > listener)
Builder size(int rows, int columns)
void setCloseable(boolean closeable)
CompletableFuture< Inventory > open(Player player, int page)
void close(Player player)
boolean getBottomClickable()
InventoryProvider getProvider()
InventoryManager getManager()
CompletableFuture< Inventory > open(Player player)
List< Integer > getClickableTiles()
Optional< SmartInventory > getParent()