diff --git a/Blends/Spear.png b/Blends/Spear.png new file mode 100644 index 00000000..0df8d9c8 Binary files /dev/null and b/Blends/Spear.png differ diff --git a/bin/com/kitsu/medievalcraft/ClientProxy.class b/bin/com/kitsu/medievalcraft/ClientProxy.class index 0c00503c..a1099842 100644 Binary files a/bin/com/kitsu/medievalcraft/ClientProxy.class and b/bin/com/kitsu/medievalcraft/ClientProxy.class differ diff --git a/bin/com/kitsu/medievalcraft/Main.class b/bin/com/kitsu/medievalcraft/Main.class index fc08e173..5e76d9a0 100644 Binary files a/bin/com/kitsu/medievalcraft/Main.class and b/bin/com/kitsu/medievalcraft/Main.class differ diff --git a/bin/com/kitsu/medievalcraft/block/machines/Firebox.class b/bin/com/kitsu/medievalcraft/block/machines/Firebox.class index 0d80d9b8..179033dc 100644 Binary files a/bin/com/kitsu/medievalcraft/block/machines/Firebox.class and b/bin/com/kitsu/medievalcraft/block/machines/Firebox.class differ diff --git a/bin/com/kitsu/medievalcraft/item/ModItems.class b/bin/com/kitsu/medievalcraft/item/ModItems.class index 93a7f87f..cca03b64 100644 Binary files a/bin/com/kitsu/medievalcraft/item/ModItems.class and b/bin/com/kitsu/medievalcraft/item/ModItems.class differ diff --git a/bin/com/kitsu/medievalcraft/renderer/RendererRegistry.class b/bin/com/kitsu/medievalcraft/renderer/RendererRegistry.class index d2ce1186..81bdda6d 100644 Binary files a/bin/com/kitsu/medievalcraft/renderer/RendererRegistry.class and b/bin/com/kitsu/medievalcraft/renderer/RendererRegistry.class differ diff --git a/bin/com/kitsu/medievalcraft/tileents/machine/TileEntityFirebox.class b/bin/com/kitsu/medievalcraft/tileents/machine/TileEntityFirebox.class index 5de3c7f5..06d6e98a 100644 Binary files a/bin/com/kitsu/medievalcraft/tileents/machine/TileEntityFirebox.class and b/bin/com/kitsu/medievalcraft/tileents/machine/TileEntityFirebox.class differ diff --git a/src/main/java/com/kitsu/medievalcraft/ClientProxy.java b/src/main/java/com/kitsu/medievalcraft/ClientProxy.java index ff8bcaeb..2cf63ea2 100644 --- a/src/main/java/com/kitsu/medievalcraft/ClientProxy.java +++ b/src/main/java/com/kitsu/medievalcraft/ClientProxy.java @@ -1,8 +1,6 @@ package com.kitsu.medievalcraft; -import net.minecraft.client.renderer.entity.RenderSnowball; -import net.minecraft.world.World; - +import com.kitsu.medievalcraft.entity.EntityITSpear; import com.kitsu.medievalcraft.entity.EntityModelArrow; import com.kitsu.medievalcraft.entity.EntityShit; import com.kitsu.medievalcraft.entity.EntityTester; @@ -10,9 +8,12 @@ import com.kitsu.medievalcraft.item.ModItems; import com.kitsu.medievalcraft.renderer.RenderId; import com.kitsu.medievalcraft.renderer.RendererRegistry; import com.kitsu.medievalcraft.renderer.blocks.RenderModelArrow; +import com.kitsu.medievalcraft.renderer.blocks.RenderModelITSpear; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.RenderingRegistry; +import net.minecraft.client.renderer.entity.RenderSnowball; +import net.minecraft.world.World; public class ClientProxy extends CommonProxy { @@ -21,6 +22,7 @@ public class ClientProxy extends CommonProxy { RenderingRegistry.registerEntityRenderingHandler(EntityShit.class, new RenderSnowball(ModItems.itemShit)); RenderingRegistry.registerEntityRenderingHandler(EntityTester.class, new RenderSnowball(ModItems.itemTester)); RenderingRegistry.registerEntityRenderingHandler(EntityModelArrow.class, new RenderModelArrow()); + RenderingRegistry.registerEntityRenderingHandler(EntityITSpear.class, new RenderModelITSpear()); } @Override diff --git a/src/main/java/com/kitsu/medievalcraft/Main.java b/src/main/java/com/kitsu/medievalcraft/Main.java index 9c186883..69be725f 100644 --- a/src/main/java/com/kitsu/medievalcraft/Main.java +++ b/src/main/java/com/kitsu/medievalcraft/Main.java @@ -1,11 +1,10 @@ package com.kitsu.medievalcraft; -import net.minecraftforge.common.MinecraftForge; - import com.kitsu.medievalcraft.block.ModBlocks; import com.kitsu.medievalcraft.compat.FuelHandler; import com.kitsu.medievalcraft.compat.ModDict; import com.kitsu.medievalcraft.crafting.CraftingHandle; import com.kitsu.medievalcraft.crafting.ModCrafting; +import com.kitsu.medievalcraft.entity.EntityITSpear; import com.kitsu.medievalcraft.entity.EntityModelArrow; import com.kitsu.medievalcraft.entity.EntityShit; import com.kitsu.medievalcraft.entity.EntityTester; @@ -49,6 +48,7 @@ import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; +import net.minecraftforge.common.MinecraftForge; @Mod(modid = Main.MODID, name = Main.MODNAME, version = Main.VERSION) public class Main { @@ -111,7 +111,8 @@ public class Main { EntityRegistry.registerModEntity(EntityShit.class, "itemShit", 1, this, 64, 10, true); EntityRegistry.registerModEntity(EntityModelArrow.class, "itemModelArrow", 2, this, 64, 10, true); - EntityRegistry.registerModEntity(EntityTester.class, "itemTester", 3, this, 64, 10, true); + EntityRegistry.registerModEntity(EntityITSpear.class, "itemITSpear", 3, this, 64, 10, true); + EntityRegistry.registerModEntity(EntityTester.class, "itemTester", 4, this, 64, 10, true); GameRegistry.registerFuelHandler(new FuelHandler()); diff --git a/src/main/java/com/kitsu/medievalcraft/block/machines/Firebox.java b/src/main/java/com/kitsu/medievalcraft/block/machines/Firebox.java index 92b3e376..7fc84cba 100644 --- a/src/main/java/com/kitsu/medievalcraft/block/machines/Firebox.java +++ b/src/main/java/com/kitsu/medievalcraft/block/machines/Firebox.java @@ -65,33 +65,35 @@ public class Firebox extends BlockContainer{ public boolean isFireSource(World world, int x, int y, int z, ForgeDirection side) { if (this == ModBlocks.firebox && side == UP){ TileEntityFirebox tile = (TileEntityFirebox) world.getTileEntity(x, y, z); - if(this.getItemBurnTime(tile.getStackInSlot(0))>0){ - return true; + if(tile.isOn==true){ + if(this.getItemBurnTime(tile.getStackInSlot(0))>0){ + return true; + } } } return false; } - + @Override public int getLightValue(IBlockAccess world,int x,int y,int z){ - if(world.getBlockMetadata(x, y, z)==1){ - return 15; - } - return 0; - } + if(world.getBlockMetadata(x, y, z)==1){ + return 15; + } + return 0; + } @Override @SideOnly(Side.CLIENT) public void randomDisplayTick(World world, int x, int y, int z, Random rand) { super.randomDisplayTick(world, x, y, z, random); - + if(world.getBlockMetadata(x, y, z)==1){ - if (rand.nextInt(24) == 0&&world.getBlock(x, y+1, z)!=Blocks.fire) - { - world.playSound((double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), "fire.fire", 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F, false); - } + if (rand.nextInt(24) == 0&&world.getBlock(x, y+1, z)!=Blocks.fire) + { + world.playSound((double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), "fire.fire", 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F, false); + } int l; float f; float f1; @@ -129,8 +131,10 @@ public class Firebox extends BlockContainer{ } if(player.inventory.getCurrentItem()!=null){ if (tileEnt.getStackInSlot(0)==null){ - tileEnt.setInventorySlotContents(0, player.inventory.getCurrentItem()); - player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + if(isItemFuel(player.inventory.getCurrentItem())==true){ + tileEnt.setInventorySlotContents(0, player.inventory.getCurrentItem()); + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + } } if (tileEnt.getStackInSlot(0)!=null){ if(player.inventory.getCurrentItem()!=null){ diff --git a/src/main/java/com/kitsu/medievalcraft/entity/EntityITSpear.java b/src/main/java/com/kitsu/medievalcraft/entity/EntityITSpear.java new file mode 100644 index 00000000..4c156474 --- /dev/null +++ b/src/main/java/com/kitsu/medievalcraft/entity/EntityITSpear.java @@ -0,0 +1,582 @@ +package com.kitsu.medievalcraft.entity; + +import java.util.List; + +import com.kitsu.medievalcraft.item.ModItems; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.play.server.S2BPacketChangeGameState; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public class EntityITSpear extends EntityArrow implements IProjectile { + private int field_145791_d = -1; + private int field_145792_e = -1; + private int field_145789_f = -1; + private Block field_145790_g; + private int inData; + private boolean inGround; + /** 1 if the player can pick up the arrow */ + public int canBePickedUp; + /** Seems to be some sort of timer for animating an arrow. */ + public int arrowShake; + /** The owner of this arrow. */ + public Entity shootingEntity; + private int ticksInGround; + private int ticksInAir; + private double damage = 10.0D; + /** The amount of knockback an arrow applies when it hits a mob. */ + private int knockbackStrength; + + public EntityITSpear(World world) + { + super(world); + this.renderDistanceWeight = 10.0D; + this.setSize(0.5F, 0.5F); + } + + public EntityITSpear(World world, double x, double y, double z) + { + super(world); + this.renderDistanceWeight = 10.0D; + this.setSize(0.5F, 0.5F); + this.setPosition(x, y, z); + this.yOffset = 0.0F; + } + + @SuppressWarnings("cast") + public EntityITSpear(World world, EntityLivingBase player, EntityLivingBase p_i1755_3_, float p_i1755_4_, float p_i1755_5_) + { + super(world); + this.renderDistanceWeight = 10.0D; + this.shootingEntity = player; + + if (player instanceof EntityPlayer) + { + this.canBePickedUp = 1; + } + + this.posY = player.posY + (double)player.getEyeHeight() + 0.10000000149011612D; + double d0 = p_i1755_3_.posX - player.posX; + double d1 = p_i1755_3_.boundingBox.minY + (double)(p_i1755_3_.height / 3.0F) - this.posY; + double d2 = p_i1755_3_.posZ - player.posZ; + double d3 = (double)MathHelper.sqrt_double(d0 * d0 + d2 * d2); + + if (d3 >= 1.0E-7D) + { + float f2 = (float)(Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F; + float f3 = (float)(-(Math.atan2(d1, d3) * 180.0D / Math.PI)); + double d4 = d0 / d3; + double d5 = d2 / d3; + this.setLocationAndAngles(player.posX + d4, this.posY, player.posZ + d5, f2, f3); + this.yOffset = 0.0F; + float f4 = (float)d3 * 0.2F; + this.setThrowableHeading(d0, d1 + (double)f4, d2, p_i1755_4_, p_i1755_5_); + } + } + + @SuppressWarnings("cast") + public EntityITSpear(World world, EntityLivingBase player, float p_i1756_3_) + { + super(world); + this.renderDistanceWeight = 10.0D; + this.shootingEntity = player; + + if (player instanceof EntityPlayer) + { + this.canBePickedUp = 1; + } + + this.setSize(0.5F, 0.5F); + this.setLocationAndAngles(player.posX, player.posY + (double)player.getEyeHeight(), player.posZ, player.rotationYaw, player.rotationPitch); + + this.posX += (player.getLookVec().xCoord); + //this.posY -= 0.10000000149011612D; + this.posZ += (player.getLookVec().zCoord); + //this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); + this.posY += player.getLookVec().yCoord; + if(player.getLookVec().yCoord < 0){ + this.posY += player.getLookVec().yCoord * 2; + } + + this.setPosition(this.posX, this.posY, this.posZ); + + //this.setSize(0.5F, 0.5F); + //this.setLocationAndAngles(player.posX, player.posY + (double)player.getEyeHeight(), player.posZ, player.rotationYaw, player.rotationPitch); + //this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); + //this.posY -= 0.10000000149011612D; + //this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); + //this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI)); + this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI)); + this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI)); + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, p_i1756_3_ * 1.5F, 1.0F); + } + + protected void entityInit() + { + this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); + } + + /** + * Similar to setArrowHeading, it's point the throwable entity to a x, y, z direction. + */ + @SuppressWarnings("cast") + public void setThrowableHeading(double p_70186_1_, double p_70186_3_, double p_70186_5_, float p_70186_7_, float p_70186_8_) + { + float f2 = MathHelper.sqrt_double(p_70186_1_ * p_70186_1_ + p_70186_3_ * p_70186_3_ + p_70186_5_ * p_70186_5_); + p_70186_1_ /= (double)f2; + p_70186_3_ /= (double)f2; + p_70186_5_ /= (double)f2; + p_70186_1_ += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)p_70186_8_; + p_70186_3_ += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)p_70186_8_; + p_70186_5_ += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)p_70186_8_; + p_70186_1_ *= (double)p_70186_7_; + p_70186_3_ *= (double)p_70186_7_; + p_70186_5_ *= (double)p_70186_7_; + this.motionX = p_70186_1_/2.5; + this.motionY = p_70186_3_/1.75; + this.motionZ = p_70186_5_/2.5; + float f3 = MathHelper.sqrt_double(p_70186_1_ * p_70186_1_ + p_70186_5_ * p_70186_5_); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(p_70186_1_, p_70186_5_) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(p_70186_3_, (double)f3) * 180.0D / Math.PI); + this.ticksInGround = 1; + } + + /** + * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, + * posY, posZ, yaw, pitch + */ + @SideOnly(Side.CLIENT) + public void setPositionAndRotation2(double p_70056_1_, double p_70056_3_, double p_70056_5_, float p_70056_7_, float p_70056_8_, int p_70056_9_) + { + this.setPosition(p_70056_1_, p_70056_3_, p_70056_5_); + this.setRotation(p_70056_7_, p_70056_8_); + } + + /** + * Sets the velocity to the args. Args: x, y, z + */ + @SuppressWarnings("cast") + @SideOnly(Side.CLIENT) + public void setVelocity(double p_70016_1_, double p_70016_3_, double p_70016_5_) + { + + this.motionX = p_70016_1_ ; + this.motionY = p_70016_3_ ; + this.motionZ = p_70016_5_ ; + + if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) + { + float f = MathHelper.sqrt_double(p_70016_1_ * p_70016_1_ + p_70016_5_ * p_70016_5_); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(p_70016_1_, p_70016_5_) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(p_70016_3_, (double)f) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch; + this.prevRotationYaw = this.rotationYaw; + this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); + this.ticksInGround = 0; + } + } + + /** + * Called to update the entity's position/logic. + */ + @SuppressWarnings("cast") + public void onUpdate() + { + super.onUpdate(); + + if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) + { + float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f) * 180.0D / Math.PI); + } + + Block block = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f); + //this.getEntityData().setInteger("blockX", this.field_145791_d); + + if (block.getMaterial() != Material.air) + { + block.setBlockBoundsBasedOnState(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f); + AxisAlignedBB axisalignedbb = block.getCollisionBoundingBoxFromPool(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f); + + if (axisalignedbb != null && axisalignedbb.isVecInside(Vec3.createVectorHelper(this.posX, this.posY, this.posZ))) + { + this.inGround = true; + } + } + + if (this.arrowShake > 0) + { + --this.arrowShake; + } + + if (this.inGround) + { + int j = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f); + + if (block == this.field_145790_g && j == this.inData) + { + ++this.ticksInGround; + + if (this.ticksInGround == -1) + { + this.setDead(); + } + } + else + { + this.inGround = false; + this.motionX *= (double)(this.rand.nextFloat() * 0.2F); + this.motionY *= (double)(this.rand.nextFloat() * 0.2F); + this.motionZ *= (double)(this.rand.nextFloat() * 0.2F); + this.ticksInGround = 0; + this.ticksInAir = 0; + } + } + else + { + ++this.ticksInAir; + Vec3 vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(vec31, vec3, false, true, false); + vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + + if (movingobjectposition != null) + { + vec3 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord); + } + + Entity entity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double d0 = 0.0D; + int i; + float f1; + + for (i = 0; i < list.size(); ++i) + { + Entity entity1 = (Entity)list.get(i); + + if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5)) + { + f1 = 0.3F; + AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand((double)f1, (double)f1, (double)f1); + MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3); + + if (movingobjectposition1 != null) + { + double d1 = vec31.distanceTo(movingobjectposition1.hitVec); + + if (d1 < d0 || d0 == 0.0D) + { + entity = entity1; + d0 = d1; + } + } + } + } + + if (entity != null) + { + movingobjectposition = new MovingObjectPosition(entity); + } + + if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer) + { + EntityPlayer entityplayer = (EntityPlayer)movingobjectposition.entityHit; + + if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer && !((EntityPlayer)this.shootingEntity).canAttackPlayer(entityplayer)) + { + movingobjectposition = null; + } + } + + float f2; + float f4; + + if (movingobjectposition != null) + { + if (movingobjectposition.entityHit != null) + { + f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + int k = MathHelper.ceiling_double_int((double)f2 * this.damage); + + DamageSource damagesource = null; + + if (this.shootingEntity == null) + { + damagesource = DamageSource.causeArrowDamage(this, this.shootingEntity); + } + else + { + damagesource = DamageSource.causeThrownDamage(this, this.shootingEntity); + } + + if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman)) + { + movingobjectposition.entityHit.setFire(5); + } + + if (movingobjectposition.entityHit.attackEntityFrom(damagesource, (float)k)) + { + if (movingobjectposition.entityHit instanceof EntityLivingBase) + { + EntityLivingBase entitylivingbase = (EntityLivingBase)movingobjectposition.entityHit; + + if (!this.worldObj.isRemote) + { + entitylivingbase.setArrowCountInEntity(entitylivingbase.getArrowCountInEntity() + 1); + } + + if (this.knockbackStrength > 0) + { + f4 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + + if (f4 > 0.0F) + { + movingobjectposition.entityHit.addVelocity(this.motionX * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4, 0.1D, this.motionZ * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4); + } + } + + if (this.shootingEntity != null && this.shootingEntity instanceof EntityLivingBase) + { + EnchantmentHelper.func_151384_a(entitylivingbase, this.shootingEntity); + EnchantmentHelper.func_151385_b((EntityLivingBase)this.shootingEntity, entitylivingbase); + } + + if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity && movingobjectposition.entityHit instanceof EntityPlayer && this.shootingEntity instanceof EntityPlayerMP) + { + ((EntityPlayerMP)this.shootingEntity).playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(6, 0.0F)); + } + } + + this.playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F)); + + if (!(movingobjectposition.entityHit instanceof EntityEnderman)) + { + this.setDead(); + } + } + else + { + this.motionX *= -0.10000000149011612D; + this.motionY *= -0.10000000149011612D; + this.motionZ *= -0.10000000149011612D; + this.rotationYaw += 180.0F; + this.prevRotationYaw += 180.0F; + this.ticksInAir = 0; + } + } + else + { + + this.field_145791_d = movingobjectposition.blockX; + this.field_145792_e = movingobjectposition.blockY; + this.field_145789_f = movingobjectposition.blockZ; + this.field_145790_g = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f); + this.inData = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f); + this.motionX = (double)((float)(movingobjectposition.hitVec.xCoord - this.posX)); + this.motionY = (double)((float)(movingobjectposition.hitVec.yCoord - this.posY)); + this.motionZ = (double)((float)(movingobjectposition.hitVec.zCoord - this.posZ)); + f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + this.posX -= this.motionX / (double)f2 * 0.05000000074505806D; + this.posY -= this.motionY / (double)f2 * 0.05000000074505806D; + this.posZ -= this.motionZ / (double)f2 * 0.05000000074505806D; + this.playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F)); + this.inGround = true; + this.arrowShake = 7; + + + if (this.field_145790_g.getMaterial() != Material.air) + { + this.field_145790_g.onEntityCollidedWithBlock(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f, this); + } + } + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + + for (this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f2) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) + { + ; + } + + while (this.rotationPitch - this.prevRotationPitch >= 180.0F) + { + this.prevRotationPitch += 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw < -180.0F) + { + this.prevRotationYaw -= 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw >= 180.0F) + { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float f3 = 0.99F; + f1 = 0.05F; + + if (this.isInWater()) + { + for (int l = 0; l < 4; ++l) + { + f4 = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)f4, this.posY - this.motionY * (double)f4, this.posZ - this.motionZ * (double)f4, this.motionX, this.motionY, this.motionZ); + } + + f3 = 0.8F; + } + + if (this.isWet()) + { + this.extinguish(); + } + + this.motionX *= (double)f3; + this.motionY *= (double)f3; + this.motionZ *= (double)f3; + this.motionY -= (double)f1; + this.setPosition(this.posX, this.posY, this.posZ); + this.func_145775_I(); + } + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound p_70014_1_) + { + p_70014_1_.setShort("xTile", (short)this.field_145791_d); + p_70014_1_.setShort("yTile", (short)this.field_145792_e); + p_70014_1_.setShort("zTile", (short)this.field_145789_f); + p_70014_1_.setShort("life", (short)this.ticksInGround); + p_70014_1_.setByte("inTile", (byte)Block.getIdFromBlock(this.field_145790_g)); + p_70014_1_.setByte("inData", (byte)this.inData); + p_70014_1_.setByte("shake", (byte)this.arrowShake); + p_70014_1_.setByte("inGround", (byte)(this.inGround ? 1 : 0)); + p_70014_1_.setByte("pickup", (byte)this.canBePickedUp); + p_70014_1_.setDouble("damage", this.damage); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound p_70037_1_) + { + this.field_145791_d = p_70037_1_.getShort("xTile"); + this.field_145792_e = p_70037_1_.getShort("yTile"); + this.field_145789_f = p_70037_1_.getShort("zTile"); + this.ticksInGround = p_70037_1_.getShort("life"); + this.field_145790_g = Block.getBlockById(p_70037_1_.getByte("inTile") & 255); + this.inData = p_70037_1_.getByte("inData") & 255; + this.arrowShake = p_70037_1_.getByte("shake") & 255; + this.inGround = p_70037_1_.getByte("inGround") == 1; + + if (p_70037_1_.hasKey("damage", 99)) + { + this.damage = p_70037_1_.getDouble("damage"); + } + + if (p_70037_1_.hasKey("pickup", 99)) + { + this.canBePickedUp = p_70037_1_.getByte("pickup"); + } + else if (p_70037_1_.hasKey("player", 99)) + { + this.canBePickedUp = p_70037_1_.getBoolean("player") ? 1 : 0; + } + } + + /** + * Called by a player entity when they collide with an entity + */ + public void onCollideWithPlayer(EntityPlayer p_70100_1_) + { + if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0) + { + boolean flag = this.canBePickedUp == 1 || this.canBePickedUp == 2 && p_70100_1_.capabilities.isCreativeMode; + + if (this.canBePickedUp == 1 && !p_70100_1_.inventory.addItemStackToInventory(new ItemStack(ModItems.itemITSpear, 1))) + { + flag = false; + } + + if (flag) + { + this.playSound("random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); + p_70100_1_.onItemPickup(this, 1); + this.setDead(); + } + } + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to + * prevent them from trampling crops + */ + protected boolean canTriggerWalking() + { + return false; + } + + @SideOnly(Side.CLIENT) + public float getShadowSize() + { + return 0.0F; + } + + public void setDamage(double p_70239_1_) + { + this.damage = p_70239_1_; + } + + public double getDamage() + { + return this.damage; + } + + /** + * Sets the amount of knockback the arrow applies when it hits a mob. + */ + public void setKnockbackStrength(int p_70240_1_) + { + this.knockbackStrength = p_70240_1_; + } + + /** + * If returns false, the item will not inflict any damage against entities. + */ + public boolean canAttackWithItem() + { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/kitsu/medievalcraft/item/ModItems.java b/src/main/java/com/kitsu/medievalcraft/item/ModItems.java index af94df51..e638c0ba 100644 --- a/src/main/java/com/kitsu/medievalcraft/item/ModItems.java +++ b/src/main/java/com/kitsu/medievalcraft/item/ModItems.java @@ -50,6 +50,7 @@ import com.kitsu.medievalcraft.item.forms.iron.IronSpearTipForm; import com.kitsu.medievalcraft.item.misc.ItemBark; import com.kitsu.medievalcraft.item.misc.ItemSmallBarrelLid; import com.kitsu.medievalcraft.item.misc.RawCuredLeather; +import com.kitsu.medievalcraft.item.throwable.ItemITSpear; import com.kitsu.medievalcraft.item.throwable.ItemShit; import com.kitsu.medievalcraft.item.throwable.ItemTester; import com.kitsu.medievalcraft.item.tools.CustomIronHoe; @@ -81,8 +82,11 @@ public final class ModItems { public static Item ironChunk; public static Item hotironChunk; public static Item ironRing; + public static Item itemShit; + public static Item itemITSpear; public static Item itemTester; + public static Item linkedRings; public static Item ironRingMesh; public static Item chainMailPlate; @@ -425,6 +429,7 @@ public final class ModItems { WOOD(0, 59, 2.0F, 0, 15), STONE(1, 131, 4.0F, 1, 5), IRON(2, 250, 6.0F, 2, 14), EMERALD(3, 1561, 8.0F, 3, 10), GOLD(0, 32, 12.0F, 0, 22);*/ public static ToolMaterial longswordmat = EnumHelper.addToolMaterial("LONGSWORD", 1, 350, 2.0F, 2.0F, 0); + public static ToolMaterial ironspearmat = EnumHelper.addToolMaterial("IRONSPEAR", 1, 350, 2.0F, 2.0F, 0); public static ToolMaterial woodenshieldmat = EnumHelper.addToolMaterial("WOODENSHIELD", 0, 65, 2.0F, -3.5F, 0); public static ToolMaterial ironshieldmat = EnumHelper.addToolMaterial("IRONSHIELD", 0, 500, 2.0F, -3.5F, 0); public static ToolMaterial heavymacemat = EnumHelper.addToolMaterial("HEAVYMACE", 0, 350, 4.0F, -4.0F, 0); @@ -820,6 +825,7 @@ public final class ModItems { itemModelArrow = new ItemModelArrow(); itemIronTippedModelArrow = new ItemIronTippedModelArrow(); + itemITSpear = new ItemITSpear("itemITSpear", ironspearmat); itemBark= new ItemBark(); itemSmallBarrelLid = new ItemSmallBarrelLid(); diff --git a/src/main/java/com/kitsu/medievalcraft/item/throwable/ItemITSpear.java b/src/main/java/com/kitsu/medievalcraft/item/throwable/ItemITSpear.java new file mode 100644 index 00000000..f4381ba8 --- /dev/null +++ b/src/main/java/com/kitsu/medievalcraft/item/throwable/ItemITSpear.java @@ -0,0 +1,125 @@ +package com.kitsu.medievalcraft.item.throwable; + +import com.kitsu.medievalcraft.Main; +import com.kitsu.medievalcraft.entity.EntityITSpear; +import com.kitsu.medievalcraft.entity.EntityShit; +import com.kitsu.medievalcraft.item.ModItems; +import com.kitsu.medievalcraft.util.CustomTab; + +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemSword; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.ArrowLooseEvent; +import net.minecraftforge.event.entity.player.ArrowNockEvent; + +public class ItemITSpear extends ItemSword { + + private String name = "itemITSpear"; + + public ItemITSpear(String name, ToolMaterial mat) { + super(mat); + setUnlocalizedName(name); + setMaxStackSize(1); + setCreativeTab(CustomTab.MedievalCraftTab); + setTextureName(Main.MODID + ":" + name); + GameRegistry.registerItem(this, name); + + } + + @Override + public EnumAction getItemUseAction(ItemStack stack) { + return EnumAction.bow; + } + + @Override + public int getMaxItemUseDuration(ItemStack p_77626_1_) { + return 72000; + } + + public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) + { + ArrowNockEvent event = new ArrowNockEvent(p_77659_3_, p_77659_1_); + MinecraftForge.EVENT_BUS.post(event); + if (event.isCanceled()) + { + return event.result; + } + if (p_77659_3_.capabilities.isCreativeMode || p_77659_3_.inventory.hasItem(ModItems.itemITSpear)) + { + p_77659_3_.setItemInUse(p_77659_1_, this.getMaxItemUseDuration(p_77659_1_)); + } + return p_77659_1_; + } + + public void onPlayerStoppedUsing(ItemStack p_77615_1_, World p_77615_2_, EntityPlayer p_77615_3_, int p_77615_4_) + { + int j = this.getMaxItemUseDuration(p_77615_1_) - p_77615_4_; + ArrowLooseEvent event = new ArrowLooseEvent(p_77615_3_, p_77615_1_, j); + MinecraftForge.EVENT_BUS.post(event); + if (event.isCanceled()) + { + return; + } + j = event.charge; + boolean flag = p_77615_3_.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, p_77615_1_) > 0; + if (flag || p_77615_3_.inventory.hasItem(ModItems.itemITSpear)) + { + float f = (float)j / 20.0F; + f = (f * f + f * 2.0F) / 3.0F; + if ((double)f < 0.1D) + { + return; + } + if (f > 1.0F) + { + f = 1.0F; + } + EntityITSpear entityspear = new EntityITSpear(p_77615_2_, p_77615_3_, f * 2.0F); + if (f == 1.0F) + { + entityspear.setIsCritical(true); + } + int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, p_77615_1_); + if (k > 0) + { + entityspear.setDamage(entityspear.getDamage() + (double)k * 0.5D + 0.5D); + } + int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, p_77615_1_); + if (l > 0) + { + entityspear.setKnockbackStrength(l); + } + if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, p_77615_1_) > 0) + { + entityspear.setFire(100); + } + p_77615_1_.damageItem(1, p_77615_3_); + p_77615_2_.playSoundAtEntity(p_77615_3_, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F); + if (flag) + { + entityspear.canBePickedUp = 2; + } + else + { + p_77615_3_.inventory.consumeInventoryItem(ModItems.itemITSpear); + } + if (!p_77615_2_.isRemote) + { + p_77615_2_.spawnEntityInWorld(entityspear); + } + } + } + + public ItemStack onEaten(ItemStack p_77654_1_, World p_77654_2_, EntityPlayer p_77654_3_) + { + return p_77654_1_; + } +} diff --git a/src/main/java/com/kitsu/medievalcraft/renderer/RendererRegistry.java b/src/main/java/com/kitsu/medievalcraft/renderer/RendererRegistry.java index fdf9118b..f5a23e07 100644 --- a/src/main/java/com/kitsu/medievalcraft/renderer/RendererRegistry.java +++ b/src/main/java/com/kitsu/medievalcraft/renderer/RendererRegistry.java @@ -28,7 +28,10 @@ import com.kitsu.medievalcraft.renderer.blocks.machine.ForgeRenderer; import com.kitsu.medievalcraft.renderer.blocks.machine.FourShelfRenderer; import com.kitsu.medievalcraft.renderer.blocks.machine.SolidFilterRender; import com.kitsu.medievalcraft.renderer.blocks.machine.WaterFilterRenderer; +import com.kitsu.medievalcraft.renderer.itemrenderer.IRITSpear; +import com.kitsu.medievalcraft.renderer.itemrenderer.ItemRendererITModelArrow; import com.kitsu.medievalcraft.renderer.itemrenderer.ItemRendererLongbow; +import com.kitsu.medievalcraft.renderer.itemrenderer.ItemRendererModelArrow; import com.kitsu.medievalcraft.renderer.itemrenderer.crucibles.IRCrucible; import com.kitsu.medievalcraft.renderer.itemrenderer.crucibles.empty.IRSlackCrucible; import com.kitsu.medievalcraft.renderer.itemrenderer.crucibles.empty.IRTanninCrucible; @@ -52,7 +55,6 @@ import com.kitsu.medievalcraft.renderer.itemrenderer.tongs.IRSlottedTongs; import com.kitsu.medievalcraft.renderer.itemrenderer.tools.IRCraftingBlade; import com.kitsu.medievalcraft.renderer.itemrenderer.tools.IRForgeHammer; import com.kitsu.medievalcraft.renderer.itemrenderer.tools.IRInlayHammer; -import com.kitsu.medievalcraft.renderer.itemrenderer.tools.IRironPicks; import com.kitsu.medievalcraft.renderer.itemrenderer.weapons.IRBattleAxe; import com.kitsu.medievalcraft.renderer.itemrenderer.weapons.IRGladius; import com.kitsu.medievalcraft.renderer.itemrenderer.weapons.ItemRenderHeavymace; @@ -108,10 +110,11 @@ public class RendererRegistry { MinecraftForgeClient.registerItemRenderer(ModItems.forgeHammer, new IRForgeHammer()); MinecraftForgeClient.registerItemRenderer(ModItems.inlayHammer, new IRInlayHammer()); - MinecraftForgeClient.registerItemRenderer(ModItems.customIronPick, new IRironPicks()); + //MinecraftForgeClient.registerItemRenderer(ModItems.customIronPick, new IRironPicks()); - //MinecraftForgeClient.registerItemRenderer(ModItems.itemModelArrow, new ItemRendererModelArrow()); - //MinecraftForgeClient.registerItemRenderer(ModItems.itemIronTippedModelArrow, new ItemRendererITModelArrow()); + MinecraftForgeClient.registerItemRenderer(ModItems.itemModelArrow, new ItemRendererModelArrow()); + MinecraftForgeClient.registerItemRenderer(ModItems.itemIronTippedModelArrow, new ItemRendererITModelArrow()); + MinecraftForgeClient.registerItemRenderer(ModItems.itemITSpear, new IRITSpear()); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.emptySoftCrucible), new ItemRendererSECrucible()); diff --git a/src/main/java/com/kitsu/medievalcraft/renderer/blocks/RenderModelITSpear.java b/src/main/java/com/kitsu/medievalcraft/renderer/blocks/RenderModelITSpear.java new file mode 100644 index 00000000..11f7f6d1 --- /dev/null +++ b/src/main/java/com/kitsu/medievalcraft/renderer/blocks/RenderModelITSpear.java @@ -0,0 +1,63 @@ +package com.kitsu.medievalcraft.renderer.blocks; + +import org.lwjgl.opengl.GL11; + +import com.kitsu.medievalcraft.entity.EntityITSpear; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +public class RenderModelITSpear extends Render +{ + + //private static final ResourceLocation arrowTextures = new ResourceLocation("textures/entity/arrow.png"); + private static final ResourceLocation arrowTextures = new ResourceLocation("kitsumedievalcraft:textures/items/Spear.png"); + public static final ResourceLocation MODEL = new ResourceLocation("kitsumedievalcraft:models/Spear.obj"); + public static final ResourceLocation TEXTURE = new ResourceLocation("kitsumedievalcraft:models/Spear.png"); + + public IModelCustom model = AdvancedModelLoader.loadModel(MODEL); + + public void doRender(EntityITSpear p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) + { + GL11.glPushMatrix(); + GL11.glScalef(1.0F, 1.0F, 1.0F); + GL11.glTranslatef((float)p_76986_2_, (float)p_76986_4_, (float)p_76986_6_ ); + GL11.glRotatef(p_76986_1_.prevRotationYaw + (p_76986_1_.rotationYaw - p_76986_1_.prevRotationYaw) * p_76986_9_ - 90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(p_76986_1_.prevRotationPitch + (p_76986_1_.rotationPitch - p_76986_1_.prevRotationPitch) * p_76986_9_, 0.0F, 0.0F, 1.0F); + Minecraft.getMinecraft().renderEngine.bindTexture(TEXTURE); + model.renderAll(); + + GL11.glPopMatrix(); + } + + protected ResourceLocation getEntityTexture(EntityITSpear p_110775_1_) + { + return arrowTextures; + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(Entity p_110775_1_) + { + return this.getEntityTexture((EntityITSpear)p_110775_1_); + } + + /** + * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then + * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic + * (Render