Java tutorial
package buildcraftAdditions.entities; import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.block.BlockLiquid; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EntityDamageSourceIndirect; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; import cpw.mods.fml.common.registry.IThrowableEntity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraftforge.fluids.IFluidBlock; import buildcraft.api.power.ILaserTarget; import buildcraft.api.power.ILaserTargetBlock; import buildcraftAdditions.config.ConfigurationHandler; /** * Copyright (c) 2014-2015, AEnterprise * http://buildcraftadditions.wordpress.com/ * Buildcraft Additions is distributed under the terms of GNU GPL v3.0 * Please check the contents of the license located in * http://buildcraftadditions.wordpress.com/wiki/licensing-stuff/ */ public class EntityLaserShot extends EntityThrowable implements IEntityAdditionalSpawnData, IThrowableEntity { private float strength; private EntityLivingBase thrower; public EntityLaserShot(World world) { super(world); setSize(0.5F, 0.5F); } public EntityLaserShot(World world, EntityPlayer player, float strength) { super(world, player); this.strength = strength; setSize(0.5F, 0.5F); setThrowableHeading(motionX, motionY, motionZ, func_70182_d(), 1); } @Override public void onUpdate() { super.onUpdate(); worldObj.spawnParticle("smoke", posX + rand.nextDouble() / 4 - 0.125, posY + rand.nextDouble() / 4 - 0.125, posZ + rand.nextDouble() / 4 - 0.125, 0, 0, 0); worldObj.spawnParticle("flame", posX + rand.nextDouble() / 4 - 0.125, posY + rand.nextDouble() / 4 - 0.125, posZ + rand.nextDouble() / 4 - 0.125, 0, 0, 0); if (ticksExisted > 6000) setDead(); if (isInWater() || handleLavaMovement()) { worldObj.playSoundEffect(posX + 0.5, posY + 0.5, posZ + 0.5, "random.fizz", 0.5F, 2.6F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.8F); for (int i = 0; i < 8; i++) worldObj.spawnParticle("largesmoke", posX + Math.random(), posY + 1.2, posZ + Math.random(), 0, 0, 0); int x = MathHelper.floor_double(posX); int y = MathHelper.floor_double(posY); int z = MathHelper.floor_double(posZ); Block block = this.worldObj.getBlock(x, y, z); if (block instanceof BlockLiquid || block instanceof IFluidBlock) worldObj.setBlockToAir(x, y, z); setDead(); } } @Override protected void onImpact(MovingObjectPosition mop) { if (mop == null) return; boolean hit = false; if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null && mop.entityHit != this && mop.entityHit != thrower && mop.entityHit != super.getThrower()) { hit = true; if (ConfigurationHandler.portableLaserEntityBurnTime > 0) mop.entityHit.setFire((int) (strength * ConfigurationHandler.portableLaserEntityBurnTime)); if (ConfigurationHandler.portableLaserEntityDamage > 0) mop.entityHit.attackEntityFrom( new EntityDamageSourceIndirect("bcaLaser", this, thrower != null ? thrower : super.getThrower()).setFireDamage() .setDamageBypassesArmor().setProjectile(), (int) (strength * ConfigurationHandler.portableLaserEntityDamage)); } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { hit = true; if (worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ) instanceof ILaserTargetBlock) { TileEntity tile = worldObj.getTileEntity(mop.blockX, mop.blockY, mop.blockZ); if (tile != null && tile instanceof ILaserTarget) { ILaserTarget target = (ILaserTarget) tile; if (!target.isInvalidTarget() && target.requiresLaserEnergy()) target.receiveLaserEnergy((int) (strength * ConfigurationHandler.portableLaserLaserPower)); } } } if (hit) { for (int i = 0; i < 32; i++) { worldObj.spawnParticle("smoke", posX + rand.nextDouble() / 4 - 0.125, posY + rand.nextDouble() / 4 - 0.125, posZ + rand.nextDouble() / 4 - 0.125, 0, 0, 0); worldObj.spawnParticle("flame", posX + rand.nextDouble() / 4 - 0.125, posY + rand.nextDouble() / 4 - 0.125, posZ + rand.nextDouble() / 4 - 0.125, 0, 0, 0); } if (!worldObj.isRemote) setDead(); } } @Override public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); nbt.setFloat("strength", strength); } @Override public void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); strength = nbt.getFloat("strength"); } @Override public void writeSpawnData(ByteBuf buffer) { buffer.writeFloat(strength); } @Override public void readSpawnData(ByteBuf additionalData) { strength = additionalData.readFloat(); } @Override public EntityLivingBase getThrower() { return thrower; } @Override public void setThrower(Entity entity) { if (entity == null) thrower = null; else if (entity instanceof EntityLivingBase) thrower = (EntityLivingBase) entity; } @Override protected float getGravityVelocity() { return 0; } @Override protected float func_70182_d() { return strength * 2 + 1; } public float getStrength() { return strength; } @Override public float getBrightness(float partialTicks) { return 1; } @Override @SideOnly(Side.CLIENT) public int getBrightnessForRender(float partialTicks) { return 15728880; } }