summaryrefslogtreecommitdiff
path: root/src/main/java/darkknight/jewelrycraft/item
diff options
context:
space:
mode:
authorOnyxDarkKnight <sor1n.iliutza16@gmail.com>2015-03-23 14:51:06 +0000
committerOnyxDarkKnight <sor1n.iliutza16@gmail.com>2015-03-23 14:51:06 +0000
commit6312636fd9a4d0f56dc7c9ff474a99d879bcb4e9 (patch)
treee3279753210bfb169a00cd3f146a80baf624150e /src/main/java/darkknight/jewelrycraft/item
parente86949a1ad3269ec66c9de65e2c92f5e66251411 (diff)
Reworked the whole repo.
Diffstat (limited to 'src/main/java/darkknight/jewelrycraft/item')
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemBaseJewelry.java261
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemBracelet.java40
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemClayMolds.java87
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemCrystal.java113
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemEarrings.java40
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemGuide.java32
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemList.java57
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemMolds.java87
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemMoltenMetal.java133
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemMoltenMetalBucket.java225
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemNecklace.java40
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemRing.java40
-rw-r--r--src/main/java/darkknight/jewelrycraft/item/ItemThiefGloves.java165
13 files changed, 1320 insertions, 0 deletions
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemBaseJewelry.java b/src/main/java/darkknight/jewelrycraft/item/ItemBaseJewelry.java
new file mode 100644
index 0000000..cb38b76
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemBaseJewelry.java
@@ -0,0 +1,261 @@
+package darkknight.jewelrycraft.item;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import javax.imageio.ImageIO;
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.TextureManager;
+import net.minecraft.client.resources.IResourceManager;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StatCollector;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import darkknight.jewelrycraft.JewelrycraftMod;
+import darkknight.jewelrycraft.effects.ModifierEffects;
+import darkknight.jewelrycraft.util.JewelryNBT;
+
+public abstract class ItemBaseJewelry extends Item
+{
+ public ItemBaseJewelry()
+ {
+ super();
+ setMaxStackSize(1);
+ setCreativeTab(JewelrycraftMod.jewelrycraft);
+ }
+
+ public boolean requiresMultipleRenderPasses()
+ {
+ return true;
+ }
+
+ @SideOnly (Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass)
+ {
+ try{
+ return color(stack, pass);
+ }
+ catch(IOException e){
+ e.printStackTrace();
+ }
+ return 16777215;
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ * @throws IOException
+ */
+ public static int color(ItemStack stack, int pass) throws IOException
+ {
+ IResourceManager rm = Minecraft.getMinecraft().getResourceManager();
+ BufferedImage icon;
+ if (pass == 0 && stack != null && JewelryNBT.ingot(stack) != null && Item.getIdFromItem(JewelryNBT.ingot(stack).getItem()) > 0 && JewelryNBT.ingot(stack).getIconIndex() != null && JewelryNBT.ingotColor(stack) == 16777215){
+ ItemStack ingot = JewelryNBT.ingot(stack);
+ icon = ImageIO.read(rm.getResource(getLocation(ingot, stack, true)).getInputStream());
+ int height = icon.getHeight();
+ int width = icon.getWidth();
+ Map m = new HashMap();
+ for(int i = 0; i < width; i++)
+ for(int j = 0; j < height; j++){
+ int rgb = icon.getRGB(i, j);
+ int red = rgb >> 16 & 0xff;
+ int green = rgb >> 8 & 0xff;
+ int blue = rgb & 0xff;
+ int[] rgbArr = {red, green, blue};
+ int Cmax = Math.max(red, Math.max(green, blue));
+ int Cmin = Math.min(red, Math.min(green, blue));
+ if (!isGray(rgbArr)) m.put(rgb, (Cmax + Cmin) / 2);
+ }
+ int color = getMostCommonColour(m);
+ if (JewelryNBT.ingot(stack) != null && JewelryNBT.ingot(stack).getItem().getColorFromItemStack(JewelryNBT.ingot(stack), 1) != 16777215) JewelryNBT.addIngotColor(stack, JewelryNBT.ingot(stack).getItem().getColorFromItemStack(JewelryNBT.ingot(stack), 1));
+ else JewelryNBT.addIngotColor(stack, color);
+ }else if (pass == 1 && stack != null && JewelryNBT.gem(stack) != null && JewelryNBT.gem(stack).getIconIndex() != null && JewelryNBT.gem(stack) != null){
+ ItemStack gem = JewelryNBT.gem(stack);
+ icon = ImageIO.read(rm.getResource(getLocation(gem, stack, true)).getInputStream());
+ int height = icon.getHeight();
+ int width = icon.getWidth();
+ Map m = new HashMap();
+ for(int i = 0; i < width; i++)
+ for(int j = 0; j < height; j++){
+ int rgb = icon.getRGB(i, j);
+ int red = rgb >> 16 & 0xff;
+ int green = rgb >> 8 & 0xff;
+ int blue = rgb & 0xff;
+ int[] rgbArr = {red, green, blue};
+ int Cmax = Math.max(red, Math.max(green, blue));
+ int Cmin = Math.min(red, Math.min(green, blue));
+ if (!isGray(rgbArr)) m.put(rgb, (Cmax + Cmin) / 2);
+ }
+ int color = getMostCommonColour(m);
+ if (JewelryNBT.gem(stack).getItem().getColorFromItemStack(JewelryNBT.gem(stack), 1) == 16777215) JewelryNBT.addGemColor(stack, color);
+ else JewelryNBT.addGemColor(stack, JewelryNBT.gem(stack).getItem().getColorFromItemStack(JewelryNBT.gem(stack), 1));
+ }
+ if (pass == 0 && JewelryNBT.ingot(stack) != null) return JewelryNBT.ingotColor(stack);
+ if (pass == 1 && JewelryNBT.gem(stack) != null) return JewelryNBT.gemColor(stack);
+ else if (JewelryNBT.ingot(stack) != null) return JewelryNBT.ingotColor(stack);
+ return 16777215;
+ }
+
+ /**
+ * @param item
+ * @param stack
+ * @param changeMeta
+ * @return
+ */
+ public static ResourceLocation getLocation(ItemStack item, ItemStack stack, boolean changeMeta)
+ {
+ String domain = "";
+ String texture;
+ if (changeMeta && (Item.getIdFromItem(item.getItem()) == Block.getIdFromBlock(Blocks.stained_glass) || Item.getIdFromItem(item.getItem()) == Block.getIdFromBlock(Blocks.stained_hardened_clay) || Item.getIdFromItem(item.getItem()) == Block.getIdFromBlock(Blocks.wool) || Item.getIdFromItem(item.getItem()) == Block.getIdFromBlock(Blocks.carpet))) item.setItemDamage(15 - item.getItemDamage());
+ IIcon itemIcon = item.getItem().getIcon(item, 0);
+ String iconName = itemIcon.getIconName();
+ if (iconName.substring(0, iconName.indexOf(":") + 1) != "") domain = iconName.substring(0, iconName.indexOf(":") + 1).replace(":", " ").trim();
+ else domain = "minecraft";
+ texture = iconName.substring(iconName.lastIndexOf(":") + 1) + ".png";
+ ResourceLocation textureLocation = null;
+ TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager();
+ if (texturemanager.getResourceLocation(item.getItemSpriteNumber()).toString().contains("items")) textureLocation = new ResourceLocation(domain.toLowerCase(), "textures/items/" + texture);
+ else textureLocation = new ResourceLocation(domain.toLowerCase(), "textures/blocks/" + texture);
+ return textureLocation;
+ }
+
+ /**
+ * @param map
+ * @return
+ */
+ public static int getMostCommonColour(Map map)
+ {
+ List list = new LinkedList(map.entrySet());
+ Collections.sort(list, new Comparator(){
+ public int compare(Object o1, Object o2)
+ {
+ return ((Comparable)((Map.Entry)o1).getValue()).compareTo(((Map.Entry)o2).getValue());
+ }
+ });
+ Map.Entry me = (Map.Entry)list.get(list.size() - 1);
+ for(int i = 0; i < list.size(); i++){
+ float alpha = Float.valueOf(list.get(i).toString().split("=")[1]);
+ if (alpha < 180) me = (Map.Entry)list.get(i);
+ }
+ int rgb = (Integer)me.getKey();
+ return rgb;
+ }
+
+ /**
+ * @param rgbArr
+ * @return
+ */
+ public static boolean isGray(int[] rgbArr)
+ {
+ int rgbSum = rgbArr[0] + rgbArr[1] + rgbArr[2];
+ if (rgbSum > 0 && rgbSum < 256 * 3) return false;
+ return true;
+ }
+
+ /**
+ * @param stack
+ * @return
+ */
+ public String getItemStackDisplayName(ItemStack stack)
+ {
+ if (JewelryNBT.ingot(stack) != null && Item.getIdFromItem(JewelryNBT.ingot(stack).getItem()) > 0) return JewelryNBT.ingot(stack).getDisplayName().replace("Ingot", " ").trim() + " " + ("" + StatCollector.translateToLocal(getUnlocalizedNameInefficiently(stack) + ".name")).trim();
+ return ("" + StatCollector.translateToLocal(getUnlocalizedNameInefficiently(stack) + ".name")).trim();
+ }
+
+ /**
+ * allows items to add custom lines of information to the mouseover description.
+ *
+ * @param stack
+ * @param player
+ * @param list
+ * @param par4
+ */
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4)
+ {
+ if (stack.hasTagCompound() && par4){
+ ItemStack ingot = JewelryNBT.ingot(stack);
+ if (ingot != null && Item.getIdFromItem(JewelryNBT.ingot(stack).getItem()) > 0) list.add("Ingot: " + EnumChatFormatting.YELLOW + ingot.getDisplayName());
+ ItemStack gem = JewelryNBT.gem(stack);
+ if (gem != null) list.add("Gem: " + EnumChatFormatting.BLUE + gem.getDisplayName());
+ ArrayList<ItemStack> modifier = JewelryNBT.modifier(stack);
+ if (!modifier.isEmpty()) list.add("Modifiers: ");
+ for(int i = 0; i < modifier.size(); i++)
+ list.add(EnumChatFormatting.DARK_PURPLE + modifier.get(i).getDisplayName() + " x" + modifier.get(i).stackSize);
+ }
+ }
+
+ /**
+ * @param stack
+ * @param player
+ */
+ public void action(ItemStack stack, EntityPlayer player)
+ {
+ for(ModifierEffects mod: ModifierEffects.getEffects())
+ mod.action(stack, player, this);
+ }
+
+ /**
+ * @param item
+ * @param player
+ * @param source
+ * @return
+ */
+ public boolean onPlayerAttackedCacellable(ItemStack item, EntityPlayer player, DamageSource source, float amount)
+ {
+ for(ModifierEffects mod: ModifierEffects.getEffects())
+ return mod.onPlayerAttackedCacellable(item, player, source, this, amount);
+ return false;
+ }
+
+ /**
+ * @param item
+ * @param player
+ * @param target
+ * @return
+ */
+ public boolean onEntityAttackedCacellable(ItemStack item, EntityPlayer player, Entity target, float amount)
+ {
+ for(ModifierEffects mod: ModifierEffects.getEffects())
+ return mod.onEntityAttackedCacellable(item, player, target, this, amount);
+ return false;
+ }
+
+ /**
+ * @param item
+ * @param player
+ * @param source
+ * @return
+ */
+ public void onPlayerAttacked(ItemStack item, EntityPlayer player, DamageSource source, float amount)
+ {
+ for(ModifierEffects mod: ModifierEffects.getEffects()) mod.onPlayerAttacked(item, player, source, this, amount);
+ }
+
+ /**
+ * @param item
+ * @param player
+ * @param target
+ * @return
+ */
+ public void onEntityAttacked(ItemStack item, EntityPlayer player, Entity target, float amount)
+ {
+ for(ModifierEffects mod: ModifierEffects.getEffects()) mod.onEntityAttacked(item, player, target, this, amount);
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemBracelet.java b/src/main/java/darkknight/jewelrycraft/item/ItemBracelet.java
new file mode 100644
index 0000000..b754186
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemBracelet.java
@@ -0,0 +1,40 @@
+package darkknight.jewelrycraft.item;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import darkknight.jewelrycraft.util.JewelryNBT;
+
+public class ItemBracelet extends ItemBaseJewelry
+{
+ public IIcon gem;
+
+ /**
+ *
+ */
+ public ItemBracelet()
+ {}
+
+ /**
+ * @param iconRegister
+ */
+ @Override
+ public void registerIcons(IIconRegister iconRegister)
+ {
+ itemIcon = iconRegister.registerIcon("jewelrycraft:bracelet");
+ gem = iconRegister.registerIcon("jewelrycraft:jewelBracelet");
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ */
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass)
+ {
+ if (pass == 0) return itemIcon;
+ if (pass == 1 && JewelryNBT.gem(stack) != null) return gem;
+ return itemIcon;
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemClayMolds.java b/src/main/java/darkknight/jewelrycraft/item/ItemClayMolds.java
new file mode 100644
index 0000000..9f99857
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemClayMolds.java
@@ -0,0 +1,87 @@
+package darkknight.jewelrycraft.item;
+
+import java.util.List;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MathHelper;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class ItemClayMolds extends Item
+{
+ /** List of molds color names */
+ public static final String[] moldsItemNames = new String[]{"clayIngot", "clayRing", "clayNecklace", "clayBracelet", "clayEarrings"};
+ @SideOnly (Side.CLIENT)
+ private IIcon[] moldsIcons;
+
+ /**
+ *
+ */
+ public ItemClayMolds()
+ {
+ super();
+ setHasSubtypes(true);
+ setMaxDamage(0);
+ setMaxStackSize(1);
+ }
+
+ /**
+ * @param par1
+ * @return
+ */
+ @Override
+ @SideOnly (Side.CLIENT)
+ /**
+ * Gets an icon index based on an item's damage value
+ */
+ public IIcon getIconFromDamage(int par1)
+ {
+ int j = MathHelper.clamp_int(par1, 0, moldsItemNames.length - 1);
+ return moldsIcons[j];
+ }
+
+ /**
+ * Returns the unlocalized name of this item. This version accepts an ItemStack so different stacks can have different names based on their damage or NBT.
+ *
+ * @param par1ItemStack
+ * @return
+ */
+ @Override
+ public String getUnlocalizedName(ItemStack par1ItemStack)
+ {
+ int i = MathHelper.clamp_int(par1ItemStack.getItemDamage(), 0, moldsItemNames.length - 1);
+ return super.getUnlocalizedName() + "." + moldsItemNames[i];
+ }
+
+ /**
+ * @param par1
+ * @param par2CreativeTabs
+ * @param par3List
+ */
+ @Override
+ @SuppressWarnings ({"unchecked", "rawtypes"})
+ @SideOnly (Side.CLIENT)
+ /**
+ * returns a list of items with the same ID, but different meta (eg: molds returns 16 items)
+ */
+ public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List)
+ {
+ for(int j = 0; j < moldsItemNames.length; ++j)
+ par3List.add(new ItemStack(par1, 1, j));
+ }
+
+ /**
+ * @param par1IconRegister
+ */
+ @Override
+ @SideOnly (Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister)
+ {
+ moldsIcons = new IIcon[moldsItemNames.length];
+ for(int i = 0; i < moldsItemNames.length; ++i)
+ moldsIcons[i] = par1IconRegister.registerIcon("jewelrycraft:" + moldsItemNames[i] + getIconString());
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemCrystal.java b/src/main/java/darkknight/jewelrycraft/item/ItemCrystal.java
new file mode 100644
index 0000000..ca6b58d
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemCrystal.java
@@ -0,0 +1,113 @@
+package darkknight.jewelrycraft.item;
+
+import java.util.List;
+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.util.IIcon;
+import net.minecraft.world.World;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class ItemCrystal extends Item
+{
+ public IIcon overlay;
+ public static final int[] dyeColors = new int[]{1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 11250603, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320};
+
+ /**
+ *
+ */
+ public ItemCrystal()
+ {
+ super();
+ setHasSubtypes(true);
+ setMaxDamage(0);
+ }
+
+ /**
+ * @param iconRegister
+ */
+ @Override
+ public void registerIcons(IIconRegister iconRegister)
+ {
+ itemIcon = iconRegister.registerIcon("jewelrycraft:crystal");
+ overlay = iconRegister.registerIcon("jewelrycraft:crystalOverlay");
+ }
+
+ /**
+ * @return
+ */
+ @Override
+ public boolean requiresMultipleRenderPasses()
+ {
+ return true;
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ */
+ @Override
+ @SideOnly (Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass)
+ {
+ if (pass == 1 && getDamage(stack) != 16) return dyeColors[getDamage(stack)];
+ return 16777215;
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ */
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass)
+ {
+ return pass == 0 ? itemIcon : overlay;
+ }
+
+ /**
+ * @param stack
+ * @param player
+ * @param world
+ * @param i
+ * @param j
+ * @param k
+ * @param side
+ * @param par8
+ * @param par9
+ * @param par10
+ * @return
+ */
+ @Override
+ public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int i, int j, int k, int side, float par8, float par9, float par10)
+ {
+ return true;
+ }
+
+ /**
+ * @param stack
+ * @return
+ */
+ @Override
+ public String getUnlocalizedName(ItemStack stack)
+ {
+ return super.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ /**
+ * @param par1
+ * @param par2CreativeTabs
+ * @param par3List
+ */
+ @Override
+ @SuppressWarnings ({"unchecked", "rawtypes"})
+ public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List)
+ {
+ for(int j = 0; j < 16; ++j)
+ par3List.add(new ItemStack(par1, 1, j));
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemEarrings.java b/src/main/java/darkknight/jewelrycraft/item/ItemEarrings.java
new file mode 100644
index 0000000..2321df0
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemEarrings.java
@@ -0,0 +1,40 @@
+package darkknight.jewelrycraft.item;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import darkknight.jewelrycraft.util.JewelryNBT;
+
+public class ItemEarrings extends ItemBaseJewelry
+{
+ public IIcon gem;
+
+ /**
+ *
+ */
+ public ItemEarrings()
+ {}
+
+ /**
+ * @param iconRegister
+ */
+ @Override
+ public void registerIcons(IIconRegister iconRegister)
+ {
+ itemIcon = iconRegister.registerIcon("jewelrycraft:earrings");
+ gem = iconRegister.registerIcon("jewelrycraft:jewelEarrings");
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ */
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass)
+ {
+ if (pass == 0) return itemIcon;
+ if (pass == 1 && JewelryNBT.gem(stack) != null) return gem;
+ return itemIcon;
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemGuide.java b/src/main/java/darkknight/jewelrycraft/item/ItemGuide.java
new file mode 100644
index 0000000..ed85dc4
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemGuide.java
@@ -0,0 +1,32 @@
+package darkknight.jewelrycraft.item;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import darkknight.jewelrycraft.JewelrycraftMod;
+
+public class ItemGuide extends Item
+{
+
+ /**
+ *
+ */
+ public ItemGuide()
+ {
+ super();
+ }
+
+ /**
+ * @param stack
+ * @param world
+ * @param player
+ * @return
+ */
+ @Override
+ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
+ {
+ if (world.isRemote) player.openGui(JewelrycraftMod.instance, 1, player.worldObj, 0, 0, 0);
+ return stack;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemList.java b/src/main/java/darkknight/jewelrycraft/item/ItemList.java
new file mode 100644
index 0000000..b9acd96
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemList.java
@@ -0,0 +1,57 @@
+package darkknight.jewelrycraft.item;
+
+import net.minecraft.item.Item;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.registry.GameRegistry;
+import darkknight.jewelrycraft.JewelrycraftMod;
+
+public class ItemList
+{
+ public static Item thiefGloves;
+ public static Item shadowIngot;
+ public static Item molds;
+ public static Item clayMolds;
+ public static Item crystal;
+ public static ItemRing ring;
+ public static ItemNecklace necklace;
+ public static ItemBracelet bracelet;
+ public static ItemEarrings earrings;
+ public static Item guide;
+ public static ItemMoltenMetalBucket bucket;
+ public static ItemMoltenMetal metal;
+ private static boolean isInitialized = false;
+
+ /**
+ * @param e
+ */
+ public static void preInit(FMLPreInitializationEvent e)
+ {
+ if (!isInitialized){
+ thiefGloves = new ItemThiefGloves().setUnlocalizedName("Jewelrycraft.thiefGloves").setTextureName("jewelrycraft:thiefGloves").setCreativeTab(JewelrycraftMod.jewelrycraft);
+ shadowIngot = new Item().setUnlocalizedName("Jewelrycraft.ingotShadow").setTextureName("jewelrycraft:ingotShadow").setCreativeTab(JewelrycraftMod.jewelrycraft);
+ molds = new ItemMolds().setUnlocalizedName("Jewelrycraft.mold").setTextureName("Mold").setCreativeTab(JewelrycraftMod.jewelrycraft);
+ clayMolds = new ItemClayMolds().setUnlocalizedName("Jewelrycraft.mold").setTextureName("Mold").setCreativeTab(JewelrycraftMod.jewelrycraft);
+ ring = (ItemRing)new ItemRing().setUnlocalizedName("Jewelrycraft.ring").setTextureName("jewelrycraft:ring");
+ necklace = (ItemNecklace)new ItemNecklace().setUnlocalizedName("Jewelrycraft.necklace").setTextureName("jewelrycraft:necklace");
+ bracelet = (ItemBracelet)new ItemBracelet().setUnlocalizedName("Jewelrycraft.bracelet").setTextureName("jewelrycraft:bracelet");
+ earrings = (ItemEarrings)new ItemEarrings().setUnlocalizedName("Jewelrycraft.earrings").setTextureName("jewelrycraft:earrings");
+ crystal = new ItemCrystal().setUnlocalizedName("Jewelrycraft.crystal").setTextureName("jewelrycraft:crystal").setCreativeTab(JewelrycraftMod.jewelrycraft);
+ guide = new ItemGuide().setUnlocalizedName("Jewelrycraft.guide").setTextureName("jewelrycraft:guide").setCreativeTab(JewelrycraftMod.jewelrycraft);
+ bucket = (ItemMoltenMetalBucket)new ItemMoltenMetalBucket().setUnlocalizedName("Jewelrycraft.bucket");
+ metal = (ItemMoltenMetal)new ItemMoltenMetal().setUnlocalizedName("Jewelrycraft.bucket");
+ GameRegistry.registerItem(thiefGloves, "thiefGloves");
+ GameRegistry.registerItem(shadowIngot, "shadowIngot");
+ GameRegistry.registerItem(molds, "molds");
+ GameRegistry.registerItem(clayMolds, "clayMolds");
+ GameRegistry.registerItem(ring, "ring");
+ GameRegistry.registerItem(necklace, "necklace");
+ GameRegistry.registerItem(bracelet, "bracelet");
+ GameRegistry.registerItem(earrings, "earrings");
+ GameRegistry.registerItem(crystal, "crystal");
+ GameRegistry.registerItem(guide, "guide");
+ GameRegistry.registerItem(bucket, "moltenMetalBucket");
+ GameRegistry.registerItem(metal, "moltenMetal");
+ isInitialized = true;
+ }
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemMolds.java b/src/main/java/darkknight/jewelrycraft/item/ItemMolds.java
new file mode 100644
index 0000000..106fcbe
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemMolds.java
@@ -0,0 +1,87 @@
+package darkknight.jewelrycraft.item;
+
+import java.util.List;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MathHelper;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class ItemMolds extends Item
+{
+ /** List of molds color names */
+ public static final String[] moldsItemNames = new String[]{"ingot", "ring", "necklace", "bracelet", "earrings"};
+ @SideOnly (Side.CLIENT)
+ private IIcon[] moldsIcons;
+
+ /**
+ *
+ */
+ public ItemMolds()
+ {
+ super();
+ setHasSubtypes(true);
+ setMaxDamage(0);
+ setMaxStackSize(1);
+ }
+
+ /**
+ * @param par1
+ * @return
+ */
+ @Override
+ @SideOnly (Side.CLIENT)
+ /**
+ * Gets an icon index based on an item's damage value
+ */
+ public IIcon getIconFromDamage(int par1)
+ {
+ int j = MathHelper.clamp_int(par1, 0, moldsItemNames.length - 1);
+ return moldsIcons[j];
+ }
+
+ /**
+ * Returns the unlocalized name of this item. This version accepts an ItemStack so different stacks can have different names based on their damage or NBT.
+ *
+ * @param par1ItemStack
+ * @return
+ */
+ @Override
+ public String getUnlocalizedName(ItemStack par1ItemStack)
+ {
+ int i = MathHelper.clamp_int(par1ItemStack.getItemDamage(), 0, moldsItemNames.length - 1);
+ return super.getUnlocalizedName() + "." + moldsItemNames[i];
+ }
+
+ /**
+ * @param par1
+ * @param par2CreativeTabs
+ * @param par3List
+ */
+ @Override
+ @SuppressWarnings ({"unchecked", "rawtypes"})
+ @SideOnly (Side.CLIENT)
+ /**
+ * returns a list of items with the same ID, but different meta (eg: molds returns 16 items)
+ */
+ public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List)
+ {
+ for(int j = 0; j < moldsItemNames.length; ++j)
+ par3List.add(new ItemStack(par1, 1, j));
+ }
+
+ /**
+ * @param par1IconRegister
+ */
+ @Override
+ @SideOnly (Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister)
+ {
+ moldsIcons = new IIcon[moldsItemNames.length];
+ for(int i = 0; i < moldsItemNames.length; ++i)
+ moldsIcons[i] = par1IconRegister.registerIcon("jewelrycraft:" + moldsItemNames[i] + getIconString());
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemMoltenMetal.java b/src/main/java/darkknight/jewelrycraft/item/ItemMoltenMetal.java
new file mode 100644
index 0000000..0638da7
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemMoltenMetal.java
@@ -0,0 +1,133 @@
+package darkknight.jewelrycraft.item;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import javax.imageio.ImageIO;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.client.resources.IResourceManager;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import darkknight.jewelrycraft.util.JewelryNBT;
+
+public class ItemMoltenMetal extends Item
+{
+
+ /**
+ *
+ */
+ public ItemMoltenMetal()
+ {
+ super();
+ setMaxStackSize(1);
+ }
+
+ /**
+ * @param iconRegister
+ */
+ @Override
+ public void registerIcons(IIconRegister iconRegister)
+ {
+ itemIcon = iconRegister.registerIcon("jewelrycraft:moltenMetalStill");
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ */
+ @Override
+ @SideOnly (Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass)
+ {
+ try{
+ return color(stack, pass);
+ }
+ catch(IOException e){
+ e.printStackTrace();
+ }
+ return 16777215;
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ * @throws IOException
+ */
+ public static int color(ItemStack stack, int pass) throws IOException
+ {
+ IResourceManager rm = Minecraft.getMinecraft().getResourceManager();
+ BufferedImage icon;
+ if (stack != null && JewelryNBT.ingot(stack) != null && Item.getIdFromItem(JewelryNBT.ingot(stack).getItem()) > 0 && JewelryNBT.ingot(stack).getIconIndex() != null && JewelryNBT.ingotColor(stack) == 16777215){
+ ResourceLocation ingot = ItemBaseJewelry.getLocation(JewelryNBT.ingot(stack), stack, false);
+ icon = ImageIO.read(rm.getResource(ingot).getInputStream());
+ int height = icon.getHeight();
+ int width = icon.getWidth();
+ Map m = new HashMap();
+ for(int i = 0; i < width; i++)
+ for(int j = 0; j < height; j++){
+ int rgb = icon.getRGB(i, j);
+ int red = rgb >> 16 & 0xff;
+ int green = rgb >> 8 & 0xff;
+ int blue = rgb & 0xff;
+ int[] rgbArr = {red, green, blue};
+ int Cmax = Math.max(red, Math.max(green, blue));
+ int Cmin = Math.min(red, Math.min(green, blue));
+ if (!isGray(rgbArr)) m.put(rgb, (Cmax + Cmin) / 2);
+ }
+ try{
+ int color = getMostCommonColour(m);
+ if (JewelryNBT.ingot(stack) != null && JewelryNBT.ingot(stack).getItem().getColorFromItemStack(JewelryNBT.ingot(stack), 1) != 16777215) JewelryNBT.addIngotColor(stack, JewelryNBT.ingot(stack).getItem().getColorFromItemStack(JewelryNBT.ingot(stack), 1));
+ else JewelryNBT.addIngotColor(stack, color);
+ }
+ catch(Exception e){
+ JewelryNBT.addIngotColor(stack, 16777215);
+ }
+ }
+ if (JewelryNBT.ingot(stack) != null) return JewelryNBT.ingotColor(stack);
+ return 0;
+ }
+
+ /**
+ * @param map
+ * @return
+ */
+ public static int getMostCommonColour(Map map)
+ {
+ List list = new LinkedList(map.entrySet());
+ Collections.sort(list, new Comparator(){
+ public int compare(Object o1, Object o2)
+ {
+ return ((Comparable)((Map.Entry)o1).getValue()).compareTo(((Map.Entry)o2).getValue());
+ }
+ });
+ Map.Entry me = (Map.Entry)list.get(list.size() - 1);
+ for(int i = 0; i < list.size(); i++){
+ float alpha = Float.valueOf(list.get(i).toString().split("=")[1]);
+ if (alpha < 180) me = (Map.Entry)list.get(i);
+ }
+ int rgb = (Integer)me.getKey();
+ return rgb;
+ }
+
+ /**
+ * @param rgbArr
+ * @return
+ */
+ public static boolean isGray(int[] rgbArr)
+ {
+ int rgbSum = rgbArr[0] + rgbArr[1] + rgbArr[2];
+ if (rgbSum > 0 && rgbSum < 256 * 3) return false;
+ return true;
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemMoltenMetalBucket.java b/src/main/java/darkknight/jewelrycraft/item/ItemMoltenMetalBucket.java
new file mode 100644
index 0000000..9365224
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemMoltenMetalBucket.java
@@ -0,0 +1,225 @@
+package darkknight.jewelrycraft.item;
+
+import java.io.IOException;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.FillBucketEvent;
+import cpw.mods.fml.common.eventhandler.Event;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import darkknight.jewelrycraft.JewelrycraftMod;
+import darkknight.jewelrycraft.block.BlockList;
+import darkknight.jewelrycraft.network.PacketSendLiquidData;
+import darkknight.jewelrycraft.util.JewelryNBT;
+
+public class ItemMoltenMetalBucket extends Item
+{
+ public IIcon liquid;
+
+ /**
+ *
+ */
+ public ItemMoltenMetalBucket()
+ {
+ maxStackSize = 1;
+ }
+
+ /**
+ * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
+ *
+ * @param stack
+ * @param par2World
+ * @param par3EntityPlayer
+ * @return
+ */
+ @Override
+ public ItemStack onItemRightClick(ItemStack stack, World par2World, EntityPlayer par3EntityPlayer)
+ {
+ boolean flag = BlockList.moltenMetal == Blocks.air;
+ MovingObjectPosition movingobjectposition = getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, flag);
+ if (movingobjectposition == null) return stack;
+ else{
+ FillBucketEvent event = new FillBucketEvent(par3EntityPlayer, stack, par2World, movingobjectposition);
+ if (MinecraftForge.EVENT_BUS.post(event)) return stack;
+ if (event.getResult() == Event.Result.ALLOW){
+ if (par3EntityPlayer.capabilities.isCreativeMode) return stack;
+ if (--stack.stackSize <= 0) return event.result;
+ if (!par3EntityPlayer.inventory.addItemStackToInventory(event.result)) par3EntityPlayer.dropPlayerItemWithRandomChoice(event.result, false);
+ return stack;
+ }
+ if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK){
+ int i = movingobjectposition.blockX;
+ int j = movingobjectposition.blockY;
+ int k = movingobjectposition.blockZ;
+ if (!par2World.canMineBlock(par3EntityPlayer, i, j, k)) return stack;
+ if (flag){
+ if (!par3EntityPlayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, stack)) return stack;
+ par2World.getBlock(i, j, k).getMaterial();
+ par2World.getBlockMetadata(i, j, k);
+ par2World.setBlockToAir(i, j, k);
+ return func_150910_a(stack, par3EntityPlayer, ItemList.bucket);
+ }else{
+ if (BlockList.moltenMetal == Blocks.air) return new ItemStack(Items.bucket);
+ if (movingobjectposition.sideHit == 0) --j;
+ if (movingobjectposition.sideHit == 1) ++j;
+ if (movingobjectposition.sideHit == 2) --k;
+ if (movingobjectposition.sideHit == 3) ++k;
+ if (movingobjectposition.sideHit == 4) --i;
+ if (movingobjectposition.sideHit == 5) ++i;
+ if (!par3EntityPlayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, stack)) return stack;
+ try{
+ if (tryPlaceContainedLiquid(par2World, i, j, k, stack) && !par3EntityPlayer.capabilities.isCreativeMode) return new ItemStack(Items.bucket);
+ }
+ catch(IOException e){
+ e.printStackTrace();
+ }
+ }
+ }
+ return stack;
+ }
+ }
+
+ /**
+ * @param p_150910_1_
+ * @param p_150910_2_
+ * @param p_150910_3_
+ * @return
+ */
+ private ItemStack func_150910_a(ItemStack p_150910_1_, EntityPlayer p_150910_2_, Item p_150910_3_)
+ {
+ if (p_150910_2_.capabilities.isCreativeMode) return p_150910_1_;
+ else if (--p_150910_1_.stackSize <= 0) return new ItemStack(p_150910_3_);
+ else{
+ if (!p_150910_2_.inventory.addItemStackToInventory(new ItemStack(p_150910_3_))) p_150910_2_.dropPlayerItemWithRandomChoice(new ItemStack(p_150910_3_, 1, 0), false);
+ return p_150910_1_;
+ }
+ }
+
+ /**
+ * Attempts to place the liquid contained inside the bucket.
+ *
+ * @param world
+ * @param x
+ * @param y
+ * @param z
+ * @param stack
+ * @return
+ * @throws IOException
+ */
+ public boolean tryPlaceContainedLiquid(World world, int x, int y, int z, ItemStack stack) throws IOException
+ {
+ if (BlockList.moltenMetal == Blocks.air) return false;
+ else{
+ Material material = world.getBlock(x, y, z).getMaterial();
+ boolean flag = !material.isSolid();
+ if (!world.isAirBlock(x, y, z) && !flag) return false;
+ else if (stack != null && JewelryNBT.ingot(stack) != null){
+ if (!world.isRemote && flag && !material.isLiquid()) world.func_147480_a(x, y, z, true);
+ int color = color(stack, 1);
+ JewelrycraftMod.saveData.setString(x + " " + y + " " + z + " " + world.provider.dimensionId, Item.getIdFromItem(JewelryNBT.ingot(stack).getItem()) + ":" + JewelryNBT.ingot(stack).getItemDamage() + ":" + color);
+ JewelrycraftMod.netWrapper.sendToAll(new PacketSendLiquidData(world.provider.dimensionId, x, y, z, Item.getIdFromItem(JewelryNBT.ingot(stack).getItem()), JewelryNBT.ingot(stack).getItemDamage(), color));
+ world.setBlock(x, y, z, BlockList.moltenMetal, 0, 3);
+ return true;
+ }else return false;
+ }
+ }
+
+ /**
+ * @param iconRegister
+ */
+ @Override
+ public void registerIcons(IIconRegister iconRegister)
+ {
+ itemIcon = iconRegister.registerIcon("bucket_empty");
+ liquid = iconRegister.registerIcon("jewelrycraft:bucketOverlay");
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ */
+ @Override
+ @SideOnly (Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass)
+ {
+ try{
+ return color(stack, pass);
+ }
+ catch(IOException e){
+ e.printStackTrace();
+ }
+ return 16777215;
+ }
+
+ /**
+ * @return
+ */
+ @Override
+ public boolean requiresMultipleRenderPasses()
+ {
+ return true;
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ */
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass)
+ {
+ if (pass == 0) return itemIcon;
+ if (pass == 1) return liquid;
+ return itemIcon;
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ * @throws IOException
+ */
+ public static int color(ItemStack stack, int pass) throws IOException
+ {
+ if (pass == 1) return ItemMoltenMetal.color(stack, pass);
+ return 16777215;
+ }
+
+ /**
+ * @param ingot
+ * @return
+ */
+ public ItemStack getModifiedItemStack(ItemStack ingot)
+ {
+ ItemStack itemstack = new ItemStack(this);
+ JewelryNBT.addMetal(itemstack, ingot);
+ return itemstack;
+ }
+
+ /**
+ * @param stack
+ * @return
+ */
+ @Override
+ public String getItemStackDisplayName(ItemStack stack)
+ {
+ if (JewelryNBT.ingot(stack) != null){
+ ItemStack ingot = JewelryNBT.ingot(stack);
+ if (Item.getIdFromItem(ingot.getItem()) == Block.getIdFromBlock(Blocks.stained_glass) || Item.getIdFromItem(ingot.getItem()) == Block.getIdFromBlock(Blocks.stained_hardened_clay) || Item.getIdFromItem(ingot.getItem()) == Block.getIdFromBlock(Blocks.wool) || Item.getIdFromItem(ingot.getItem()) == Block.getIdFromBlock(Blocks.carpet)) ingot.setItemDamage(15 - ingot.getItemDamage());
+ return StatCollector.translateToLocal(getUnlocalizedNameInefficiently(stack) + ".name").trim() + " " + ingot.getDisplayName().replace("Ingot", " ").trim();
+ }
+ return ("" + StatCollector.translateToLocal(getUnlocalizedNameInefficiently(stack) + ".name")).trim() + " Metal";
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemNecklace.java b/src/main/java/darkknight/jewelrycraft/item/ItemNecklace.java
new file mode 100644
index 0000000..9668589
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemNecklace.java
@@ -0,0 +1,40 @@
+package darkknight.jewelrycraft.item;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import darkknight.jewelrycraft.util.JewelryNBT;
+
+public class ItemNecklace extends ItemBaseJewelry
+{
+ public IIcon gem;
+
+ /**
+ *
+ */
+ public ItemNecklace()
+ {}
+
+ /**
+ * @param iconRegister
+ */
+ @Override
+ public void registerIcons(IIconRegister iconRegister)
+ {
+ itemIcon = iconRegister.registerIcon("jewelrycraft:necklace");
+ gem = iconRegister.registerIcon("jewelrycraft:jewelNecklace");
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ */
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass)
+ {
+ if (pass == 0) return itemIcon;
+ if (pass == 1 && JewelryNBT.gem(stack) != null) return gem;
+ return itemIcon;
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemRing.java b/src/main/java/darkknight/jewelrycraft/item/ItemRing.java
new file mode 100644
index 0000000..4472324
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemRing.java
@@ -0,0 +1,40 @@
+package darkknight.jewelrycraft.item;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import darkknight.jewelrycraft.util.JewelryNBT;
+
+public class ItemRing extends ItemBaseJewelry
+{
+ public IIcon gem;
+
+ /**
+ *
+ */
+ public ItemRing()
+ {}
+
+ /**
+ * @param iconRegister
+ */
+ @Override
+ public void registerIcons(IIconRegister iconRegister)
+ {
+ itemIcon = iconRegister.registerIcon("jewelrycraft:ring");
+ gem = iconRegister.registerIcon("jewelrycraft:jewelRing");
+ }
+
+ /**
+ * @param stack
+ * @param pass
+ * @return
+ */
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass)
+ {
+ if (pass == 0) return itemIcon;
+ if (pass == 1 && JewelryNBT.gem(stack) != null) return gem;
+ return itemIcon;
+ }
+}
diff --git a/src/main/java/darkknight/jewelrycraft/item/ItemThiefGloves.java b/src/main/java/darkknight/jewelrycraft/item/ItemThiefGloves.java
new file mode 100644
index 0000000..e9cbeca
--- /dev/null
+++ b/src/main/java/darkknight/jewelrycraft/item/ItemThiefGloves.java
@@ -0,0 +1,165 @@
+package darkknight.jewelrycraft.item;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.passive.EntityVillager;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.potion.Potion;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.village.MerchantRecipe;
+import net.minecraft.village.MerchantRecipeList;
+import org.lwjgl.input.Keyboard;
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.relauncher.ReflectionHelper;
+import cpw.mods.fml.relauncher.Side;
+import darkknight.jewelrycraft.util.JewelrycraftUtil;
+import darkknight.jewelrycraft.util.PlayerUtils;
+
+public class ItemThiefGloves extends Item
+{
+ public Random rand = new Random();
+
+ /**
+ *
+ */
+ public ItemThiefGloves()
+ {
+ super();
+ setCreativeTab(CreativeTabs.tabTools);
+ setMaxStackSize(1);
+ setMaxDamage(10);
+ }
+
+ /**
+ * @param stack
+ * @param player
+ * @param entity
+ * @return
+ */
+ @Override
+ public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity)
+ {
+ if (entity instanceof EntityVillager){
+ EntityVillager villager = (EntityVillager)entity;
+ int wealth = (Integer)ReflectionHelper.getPrivateValue(EntityVillager.class, villager, "wealth", "field_70956_bz");
+ MerchantRecipeList buyingList = (MerchantRecipeList)ReflectionHelper.getPrivateValue(EntityVillager.class, villager, "buyingList", "field_70963_i");
+ int chance = 5;
+ boolean areOtherVillagersAround = false, canTheySeeYou = false;
+ AxisAlignedBB axisalignedbb = villager.boundingBox.expand(4.0D, 4.0D, 4.0D);
+ List entities = villager.worldObj.getEntitiesWithinAABBExcludingEntity(villager, axisalignedbb);
+ for(Object s: entities)
+ if (s instanceof EntityVillager){
+ areOtherVillagersAround = true;
+ chance += rand.nextInt(2);
+ if (((EntityVillager)s).canEntityBeSeen(player)){
+ chance += 2;
+ canTheySeeYou = true;
+ }
+ }
+ if (villager.canEntityBeSeen(player)) chance += 5;
+ if (player.isPotionActive(Potion.invisibility)) chance -= 0.8 * chance;
+ if (player.capabilities.isCreativeMode) chance = 1;
+ int steal = rand.nextInt(chance);
+ if (steal == 0){
+ villager.dropItem(Items.emerald, wealth);
+ ReflectionHelper.setPrivateValue(EntityVillager.class, villager, 0, "wealth", "field_70956_bz");
+ }
+ if (buyingList != null){
+ Iterator<?> iterator = buyingList.iterator();
+ if (steal == 0){
+ while (iterator.hasNext()){
+ MerchantRecipe recipe = (MerchantRecipe)iterator.next();
+ int toolUses = (Integer)ReflectionHelper.getPrivateValue(MerchantRecipe.class, recipe, "toolUses", "field_77400_d");
+ int quantity;
+ if (recipe.getItemToSell().isStackable()) quantity = recipe.getItemToSell().stackSize * (7 - toolUses);
+ else quantity = recipe.getItemToSell().stackSize;
+ ItemStack s = new ItemStack(recipe.getItemToSell().getItem(), quantity, recipe.getItemToSell().getItemDamage());
+ s.setTagCompound(recipe.getItemToSell().getTagCompound());
+ if (player.inventory.addItemStackToInventory(s)) ;
+ else villager.entityDropItem(s, 0);
+ JewelrycraftUtil.addCursePoints(player, 5);
+ player.addChatMessage(new ChatComponentText("Villager #" + villager.getProfession() + ": Hmmm... I seem to have lost my " + s.getDisplayName() + "!"));
+ stack.damageItem(1, player);
+ }
+ buyingList.clear();
+ ReflectionHelper.setPrivateValue(EntityVillager.class, villager, 300, "timeUntilReset", "field_70961_j");
+ ReflectionHelper.setPrivateValue(EntityVillager.class, villager, true, "needsInitilization", "field_70959_by");
+ player.addChatMessage(new ChatComponentText("You hear a faint whisper in your ear: "));
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.DARK_PURPLE + "Those who steal but don't get caught get rewarded and do not."));
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.DARK_PURPLE + "Embrace the path you have gone, for the darkness will not"));
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.DARK_PURPLE + "dwell on."));
+ }else{
+ stack.damageItem(1, player);
+ JewelrycraftUtil.addCursePoints(player, 25);
+ if (player.isPotionActive(Potion.invisibility)){
+ player.addChatMessage(new ChatComponentText("Villager #" + villager.getProfession() + " sensed a strange presence around him, making him cling on to his items. You didn't get anything."));
+ }
+ else{
+ if (areOtherVillagersAround){
+ if (!canTheySeeYou){
+ player.addChatMessage(new ChatComponentText("As he was passing by, a random villager caught you trying to steal from Villager #" + villager.getProfession() + "."));
+ player.addChatMessage(new ChatComponentText("Villager #" + villager.getProfession() + " curses you for the attempt."));
+ return true;
+ }
+ else{
+ player.addChatMessage(new ChatComponentText("A villager nearby saw you trying to steal from Villager #" + villager.getProfession() + "."));
+ player.addChatMessage(new ChatComponentText("Villager #" + villager.getProfession() + " curses you for the attempt."));
+ return true;
+ }
+ }else{
+ player.addChatMessage(new ChatComponentText("Villager #" + villager.getProfession() + " caught you trying to steal from him."));
+ player.addChatMessage(new ChatComponentText("Villager #" + villager.getProfession() + " curses you for the attempt."));
+ return true;
+ }
+ }
+ }
+ }
+ return true;
+ }else return super.itemInteractionForEntity(stack, player, entity);
+ }
+
+ /**
+ * @param stack
+ * @param player
+ * @param list
+ * @param par4
+ */
+ @Override
+ @SuppressWarnings ("unchecked")
+ public void addInformation(ItemStack stack, EntityPlayer player, @SuppressWarnings ("rawtypes") List list, boolean par4)
+ {
+ if (!shouldAddAdditionalInfo()) list.add(EnumChatFormatting.GRAY + additionalInfoInstructions());
+ else{
+ list.add(EnumChatFormatting.GRAY + "Right click with the gloves,");
+ list.add(EnumChatFormatting.GRAY + "while sneaking, on a villager");
+ list.add(EnumChatFormatting.GRAY + "to steal his stuff.");
+ }
+ }
+
+ /**
+ * @return
+ */
+ public static boolean shouldAddAdditionalInfo()
+ {
+ if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) return true;
+ return false;
+ }
+
+ /**
+ * @return
+ */
+ public static String additionalInfoInstructions()
+ {
+ String message = "\247oPress \247b<SHIFT>\2477\247o for more information.";
+ return message;
+ }
+}