From d83785ada6757243a884669e27d5e7fd4294297b Mon Sep 17 00:00:00 2001 From: Max Teegen Date: Fri, 27 Sep 2013 18:25:58 +0200 Subject: [PATCH] Implemented dispenser behavior for firing arrows. --- src/tconstruct/common/TContent.java | 2 + .../entity/projectile/ArrowEntity.java | 9 ++++ .../util/TDispenserBehaviorArrow.java | 45 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 src/tconstruct/util/TDispenserBehaviorArrow.java diff --git a/src/tconstruct/common/TContent.java b/src/tconstruct/common/TContent.java index 5c3365ed7d7..a36405b9775 100644 --- a/src/tconstruct/common/TContent.java +++ b/src/tconstruct/common/TContent.java @@ -1837,6 +1837,8 @@ public void oreRegistry() BlockDispenser.dispenseBehaviorRegistry.putObject(titleIcon, new TDispenserBehaviorSpawnEgg()); + BlockDispenser.dispenseBehaviorRegistry.putObject(arrow, new TDispenserBehaviorArrow()); + //Vanilla stuff OreDictionary.registerOre("slimeball", new ItemStack(Item.slimeBall)); OreDictionary.registerOre("slimeball", new ItemStack(strangeFood, 1, 0)); diff --git a/src/tconstruct/entity/projectile/ArrowEntity.java b/src/tconstruct/entity/projectile/ArrowEntity.java index 0832c947c94..f812a57f512 100644 --- a/src/tconstruct/entity/projectile/ArrowEntity.java +++ b/src/tconstruct/entity/projectile/ArrowEntity.java @@ -52,6 +52,15 @@ public ArrowEntity(World world, EntityLivingBase living, float baseSpeed, ItemSt this.baseDamage = toolTag.getInteger("Attack"); } + public ArrowEntity(World world, double x, double y, double z, ItemStack stack) + { + super(world, x, y, z); + this.returnStack = stack; + NBTTagCompound toolTag = stack.getTagCompound().getCompoundTag("InfiTool"); + this.mass = toolTag.getFloat("Mass"); + this.baseDamage = toolTag.getInteger("Attack"); + } + @Override public void onCollideWithPlayer (EntityPlayer par1EntityPlayer) { diff --git a/src/tconstruct/util/TDispenserBehaviorArrow.java b/src/tconstruct/util/TDispenserBehaviorArrow.java new file mode 100644 index 00000000000..a7f26610c39 --- /dev/null +++ b/src/tconstruct/util/TDispenserBehaviorArrow.java @@ -0,0 +1,45 @@ +package tconstruct.util; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import tconstruct.entity.projectile.ArrowEntity; + +public class TDispenserBehaviorArrow extends BehaviorDefaultDispenseItem +{ + + public ItemStack dispenseStack(IBlockSource dispenser, ItemStack stack) + { + World world = dispenser.getWorld(); + IPosition iposition = BlockDispenser.getIPositionFromBlockSource(dispenser); + EnumFacing enumfacing = BlockDispenser.getFacing(dispenser.getBlockMetadata()); + + ItemStack arrowItem = stack.splitStack(1); + + ArrowEntity projectile = new ArrowEntity(world, iposition.getX(), iposition.getY(), iposition.getZ(), arrowItem); + projectile.canBePickedUp = 1; + projectile.setThrowableHeading((double)enumfacing.getFrontOffsetX(), (double)((float)enumfacing.getFrontOffsetY() + 0.1F), (double)enumfacing.getFrontOffsetZ(), this.func_82500_b(), this.func_82498_a()); + world.spawnEntityInWorld(projectile); + + return stack; + } + + protected void playDispenseSound(IBlockSource dispenser) + { + dispenser.getWorld().playAuxSFX(1002, dispenser.getXInt(), dispenser.getYInt(), dispenser.getZInt(), 0); + } + + protected float func_82498_a() + { + return 6.0F; + } + + protected float func_82500_b() + { + return 1.1F; + } +} \ No newline at end of file