Jump to content

Custom projectile using wrong renderer, and behaving oddly


humanoidbob99

Recommended Posts

I am (obviously) making a mod, and I'm having a few problems.

First, I have created two separate projectiles, one similar to the fireball, called the Laser:

 

 

 

Entity class:

 

 

package humanoidbob99.SciFiMod;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;

import net.minecraft.enchantment.EnchantmentThorns;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.IProjectile;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagDouble;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.packet.Packet70GameEvent;
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 EntityLaser extends Entity
{
    private int xTile = -1;
    private int yTile = -1;
    private int zTile = -1;
    private int inTile = 0;
    private boolean inGround = false;
    public EntityLiving shootingEntity;
    private int ticksAlive;
    private int ticksInAir = 0;
    public double accelerationX;
    public double accelerationY;
    public double accelerationZ;
    private double damage = 2.0D;
    public int type = 0;
    
    public EntityLaser setType(int newType){
       this.type = newType;
       return this;
    }
    
    public double getDamage(){
       return this.damage;
    }
    
    public EntityLaser setDamage(double newDamage){
       this.damage = newDamage;
       return this;
    }

    public EntityLaser(World par1World)
    {
        super(par1World);
        this.setSize(0.5F, 0.5F);
    }

    protected void entityInit() {}

    @SideOnly(Side.CLIENT)

    /**
     * Checks if the entity is in range to render by using the past in distance and comparing it to its average edge
     * length * 64 * renderDistanceWeight Args: distance
     */
    public boolean isInRangeToRenderDist(double par1)
    {
        double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D;
        d1 *= 64.0D;
        return par1 < d1 * d1;
    }

    public EntityLaser(World par1World, double par2, double par4, double par6, double par8, double par10, double par12)
    {
        super(par1World);
        this.setSize(0.5F, 0.5F);
        this.setLocationAndAngles(par2, par4, par6, this.rotationYaw, this.rotationPitch);
        this.setPosition(par2, par4, par6);
        double d6 = (double)MathHelper.sqrt_double(par8 * par8 + par10 * par10 + par12 * par12);
        this.accelerationX = par8 / d6 * 0.1D;
        this.accelerationY = par10 / d6 * 0.1D;
        this.accelerationZ = par12 / d6 * 0.1D;
    }

    public EntityLaser(World par1World, EntityLiving par2EntityLiving, double par3, double par5, double par7)
    {
        super(par1World);
        this.shootingEntity = par2EntityLiving;
        this.setSize(0.5F, 0.5F);
        this.setLocationAndAngles(par2EntityLiving.posX, par2EntityLiving.getEyeHeight(), par2EntityLiving.posZ, par2EntityLiving.rotationYaw, par2EntityLiving.rotationPitch);
        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.accelerationX = 0;
        this.accelerationY = 0;
        this.accelerationZ = 0;
    }

    /**
     * Called to update the entity's position/logic.
     */
    public void onUpdate()
    {
        if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead || !this.worldObj.blockExists((int)this.posX, (int)this.posY, (int)this.posZ)))
        {
            this.setDead();
        }
        else
        {
            super.onUpdate();

            if(++this.ticksAlive >= 100){
               this.setDead();
            }

            Vec3 vec3 = this.worldObj.getWorldVec3Pool().getVecFromPool(this.posX, this.posY, this.posZ);
            Vec3 vec31 = this.worldObj.getWorldVec3Pool().getVecFromPool(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
            MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31);
            vec3 = this.worldObj.getWorldVec3Pool().getVecFromPool(this.posX, this.posY, this.posZ);
            vec31 = this.worldObj.getWorldVec3Pool().getVecFromPool(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);

            if (movingobjectposition != null)
            {
               if(movingobjectposition.entityHit != null){

                    int i1 = MathHelper.ceiling_double_int(this.damage);
                    DamageSource damagesource = null;

                    if (this.shootingEntity == null)
                    {
                        damagesource = SciFiMod.causeLaserDamage(this, this);
                    }
                    else
                    {
                        damagesource = SciFiMod.causeLaserDamage(this, this.shootingEntity);
                    }

                    if (movingobjectposition.entityHit.attackEntityFrom(damagesource, i1)){
                        if (movingobjectposition.entityHit instanceof EntityLiving)
                        {
                            EntityLiving entityliving = (EntityLiving)movingobjectposition.entityHit;
                            
                            if (this.shootingEntity != null)
                            {
                                EnchantmentThorns.func_92096_a(this.shootingEntity, entityliving, this.rand);
                            }
                            
                            if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity && movingobjectposition.entityHit instanceof EntityPlayer && this.shootingEntity instanceof EntityPlayerMP)
                            {
                                ((EntityPlayerMP)this.shootingEntity).playerNetServerHandler.sendPacketToPlayer(new Packet70GameEvent(6, 0));
                            }
                        }
                    }
               }
                vec31 = this.worldObj.getWorldVec3Pool().getVecFromPool(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;

            for (int j = 0; j < list.size(); ++j)
            {
                Entity entity1 = (Entity)list.get(j);

                if (entity1.canBeCollidedWith() && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25))
                {
                    float f = 0.3F;
                    AxisAlignedBB axisalignedbb = entity1.boundingBox.expand((double)f, (double)f, (double)f);
                    MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31);

                    if (movingobjectposition1 != null)
                    {
                        double d1 = vec3.distanceTo(movingobjectposition1.hitVec);

                        if (d1 < d0 || d0 == 0.0D)
                        {
                            entity = entity1;
                            d0 = d1;
                        }
                    }
                }
            }

            if (entity != null)
            {
                movingobjectposition = new MovingObjectPosition(entity);
            }

            if (movingobjectposition != null)
            {
                this.onImpact(movingobjectposition);
            }

            this.posX += this.motionX;
            this.posY += this.motionY;
            this.posZ += this.motionZ;
            float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
            this.rotationYaw = (float)(Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F;

            for (this.rotationPitch = (float)(Math.atan2((double)f1, this.motionY) * 180.0D / Math.PI) - 90.0F; 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 f2 = this.getMotionFactor();

            this.motionX += this.accelerationX;
            this.motionY += this.accelerationY;
            this.motionZ += this.accelerationZ;
            this.motionX *= (double)f2;
            this.motionY *= (double)f2;
            this.motionZ *= (double)f2;
            this.setPosition(this.posX, this.posY, this.posZ);
        }
    }

    /**
     * Return the motion factor for this projectile. The factor is multiplied by the original motion.
     */
    protected float getMotionFactor()
    {
        return 1.0F;
    }

    /**
     * Called when this EntityLaser hits a block or entity.
     */
    protected void onImpact(MovingObjectPosition movingobjectposition) {
   }

    /**
     * (abstract) Protected helper method to write subclass entity data to NBT.
     */
    public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    {
        par1NBTTagCompound.setShort("xTile", (short)this.xTile);
        par1NBTTagCompound.setShort("yTile", (short)this.yTile);
        par1NBTTagCompound.setShort("zTile", (short)this.zTile);
        par1NBTTagCompound.setByte("inTile", (byte)this.inTile);
        par1NBTTagCompound.setByte("inGround", (byte)(this.inGround ? 1 : 0));
        par1NBTTagCompound.setTag("direction", this.newDoubleNBTList(new double[] {this.motionX, this.motionY, this.motionZ}));
    }

    /**
     * (abstract) Protected helper method to read subclass entity data from NBT.
     */
    public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    {
        this.xTile = par1NBTTagCompound.getShort("xTile");
        this.yTile = par1NBTTagCompound.getShort("yTile");
        this.zTile = par1NBTTagCompound.getShort("zTile");
        this.inTile = par1NBTTagCompound.getByte("inTile") & 255;
        this.inGround = par1NBTTagCompound.getByte("inGround") == 1;

        if (par1NBTTagCompound.hasKey("direction"))
        {
            NBTTagList nbttaglist = par1NBTTagCompound.getTagList("direction");
            this.motionX = ((NBTTagDouble)nbttaglist.tagAt(0)).data;
            this.motionY = ((NBTTagDouble)nbttaglist.tagAt(1)).data;
            this.motionZ = ((NBTTagDouble)nbttaglist.tagAt(2)).data;
        }
        else
        {
            this.setDead();
        }
    }

    /**
     * Returns true if other Entities should be prevented from moving through this Entity.
     */
    public boolean canBeCollidedWith()
    {
        return true;
    }

    public float getCollisionBorderSize()
    {
        return 1.0F;
    }

    /**
     * Called when the entity is attacked.
     */
    public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
    {
        if (this.isEntityInvulnerable())
        {
            return false;
        }
        else
        {
            this.setBeenAttacked();

            if (par1DamageSource.getEntity() != null)
            {
                Vec3 vec3 = par1DamageSource.getEntity().getLookVec();

                if (vec3 != null)
                {
                    this.motionX = vec3.xCoord;
                    this.motionY = vec3.yCoord;
                    this.motionZ = vec3.zCoord;
                    this.accelerationX = this.motionX * 0.1D;
                    this.accelerationY = this.motionY * 0.1D;
                    this.accelerationZ = this.motionZ * 0.1D;
                }

                if (par1DamageSource.getEntity() instanceof EntityLiving)
                {
                    this.shootingEntity = (EntityLiving)par1DamageSource.getEntity();
                }

                return true;
            }
            else
            {
                return false;
            }
        }
    }

    @SideOnly(Side.CLIENT)
    public float getShadowSize()
    {
        return 0.0F;
    }

    /**
     * Gets how bright this entity is.
     */
    public float getBrightness(float par1)
    {
        return 1.0F;
    }

    @SideOnly(Side.CLIENT)
    public int getBrightnessForRender(float par1)
    {
        return 15728880;
    }
}

 

