Newer
Older
ultramine_bukkit / src / main / java / org / bukkit / craftbukkit / entity / CraftHumanEntity.java
@vlad20012 vlad20012 on 24 Feb 2017 11 KB initial
package org.bukkit.craftbukkit.entity;

import net.minecraft.entity.player.EntityPlayerMP;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.inventory.CraftInventory;
import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer;
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 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()
	{ //TODO
//        return getHandle().openContainer.getBukkitView();
		throw new UnsupportedOperationException();
	}

	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;
		}
//        getHandle().openContainer.checkReachable = false;
//        return getHandle().openContainer.getBukkitView();

		throw new UnsupportedOperationException(); //TODO
	}

	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, player.nextContainerCounter());
//
//        container = CraftEventFactory.callInventoryOpenEvent(player, container);
//        if(container == null) return;
//
//        String title = container.getBukkitView().getTitle();
//        int size = container.getBukkitView().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);

		throw new UnsupportedOperationException(); //TODO
	}

	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) {
//            getHandle().openContainer.checkReachable = false;
//        }
//        return getHandle().openContainer.getBukkitView();

		throw new UnsupportedOperationException(); //TODO
	}

	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) {
//            getHandle().openContainer.checkReachable = false;
//        }
//        return getHandle().openContainer.getBukkitView();

		throw new UnsupportedOperationException(); //TODO
	}

	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);

		throw new UnsupportedOperationException(); //TODO
	}

	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();
	}
}