Improvements to the ChestGUI

This commit is contained in:
Olof Larsson 2016-03-17 19:11:05 +01:00
parent e75d52c584
commit 3f262e13bc
2 changed files with 93 additions and 9 deletions

View File

@ -1,20 +1,23 @@
package com.massivecraft.massivecore.chestgui;
import java.util.List;
import java.util.Map;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import com.massivecraft.massivecore.MassiveCoreMConf;
import com.massivecraft.massivecore.SoundEffect;
import com.massivecraft.massivecore.collections.MassiveList;
import com.massivecraft.massivecore.collections.MassiveMap;
public class ChestGui
{
// -------------------------------------------- //
// STATIC REGISTRY
// REGISTRY
// -------------------------------------------- //
protected static Map<Inventory, ChestGui> inventoryToGui = new MassiveMap<Inventory, ChestGui>();
private static final Map<Inventory, ChestGui> inventoryToGui = new MassiveMap<Inventory, ChestGui>();
public static Map<Inventory, ChestGui> getInventoryToGui() { return inventoryToGui; }
public static ChestGui remove(Inventory inventory) { return inventoryToGui.remove(inventory); }
public static ChestGui set(Inventory inventory, ChestGui gui) { return inventoryToGui.put(inventory, gui); }
@ -29,10 +32,10 @@ public class ChestGui
}
// -------------------------------------------- //
// FIELDS: ACTIONS
// ACTIONS
// -------------------------------------------- //
protected Map<Integer, ChestAction> indexToAction = new MassiveMap<Integer, ChestAction>();
private Map<Integer, ChestAction> indexToAction = new MassiveMap<Integer, ChestAction>();
public Map<Integer, ChestAction> getIndexToAction() { return this.indexToAction; }
public ChestAction removeAction(ItemStack item) { return this.indexToAction.remove(item); }
public ChestAction setAction(int index, ChestAction action) { return this.indexToAction.put(index, action); }
@ -40,10 +43,35 @@ public class ChestGui
public ChestAction getAction(int index) { return this.indexToAction.get(index); }
// -------------------------------------------- //
// FIELDS: SOUND
// LAST ACTION
// -------------------------------------------- //
protected SoundEffect soundEffect = SoundEffect.valueOf("CLICK", 1.0f, 1.0f);
private ChestAction lastAction = null;
public ChestAction getLastAction() { return this.lastAction; }
public void setLastAction(ChestAction lastAction) { this.lastAction = lastAction; }
// -------------------------------------------- //
// META DATA
// -------------------------------------------- //
private final Map<String, Object> meta = new MassiveMap<>();
public Map<String, Object> getMeta() { return this.meta; }
// -------------------------------------------- //
// RUNNABLES
// -------------------------------------------- //
private final List<Runnable> runnablesOpen = new MassiveList<>();
public List<Runnable> getRunnablesOpen() { return this.runnablesOpen; }
private final List<Runnable> runnablesClose = new MassiveList<>();
public List<Runnable> getRunnablesClose() { return this.runnablesClose; }
// -------------------------------------------- //
// SOUND
// -------------------------------------------- //
private SoundEffect soundEffect = MassiveCoreMConf.get().clickSound;
public SoundEffect getSoundEffect() { return this.soundEffect; }
public ChestGui setSoundEffect(SoundEffect soundEffect) { this.soundEffect = soundEffect; return this; }

View File

@ -1,10 +1,12 @@
package com.massivecraft.massivecore.engine;
import org.bukkit.event.Event.Result;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.inventory.Inventory;
import com.massivecraft.massivecore.Engine;
import com.massivecraft.massivecore.chestgui.ChestAction;
@ -54,6 +56,9 @@ public class EngineMassiveCoreChestGui extends Engine
ChestAction action = gui.getAction(index);
if (action == null) return;
// ... set last action ...
gui.setLastAction(action);
// ... then play the sound ...
gui.getSoundEffect().run(event.getWhoClicked());
@ -64,12 +69,63 @@ public class EngineMassiveCoreChestGui extends Engine
action.onClick(event);
}
@EventHandler(priority = EventPriority.LOW)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onOpen(InventoryOpenEvent event)
{
// Get
final Inventory inventory = event.getInventory();
if (inventory == null) return;
final ChestGui gui = ChestGui.get(inventory);
if (gui == null) return;
// Runnables
Bukkit.getScheduler().runTask(getPlugin(), new Runnable()
{
@Override
public void run()
{
for (Runnable runnable : gui.getRunnablesOpen())
{
runnable.run();
}
}
});
}
// NOTE:
@EventHandler(priority = EventPriority.MONITOR)
public void onClose(InventoryCloseEvent event)
{
Inventory inventory = event.getInventory();
// Get
final Inventory inventory = event.getInventory();
if (inventory == null) return;
final ChestGui gui = ChestGui.get(inventory);
if (gui == null) return;
// Runnables
Bukkit.getScheduler().runTask(getPlugin(), new Runnable()
{
@Override
public void run()
{
for (Runnable runnable : gui.getRunnablesClose())
{
runnable.run();
}
}
});
// We save the inventory in the map for a little while.
// A plugin may want to do something upon the chest gui closing.
Bukkit.getScheduler().runTaskLater(this.getPlugin(), new Runnable()
{
@Override
public void run()
{
ChestGui.remove(inventory);
}
}, 20);
}
}