Renderer class:

 

 

package humanoidbob99.SciFiMod;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity;
import humanoidbob99.SciFiMod.EntityLaser;
import net.minecraft.item.Item;
import net.minecraft.util.Icon;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;

@SideOnly(Side.CLIENT)
public class RenderLaser extends Render
{

    public void doRenderLaser(EntityLaser par1EntityLaser, double par2, double par4, double par6, float par8, float par9)
    {
        GL11.glPushMatrix();
        GL11.glTranslatef((float)par2, (float)par4, (float)par6);
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        float f2 = 0;
        GL11.glScalef(f2 / 1.0F, f2 / 1.0F, f2 / 1.0F);
        Icon icon = SciFiMod.iconItem.getIconFromDamage(par1EntityLaser.type);
        this.loadTexture("/gui/items.png");
        Tessellator tessellator = Tessellator.instance;
        float f3 = icon.getMinU();
        float f4 = icon.getMaxU();
        float f5 = icon.getMinV();
        float f6 = icon.getMaxV();
        float f7 = 1.0F;
        float f8 = 0.5F;
        float f9 = 0.25F;
        GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
        GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
        tessellator.startDrawingQuads();
        tessellator.setNormal(0.0F, 1.0F, 0.0F);
        tessellator.addVertexWithUV((double)(0.0F - f8), (double)(0.0F - f9), 0.0D, (double)f3, (double)f6);
        tessellator.addVertexWithUV((double)(f7 - f8), (double)(0.0F - f9), 0.0D, (double)f4, (double)f6);
        tessellator.addVertexWithUV((double)(f7 - f8), (double)(1.0F - f9), 0.0D, (double)f4, (double)f5);
        tessellator.addVertexWithUV((double)(0.0F - f8), (double)(1.0F - f9), 0.0D, (double)f3, (double)f5);
        tessellator.draw();
        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
        GL11.glPopMatrix();
    }

    /**
     * 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<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
     * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
     */
    public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
    {
        this.doRenderLaser((EntityLaser)par1Entity, par2, par4, par6, par8, par9);
    }
}

 

and the other similar to a arrow, called Scrith Arrow:

 

 

Entity class:

 

