SteamWar/SpigotCore
Archiviert
13
0

Merge pull request 'Inventory Improvements' (#113) from inventory_2 into master

Reviewed-on: #113
Reviewed-by: Lixfel <lixfel@steamwar.de>
Dieser Commit ist enthalten in:
Lixfel 2021-09-27 17:11:12 +02:00
Commit d801092061

Datei anzeigen

@ -30,35 +30,54 @@ import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class SWInventory implements Listener { public class SWInventory implements Listener {
final Player player; final Player player;
final Map<Integer, InvCallback> callbacks = new HashMap<>(); final Map<Integer, Consumer<InventoryClickEvent>> callbacks = new HashMap<>();
final Inventory inventory; final Inventory inventory;
boolean open = false;
public SWInventory(Player p, int size, String t){ public SWInventory(Player p, int size, String t) {
player = p; player = p;
inventory = Bukkit.createInventory(p, size, t); inventory = Bukkit.createInventory(p, size, t);
} }
public SWInventory(Player p, int size, String t, Map<Integer, SWItem> items){ public SWInventory(Player p, int size, String t, Map<Integer, SWItem> items) {
this(p, size, t); this(p, size, t);
items.forEach(this::setItem); items.forEach(this::setItem);
open(); open();
} }
public void addCloseCallback(InvCallback c){ public SWInventory(Player p, Supplier<Inventory> inventoryConstructor) {
callbacks.put(-1, c); player = p;
try {
inventory = inventoryConstructor.get();
} catch (Exception e) {
throw new SecurityException("Could not construct inventory", e);
}
} }
public void setItem(int pos, ItemStack itemStack, InvCallback c){ public void addCloseCallback(InvCallback c) {
callbacks.put(-1, inventoryClickEvent -> c.clicked(null));
}
public void addCloseRunable(Runnable c) {
callbacks.put(-1, inventoryClickEvent -> c.run());
}
public void setItem(int pos, ItemStack itemStack, InvCallback c) {
inventory.setItem(pos, itemStack); inventory.setItem(pos, itemStack);
callbacks.put(pos, c); callbacks.put(pos, inventoryClickEvent -> c.clicked(inventoryClickEvent.getClick()));
} }
public void setItem(int pos, SWItem item){ public void setItem(int pos, SWItem item) {
setItem(pos, item.getItemStack(), item.getCallback()); setItem(pos, item.getItemStack(), item.getCallback());
} }
@ -70,32 +89,63 @@ public class SWInventory implements Listener {
setItem(pos, m, meta, name, new ArrayList<>(), false, c); setItem(pos, m, meta, name, new ArrayList<>(), false, c);
} }
public void setItem(int pos, Material m, String name, List<String> lore, boolean e, InvCallback c){ public void setItem(int pos, Material m, String name, List<String> lore, boolean e, InvCallback c) {
setItem(pos, m, (byte)0, name, lore, e, c); setItem(pos, m, (byte) 0, name, lore, e, c);
} }
public void setItem(int pos, Material m, byte meta, String name, List<String> lore, boolean e, InvCallback c){ public void setItem(int pos, Material m, byte meta, String name, List<String> lore, boolean e, InvCallback c) {
SWItem item = new SWItem(m, meta, name, lore, e, c); SWItem item = new SWItem(m, meta, name, lore, e, c);
setItem(pos, item); setItem(pos, item);
} }
public void setCallback(int pos, InvCallback c){ public void setCallback(int pos, InvCallback c) {
callbacks.put(pos, inventoryClickEvent -> c.clicked(inventoryClickEvent.getClick()));
}
public void setItemEvent(int pos, ItemStack itemStack, Consumer<InventoryClickEvent> c) {
inventory.setItem(pos, itemStack);
callbacks.put(pos, c); callbacks.put(pos, c);
} }
public void open(){ public void setItemEvent(int pos, Material m, String name, Consumer<InventoryClickEvent> c) {
setItemEvent(pos, m, name, new ArrayList<>(), false, c);
}
public void setItemEvent(int pos, Material m, byte meta, String name, Consumer<InventoryClickEvent> c) {
setItemEvent(pos, m, meta, name, new ArrayList<>(), false, c);
}
public void setItemEvent(int pos, Material m, String name, List<String> lore, boolean e, Consumer<InventoryClickEvent> c) {
setItemEvent(pos, m, (byte) 0, name, lore, e, c);
}
public void setItemEvent(int pos, Material m, byte meta, String name, List<String> lore, boolean e, Consumer<InventoryClickEvent> c) {
SWItem item = new SWItem(m, meta, name, lore, e, click -> {
});
setItem(pos, item);
setEventCallback(pos, c);
}
public void setEventCallback(int pos, Consumer<InventoryClickEvent> c) {
callbacks.put(pos, c);
}
public void open() {
player.openInventory(inventory); player.openInventory(inventory);
Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); if(!open) {
Bukkit.getPluginManager().registerEvents(this, Core.getInstance());
open = true;
}
} }
@EventHandler @EventHandler
public void onInventoryClick(InventoryClickEvent e){ public void onInventoryClick(InventoryClickEvent e) {
if(!player.equals(e.getWhoClicked())) if (!player.equals(e.getWhoClicked()))
return; return;
if(callbacks.containsKey(e.getRawSlot()) && callbacks.get(e.getRawSlot()) != null) { if (callbacks.containsKey(e.getRawSlot()) && callbacks.get(e.getRawSlot()) != null) {
e.setCancelled(true); e.setCancelled(true);
callbacks.get(e.getRawSlot()).clicked(e.getClick()); callbacks.get(e.getRawSlot()).accept(e);
} }
} }
@ -107,6 +157,6 @@ public class SWInventory implements Listener {
InventoryClickEvent.getHandlerList().unregister(this); InventoryClickEvent.getHandlerList().unregister(this);
InventoryCloseEvent.getHandlerList().unregister(this); InventoryCloseEvent.getHandlerList().unregister(this);
if(callbacks.containsKey(-1)) if(callbacks.containsKey(-1))
callbacks.get(-1).clicked(null); callbacks.get(-1).accept(null);
} }
} }