package minefantasy.mf2.item.heatable; import java.awt.Color; import java.util.List; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.heating.Heatable; import minefantasy.mf2.api.heating.IHotItem; import minefantasy.mf2.api.heating.TongsHelper; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.helpers.GuiHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.util.MFLogUtil; 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.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.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.world.World; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class ItemHeated extends Item implements IHotItem { public ItemHeated() { GameRegistry.registerItem(this, "MF_Hot_Item", MineFantasyII.MODID); this.setUnlocalizedName("MF_Hot_Item"); this.setHasSubtypes(true); this.setMaxStackSize(64); } public static int getTemp(ItemStack item) { return Heatable.getTemp(item); } public static int getWorkTemp(ItemStack item) { return Heatable.getWorkTemp(item); } public static int getUnstableTemp(ItemStack item) { return Heatable.getWorkTemp(item); } public static ItemStack getItem(ItemStack item) { return Heatable.getItem(item); } public static void setTemp(ItemStack item, int heat) { NBTTagCompound nbt = getNBT(item); nbt.setInteger(Heatable.NBT_CurrentTemp, heat); } public static void setWorkTemp(ItemStack item, int heat) { NBTTagCompound nbt = getNBT(item); MFLogUtil.logDebug("Set Workable Temp: " + heat); nbt.setInteger(Heatable.NBT_WorkableTemp, heat); } public static void setUnstableTemp(ItemStack item, int heat) { NBTTagCompound nbt = getNBT(item); MFLogUtil.logDebug("Set Unstable Temp: " + heat); nbt.setInteger(Heatable.NBT_UnstableTemp, heat); } public static ItemStack createHotItem(ItemStack item) { return createHotItem(item, false); } public static ItemStack createHotItem(ItemStack item, int temp) { ItemStack hot = createHotItem(item, true); setTemp(hot, temp); return hot; } public static ItemStack createHotItem(ItemStack item, boolean ignoreStats) { Heatable stats = Heatable.loadStats(item); if(stats != null) { ItemStack out = new ItemStack(ComponentListMF.hotItem, item.stackSize); NBTTagCompound nbt = getNBT(out); NBTTagCompound save = new NBTTagCompound(); item.writeToNBT(save); nbt.setTag(Heatable.NBT_Item, save); nbt.setBoolean(Heatable.NBT_ShouldDisplay, true); setWorkTemp(out, stats.minTemperature); setUnstableTemp(out, stats.unstableTemperature); return out; } else if(ignoreStats) { ItemStack out = new ItemStack(ComponentListMF.hotItem, item.stackSize); NBTTagCompound nbt = getNBT(out); NBTTagCompound save = new NBTTagCompound(); item.writeToNBT(save); nbt.setTag(Heatable.NBT_Item, save); nbt.setBoolean(Heatable.NBT_ShouldDisplay, false); setWorkTemp(out, 0); setUnstableTemp(out, 0); return out; } return item; } private static void shareTraits(NBTTagCompound nbt, ItemStack item) { NBTTagCompound itemtag = getNBT(item); if(itemtag.hasKey("Unbreakable")) { nbt.setBoolean("Unbreakable", itemtag.getBoolean("Unbreakable")); } if(itemtag.hasKey("MF_Inferior")) { nbt.setBoolean("MF_Inferior", itemtag.getBoolean("MF_Inferior")); } if(itemtag.hasKey("MFCraftQuality")) { nbt.setFloat("MFCraftQuality", itemtag.getFloat("MFCraftQuality")); } } @Override public String getItemStackDisplayName(ItemStack stack) { String name = ""; ItemStack item = getItem(stack); if (item != null) name = item.getItem().getItemStackDisplayName(item); return StatCollector.translateToLocalFormatted("prefix.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(Heatable.NBT_ShouldDisplay)) { return nbt.getBoolean(Heatable.NBT_ShouldDisplay); } 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(Heatable.NBT_ShouldDisplay)) { if (nbt.getBoolean(Heatable.NBT_ShouldDisplay)) { 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 = Heatable.getHeatableStage(item); switch (stage) { case 1: return EnumChatFormatting.YELLOW + StatCollector.translateToLocal("state.workable"); case 2: return EnumChatFormatting.RED + StatCollector.translateToLocal("state.unstable"); } return ""; } public IIcon getIcon(ItemStack stack, int renderPass) { ItemStack item = getItem(stack); if (item != null) { return item.getItem().getIcon(item, renderPass); } return Blocks.fire.getBlockTextureFromSide(2); } @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister 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 == MovingObjectPosition.MovingObjectType.BLOCK) { 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; } float water = TongsHelper.getWaterSource(world, i, j, k); if (water >= 0) { player.playSound("random.splash", 1F, 1F); player.playSound("random.fizz", 2F, 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(); if(Heatable.HCCquenchRuin) { float damageDone = 50F + (water > 0F ? water : 0F); if(damageDone > 99F)damageDone = 99F; if(drop.isItemStackDamageable()) { drop.setItemDamage((int) (drop.getMaxDamage()*damageDone/100F)); } } drop.stackSize = item.stackSize; if (drop != null) { item.stackSize = 0; if (item.stackSize <= 0) { return drop.copy(); } } } } return item; } } public static boolean renderDynamicHotIngotRendering = true; public int getColorFromItemStack(ItemStack item, int renderPass) { if (renderPass > 1 || !renderDynamicHotIngotRendering) { return Color.WHITE.getRGB(); } NBTTagCompound nbt = getNBT(item); int heat = getTemp(item); int maxHeat = Heatable.forgeMaximumMetalHeat; double heatPer = (double) heat / (double) maxHeat * 100D; int red = getRedOnHeat(heatPer); int green = getGreenOnHeat(heatPer); int blue = getBlueOnHeat(heatPer); if (heat > 0) { return GuiHelper.getColourForRGB(red, green, blue); } return Color.WHITE.getRGB(); } @SideOnly(Side.CLIENT) public boolean requiresMultipleRenderPasses() { return true; } 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; } @Override public boolean isHot(ItemStack item) { return true; } @Override public boolean isCoolable(ItemStack item) { return true; } }