package humanoidbob99.SciFiMod;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.enchantment.EnchantmentThorns;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.IProjectile;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.packet.Packet70GameEvent;
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 EntityArrowScrith extends Entity implements IProjectile
{
    private int xTile = -1;
    private int yTile = -1;
    private int zTile = -1;
    private int inTile = 0;
    private int inData = 0;
    private boolean inGround = false;

    /** 1 if the player can pick up the arrow */
    public int canBePickedUp = 0;

    /** Seems to be some sort of timer for animating an arrow. */
    public int arrowShake = 0;

    /** The owner of this arrow. */
    public Entity shootingEntity;
    private int ticksInGround;
    private int ticksInAir = 0;
    private double damage = 2.0D;

    /** The amount of knockback an arrow applies when it hits a mob. */
    private int knockbackStrength;

    public EntityArrowScrith(World par1World)
    {
        super(par1World);
        this.renderDistanceWeight = 10.0D;
        this.setSize(0.5F, 0.5F);
    }

    public EntityArrowScrith(World par1World, double par2, double par4, double par6)
    {
        super(par1World);
        this.renderDistanceWeight = 10.0D;
        this.setSize(0.5F, 0.5F);
        this.setPosition(par2, par4, par6);
        this.yOffset = 0.0F;
    }

    public EntityArrowScrith(World par1World, EntityLiving par2EntityLiving, EntityLiving par3EntityLiving, float par4, float par5)
    {
        super(par1World);
        this.renderDistanceWeight = 10.0D;
        this.shootingEntity = par2EntityLiving;

        if (par2EntityLiving instanceof EntityPlayer)
        {
            this.canBePickedUp = 1;
        }

        this.posY = par2EntityLiving.posY + (double)par2EntityLiving.getEyeHeight() - 0.10000000149011612D;
        double d0 = par3EntityLiving.posX - par2EntityLiving.posX;
        double d1 = par3EntityLiving.boundingBox.minY + (double)(par3EntityLiving.height / 3.0F) - this.posY;
        double d2 = par3EntityLiving.posZ - par2EntityLiving.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(par2EntityLiving.posX + d4, this.posY, par2EntityLiving.posZ + d5, f2, f3);
            this.yOffset = 0.0F;
            float f4 = (float)d3 * 0.2F;
            this.setThrowableHeading(d0, d1 + (double)f4, d2, par4, par5);
        }
    }

    public EntityArrowScrith(World par1World, EntityLiving par2EntityLiving, float par3)
    {
        super(par1World);
        this.renderDistanceWeight = 10.0D;
        this.shootingEntity = par2EntityLiving;

        if (par2EntityLiving instanceof EntityPlayer)
        {
            this.canBePickedUp = 1;
        }

        this.setSize(0.5F, 0.5F);
        this.setLocationAndAngles(par2EntityLiving.posX, par2EntityLiving.posY + (double)par2EntityLiving.getEyeHeight(), par2EntityLiving.posZ, par2EntityLiving.rotationYaw, par2EntityLiving.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, par3 * 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.
     */
    public void setThrowableHeading(double par1, double par3, double par5, float par7, float par8)
    {
        float f2 = MathHelper.sqrt_double(par1 * par1 + par3 * par3 + par5 * par5);
        par1 /= (double)f2;
        par3 /= (double)f2;
        par5 /= (double)f2;
        par1 += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)par8;
        par3 += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)par8;
        par5 += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)par8;
        par1 *= (double)par7;
        par3 *= (double)par7;
        par5 *= (double)par7;
        this.motionX = par1;
        this.motionY = par3;
        this.motionZ = par5;
        float f3 = MathHelper.sqrt_double(par1 * par1 + par5 * par5);
        this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(par1, par5) * 180.0D / Math.PI);
        this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(par3, (double)f3) * 180.0D / Math.PI);
        this.ticksInGround = 0;
    }

    @SideOnly(Side.CLIENT)

    /**
     * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX,
     * posY, posZ, yaw, pitch
     */
    public void setPositionAndRotation2(double par1, double par3, double par5, float par7, float par8, int par9)
    {
        this.setPosition(par1, par3, par5);
        this.setRotation(par7, par8);
    }

    @SideOnly(Side.CLIENT)

    /**
     * Sets the velocity to the args. Args: x, y, z
     */
    public void setVelocity(double par1, double par3, double par5)
    {
        this.motionX = par1;
        this.motionY = par3;
        this.motionZ = par5;

        if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F)
        {
            float f = MathHelper.sqrt_double(par1 * par1 + par5 * par5);
            this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(par1, par5) * 180.0D / Math.PI);
            this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(par3, (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.
     */
    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);
        }

        int i = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);

        if (i > 0)
        {
            Block.blocksList[i].setBlockBoundsBasedOnState(this.worldObj, this.xTile, this.yTile, this.zTile);
            AxisAlignedBB axisalignedbb = Block.blocksList[i].getCollisionBoundingBoxFromPool(this.worldObj, this.xTile, this.yTile, this.zTile);

            if (axisalignedbb != null && axisalignedbb.isVecInside(this.worldObj.getWorldVec3Pool().getVecFromPool(this.posX, this.posY, this.posZ)))
            {
                this.inGround = true;
            }
        }

        if (this.arrowShake > 0)
        {
            --this.arrowShake;
        }

        if (this.inGround)
        {
            int j = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
            int k = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile);

            if (j == this.inTile && k == this.inData)
            {
                ++this.ticksInGround;

                if (this.ticksInGround == 1200)
                {
                    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 vec3 = this.worldObj.getWorldVec3Pool().getVecFromPool(this.posX, this.posY, this.posZ);
            Vec3 vec31 = this.worldObj.getWorldVec3Pool().getVecFromPool(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
            MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks_do_do(vec3, vec31, false, true);
            vec3 = this.worldObj.getWorldVec3Pool().getVecFromPool(this.posX, this.posY, this.posZ);
            vec31 = this.worldObj.getWorldVec3Pool().getVecFromPool(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);

            if (movingobjectposition != null)
            {
                vec31 = this.worldObj.getWorldVec3Pool().getVecFromPool(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 l;
            float f1;

            for (l = 0; l < list.size(); ++l)
            {
                Entity entity1 = (Entity)list.get(l);

                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(vec3, vec31);

                    if (movingobjectposition1 != null)
                    {
                        double d1 = vec3.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).func_96122_a(entityplayer))
                {
                    movingobjectposition = null;
                }
            }

            float f2;
            float f3;

            if (movingobjectposition != null)
            {
                if (movingobjectposition.entityHit != null)
                {
                    f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ);
                    int i1 = MathHelper.ceiling_double_int((double)f2 * this.damage);

                    if (this.getIsCritical())
                    {
                        i1 += this.rand.nextInt(i1 / 2 + 2);
                    }

                    DamageSource damagesource = null;

                    if (this.shootingEntity == null)
                    {
                        damagesource = SciFiMod.causeArrowScrithDamage(this, this);
                    }
                    else
                    {
                        damagesource = SciFiMod.causeArrowScrithDamage(this, this.shootingEntity);
                    }

                    if (this.isBurning())
                    {
                        movingobjectposition.entityHit.setFire(5);
                    }

                    if (movingobjectposition.entityHit.attackEntityFrom(damagesource, i1))
                    {
                        if (movingobjectposition.entityHit instanceof EntityLiving)
                        {
                            EntityLiving entityliving = (EntityLiving)movingobjectposition.entityHit;

                            if (!this.worldObj.isRemote)
                            {
                                entityliving.setArrowCountInEntity(entityliving.getArrowCountInEntity() + 1);
                            }

                            if (this.knockbackStrength > 0)
                            {
                                f3 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);

                                if (f3 > 0.0F)
                                {
                                    movingobjectposition.entityHit.addVelocity(this.motionX * (double)this.knockbackStrength * 0.6000000238418579D / (double)f3, 0.1D, this.motionZ * (double)this.knockbackStrength * 0.6000000238418579D / (double)f3);
                                }
                            }

                            if (this.shootingEntity != null)
                            {
                                EnchantmentThorns.func_92096_a(this.shootingEntity, entityliving, this.rand);
                            }

                            if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity && movingobjectposition.entityHit instanceof EntityPlayer && this.shootingEntity instanceof EntityPlayerMP)
                            {
                                ((EntityPlayerMP)this.shootingEntity).playerNetServerHandler.sendPacketToPlayer(new Packet70GameEvent(6, 0));
                            }
                        }

                        this.playSound("newsound.random.fizz", 0.75F,(this.rand.nextFloat()) * 0.2F + 1.5F);

                        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.xTile = movingobjectposition.blockX;
                    this.yTile = movingobjectposition.blockY;
                    this.zTile = movingobjectposition.blockZ;
                    this.inTile = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
                    this.inData = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile);
                    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;
                    this.setIsCritical(false);

                    if (this.inTile != 0)
                    {
                        Block.blocksList[this.inTile].onEntityCollidedWithBlock(this.worldObj, this.xTile, this.yTile, this.zTile, this);
                    }
                }
            }

            if (this.getIsCritical())
            {
                for (l = 0; l < 4; ++l)
                {
                    this.worldObj.spawnParticle("crit", this.posX + this.motionX * (double)l / 4.0D, this.posY + this.motionY * (double)l / 4.0D, this.posZ + this.motionZ * (double)l / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ);
                }
            }

            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 f4 = 0.99F;
            f1 = 0.05F;

            if (this.isInWater())
            {
                for (int j1 = 0; j1 < 4; ++j1)
                {
                    f3 = 0.25F;
                    this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)f3, this.posY - this.motionY * (double)f3, this.posZ - this.motionZ * (double)f3, this.motionX, this.motionY, this.motionZ);
                }

                f4 = 0.8F;
            }

            this.motionX *= (double)f4;
            this.motionY *= (double)f4;
            this.motionZ *= (double)f4;
            this.motionY -= (double)f1;
            this.setPosition(this.posX, this.posY, this.posZ);
            this.doBlockCollisions();
        }
    }

    /**
     * (abstract) Protected helper method to write subclass entity data to NBT.
     */
    public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    {
        par1NBTTagCompound.setShort("xTile", (short)this.xTile);
        par1NBTTagCompound.setShort("yTile", (short)this.yTile);
        par1NBTTagCompound.setShort("zTile", (short)this.zTile);
        par1NBTTagCompound.setByte("inTile", (byte)this.inTile);
        par1NBTTagCompound.setByte("inData", (byte)this.inData);
        par1NBTTagCompound.setByte("shake", (byte)this.arrowShake);
        par1NBTTagCompound.setByte("inGround", (byte)(this.inGround ? 1 : 0));
        par1NBTTagCompound.setByte("pickup", (byte)this.canBePickedUp);
        par1NBTTagCompound.setDouble("damage", this.damage);
    }

    /**
     * (abstract) Protected helper method to read subclass entity data from NBT.
     */
    public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    {
        this.xTile = par1NBTTagCompound.getShort("xTile");
        this.yTile = par1NBTTagCompound.getShort("yTile");
        this.zTile = par1NBTTagCompound.getShort("zTile");
        this.inTile = par1NBTTagCompound.getByte("inTile") & 255;
        this.inData = par1NBTTagCompound.getByte("inData") & 255;
        this.arrowShake = par1NBTTagCompound.getByte("shake") & 255;
        this.inGround = par1NBTTagCompound.getByte("inGround") == 1;

        if (par1NBTTagCompound.hasKey("damage"))
        {
            this.damage = par1NBTTagCompound.getDouble("damage");
        }

        if (par1NBTTagCompound.hasKey("pickup"))
        {
            this.canBePickedUp = par1NBTTagCompound.getByte("pickup");
        }
        else if (par1NBTTagCompound.hasKey("player"))
        {
            this.canBePickedUp = par1NBTTagCompound.getBoolean("player") ? 1 : 0;
        }
    }

    /**
     * Called by a player entity when they collide with an entity
     */
    public void onCollideWithPlayer(EntityPlayer par1EntityPlayer)
    {
        if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0)
        {
            boolean flag = this.canBePickedUp == 1 || this.canBePickedUp == 2 && par1EntityPlayer.capabilities.isCreativeMode;

            if (this.canBePickedUp == 1 && !par1EntityPlayer.inventory.addItemStackToInventory(new ItemStack(SciFiMod.arrowScrith, 1)))
            {
                flag = false;
            }

            if (flag)
            {
                this.playSound("random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
                par1EntityPlayer.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 par1)
    {
        this.damage = par1;
    }

    public double getDamage()
    {
        return this.damage;
    }

    /**
     * Sets the amount of knockback the arrow applies when it hits a mob.
     */
    public void setKnockbackStrength(int par1)
    {
        this.knockbackStrength = par1;
    }

    /**
     * If returns false, the item will not inflict any damage against entities.
     */
    public boolean canAttackWithItem()
    {
        return false;
    }

    /**
     * Whether the arrow has a stream of critical hit particles flying behind it.
     */
    public void setIsCritical(boolean par1)
    {
        byte b0 = this.dataWatcher.getWatchableObjectByte(16);

        if (par1)
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 1)));
        }
        else
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -2)));
        }
    }

    /**
     * Whether the arrow has a stream of critical hit particles flying behind it.
     */
    public boolean getIsCritical()
    {
        byte b0 = this.dataWatcher.getWatchableObjectByte(16);
        return (b0 & 1) != 0;
    }
}

 

