Jump to content

[SOLVED][1.8.9]Custom TNT Entity is a white cube


The_Fireplace

Recommended Posts

I have searched the forums for this issue, and after looking at about 10 different threads, I have only found a single answer that (should have) helped me with this issue:

 

 

I suspect that your fuse counter (variable within your entity class) does only change within the serverside scope, which means the fuse won't be visible to the client and thus rendering your entity white all the time.

You need to sync the fuse with the client and the easiest way to do this is to use a DataWatcher.

Define a new DataWatcherObject (with this.dataWatcher.addObject(...)) within entityInit

on the server side (if worldObj.isRemote == false) set the object's value to the fuse variable in your onUpdate method after it gets updated with dataWatcher.updateObject(...)

on the client side (if worldObj.isRemote == true)  set the value of the fuse variable to the dataWatcherObject's value with getWatchableObjectInt(...)

 

If you don't understand what I mean, here have some pseudocode:

Entity Class
----------
entityInit():
    dataWatcher->addObject(id, Integer.valueOf(0))    | id must be unique! If you get a crash because an already given ID, try another one
                                                      | second param must be casted to the datatype you wanna put in there, here Integer (BTW, the cast is not pseudocode)

onUpdate(): (at the end within the method)
    if world is not remote:
        dataWatcher->updateObject(id, fuse)    | id must be the same as the above defined one
    else:
        fuse = dataWatcher->getWatchableObjectInt(id)    | id, same as above

http://www.minecraftforge.net/forum/index.php/topic,16627.msg84436.html#msg84436

 

 

After following these instructions, my entity is still a white cube. Here is my code:

 

 

Render class:

package the_fireplace.wars.client.render;

import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BlockRendererDispatcher;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
import the_fireplace.wars.entities.EntityPTNTPrimed;
import the_fireplace.wars.init.WarsBlocks;

/**
* @author The_Fireplace
*/
public class RenderPTNTPrimed extends Render {
    public RenderPTNTPrimed(RenderManager rm)
    {
        super(rm);
        this.shadowSize = 0.5F;
    }

    public void doRender(EntityPTNTPrimed entity, double x, double y, double z, float p_76986_8_, float partialTicks)
    {
        BlockRendererDispatcher blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
        GL11.glPushMatrix();
        GL11.glTranslatef((float)x, (float)y, (float)z);
        float f2;

        if ((float)entity.fuse - partialTicks + 1.0F < 10.0F)
        {
            f2 = 1.0F - ((float)entity.fuse - partialTicks + 1.0F) / 10.0F;

            if (f2 < 0.0F)
            {
                f2 = 0.0F;
            }

            if (f2 > 1.0F)
            {
                f2 = 1.0F;
            }

            f2 *= f2;
            f2 *= f2;
            float f3 = 1.0F + f2 * 0.3F;
            GL11.glScalef(f3, f3, f3);
        }

        f2 = (1.0F - ((float)entity.fuse - partialTicks + 1.0F) / 100.0F) * 0.8F;
        this.bindEntityTexture(entity);
        blockRenderer.renderBlockBrightness(WarsBlocks.playerTNT.getDefaultState(), entity.getBrightness(partialTicks));

        if (entity.fuse / 5 % 2 == 0)
        {
            GL11.glDisable(GL11.GL_TEXTURE_2D);
            GL11.glDisable(GL11.GL_LIGHTING);
            GL11.glEnable(GL11.GL_BLEND);
            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_DST_ALPHA);
            GL11.glColor4f(1.0F, 1.0F, 1.0F, f2);
            blockRenderer.renderBlockBrightness(WarsBlocks.playerTNT.getDefaultState(), 1.0F);
            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
            GL11.glDisable(GL11.GL_BLEND);
            GL11.glEnable(GL11.GL_LIGHTING);
            GL11.glEnable(GL11.GL_TEXTURE_2D);
        }

