package openmods.utils; import java.util.List; import java.util.Random; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentData; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; public class EnchantmentUtils { public static int calcEnchantability(ItemStack itemStack, int power, boolean max) { Item item = itemStack.getItem(); int k = item.getItemEnchantability(); return calcEnchantability(k, power, max); } public static int calcEnchantability(int enchantability, int power, boolean max) { if (enchantability <= 0) { return 0; } if (power > 15) { power = 15; } int l = (max? 7 : 0) + 1 + (power >> 1) + (max? power : 0); return max? Math.max(l, power * 2) : Math.max(l / 3, 1); } /** * Be warned, minecraft doesn't update experienceTotal properly, so we have * to do this. * * @param player * @return */ public static int getPlayerXP(EntityPlayer player) { return (int)(EnchantmentUtils.getExperienceForLevel(player.experienceLevel) + (player.experience * player.xpBarCap())); } public static void addPlayerXP(EntityPlayer player, int amount) { int experience = getPlayerXP(player) + amount; player.experienceTotal = experience; player.experienceLevel = EnchantmentUtils.getLevelForExperience(experience); int expForLevel = EnchantmentUtils.getExperienceForLevel(player.experienceLevel); player.experience = (float)(experience - expForLevel) / (float)player.xpBarCap(); } public static boolean enchantItem(ItemStack itemstack, int level, Random rand) { if (itemstack == null) return false; @SuppressWarnings("unchecked") List<EnchantmentData> enchantments = EnchantmentHelper.buildEnchantmentList(rand, itemstack, level); if (enchantments == null || enchantments.isEmpty()) return false; boolean isBook = itemstack.getItem() == Items.book; if (isBook) { itemstack.func_150996_a(Items.enchanted_book); final int count = enchantments.size(); int ignored = count > 1? rand.nextInt(count) : -1; for (int i = 0; i < count; i++) if (i != ignored) Items.enchanted_book.addEnchantment(itemstack, enchantments.get(i)); } else { for (EnchantmentData enchantment : enchantments) itemstack.addEnchantment(enchantment.enchantmentobj, enchantment.enchantmentLevel); } return true; } public static int getExperienceForLevel(int level) { if (level == 0) { return 0; } if (level > 0 && level < 16) { return level * 17; } else if (level > 15 && level < 31) { return (int)(1.5 * Math.pow(level, 2) - 29.5 * level + 360); } else { return (int)(3.5 * Math.pow(level, 2) - 151.5 * level + 2220); } } public static int getXpToNextLevel(int level) { int levelXP = EnchantmentUtils.getLevelForExperience(level); int nextXP = EnchantmentUtils.getExperienceForLevel(level + 1); return nextXP - levelXP; } public static int getLevelForExperience(int experience) { int i = 0; while (getExperienceForLevel(i) <= experience) { i++; } return i - 1; } public static float getPower(World worldObj, int xCoord, int yCoord, int zCoord) { float power = 0; for (int x = -1; x <= 1; ++x) { for (int z = -1; z <= 1; ++z) { final int innerX = xCoord + z; final int innerZ = zCoord + x; final int outerX = xCoord + z * 2; final int outerZ = zCoord + x * 2; final int middle = yCoord; final int top = yCoord + 1; if ((x != 0 || z != 0) && worldObj.isAirBlock(innerX, middle, innerZ) && worldObj.isAirBlock(innerX, top, innerZ)) { power += ForgeHooks.getEnchantPower(worldObj, outerX, middle, outerZ); power += ForgeHooks.getEnchantPower(worldObj, outerX, top, outerZ); if (z != 0 && x != 0) { power += ForgeHooks.getEnchantPower(worldObj, outerX, middle, innerZ); power += ForgeHooks.getEnchantPower(worldObj, outerX, top, innerZ); power += ForgeHooks.getEnchantPower(worldObj, innerX, middle, outerZ); power += ForgeHooks.getEnchantPower(worldObj, innerX, top, outerZ); } } } } return power; } public static void addAllBooks(Enchantment enchantment, List<ItemStack> items) { for (int i = enchantment.getMinLevel(); i <= enchantment.getMaxLevel(); i++) items.add(Items.enchanted_book.getEnchantedItemStack(new EnchantmentData(enchantment, i))); } }