package mekanism.common.item; import java.util.List; import mekanism.api.EnumColor; import mekanism.api.IConfigCardAccess.ISpecialConfigData; import mekanism.api.util.CapabilityUtils; import mekanism.common.base.IRedstoneControl; import mekanism.common.base.IRedstoneControl.RedstoneControl; import mekanism.common.base.ISideConfiguration; import mekanism.common.capabilities.Capabilities; import mekanism.common.tile.TileEntityContainerBlock; import mekanism.common.util.ItemDataUtils; import mekanism.common.util.LangUtils; import mekanism.common.util.SecurityUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; public class ItemConfigurationCard extends ItemMekanism { public ItemConfigurationCard() { super(); setMaxStackSize(1); } @Override public void addInformation(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) { super.addInformation(itemstack, entityplayer, list, flag); list.add(EnumColor.GREY + LangUtils.localize("gui.data") + ": " + EnumColor.INDIGO + LangUtils.localize(getDataType(itemstack))); } @Override public EnumActionResult onItemUseFirst(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, EnumHand hand) { if(!world.isRemote) { TileEntity tileEntity = world.getTileEntity(pos); if(CapabilityUtils.hasCapability(tileEntity, Capabilities.CONFIG_CARD_CAPABILITY, side)) { if(SecurityUtils.canAccess(player, tileEntity)) { if(player.isSneaking()) { NBTTagCompound data = getBaseData(tileEntity); if(CapabilityUtils.hasCapability(tileEntity, Capabilities.SPECIAL_CONFIG_DATA_CAPABILITY, side)) { ISpecialConfigData special = CapabilityUtils.getCapability(tileEntity, Capabilities.SPECIAL_CONFIG_DATA_CAPABILITY, side); data = special.getConfigurationData(data); } if(data != null) { data.setString("dataType", getNameFromTile(tileEntity, side)); setData(stack, data); player.addChatMessage(new TextComponentString(EnumColor.DARK_BLUE + "[Mekanism] " + EnumColor.GREY + LangUtils.localize("tooltip.configurationCard.got").replaceAll("%s", EnumColor.INDIGO + LangUtils.localize(data.getString("dataType")) + EnumColor.GREY))); } return EnumActionResult.SUCCESS; } else if(getData(stack) != null) { if(getNameFromTile(tileEntity, side).equals(getDataType(stack))) { setBaseData(getData(stack), tileEntity); if(CapabilityUtils.hasCapability(tileEntity, Capabilities.SPECIAL_CONFIG_DATA_CAPABILITY, side)) { ISpecialConfigData special = CapabilityUtils.getCapability(tileEntity, Capabilities.SPECIAL_CONFIG_DATA_CAPABILITY, side); special.setConfigurationData(getData(stack)); } player.addChatMessage(new TextComponentString(EnumColor.DARK_BLUE + "[Mekanism] " + EnumColor.DARK_GREEN + LangUtils.localize("tooltip.configurationCard.set").replaceAll("%s", EnumColor.INDIGO + LangUtils.localize(getDataType(stack)) + EnumColor.DARK_GREEN))); setData(stack, null); } else { player.addChatMessage(new TextComponentString(EnumColor.DARK_BLUE + "[Mekanism] " + EnumColor.RED + LangUtils.localize("tooltip.configurationCard.unequal") + ".")); } return EnumActionResult.SUCCESS; } } else { SecurityUtils.displayNoAccess(player); } } } return EnumActionResult.PASS; } private NBTTagCompound getBaseData(TileEntity tile) { NBTTagCompound nbtTags = new NBTTagCompound(); if(tile instanceof IRedstoneControl) { nbtTags.setInteger("controlType", ((IRedstoneControl)tile).getControlType().ordinal()); } if(tile instanceof ISideConfiguration) { ((ISideConfiguration)tile).getConfig().write(nbtTags); ((ISideConfiguration)tile).getEjector().write(nbtTags); } return nbtTags; } private void setBaseData(NBTTagCompound nbtTags, TileEntity tile) { if(tile instanceof IRedstoneControl) { ((IRedstoneControl)tile).setControlType(RedstoneControl.values()[nbtTags.getInteger("controlType")]); } if(tile instanceof ISideConfiguration) { ((ISideConfiguration)tile).getConfig().read(nbtTags); ((ISideConfiguration)tile).getEjector().read(nbtTags); } } private String getNameFromTile(TileEntity tile, EnumFacing side) { String ret = Integer.toString(tile.hashCode()); if(tile instanceof TileEntityContainerBlock) { ret = tile.getBlockType().getUnlocalizedName() + "." + ((TileEntityContainerBlock)tile).fullName + ".name"; } if(CapabilityUtils.hasCapability(tile, Capabilities.SPECIAL_CONFIG_DATA_CAPABILITY, side)) { ISpecialConfigData special = CapabilityUtils.getCapability(tile, Capabilities.SPECIAL_CONFIG_DATA_CAPABILITY, side); ret = special.getDataType(); } return ret; } public void setData(ItemStack itemstack, NBTTagCompound data) { if(data != null) { ItemDataUtils.setCompound(itemstack, "data", data); } else { ItemDataUtils.removeData(itemstack, "data"); } } public NBTTagCompound getData(ItemStack itemstack) { NBTTagCompound data = ItemDataUtils.getCompound(itemstack, "data"); if(data.hasNoTags()) { return null; } else { return ItemDataUtils.getCompound(itemstack, "data"); } } public String getDataType(ItemStack itemstack) { NBTTagCompound data = getData(itemstack); if(data != null) { return data.getString("dataType"); } return "gui.none"; } }