package zmaster587.advancedRocketry.item.tools; import java.util.List; import java.util.WeakHashMap; import zmaster587.advancedRocketry.AdvancedRocketry; import zmaster587.libVulpes.util.BlockPosition; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.SoundCategory; import net.minecraft.command.IEntitySelector; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.MovingObjectPosition.MovingObjectType; import net.minecraft.util.Vec3; import net.minecraft.world.World; public class ItemBasicLaserGun extends Item { int reachDistance = 25; private WeakHashMap<EntityLivingBase, BlockPosition> posMap; ToolMaterial toolMaterial; public ItemBasicLaserGun() { super(); toolMaterial = ToolMaterial.GOLD; setMaxStackSize(1); setMaxDamage(0); posMap = new WeakHashMap<EntityLivingBase, BlockPosition>(); } @Override public float func_150893_a(ItemStack stack, Block state) { return 0; } @Override public boolean canHarvestBlock(Block block, ItemStack itemStack) { return block == Blocks.obsidian ? this.toolMaterial.getHarvestLevel() == 3 : (block != Blocks.diamond_block && block != Blocks.diamond_ore ? (block != Blocks.emerald_ore && block != Blocks.emerald_block ? (block != Blocks.gold_block && block != Blocks.gold_ore ? (block != Blocks.iron_block && block != Blocks.iron_ore ? (block != Blocks.lapis_block && block != Blocks.lapis_ore ? (block != Blocks.redstone_ore && block != Blocks.lit_redstone_ore ? (block.getMaterial() == Material.rock ? true : (block.getMaterial() == Material.iron ? true : block.getMaterial() == Material.anvil)) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2); } @Override public boolean isFull3D() { return true; } @Override public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { World world = player.getEntityWorld(); MovingObjectPosition rayTrace = rayTraceEntity(world,player); if(rayTrace != null) { rayTrace.entityHit.attackEntityFrom(DamageSource.generic, 1f); AdvancedRocketry.proxy.spawnLaser(player, rayTrace.hitVec); return; } rayTrace = getMovingObjectPositionFromPlayer(world, (EntityPlayer) player, false); if(rayTrace == null || rayTrace.typeOfHit != MovingObjectType.BLOCK) return; if(posMap.get(player) != null && !posMap.get(player).equals(new BlockPosition(rayTrace.blockX, rayTrace.blockY, rayTrace.blockZ))) { player.clearItemInUse(); return; } else if(posMap.get(player) == null) { posMap.put(player, new BlockPosition(rayTrace.blockX, rayTrace.blockY, rayTrace.blockZ)); } if(count % 5 == 0 && world.isRemote) { world.playSound(player.posX, player.posY, player.posZ, "advancedrocketry:basicLaserGun", Minecraft.getMinecraft().gameSettings.getSoundLevel(SoundCategory.PLAYERS), 1f, false); } AdvancedRocketry.proxy.spawnLaser(player, rayTrace.hitVec); if(count == 1) { if(world.getBlock(rayTrace.blockX, rayTrace.blockY, rayTrace.blockZ).getBlockHardness(world, rayTrace.blockX, rayTrace.blockY, rayTrace.blockZ) != -1) { // if(!world.isRemote) { ((EntityPlayerMP)player).theItemInWorldManager.tryHarvestBlock(rayTrace.blockX, rayTrace.blockY, rayTrace.blockZ); //world.destroyBlock(rayTrace.getBlockPos(), true); } player.clearItemInUse(); posMap.remove(player); //state.getPlayerRelativeBlockHardness((EntityPlayer)player, world, rayTrace.getBlockPos()); } } super.onUsingTick(stack, player, count); } /** * How long it takes to use or consume an item */ @Override public int getMaxItemUseDuration(ItemStack stack) { return 16; } @Override protected MovingObjectPosition getMovingObjectPositionFromPlayer(World p_77621_1_, EntityPlayer p_77621_2_, boolean p_77621_3_) { float f = 1.0F; float f1 = p_77621_2_.prevRotationPitch + (p_77621_2_.rotationPitch - p_77621_2_.prevRotationPitch) * f; float f2 = p_77621_2_.prevRotationYaw + (p_77621_2_.rotationYaw - p_77621_2_.prevRotationYaw) * f; double d0 = p_77621_2_.prevPosX + (p_77621_2_.posX - p_77621_2_.prevPosX) * (double)f; double d1 = p_77621_2_.prevPosY + (p_77621_2_.posY - p_77621_2_.prevPosY) * (double)f + (double)(p_77621_1_.isRemote ? p_77621_2_.getEyeHeight() - p_77621_2_.getDefaultEyeHeight() : p_77621_2_.getEyeHeight()); // isRemote check to revert changes to ray trace position due to adding the eye height clientside and player yOffset differences double d2 = p_77621_2_.prevPosZ + (p_77621_2_.posZ - p_77621_2_.prevPosZ) * (double)f; Vec3 vec3 = Vec3.createVectorHelper(d0, d1, d2); float f3 = MathHelper.cos(-f2 * 0.017453292F - (float)Math.PI); float f4 = MathHelper.sin(-f2 * 0.017453292F - (float)Math.PI); float f5 = -MathHelper.cos(-f1 * 0.017453292F); float f6 = MathHelper.sin(-f1 * 0.017453292F); float f7 = f4 * f5; float f8 = f3 * f5; double d3 = reachDistance; Vec3 vec31 = vec3.addVector((double)f7 * d3, (double)f6 * d3, (double)f8 * d3); return p_77621_1_.func_147447_a(vec3, vec31, p_77621_3_, !p_77621_3_, false); } /** * returns the action that specifies what animation to play when the items is being used */ @Override public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.none; } /*@Override public ItemStack onItemUseFinish(ItemStack stack, World world, EntityPlayer entityLiving) { MovingObjectPosition rayTrace = getMovingObjectPositionFromPlayer(world, (EntityPlayer) entityLiving, false); if(rayTrace != null && rayTrace.typeOfHit == Type.BLOCK) { IBlockState state = world.getBlockState(rayTrace.getBlockPos()); if(state.getBlockHardness(world, rayTrace.getBlockPos()) != -1) { // if(!world.isRemote) { ((EntityPlayerMP)entityLiving).interactionManager.tryHarvestBlock(rayTrace.getBlockPos()); //world.destroyBlock(rayTrace.getBlockPos(), true); } //state.getPlayerRelativeBlockHardness((EntityPlayer)player, world, rayTrace.getBlockPos()); } } posMap.remove(entityLiving); return stack; }*/ public MovingObjectPosition rayTraceEntity(World world, Entity entity) { Vec3 vec3d = Vec3.createVectorHelper(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); Vec3 vec3d1 = entity.getLookVec(); Vec3 vec3d2 = vec3d.addVector(vec3d1.xCoord * reachDistance, vec3d1.yCoord * reachDistance, vec3d1.zCoord * reachDistance); List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(entity, entity.boundingBox.addCoord(vec3d1.xCoord * reachDistance, vec3d1.yCoord * reachDistance, vec3d1.zCoord * reachDistance).expand(1.0D, 1.0D, 1.0D), new IEntitySelector() { @Override public boolean isEntityApplicable(Entity p_apply_1_) { // TODO Auto-generated method stub return p_apply_1_ != null && p_apply_1_.canBeCollidedWith(); } }); for (int j = 0; j < list.size(); ++j) { Entity entity1 = (Entity)list.get(j); AxisAlignedBB axisalignedbb = entity1.boundingBox.expand((double)entity1.getCollisionBorderSize(),(double)entity1.getCollisionBorderSize(),(double)entity1.getCollisionBorderSize()); MovingObjectPosition raytraceresult = axisalignedbb.calculateIntercept(vec3d, vec3d2); if (axisalignedbb.isVecInside(vec3d)) { } else if (raytraceresult != null) { raytraceresult.entityHit = entity1; return raytraceresult; } } return null; } @Override public ItemStack onItemRightClick(ItemStack stack, World worldIn, EntityPlayer player) { player.setItemInUse(stack, getMaxItemUseDuration(stack)); posMap.remove(player); //if(true) // return super.onItemRightClick(stack, worldIn, player, hand); World world = player.getEntityWorld(); MovingObjectPosition rayTrace = rayTraceEntity(world,player); if(rayTrace != null) { rayTrace.entityHit.attackEntityFrom(DamageSource.generic, .5f); if(world.isRemote) world.playSound(player.posX, player.posY, player.posZ, "advancedrocketry:basicLaserGun", Minecraft.getMinecraft().gameSettings.getSoundLevel(SoundCategory.PLAYERS), 1f, false); return stack; } rayTrace = getMovingObjectPositionFromPlayer(world, (EntityPlayer) player, false); if(rayTrace != null && rayTrace.typeOfHit == MovingObjectType.BLOCK) { if(world.isRemote) world.playSound(player.posX, player.posY, player.posZ, "advancedrocketry:basicLaserGun", Minecraft.getMinecraft().gameSettings.getSoundLevel(SoundCategory.PLAYERS), 1f, false); return stack; } return stack; } }