Renderer class:

 

package humanoidbob99.SciFiMod;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity;
import humanoidbob99.SciFiMod.EntityArrowScrith;
import net.minecraft.util.MathHelper;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;

@SideOnly(Side.CLIENT)
public class RenderArrowScrith extends Render
{
    public void renderArrowScrith(EntityArrowScrith par1EntityArrowScrith, double par2, double par4, double par6, float par8, float par9)
    {
        this.loadTexture("/mods/humanoidbob99/SciFiMod/textures/entities/arrowsofscrith.png");
        GL11.glPushMatrix();
        GL11.glTranslatef((float)par2, (float)par4, (float)par6);
        GL11.glRotatef(par1EntityArrowScrith.prevRotationYaw + (par1EntityArrowScrith.rotationYaw - par1EntityArrowScrith.prevRotationYaw) * par9 - 90.0F, 0.0F, 1.0F, 0.0F);
        GL11.glRotatef(par1EntityArrowScrith.prevRotationPitch + (par1EntityArrowScrith.rotationPitch - par1EntityArrowScrith.prevRotationPitch) * par9, 0.0F, 0.0F, 1.0F);
        Tessellator tessellator = Tessellator.instance;
        byte b0 = 0;
        float f2 = 0.0F;
        float f3 = 0.5F;
        float f4 = (float)(0 + b0 * 10) / 32.0F;
        float f5 = (float)(5 + b0 * 10) / 32.0F;
        float f6 = 0.0F;
        float f7 = 0.15625F;
        float f8 = (float)(5 + b0 * 10) / 32.0F;
        float f9 = (float)(10 + b0 * 10) / 32.0F;
        float f10 = 0.05625F;
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        float f11 = (float)par1EntityArrowScrith.arrowShake - par9;

        if (f11 > 0.0F)
        {
            float f12 = -MathHelper.sin(f11 * 3.0F) * f11;
            GL11.glRotatef(f12, 0.0F, 0.0F, 1.0F);
        }

        GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F);
        GL11.glScalef(f10, f10, f10);
        GL11.glTranslatef(-4.0F, 0.0F, 0.0F);
        GL11.glNormal3f(f10, 0.0F, 0.0F);
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV(-7.0D, -2.0D, -2.0D, (double)f6, (double)f8);
        tessellator.addVertexWithUV(-7.0D, -2.0D, 2.0D, (double)f7, (double)f8);
        tessellator.addVertexWithUV(-7.0D, 2.0D, 2.0D, (double)f7, (double)f9);
        tessellator.addVertexWithUV(-7.0D, 2.0D, -2.0D, (double)f6, (double)f9);
        tessellator.draw();
        GL11.glNormal3f(-f10, 0.0F, 0.0F);
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV(-7.0D, 2.0D, -2.0D, (double)f6, (double)f8);
        tessellator.addVertexWithUV(-7.0D, 2.0D, 2.0D, (double)f7, (double)f8);
        tessellator.addVertexWithUV(-7.0D, -2.0D, 2.0D, (double)f7, (double)f9);
        tessellator.addVertexWithUV(-7.0D, -2.0D, -2.0D, (double)f6, (double)f9);
        tessellator.draw();

        for (int i = 0; i < 4; ++i)
        {
            GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F);
            GL11.glNormal3f(0.0F, 0.0F, f10);
            tessellator.startDrawingQuads();
            tessellator.addVertexWithUV(-8.0D, -2.0D, 0.0D, (double)f2, (double)f4);
            tessellator.addVertexWithUV(8.0D, -2.0D, 0.0D, (double)f3, (double)f4);
            tessellator.addVertexWithUV(8.0D, 2.0D, 0.0D, (double)f3, (double)f5);
            tessellator.addVertexWithUV(-8.0D, 2.0D, 0.0D, (double)f2, (double)f5);
            tessellator.draw();
        }

        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
        GL11.glPopMatrix();
    }

    /**
     * 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<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
     * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
     */
    public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
    {
        this.renderArrowScrith((EntityArrowScrith)par1Entity, par2, par4, par6, par8, par9);
    }
}

 

 

The laser, for some reason, renders as a scrith arrow.

Second, the laser is supposed to move in a straight line in the direction the player is looking, and it is being stupid, turning in a random direction and moving mostly horizontally.

Here are my other classes:

 

 

