package com.minelittlepony.unicopia.item; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Nullable; import com.minelittlepony.unicopia.Predicates; import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.inventory.ContainerOfHolding; import com.minelittlepony.unicopia.inventory.InventoryOfHolding; import com.minelittlepony.unicopia.inventory.gui.GuiOfHolding; import com.minelittlepony.util.vector.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.init.SoundEvents; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.IInteractionObject; import net.minecraft.world.World; public class ItemOfHolding extends Item implements IMagicalItem { public ItemOfHolding(String domain, String name) { setCreativeTab(CreativeTabs.TRANSPORTATION); setTranslationKey(name); setRegistryName(domain, name); setMaxStackSize(1); } @Override public void addInformation(ItemStack stack, @Nullable World worldIn, List tooltip, ITooltipFlag flagIn) { super.addInformation(stack, worldIn, tooltip, flagIn); Map counts = new HashMap<>(); InventoryOfHolding.iterateContents(stack, (i, itemstack) -> { String name = itemstack.getDisplayName(); counts.put(name, counts.getOrDefault(name, 0) + itemstack.getCount()); return true; }); for (String name : counts.keySet()) { tooltip.add(String.format("%s x%d", name, counts.get(name))); } } @Override public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { if (!Predicates.MAGI.test(player)) { return super.onItemRightClick(world, player, hand); } ItemStack stack = player.getHeldItem(hand); if (player.isSneaking()) { RayTraceResult hit = VecHelper.getObjectMouseOver(player, 5, 0); if (hit != null) { if (hit.typeOfHit == RayTraceResult.Type.BLOCK) { BlockPos pos = hit.getBlockPos(); TileEntity tile = world.getTileEntity(pos); if (tile instanceof IInventory) { InventoryOfHolding inventory = InventoryOfHolding.getInventoryFromStack(stack); inventory.addBlockEntity(world, pos, (TileEntity & IInventory)tile); inventory.writeTostack(stack); inventory.closeInventory(player); return new ActionResult<>(EnumActionResult.SUCCESS, stack); } AxisAlignedBB box = new AxisAlignedBB(pos.offset(hit.sideHit)).grow(0.5); List itemsAround = world.getEntitiesInAABBexcluding(player, box, Predicates.ITEMS); if (itemsAround.size() > 0) { InventoryOfHolding inventory = InventoryOfHolding.getInventoryFromStack(stack); inventory.addItem((EntityItem)itemsAround.get(0)); inventory.writeTostack(stack); inventory.closeInventory(player); return new ActionResult<>(EnumActionResult.SUCCESS, stack); } } } return new ActionResult<>(EnumActionResult.FAIL, stack); } IInteractionObject inventory = new Inventory(stack); if (UClient.isClientSide() && player instanceof EntityPlayerSP) { Minecraft.getMinecraft().displayGuiScreen(new GuiOfHolding(inventory)); player.playSound(SoundEvents.BLOCK_ENDERCHEST_OPEN, 0.5F, 1); } else { player.displayGui(inventory); } return new ActionResult<>(EnumActionResult.SUCCESS, stack); } @Override public boolean hasInnerSpace() { return true; } public class Inventory implements IInteractionObject { private String customname = null; Inventory(ItemStack stack) { if (stack.hasDisplayName()) { customname = stack.getDisplayName(); } } @Override public String getName() { return "unicopi.gui.title.itemofholding"; } @Override public boolean hasCustomName() { return customname != null; } @Override public ITextComponent getDisplayName() { if (hasCustomName()) { return new TextComponentString(customname); } return new TextComponentTranslation(getName()); } @Override public Container createContainer(InventoryPlayer playerInventory, EntityPlayer player) { return new ContainerOfHolding(player); } @Override public String getGuiID() { return "unicopia:itemofholding"; } } }