blob: 49d1c47b584c5356afccffab9a649ffde87b5580 [file] [log] [blame] [raw]
package li.cil.oc.common.item
import cpw.mods.fml.relauncher.Side
import cpw.mods.fml.relauncher.SideOnly
import li.cil.oc.Settings
import li.cil.oc.client.Textures
import li.cil.oc.client.renderer.item.HoverBootRenderer
import li.cil.oc.common.item.data.HoverBootsData
import li.cil.oc.util.ItemColorizer
import net.minecraft.client.model.ModelBiped
import net.minecraft.client.renderer.texture.IIconRegister
import net.minecraft.entity.item.EntityItem
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.entity.Entity
import net.minecraft.entity.EntityLivingBase
import net.minecraft.init.Blocks
import net.minecraft.item.EnumRarity
import net.minecraft.item.ItemArmor
import net.minecraft.item.ItemStack
import net.minecraft.potion.Potion
import net.minecraft.potion.PotionEffect
import net.minecraft.util.IIcon
import net.minecraft.util.MathHelper
import net.minecraft.world.World
class HoverBoots extends ItemArmor(ItemArmor.ArmorMaterial.DIAMOND, 0, 3) with traits.SimpleItem with traits.Chargeable {
setNoRepair()
override def getRarity(stack: ItemStack): EnumRarity = EnumRarity.uncommon
override def maxCharge(stack: ItemStack) = Settings.get.bufferHoverBoots
override def getCharge(stack: ItemStack): Double =
new HoverBootsData(stack).charge
override def setCharge(stack: ItemStack, amount: Double): Unit = {
val data = new HoverBootsData(stack)
data.charge = math.min(maxCharge(stack), math.max(0, amount))
data.save(stack)
}
override def canCharge(stack: ItemStack): Boolean = true
override def charge(stack: ItemStack, amount: Double, simulate: Boolean): Double = {
val data = new HoverBootsData(stack)
if (amount < 0) {
val remainder = math.min(0, data.charge + amount)
if (!simulate) {
data.charge = math.max(0, data.charge + amount)
data.save(stack)
}
remainder
}
else {
val remainder = -math.min(0, Settings.get.bufferHoverBoots - (data.charge + amount))
if (!simulate) {
data.charge = math.min(Settings.get.bufferHoverBoots, data.charge + amount)
data.save(stack)
}
remainder
}
}
@SideOnly(Side.CLIENT)
override def getArmorModel(entityLiving: EntityLivingBase, itemStack: ItemStack, armorSlot: Int): ModelBiped = {
if (armorSlot == armorType) {
HoverBootRenderer.lightColor = if (ItemColorizer.hasColor(itemStack)) ItemColorizer.getColor(itemStack) else 0x66DD55
HoverBootRenderer
}
else super.getArmorModel(entityLiving, itemStack, armorSlot)
}
override def getArmorTexture(stack: ItemStack, entity: Entity, slot: Int, subType: String): String = {
if (entity.worldObj.isRemote) HoverBootRenderer.texture.toString
else null
}
override def onArmorTick(world: World, player: EntityPlayer, stack: ItemStack): Unit = {
super.onArmorTick(world, player, stack)
if (!Settings.get.ignorePower && player.getActivePotionEffect(Potion.moveSlowdown) == null && getCharge(stack) == 0) {
player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.getId, 20, 1))
}
}
override def onEntityItemUpdate(entity: EntityItem): Boolean = {
if (entity != null && entity.worldObj != null && !entity.worldObj.isRemote && ItemColorizer.hasColor(entity.getEntityItem)) {
val x = MathHelper.floor_double(entity.posX)
val y = MathHelper.floor_double(entity.posY)
val z = MathHelper.floor_double(entity.posZ)
if (entity.worldObj.getBlock(x, y, z) == Blocks.cauldron) {
val meta = entity.worldObj.getBlockMetadata(x, y, z)
if (meta > 0) {
ItemColorizer.removeColor(entity.getEntityItem)
entity.worldObj.setBlockMetadataWithNotify(x, y, z, meta - 1, 3)
return true
}
}
}
super.onEntityItemUpdate(entity)
}
@SideOnly(Side.CLIENT)
override def registerIcons(ir: IIconRegister): Unit = {
this.itemIcon = ir.registerIcon(this.getIconString)
Textures.HoverBoots.lightOverlay = ir.registerIcon(this.getIconString + "Light")
}
@SideOnly(Side.CLIENT)
override def requiresMultipleRenderPasses(): Boolean = true
@SideOnly(Side.CLIENT)
override def getIconFromDamageForRenderPass(meta: Int, pass: Int): IIcon = if (pass == 1) Textures.HoverBoots.lightOverlay else super.getIconFromDamageForRenderPass(meta, pass)
override def getColorFromItemStack(itemStack: ItemStack, pass: Int): Int = {
if (pass == 1) {
return if (ItemColorizer.hasColor(itemStack)) ItemColorizer.getColor(itemStack) else 0x66DD55
}
super.getColorFromItemStack(itemStack, pass)
}
override def getDisplayDamage(stack: ItemStack): Int = {
val data = new HoverBootsData(stack)
(Settings.get.bufferHoverBoots * (1 - data.charge / Settings.get.bufferHoverBoots)).toInt
}
override def getMaxDamage(stack: ItemStack): Int = Settings.get.bufferHoverBoots.toInt
// Always show energy bar.
override def isDamaged(stack: ItemStack): Boolean = true
// Contradictory as it may seem with the above, this avoids actual damage value changing.
override def isDamageable: Boolean = false
override def setDamage(stack: ItemStack, damage: Int): Unit = {
// Subtract energy when taking damage instead of actually damaging the item.
charge(stack, -damage, simulate = false)
// Set to 0 for old boots that may have been damaged before.
super.setDamage(stack, 0)
}
}