package minefantasy.item; import java.awt.Color; import java.util.List; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.MineFantasyBase; import minefantasy.api.forge.HeatableItem; import minefantasy.api.forge.IHotItem; import minefantasy.system.cfg; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumArmorMaterial; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.EnumMovingObjectType; import net.minecraft.util.Icon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; public class ItemHotItem extends Item implements IHotItem{ public ItemHotItem(int id) { super(id); this.setHasSubtypes(true); this.setMaxStackSize(1); } public static int getTemp(ItemStack item) { NBTTagCompound tag = getNBT(item); if(tag.hasKey("MFtemp"))return tag.getInteger("MFtemp"); return 0; } public static ItemStack getItem(ItemStack item) { NBTTagCompound tag = getNBT(item); if(tag.hasKey("ingotID") && tag.hasKey("ingotMeta")) { return new ItemStack(tag.getInteger("ingotID"), 1, tag.getInteger("ingotMeta")); } return null; } public static void setTemp(ItemStack item, int heat) { NBTTagCompound nbt = getNBT(item); nbt.setInteger("MFtemp", heat); } public static ItemStack createHotItem(ItemStack item) { return createHotItem(item, true); } public static ItemStack createHotItem(ItemStack item, boolean display) { ItemStack out = new ItemStack(ItemListMF.hotItem); NBTTagCompound nbt = getNBT(out); nbt.setInteger("ingotID", item.itemID); nbt.setInteger("ingotMeta", item.getItemDamage()); nbt.setBoolean("showMFTemp", display); return out; } @Override public String getItemDisplayName(ItemStack stack) { String name = ""; ItemStack item = getItem(stack); if(item != null) name = item.getItem().getItemDisplayName(item); return StatCollector.translateToLocal("item.hotItem.name") +" " + name; } @Override public EnumRarity getRarity(ItemStack stack) { ItemStack item = getItem(stack); if(item != null) return item.getItem().getRarity(item); return EnumRarity.common; } public static boolean showTemp(ItemStack stack) { if(stack == null)return false; NBTTagCompound nbt = getNBT(stack); if(nbt == null)return false; if(nbt.hasKey("showMFTemp")) { return nbt.getBoolean("showMFTemp"); } return false; } private static NBTTagCompound getNBT(ItemStack item) { if(!item.hasTagCompound())item.setTagCompound(new NBTTagCompound()); return item.getTagCompound(); } @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { ItemStack item = getItem(stack); if(item != null) { item.getItem().addInformation(item, player, list, b); } else super.addInformation(stack, player, list, b); NBTTagCompound nbt = getNBT(stack); if(nbt.hasKey("showMFTemp")) { if(nbt.getBoolean("showMFTemp")) { list.add(getHeatString(stack)); if(!getWorkString(item, stack).equals("")) list.add(getWorkString(item, stack)); } } } private String getHeatString(ItemStack item) { int heat = getTemp(item); String unit = "*C"; return heat + unit; } private String getWorkString(ItemStack heated, ItemStack item) { byte stage = HeatableItem.getHeatableStage(heated, getTemp(item)); switch(stage) { case 0: return ""; case 1: return EnumChatFormatting.YELLOW + StatCollector.translateToLocal("state.workable"); case 2: return EnumChatFormatting.RED + StatCollector.translateToLocal("state.unstable"); } return ""; } public Icon getIcon(ItemStack stack, int renderPass) { ItemStack item = getItem(stack); if(item != null) { return item.getItem().getIcon(item, renderPass); } return Block.fire.getBlockTextureFromSide(0); } @SideOnly(Side.CLIENT) public void registerIcons(IconRegister reg) { } public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); if (movingobjectposition == null) { return item; } else { if (movingobjectposition.typeOfHit == EnumMovingObjectType.TILE) { int i = movingobjectposition.blockX; int j = movingobjectposition.blockY; int k = movingobjectposition.blockZ; if (!world.canMineBlock(player, i, j, k)) { return item; } if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { return item; } if (isWaterSource(world, i, j, k)) { player.playSound("random.splash", 1.0F, 1.0F); player.playSound("random.fizz", 2.0F, 0.5F); for(int a = 0; a < 5 ; a ++) { world.spawnParticle("largesmoke", i+0.5F, j+1, k+0.5F, 0, 0.065F, 0); } ItemStack drop = getItem(item).copy(); drop.stackSize = item.stackSize; if(drop != null) { item.stackSize = 0; if (item.stackSize <= 0) { return drop.copy(); } } } } return item; } } private boolean isWaterSource(World world, int i, int j, int k) { if(world.getBlockMaterial(i, j, k) == Material.water) { return true; } if(isCauldron(world, i, j, k)) { return true; } return false; } public int getColorFromItemStack(ItemStack item, int renderPass) { if(renderPass > 1 || !cfg.renderHot) { return Color.WHITE.getRGB(); } NBTTagCompound nbt = getNBT(item); if(!nbt.hasKey("showMFTemp")) { return Color.RED.getRGB(); } if(!nbt.getBoolean("showMFTemp")) { return Color.RED.getRGB(); } int heat = getTemp(item); int maxHeat = cfg.maxHeat; double heatPer = (double)heat/(double)maxHeat*100D; int red = getRedOnHeat(heatPer); int green = getGreenOnHeat(heatPer); int blue = getBlueOnHeat(heatPer); if(heat > 0) { return MineFantasyBase.getColourForRGB(red, green, blue); } return Color.WHITE.getRGB(); } @SideOnly(Side.CLIENT) public boolean requiresMultipleRenderPasses() { return true; } /** * Colour shading * Half 1: * 255,255,255 - 255,0,0 * * Half 2: * 255,0,0 - 255,255,0 */ private int getRedOnHeat(double percent) { return 255; } private int getGreenOnHeat(double percent) { if(percent > 100)percent = 100; if(percent < 0)percent = 0; if(percent <= 55) { return (int)(255 - ((255/55) * percent)); } else { return (int)((255/55) * (percent-55)); } } private int getBlueOnHeat(double percent) { if(percent > 100)percent = 100; if(percent < 0)percent = 0; if(percent <= 55) { return (int)(255 - ((255/55) * percent)); } return 0; } public boolean isCauldron(World world, int x, int y, int z) { return world.getBlockId(x, y, z) == Block.cauldron.blockID && world.getBlockMetadata(x, y, z)>0; } @Override public boolean isHot(ItemStack item) { return true; } @Override public boolean isCoolable(ItemStack item) { return true; } }