betterbeginnings/src/main/java/net/einsteinsci/betterbeginnings/register/InfusionRepairUtil.java

526 lines
13 KiB
Java

package net.einsteinsci.betterbeginnings.register;
import net.einsteinsci.betterbeginnings.inventory.InventoryInfusionRepair;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.*;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.oredict.OreDictionary;
import java.util.ArrayList;
/**
* Created by einsteinsci on 8/20/2014.
*/
public class InfusionRepairUtil
{
public static boolean canRepair(InventoryInfusionRepair repairTable, EntityPlayer player)
{
return canRepairIgnoreXp(repairTable) && player.experienceLevel >= getNeededLevels(repairTable);
}
public static boolean canRepairIgnoreXp(InventoryInfusionRepair repairTable)
{
ArrayList<ItemStack> requiredItems = getRequiredStacks(repairTable);
if (repairTable.getStackInSlot(0) == null)
{
return false;
}
if (!repairTable.getStackInSlot(0).isItemStackDamageable())
{
return false;
}
for (ItemStack needed : requiredItems)
{
boolean foundIt = false;
for (int j = 1; j < repairTable.getSizeInventory(); ++j)
{
if (repairTable.getStackInSlot(j) != null)
{
ItemStack tested = repairTable.getStackInSlot(j);
if (tested.getItem() == needed.getItem() &&
(tested.getItemDamage() == needed.getItemDamage() || needed
.getItemDamage() == OreDictionary.WILDCARD_VALUE) &&
tested.stackSize >= needed.stackSize)
{
foundIt = true;
break;
}
}
}
if (!foundIt)
{
return false;
}
}
return true;
}
public static int getNeededLevels(InventoryInfusionRepair repairTable)
{
ItemStack infusedItem = repairTable.getStackInSlot(0);
if (infusedItem == null)
{
return 0;
}
if (infusedItem.getItem() instanceof ItemBow)
{
return 10;
}
if (infusedItem.getItem() == RegisterItems.noobWoodSword)
{
return 1;
}
else if (infusedItem.getItem() == RegisterItems.flintKnife || infusedItem
.getItem() == RegisterItems.flintHatchet)
{
return 1;
}
else if (infusedItem.getItem() == RegisterItems.boneKnife)
{
return 5;
}
else if (infusedItem.getItem() == RegisterItems.bonePickaxe)
{
return 1;
}
else if (infusedItem.getItem() instanceof ItemTool)
{
ItemTool tool = (ItemTool)infusedItem.getItem();
Item.ToolMaterial material = Item.ToolMaterial.valueOf(tool.getToolMaterialName());
switch (material)
{
case WOOD:
return 1;
case STONE:
return 5;
case IRON:
return 10;
case GOLD:
return 20;
case EMERALD: // See "WTF" below.
return 20;
default:
return 20;
}
}
else if (infusedItem.getItem() instanceof ItemSword)
{
ItemSword sword = (ItemSword)infusedItem.getItem();
Item.ToolMaterial material = Item.ToolMaterial.valueOf(sword.getToolMaterialName());
switch (material)
{
case WOOD:
return 1;
case STONE:
return 5;
case IRON:
return 10;
case GOLD:
return 20;
case EMERALD: // See "WTF" below.
return 20;
default:
if (material == RegisterItems.NOOBWOOD)
{
return 1;
}
else
{
return 20;
}
}
}
else if (infusedItem.getItem() instanceof ItemArmor)
{
ItemArmor armor = (ItemArmor)infusedItem.getItem();
switch (armor.getArmorMaterial())
{
case LEATHER:
return 1;
case CHAIN:
return 5;
case IRON:
return 10;
case GOLD:
return 20;
case DIAMOND: // WTF MOJANG?! (See above)
return 20;
default:
return 20;
}
}
else if (infusedItem.getItem() == Items.shears)
{
return 5;
}
else if (infusedItem.getItem() == Items.fishing_rod)
{
return 5;
}
else if (infusedItem.getItem() == Items.flint_and_steel)
{
return 1;
}
return 0;
}
public static ArrayList<ItemStack> getRequiredStacks(InventoryInfusionRepair repairTable)
{
ArrayList<ItemStack> requiredItems = new ArrayList<ItemStack>();
ItemStack repaired = repairTable.getStackInSlot(0);
if (repaired == null)
{
return requiredItems;
}
if (!repaired.isItemDamaged())
{
return requiredItems;
}
if (repaired.getItem() instanceof ItemBow)
{
requiredItems.add(new ItemStack(Items.stick, 2));
requiredItems.add(new ItemStack(Items.string, 2));
}
if (repaired.getItem() == RegisterItems.noobWoodSword)
{
requiredItems.add(new ItemStack(Blocks.planks, 1, OreDictionary.WILDCARD_VALUE));
}
else if (repaired.getItem() == RegisterItems.flintKnife || repaired.getItem() == RegisterItems.flintHatchet)
{
requiredItems.add(new ItemStack(Items.flint));
}
else if (repaired.getItem() == RegisterItems.boneKnife)
{
requiredItems.add(new ItemStack(Items.bone));
}
else if (repaired.getItem() == RegisterItems.bonePickaxe)
{
requiredItems.add(new ItemStack(RegisterItems.boneShard));
}
else if (repaired.getItem() instanceof ItemTool)
{
ItemTool tool = (ItemTool)repaired.getItem();
Item.ToolMaterial material = Item.ToolMaterial.valueOf(tool.getToolMaterialName());
switch (material)
{
case WOOD:
requiredItems.add(new ItemStack(Blocks.planks, 1, OreDictionary.WILDCARD_VALUE));
break;
case STONE:
requiredItems.add(new ItemStack(Blocks.stone, 1));
break;
case IRON:
requiredItems.add(new ItemStack(Items.iron_ingot));
break;
case GOLD:
requiredItems.add(new ItemStack(Items.gold_nugget, 2));
break;
case EMERALD: // See "WTF" below.
requiredItems.add(new ItemStack(Items.redstone, 24));
break;
default:
requiredItems.add(new ItemStack(Items.emerald, 4));
break;
}
}
else if (repaired.getItem() instanceof ItemSword)
{
ItemSword sword = (ItemSword)repaired.getItem();
Item.ToolMaterial material = Item.ToolMaterial.valueOf(sword.getToolMaterialName());
switch (material)
{
case WOOD:
requiredItems.add(new ItemStack(Blocks.planks, 1, OreDictionary.WILDCARD_VALUE));
break;
case STONE:
requiredItems.add(new ItemStack(Blocks.stone, 1));
case IRON:
requiredItems.add(new ItemStack(Items.iron_ingot));
break;
case GOLD:
requiredItems.add(new ItemStack(Items.gold_nugget, 2));
break;
case EMERALD: // See "WTF" below.
requiredItems.add(new ItemStack(Items.redstone, 16));
break;
default:
if (material == RegisterItems.NOOBWOOD)
{
requiredItems.add(new ItemStack(Blocks.planks, 1, OreDictionary.WILDCARD_VALUE));
}
else
{
requiredItems.add(new ItemStack(Items.emerald, 4));
}
break;
}
}
else if (repaired.getItem() instanceof ItemArmor)
{
ItemArmor armor = (ItemArmor)repaired.getItem();
switch (armor.getArmorMaterial())
{
case LEATHER:
requiredItems.add(new ItemStack(Items.leather));
break;
case CHAIN:
requiredItems.add(new ItemStack(RegisterItems.ironNugget));
break;
case IRON:
requiredItems.add(new ItemStack(Items.iron_ingot));
case GOLD:
requiredItems.add(new ItemStack(Items.gold_nugget, 2));
case DIAMOND: // WTF MOJANG?! (See above)
requiredItems.add(new ItemStack(Items.redstone, 24));
default:
requiredItems.add(new ItemStack(Items.emerald, 4));
break;
}
}
else if (repaired.getItem() == Items.shears)
{
requiredItems.add(new ItemStack(Items.iron_ingot));
}
else if (repaired.getItem() == Items.fishing_rod)
{
requiredItems.add(new ItemStack(Items.string, 4));
}
else if (repaired.getItem() == Items.flint_and_steel)
{
requiredItems.add(new ItemStack(Items.flint));
}
if (repaired.isItemEnchanted())
{
if (repaired.getTagCompound() != null)
{
if (repaired.getTagCompound().getTag("ench") != null)
{
NBTTagList enchants = (NBTTagList)repaired.getTagCompound().getTag("ench");
for (int i = 0; i < enchants.tagCount(); i++)
{
NBTTagCompound enchant = enchants.getCompoundTagAt(i);
int enchId = enchant.getInteger("id");
int level = enchant.getInteger("lvl");
switch (enchId)
{
case 0: // Protection
requiredItems.add(new ItemStack(Blocks.iron_bars, 2 * level));
break;
case 1: // Fire Protection
requiredItems.add(new ItemStack(Items.bucket, level));
break;
case 2: // Feather Falling
requiredItems.add(new ItemStack(Items.feather, 2 * level));
break;
case 3: // Blast Protection
requiredItems.add(new ItemStack(Blocks.cobblestone, 8 * level));
break;
case 4: // Projectile Protection
requiredItems.add(new ItemStack(Items.snowball, 4 * level));
break;
case 5: // Respiration
requiredItems.add(new ItemStack(Items.glass_bottle, level));
break;
case 6: // Aqua Affinity
requiredItems.add(new ItemStack(Blocks.clay, level));
break;
case 7: // Thorns
requiredItems.add(new ItemStack(Blocks.cactus, 4 * level));
break;
case 8: // Depth Strider
// requiredItems.add(new ItemStack(Blocks.prismarine, level));
break;
case 16: // Sharpness
requiredItems.add(new ItemStack(Items.quartz, 4 * level));
break;
case 17: // Smite
requiredItems.add(new ItemStack(Blocks.soul_sand, 2 * level));
break;
case 18: // Anthropods
requiredItems.add(new ItemStack(Items.fermented_spider_eye, level));
break;
case 19: // Knockback
requiredItems.add(new ItemStack(Blocks.piston, level));
break;
case 20: // Fire Aspect
requiredItems.add(new ItemStack(Items.blaze_powder, 2 * level));
break;
case 21: // Looting
requiredItems.add(new ItemStack(Items.gold_ingot, 2 * level));
break;
case 32: // Efficiency
requiredItems.add(new ItemStack(Items.sugar, 4 * level));
break;
case 33: // Silk Touch
requiredItems.add(new ItemStack(RegisterItems.cloth, 8 * level));
break;
case 34: // Unbreaking
requiredItems.add(new ItemStack(Blocks.obsidian, level));
break;
case 35: // Fortune
requiredItems.add(new ItemStack(Items.dye, 4 * level, 4));
break;
case 48: // Power
requiredItems.add(new ItemStack(RegisterItems.leatherStrip, level));
break;
case 49: // Punch
requiredItems.add(new ItemStack(Items.gunpowder, level));
break;
case 50: // Flame
requiredItems.add(new ItemStack(Items.fire_charge, level));
break;
case 51: // Infinity
requiredItems.add(new ItemStack(Items.arrow, 16 * level));
break;
case 61: // Luck of the Sea
requiredItems.add(new ItemStack(Blocks.waterlily, level));
break;
case 62: // Lure
requiredItems.add(new ItemStack(Items.fish, level, 3));
break;
}
}
}
}
}
return requiredItems;
}
public static int getTakenLevels(InventoryInfusionRepair repairTable)
{
ItemStack infusedItem = repairTable.getStackInSlot(0);
if (infusedItem == null)
{
return 0;
}
if (infusedItem.getItem() == RegisterItems.noobWoodSword)
{
return 1;
}
else if (infusedItem.getItem() == RegisterItems.flintKnife || infusedItem
.getItem() == RegisterItems.flintHatchet)
{
return 1;
}
else if (infusedItem.getItem() == RegisterItems.boneKnife)
{
return 2;
}
else if (infusedItem.getItem() == RegisterItems.bonePickaxe)
{
return 1;
}
else if (infusedItem.getItem() instanceof ItemTool)
{
ItemTool tool = (ItemTool)infusedItem.getItem();
Item.ToolMaterial material = Item.ToolMaterial.valueOf(tool.getToolMaterialName());
switch (material)
{
case WOOD:
return 1;
case STONE:
return 5;
case IRON:
return 5;
case GOLD:
return 3;
case EMERALD: // See "WTF" below.
return 8;
default:
return 8;
}
}
else if (infusedItem.getItem() instanceof ItemSword)
{
ItemSword sword = (ItemSword)infusedItem.getItem();
Item.ToolMaterial material = Item.ToolMaterial.valueOf(sword.getToolMaterialName());
switch (material)
{
case WOOD:
return 1;
case STONE:
return 2;
case IRON:
return 5;
case GOLD:
return 3;
case EMERALD: // See "WTF" below.
return 8;
default:
if (material == RegisterItems.NOOBWOOD)
{
return 1;
}
else
{
return 8;
}
}
}
else if (infusedItem.getItem() instanceof ItemArmor)
{
ItemArmor armor = (ItemArmor)infusedItem.getItem();
switch (armor.getArmorMaterial())
{
case LEATHER:
return 1;
case CHAIN:
return 2;
case IRON:
return 5;
case GOLD:
return 3;
case DIAMOND: // WTF MOJANG?! (See above)
return 8;
default:
return 8;
}
}
else if (infusedItem.getItem() == Items.shears)
{
return 2;
}
else if (infusedItem.getItem() == Items.fishing_rod)
{
return 2;
}
else if (infusedItem.getItem() == Items.flint_and_steel)
{
return 1;
}
return 0;
}
}