Jump to content
  • Home
  • Files
  • Docs
Topics
  • All Content

  • This Topic
  • This Forum

  • Advanced Search
  • Existing user? Sign In  

    Sign In



    • Not recommended on shared computers


    • Forgot your password?

  • Sign Up
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • [SOLVED][1.8.9]Custom TNT Entity is a white cube
Currently Supported: 1.16.X (Latest) and 1.15.X (LTS)
Sign in to follow this  
Followers 1
The_Fireplace

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

By The_Fireplace, August 9, 2016 in Modder Support

  • Start new topic

Recommended Posts

The_Fireplace    11

The_Fireplace

The_Fireplace    11

  • Creeper Killer
  • The_Fireplace
  • Forge Modder
  • 11
  • 241 posts
Posted August 9, 2016

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

Share this post


Link to post
Share on other sites

Choonster    1651

Choonster

Choonster    1651

  • Reality Controller
  • Choonster
  • Forge Modder
  • 1651
  • 5099 posts
Posted August 9, 2016

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.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 1
Go To Topic Listing



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Jack Richard
      [1.15.2] Minecraft Registry Problem When Loading from Jar

      By Jack Richard · Posted 1 hour ago

      Thanks so much for your help! I removed the log4j dependency, I honesty don't remember when I put that there. Once I fixed the jar.finalizedBy line, everything worked! (One small issue where I was relocating all of "com.google" when I just should've relocated "com.google.common," too)   Thanks again!
    • Teedledee
      1.16.4 Failed to synchronize registry data with server LAN

      By Teedledee · Posted 1 hour ago

      Fixed the issue, one config didnt match, downloaded randompatches to solve badly compressed packet afterwards.
    • DaemonUmbra
      [1.15.2] Minecraft Registry Problem When Loading from Jar

      By DaemonUmbra · Posted 1 hour ago

      First of all, why are you shadowing log4j? Minecraft already provides log4j2. Second if build is running shadowjar instead of jar then you might need to tweak the line where it says jar.finalizedBy('reobfJar') to finalize shadowJar instead
    • DaemonUmbra
      "The game crashed whilst rendering overlay"

      By DaemonUmbra · Posted 1 hour ago

      What do you think you should do about this?
    • DaemonUmbra
      IntelliJ doesn't include resources folder while debugging

      By DaemonUmbra · Posted 1 hour ago

      What version of Minecraft are you using?
  • Topics

    • Jack Richard
      2
      [1.15.2] Minecraft Registry Problem When Loading from Jar

      By Jack Richard
      Started 2 hours ago

    • Teedledee
      2
      1.16.4 Failed to synchronize registry data with server LAN

      By Teedledee
      Started January 18

    • GuyWithTVHead
      1
      "The game crashed whilst rendering overlay"

      By GuyWithTVHead
      Started 1 hour ago

    • GermanBucket
      2
      IntelliJ doesn't include resources folder while debugging

      By GermanBucket
      Started 3 hours ago

    • Arthurmeade12
      8
      Error Conecting to My Minecraft Server

      By Arthurmeade12
      Started Saturday at 11:05 PM

  • Who's Online (See full list)

    • forgotendeath09
    • Inforno
    • brunoxd2
    • ChampionAsh5357
    • pupymk1
    • StealthyNoodle
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • [SOLVED][1.8.9]Custom TNT Entity is a white cube
  • Theme

Copyright © 2019 ForgeDevelopment LLC · Ads by Longitude Ads LLC Powered by Invision Community