Mod class:

 

package humanoidbob99.SciFiMod;

import humanoidbob99.SciFiMod.client.ClientProxy;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBow;
import net.minecraft.item.ItemStack;
import net.minecraft.src.ModLoader;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EntityDamageSourceIndirect;
import net.minecraftforge.common.MinecraftForge;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;

@Mod(modid="SciFiMod", name="SciFiMod", version="0.0.0")
@NetworkMod(clientSideRequired=true, serverSideRequired=false)
public class SciFiMod {

        // The instance of your mod that Forge uses.
        @Instance("SciFiMod")
        public static SciFiMod instance;
        
        public static final Block blockScrith = new BlockScrith(1499).setHardness(50.0F).setResistance(2000.0F).setStepSound(Block.soundMetalFootstep).setCreativeTab(CreativeTabs.tabBlock).setUnlocalizedName("blockScrith");
        
        public static final SciFiModItem scrithDust = (SciFiModItem) new SciFiModItem(21499).setTextureFile(CommonProxy.SCRITHDUST_PNG).setUnlocalizedName("scrithDust").setCreativeTab(CreativeTabs.tabMaterials);
        public static final Item bowScrith = new BowScrith(21500).setUnlocalizedName("bowScrith");
        public static final SciFiModItem scrithWire = (SciFiModItem) new SciFiModItem(21501).setTextureFile(CommonProxy.SCRITHWIRE_PNG).setUnlocalizedName("scrithWire").setCreativeTab(CreativeTabs.tabMaterials);
        public static final SciFiModItem ingotScrith = (SciFiModItem) new SciFiModItem(21502).setTextureFile(CommonProxy.INGOTSCRITH_PNG).setUnlocalizedName("ingotScrith").setCreativeTab(CreativeTabs.tabMaterials);
        public static final SciFiModItem arrowScrith = (SciFiModItem) new SciFiModItem(21503).setTextureFile(CommonProxy.ARROWSCRITH_PNG).setUnlocalizedName("arrowScrith").setCreativeTab(CreativeTabs.tabCombat);
        public static final SciFiModItem redstonePutty = (SciFiModItem) new SciFiModItem(21504).setTextureFile(CommonProxy.REDSTONEPUTTY_PNG).setUnlocalizedName("redstonePutty").setCreativeTab(CreativeTabs.tabMaterials);
        public static final SciFiModItem redstoneShard = (SciFiModItem) new SciFiModItem(21505).setTextureFile(CommonProxy.REDSTONESHARD_PNG).setUnlocalizedName("redstoneShard").setCreativeTab(CreativeTabs.tabCombat);
        public static final SciFiModItem ironFletching = (SciFiModItem) new SciFiModItem(21506).setTextureFile(CommonProxy.IRONFLETCHING_PNG).setUnlocalizedName("ironFletching").setCreativeTab(CreativeTabs.tabCombat);
        public static final SciFiModIconItem iconItem = (SciFiModIconItem) new SciFiModIconItem(21507);
        public static final LaserGun laserGun = (LaserGun) new LaserGun(21508).setUnlocalizedName("laserGun").setCreativeTab(CreativeTabs.tabCombat);
        public static final SciFiModItem depletedRedstonePutty = (SciFiModItem) new SciFiModItem(21509).setTextureFile(CommonProxy.REDSTONEPUTTY_PNG).setUnlocalizedName("depletedRedstonePutty").setCreativeTab(CreativeTabs.tabMaterials);

        public static DamageSource causeArrowScrithDamage(EntityArrowScrith par0EntityArrowScrith, Entity par1Entity)
        {
            return (new EntityDamageSourceIndirect("arrowScrith", par0EntityArrowScrith, par1Entity)).setProjectile();
        }
        public static DamageSource causeLaserDamage(EntityLaser par0EntityLaser, Entity par1Entity)
        {
            return (new EntityDamageSourceIndirect("laser", par0EntityLaser, par1Entity).setExplosion());
        }
        
        // Says where the client and server 'proxy' code is loaded.
        @SidedProxy(clientSide="humanoidbob99.SciFiMod.client.ClientProxy", serverSide="humanoidbob99.SciFiMod.CommonProxy")
        public static ClientProxy proxy;
        
        @PreInit
        public void preInit(FMLPreInitializationEvent event) {
                // Stub Method
        }
        
        @Init
        public void load(FMLInitializationEvent event) {
           LanguageRegistry.addName(blockScrith, "Scrith Block");
           LanguageRegistry.addName(scrithDust, "Scrith Dust");
           LanguageRegistry.addName(bowScrith, "Scrith Bow");
           LanguageRegistry.addName(scrithWire, "Scrith Cord");
           LanguageRegistry.addName(ingotScrith, "Scrith Ingot");
           LanguageRegistry.addName(arrowScrith, "Scrith Arrow");
           LanguageRegistry.addName(redstonePutty, "Redstone Putty");
           LanguageRegistry.addName(redstoneShard, "Redstone Shard");
           LanguageRegistry.addName(ironFletching, "Iron Fletching");
           LanguageRegistry.addName(laserGun, "Laser Gun");
           EntityRegistry.registerModEntity(EntityArrowScrith.class, "arrowScrith", EntityRegistry.findGlobalUniqueEntityId(), this, 64, 1, true);
           EntityRegistry.registerModEntity(EntityLaser.class, "laser", EntityRegistry.findGlobalUniqueEntityId(), this, 64, 1, true);
            proxy.registerRenderers();
            GameRegistry.addRecipe(new ItemStack(arrowScrith,9), new Object[]{"s","b","f",'s',this.redstoneShard,'b',Item.blazeRod,'f',this.ironFletching});
            GameRegistry.addRecipe(new ItemStack(bowScrith), new Object[]{" bw", "b w", " bw",'b',Item.blazeRod,'w',this.ironFletching});
            GameRegistry.addRecipe(new ItemStack(scrithWire,9), new Object[]{"i","i","i",'i',this.ingotScrith});
            GameRegistry.addRecipe(new ItemStack(blockScrith,1), new Object[]{"iii","iii","iii",'i',this.ingotScrith});
            GameRegistry.addRecipe(new ItemStack(ingotScrith,9), new Object[]{"b",'b',this.blockScrith});
            GameRegistry.addRecipe(new ItemStack(redstonePutty,, new Object[]{"rrr", "rbr", "rrr", 'b', Item.bucketWater, 'r', Item.redstone});
            GameRegistry.addRecipe(new ItemStack(laserGun, 1), new Object[]{"ssd", "sgq", 's', this.ingotScrith, 'd', Item.diamond, 'g', Item.lightStoneDust, 'q', Item.netherQuartz});
            GameRegistry.addShapelessRecipe(new ItemStack(scrithDust,4), new Object[]{Block.obsidian,Block.obsidian,Item.diamond,Item.ingotGold,Item.ingotGold,Item.ingotGold,Item.ingotIron,Item.ingotIron,Item.ingotIron});
            GameRegistry.addShapelessRecipe(new ItemStack(ironFletching, 3), new Object[]{Item.ingotIron});
            GameRegistry.addShapelessRecipe(new ItemStack(depletedRedstonePutty, 1), new Object[]{this.redstonePutty, this.laserGun});
            GameRegistry.addSmelting(redstonePutty.itemID, new ItemStack(redstoneShard), 0.0F);
            GameRegistry.registerBlock(blockScrith, "blockScrith");
            MinecraftForge.setBlockHarvestLevel(blockScrith, "BlockScrith", 4);
        }
        
        @PostInit
        public void postInit(FMLPostInitializationEvent event) {
                // Stub Method
        }
}

 

ClientProxy:

 

package humanoidbob99.SciFiMod.client;

import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraftforge.client.MinecraftForgeClient;
import humanoidbob99.SciFiMod.CommonProxy;
import humanoidbob99.SciFiMod.EntityArrowScrith;
import humanoidbob99.SciFiMod.EntityLaser;
import humanoidbob99.SciFiMod.RenderArrowScrith;
import humanoidbob99.SciFiMod.RenderLaser;

public class ClientProxy extends CommonProxy {
        
