resonant-induction/archive/java/resonantinduction/old/core/misc/ItemCommonTool.java
2014-01-11 17:44:07 +08:00

541 lines
15 KiB
Java

package resonantinduction.old.core.misc;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentDurability;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.stats.StatList;
import net.minecraft.util.Icon;
import net.minecraft.world.World;
import net.minecraftforge.common.Configuration;
import net.minecraftforge.common.IShearable;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.Event.Result;
import net.minecraftforge.event.entity.player.UseHoeEvent;
import net.minecraftforge.oredict.OreDictionary;
import resonantinduction.core.Reference;
import resonantinduction.core.Settings;
import com.google.common.collect.Multimap;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import dark.lib.EnumMaterial;
import dark.lib.IExtraInfo.IExtraItemInfo;
/**
* Flexible tool class that uses NBT to store damage and effect rather than metadata. Metadata
* instead is used to store sub items allowing several different tools to exist within the same item
*
* @author DarkGuardsman
*/
public class ItemCommonTool extends Item implements IExtraItemInfo
{
protected int enchant = 5;
public static final String TOOL_DAMAGE = "toolDamage";
public static final String BROKEN_NBT = "broken";
public static final String REINFORCED_NBT = "reinforced";
public static final String HEATTREATED_NBT = "heattreated";
public static final String HANDLE_NBT = "handle";
public ItemCommonTool()
{
super(Settings.CONFIGURATION.getItem("Items", "CommonTools", Settings.getNextItemID()).getInt());
this.maxStackSize = 1;
this.setCreativeTab(CreativeTabs.tabTools);
}
@Override
public void onCreated(ItemStack itemStack, World world, EntityPlayer entityPlayer)
{
if (itemStack.stackTagCompound == null)
{
itemStack.setTagCompound(new NBTTagCompound());
}
itemStack.getTagCompound().setString("Creator", (entityPlayer != null ? entityPlayer.username : "Magical Dwarfs"));
itemStack.getTagCompound().setInteger("ToolID", itemStack.getItemDamage());
}
@Override
public Multimap getItemAttributeModifiers()
{
Multimap multimap = super.getItemAttributeModifiers();
multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", 6, 0));
return multimap;
}
@Override
public void addInformation(ItemStack itemStack, EntityPlayer player, List list, boolean par4)
{
if (itemStack != null)
{
if (itemStack.getTagCompound() == null)
{
itemStack.setTagCompound(new NBTTagCompound());
}
if (itemStack.getTagCompound().hasKey("Creator"))
{
list.add("Created by " + itemStack.getTagCompound().getString("Creator"));
}
if (itemStack.getTagCompound().getBoolean(BROKEN_NBT))
{
list.add("Blunted");
}
else
{
EnumMaterial mat = EnumTool.getToolMatFromMeta(itemStack.getItemDamage());
int currentDamage = itemStack.getTagCompound().getInteger(TOOL_DAMAGE);
list.add("D: " + currentDamage + "/" + mat.maxUses);
}
}
}
@SideOnly(Side.CLIENT)
@Override
public int getColorFromItemStack(ItemStack itemStack, int par2)
{
if (itemStack.getTagCompound() == null)
{
itemStack.setTagCompound(new NBTTagCompound());
}
if (itemStack.getTagCompound().getBoolean(BROKEN_NBT))
{
return Color.RED.getRGB();
}
return super.getColorFromItemStack(itemStack, par2);
}
@Override
public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10)
{
if (itemStack.getTagCompound() == null)
{
itemStack.setTagCompound(new NBTTagCompound());
}
if (itemStack.getTagCompound().getBoolean(BROKEN_NBT))
{
return false;
}
if (EnumTool.getToolFromMeta(itemStack.getItemDamage()) == EnumTool.HOE)
{
if (!player.canPlayerEdit(x, y, z, par7, itemStack))
{
return false;
}
else
{
UseHoeEvent event = new UseHoeEvent(player, itemStack, world, x, y, z);
if (MinecraftForge.EVENT_BUS.post(event))
{
return false;
}
if (event.getResult() == Result.ALLOW)
{
this.damage(itemStack, 1, player);
return true;
}
int blockID = world.getBlockId(x, y, z);
boolean air = world.isAirBlock(x, y + 1, z);
if (par7 != 0 && air && (blockID == Block.grass.blockID || blockID == Block.dirt.blockID))
{
Block block = Block.tilledField;
world.playSoundEffect((x + 0.5F), (y + 0.5F), (z + 0.5F), block.stepSound.getStepSound(), (block.stepSound.getVolume() + 1.0F) / 2.0F, block.stepSound.getPitch() * 0.8F);
if (world.isRemote)
{
return true;
}
else
{
world.setBlock(x, y, z, block.blockID);
this.damage(itemStack, 1, player);
return true;
}
}
}
}
return false;
}
@Override
public EnumAction getItemUseAction(ItemStack par1ItemStack)
{
if (EnumTool.getToolFromMeta(par1ItemStack.getItemDamage()) == EnumTool.SWORD)
{
return EnumAction.block;
}
return super.getItemUseAction(par1ItemStack);
}
@Override
public int getMaxItemUseDuration(ItemStack par1ItemStack)
{
if (EnumTool.getToolFromMeta(par1ItemStack.getItemDamage()) == EnumTool.SWORD)
{
return 72000;
}
return super.getMaxItemUseDuration(par1ItemStack);
}
@Override
public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
{
if (EnumTool.getToolFromMeta(par1ItemStack.getItemDamage()) == EnumTool.SWORD)
{
par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack));
}
return par1ItemStack;
}
@Override
public boolean itemInteractionForEntity(ItemStack itemstack, EntityPlayer player, EntityLivingBase entity)
{
if (entity.worldObj.isRemote)
{
return false;
}
if (entity instanceof IShearable && EnumTool.getToolFromMeta(itemstack.getItemDamage()) == EnumTool.SHEAR)
{
IShearable target = (IShearable) entity;
if (target.isShearable(itemstack, entity.worldObj, (int) entity.posX, (int) entity.posY, (int) entity.posZ))
{
ArrayList<ItemStack> drops = target.onSheared(itemstack, entity.worldObj, (int) entity.posX, (int) entity.posY, (int) entity.posZ, EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, itemstack));
Random rand = new Random();
for (ItemStack stack : drops)
{
EntityItem ent = entity.entityDropItem(stack, 1.0F);
ent.motionY += rand.nextFloat() * 0.05F;
ent.motionX += (rand.nextFloat() - rand.nextFloat()) * 0.1F;
ent.motionZ += (rand.nextFloat() - rand.nextFloat()) * 0.1F;
}
this.damage(itemstack, 1, entity);
}
return true;
}
return false;
}
@Override
public boolean onBlockStartBreak(ItemStack itemstack, int x, int y, int z, EntityPlayer player)
{
if (player.worldObj.isRemote)
{
return false;
}
int id = player.worldObj.getBlockId(x, y, z);
if (Block.blocksList[id] instanceof IShearable && EnumTool.getToolFromMeta(itemstack.getItemDamage()) == EnumTool.SHEAR)
{
IShearable target = (IShearable) Block.blocksList[id];
if (target.isShearable(itemstack, player.worldObj, x, y, z))
{
ArrayList<ItemStack> drops = target.onSheared(itemstack, player.worldObj, x, y, z, EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, itemstack));
Random rand = new Random();
for (ItemStack stack : drops)
{
float f = 0.7F;
double d = (rand.nextFloat() * f) + (1.0F - f) * 0.5D;
double d1 = (rand.nextFloat() * f) + (1.0F - f) * 0.5D;
double d2 = (rand.nextFloat() * f) + (1.0F - f) * 0.5D;
EntityItem entityitem = new EntityItem(player.worldObj, x + d, y + d1, z + d2, stack);
entityitem.delayBeforeCanPickup = 10;
player.worldObj.spawnEntityInWorld(entityitem);
}
itemstack.damageItem(1, player);
player.addStat(StatList.mineBlockStatArray[id], 1);
}
}
return false;
}
/** Applies damage to the item using NBT as well uses the normal ItemStack damage checks */
public void damage(ItemStack itemStack, int damage, EntityLivingBase entity)
{
if (itemStack.getTagCompound() == null)
{
itemStack.setTagCompound(new NBTTagCompound());
}
EnumMaterial mat = EnumTool.getToolMatFromMeta(itemStack.getItemDamage());
if (entity instanceof EntityPlayer && ((EntityPlayer) entity).capabilities.isCreativeMode)
{
return;
}
if (damage > 0)
{
int j = EnchantmentHelper.getEnchantmentLevel(Enchantment.unbreaking.effectId, itemStack);
int k = 0;
for (int l = 0; j > 0 && l < damage; ++l)
{
if (EnchantmentDurability.negateDamage(itemStack, j, entity.worldObj.rand))
{
++k;
}
}
damage -= k;
if (damage <= 0)
{
return;
}
}
int currentDamage = itemStack.getTagCompound().getInteger(TOOL_DAMAGE) + damage;
damage = Math.max(Math.min(damage, mat.maxUses), 0);
itemStack.getTagCompound().setInteger(TOOL_DAMAGE, currentDamage);
if (entity instanceof EntityPlayer)
{
((EntityPlayer) entity).inventory.onInventoryChanged();
}
if (currentDamage > mat.maxUses)
{
entity.renderBrokenItemStack(itemStack);
itemStack.getTagCompound().setBoolean(BROKEN_NBT, true);
if (entity instanceof EntityPlayer)
{
EntityPlayer entityplayer = (EntityPlayer) entity;
entityplayer.addStat(StatList.objectBreakStats[this.itemID], 1);
}
}
}
@Override
public boolean isDamaged(ItemStack itemStack)
{
if (itemStack.getTagCompound() == null)
{
itemStack.setTagCompound(new NBTTagCompound());
}
if (itemStack.getTagCompound().getBoolean(BROKEN_NBT))
{
return true;
}
return itemStack.getTagCompound().getInteger(TOOL_DAMAGE) > 0;
}
@Override
public boolean hitEntity(ItemStack itemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase)
{
this.damage(itemStack, EnumTool.getToolFromMeta(itemStack.getItemDamage()) == EnumTool.SWORD ? 1 : 2, par2EntityLivingBase);
return true;
}
@Override
public boolean onBlockDestroyed(ItemStack itemStack, World par2World, int par3, int par4, int par5, int par6, EntityLivingBase par7EntityLivingBase)
{
if (EnumTool.getToolFromMeta(itemStack.getItemDamage()) == EnumTool.SHEAR && par3 != Block.leaves.blockID && par3 != Block.web.blockID && par3 != Block.tallGrass.blockID && par3 != Block.vine.blockID && par3 != Block.tripWire.blockID && !(Block.blocksList[par3] instanceof IShearable))
{
return false;
}
if (Block.blocksList[par3].getBlockHardness(par2World, par4, par5, par6) != 0.0D)
{
this.damage(itemStack, EnumTool.getToolFromMeta(itemStack.getItemDamage()) == EnumTool.SWORD ? 2 : 1, par7EntityLivingBase);
}
return true;
}
@Override
public int getItemEnchantability()
{
return this.enchant;
}
@SideOnly(Side.CLIENT)
@Override
public boolean isFull3D()
{
return true;
}
@Override
public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack)
{
// TODO,, We will have to check on how this is done to prevent issues with the way damage is
// actually saved
return false;
}
@Override
public float getStrVsBlock(ItemStack itemStack, Block block)
{
if (itemStack != null && block != null)
{
if (itemStack.getTagCompound() == null)
{
itemStack.setTagCompound(new NBTTagCompound());
}
if (itemStack.getTagCompound().getBoolean(BROKEN_NBT))
{
return 0;
}
EnumTool tool = EnumTool.getToolFromMeta(itemStack.getItemDamage());
EnumMaterial mat = EnumTool.getToolMatFromMeta(itemStack.getItemDamage());
if (tool.effecticVsMaterials.contains(block.blockMaterial))
{
return mat.materialEffectiveness + (tool == EnumTool.SHEAR && block.blockMaterial == Material.leaves ? 9f : 0f);
}
return 1.0F;
}
return 0;
}
@Override
public boolean canHarvestBlock(Block par1Block)
{
return true;
}
@Override
public boolean canHarvestBlock(Block block, ItemStack itemStack)
{
if (itemStack != null && block != null)
{
if (itemStack.getTagCompound() == null)
{
itemStack.setTagCompound(new NBTTagCompound());
}
if (itemStack.getTagCompound().getBoolean(BROKEN_NBT))
{
return false;
}
EnumTool tool = EnumTool.getToolFromMeta(itemStack.getItemDamage());
EnumMaterial mat = EnumTool.getToolMatFromMeta(itemStack.getItemDamage());
if (tool.effecticVsMaterials.contains(block.blockMaterial))
{
return true;
}
}
return false;
}
@Override
public String getUnlocalizedName(ItemStack itemStack)
{
if (itemStack != null)
{
return "item." + Reference.PREFIX + EnumTool.getFullName(itemStack.getItemDamage());
}
else
{
return this.getUnlocalizedName();
}
}
@Override
public int getDisplayDamage(ItemStack itemStack)
{
if (itemStack.getTagCompound() == null)
{
itemStack.setTagCompound(new NBTTagCompound());
}
int damage = itemStack.getTagCompound().getInteger(TOOL_DAMAGE);
EnumMaterial mat = EnumTool.getToolMatFromMeta(itemStack.getItemDamage());
return (damage / mat.maxUses) * 100;
}
@Override
public Icon getIconFromDamage(int i)
{
return EnumTool.getToolIcon(i);
}
@SideOnly(Side.CLIENT)
@Override
public void registerIcons(IconRegister iconRegister)
{
for (EnumTool tool : EnumTool.values())
{
for (EnumMaterial mat : EnumMaterial.values())
{
if (mat.hasTools)
{
tool.toolIcons = new Icon[EnumMaterial.values().length];
if (tool.enabled)
{
tool.toolIcons[mat.ordinal()] = iconRegister.registerIcon(Reference.PREFIX + "tool." + mat.simpleName + tool.name);
}
}
}
}
}
@Override
public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List)
{
for (EnumMaterial mat : EnumMaterial.values())
{
if (mat.hasTools)
{
for (EnumTool tool : EnumTool.values())
{
ItemStack stack = tool.getTool(mat);
if (tool.enabled && stack != null)
{
this.onCreated(stack, null, null);
par3List.add(stack);
}
}
}
}
}
@Override
public boolean hasExtraConfigs()
{
// TODO Add configs such as enable broken tools, and allow tools to be salvaged
return false;
}
@Override
public void loadExtraConfigs(Configuration config)
{
// TODO Auto-generated method stub
}
@Override
public void loadOreNames()
{
for (EnumMaterial mat : EnumMaterial.values())
{
if (mat.hasTools)
{
for (EnumTool tool : EnumTool.values())
{
ItemStack stack = tool.getTool(mat);
if (tool.enabled && stack != null)
{
OreDictionary.registerOre(EnumTool.getFullName(stack.getItemDamage()), stack);
}
}
}
}
}
}