Files
TinkersConstruct/src/main/java/tconstruct/items/tools/BowBase.java
T

772 lines
26 KiB
Java
Raw Normal View History

2013-09-18 18:55:25 -07:00
package tconstruct.items.tools;
2014-09-09 18:30:15 +10:00
import cpw.mods.fml.relauncher.*;
import java.util.*;
2013-12-31 11:58:36 -05:00
import net.minecraft.client.renderer.texture.IIconRegister;
2014-09-09 18:30:15 +10:00
import net.minecraft.enchantment.*;
import net.minecraft.entity.player.*;
import net.minecraft.entity.projectile.EntityArrow;
2013-12-31 16:37:46 -05:00
import net.minecraft.init.Items;
2014-09-09 18:30:15 +10:00
import net.minecraft.item.*;
import net.minecraft.nbt.NBTTagCompound;
2013-12-31 11:58:36 -05:00
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
2014-09-09 18:30:15 +10:00
import net.minecraftforge.event.entity.player.*;
2014-02-05 10:28:54 -05:00
import tconstruct.library.crafting.ToolBuilder;
2014-09-09 18:30:15 +10:00
import tconstruct.library.tools.*;
2014-06-04 21:44:48 -08:00
import tconstruct.tools.TinkerTools;
import tconstruct.tools.entity.ArrowEntity;
public abstract class BowBase extends ToolCore
{
2013-12-31 16:37:46 -05:00
public BowBase()
{
2013-12-31 16:37:46 -05:00
super(0);
}
2014-02-17 00:31:43 -05:00
@Override
public int durabilityTypeAccessory ()
{
return 2;
}
2013-08-10 14:26:51 -04:00
@SideOnly(Side.CLIENT)
@Override
public int getRenderPasses (int metadata)
{
2013-08-10 14:26:51 -04:00
return 10;
}
/* Bow usage */
2014-02-17 00:31:43 -05:00
@Override
public void onPlayerStoppedUsing (ItemStack stack, World world, EntityPlayer player, int useRemaining)
{
int time = this.getMaxItemUseDuration(stack) - useRemaining;
ArrowLooseEvent event = new ArrowLooseEvent(player, stack, time);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
{
return;
}
time = event.charge;
boolean creative = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, stack) > 0;
2014-06-04 21:44:48 -08:00
int slotID = getInventorySlotContainItem(TinkerTools.arrow, player.inventory);
2013-12-31 16:37:46 -05:00
int arrowID = getInventorySlotContainItem(Items.arrow, player.inventory);
int arrowState = 0;
ItemStack tinkerArrow = null;
if (slotID != -1)
tinkerArrow = player.inventory.getStackInSlot(slotID);
if (creative || tinkerArrow != null || arrowID != -1)
{
NBTTagCompound toolTag = stack.getTagCompound().getCompoundTag("InfiTool");
float drawTime = toolTag.getInteger("DrawSpeed");
float flightSpeed = toolTag.getFloat("FlightSpeed");
float speedBase = (float) time / drawTime;
speedBase = (speedBase * speedBase + speedBase * 2.0F) / 3.0F;
if ((double) speedBase < 0.1D)
{
return;
}
if (speedBase > flightSpeed)
{
speedBase = flightSpeed;
}
EntityArrow arrowEntity = null;
2014-02-16 14:23:50 -05:00
// if (tinkerArrow != null)
if (slotID != -1 && (arrowID == -1 || slotID < arrowID))
{
ItemStack arrowStack = tinkerArrow.copy();
arrowStack.stackSize = 1;
arrowEntity = new ArrowEntity(world, player, speedBase * 2.0F, arrowStack);
}
else
{
arrowEntity = new EntityArrow(world, player, speedBase * 2.0F);
}
if (speedBase >= 1.0F)
{
arrowEntity.setIsCritical(true);
}
int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack);
if (var9 > 0)
{
arrowEntity.setDamage(arrowEntity.getDamage() + (double) var9 * 0.5D + 0.5D);
}
int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, stack);
if (slotID != -1 && (arrowID == -1 || slotID < arrowID))
((ArrowEntity) arrowEntity).setKnockbackModStrength(toolTag.getFloat("Knockback"));
2014-02-16 14:23:50 -05:00
// var10 += toolTag.getFloat("Knockback");
if (var10 > 0)
{
arrowEntity.setKnockbackStrength(var10);
}
if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, stack) > 0)
{
arrowEntity.setFire(100);
}
int reinforced = 0;
if (toolTag.hasKey("Unbreaking"))
reinforced = toolTag.getInteger("Unbreaking");
if (random.nextInt(10) < 10 - reinforced)
{
AbilityHelper.damageTool(stack, 1, player, false);
}
world.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + speedBase * 0.5F);
if (creative)
{
arrowEntity.canBePickedUp = 2;
}
else
{
2014-02-16 14:23:50 -05:00
// if (tinkerArrow != null)
if (slotID != -1 && (arrowID == -1 || slotID < arrowID))
{
2014-06-04 21:44:48 -08:00
player.inventory.consumeInventoryItem(TinkerTools.arrow);
}
else
{
2014-02-05 08:28:53 -05:00
player.inventory.consumeInventoryItem(Items.arrow);
}
}
if (!world.isRemote)
{
world.spawnEntityInWorld(arrowEntity);
}
}
}
2013-12-31 11:58:36 -05:00
int getInventorySlotContainItem (Item item, InventoryPlayer inventory)
{
for (int j = 0; j < inventory.mainInventory.length; ++j)
{
2014-01-10 21:14:54 -05:00
if (inventory.mainInventory[j] != null && inventory.mainInventory[j].getItem() == item)
{
return j;
}
}
return -1;
}
public ItemStack onFoodEaten (ItemStack stack, World par2World, EntityPlayer par3EntityPlayer)
{
return stack;
}
/**
* How long it takes to use or consume an item
*/
2014-02-17 00:31:43 -05:00
@Override
public int getMaxItemUseDuration (ItemStack par1ItemStack)
{
return 72000;
}
/**
2014-02-16 14:23:50 -05:00
* returns the action that specifies what animation to play when the items
* is being used
*/
2014-02-17 00:31:43 -05:00
@Override
public EnumAction getItemUseAction (ItemStack par1ItemStack)
{
return EnumAction.bow;
}
/**
2014-02-16 14:23:50 -05:00
* Called whenever this item is equipped and the right mouse button is
* pressed. Args: itemStack, world, entityPlayer
*/
2014-02-17 00:31:43 -05:00
@Override
public ItemStack onItemRightClick (ItemStack stack, World par2World, EntityPlayer player)
{
if (stack.hasTagCompound())
{
NBTTagCompound toolTag = stack.getTagCompound().getCompoundTag("InfiTool");
if (!toolTag.getBoolean("Broken"))
{
ArrowNockEvent event = new ArrowNockEvent(player, stack);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
{
return event.result;
}
2014-06-04 21:44:48 -08:00
if (player.capabilities.isCreativeMode || player.inventory.hasItemStack(new ItemStack(Items.arrow)) || player.inventory.hasItemStack(new ItemStack(TinkerTools.arrow)))
{
player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
}
}
}
return stack;
}
@SideOnly(Side.CLIENT)
@Override
public boolean requiresMultipleRenderPasses ()
{
2013-08-31 05:13:31 -07:00
return true;
}
/* Rendering */
@Override
2013-12-31 11:58:36 -05:00
public void registerIcons (IIconRegister iconRegister)
{
super.registerIcons(iconRegister);
headIcons1.clear();
handleIcons1.clear();
accessoryIcons1.clear();
extraIcons1.clear();
effectIcons1.clear();
Iterator iterOne = headStrings.entrySet().iterator();
while (iterOne.hasNext())
{
Map.Entry pairs = (Map.Entry) iterOne.next();
headIcons1.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_1"));
}
iterOne = handleStrings.entrySet().iterator();
while (iterOne.hasNext())
{
Map.Entry pairs = (Map.Entry) iterOne.next();
handleIcons1.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_1"));
}
if (getPartAmount() > 2)
{
iterOne = accessoryStrings.entrySet().iterator();
while (iterOne.hasNext())
{
Map.Entry pairs = (Map.Entry) iterOne.next();
accessoryIcons1.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_1"));
}
}
if (getPartAmount() > 3)
{
iterOne = extraStrings.entrySet().iterator();
while (iterOne.hasNext())
{
Map.Entry pairs = (Map.Entry) iterOne.next();
extraIcons1.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_1"));
}
}
iterOne = effectStrings.entrySet().iterator();
while (iterOne.hasNext())
{
Map.Entry pairs = (Map.Entry) iterOne.next();
effectIcons1.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_1"));
}
headIcons2.clear();
handleIcons2.clear();
accessoryIcons2.clear();
extraIcons2.clear();
effectIcons2.clear();
Iterator iterTwo = headStrings.entrySet().iterator();
while (iterTwo.hasNext())
{
Map.Entry pairs = (Map.Entry) iterTwo.next();
headIcons2.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_2"));
}
iterTwo = handleStrings.entrySet().iterator();
while (iterTwo.hasNext())
{
Map.Entry pairs = (Map.Entry) iterTwo.next();
handleIcons2.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_2"));
}
if (getPartAmount() > 2)
{
iterTwo = accessoryStrings.entrySet().iterator();
while (iterTwo.hasNext())
{
Map.Entry pairs = (Map.Entry) iterTwo.next();
accessoryIcons2.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_2"));
}
}
if (getPartAmount() > 3)
{
iterTwo = extraStrings.entrySet().iterator();
while (iterTwo.hasNext())
{
Map.Entry pairs = (Map.Entry) iterTwo.next();
extraIcons2.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_2"));
}
}
iterTwo = effectStrings.entrySet().iterator();
while (iterTwo.hasNext())
{
Map.Entry pairs = (Map.Entry) iterTwo.next();
effectIcons2.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_2"));
}
headIcons3.clear();
handleIcons3.clear();
accessoryIcons3.clear();
extraIcons3.clear();
effectIcons3.clear();
Iterator iterThree = headStrings.entrySet().iterator();
while (iterThree.hasNext())
{
Map.Entry pairs = (Map.Entry) iterThree.next();
headIcons3.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_3"));
}
iterThree = handleStrings.entrySet().iterator();
while (iterThree.hasNext())
{
Map.Entry pairs = (Map.Entry) iterThree.next();
handleIcons3.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_3"));
}
if (getPartAmount() > 2)
{
iterThree = accessoryStrings.entrySet().iterator();
while (iterThree.hasNext())
{
Map.Entry pairs = (Map.Entry) iterThree.next();
accessoryIcons3.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_3"));
}
}
if (getPartAmount() > 3)
{
iterThree = extraStrings.entrySet().iterator();
while (iterThree.hasNext())
{
Map.Entry pairs = (Map.Entry) iterThree.next();
extraIcons3.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_3"));
}
}
iterThree = effectStrings.entrySet().iterator();
while (iterThree.hasNext())
{
Map.Entry pairs = (Map.Entry) iterThree.next();
effectIcons3.put((Integer) pairs.getKey(), iconRegister.registerIcon((String) pairs.getValue() + "_3"));
}
registerArrows(iconRegister);
}
2013-12-31 11:58:36 -05:00
void registerArrows (IIconRegister iconRegister)
{
arrow1 = iconRegister.registerIcon("tinker:" + getDefaultFolder() + "/arrow_1");
arrow2 = iconRegister.registerIcon("tinker:" + getDefaultFolder() + "/arrow_2");
arrow3 = iconRegister.registerIcon("tinker:" + getDefaultFolder() + "/arrow_3");
}
@Override
2013-12-31 11:58:36 -05:00
public IIcon getIcon (ItemStack stack, int renderPass)
{
NBTTagCompound tags = stack.getTagCompound();
if (tags != null)
{
tags = stack.getTagCompound().getCompoundTag("InfiTool");
if (renderPass < getPartAmount())
{
if (renderPass == 0) // Handle
{
if (tags.getBoolean("Broken"))
return (brokenIcons.get(tags.getInteger("RenderHandle")));
return handleIcons.get(tags.getInteger("RenderHandle"));
}
else if (renderPass == 1) // Head
{
return (headIcons.get(tags.getInteger("RenderHead")));
}
else if (renderPass == 2) // Accessory
{
return (accessoryIcons.get(tags.getInteger("RenderAccessory")));
}
else if (renderPass == 3) // Extra
{
return (extraIcons.get(tags.getInteger("RenderExtra")));
}
}
else
{
if (renderPass == getPartAmount())
{
if (tags.hasKey("Effect1"))
return (effectIcons.get(tags.getInteger("Effect1")));
}
else if (renderPass == getPartAmount() + 1)
{
if (tags.hasKey("Effect2"))
return (effectIcons.get(tags.getInteger("Effect2")));
}
else if (renderPass == getPartAmount() + 2)
{
if (tags.hasKey("Effect3"))
return (effectIcons.get(tags.getInteger("Effect3")));
}
else if (renderPass == getPartAmount() + 3)
{
if (tags.hasKey("Effect4"))
return (effectIcons.get(tags.getInteger("Effect4")));
}
else if (renderPass == getPartAmount() + 4)
{
if (tags.hasKey("Effect5"))
return (effectIcons.get(tags.getInteger("Effect5")));
}
else if (renderPass == getPartAmount() + 5)
{
if (tags.hasKey("Effect6"))
return (effectIcons.get(tags.getInteger("Effect6")));
}
}
return blankSprite;
}
return emptyIcon;
}
/* Animations */
@Override
public void registerPartPaths (int index, String[] location)
{
headStrings.put(index, location[0]);
2014-02-16 14:23:50 -05:00
// brokenHeadStrings.put(index, location[1]);
// handleStrings.put(index, location[2]);
if (location.length > 3)
accessoryStrings.put(index, location[3]);
if (location.length > 4)
extraStrings.put(index, location[4]);
}
@Override
public void registerAlternatePartPaths (int index, String[] location)
{
brokenPartStrings.put(index, location[1]);
handleStrings.put(index, location[2]);
}
2013-12-31 11:58:36 -05:00
public IIcon arrow1;
public IIcon arrow2;
public IIcon arrow3;
2013-12-31 11:58:36 -05:00
public HashMap<Integer, IIcon> headIcons1 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> handleIcons1 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> accessoryIcons1 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> extraIcons1 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> effectIcons1 = new HashMap<Integer, IIcon>();
2013-12-31 11:58:36 -05:00
public HashMap<Integer, IIcon> headIcons2 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> handleIcons2 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> accessoryIcons2 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> extraIcons2 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> effectIcons2 = new HashMap<Integer, IIcon>();
2013-12-31 11:58:36 -05:00
public HashMap<Integer, IIcon> headIcons3 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> handleIcons3 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> accessoryIcons3 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> extraIcons3 = new HashMap<Integer, IIcon>();
public HashMap<Integer, IIcon> effectIcons3 = new HashMap<Integer, IIcon>();
@Override
2013-12-31 11:58:36 -05:00
public IIcon getIcon (ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining)
{
int useTime = stack.getMaxItemUseDuration() - useRemaining;
if (!stack.hasTagCompound())
return emptyIcon;
NBTTagCompound toolTag = stack.getTagCompound().getCompoundTag("InfiTool");
int drawTime = toolTag.getInteger("DrawSpeed");
float flightSpeed = toolTag.getFloat("FlightSpeed");
drawTime *= flightSpeed;
2014-07-14 01:54:03 +03:00
if (usingItem == null)
{
return getIcon(stack, renderPass);
}
if (useTime >= drawTime - 2)
{
return getIcon3(stack, renderPass);
}
if (useTime >= (drawTime * 2 / 3))
{
return getIcon2(stack, renderPass);
}
return getIcon1(stack, renderPass);
}
2013-12-31 11:58:36 -05:00
public IIcon getIcon1 (ItemStack stack, int renderPass)
{
NBTTagCompound tags = stack.getTagCompound();
if (tags != null)
{
tags = stack.getTagCompound().getCompoundTag("InfiTool");
if (renderPass < getPartAmount())
{
if (renderPass == 0) // Handle
{
return handleIcons1.get(tags.getInteger("RenderHandle"));
}
else if (renderPass == 1) // Head
{
return (headIcons1.get(tags.getInteger("RenderHead")));
}
else if (renderPass == 2) // Accessory
{
return (accessoryIcons1.get(tags.getInteger("RenderAccessory")));
}
else if (renderPass == 3) // Extra
{
return (extraIcons1.get(tags.getInteger("RenderExtra")));
}
}
else
{
if (renderPass == getPartAmount())
{
if (tags.hasKey("Effect1"))
return (effectIcons1.get(tags.getInteger("Effect1")));
}
else if (renderPass == getPartAmount() + 1)
{
if (tags.hasKey("Effect2"))
return (effectIcons1.get(tags.getInteger("Effect2")));
}
else if (renderPass == getPartAmount() + 2)
{
if (tags.hasKey("Effect3"))
return (effectIcons1.get(tags.getInteger("Effect3")));
}
else if (renderPass == getPartAmount() + 3)
{
if (tags.hasKey("Effect4"))
return (effectIcons1.get(tags.getInteger("Effect4")));
}
else if (renderPass == getPartAmount() + 4)
{
if (tags.hasKey("Effect5"))
return (effectIcons1.get(tags.getInteger("Effect5")));
}
else if (renderPass == getPartAmount() + 5)
{
if (tags.hasKey("Effect6"))
return (effectIcons1.get(tags.getInteger("Effect6")));
}
else
{
return arrow1;
}
}
return blankSprite;
}
return emptyIcon;
}
2013-12-31 11:58:36 -05:00
public IIcon getIcon2 (ItemStack stack, int renderPass)
{
NBTTagCompound tags = stack.getTagCompound();
if (tags != null)
{
tags = stack.getTagCompound().getCompoundTag("InfiTool");
if (renderPass < getPartAmount())
{
if (renderPass == 0) // Handle
{
return handleIcons2.get(tags.getInteger("RenderHandle"));
}
else if (renderPass == 1) // Head
{
return (headIcons2.get(tags.getInteger("RenderHead")));
}
else if (renderPass == 2) // Accessory
{
return (accessoryIcons2.get(tags.getInteger("RenderAccessory")));
}
else if (renderPass == 3) // Extra
{
return (extraIcons2.get(tags.getInteger("RenderExtra")));
}
}
else
{
if (renderPass == getPartAmount())
{
if (tags.hasKey("Effect1"))
return (effectIcons2.get(tags.getInteger("Effect1")));
}
else if (renderPass == getPartAmount() + 1)
{
if (tags.hasKey("Effect2"))
return (effectIcons2.get(tags.getInteger("Effect2")));
}
else if (renderPass == getPartAmount() + 2)
{
if (tags.hasKey("Effect3"))
return (effectIcons2.get(tags.getInteger("Effect3")));
}
else if (renderPass == getPartAmount() + 3)
{
if (tags.hasKey("Effect4"))
return (effectIcons2.get(tags.getInteger("Effect4")));
}
else if (renderPass == getPartAmount() + 4)
{
if (tags.hasKey("Effect5"))
return (effectIcons2.get(tags.getInteger("Effect5")));
}
else if (renderPass == getPartAmount() + 5)
{
if (tags.hasKey("Effect6"))
return (effectIcons2.get(tags.getInteger("Effect6")));
}
else
{
return arrow2;
}
}
return blankSprite;
}
return emptyIcon;
}
2013-12-31 11:58:36 -05:00
public IIcon getIcon3 (ItemStack stack, int renderPass)
{
NBTTagCompound tags = stack.getTagCompound();
if (tags != null)
{
tags = stack.getTagCompound().getCompoundTag("InfiTool");
if (renderPass < getPartAmount())
{
if (renderPass == 0) // Handle
{
return handleIcons3.get(tags.getInteger("RenderHandle"));
}
else if (renderPass == 1) // Head
{
return (headIcons3.get(tags.getInteger("RenderHead")));
}
else if (renderPass == 2) // Accessory
{
return (accessoryIcons3.get(tags.getInteger("RenderAccessory")));
}
else if (renderPass == 3) // Extra
{
return (extraIcons3.get(tags.getInteger("RenderExtra")));
}
}
else
{
if (renderPass == getPartAmount())
{
if (tags.hasKey("Effect1"))
return (effectIcons3.get(tags.getInteger("Effect1")));
}
else if (renderPass == getPartAmount() + 1)
{
if (tags.hasKey("Effect2"))
return (effectIcons3.get(tags.getInteger("Effect2")));
}
else if (renderPass == getPartAmount() + 2)
{
if (tags.hasKey("Effect3"))
return (effectIcons3.get(tags.getInteger("Effect3")));
}
else if (renderPass == getPartAmount() + 3)
{
if (tags.hasKey("Effect4"))
return (effectIcons3.get(tags.getInteger("Effect4")));
}
else if (renderPass == getPartAmount() + 4)
{
if (tags.hasKey("Effect5"))
return (effectIcons3.get(tags.getInteger("Effect5")));
}
else if (renderPass == getPartAmount() + 5)
{
if (tags.hasKey("Effect6"))
return (effectIcons3.get(tags.getInteger("Effect6")));
}
else
{
return arrow3;
}
}
return blankSprite;
}
return emptyIcon;
}
@Override
public void buildTool (int id, String name, List list)
{
Item accessory = getAccessoryItem();
ItemStack accessoryStack = accessory != null ? new ItemStack(getAccessoryItem(), 1, id) : null;
Item extra = getExtraItem();
ItemStack extraStack = extra != null ? new ItemStack(getExtraItem(), 1, id) : null;
ItemStack tool = ToolBuilder.instance.buildTool(new ItemStack(getHeadItem(), 1, id), new ItemStack(getHandleItem(), 1, id), accessoryStack, extraStack, name);
if (tool == null)
return;
tool.getTagCompound().getCompoundTag("InfiTool").setBoolean("Built", true);
list.add(tool);
}
}