        @Override
        public void registerRenderers() {
           RenderingRegistry.registerEntityRenderingHandler(EntityArrowScrith.class, new RenderArrowScrith());
           RenderingRegistry.registerEntityRenderingHandler(EntityLaser.class, new RenderLaser());
           for(int i = 0; i < scifimodimages.length; i++){
              MinecraftForgeClient.preloadTexture("humanoidbob99/SciFiMod:" + scifimodimages[i]);
           }
        }
        
}

 

CommonProxy:

 

package humanoidbob99.SciFiMod;

public class CommonProxy {
   public static String[] scifimodimages = {"bootsScrith", "bowScrith", "chestplateScrith", "hatchetScrith", "helmetScrith", "hoeScrith",
      "ingotScrith", "leggingsScrith", "pickaxeScrith", "scrithDust", "scrithWire", "shovelScrith", "swordScrith", "bowScrith_pull_0",
      "bowScrith_pull_1", "bowScrith_pull_2", "ironFletching", "redstonePutty", "redstoneShard", "arrowScrith", "blockScrith", "laser0",
      "laser1", "laser2", "laserGun0", "laserGun1", "laserGun2", "laserGun3"};
    public static String BOOTSSCRITH_PNG = "humanoidbob99/SciFiMod:bootsScrith";
    public static String BOWSCRITH_PNG = "humanoidbob99/SciFiMod:bowScrith";
    public static String CHESTPLATESCRITH_PNG = "humanoidbob99/SciFiMod:chestplateScrith";
    public static String HATCHETSCRITH_PNG = "humanoidbob99/SciFiMod:hatchetScrith";
    public static String HELMETSCRITH_PNG = "humanoidbob99/SciFiMod:helmetScrith";
    public static String HOESCRITH_PNG = "humanoidbob99/SciFiMod:hoeScrith";
    public static String INGOTSCRITH_PNG = "humanoidbob99/SciFiMod:ingotScrith";
    public static String LEGGINGSSCRITH_PNG = "humanoidbob99/SciFiMod:leggingsScrith";
    public static String PICKAXESCRITH_PNG = "humanoidbob99/SciFiMod:pickaxeScrith";
    public static String SCRITHDUST_PNG = "humanoidbob99/SciFiMod:scrithDust";
    public static String SCRITHWIRE_PNG = "humanoidbob99/SciFiMod:scrithWire";
    public static String SHOVELSCRITH_PNG = "humanoidbob99/SciFiMod:shovelScrith";
    public static String SWORDSCRITH_PNG = "humanoidbob99/SciFiMod:swordScrith";
    public static String BOWSCRITH_PULL_0 = "humanoidbob99/SciFiMod:bowScrith_pull_0";
    public static String BOWSCRITH_PULL_1 = "humanoidbob99/SciFiMod:bowScrith_pull_1";
    public static String BOWSCRITH_PULL_2 = "humanoidbob99/SciFiMod:bowScrith_pull_2";
    public static String IRONFLETCHING_PNG = "humanoidbob99/SciFiMod:ironFletching";
    public static String REDSTONEPUTTY_PNG = "humanoidbob99/SciFiMod:redstonePutty";
    public static String REDSTONESHARD_PNG = "humanoidbob99/SciFiMod:redstoneShard";
    public static String ARROWSCRITH_PNG = "humanoidbob99/SciFiMod:arrowScrith";
    public static String BLOCKSCRITH_PNG = "humanoidbob99/SciFiMod:blockScrith";
    public static String LASER0_PNG = "humanoidbob99/SciFiMod:laser0";
    public static String LASER1_PNG = "humanoidbob99/SciFiMod:laser1";
    public static String LASER2_PNG = "humanoidbob99/SciFiMod:laser2";
    public static String LASERGUN0_PNG = "humanoidbob99/SciFiMod:laserGun0";
    public static String LASERGUN1_PNG = "humanoidbob99/SciFiMod:laserGun1";
    public static String LASERGUN2_PNG = "humanoidbob99/SciFiMod:laserGun2";
    public static String LASERGUN3_PNG = "humanoidbob99/SciFiMod:laserGun3";
    
    // Client stuff
    public void registerRenderers() {
            // Nothing here as the server doesn't render graphics!
    }
}

 

Laser Gun class:

 

package humanoidbob99.SciFiMod;

import humanoidbob99.SciFiMod.client.ClientProxy;
import humanoidbob99.SciFiMod.EntityLaser;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.item.EnumAction;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBow;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Icon;
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 LaserGun extends Item
{
    public static final String[] laserIconNameArray = new String[] {ClientProxy.LASERGUN0_PNG, ClientProxy.LASERGUN1_PNG, ClientProxy.LASERGUN2_PNG, ClientProxy.LASERGUN3_PNG};
    @SideOnly(Side.CLIENT)
    private Icon[] iconArray;
   private String unlocalizedName;
   private int iconId = 0;

    public LaserGun(int par1)
    {
        super(par1);
        this.maxStackSize = 1;
        this.setMaxDamage(30);
        this.setNoRepair();
        this.setCreativeTab(CreativeTabs.tabCombat);
    }

    public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    {
        return par1ItemStack;
    }

    /**
     * How long it takes to use or consume an item
     */
    public int getMaxItemUseDuration(ItemStack par1ItemStack)
    {
        return 72000;
    }

    /**
     * returns the action that specifies what animation to play when the items is being used
     */
    public EnumAction getItemUseAction(ItemStack par1ItemStack)
    {
        return EnumAction.none;
    }
    /**
     * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
     */
    public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    {

        boolean flag = par1ItemStack.getItemDamage() > 0;

        if (flag)
        {

            EntityLaser entityLaser = new EntityLaser(par2World, par3EntityPlayer, 0, 0, 0);
            int laserDamage = (int) par1ItemStack.getItemDamage() / 10 + 3;
            entityLaser.setDamage(laserDamage);
            entityLaser.setType(3 - (30 - par1ItemStack.getItemDamage() + 9) / 10);
            par1ItemStack.damageItem(1, par3EntityPlayer);
            par2World.playSoundAtEntity(par3EntityPlayer, "newsound.fire.ignite", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F));

            if (!par2World.isRemote)
            {
                par2World.spawnEntityInWorld(entityLaser);
            }
        }

        par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack));

        return par1ItemStack;
    }

    @SideOnly(Side.CLIENT)
    @Override
    public void registerIcons(IconRegister par1IconRegister)
    {
        this.iconArray = new Icon[laserIconNameArray.length];

        for (int i = 0; i < this.iconArray.length; i++)
        {
            this.iconArray[i] = par1IconRegister.registerIcon(laserIconNameArray[i]);
        }
        this.itemIcon = iconArray[0];
    }
    public LaserGun setUnlocalizedName(String par1Str)
    {
        this.unlocalizedName = par1Str;
        return this;
    }

    @SideOnly(Side.CLIENT)

    /**
     * used to cycle through icons based on their used duration, i.e. for the bow
     */
    public Icon getIconFromDamage(int par5)
    {
       par5 = 30 - par5;
        if(par5 > 20){
           return iconArray[1];
        }
        else if(par5 > 10){
           return iconArray[2];
        }
        else if(par5 > 0){
           return iconArray[3];
        }
        else{
           return iconArray[0];
        }
    }
}

 

