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

    • Sabemos lo importante que es obtener el máximo beneficio al comprar en línea, especialmente para los usuarios en EE. UU., Canadá, Medio Oriente y Europa. Es por eso que los códigos de cupón acp856709 y act200019 están diseñados para brindarte las mejores ofertas en la aplicación Temu. Estos códigos garantizan que aproveches al máximo tus compras con descuentos inigualables y ofertas especiales. Descubre los beneficios del código de descuento del 30% de Temu. Con estas increíbles promociones, tu experiencia de compra estará llena de ahorros increíbles y un valor inigualable. Sigue leyendo para saber cómo puedes aprovechar estas increíbles ofertas. Código de cupón Temu 30% de descuento para nuevos usuarios Si eres nuevo en Temu, ¡te espera una grata sorpresa! Usando nuestros códigos de descuento exclusivos en la aplicación Temu, los nuevos usuarios pueden disfrutar de beneficios extraordinarios. El código de descuento del 30% de Temu y los códigos de 30% de descuento para nuevos usuarios están aquí para brindarte ahorros excepcionales desde el principio. Aquí tienes cinco códigos imprescindibles para nuevos usuarios: acp856709: 30% de descuento para nuevos usuarios act200019: Paquete de descuento del 30% para nuevos clientes acu934948: Paquete de descuento de hasta el 30% para usos múltiples acu935411: Envío gratuito a 68 países acl921207: 30% de descuento adicional en cualquier compra para usuarios primerizos Usar estos códigos garantiza que tu primera experiencia de compra en Temu sea tanto económica como placentera. Cómo obtener el código de descuento del 30% de Temu para nuevos clientes: Obtener el código de descuento del 30% de Temu es sencillo, especialmente para los nuevos usuarios. Sigue estos simples pasos para desbloquear tus ahorros: Descarga e instala la aplicación Temu desde tu tienda de aplicaciones preferida. Crea una nueva cuenta o inicia sesión si ya tienes una cuenta. Explora los productos y añade tus artículos deseados al carrito. Ve a la página de pago e introduce el código de descuento del 30% de Temu para nuevos usuarios de la lista proporcionada. Completa tu compra y disfruta de tu descuento significativo. Con estos sencillos pasos, tu primera experiencia de compra será más asequible y placentera. Código de cupón Temu 30% de descuento para usuarios existentes Los clientes existentes también pueden disfrutar de fantásticas ventajas utilizando nuestros códigos de descuento exclusivos en la aplicación Temu. El código de descuento del 30% de Temu y el código de descuento para clientes existentes están especialmente diseñados para proporcionar ahorros continuos. Aquí tienes cinco valiosos códigos para usuarios existentes: acp856709: 30% de descuento adicional para usuarios existentes de Temu act200019: Paquete de descuento del 30% para compras múltiples acu934948: Regalo gratuito con envío exprés por todo EE. UU./Canadá acu935411: 30% de descuento adicional sobre el descuento existente acl921207: Envío gratuito a 68 países Estos códigos garantizan que tu experiencia de compra siga siendo económica, incluso como cliente recurrente. Cómo encontrar el código de descuento del 30% de Temu: Encontrar el código de descuento del 30% de Temu para el primer pedido y los últimos cupones de Temu es más fácil que nunca. Regístrate en el boletín de Temu para recibir cupones verificados y probados directamente en tu correo electrónico. Visita regularmente las páginas de redes sociales de Temu para obtener las últimas actualizaciones sobre cupones y promociones. Consulta sitios de cupones confiables para encontrar los últimos códigos de descuento de Temu que funcionen. Al mantenerte conectado e informado, siempre podrás aprovechar las mejores ofertas que Temu tiene para ofrecer
    • Sabemos lo importante que es obtener el máximo beneficio al comprar en línea, especialmente para los usuarios en EE. UU., Canadá, Medio Oriente y Europa. Es por eso que los códigos de cupón acp856709 y act200019 están diseñados para brindarte las mejores ofertas en la aplicación Temu. Estos códigos garantizan que aproveches al máximo tus compras con descuentos inigualables y ofertas especiales. Descubre los beneficios del código de descuento del 30% de Temu. Con estas increíbles promociones, tu experiencia de compra estará llena de ahorros increíbles y un valor inigualable. Sigue leyendo para saber cómo puedes aprovechar estas increíbles ofertas. Código de cupón Temu 30% de descuento para nuevos usuarios Si eres nuevo en Temu, ¡te espera una grata sorpresa! Usando nuestros códigos de descuento exclusivos en la aplicación Temu, los nuevos usuarios pueden disfrutar de beneficios extraordinarios. El código de descuento del 30% de Temu y los códigos de 30% de descuento para nuevos usuarios están aquí para brindarte ahorros excepcionales desde el principio. Aquí tienes cinco códigos imprescindibles para nuevos usuarios: acp856709: 30% de descuento para nuevos usuarios act200019: Paquete de descuento del 30% para nuevos clientes acu934948: Paquete de descuento de hasta el 30% para usos múltiples acu935411: Envío gratuito a 68 países acl921207: 30% de descuento adicional en cualquier compra para usuarios primerizos Usar estos códigos garantiza que tu primera experiencia de compra en Temu sea tanto económica como placentera. Cómo obtener el código de descuento del 30% de Temu para nuevos clientes: Obtener el código de descuento del 30% de Temu es sencillo, especialmente para los nuevos usuarios. Sigue estos simples pasos para desbloquear tus ahorros: Descarga e instala la aplicación Temu desde tu tienda de aplicaciones preferida. Crea una nueva cuenta o inicia sesión si ya tienes una cuenta. Explora los productos y añade tus artículos deseados al carrito. Ve a la página de pago e introduce el código de descuento del 30% de Temu para nuevos usuarios de la lista proporcionada. Completa tu compra y disfruta de tu descuento significativo. Con estos sencillos pasos, tu primera experiencia de compra será más asequible y placentera. Código de cupón Temu 30% de descuento para usuarios existentes Los clientes existentes también pueden disfrutar de fantásticas ventajas utilizando nuestros códigos de descuento exclusivos en la aplicación Temu. El código de descuento del 30% de Temu y el código de descuento para clientes existentes están especialmente diseñados para proporcionar ahorros continuos. Aquí tienes cinco valiosos códigos para usuarios existentes: acp856709: 30% de descuento adicional para usuarios existentes de Temu act200019: Paquete de descuento del 30% para compras múltiples acu934948: Regalo gratuito con envío exprés por todo EE. UU./Canadá acu935411: 30% de descuento adicional sobre el descuento existente acl921207: Envío gratuito a 68 países Estos códigos garantizan que tu experiencia de compra siga siendo económica, incluso como cliente recurrente. Cómo encontrar el código de descuento del 30% de Temu: Encontrar el código de descuento del 30% de Temu para el primer pedido y los últimos cupones de Temu es más fácil que nunca. Regístrate en el boletín de Temu para recibir cupones verificados y probados directamente en tu correo electrónico. Visita regularmente las páginas de redes sociales de Temu para obtener las últimas actualizaciones sobre cupones y promociones. Consulta sitios de cupones confiables para encontrar los últimos códigos de descuento de Temu que funcionen. Al mantenerte conectado e informado, siempre podrás aprovechar las mejores ofertas que Temu tiene para ofrecer
    • Sabemos lo importante que es obtener el máximo beneficio al comprar en línea, especialmente para los usuarios en EE. UU., Canadá, Medio Oriente y Europa. Es por eso que los códigos de cupón acp856709 y act200019 están diseñados para brindarte las mejores ofertas en la aplicación Temu. Estos códigos garantizan que aproveches al máximo tus compras con descuentos inigualables y ofertas especiales. Descubre los beneficios del código de descuento del 30% de Temu. Con estas increíbles promociones, tu experiencia de compra estará llena de ahorros increíbles y un valor inigualable. Sigue leyendo para saber cómo puedes aprovechar estas increíbles ofertas. Código de cupón Temu 30% de descuento para nuevos usuarios Si eres nuevo en Temu, ¡te espera una grata sorpresa! Usando nuestros códigos de descuento exclusivos en la aplicación Temu, los nuevos usuarios pueden disfrutar de beneficios extraordinarios. El código de descuento del 30% de Temu y los códigos de 30% de descuento para nuevos usuarios están aquí para brindarte ahorros excepcionales desde el principio. Aquí tienes cinco códigos imprescindibles para nuevos usuarios: acp856709: 30% de descuento para nuevos usuarios act200019: Paquete de descuento del 30% para nuevos clientes acu934948: Paquete de descuento de hasta el 30% para usos múltiples acu935411: Envío gratuito a 68 países acl921207: 30% de descuento adicional en cualquier compra para usuarios primerizos Usar estos códigos garantiza que tu primera experiencia de compra en Temu sea tanto económica como placentera. Cómo obtener el código de descuento del 30% de Temu para nuevos clientes: Obtener el código de descuento del 30% de Temu es sencillo, especialmente para los nuevos usuarios. Sigue estos simples pasos para desbloquear tus ahorros: Descarga e instala la aplicación Temu desde tu tienda de aplicaciones preferida. Crea una nueva cuenta o inicia sesión si ya tienes una cuenta. Explora los productos y añade tus artículos deseados al carrito. Ve a la página de pago e introduce el código de descuento del 30% de Temu para nuevos usuarios de la lista proporcionada. Completa tu compra y disfruta de tu descuento significativo. Con estos sencillos pasos, tu primera experiencia de compra será más asequible y placentera. Código de cupón Temu 30% de descuento para usuarios existentes Los clientes existentes también pueden disfrutar de fantásticas ventajas utilizando nuestros códigos de descuento exclusivos en la aplicación Temu. El código de descuento del 30% de Temu y el código de descuento para clientes existentes están especialmente diseñados para proporcionar ahorros continuos. Aquí tienes cinco valiosos códigos para usuarios existentes: acp856709: 30% de descuento adicional para usuarios existentes de Temu act200019: Paquete de descuento del 30% para compras múltiples acu934948: Regalo gratuito con envío exprés por todo EE. UU./Canadá acu935411: 30% de descuento adicional sobre el descuento existente acl921207: Envío gratuito a 68 países Estos códigos garantizan que tu experiencia de compra siga siendo económica, incluso como cliente recurrente. Cómo encontrar el código de descuento del 30% de Temu: Encontrar el código de descuento del 30% de Temu para el primer pedido y los últimos cupones de Temu es más fácil que nunca. Regístrate en el boletín de Temu para recibir cupones verificados y probados directamente en tu correo electrónico. Visita regularmente las páginas de redes sociales de Temu para obtener las últimas actualizaciones sobre cupones y promociones. Consulta sitios de cupones confiables para encontrar los últimos códigos de descuento de Temu que funcionen. Al mantenerte conectado e informado, siempre podrás aprovechar las mejores ofertas que Temu tiene para ofrecer
    • Մենք գիտենք, թե որքան կարևոր է առցանց գնումներ կատարելիս ստանալ առավելագույն առավելություններ, հատկապես ԱՄՆ-ում, Կանադայում, Մերձավոր Արևելքում և Եվրոպայում գտնվող օգտվողների համար։ Այդ պատճառով acp856709 և act200019 զեղչի կոդերը նախատեսված են Temu հավելվածում ձեզ լավագույն գործարքներ տրամադրելու համար։ Այս կոդերը ապահովում են, որ դուք ստանում եք ձեր գնումից առավելագույնը՝ անգերազանցելի զեղչերով և հատուկ առաջարկներով: Բացահայտեք Temu-ի 30% զեղչի կոդի առավելությունները։ Այս զարմանահրաշ խթանումներով ձեր գնումների փորձը կհամալրվի անհավանական խնայողություններով և անզուգական արժեքով։ Շարունակեք կարդալ՝ իմանալու համար, թե ինչպես կարող եք օգտվել այս հիանալի առաջարկներից։ Temu զեղչի կոդ 30% զեղչ նոր օգտատերերի համար Եթե դուք նոր եք Temu-ում, ուրեմն ձեզ հաճելի անակնկալ է սպասվում։ Օգտագործելով մեր բացառիկ զեղչի կոդերը Temu հավելվածում, նոր օգտվողները կարող են վայելել արտառոց առավելություններ։ Temu-ի զեղչի կոդը՝ 30% զեղչ, և Temu 30% զեղչ նոր օգտատերերի համար նախատեսված կոդերը, այստեղ են՝ ձեր խնայողությունները բացառիկ դարձնելու համար: Ահա նոր օգտատերերի համար նախատեսված հինգ կարևոր կոդեր. acp856709: 30% զեղչ նոր օգտվողների համար act200019: 30% զեղչային փաթեթ նոր հաճախորդների համար acu934948: Մինչև 30% զեղչային փաթեթ բազմակի օգտագործման համար acu935411: Անվճար առաքում 68 երկրներ acl921207: Լրացուցիչ 30% զեղչ ցանկացած գնումի համար առաջին անգամ օգտվողների համար Այս կոդերը օգտագործելով՝ ապահովում եք, որ ձեր առաջին գնումների փորձը Temu-ում լինի թե՛ տնտեսող, թե՛ հաճելի։ Ինչպես ստանալ Temu-ի 30% զեղչի կոդը նոր հաճախորդների համար: Temu-ի 30% զեղչի կոդը ստանալը պարզ է, հատկապես նոր օգտվողների համար։ Հետևեք այս հեշտ քայլերին՝ բացելու ձեր խնայողությունները. Ներբեռնեք և տեղադրեք Temu հավելվածը ձեր նախընտրած հավելվածների խանութից։ Ստեղծեք նոր հաշիվ կամ մուտք գործեք, եթե արդեն ունեք հաշիվ։ Զննեք ապրանքները և ավելացրեք ձեր ցանկալի ապրանքները զամբյուղում։ Շարունակեք վճարման էջ և մուտքագրեք Temu-ի 30% զեղչի կոդը նոր օգտվողների համար՝ տրամադրված ցուցակից: Ավարտեք ձեր գնումը և վայելեք ձեր զգալի զեղչը։ Այս պարզ քայլերով ձեր առաջին գնումների փորձը կլինի ավելի հասանելի և հաճելի։ Temu զեղչի կոդ 30% զեղչ գոյություն ունեցող օգտատերերի համար Գոյություն ունեցող հաճախորդները նույնպես կարող են վայելել հիանալի առավելություններ՝ օգտագործելով մեր բացառիկ զեղչի կոդերը Temu հավելվածում։ Temu-ի 30% զեղչի կոդը և Temu-ի զեղչի կոդը գոյություն ունեցող հաճախորդների համար հատուկ ստեղծված են շարունակական խնայողություններ տրամադրելու համար։ Ահա հինգ արժեքավոր կոդ գոյություն ունեցող օգտատերերի համար. acp856709: 30% լրացուցիչ զեղչ գոյություն ունեցող Temu օգտվողների համար act200019: 30% զեղչային փաթեթ բազմակի գնումների համար acu934948: Անվճար նվեր՝ ԱՄՆ/Կանադա ողջ տարածքով արագ առաքմամբ acu935411: Լրացուցիչ 30% զեղչ գոյություն ունեցող զեղչից ավել acl921207: Անվճար առաքում 68 երկրներ Այս կոդերը ապահովում են, որ ձեր գնումների փորձը մնա մատչելի, նույնիսկ վերադառնալով հաճախորդներին։ Ինչպես գտնել Temu-ի 30% զեղչի կոդը: Temu-ի 30% զեղչի կոդն առաջին պատվերի համար և վերջին Temu-ի կտրոնները գտնելը ավելի հեշտ է, քան երբևէ։ Գրանցվեք Temu-ի տեղեկագրում՝ ստանալու համար ստուգված և փորձարկված կտրոնները անմիջապես ձեր էլեկտրոնային հասցեում։ Պարբերաբար այցելեք Temu-ի սոցիալական լրատվամիջոցների էջերը՝ կտրոնների և ակցիաների մասին վերջին թարմացումները ստանալու համար։ Ստուգեք վստահելի կտրոնային կայքերը՝ գտնելու վերջին և գործող Temu-ի զեղչի կոդերը։ Շփվելով և տեղեկացված լինելով՝ դուք միշտ կարող եք օգտվել Temu-ի առաջարկած լավագույն գործարքներից  
    • Մենք գիտենք, թե որքան կարևոր է առցանց գնումներ կատարելիս ստանալ առավելագույն առավելություններ, հատկապես ԱՄՆ-ում, Կանադայում, Մերձավոր Արևելքում և Եվրոպայում գտնվող օգտվողների համար։ Այդ պատճառով acp856709 և act200019 զեղչի կոդերը նախատեսված են Temu հավելվածում ձեզ լավագույն գործարքներ տրամադրելու համար։ Այս կոդերը ապահովում են, որ դուք ստանում եք ձեր գնումից առավելագույնը՝ անգերազանցելի զեղչերով և հատուկ առաջարկներով: Բացահայտեք Temu-ի 30% զեղչի կոդի առավելությունները։ Այս զարմանահրաշ խթանումներով ձեր գնումների փորձը կհամալրվի անհավանական խնայողություններով և անզուգական արժեքով։ Շարունակեք կարդալ՝ իմանալու համար, թե ինչպես կարող եք օգտվել այս հիանալի առաջարկներից։ Temu զեղչի կոդ 30% զեղչ նոր օգտատերերի համար Եթե դուք նոր եք Temu-ում, ուրեմն ձեզ հաճելի անակնկալ է սպասվում։ Օգտագործելով մեր բացառիկ զեղչի կոդերը Temu հավելվածում, նոր օգտվողները կարող են վայելել արտառոց առավելություններ։ Temu-ի զեղչի կոդը՝ 30% զեղչ, և Temu 30% զեղչ նոր օգտատերերի համար նախատեսված կոդերը, այստեղ են՝ ձեր խնայողությունները բացառիկ դարձնելու համար: Ահա նոր օգտատերերի համար նախատեսված հինգ կարևոր կոդեր. acp856709: 30% զեղչ նոր օգտվողների համար act200019: 30% զեղչային փաթեթ նոր հաճախորդների համար acu934948: Մինչև 30% զեղչային փաթեթ բազմակի օգտագործման համար acu935411: Անվճար առաքում 68 երկրներ acl921207: Լրացուցիչ 30% զեղչ ցանկացած գնումի համար առաջին անգամ օգտվողների համար Այս կոդերը օգտագործելով՝ ապահովում եք, որ ձեր առաջին գնումների փորձը Temu-ում լինի թե՛ տնտեսող, թե՛ հաճելի։ Ինչպես ստանալ Temu-ի 30% զեղչի կոդը նոր հաճախորդների համար: Temu-ի 30% զեղչի կոդը ստանալը պարզ է, հատկապես նոր օգտվողների համար։ Հետևեք այս հեշտ քայլերին՝ բացելու ձեր խնայողությունները. Ներբեռնեք և տեղադրեք Temu հավելվածը ձեր նախընտրած հավելվածների խանութից։ Ստեղծեք նոր հաշիվ կամ մուտք գործեք, եթե արդեն ունեք հաշիվ։ Զննեք ապրանքները և ավելացրեք ձեր ցանկալի ապրանքները զամբյուղում։ Շարունակեք վճարման էջ և մուտքագրեք Temu-ի 30% զեղչի կոդը նոր օգտվողների համար՝ տրամադրված ցուցակից: Ավարտեք ձեր գնումը և վայելեք ձեր զգալի զեղչը։ Այս պարզ քայլերով ձեր առաջին գնումների փորձը կլինի ավելի հասանելի և հաճելի։ Temu զեղչի կոդ 30% զեղչ գոյություն ունեցող օգտատերերի համար Գոյություն ունեցող հաճախորդները նույնպես կարող են վայելել հիանալի առավելություններ՝ օգտագործելով մեր բացառիկ զեղչի կոդերը Temu հավելվածում։ Temu-ի 30% զեղչի կոդը և Temu-ի զեղչի կոդը գոյություն ունեցող հաճախորդների համար հատուկ ստեղծված են շարունակական խնայողություններ տրամադրելու համար։ Ահա հինգ արժեքավոր կոդ գոյություն ունեցող օգտատերերի համար. acp856709: 30% լրացուցիչ զեղչ գոյություն ունեցող Temu օգտվողների համար act200019: 30% զեղչային փաթեթ բազմակի գնումների համար acu934948: Անվճար նվեր՝ ԱՄՆ/Կանադա ողջ տարածքով արագ առաքմամբ acu935411: Լրացուցիչ 30% զեղչ գոյություն ունեցող զեղչից ավել acl921207: Անվճար առաքում 68 երկրներ Այս կոդերը ապահովում են, որ ձեր գնումների փորձը մնա մատչելի, նույնիսկ վերադառնալով հաճախորդներին։ Ինչպես գտնել Temu-ի 30% զեղչի կոդը: Temu-ի 30% զեղչի կոդն առաջին պատվերի համար և վերջին Temu-ի կտրոնները գտնելը ավելի հեշտ է, քան երբևէ։ Գրանցվեք Temu-ի տեղեկագրում՝ ստանալու համար ստուգված և փորձարկված կտրոնները անմիջապես ձեր էլեկտրոնային հասցեում։ Պարբերաբար այցելեք Temu-ի սոցիալական լրատվամիջոցների էջերը՝ կտրոնների և ակցիաների մասին վերջին թարմացումները ստանալու համար։ Ստուգեք վստահելի կտրոնային կայքերը՝ գտնելու վերջին և գործող Temu-ի զեղչի կոդերը։ Շփվելով և տեղեկացված լինելով՝ դուք միշտ կարող եք օգտվել Temu-ի առաջարկած լավագույն գործարքներից  
  • Topics

×
×
  • Create New...

Important Information

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