Posted June 20, 20169 yr I'm trying to create a custom entity, known as an Oompah Loompah. I've created three classes: RenderOompah (points to the texture, etc) package blumac.blumacintosh.thewonkamod.client.renderer.entity; import net.minecraft.client.renderer.entity.RenderLiving; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.model.ModelBase; import net.minecraft.entity.Entity; import blumac.blumacintosh.thewonkamod.entity.EntityOompah; import net.minecraft.util.ResourceLocation; public class RenderOompah extends RenderLiving { private static final ResourceLocation oompahTextures = new ResourceLocation("thewonkamod:textures/oompah_loompah.png"); public RenderOompah(RenderManager rendermanager, ModelBase model, float shadowsize) { super(rendermanager, model, shadowsize); } protected ResourceLocation func_180572_a(EntityOompah entity) { return oompahTextures; } protected ResourceLocation getEntityTexture(Entity entity) { return this.func_180572_a((EntityOompah)entity); } } EntityOompah (creates the entity, ai, etc) package blumac.blumacintosh.thewonkamod.entity; import net.minecraft.block.Block; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIFollowParent; import net.minecraft.entity.ai.EntityAILookIdle; import net.minecraft.entity.ai.EntityAIMate; import net.minecraft.entity.ai.EntityAIPanic; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAITempt; import net.minecraft.entity.ai.EntityAIWander; import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.ai.EntityMoveHelper; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.storage.loot.LootTableList; public class EntityOompah extends EntityAnimal { public EntityOompah(World worldIn) { super(worldIn); this.setSize(0.9F, 1.4F); } protected void initEntityAI() { this.tasks.addTask(0, new EntityAISwimming(this)); this.tasks.addTask(1, new EntityAIPanic(this, 2.0D)); this.tasks.addTask(2, new EntityAIMate(this, 1.0D)); this.tasks.addTask(3, new EntityAITempt(this, 1.25D, Items.wheat, false)); this.tasks.addTask(4, new EntityAIFollowParent(this, 1.25D)); this.tasks.addTask(5, new EntityAIWander(this, 1.0D)); this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); this.tasks.addTask(7, new EntityAILookIdle(this)); } protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(10.0D); this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.20000000298023224D); } protected SoundEvent getAmbientSound() { return SoundEvents.entity_cow_ambient; } protected SoundEvent getHurtSound() { return SoundEvents.entity_cow_hurt; } protected SoundEvent getDeathSound() { return SoundEvents.entity_cow_death; } protected void playStepSound(BlockPos pos, Block blockIn) { this.playSound(SoundEvents.entity_cow_step, 0.15F, 1.0F); } /** * Returns the volume for the sounds this mob makes. */ protected float getSoundVolume() { return 0.4F; } protected ResourceLocation getLootTable() { return LootTableList.ENTITIES_COW; } public boolean processInteract(EntityPlayer player, EnumHand p_184645_2_, ItemStack stack) { if (stack != null && stack.getItem() == Items.bucket && !player.capabilities.isCreativeMode && !this.isChild()) { player.playSound(SoundEvents.entity_cow_milk, 1.0F, 1.0F); if (--stack.stackSize == 0) { player.setHeldItem(p_184645_2_, new ItemStack(Items.milk_bucket)); } else if (!player.inventory.addItemStackToInventory(new ItemStack(Items.milk_bucket))) { player.dropPlayerItemWithRandomChoice(new ItemStack(Items.milk_bucket), false); } return true; } else { return super.processInteract(player, p_184645_2_, stack); } } public EntityOompah createChild(EntityAgeable ageable) { return new EntityOompah(this.worldObj); } public float getEyeHeight() { return this.isChild() ? this.height : 1.3F; } public class OompahMoveHelper extends EntityMoveHelper{ private EntityOompah entity = EntityOompah.this; private int randCounter; public OompahMoveHelper(){ super(EntityOompah.this); } public void onUpdateMoveHelper(){ if(entity.inWater) { if(this.isUpdating()) { if(this.randCounter -- <= 0) { this.randCounter += this.entity.getRNG().nextInt(5) + 10; double dirX = this.posX - this.entity.posX; double dirY = this.posY - this.entity.posY; double dirZ = this.posZ - this.entity.posZ; double destDistance = dirX * dirX + dirY * dirY + dirZ * dirZ; } } } else { super.onUpdateMoveHelper(); } } public void UpdateYaw(double dirX, double dirZ){ renderYawOffset = rotationYaw = -((float)Math.atan2(dirX, dirZ) * 180.0F / (float)Math.PI); } private boolean checkCollision(double posX, double posY, double posZ, double distance) { double dirX = (posX - this.entity.posX) / distance; double dirY = (posY - this.entity.posY) / distance; double dirZ = (posZ - this.entity.posZ) / distance; AxisAlignedBB collisionBox = this.entity.getEntityBoundingBox(); for (int i = 1; (double)i < distance; ++i) { collisionBox = collisionBox.offset(dirX, dirY, dirZ); if(this.entity.worldObj.getCollisionBoxes(collisionBox).isEmpty()) { return true; } } return false; } public double getPosX() { return this.posX; } public double getPosY() { return this.posY; } public double getPosZ() { return this.posZ; } } } ModelOompah(creates the entity's model using a java model) package blumac.blumacintosh.thewonkamod.client.model; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.Entity; import net.minecraft.util.math.MathHelper; public class ModelOompah extends ModelBase { public ModelRenderer head = new ModelRenderer(this, 0, 0); public ModelRenderer body; public ModelRenderer leg1; public ModelRenderer leg2; public ModelRenderer arm1; public ModelRenderer arm2; public ModelOompah(){ textureWidth = 64; textureHeight = 64; this.head = new ModelRenderer(this, 0, 20 ); this.head.addBox( -4.5F, -30.5F, -3.5F, 9, 8, 7); this.head.setRotationPoint( 0F, 24F, 0F ); this.head.setTextureOffset(22, 4).addBox( -3.5F, -30.5F, 3F, 7, 8, 1); this.head.setTextureOffset(20, 13).addBox( -4F, -24F, 3F, 8, 2, 2); this.head.setTextureOffset(22, 4).addBox( -3.5F, -30.5F, 3F, 7, 8, 1); this.head.setTextureOffset(20, 13).addBox( -4F, -24F, 3F, 8, 2, 2); this.head.setTextureOffset(22, 4).addBox( -3.5F, -30.5F, 3F, 7, 8, 1); this.head.setTextureOffset(20, 13).addBox( -4F, -24F, 3F, 8, 2, 2); this.head.setTextureOffset(40, 12).addBox( 0F, -33F, -1.5F, 4, 2, 3); this.body = new ModelRenderer(this, 43, 43); this.body.addBox( -4F, -6F, -1.5F, 3, 4, 3); this.body.setRotationPoint( 0F, 24F, 0F ); this.leg1 = new ModelRenderer(this, 32, 57); this.leg1.addBox( 0.5F, -9F, -1.5F, 4, 4, 3); this.leg1.setRotationPoint( 0F, 24F, 0F ); this.leg1.setTextureOffset(43, 43).addBox( 1F, -6F, -1.5F, 3, 4, 3); this.leg1.setTextureOffset(32, 51).addBox( 1F, -2F, -2.6F, 3, 2, 4); this.leg1.setTextureOffset(0, 45).addBox( -5.5F, -21.5F, -2F, 11, 15, 4); this.leg1.setTextureOffset(0, 35).addBox( -7F, -8.5F, -2F, 14, 1, 4); this.leg1.setTextureOffset(0, 40).addBox( -7.5F, -9.5F, -2F, 15, 1, 4); this.leg1.setTextureOffset(0, 15).addBox( -2F, -22.5F, -2F, 4, 1, 4); this.leg2 = new ModelRenderer(this, 32, 57); this.leg2.addBox( -4.5F, -9F, -1.5F, 4, 4, 3); this.leg2.setRotationPoint( 0F, 24F, 0F ); this.leg2.setTextureOffset(32, 51).addBox( -4F, -2F, -2.6F, 3, 2, 4); this.arm1 = new ModelRenderer(this, 0, 1); this.arm1.addBox( 5.5F, -21F, -2F, 3, 10, 4); this.arm1.setRotationPoint( 0F, 24F, 0F ); this.arm2 = new ModelRenderer(this, 0, 1); this.arm2.addBox( -8.5F, -21F, -2F, 3, 10, 4); this.arm2.setRotationPoint( 0F, 24F, 0F ); this.arm2.setTextureOffset(0, 35).addBox( -7F, -10.5F, -2F, 14, 1, 4); this.arm2.setTextureOffset(20, 9).addBox( -3.5F, -31.5F, -3.5F, 7, 1, 7); } public void render(Entity entity, float time, float limbSwingDistance, float ageInTicks, float headYRot, float headXRot, float Ytrans){ this.setRotationAngles(time, limbSwingDistance, ageInTicks, headYRot, headXRot, Ytrans, entity); if(this.isChild) { float div = 2.0F; GlStateManager.pushMatrix(); GlStateManager.scale(1.0F / div, 1.0F / div, 1.0F / div); GlStateManager.translate(0.0F, 24.0F * Ytrans, 0.0F); this.head.render(Ytrans); this.body.render(Ytrans); this.leg1.render(Ytrans); this.leg2.render(Ytrans); this.arm1.render(Ytrans); this.arm2.render(Ytrans); GlStateManager.popMatrix(); } else { this.head.render(Ytrans); this.body.render(Ytrans); this.leg1.render(Ytrans); this.leg2.render(Ytrans); this.arm1.render(Ytrans); this.arm2.render(Ytrans); } } public void setRotationAngles(float time, float limbSwingDistance, float ageInTicks, float headYRot, float headXRot, float scaleFactor, Entity entity) { this.head.rotateAngleX = headXRot / (100F / (float)Math.PI); this.head.rotateAngleY = headYRot / (100F / (float)Math.PI); this.body.rotateAngleX = ((float)Math.PI / 2F); this.leg1.rotateAngleX = MathHelper.cos(time * 0.6662F) * 1.4F * limbSwingDistance; this.leg2.rotateAngleX = MathHelper.cos(time * 0.6662F + (float)Math.PI) * 1.4F * limbSwingDistance; this.arm1.rotateAngleX = MathHelper.cos(time * 0.6662F + (float)Math.PI) * 1.4F * limbSwingDistance; this.arm2.rotateAngleX = MathHelper.cos(time * 0.6662F) * 1.4F * limbSwingDistance; } } How do I register and initialize the entity? It has changed since 1.8, and I can't get it to work.
June 20, 20169 yr Call EntityRegistry#registerModEntity in preInit to register your entity. Use the overload with the two additional int arguments to add a spawn egg for the entity. Call RenderingRegistry#registerEntityRenderingHandler(Class<T>, IRenderFactory<? super T>) in preInit from your client proxy to register your entity's renderer. I suggest using an anonymous class (Java 6/7) or lambda/method reference (Java to implement IRenderFactory . Edit: Removed smiley. 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.
June 20, 20169 yr Author I tried this by adding these to my client proxy preInit, but no spawn egg or entity is registered. Did I do anything wrong, there aren't any errors in the code. EntityRegistry.registerModEntity(EntityOompah.class, "oompah", 0, Main.instance, 80, 3, false, 6750105, 7859797); RenderingRegistry.registerEntityRenderingHandler(EntityOompah.class, new IRenderFactory<Entity>() { @Override public Render<? super Entity> createRenderFor(RenderManager manager) { return new RenderOompah(manager, null, 0); } });
June 20, 20169 yr Are you sure the method is actually being called? Set a breakpoint and run Minecraft in debug mode. EntityRegistry.registerModEntity needs to be called on both sides, so don't put it in your client proxy. Passing null as the ModelBase argument of the RenderOompah constructor will almost certainly cause issues, RenderLivingBase doesn't expect the model to be null . 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.
June 20, 20169 yr Author Passing null as the ModelBase argument of the RenderOompah constructor will almost certainly cause issues, RenderLivingBase doesn't expect the model to be null . What else could go in there besides null? My model is based off of modelbase, but using return new RenderOompah(manager, ModelBase.class, 0); returns "The constructor RenderOompah(RenderManager, Class<ModelBase>, int) is undefined"
June 20, 20169 yr Passing null as the ModelBase argument of the RenderOompah constructor will almost certainly cause issues, RenderLivingBase doesn't expect the model to be null . What else could go in there besides null? My model is based off of modelbase, but using return new RenderOompah(manager, ModelBase.class, 0); returns "The constructor RenderOompah(RenderManager, Class<ModelBase>, int) is undefined" Pass an instance of ModelBase or a class that extends it (like ModelOompah ). Don't pass the class itself. 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.
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.