        GL11.glPopMatrix();
    }

    @Override
    protected ResourceLocation getEntityTexture(Entity entity)
    {
        return TextureMap.locationBlocksTexture;
    }

    @Override
    public void doRender(Entity entity, double x, double y, double z, float p_76986_8_, float partialTicks)
    {
        this.doRender((EntityPTNTPrimed) entity, x, y, z, p_76986_8_, partialTicks);
    }
}

Entity class:

package the_fireplace.wars.entities;

import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.world.World;

import java.util.List;

public class EntityPTNTPrimed extends Entity {
/** How long the fuse is */
public int fuse;

public EntityPTNTPrimed(World par1World) {
	super(par1World);
	fuse = 50;
	preventEntitySpawning = true;
	setSize(0.98F, 0.98F);
	posY = height / 2.0F;
}

public EntityPTNTPrimed(World par1World, double par2, double par4, double par6, EntityLivingBase placer) {
	this(par1World);
	setPosition(par2, par4, par6);
	float var8 = (float) (Math.random() * Math.PI * 2.0D);
	motionX = -((float) Math.sin(var8)) * 0.02F;
	motionY = 0.20000000298023224D;
	motionZ = -((float) Math.cos(var8)) * 0.02F;
	fuse = 50;
	prevPosX = par2;
	prevPosY = par4;
	prevPosZ = par6;
}

@Override
protected void entityInit() {
	this.dataWatcher.addObject(31, new Integer(fuse));
}

/**
 * returns if this entity triggers Block.onEntityWalking on the blocks they
 * walk on. used for spiders and wolves to prevent them from trampling crops
 */
@Override
protected boolean canTriggerWalking() {
	return false;
}

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

/**
 * Called to update the entity's position/logic.
 */
@Override
public void onUpdate() {
	dataWatcher.updateObject(31, Integer.valueOf(fuse));
	fuse = dataWatcher.getWatchableObjectInt(31);
	prevPosX = posX;
	prevPosY = posY;
	prevPosZ = posZ;
	motionY -= 0.03999999910593033D;
	moveEntity(motionX, motionY, motionZ);
	motionX *= 0.9800000190734863D;
	motionY *= 0.9800000190734863D;
	motionZ *= 0.9800000190734863D;

	if (onGround) {
		motionX *= 0.699999988079071D;
		motionZ *= 0.699999988079071D;
		motionY *= -0.5D;
	}

	if (fuse-- <= 0) {
		worldObj.spawnParticle(EnumParticleTypes.EXPLOSION_HUGE, posX, posY, posZ, 1.0D, 0.0D, 0.0D);
		worldObj.playSoundEffect(posX, posY, posZ, "random.explode", 4.0F, (1.0F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2F) * 0.7F);

		setDead();

		if (!worldObj.isRemote) {

			explode();

		}
	} else {
		worldObj.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, posX, posY + 0.5D, posZ, 0.0D, 0.0D, 0.0D);
	}
}

@SuppressWarnings("unchecked")
private void explode() {

	List<EntityLiving> nearbyEntities = worldObj.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.fromBounds(posX - 5, posY - 5, posZ - 5, posX + 5, posY + 5, posZ + 5));
	for (EntityLiving living : nearbyEntities) {
		living.attackEntityFrom(DamageSource.setExplosionSource(null), 10);
	}

}

/**
 * (abstract) Protected helper method to write subclass entity data to NBT.
 */
@Override
protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) {
	par1NBTTagCompound.setByte("Fuse", (byte) fuse);
}

/**
 * (abstract) Protected helper method to read subclass entity data from NBT.
 */
@Override
protected void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) {
	fuse = par1NBTTagCompound.getByte("Fuse");
}
}

 

 

If any more code is needed, here is my source code.

If I helped please press the Thank You button.

 

Check out my mods at http://www.curse.com/users/The_Fireplace/projects

Link to comment
Share on other sites

RenderingRegistry#registerEntityRenderingHandler(Class<T>, IRenderFactory<? super T>)

must be called in preInit.

 

You should also use

ModelLoader.setCustomModelResourceLocation

or

ModelLoader.setCustomMeshDefinition

in preInit to register your item models instead of using

ItemModelMesher#register

.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.

Announcements



×
×
  • Create New...

Important Information

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