Jump to content

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


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
    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
        fuse = dataWatcher->getWatchableObjectInt(id)    | id, same as above




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)
        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.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;
        blockRenderer.renderBlockBrightness(WarsBlocks.playerTNT.getDefaultState(), entity.getBrightness(partialTicks));

        if (entity.fuse / 5 % 2 == 0)
            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);


    protected ResourceLocation getEntityTexture(Entity entity)
        return TextureMap.locationBlocksTexture;

    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) {
	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) {
	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;

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
protected boolean canTriggerWalking() {
	return false;

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

 * Called to update the entity's position/logic.
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);


		if (!worldObj.isRemote) {


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

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.
protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) {
	par1NBTTagCompound.setByte("Fuse", (byte) fuse);

 * (abstract) Protected helper method to read subclass entity data from NBT.
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




in preInit to register your item models instead of using



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

This topic is now closed to further replies.


  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • What MC version? What's the IP? Are any mods needed to be able to join?
    • Thank you for your answer ! Unfortunatly i have the same problem when i use setPos() public static int movingfunction(CommandContext<CommandSourceStack> context){ CommandSourceStack source = context.getSource(); if (!(source.getEntity() instanceof ServerPlayer)) { return 0; } ServerPlayer player = (ServerPlayer ) source.getEntity(); double moveSpeed = 0.5; for (int i =0; i<10000;i++) { LOGGER.info("running for the {} time", i); double x = player.getX() + player.getViewVector(1.0f).x * moveSpeed; double y = player.getY(); double z = player.getZ() + player.getViewVector(1.0f).z * moveSpeed ; Vec3 movementVec = new Vec3(x, y, z); LOGGER.info("x ={} y ={} z ={}", x, y, z); player.setPos( movementVec); } return 1; } With the logs i can see that x and z are increasing but once again my player is not moving. is there a function to use to sync the server and the client ? I also tried to use LocalPlayer instead of ServerPlayer but my code would stop when i got the object. Also i will change a bit the main topic but is there a way to similate key press ? i found KeyBinding.setKeyBindState on others post but it look like there is no more KeyBinding in 1.20   I found this code : KeyMapping.click(Minecraft.getInstance().options.keyUp.getKey()); But it doesn't seems to work   And i found this one : Minecraft.getInstance().options.keyUp.setDown(true); wich works but doesn't exactly do what i want , it doesn't release the key so for exemple i can't make him run. Minecraft.getInstance().options.keyUp.setDown(true); Minecraft.getInstance().options.keyUp.setDown(false); Minecraft.getInstance().options.keyUp.setDown(true); doesn't make him run
    • Add crash-reports with sites like https://paste.ee/ Maybe an issue with blur, essentials or cumulus_menus
    • Add the crash-report or latest.log (logs-folder) with sites like https://paste.ee/ and paste the link to it here  
  • Topics

  • Create New...

Important Information

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