I think that's all of the important ones, but if you think of any more classes that are needed here, just tell me.

 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • java.lang.RuntimeException:null at net.minecraftforge.registries.GameData.postRegisterEvents(GameData.java:315) ~[forge-1.20.1-47.3.10-universal.jar%23329!/:?] {re:mixin,re:classloading,pl:mixin:APP:supermartijn642corelib.mixins.json:GameDataMixin,pl:mixin:A}at net.minecraftforge.common.ForgeStatesProvider.lambda$new$4(ForgeStatesProvider.java:25) ~[forge-1.20.1-47.3.10-universal.jar%23329!/:?] {re:classloading}at net.minecraftforge.fml.ModLoader.handleInlineTransition(ModLoader.java:217) ~[fmlcore-1.20.1-47.3.10.jar%23325!/:?] {}at net.minecraftforge.fml.ModLoader.lambda$dispatchAndHandleError$19(ModLoader.java:209) ~[fmlcore-1.20.1-47.3.10.jar%23325!/:?] {}at java.util.Optional.ifPresent(Optional.java:178) ~[?:?] {re:mixin}at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:209) ~[fmlcore-1.20.1-47.3.10.jar%23325!/:?] {}at net.minecraftforge.fml.ModLoader.lambda$gatherAndInitializeMods$13(ModLoader.java:183) ~[fmlcore-1.20.1-47.3.10.jar%23325!/:?] {}at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?] {re:mixin}at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:183) ~[fmlcore-1.20.1-47.3.10.jar%23325!/:?] {}at net.minecraftforge.client.loading.ClientModLoader.lambda$begin$1(ClientModLoader.java:69) ~[forge-1.20.1-47.3.10-universal.jar%23329!/:?] {re:classloading,pl:runtimedistcleaner:A}at net.minecraftforge.client.loading.ClientModLoader.lambda$createRunnableWithCatch$4(ClientModLoader.java:89) ~[forge-1.20.1-47.3.10-universal.jar%23329!/:?] {re:classloading,pl:runtimedistcleaner:A}at net.minecraftforge.client.loading.ClientModLoader.begin(ClientModLoader.java:69) ~[forge-1.20.1-47.3.10-universal.jar%23329!/:?] {re:classloading,pl:runtimedistcleaner:A}at net.minecraft.client.Minecraft.                Size    Insert image from URL
    • My Bitcoin Recovery Experience With  The Hack Angels.     I highly recommend the service of The Hack Angels to everyone who wishes to recover lost money either bitcoin or other cryptocurrencies from these online scammers, wallet hackers, or if you ever sent bitcoins to the wrong wallet address. I was able to recover my lost bitcoins from online swindlers in less than two days after contacting them. They are the best professional hackers out there and I’m truly thankful for their help in recovering all I lost. If you need their service too, here is their contact information.   Mail Box; support@thehackangels. com    (Web: https://thehackangels.com) Whats Ap; +1 520) - 200, 23  20
    • Temu Coupon Code $50 off [taa85211] or [tad85211] for New and Existing Users To get Temu $50 off Coupon Code [taa85211] or [tad85211] as a new user enter the Coupon during checkout when making your first purchase at Temu You will receive the benefit once the Coupon applied. TEMU App is a shopping platform that provides us with the best-branded items at Cheap prices. You will also notice that TEMU offers users to save extra by applying the TEMU Coupon Code during checkout. You can get $50 off Temu by using the Coupon Code “taa85211} or {tad85211} ”. Existing customers can use this code. Temu existing user Coupon Code: [taa85211} or {tad85211} Using Temu’s Coupon Code [taa85211} or {tad85211] will get you $50 off, access to exclusive deals, and benefits for additional savings. Save $50 off with Temu Coupon Codes. New and existing customer offers. What is Temu $50 Coupon Bundle? New Temu $50 Coupon bundle includes $50 worth of Temu Coupon Codes. The Temu $50 Coupon Code [taa85211} or {tad85211] can be used by new and existing Temu users to get a Coupon on their purchases. Temu $50 Coupon Bundle Code [taa85211} or {tad85211] Temu Coupon $50 off for existing customers There are a number of Coupons and deals shoppers can take advantage of with the Teemu Coupon Bundle [taa85211} or {tad85211]. Temu Coupon $50 off for existing customers"taa85211} or {tad85211" will save you $100 on your order. To get a Coupon, click on the item to purchase and enter the code. You can think of it as a supercharged savings pack for all your shopping needs Temu Coupon Code $50 off free shipping You will save $50 when you use Temu’s $50 OFF Coupon Code [taa85211} or {tad85211]. Enter the Coupon Code when purchasing an item How Does Temu $50 Coupon Work Temu’s $50 Coupon Code isn’t just one big Coupon you use all at once. Instead, think of it as a welcome package filled with different Coupons and offers worth $50. New customers are welcome. Temu Coupon Code $50 off Temu $40 OFF Coupon Code “taa85211} or {tad85211” will save you $50 on your order. To get a Coupon, click on the item to purchase and enter the code. Yes, Temu offers $50 off Coupon Code “taa85211} or {tad85211” for first time users. You can get a $50 bonus plus 30% off any purchase at Temu with the $40 Coupon Bundle at Temu if you sign up with the Coupon Code [taa85211} or {tad85211] and make a first purchase of $50 or more. How Do Apply Temu Coupon Code [taa85211} or {tad85211]? 1.Download the TEMU app and create a new account. 2.Fill in basic details to complete account verification. 3. Select the item you want to purchase and add it to your cart Minimum of $100. 4.Click on the Coupon Code option and enter the TEMU Coupon Code. 5.Once the Coupon has been applied, you will see the final Coupon. 6.P rice Select your payment method and complete your purchase. Temu Coupon Code $50 off first time user yes, If you’re a first-time user, Temu offers $50 off with Coupon Code “taa85211} or {tad85211” Temu offers first-time users a $50 Coupon. Here are some Temu Coupons! The fact that new users can benefit from such generous Coupons is great. How do you redeem Temu $50 Coupon Code? Yes, To redeem the Temu $50 Coupon Code, follow these steps: 1.Sign Up: If you haven’t already, sign up for a Temu account on their website or app. 2.Add Items to Cart: Browse through the products you’d like to purchase. Add items worth $50 or more to your cart. 3.Apply Coupon Code: During checkout, enter the Coupon Code “taa85211} or {tad85211” in the designated field. This will unlock the $50 Coupon bundle. You can also use the Coupon Code “taa85211} or {tad85211” when signing up to receive the same benefit. 4.Enjoy Savings: The Coupon will be applied, and you’ll enjoy additional savings on your purchase. Plus, you can combine this with other available Coupons, such as the 50% off code for fashion, home, and beauty categories.
    • Temu Coupon Code $50 off [taa85211] or [tad85211] for New and Existing Users To get Temu $50 off Coupon Code [taa85211] or [tad85211] as a new user enter the Coupon during checkout when making your first purchase at Temu You will receive the benefit once the Coupon applied. TEMU App is a shopping platform that provides us with the best-branded items at Cheap prices. You will also notice that TEMU offers users to save extra by applying the TEMU Coupon Code during checkout. You can get $50 off Temu by using the Coupon Code “taa85211} or {tad85211} ”. Existing customers can use this code. Temu existing user Coupon Code: [taa85211} or {tad85211} Using Temu’s Coupon Code [taa85211} or {tad85211] will get you $50 off, access to exclusive deals, and benefits for additional savings. Save $50 off with Temu Coupon Codes. New and existing customer offers. What is Temu $50 Coupon Bundle? New Temu $50 Coupon bundle includes $50 worth of Temu Coupon Codes. The Temu $50 Coupon Code [taa85211} or {tad85211] can be used by new and existing Temu users to get a Coupon on their purchases. Temu $50 Coupon Bundle Code [taa85211} or {tad85211] Temu Coupon $50 off for existing customers There are a number of Coupons and deals shoppers can take advantage of with the Teemu Coupon Bundle [taa85211} or {tad85211]. Temu Coupon $50 off for existing customers"taa85211} or {tad85211" will save you $100 on your order. To get a Coupon, click on the item to purchase and enter the code. You can think of it as a supercharged savings pack for all your shopping needs Temu Coupon Code $50 off free shipping You will save $50 when you use Temu’s $50 OFF Coupon Code [taa85211} or {tad85211]. Enter the Coupon Code when purchasing an item How Does Temu $50 Coupon Work Temu’s $50 Coupon Code isn’t just one big Coupon you use all at once. Instead, think of it as a welcome package filled with different Coupons and offers worth $50. New customers are welcome. Temu Coupon Code $50 off Temu $40 OFF Coupon Code “taa85211} or {tad85211” will save you $50 on your order. To get a Coupon, click on the item to purchase and enter the code. Yes, Temu offers $50 off Coupon Code “taa85211} or {tad85211” for first time users. You can get a $50 bonus plus 30% off any purchase at Temu with the $40 Coupon Bundle at Temu if you sign up with the Coupon Code [taa85211} or {tad85211] and make a first purchase of $50 or more. How Do Apply Temu Coupon Code [taa85211} or {tad85211]? 1.Download the TEMU app and create a new account. 2.Fill in basic details to complete account verification. 3. Select the item you want to purchase and add it to your cart Minimum of $100. 4.Click on the Coupon Code option and enter the TEMU Coupon Code. 5.Once the Coupon has been applied, you will see the final Coupon. 6.P rice Select your payment method and complete your purchase. Temu Coupon Code $50 off first time user yes, If you’re a first-time user, Temu offers $50 off with Coupon Code “taa85211} or {tad85211” Temu offers first-time users a $50 Coupon. Here are some Temu Coupons! The fact that new users can benefit from such generous Coupons is great. How do you redeem Temu $50 Coupon Code? Yes, To redeem the Temu $50 Coupon Code, follow these steps: 1.Sign Up: If you haven’t already, sign up for a Temu account on their website or app. 2.Add Items to Cart: Browse through the products you’d like to purchase. Add items worth $50 or more to your cart. 3.Apply Coupon Code: During checkout, enter the Coupon Code “taa85211} or {tad85211” in the designated field. This will unlock the $50 Coupon bundle. You can also use the Coupon Code “taa85211} or {tad85211” when signing up to receive the same benefit. 4.Enjoy Savings: The Coupon will be applied, and you’ll enjoy additional savings on your purchase. Plus, you can combine this with other available Coupons, such as the 50% off code for fashion, home, and beauty categories.
    • Temu Coupon Code $50 off [taa85211] or [tad85211] for New and Existing Users To get Temu $50 off Coupon Code [taa85211] or [tad85211] as a new user enter the Coupon during checkout when making your first purchase at Temu You will receive the benefit once the Coupon applied. TEMU App is a shopping platform that provides us with the best-branded items at Cheap prices. You will also notice that TEMU offers users to save extra by applying the TEMU Coupon Code during checkout. You can get $50 off Temu by using the Coupon Code “taa85211} or {tad85211} ”. Existing customers can use this code. Temu existing user Coupon Code: [taa85211} or {tad85211} Using Temu’s Coupon Code [taa85211} or {tad85211] will get you $50 off, access to exclusive deals, and benefits for additional savings. Save $50 off with Temu Coupon Codes. New and existing customer offers. What is Temu $50 Coupon Bundle? New Temu $50 Coupon bundle includes $50 worth of Temu Coupon Codes. The Temu $50 Coupon Code [taa85211} or {tad85211] can be used by new and existing Temu users to get a Coupon on their purchases. Temu $50 Coupon Bundle Code [taa85211} or {tad85211] Temu Coupon $50 off for existing customers There are a number of Coupons and deals shoppers can take advantage of with the Teemu Coupon Bundle [taa85211} or {tad85211]. Temu Coupon $50 off for existing customers"taa85211} or {tad85211" will save you $100 on your order. To get a Coupon, click on the item to purchase and enter the code. You can think of it as a supercharged savings pack for all your shopping needs Temu Coupon Code $50 off free shipping You will save $50 when you use Temu’s $50 OFF Coupon Code [taa85211} or {tad85211]. Enter the Coupon Code when purchasing an item How Does Temu $50 Coupon Work Temu’s $50 Coupon Code isn’t just one big Coupon you use all at once. Instead, think of it as a welcome package filled with different Coupons and offers worth $50. New customers are welcome. Temu Coupon Code $50 off Temu $40 OFF Coupon Code “taa85211} or {tad85211” will save you $50 on your order. To get a Coupon, click on the item to purchase and enter the code. Yes, Temu offers $50 off Coupon Code “taa85211} or {tad85211” for first time users. You can get a $50 bonus plus 30% off any purchase at Temu with the $40 Coupon Bundle at Temu if you sign up with the Coupon Code [taa85211} or {tad85211] and make a first purchase of $50 or more. How Do Apply Temu Coupon Code [taa85211} or {tad85211]? 1.Download the TEMU app and create a new account. 2.Fill in basic details to complete account verification. 3. Select the item you want to purchase and add it to your cart Minimum of $100. 4.Click on the Coupon Code option and enter the TEMU Coupon Code. 5.Once the Coupon has been applied, you will see the final Coupon. 6.P rice Select your payment method and complete your purchase. Temu Coupon Code $50 off first time user yes, If you’re a first-time user, Temu offers $50 off with Coupon Code “taa85211} or {tad85211” Temu offers first-time users a $50 Coupon. Here are some Temu Coupons! The fact that new users can benefit from such generous Coupons is great. How do you redeem Temu $50 Coupon Code? Yes, To redeem the Temu $50 Coupon Code, follow these steps: 1.Sign Up: If you haven’t already, sign up for a Temu account on their website or app. 2.Add Items to Cart: Browse through the products you’d like to purchase. Add items worth $50 or more to your cart. 3.Apply Coupon Code: During checkout, enter the Coupon Code “taa85211} or {tad85211” in the designated field. This will unlock the $50 Coupon bundle. You can also use the Coupon Code “taa85211} or {tad85211” when signing up to receive the same benefit. 4.Enjoy Savings: The Coupon will be applied, and you’ll enjoy additional savings on your purchase. Plus, you can combine this with other available Coupons, such as the 50% off code for fashion, home, and beauty categories.
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.