LagAssist is a plugin that provides tools to prevent, analyse or resolve lag.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 lines
4.2 KiB

package com.entryrise.lagassist.gui;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import com.entryrise.lagassist.hoppers.HopperFilter;
public class HopperGUI implements Listener {
private static Map<Inventory, Location> locs = new HashMap<Inventory, Location>();
public static Inventory getInventory(Player p, Location loc) {
return createInventory(p.getName(), loc);
}
private static Inventory createInventory(String name, Location loc) {
Inventory inv = Bukkit.createInventory(null, HopperFilter.filtersize, HopperFilter.guiname);
addFilter(inv, loc);
return inv;
}
private static void addFilter(Inventory inv, Location loc) {
int i = 0;
for (Material mat : HopperFilter.getFilter(loc)) {
inv.setItem(i++, new ItemStack(mat));
}
}
public static void show(Player p, Location loc) {
Inventory inv = getInventory(p, loc);
locs.put(inv, loc);
p.openInventory(inv);
}
public static void exit(Location loc) {
lastclosed.clear();
if (!locs.containsValue(loc)) {
return;
}
Set<Inventory> removables = new HashSet<Inventory>();
for (Inventory inv : locs.keySet()) {
Location iloc = locs.get(inv);
if (iloc.equals(loc)) {
removables.add(inv);
}
for (HumanEntity viewer : inv.getViewers()) {
viewer.closeInventory();
lastclosed.add(inv);
}
}
locs.keySet().removeAll(removables);
}
private static Set<Inventory> lastclosed = new HashSet<Inventory>();;
// Save filter when player closes the inventory.
@EventHandler
public void onInventoryClose(InventoryCloseEvent e) {
Inventory inv = e.getInventory();
// Closed because of block break.
if (lastclosed.contains(inv)) {
return;
}
HumanEntity hm = e.getPlayer();
if (!(hm instanceof Player)) {
return;
}
if (locs.containsKey(inv)) {
HopperFilter.saveFilter(inv, locs.get(inv));
locs.remove(inv);
}
}
@SuppressWarnings("deprecation")
@EventHandler
public void onInventoryClick(InventoryClickEvent e) {
HumanEntity hm = e.getWhoClicked();
if (!(hm instanceof Player)) {
return;
}
if (e.getRawSlot() < 0) {
return;
}
Inventory clicked = e.getClickedInventory();
Inventory invent = e.getView().getTopInventory();
Inventory bottom = e.getView().getBottomInventory();
// Click outside inv.
if (invent == null) {
return;
}
ItemStack hand = e.getCursor();
ItemStack itm = e.getCurrentItem();
if (!(e.getView().getTitle()).equals(HopperFilter.guiname)) {
return;
}
if (!locs.containsKey(invent)) {
return;
}
// Attempt to fix dupe.
if (clicked.equals(bottom) && e.getClick() == ClickType.DOUBLE_CLICK) {
e.setCancelled(true);
return;
}
if (clicked.equals(invent) && !(e.getClick() == ClickType.LEFT || e.getClick() == ClickType.RIGHT)) {
e.setCancelled(true);
return;
}
if (clicked.equals(bottom)) {
return;
}
if (hand == null && itm != null) {
e.setCurrentItem(null);
} else if (hand != null) {
e.setCurrentItem(new ItemStack(hand.getType()));
}
e.setCursor(hand);
e.setCancelled(true);
}
@EventHandler
public void onInventoryDrag(InventoryDragEvent e) {
HumanEntity hm = e.getWhoClicked();
if (!(hm instanceof Player)) {
return;
}
Inventory invent = e.getView().getTopInventory();
// Click outside inv.
if (invent == null) {
return;
}
if (!(e.getView().getTitle()).equals(HopperFilter.guiname)) {
return;
}
if (!locs.containsKey(invent)) {
return;
}
e.setCancelled(true);
}
}