package openblocks.common.item;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import openblocks.OpenBlocks;
import openblocks.api.IPaintableBlock;
import openblocks.common.block.BlockCanvas;
import openmods.infobook.BookDocumentation;
import openmods.utils.ColorUtils;
import openmods.utils.ColorUtils.ColorMeta;
import openmods.utils.ItemUtils;
import openmods.utils.render.PaintUtils;
@BookDocumentation(customName = "paintbrush", hasVideo = true)
public class ItemPaintBrush extends Item {
private static final int SINGLE_COLOR_THRESHOLD = 16;
private static final String TAG_COLOR = "color";
public static final int MAX_USES = 24;
public IIcon paintIcon;
public ItemPaintBrush() {
setCreativeTab(OpenBlocks.tabOpenBlocks);
setMaxStackSize(1);
setMaxDamage(MAX_USES);
setNoRepair();
}
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public void addInformation(ItemStack itemStack, EntityPlayer player, List list, boolean par4) {
Integer color = getColorFromStack(itemStack);
if (color != null) list.add(String.format("#%06X", color));
}
@SideOnly(Side.CLIENT)
@Override
public boolean requiresMultipleRenderPasses() {
return true;
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister registry) {
super.registerIcons(registry);
paintIcon = registry.registerIcon("openblocks:paintbrush_paint");
}
@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List list) {
list.add(new ItemStack(this));
for (ColorMeta color : ColorUtils.getAllColors()) {
list.add(createStackWithColor(color.rgb));
}
}
public static ItemStack createStackWithColor(int color) {
ItemStack stack = new ItemStack(OpenBlocks.Items.paintBrush);
NBTTagCompound tag = ItemUtils.getItemTag(stack);
tag.setInteger(TAG_COLOR, color);
return stack;
}
@Override
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {
Integer color = getColorFromStack(stack);
if (stack.getItemDamage() > getMaxDamage() || color == null) return true;
if (PaintUtils.instance.isAllowedToReplace(world, x, y, z)) {
BlockCanvas.replaceBlock(world, x, y, z);
}
final boolean changed;
if (player.isSneaking()) changed = tryRecolorBlock(world, x, y, z, color, ForgeDirection.VALID_DIRECTIONS);
else changed = tryRecolorBlock(world, x, y, z, color, ForgeDirection.getOrientation(side));
if (changed) {
world.playSoundAtEntity(player, "mob.slime.small", 0.1F, 0.8F);
if (!player.capabilities.isCreativeMode) {
if (stack.attemptDamageItem(1, player.getRNG())) {
final NBTTagCompound tag = ItemUtils.getItemTag(stack);
tag.removeTag(TAG_COLOR);
stack.setItemDamage(0);
}
}
}
return true;
}
private static boolean tryRecolorBlock(World world, int x, int y, int z, int rgb, ForgeDirection... sides) {
Block block = world.getBlock(x, y, z);
// first try RGB color...
if (block instanceof IPaintableBlock) {
IPaintableBlock canvas = (IPaintableBlock)block;
boolean result = false;
for (ForgeDirection dir : sides)
result |= canvas.recolourBlockRGB(world, x, y, z, dir, rgb);
return result;
}
// ...then try finding nearest vanilla one
final ColorMeta nearest = ColorUtils.findNearestColor(new ColorUtils.RGB(rgb), SINGLE_COLOR_THRESHOLD);
if (nearest != null) {
final int vanillaColorId = nearest.vanillaBlockId;
boolean result = false;
for (ForgeDirection dir : sides)
result |= block.recolourBlock(world, x, y, z, dir, vanillaColorId);
return result;
}
return false;
}
@Override
public boolean onBlockStartBreak(ItemStack itemstack, int X, int Y, int Z, EntityPlayer player) {
return false;
}
@Override
@SideOnly(Side.CLIENT)
public int getColorFromItemStack(ItemStack itemStack, int pass) {
if (pass == 1) {
Integer color = getColorFromStack(itemStack);
if (color != null) return color;
}
return 0xFFFFFF;
}
@Override
public IIcon getIconFromDamageForRenderPass(int dmg, int pass) {
return pass == 1? paintIcon : getIconFromDamage(dmg);
}
public static Integer getColorFromStack(ItemStack stack) {
if (stack.hasTagCompound()) {
NBTTagCompound tag = stack.getTagCompound();
if (tag.hasKey(TAG_COLOR)) { return tag.getInteger(TAG_COLOR); }
}
return null;
}
public static void setColor(ItemStack stack, int color) {
NBTTagCompound tag = ItemUtils.getItemTag(stack);
tag.setInteger(TAG_COLOR, color);
}
}