Newer
Older
ultramine_bukkit / src / main / java / org / bukkit / craftbukkit / entity / CraftHumanEntity.java
@vlad20012 vlad20012 on 27 Jun 2017 11 KB Started implementing InventoryView
package org.bukkit.craftbukkit.entity;

import net.minecraft.entity.player.EntityPlayerMP;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.craftbukkit.inventory.CraftContainer;
import org.bukkit.craftbukkit.inventory.CraftInventory;
import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer;
import org.bukkit.craftbukkit.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.permissions.PermissibleBase;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.Plugin;
import org.ultramine.mods.bukkit.interfaces.entity.player.IMixinPlayer;
import org.ultramine.mods.bukkit.interfaces.entity.player.IMixinPlayerMP;
import org.ultramine.mods.bukkit.interfaces.inventory.IMixinContainer;

import java.util.Set;

public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity
{
	private CraftInventoryPlayer inventory;
	private CraftInventory enderChest;
	protected PermissibleBase perm = new PermissibleBase(this);
	private boolean op;
	private GameMode mode;

	public CraftHumanEntity(final CraftServer server, final net.minecraft.entity.player.EntityPlayer entity)
	{
		super(server, entity);
		mode = server.getDefaultGameMode();
	}

	public void setPermissible(PermissibleBase perm)
	{
		this.perm = perm;
	}

	public PermissibleBase getPermissible()
	{
		return perm;
	}

	public String getName()
	{
		return getHandle().getCommandSenderName();
	}

	public PlayerInventory getInventory()
	{
		if(inventory == null) inventory = new CraftInventoryPlayer(this);
		return inventory;
	}

	public EntityEquipment getEquipment()
	{
		return inventory;
	}

	public Inventory getEnderChest()
	{
		if(enderChest == null) enderChest = new CraftInventory(((net.minecraft.entity.player.EntityPlayer) entity).getInventoryEnderChest());
		return enderChest;
	}

	public ItemStack getItemInHand()
	{
		return getInventory().getItemInHand();
	}

	public void setItemInHand(ItemStack item)
	{
		getInventory().setItemInHand(item);
	}

	public ItemStack getItemOnCursor()
	{
		return CraftItemStack.asCraftMirror(getHandle().inventory.getItemStack());
	}

	public void setItemOnCursor(ItemStack item)
	{
		net.minecraft.item.ItemStack stack = CraftItemStack.asNMSCopy(item);
		getHandle().inventory.setItemStack(stack);
		if(this instanceof CraftPlayer)
		{
			((net.minecraft.entity.player.EntityPlayerMP) getHandle()).updateHeldItem(); // Send set slot for cursor
		}
	}

	public boolean isSleeping()
	{
		return ((IMixinPlayer) getHandle()).isSleeping();
	}

	public int getSleepTicks()
	{
		return ((IMixinPlayer) getHandle()).getSleepTimer();
	}

	public boolean isOp()
	{
		return op;
	}

	public boolean isPermissionSet(String name)
	{
		return perm.isPermissionSet(name);
	}

	public boolean isPermissionSet(Permission perm)
	{
		return this.perm.isPermissionSet(perm);
	}

	public boolean hasPermission(String name)
	{
		return perm.hasPermission(name);
	}

	public boolean hasPermission(Permission perm)
	{
		return this.perm.hasPermission(perm);
	}

	public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value)
	{
		return perm.addAttachment(plugin, name, value);
	}

	public PermissionAttachment addAttachment(Plugin plugin)
	{
		return perm.addAttachment(plugin);
	}

	public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value, int ticks)
	{
		return perm.addAttachment(plugin, name, value, ticks);
	}

	public PermissionAttachment addAttachment(Plugin plugin, int ticks)
	{
		return perm.addAttachment(plugin, ticks);
	}

	public void removeAttachment(PermissionAttachment attachment)
	{
		perm.removeAttachment(attachment);
	}

	public void recalculatePermissions()
	{
		perm.recalculatePermissions();
	}

	public void setOp(boolean value)
	{
		this.op = value;
		perm.recalculatePermissions();
	}

	public Set<PermissionAttachmentInfo> getEffectivePermissions()
	{
		return perm.getEffectivePermissions();
	}

	public GameMode getGameMode()
	{
		return mode;
	}

	public void setGameMode(GameMode mode)
	{
		if(mode == null)
		{
			throw new IllegalArgumentException("Mode cannot be null");
		}

		this.mode = mode;
	}

	@Override
	public net.minecraft.entity.player.EntityPlayer getHandle()
	{
		return (net.minecraft.entity.player.EntityPlayer) entity;
	}

	public void setHandle(final net.minecraft.entity.player.EntityPlayer entity)
	{
		super.setHandle(entity);
		if(this.inventory != null)
			this.inventory = new CraftInventoryPlayer(this);
	}

	@Override
	public String toString()
	{
		return "CraftHumanEntity{" + "id=" + getEntityId() + "name=" + getName() + '}';
	}

	public InventoryView getOpenInventory()
	{
		return ((IMixinContainer) getHandle().openContainer).getBukkitView();
	}

	public InventoryView openInventory(Inventory inventory)
	{
		if(!(getHandle() instanceof net.minecraft.entity.player.EntityPlayerMP)) return null;
		net.minecraft.entity.player.EntityPlayerMP player = (net.minecraft.entity.player.EntityPlayerMP) getHandle();
		InventoryType type = inventory.getType();
		net.minecraft.inventory.Container formerContainer = getHandle().openContainer;
		// TODO: Should we check that it really IS a CraftInventory first?
		CraftInventory craftinv = (CraftInventory) inventory;
		switch(type)
		{
		case PLAYER:
		case CHEST:
		case ENDER_CHEST:
			getHandle().displayGUIChest(craftinv.getInventory());
			break;
		case DISPENSER:
			if(craftinv.getInventory() instanceof net.minecraft.tileentity.TileEntityDispenser)
			{
				getHandle().func_146102_a((net.minecraft.tileentity.TileEntityDispenser) craftinv.getInventory());
			}
			else
			{
				openCustomInventory(inventory, player, 3);
			}
			break;
		case FURNACE:
			if(craftinv.getInventory() instanceof net.minecraft.tileentity.TileEntityFurnace)
			{
				getHandle().func_146101_a((net.minecraft.tileentity.TileEntityFurnace) craftinv.getInventory());
			}
			else
			{
				openCustomInventory(inventory, player, 2);
			}
			break;
		case WORKBENCH:
			openCustomInventory(inventory, player, 1);
			break;
		case BREWING:
			if(craftinv.getInventory() instanceof net.minecraft.tileentity.TileEntityBrewingStand)
			{
				getHandle().func_146098_a((net.minecraft.tileentity.TileEntityBrewingStand) craftinv.getInventory());
			}
			else
			{
				openCustomInventory(inventory, player, 5);
			}
			break;
		case ENCHANTING:
			openCustomInventory(inventory, player, 4);
			break;
		case HOPPER:
			if(craftinv.getInventory() instanceof net.minecraft.tileentity.TileEntityHopper)
			{
				getHandle().func_146093_a((net.minecraft.tileentity.TileEntityHopper) craftinv.getInventory());
			}
			else if(craftinv.getInventory() instanceof net.minecraft.entity.item.EntityMinecartHopper)
			{
				getHandle().displayGUIHopperMinecart((net.minecraft.entity.item.EntityMinecartHopper) craftinv.getInventory());
			}
			else
			{
				openCustomInventory(inventory, player, 9);
			}
			break;
		case CREATIVE:
		case CRAFTING:
			throw new IllegalArgumentException("Can't open a " + type + " inventory!");
		}
		if(getHandle().openContainer == formerContainer)
		{
			return null;
		}
		//TODO
//		getHandle().openContainer.checkReachable = false;
        return ((IMixinContainer) getHandle().openContainer).getBukkitView();
	}

	private void openCustomInventory(Inventory inventory, net.minecraft.entity.player.EntityPlayerMP player, int windowType)
	{
		if (player.playerNetServerHandler == null) return;
		net.minecraft.inventory.Container container = new CraftContainer(inventory, this, ((IMixinPlayerMP) player).nextContainerCounter());

		container = CraftEventFactory.callInventoryOpenEvent(player, container);
		if(container == null) return;

		InventoryView view = ((IMixinContainer) container).getBukkitView();
		if(view == null) return;

		String title = view.getTitle();
		int size = view.getTopInventory().getSize();

		player.playerNetServerHandler.sendPacket(new net.minecraft.network.play.server.S2DPacketOpenWindow(container.windowId, windowType, title, size, true));
		getHandle().openContainer = container;
		getHandle().openContainer.addCraftingToCrafters(player);
	}

	public InventoryView openWorkbench(Location location, boolean force)
	{
		if (!force) {
			Block block = location.getBlock();
			if (block.getType() != Material.WORKBENCH) {
				return null;
			}
		}
		if (location == null) {
			location = getLocation();
		}
		getHandle().displayGUIWorkbench(location.getBlockX(), location.getBlockY(), location.getBlockZ());
		if (force) {
			// TODO
//			getHandle().openContainer.checkReachable = false;
		}
		return ((IMixinContainer) getHandle().openContainer).getBukkitView();
	}

	public InventoryView openEnchanting(Location location, boolean force)
	{
		if (!force) {
			Block block = location.getBlock();
			if (block.getType() != Material.ENCHANTMENT_TABLE) {
				return null;
			}
		}
		if (location == null) {
			location = getLocation();
		}
		getHandle().displayGUIEnchantment(location.getBlockX(), location.getBlockY(), location.getBlockZ(), null);
		if (force) {
			// TODO
//			getHandle().openContainer.checkReachable = false;
		}
		return ((IMixinContainer) getHandle().openContainer).getBukkitView();
	}

	public void openInventory(InventoryView inventory)
	{
		if (!(getHandle() instanceof net.minecraft.entity.player.EntityPlayerMP)) return; // TODO: NPC support?
		if (((net.minecraft.entity.player.EntityPlayerMP) getHandle()).playerNetServerHandler == null) return;
		if (getHandle().openContainer != getHandle().inventoryContainer) {
			// fire INVENTORY_CLOSE if one already open
			((net.minecraft.entity.player.EntityPlayerMP)getHandle()).playerNetServerHandler.processCloseWindow(new net.minecraft.network.play.client.C0DPacketCloseWindow(getHandle().openContainer.windowId));
		}
		net.minecraft.entity.player.EntityPlayerMP player = (net.minecraft.entity.player.EntityPlayerMP) getHandle();
		net.minecraft.inventory.Container container;
		if (inventory instanceof CraftInventoryView) {
			container = ((CraftInventoryView) inventory).getHandle();
		} else {
			player.getNextWindowId();
			container = new CraftContainer(inventory, player.currentWindowId);
		}

		// Trigger an INVENTORY_OPEN event
		container = CraftEventFactory.callInventoryOpenEvent(player, container);
		if (container == null) {
			return;
		}

		// Now open the window
		InventoryType type = inventory.getType();
		int windowType = CraftContainer.getNotchInventoryType(type);
		String title = inventory.getTitle();
		int size = inventory.getTopInventory().getSize();
		player.playerNetServerHandler.sendPacket(new net.minecraft.network.play.server.S2DPacketOpenWindow(container.windowId, windowType, title, size, false));
		player.openContainer = container;
		player.openContainer.addCraftingToCrafters(player);
	}

	public void closeInventory()
	{
		net.minecraft.entity.player.EntityPlayer player = getHandle();
		if(player instanceof EntityPlayerMP && ((EntityPlayerMP) player).playerNetServerHandler == null)
			return;
		player.closeScreen();
	}

	public boolean isBlocking()
	{
		return getHandle().isBlocking();
	}

	public boolean setWindowProperty(InventoryView.Property prop, int value)
	{
		return false;
	}

	public int getExpToLevel()
	{
		return getHandle().xpBarCap();
	}
}