Core/src/eu/univento/core/api/gui/AnvilGui.java

224 lines
6.2 KiB
Java

package eu.univento.core.api.gui;
import eu.univento.core.Core;
import net.minecraft.server.v1_8_R3.*;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.HashMap;
/**
* Created by chasechocolate.
*/
public class AnvilGUI {
private class AnvilContainer extends ContainerAnvil {
public AnvilContainer(EntityHuman entity){
super(entity.inventory, entity.world,new BlockPosition(0, 0, 0), entity);
}
@Override
public boolean a(EntityHuman entityhuman){
return true;
}
}
public enum AnvilSlot {
INPUT_LEFT(0),
INPUT_RIGHT(1),
OUTPUT(2);
private int slot;
private AnvilSlot(int slot){
this.slot = slot;
}
public int getSlot(){
return slot;
}
public static AnvilSlot bySlot(int slot){
for(AnvilSlot anvilSlot : values()){
if(anvilSlot.getSlot() == slot){
return anvilSlot;
}
}
return null;
}
}
public class AnvilClickEvent {
private AnvilSlot slot;
private String name;
private boolean close = true;
private boolean destroy = true;
public AnvilClickEvent(AnvilSlot slot, String name){
this.slot = slot;
this.name = name;
}
public AnvilSlot getSlot(){
return slot;
}
public String getName(){
return name;
}
public boolean getWillClose(){
return close;
}
public void setWillClose(boolean close){
this.close = close;
}
public boolean getWillDestroy(){
return destroy;
}
public void setWillDestroy(boolean destroy){
this.destroy = destroy;
}
}
public interface AnvilClickEventHandler {
public void onAnvilClick(AnvilClickEvent event);
}
private Player player;
private AnvilClickEventHandler handler;
private HashMap<AnvilSlot, ItemStack> items = new HashMap<AnvilSlot, ItemStack>();
private Inventory inv;
private Listener listener;
public AnvilGUI(Player player, final AnvilClickEventHandler handler){
this.player = player;
this.handler = handler;
this.listener = new Listener(){
@EventHandler
public void onInventoryClick(InventoryClickEvent event){
if(event.getWhoClicked() instanceof Player){
Player clicker = (Player) event.getWhoClicked();
if(event.getInventory().equals(inv)){
event.setCancelled(true);
ItemStack item = event.getCurrentItem();
int slot = event.getRawSlot();
String name = "";
if(item != null){
if(item.hasItemMeta()){
ItemMeta meta = item.getItemMeta();
if(meta.hasDisplayName()){
name = meta.getDisplayName();
}
}
}
AnvilClickEvent clickEvent = new AnvilClickEvent(AnvilSlot.bySlot(slot), name);
handler.onAnvilClick(clickEvent);
if(clickEvent.getWillClose()){
event.getWhoClicked().closeInventory();
}
if(clickEvent.getWillDestroy()){
destroy();
}
}
}
}
@EventHandler
public void onInventoryClose(InventoryCloseEvent event){
if(event.getPlayer() instanceof Player){
Player player = (Player) event.getPlayer();
Inventory inv = event.getInventory();
if(inv.equals(AnvilGUI.this.inv)){
inv.clear();
destroy();
}
}
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event){
if(event.getPlayer().equals(getPlayer())){
destroy();
}
}
};
Bukkit.getPluginManager().registerEvents(listener, Core.getInstance()); //Replace with instance of main class
}
public Player getPlayer(){
return player;
}
public void setSlot(AnvilSlot slot, ItemStack item){
items.put(slot, item);
}
public void open(){
EntityPlayer p = ((CraftPlayer) player).getHandle();
AnvilContainer container = new AnvilContainer(p);
//Set the items to the items from the inventory given
inv = container.getBukkitView().getTopInventory();
for(AnvilSlot slot : items.keySet()){
inv.setItem(slot.getSlot(), items.get(slot));
}
//Counter stuff that the game uses to keep track of inventories
int c = p.nextContainerCounter();
//Send the packet
p.playerConnection.sendPacket(new PacketPlayOutOpenWindow(c, "minecraft:anvil", new ChatMessage("Repairing", new Object[]{}), 0));
//Set their active container to the container
p.activeContainer = container;
//Set their active container window id to that counter stuff
p.activeContainer.windowId = c;
//Add the slot listener
p.activeContainer.addSlotListener(p);
}
public void destroy(){
player = null;
handler = null;
items = null;
HandlerList.unregisterAll(listener);
listener = null;
}
}