package net.minecraft.potion; import com.google.common.collect.Maps; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.Iterator; import java.util.Map; import java.util.UUID; import java.util.Map.Entry; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.ai.attributes.BaseAttributeMap; import net.minecraft.entity.ai.attributes.IAttribute; import net.minecraft.entity.ai.attributes.IAttributeInstance; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.DamageSource; import net.minecraft.util.StringUtils; public class Potion { /** The array of potion types. */ public static final Potion[] potionTypes = new Potion[32]; public static final Potion field_76423_b = null; public static final Potion moveSpeed = (new Potion(1, false, 8171462)).setPotionName("potion.moveSpeed").setIconIndex(0, 0).registerPotionAttributeModifier(SharedMonsterAttributes.movementSpeed, "91AEAA56-376B-4498-935B-2F7F68070635", 0.20000000298023224D, 2); public static final Potion moveSlowdown = (new Potion(2, true, 5926017)).setPotionName("potion.moveSlowdown").setIconIndex(1, 0).registerPotionAttributeModifier(SharedMonsterAttributes.movementSpeed, "7107DE5E-7CE8-4030-940E-514C1F160890", -0.15000000596046448D, 2); public static final Potion digSpeed = (new Potion(3, false, 14270531)).setPotionName("potion.digSpeed").setIconIndex(2, 0).setEffectiveness(1.5D); public static final Potion digSlowdown = (new Potion(4, true, 4866583)).setPotionName("potion.digSlowDown").setIconIndex(3, 0); public static final Potion damageBoost = (new PotionAttackDamage(5, false, 9643043)).setPotionName("potion.damageBoost").setIconIndex(4, 0).registerPotionAttributeModifier(SharedMonsterAttributes.attackDamage, "648D7064-6A60-4F59-8ABE-C2C23A6DD7A9", 3.0D, 2); public static final Potion heal = (new PotionHealth(6, false, 16262179)).setPotionName("potion.heal"); public static final Potion harm = (new PotionHealth(7, true, 4393481)).setPotionName("potion.harm"); public static final Potion jump = (new Potion(8, false, 7889559)).setPotionName("potion.jump").setIconIndex(2, 1); public static final Potion confusion = (new Potion(9, true, 5578058)).setPotionName("potion.confusion").setIconIndex(3, 1).setEffectiveness(0.25D); /** The regeneration Potion object. */ public static final Potion regeneration = (new Potion(10, false, 13458603)).setPotionName("potion.regeneration").setIconIndex(7, 0).setEffectiveness(0.25D); public static final Potion resistance = (new Potion(11, false, 10044730)).setPotionName("potion.resistance").setIconIndex(6, 1); /** The fire resistance Potion object. */ public static final Potion fireResistance = (new Potion(12, false, 14981690)).setPotionName("potion.fireResistance").setIconIndex(7, 1); /** The water breathing Potion object. */ public static final Potion waterBreathing = (new Potion(13, false, 3035801)).setPotionName("potion.waterBreathing").setIconIndex(0, 2); /** The invisibility Potion object. */ public static final Potion invisibility = (new Potion(14, false, 8356754)).setPotionName("potion.invisibility").setIconIndex(0, 1); /** The blindness Potion object. */ public static final Potion blindness = (new Potion(15, true, 2039587)).setPotionName("potion.blindness").setIconIndex(5, 1).setEffectiveness(0.25D); /** The night vision Potion object. */ public static final Potion nightVision = (new Potion(16, false, 2039713)).setPotionName("potion.nightVision").setIconIndex(4, 1); /** The hunger Potion object. */ public static final Potion hunger = (new Potion(17, true, 5797459)).setPotionName("potion.hunger").setIconIndex(1, 1); /** The weakness Potion object. */ public static final Potion weakness = (new PotionAttackDamage(18, true, 4738376)).setPotionName("potion.weakness").setIconIndex(5, 0).registerPotionAttributeModifier(SharedMonsterAttributes.attackDamage, "22653B89-116E-49DC-9B6B-9971489B5BE5", 2.0D, 0); /** The poison Potion object. */ public static final Potion poison = (new Potion(19, true, 5149489)).setPotionName("potion.poison").setIconIndex(6, 0).setEffectiveness(0.25D); /** The wither Potion object. */ public static final Potion wither = (new Potion(20, true, 3484199)).setPotionName("potion.wither").setIconIndex(1, 2).setEffectiveness(0.25D); /** The health boost Potion object. */ public static final Potion healthBoost = (new PotionHealthBoost(21, false, 16284963)).setPotionName("potion.healthBoost").setIconIndex(2, 2).registerPotionAttributeModifier(SharedMonsterAttributes.maxHealth, "5D6F0BA2-1186-46AC-B896-C61C5CEE99CC", 4.0D, 0); /** The absorption Potion object. */ public static final Potion absorption = (new PotionAbsoption(22, false, 2445989)).setPotionName("potion.absorption").setIconIndex(2, 2); /** The saturation Potion object. */ public static final Potion saturation = (new PotionHealth(23, false, 16262179)).setPotionName("potion.saturation"); public static final Potion field_76442_z = null; public static final Potion field_76409_A = null; public static final Potion field_76410_B = null; public static final Potion field_76411_C = null; public static final Potion field_76405_D = null; public static final Potion field_76406_E = null; public static final Potion field_76407_F = null; public static final Potion field_76408_G = null; /** The Id of a Potion object. */ public final int id; /** Contains a Map of the AttributeModifiers registered by potions */ private final Map attributeModifierMap = Maps.newHashMap(); /** This field indicated if the effect is 'bad' - negative - for the entity. */ private final boolean isBadEffect; /** Is the color of the liquid for this potion. */ private final int liquidColor; /** The name of the Potion. */ private String name = ""; /** The index for the icon displayed when the potion effect is active. */ private int statusIconIndex = -1; private double effectiveness; private boolean usable; private static final String __OBFID = "CL_00001528"; protected Potion(int p_i1573_1_, boolean p_i1573_2_, int p_i1573_3_) { this.id = p_i1573_1_; potionTypes[p_i1573_1_] = this; this.isBadEffect = p_i1573_2_; if (p_i1573_2_) { this.effectiveness = 0.5D; } else { this.effectiveness = 1.0D; } this.liquidColor = p_i1573_3_; } /** * Sets the index for the icon displayed in the player's inventory when the status is active. */ protected Potion setIconIndex(int p_76399_1_, int p_76399_2_) { this.statusIconIndex = p_76399_1_ + p_76399_2_ * 8; return this; } /** * returns the ID of the potion */ public int getId() { return this.id; } public void performEffect(EntityLivingBase p_76394_1_, int p_76394_2_) { if (this.id == regeneration.id) { if (p_76394_1_.getHealth() < p_76394_1_.getMaxHealth()) { p_76394_1_.heal(1.0F); } } else if (this.id == poison.id) { if (p_76394_1_.getHealth() > 1.0F) { p_76394_1_.attackEntityFrom(DamageSource.magic, 1.0F); } } else if (this.id == wither.id) { p_76394_1_.attackEntityFrom(DamageSource.wither, 1.0F); } else if (this.id == hunger.id && p_76394_1_ instanceof EntityPlayer) { ((EntityPlayer)p_76394_1_).addExhaustion(0.025F * (float)(p_76394_2_ + 1)); } else if (this.id == saturation.id && p_76394_1_ instanceof EntityPlayer) { if (!p_76394_1_.worldObj.isRemote) { ((EntityPlayer)p_76394_1_).getFoodStats().addStats(p_76394_2_ + 1, 1.0F); } } else if ((this.id != heal.id || p_76394_1_.isEntityUndead()) && (this.id != harm.id || !p_76394_1_.isEntityUndead())) { if (this.id == harm.id && !p_76394_1_.isEntityUndead() || this.id == heal.id && p_76394_1_.isEntityUndead()) { p_76394_1_.attackEntityFrom(DamageSource.magic, (float)(6 << p_76394_2_)); } } else { p_76394_1_.heal((float)Math.max(4 << p_76394_2_, 0)); } } /** * Hits the provided entity with this potion's instant effect. */ public void affectEntity(EntityLivingBase p_76402_1_, EntityLivingBase p_76402_2_, int p_76402_3_, double p_76402_4_) { int j; if ((this.id != heal.id || p_76402_2_.isEntityUndead()) && (this.id != harm.id || !p_76402_2_.isEntityUndead())) { if (this.id == harm.id && !p_76402_2_.isEntityUndead() || this.id == heal.id && p_76402_2_.isEntityUndead()) { j = (int)(p_76402_4_ * (double)(6 << p_76402_3_) + 0.5D); if (p_76402_1_ == null) { p_76402_2_.attackEntityFrom(DamageSource.magic, (float)j); } else { p_76402_2_.attackEntityFrom(DamageSource.causeIndirectMagicDamage(p_76402_2_, p_76402_1_), (float)j); } } } else { j = (int)(p_76402_4_ * (double)(4 << p_76402_3_) + 0.5D); p_76402_2_.heal((float)j); } } /** * Returns true if the potion has an instant effect instead of a continuous one (eg Harming) */ public boolean isInstant() { return false; } /** * checks if Potion effect is ready to be applied this tick. */ public boolean isReady(int p_76397_1_, int p_76397_2_) { int k; if (this.id == regeneration.id) { k = 50 >> p_76397_2_; return k > 0 ? p_76397_1_ % k == 0 : true; } else if (this.id == poison.id) { k = 25 >> p_76397_2_; return k > 0 ? p_76397_1_ % k == 0 : true; } else if (this.id == wither.id) { k = 40 >> p_76397_2_; return k > 0 ? p_76397_1_ % k == 0 : true; } else { return this.id == hunger.id; } } /** * Set the potion name. */ public Potion setPotionName(String p_76390_1_) { this.name = p_76390_1_; return this; } /** * returns the name of the potion */ public String getName() { return this.name; } protected Potion setEffectiveness(double p_76404_1_) { this.effectiveness = p_76404_1_; return this; } /** * Returns true if the potion has a associated status icon to display in then inventory when active. */ @SideOnly(Side.CLIENT) public boolean hasStatusIcon() { return this.statusIconIndex >= 0; } /** * Returns the index for the icon to display when the potion is active. */ @SideOnly(Side.CLIENT) public int getStatusIconIndex() { return this.statusIconIndex; } /** * This method returns true if the potion effect is bad - negative - for the entity. */ @SideOnly(Side.CLIENT) public boolean isBadEffect() { return this.isBadEffect; } @SideOnly(Side.CLIENT) public static String getDurationString(PotionEffect p_76389_0_) { if (p_76389_0_.getIsPotionDurationMax()) { return "**:**"; } else { int i = p_76389_0_.getDuration(); return StringUtils.ticksToElapsedTime(i); } } public double getEffectiveness() { return this.effectiveness; } public boolean isUsable() { return this.usable; } /** * Returns the color of the potion liquid. */ public int getLiquidColor() { return this.liquidColor; } /** * Used by potions to register the attribute they modify. */ public Potion registerPotionAttributeModifier(IAttribute p_111184_1_, String p_111184_2_, double p_111184_3_, int p_111184_5_) { AttributeModifier attributemodifier = new AttributeModifier(UUID.fromString(p_111184_2_), this.getName(), p_111184_3_, p_111184_5_); this.attributeModifierMap.put(p_111184_1_, attributemodifier); return this; } public void removeAttributesModifiersFromEntity(EntityLivingBase p_111187_1_, BaseAttributeMap p_111187_2_, int p_111187_3_) { Iterator iterator = this.attributeModifierMap.entrySet().iterator(); while (iterator.hasNext()) { Entry entry = (Entry)iterator.next(); IAttributeInstance iattributeinstance = p_111187_2_.getAttributeInstance((IAttribute)entry.getKey()); if (iattributeinstance != null) { iattributeinstance.removeModifier((AttributeModifier)entry.getValue()); } } } @SideOnly(Side.CLIENT) public Map func_111186_k() { return this.attributeModifierMap; } public void applyAttributesModifiersToEntity(EntityLivingBase p_111185_1_, BaseAttributeMap p_111185_2_, int p_111185_3_) { Iterator iterator = this.attributeModifierMap.entrySet().iterator(); while (iterator.hasNext()) { Entry entry = (Entry)iterator.next(); IAttributeInstance iattributeinstance = p_111185_2_.getAttributeInstance((IAttribute)entry.getKey()); if (iattributeinstance != null) { AttributeModifier attributemodifier = (AttributeModifier)entry.getValue(); iattributeinstance.removeModifier(attributemodifier); iattributeinstance.applyModifier(new AttributeModifier(attributemodifier.getID(), this.getName() + " " + p_111185_3_, this.func_111183_a(p_111185_3_, attributemodifier), attributemodifier.getOperation())); } } } public double func_111183_a(int p_111183_1_, AttributeModifier p_111183_2_) { return p_111183_2_.getAmount() * (double)(p_111183_1_ + 1); } /* ======================================== FORGE START =====================================*/ /** * If the standard PotionEffect text (name and duration) should be drawn when this potion is active. * @param effect the active PotionEffect * @return true to draw the standard text */ public boolean shouldRenderInvText(PotionEffect effect) { return true; } /** * Called to draw the this Potion onto the player's inventory when it's active. * This can be used to e.g. render Potion icons from your own texture. * @param x the x coordinate * @param y the y coordinate * @param effect the active PotionEffect * @param mc the Minecraft instance, for convenience */ @SideOnly(Side.CLIENT) public void renderInventoryEffect(int x, int y, PotionEffect effect, net.minecraft.client.Minecraft mc) { } }