Commenting out the line
EntityRegistry.registerModEntity(EntityODP.class, "ODP", 0, T1A.instance, 10, 10, true);
prevents my game from crashing, All my other code works or is copied from vanilla code.
EntityRegistry.registerGlobalEntityID(EntityODP.class, "ODP", EntityRegistry.findGlobalUniqueEntityId());
does not cause a crash. I put it above registerModEntity
Crash occurs when the entity is spawned, as I would expect.
If i comment out registerModEntity (and registerGlobalEntityID) then my entity spawns normally according to
EntityODP var6 = new EntityODP(par1World, (double)((float)par2 + 0.5F), (double)((float)par3 + 0.5F), (double)((float)par4 + 0.5F));
par1World.spawnEntityInWorld(var6);
I know it spawns because I have it drop sulphur every second; normally when the entity spawns it plays a sound immediately after , but it doesn't when crashing.
2012-09-11 21:06:49 [iNFO] [sTDOUT] Skipping Entity with id ODP
2012-09-11 21:06:53 [sEVERE] [ForgeModLoader] A severe problem occurred during the spawning of an entity
2012-09-11 21:06:54 [iNFO] [sTDERR] java.lang.RuntimeException: java.lang.NoSuchMethodException: t1a.common.EntityODP.<init>(net.minecraft.src.World)
2012-09-11 21:06:54 [iNFO] [sTDERR] at com.google.common.base.Throwables.propagate(Throwables.java:160)
2012-09-11 21:06:54 [iNFO] [sTDERR] at cpw.mods.fml.client.FMLClientHandler.spawnEntityIntoClientWorld(FMLClientHandler.java:368)
2012-09-11 21:06:54 [iNFO] [sTDERR] at cpw.mods.fml.common.FMLCommonHandler.spawnEntityIntoClientWorld(FMLCommonHandler.java:331)
2012-09-11 21:06:54 [iNFO] [sTDERR] at cpw.mods.fml.common.network.EntitySpawnPacket.execute(EntitySpawnPacket.java:186)
2012-09-11 21:06:54 [iNFO] [sTDERR] at cpw.mods.fml.common.network.FMLNetworkHandler.handleFMLPacket(FMLNetworkHandler.java:89)
2012-09-11 21:06:54 [iNFO] [sTDERR] at cpw.mods.fml.common.network.FMLNetworkHandler.handlePacket250Packet(FMLNetworkHandler.java:59)
2012-09-11 21:06:54 [iNFO] [sTDERR] at net.minecraft.src.NetClientHandler.handleCustomPayload(NetClientHandler.java:1287)
2012-09-11 21:06:54 [iNFO] [sTDERR] at net.minecraft.src.Packet250CustomPayload.processPacket(Packet250CustomPayload.java:70)
2012-09-11 21:06:54 [iNFO] [sTDERR] at net.minecraft.src.MemoryConnection.processReadPackets(MemoryConnection.java:72)
2012-09-11 21:06:54 [iNFO] [sTDERR] at net.minecraft.src.NetClientHandler.processReadPackets(NetClientHandler.java:98)
2012-09-11 21:06:54 [iNFO] [sTDERR] at net.minecraft.src.WorldClient.tick(WorldClient.java:64)
2012-09-11 21:06:54 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.runTick(Minecraft.java:1774)
2012-09-11 21:06:54 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:831)
2012-09-11 21:06:54 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.run(Minecraft.java:761)
2012-09-11 21:06:54 [iNFO] [sTDERR] at java.lang.Thread.run(Thread.java:722)
2012-09-11 21:06:54 [iNFO] [sTDERR] Caused by: java.lang.NoSuchMethodException: t1a.common.EntityODP.<init>(net.minecraft.src.World)
2012-09-11 21:06:54 [iNFO] [sTDERR] at java.lang.Class.getConstructor0(Class.java:2721)
2012-09-11 21:06:54 [iNFO] [sTDERR] at java.lang.Class.getConstructor(Class.java:1674)
2012-09-11 21:06:54 [iNFO] [sTDERR] at cpw.mods.fml.client.FMLClientHandler.spawnEntityIntoClientWorld(FMLClientHandler.java:318)
2012-09-11 21:06:54 [iNFO] [sTDERR] ... 13 more
2012-09-11 21:07:04 [iNFO] [sTDOUT] Stopping!
ClientProxy.java
package t1a.client;
import cpw.mods.fml.client.registry.RenderingRegistry;
import t1a.common.CommonProxy;
import t1a.common.EntityODP;
import net.minecraftforge.client.MinecraftForgeClient;
public class ClientProxy extends CommonProxy
{
@Override
public void initRenders()
{
MinecraftForgeClient.preloadTexture("/t1a/t1a.png");
RenderingRegistry.registerEntityRenderingHandler(EntityODP.class, new RenderODP());
}
}
RenderODP.java (copy of RenderTNTPrimed)
package t1a.client;
import net.minecraft.src.*;
import t1a.common.EntityODP;
import org.lwjgl.opengl.GL11;
public class RenderODP extends Render
{
private RenderBlocks blockRenderer = new RenderBlocks();
public RenderODP()
{
this.shadowSize = 0.5F;
}
public void func_76992_a(EntityODP par1EntityODP, double par2, double par4, double par6, float par8, float par9)
{
GL11.glPushMatrix();
GL11.glTranslatef((float)par2, (float)par4, (float)par6);
float var10;
if ((float)par1EntityODP.fuse - par9 + 1.0F < 10.0F)
{
var10 = 1.0F - ((float)par1EntityODP.fuse - par9 + 1.0F) / 10.0F;
if (var10 < 0.0F)
{
var10 = 0.0F;
}
if (var10 > 1.0F)
{
var10 = 1.0F;
}
var10 *= var10;
var10 *= var10;
float var11 = 1.0F + var10 * 0.3F;
GL11.glScalef(var11, var11, var11);
}
var10 = (1.0F - ((float)par1EntityODP.fuse - par9 + 1.0F) / 100.0F) * 0.8F;
this.loadTexture("/terrain.png");
this.blockRenderer.renderBlockAsItem(Block.tnt, 0, par1EntityODP.getBrightness(par9));
if (par1EntityODP.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, var10);
this.blockRenderer.renderBlockAsItem(Block.tnt, 0, 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();
}
/**
* 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.func_76992_a((EntityODP)par1Entity, par2, par4, par6, par8, par9);
}
}
EntityODP.java, this works perfectly until registerModEntity is used
package t1a.common;
import net.minecraft.src.*;
import cpw.mods.fml.common.Side;
import cpw.mods.fml.common.asm.SideOnly;
public class EntityODP extends Entity
{
public int fuse = 80;
public EntityODP(World par1World, double par2, double par4, double par6)
{
super(par1World);
this.preventEntitySpawning = false;
this.setSize(0.98F, 0.98F);
this.yOffset = this.height / 2.0F;
this.setPosition(par2, par4, par6);
this.motionX = 0.0D;
this.motionY = 0.20D;
this.motionZ = 0.0D;
this.prevPosX = par2;
this.prevPosY = par4;
this.prevPosZ = par6;
//this.worldObj.createExplosion((Entity)null, this.posX, this.posY, this.posZ, 3f);
}
protected void entityInit() {}
/**
* 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 !this.isDead;
}
/**
* Called to update the entity's position/logic.
*/
int count1 = 0;
public void onUpdate()
{
this.prevPosX = this.posX;
this.prevPosY = this.posY;
this.prevPosZ = this.posZ;
this.motionY -= 0.04D;
this.moveEntity(this.motionX, this.motionY, this.motionZ);
this.motionX *= 0.98D;
this.motionY *= 0.98D;
this.motionZ *= 0.98D;
if (this.onGround)
{
this.motionX *= 0.699999988079071D;
this.motionZ *= 0.699999988079071D;
this.motionY *= -0.5D;
}
count1++;
if(count1 == 20){ this.dropItem(Item.gunpowder.shiftedIndex, 1); count1=0;}
}
protected void readEntityFromNBT(NBTTagCompound var1) {/* TODO Auto-generated method stub*/}
protected void writeEntityToNBT(NBTTagCompound var1) {/* TODO Auto-generated method stub*/}
@SideOnly(Side.CLIENT)
public float getShadowSize()
{
return 0.0F;
}
}
I've been stuck on this for days and am disappointed I wasn't able to figure it out