Jump to content

admiralmattbar

Members
  • Posts

    44
  • Joined

  • Last visited

Everything posted by admiralmattbar

  1. Hello, I have been adding some throwable entities based on the snowballs (using EntityThrowable and RenderSnowball). I can make both entities appear after right-clicking while holding a specific item but only one of them renders a texture. Here is where I call the renders: @SideOnly(Side.CLIENT) public class RenderHandler { public static void registerEntityRenders() { RenderingRegistry.registerEntityRenderingHandler(EntityModFireball.class, new IRenderFactory<EntityModFireball>() { @Override public Render<? super EntityModFireball> createRenderFor(RenderManager manager) { return new RenderSnowball(manager, Items.FIRE_CHARGE, Minecraft.getMinecraft().getRenderItem()); } }); RenderingRegistry.registerEntityRenderingHandler(EntityGrenade.class, new IRenderFactory<EntityGrenade>() { @Override public Render<? super EntityGrenade> createRenderFor(RenderManager manager) { return new RenderSnowball(manager, ItemInit.GRENADE, Minecraft.getMinecraft().getRenderItem()); } }); } } The EntityGrenade renders with the texture I used for the grenade item. EntityModFireball does not render at all, though I can see its effect in the game. The method registerEntityRenders() is called in preInit in the main class. I've even tried using the grenade texture for the fireball just to see if for some reason I can only access my mod textures and it still did not work. I'm not sure why, given that both methods seem identical to me, one would work and the other would not.
  2. I solved the problem. I just removed the src folder from the mod, downloaded a new forge mdk, dragged the src back in and redid the gradle commands. This worked for some reason.
  3. Yeah, I don't run a ton of mods and I'm mostly making this for myself and some friends. If I upload this to curse or something I'll have to fix that. The path for my recipes is assets.bf.recipes
  4. Hello All, While I have recipes working in two other 1.12 mods, for some reason I can't get them to work in this mod. I'm probably missing something obvious but I've been looking over it and comparing for a week now and gotten nowhere. Here's a recipe JSON file for one of my items. To avoid error I usually copy from vanilla and change things around: { "type": "minecraft:crafting_shaped", "pattern": [ "PPP", "PPP", "PPP" ], "key": { "P": { "item": "bf:brian_poo" } }, "result": { "item": "bf:brian_block_poo" } } The modid is bf and so is the folder name containing my assets. Below are the classes for brian_poo and brian_block_poo. brian_block_poo package org.educraft.brianface.blocks; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import org.educraft.brianface.Main; import org.educraft.brianface.util.IHasModel; public class BlockBrianPoo extends ModBlock implements IHasModel { public BlockBrianPoo(){ super("brian_block_poo", Material.GROUND, CreativeTabs.BUILDING_BLOCKS); } public void registerModels() { Main.proxy.registerItemRenderer(Item.getItemFromBlock(this), 0, "inventory"); } } The first parameter of the super constructor sets the unRegistered and unLocalized names. Here is the class for ItemBrianPoo package org.educraft.brianface.items; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemDye; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.educraft.brianface.Main; import org.educraft.brianface.util.IHasModel; public class ItemBrianPoo extends ModItem implements IHasModel { public ItemBrianPoo() { super("brian_poo", CreativeTabs.TOOLS); } public int getItemBurnTime(ItemStack itemStack) { return 2000; } @Override public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { ItemStack itemstack = player.getHeldItem(hand); if (ItemDye.applyBonemeal(itemstack, worldIn, pos, player, hand)) { if (!worldIn.isRemote) { worldIn.playEvent(2005, pos, 0); } return EnumActionResult.SUCCESS; } return super.onItemUse(player, worldIn, pos, hand, facing, hitX, hitY, hitZ); } @Override public void registerModels() { Main.proxy.registerItemRenderer(this, 0, "inventory"); } } Both items render just fine and I can use the command /give to get them. For some reason the recipes just aren't working. Any help would be appreciated. Thanks. EDIT: My whole thing is here if that helps https://github.com/admiralmattbar/brianmod1.12
  5. This code worked. I'll probably bring back the switch statement next. package org.gsa.basemod.World; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.pattern.BlockMatcher; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkGenerator; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.feature.WorldGenMinable; import net.minecraftforge.fml.common.IWorldGenerator; import org.gsa.basemod.init.ModBlocks; import java.util.Random; public class WorldGenOre implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { if(world.provider.getDimension() == 0) { generateOverworld(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider); } if(world.provider.getDimension() == -1){ generateNether(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider); } } private void generateOverworld(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { /* This method is what places the blocks in the world. Size aregument gives minimum number per chunk and adds a random number up to but not including 4. Chances is how many times the probability of the ore is checked per chunk. */ generateOre(ModBlocks.dice.getDefaultState(), world, random, chunkX * 16, chunkZ * 16, 16, 100, 4 + random.nextInt(4), 16, Blocks.STONE); } private void generateNether(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { /* This method is what places the blocks in the world. Size arguement gives minimum number per chunk and adds a random number up to but not including 4. If it's too high the game crashes. Chances is how many times the probability of the ore is checked per chunk. */ generateOre(ModBlocks.dice.getDefaultState(), world, random, chunkX * 16, chunkZ * 16, 0, 256, 10 + random.nextInt(4), 10, Blocks.NETHERRACK); /*At the end you call a block that your ore can generate on. This includes any natural state of Netherrack. The default is stone, so if you don't call this in WorldGenMinable your ore won't generate in the Nether because there is no stone in the nether.*/ } private void generateOre(IBlockState ore, World world, Random random, int x, int z, int minY, int maxY, int size, int chances, Block block){ int deltaY = maxY - minY; for(int i=0; i<chances; i++){ BlockPos pos = new BlockPos(x + random.nextInt(16), minY + random.nextInt(deltaY), z + random.nextInt(16)); WorldGenMinable generator = new WorldGenMinable(ore, size, BlockMatcher.forBlock(block)); //The last parameter in the WorldGenMinable constructor is the block your ore can generate on. generator.generate(world, random, pos); } } }
  6. Hello All, I've been having trouble generating ore in the Nether. My ore generates fine in Overworld, but it never shows up below. Here is my WorldGenOre class: package org.gsa.basemod.World; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkGenerator; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.feature.WorldGenMinable; import net.minecraftforge.fml.common.IWorldGenerator; import org.gsa.basemod.init.ModBlocks; import java.util.Random; public class WorldGenOre implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { /* if(world.provider.getDimension() == 0) { generateOverworld(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider); } */ if(world.provider.getDimension() == -1){ generateNether(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider); } } private void generateOverworld(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { /* This method is what places the blocks in the world. Size aregument gives minimum number per chunk and adds a random number up to but not including 4. Chances is how many times the probability of the ore is checked per chunk. */ generateOre(ModBlocks.dice.getDefaultState(), world, random, chunkX * 16, chunkZ * 16, 16, 100, 4 + random.nextInt(4), 16); } private void generateNether(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { /* This method is what places the blocks in the world. Size aregument gives minimum number per chunk and adds a random number up to but not including 4. If it's too high the game crashes. Chances is how many times the probability of the ore is checked per chunk. */ generateOre(ModBlocks.dice.getDefaultState(), world, random, chunkX * 16, chunkZ * 16, 0, 256, 10 + random.nextInt(4), 10); } private void generateOre(IBlockState ore, World world, Random random, int x, int z, int minY, int maxY, int size, int chances){ int deltaY = maxY - minY; for(int i=0; i<chances; i++){ BlockPos pos = new BlockPos(x + random.nextInt(16), minY + random.nextInt(deltaY), z + random.nextInt(16)); WorldGenMinable generator = new WorldGenMinable(ore, size); generator.generate(world, random, pos); } } } I've also tried it with switch statements and got the same results. i can find the dice blocks in Overworld but not the Nether. Thanks!
  7. Hi JimilT92! I've been working on the same thing, learning from the snowball and ender pearl to make a grenade. If you don't mind saying, how did you get the texture to render? I have prettymuch the same code as you but I'm still seeing nothing and I think it might be in not connecting the texture file. Thanks.
  8. Hi Choonster, Thanks for taking a look. The EntityBrianade package org.educraft.brianface.entityclasses; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.datafix.DataFixer; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.*; public class EntityBrianade extends EntityThrowable { private EntityLivingBase throwerIn; private int throwerId; public EntityBrianade(World worldIn) { super(worldIn); } public EntityBrianade(World worldIn, EntityLivingBase throwerIn) { super(worldIn, throwerIn); } public EntityBrianade(World worldIn, double x, double y, double z) { super(worldIn, x, y, z); } public static void registerFixesBrianade(DataFixer fixer) { EntityThrowable.registerFixesThrowable(fixer, "Brianade"); } @SideOnly(Side.CLIENT) public void handleStatusUpdate(byte id) { if (id == 3) { for (int i = 0; i < 8; ++i) { this.world.spawnParticle(EnumParticleTypes.EXPLOSION_HUGE, this.posX, this.posY, this.posZ, 1.0D, 1.0D, 1.0D, new int[0]); } } } @Override protected float getGravityVelocity() { return 0.06F; } protected void onImpact(RayTraceResult result) { this.setDead(); if (!world.isRemote) { world.createExplosion(null, result.hitVec.xCoord, result.hitVec.yCoord, result.hitVec.zCoord, 10f, true); } } } And here's the render class. package org.educraft.brianface.renderer.entity; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.client.registry.IRenderFactory; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.educraft.brianface.Reference; import org.educraft.brianface.entityclasses.EntityBrianade; import org.educraft.brianface.modelclasses.ModelBrianade; import javax.annotation.Nullable; @SideOnly(Side.CLIENT) public class RenderBrianade extends Render<EntityBrianade> { private static final ResourceLocation BRIANADE_TEXTURE = new ResourceLocation(Reference.MOD_ID,"brianface:textures/entity/brianade/brianade.png"); public static final Factory FACTORY = new Factory(); protected RenderBrianade(RenderManager renderManager) { super(renderManager); } @Nullable //@Override protected ResourceLocation getEntityTexture(EntityBrianade entity) { return BRIANADE_TEXTURE; } public static class Factory implements IRenderFactory<EntityBrianade> { public static final Factory INSTANCE = new Factory(); @Override public Render<? super EntityBrianade> createRenderFor(RenderManager manager){ return new RenderBrianade(manager); } } } And the render registration in ClientProxy /* * This class covers your textures when you are running the client version of Minecraft. Your textures will not render on a server * because they simply do not do that. */ package org.educraft.brianface.proxy; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraftforge.fml.client.registry.IRenderFactory; import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import org.educraft.brianface.Reference; import org.educraft.brianface.entityclasses.EntityBrianade; import org.educraft.brianface.init.ModBlocks; import org.educraft.brianface.init.ModEntities; import org.educraft.brianface.init.ModItems; import org.educraft.brianface.renderer.entity.RenderBrianade; public class ClientProxy implements ICommonProxy { @Override public void preInit(FMLPreInitializationEvent event){ RenderingRegistry.registerEntityRenderingHandler(EntityBrianade.class, RenderBrianade.FACTORY.INSTANCE); } @Override public void init(FMLInitializationEvent event) { ModItems.registerRenders(); ModBlocks.registerRenders(); ModEntities.initModels(); ModEntities.init(); } @Override public void postInit(FMLPostInitializationEvent event) { } } I put this together based on browsing Github and some internet tutorials I found.
  9. Thanks for the reply. My problem is that when I spawned it on the server only the entity stopped rendering. Getting entities to render has been my white whale with 1.11 and for some reason I have trouble wrapping my head around the server client stuff. For some reason the logic of client being visual and server being logical still doesn't get me to predict what would be on what's side all the time. Here's my onItemRightClick() method from the Item class that spawns the grenade. I set it to spawn in server only but now it no longer renders. public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) { ItemStack itemstack = playerIn.getHeldItem(handIn); if (!playerIn.capabilities.isCreativeMode) { itemstack.shrink(1); } worldIn.playSound((EntityPlayer)null, playerIn.posX, playerIn.posY, playerIn.posZ, SoundEvents.ENTITY_SNOWBALL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); //Change to Grenade Entity EntityBrianade entitybrianade = new EntityBrianade(worldIn, playerIn); entitybrianade.setHeadingFromThrower(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 1.0F); if(!worldIn.isRemote) { worldIn.spawnEntity(entitybrianade); } playerIn.addStat(StatList.getObjectUseStats(this)); return new ActionResult(EnumActionResult.SUCCESS, itemstack); } I assume when the client is notified it calls the rendering class.
  10. Oh wow! Okay, I see the problem. I was only spawning the entity in the Item class if the world was remote, I removed the condition so the entity spawns on both sides (something I was afraid would create ghost entities) but now it gets the grenade flying and it called the explosion on the server side. Thanks for your help! Here's the code for the item that works. public class ItemBrianade extends Item { public ItemBrianade() { this.maxStackSize = 16; this.setCreativeTab(CreativeTabs.MISC); } public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) { ItemStack itemstack = playerIn.getHeldItem(handIn); if (!playerIn.capabilities.isCreativeMode) { itemstack.shrink(1); } worldIn.playSound((EntityPlayer)null, playerIn.posX, playerIn.posY, playerIn.posZ, SoundEvents.ENTITY_SNOWBALL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); //Change to Grenade Entity EntityBrianade entitybrianade = new EntityBrianade(worldIn, playerIn); entitybrianade.setHeadingFromThrower(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 1.0F); worldIn.spawnEntity(entitybrianade); playerIn.addStat(StatList.getObjectUseStats(this)); return new ActionResult(EnumActionResult.SUCCESS, itemstack); } }
  11. Thanks for the reply. Sorry if I'm missing something obvious. I put the breakpoint on the onImpact method in the grenade class and the debug screen said world.isRemote was returning true. It seems like that is keeping the explosion code from happening. I thought Minecraft ran both simultaneously so it would get called on the server side but the IntelliJ debugger just shows the server thread running EntityLiving.updateEnttiyActionState() and nothing else in the process of the grenade entity hitting something. Here's the server thread java.lang.Thread.State: RUNNABLE at net.minecraft.entity.EntityLiving.updateEntityActionState(EntityLiving.java:845) at net.minecraft.entity.EntityLivingBase.onLivingUpdate(EntityLivingBase.java:2466) at net.minecraft.entity.EntityLiving.onLivingUpdate(EntityLiving.java:639) at net.minecraft.entity.EntityAgeable.onLivingUpdate(EntityAgeable.java:194) at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:2292) at net.minecraft.entity.EntityLiving.onUpdate(EntityLiving.java:343) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2108) at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:875) at net.minecraft.world.World.updateEntity(World.java:2075) at net.minecraft.world.World.updateEntities(World.java:1888) at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:647) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:794) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:698) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:547) at java.lang.Thread.run(Thread.java:745) Here's the client thread which goes all the way to the onImpact method in the grenade class. "Client thread@1" prio=5 tid=0x1 nid=NA runnable java.lang.Thread.State: RUNNABLE at org.educraft.brianface.entityclasses.EntityBrianade.onImpact(EntityBrianade.java:64) at net.minecraft.entity.projectile.EntityThrowable.onUpdate(EntityThrowable.java:266) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2108) at net.minecraft.world.World.updateEntity(World.java:2075) at net.minecraft.world.World.updateEntities(World.java:1888) at net.minecraft.client.Minecraft.runTick(Minecraft.java:1881) at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1119) at net.minecraft.client.Minecraft.run(Minecraft.java:407) at net.minecraft.client.main.Main.main(Main.java:118) at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) at GradleStart.main(GradleStart.java:26) Thanks for any help.
  12. Thanks for the reply. When I switched the sides the grenade falls but does not explode. I set it to this one because that was the only way I got it to get it to explode instead of just fall into the ground and disappear. Is there something I have to do to trigger the explosion on client but cause the explosion in server? if (!this.world.isRemote) { world.createExplosion(result.entityHit, result.hitVec.xCoord, result.hitVec.yCoord, result.hitVec.zCoord, 10f, true); } this.setDead();
  13. Hi All! I took some time off from the grenade thingy to get better at Java, go over some Minecraft classes, and study up on raytracing. That is to say, it became clear to me that I was in over my head so I decided to get better. Having done that I am having a problem with my explosions my grenades make. The blocks they blow up disappear, but then the player cannot move through them. I guess the blocks are being blown up on the client but the server still thinks something should be there. I looked at the TNT entity code to figure out what to do with explosions but it didn't seem like it had to do anything special to prevent this problem. Here's what I have so far. package org.educraft.brianface.entityclasses; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.datafix.DataFixer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.*; public class EntityBrianade extends EntityThrowable { private EntityLivingBase throwerIn; private int throwerId; public EntityBrianade(World worldIn) { super(worldIn); } public EntityBrianade(World worldIn, EntityLivingBase throwerIn) { super(worldIn, throwerIn); } public EntityBrianade(World worldIn, double x, double y, double z) { super(worldIn, x, y, z); } public static void registerFixesBrianade(DataFixer fixer) { EntityThrowable.registerFixesThrowable(fixer, "Brianade"); } @Override protected float getGravityVelocity() { return 0.06F; } protected void onImpact(RayTraceResult result) { world.createExplosion(result.entityHit, result.hitVec.xCoord, result.hitVec.yCoord, result.hitVec.zCoord, 10f, true); this.setDead(); } } Earlier I tried something more complicated in the onImpact method. protected void onImpact(RayTraceResult result) { Entity target = result.entityHit; if (target != null) { if (target.getEntityId() == this.throwerIn.getEntityId()) { return; } if(world.isRemote) { world.createExplosion(target, result.hitVec.xCoord, result.hitVec.yCoord, result.hitVec.zCoord, 10f, true); this.setDead(); } } if (result.getBlockPos() != null) { if(world.isRemote) { world.createExplosion(target, result.hitVec.xCoord, result.hitVec.yCoord, result.hitVec.zCoord, 10f, true); this.setDead(); } } I thought this might be more explicit about what to do based on what is hit. I get the same results from this as I do from the code above. Here's a video of the glitch if that helps. Thanks!
  14. Thanks for the replies! Okay, this is exactly what I was looking for. It makes sense why they do different names.
  15. 1. The Forge documentation suggests making the CommonProxy an interface implemented by Client and Server but I see a lot of mods made by great modders who make the common proxy a class that has it's own code that is then extended by Client and Server. Is there a good reason to do this? Why would someone not just put that code in their main class? 2. In 1.11 registry names no longer have the capital letter naming convention. Is there any reason not to just give them the same name and create a method that generates registry names for items that gets the unlocalized name? This seems like it would make things much easier but then why did they do it the other way for so long if it's a good idea? Thanks for any replies.
  16. Hi All, Once again I have a problem with my Brianmod's grenade feature. I can get a grenade to throw and blow up but while it is in the air (as an entity) it does not look like anything. Not a white box or a pink and black checkered mess. I created an EntityBrianade and a RenderBrianade class. I then have the ItemBrianade class call the entity when it is right clicked. Everything but the appearance of the grenade in flight works like a charm. Here is my RenderBrianade class. package org.educraft.brianface.renderer.entity; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.client.registry.IRenderFactory; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.educraft.brianface.Reference; import org.educraft.brianface.entityclasses.EntityBrianade; import javax.annotation.Nullable; @SideOnly(Side.CLIENT) public class RenderBrianade<T extends EntityBrianade> extends Render<T> { private static final ResourceLocation BRIANADE_TEXTURE = new ResourceLocation(Reference.MOD_ID,"textures/entity/brianade/brianade.png"); public static final Factory FACTORY = new Factory(); public RenderBrianade(RenderManager renderManagerIn) { super(renderManagerIn/*, new ModelBrianade(), 1.0F*/); } @Nullable //@Override protected ResourceLocation getEntityTexture(EntityBrianade entity) { return BRIANADE_TEXTURE; } public static class Factory implements IRenderFactory<EntityBrianade> { public static final Factory INSTANCE = new Factory(); @Override public Render<? super EntityBrianade> createRenderFor(RenderManager manager){ return new RenderBrianade(manager); } } } I double checked the location of the texture file. So I know it's there. Here is my class for registering entities: package org.educraft.brianface.init; import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.educraft.brianface.entityclasses.EntityBrianade; import org.educraft.brianface.renderer.entity.RenderBrianade; public class ModEntities { @SideOnly(Side.CLIENT) public static void initModels() { RenderingRegistry.registerEntityRenderingHandler(EntityBrianade.class, RenderBrianade.Factory.INSTANCE); } } I also call this in my main class. /* * This is the main class for the mod. All of the things you make have to be initialized and registered here. This also * helps you with your proxy settings so that you do not crash the game when you run a server with this mod. */ package org.educraft.brianface; import net.minecraft.entity.Entity; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.Mod.Instance; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.registry.EntityRegistry; import net.minecraftforge.fml.common.registry.GameRegistry; import org.educraft.brianface.entityclasses.EntityBrianade; import org.educraft.brianface.init.ModBlocks; import org.educraft.brianface.init.ModCrafting; import org.educraft.brianface.init.ModEntities; import org.educraft.brianface.init.ModItems; import org.educraft.brianface.proxy.ICommonProxy; import org.educraft.brianface.worldgenerator.ModWorldGen; @Mod(modid = Reference.MOD_ID, name = Reference.NAME, version = Reference.VERSION, acceptedMinecraftVersions = Reference.ACCEPTED_VERSIONS) public class Main { @Instance public static Main instance; @SidedProxy(clientSide = Reference.CLIENT_PROXY_CLASS, serverSide = Reference.SERVER_PROXY_CLASS) public static ICommonProxy proxy; @EventHandler public void preInit(FMLPreInitializationEvent event) { System.out.println("PreInit Test"); ModItems.init(); ModItems.register(); ModBlocks.init(); ModBlocks.register(); ModEntities.initModels(); proxy.preInit(event); //MaterialGenerator.register(); } @EventHandler public void init(FMLInitializationEvent event) { System.out.println("Init Test"); ModCrafting.register(); GameRegistry.registerWorldGenerator(new ModWorldGen(), 0); proxy.init(event); } @EventHandler public void postInit(FMLPostInitializationEvent event) { proxy.postInit(event); System.out.println("PostInit Test"); } } I would appreciate any help from the modding community that has so far proven much smarter than me. Here is a link to the repository of the entire mod if I have not provided enough information. Thanks for any help.
  17. I was worried that the onImpact() method would call if the entity hit an air block. It doesn't seem like that's a problem and the conditional was unnecessary to begin with. This code no longer crashes. package org.educraft.brianface.entityclasses; import net.minecraft.block.BlockAir; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.EntityBlaze; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.datafix.DataFixer; import net.minecraft.util.datafix.walkers.BlockEntityTag; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class EntityBrianade extends EntityThrowable { private EntityLivingBase throwerIn; private int throwerId; public EntityBrianade(World worldIn) { super(worldIn); } public EntityBrianade(World worldIn, EntityLivingBase throwerIn) { super(worldIn, throwerIn); } public EntityBrianade(World worldIn, double x, double y, double z) { super(worldIn, x, y, z); } public static void registerFixesBrianade(DataFixer fixer) { EntityThrowable.registerFixesThrowable(fixer, "Brianade"); } @SideOnly(Side.CLIENT) public void handleStatusUpdate(byte id) { if (id == 3) { for (int i = 0; i < 8; ++i) { this.world.spawnParticle(EnumParticleTypes.EXPLOSION_HUGE, this.posX, this.posY, this.posZ, 1.0D, 1.0D, 1.0D, new int[0]); } } } /** * Called when this EntityThrowable hits a block or entity. */ protected void onImpact(RayTraceResult result) { Entity entity = result.entityHit; world.createExplosion(throwerIn, result.hitVec.xCoord, result.hitVec.yCoord, result.hitVec.zCoord, 8F, true); if (!this.world.isRemote) { this.world.setEntityState(this, (byte)3); this.setDead(); } } }
  18. Thanks Choonster! I'll work on this and post the solution!
  19. Oops! Here's the full stuff! Sorry. [22:19:15] [Server thread/ERROR]: Encountered an unexpected exception net.minecraft.util.ReportedException: Ticking entity at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:800) ~[MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:698) ~[MinecraftServer.class:?] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) ~[IntegratedServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:547) [MinecraftServer.class:?] at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91] Caused by: java.lang.NullPointerException at org.educraft.brianface.entityclasses.EntityBrianade.onImpact(EntityBrianade.java:63) ~[EntityBrianade.class:?] at net.minecraft.entity.projectile.EntityThrowable.onUpdate(EntityThrowable.java:266) ~[EntityThrowable.class:?] at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2108) ~[World.class:?] at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:875) ~[WorldServer.class:?] at net.minecraft.world.World.updateEntity(World.java:2075) ~[World.class:?] at net.minecraft.world.World.updateEntities(World.java:1888) ~[World.class:?] at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:647) ~[WorldServer.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:794) ~[MinecraftServer.class:?] ... 4 more [22:19:16] [Server thread/ERROR]: This crash report has been saved to: C:\minecraftmodding\brianmod\run\.\crash-reports\crash-2017-07-12_22.19.15-server.txt [22:19:16] [Server thread/INFO]: Stopping server [22:19:16] [Server thread/INFO]: Saving players [22:19:16] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:600]: ---- Minecraft Crash Report ---- // Don't be sad, have a hug! <3 Time: 7/12/17 10:19 PM Description: Ticking entity java.lang.NullPointerException: Ticking entity at org.educraft.brianface.entityclasses.EntityBrianade.onImpact(EntityBrianade.java:63) at net.minecraft.entity.projectile.EntityThrowable.onUpdate(EntityThrowable.java:266) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2108) at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:875) at net.minecraft.world.World.updateEntity(World.java:2075) at net.minecraft.world.World.updateEntities(World.java:1888) at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:647) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:794) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:698) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:547) at java.lang.Thread.run(Thread.java:745) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Client thread Stacktrace: at org.educraft.brianface.entityclasses.EntityBrianade.onImpact(EntityBrianade.java:63) at net.minecraft.entity.projectile.EntityThrowable.onUpdate(EntityThrowable.java:266) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2108) at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:875) at net.minecraft.world.World.updateEntity(World.java:2075) -- Entity being ticked -- Details: Entity Type: null (org.educraft.brianface.entityclasses.EntityBrianade) Entity ID: 3117 Entity Name: unknown Entity's Exact location: -34.44, 75.25, 320.67 Entity's Block location: World: (-35,75,320), Chunk: (at 13,4,0 in -3,20; contains blocks -48,0,320 to -33,255,335), Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511) Entity's Momentum: 1.04, -0.57, -0.86 Entity's Passengers: [] Entity's Vehicle: ~~ERROR~~ NullPointerException: null Stacktrace: at net.minecraft.world.World.updateEntities(World.java:1888) at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:647) -- Affected level -- Details: Level name: New World All players: 1 total; [EntityPlayerMP['Player48'/1185, l='New World', x=-44.15, y=77.75, z=328.60]] Chunk stats: ServerChunkCache: 644 Drop: 0 Level seed: 1001640285474528145 Level generator: ID 00 - default, ver 1. Features enabled: true Level generator options: Level spawn location: World: (16,64,256), Chunk: (at 0,4,0 in 1,16; contains blocks 16,0,256 to 31,255,271), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511) Level time: 9126 game time, 9126 day time Level dimension: 0 Level storage version: 0x04ABD - Anvil Level weather: Rain time: 31208 (now: false), thunder time: 44276 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true Stacktrace: at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:794) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:698) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:547) at java.lang.Thread.run(Thread.java:745) -- System Details -- Details: Minecraft Version: 1.11.2 Operating System: Windows 10 (amd64) version 10.0 Java Version: 1.8.0_91, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 745188160 bytes (710 MB) / 1848639488 bytes (1763 MB) up to 3806855168 bytes (3630 MB) JVM Flags: 0 total; IntCache: cache: 0, tcache: 0, allocated: 12, tallocated: 94 FML: MCP 9.38 Powered by Forge 13.20.0.2228 5 mods loaded, 5 mods active States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored UCHIJAAAA minecraft{1.11.2} [Minecraft] (minecraft.jar) UCHIJAAAA mcp{9.19} [Minecraft Coder Pack] (minecraft.jar) UCHIJAAAA FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.11.2-13.20.0.2228.jar) UCHIJAAAA forge{13.20.0.2228} [Minecraft Forge] (forgeSrc-1.11.2-13.20.0.2228.jar) UCHIJAAAA brianface{1.0} [Brian Face] (brianmod_main) Loaded coremods (and transformers): GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread. Profiler Position: N/A (disabled) Player Count: 1 / 8; [EntityPlayerMP['Player48'/1185, l='New World', x=-44.15, y=77.75, z=328.60]] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'fml,forge' [22:19:16] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:600]: #@!@# Game crashed! Crash report saved to: #@!@# .\crash-reports\crash-2017-07-12_22.19.15-server.txt [22:19:16] [Client thread/INFO] [FML]: Waiting for the server to terminate/save. [22:19:16] [Server thread/INFO]: Saving worlds [22:19:16] [Server thread/INFO]: Saving chunks for level 'New World'/Overworld [22:19:16] [Server thread/INFO]: Saving chunks for level 'New World'/Nether [22:19:16] [Server thread/INFO]: Saving chunks for level 'New World'/The End [22:19:16] [Server thread/INFO] [FML]: Unloading dimension 0 [22:19:16] [Server thread/INFO] [FML]: Unloading dimension -1 [22:19:16] [Server thread/INFO] [FML]: Unloading dimension 1 [22:19:16] [Server thread/INFO] [FML]: Applying holder lookups [22:19:16] [Server thread/INFO] [FML]: Holder lookups applied [22:19:16] [Server thread/INFO] [FML]: The state engine was in incorrect state SERVER_STOPPING and forced into state SERVER_STOPPED. Errors may have been discarded. [22:19:16] [Client thread/INFO] [FML]: Server terminated. [22:19:16] [Client Shutdown Thread/INFO]: Stopping server [22:19:16] [Client Shutdown Thread/INFO]: Saving players AL lib: (EE) alc_cleanup: 1 device not closed Process finished with exit code -1
  20. Hi All, I'm working on a stupid mod about my cousin and I decided to add grenades to it (called brianades). The problem is, when I throw grenades and they land on an Entity the game crashes, if they land on a block there's an explosions and nearby entities take damage, but if the grenade touches an entity there is a crash. Here is my EntityBrianade.java. You can tell I clumsily based it on the snowball. package org.educraft.brianface.entityclasses; import net.minecraft.block.BlockAir; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.EntityBlaze; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.datafix.DataFixer; import net.minecraft.util.datafix.walkers.BlockEntityTag; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class EntityBrianade extends EntityThrowable { private EntityLivingBase throwerIn; private int throwerId; public EntityBrianade(World worldIn) { super(worldIn); } public EntityBrianade(World worldIn, EntityLivingBase throwerIn) { super(worldIn, throwerIn); } public EntityBrianade(World worldIn, double x, double y, double z) { super(worldIn, x, y, z); } public static void registerFixesBrianade(DataFixer fixer) { EntityThrowable.registerFixesThrowable(fixer, "Brianade"); } @SideOnly(Side.CLIENT) public void handleStatusUpdate(byte id) { if (id == 3) { for (int i = 0; i < 8; ++i) { this.world.spawnParticle(EnumParticleTypes.EXPLOSION_HUGE, this.posX, this.posY, this.posZ, 1.0D, 1.0D, 1.0D, new int[0]); } } } /** * Called when this EntityThrowable hits a block or entity. */ protected void onImpact(RayTraceResult result) { Entity entity = result.entityHit; if (!(result.getBlockPos().getClass().equals(BlockAir.class))) { world.createExplosion(throwerIn, result.hitVec.xCoord, result.hitVec.yCoord, result.hitVec.zCoord, 8F, true); } if (!this.world.isRemote) { this.world.setEntityState(this, (byte)3); this.setDead(); } } } Here is the crash report. I know it's something about the onImpact() method but I can't figure it out. A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Client thread Stacktrace: at org.educraft.brianface.entityclasses.EntityBrianade.onImpact(EntityBrianade.java:63) at net.minecraft.entity.projectile.EntityThrowable.onUpdate(EntityThrowable.java:266) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2108) at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:875) at net.minecraft.world.World.updateEntity(World.java:2075) -- Entity being ticked -- Details: Entity Type: null (org.educraft.brianface.entityclasses.EntityBrianade) Entity ID: 2586 Entity Name: unknown Entity's Exact location: -39.78, 65.70, 294.14 Entity's Block location: World: (-40,65,294), Chunk: (at 8,4,6 in -3,18; contains blocks -48,0,288 to -33,255,303), Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511) Entity's Momentum: -0.12, -0.77, -1.29 Entity's Passengers: [] Entity's Vehicle: ~~ERROR~~ NullPointerException: null Stacktrace: at net.minecraft.world.World.updateEntities(World.java:1888) at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:647) -- Affected level -- Details: Level name: New World All players: 1 total; [EntityPlayerMP['Player180'/990, l='New World', x=-38.41, y=70.63, z=308.47]] Chunk stats: ServerChunkCache: 644 Drop: 0 Level seed: 1001640285474528145 Level generator: ID 00 - default, ver 1. Features enabled: true Level generator options: Level spawn location: World: (16,64,256), Chunk: (at 0,4,0 in 1,16; contains blocks 16,0,256 to 31,255,271), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511) Level time: 8430 game time, 8430 day time Level dimension: 0 Level storage version: 0x04ABD - Anvil Level weather: Rain time: 31904 (now: false), thunder time: 44972 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true Stacktrace: at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:794) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:698) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:547) at java.lang.Thread.run(Thread.java:745) -- System Details -- Details: Minecraft Version: 1.11.2 Operating System: Windows 10 (amd64) version 10.0 Java Version: 1.8.0_91, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 976158360 bytes (930 MB) / 1883766784 bytes (1796 MB) up to 3806855168 bytes (3630 MB) JVM Flags: 0 total; IntCache: cache: 0, tcache: 0, allocated: 12, tallocated: 94 FML: MCP 9.38 Powered by Forge 13.20.0.2228 5 mods loaded, 5 mods active States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored UCHIJAAAA minecraft{1.11.2} [Minecraft] (minecraft.jar) UCHIJAAAA mcp{9.19} [Minecraft Coder Pack] (minecraft.jar) UCHIJAAAA FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.11.2-13.20.0.2228.jar) UCHIJAAAA forge{13.20.0.2228} [Minecraft Forge] (forgeSrc-1.11.2-13.20.0.2228.jar) UCHIJAAAA brianface{1.0} [Brian Face] (brianmod_main) Loaded coremods (and transformers): GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread. Profiler Position: N/A (disabled) Player Count: 1 / 8; [EntityPlayerMP['Player180'/990, l='New World', x=-38.41, y=70.63, z=308.47]] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'fml,forge' [22:14:56] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:600]: #@!@# Game crashed! Crash report saved to: #@!@# .\crash-reports\crash-2017-07-12_22.14.56-server.txt [22:14:56] [Client thread/INFO] [FML]: Waiting for the server to terminate/save. [22:14:56] [Server thread/INFO]: Saving worlds [22:14:56] [Server thread/INFO]: Saving chunks for level 'New World'/Overworld [22:14:56] [Server thread/INFO]: Saving chunks for level 'New World'/Nether [22:14:56] [Server thread/INFO]: Saving chunks for level 'New World'/The End [22:14:57] [Server thread/INFO] [FML]: Unloading dimension 0 [22:14:57] [Server thread/INFO] [FML]: Unloading dimension -1 [22:14:57] [Server thread/INFO] [FML]: Unloading dimension 1 [22:14:57] [Server thread/INFO] [FML]: Applying holder lookups [22:14:57] [Server thread/INFO] [FML]: Holder lookups applied [22:14:57] [Server thread/INFO] [FML]: The state engine was in incorrect state SERVER_STOPPING and forced into state SERVER_STOPPED. Errors may have been discarded. [22:14:57] [Client thread/INFO] [FML]: Server terminated. [22:14:57] [Client Shutdown Thread/INFO]: Stopping server [22:14:57] [Client Shutdown Thread/INFO]: Saving players AL lib: (EE) alc_cleanup: 1 device not closed Process finished with exit code -1 Thanks for any help!
  21. Hi All, Trying to get an animal called a Brian to spawn in my mod. I've been working on 1.11 and set my mod up based on MrCrayfish and Mcjty's tutorials. I followed their setup and have created the mob (as guided by Mcjty) and it's not spawning and there is no egg appearing in the misc tab in Creative Mode. I'm not sure what I've done wrong here. Here's my EntityBrian.java code: package org.educraft.brianface.entityclasses; import net.minecraft.block.Block; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EnumCreatureType; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.*; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Biomes; import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.datafix.DataFixer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.EntityRegistry; import org.educraft.brianface.Reference; import org.educraft.brianface.init.ModItems; import javax.annotation.Nullable; public class EntityBrian extends EntityAnimal { public static final ResourceLocation LOOT = new ResourceLocation(Reference.MOD_ID, "entities/brian"); public EntityBrian(World worldIn) { super(worldIn); this.setSize(0.6F, 1.95F); } public static void registerFixesBrian(DataFixer fixer) { EntityLiving.registerFixesMob(fixer, EntityBrian.class); } @Override protected void entityInit() { super.entityInit(); } @Override protected void initEntityAI() { this.tasks.addTask(0, new EntityAISwimming(this)); this.tasks.addTask(3, new EntityAITempt(this, 1.0D, ModItems.brapple, false)); this.tasks.addTask(4, new EntityAIPanic(this, 2.0D)); this.tasks.addTask(5, new EntityAIMate(this, 1.0D)); this.tasks.addTask(7, new EntityAIFollowParent(this, 1.25D)); this.tasks.addTask(8, new EntityAIWanderAvoidWater(this, 1.0D)); this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); this.tasks.addTask(10, new EntityAILookIdle(this)); this.applyEntityAI(); } @Override protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(5.0D); this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(1.0D); } private void applyEntityAI() { this.tasks.addTask(6, new EntityAIMoveThroughVillage(this, 1.0D, true)); } public static void RegisterEntity() { //EntityRegistry.registerModEntity(EntityBrian.class, "Brian", EntityBrian.getEntityId(), Main.instance); EntityRegistry.addSpawn(EntityBrian.class, 25, 1, 5, EnumCreatureType.CREATURE, Biomes.FOREST); } protected void playStepSound(BlockPos pos, Block blockIn) { this.playSound(SoundEvents.BLOCK_ANVIL_STEP, 0.15F, 1.0F); } protected float getSoundVolume() { return 0.2F; } World worldIn; EntityPlayer playerIn; public boolean processInteract(EntityPlayer player, EnumHand hand) { ItemStack itemstack = player.getHeldItem(hand); EntityBrian entity; if (itemstack.getItem() == ModItems.brapple && !player.capabilities.isCreativeMode) { itemstack.shrink(1); EntityItem brian_poo = new EntityItem(worldIn, playerIn.posX, playerIn.posY, playerIn.posZ, new ItemStack(ModItems.brian_poo)); return true; } else { return super.processInteract(player, hand); } } public EntityBrian createChild(EntityAgeable ageable) { return new EntityBrian(this.world); } public float getEyeHeight() { return this.isChild() ? this.height : 0.6F; } @Override @Nullable protected ResourceLocation getLootTable(){ return LOOT; } @Override public int getMaxSpawnedInChunk(){ return 8; } } Here's my ModelBrian.java code: package org.educraft.brianface.modelclasses; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; /** * Created by admiralmattbar on 5/14/2017. */ // Date: 5/14/2017 3:28:20 PM // Template version 1.1 // Java generated by Techne // Keep in mind that you still need to fill in some blanks // - ZeuX public class ModelBrian extends ModelBase { //fields ModelRenderer head; ModelRenderer body; ModelRenderer rightarm; ModelRenderer leftarm; ModelRenderer rightleg; ModelRenderer leftleg; public ModelBrian() { textureWidth = 64; textureHeight = 32; head = new ModelRenderer(this, 0, 0); head.addBox(-4F, -8F, -4F, 8, 8, 8); head.setRotationPoint(0F, 0F, 0F); head.setTextureSize(64, 32); head.mirror = true; setRotation(head, 0F, 0F, 0F); body = new ModelRenderer(this, 16, 16); body.addBox(-4F, 0F, -2F, 8, 12, 4); body.setRotationPoint(0F, 0F, 0F); body.setTextureSize(64, 32); body.mirror = true; setRotation(body, 0F, 0F, 0F); rightarm = new ModelRenderer(this, 40, 16); rightarm.addBox(-3F, -2F, -2F, 4, 12, 4); rightarm.setRotationPoint(-5F, 2F, 0F); rightarm.setTextureSize(64, 32); rightarm.mirror = true; setRotation(rightarm, 0F, 0F, 0F); leftarm = new ModelRenderer(this, 40, 16); leftarm.addBox(-1F, -2F, -2F, 4, 12, 4); leftarm.setRotationPoint(5F, 2F, 0F); leftarm.setTextureSize(64, 32); leftarm.mirror = true; setRotation(leftarm, 0F, 0F, 0F); rightleg = new ModelRenderer(this, 0, 16); rightleg.addBox(-2F, 0F, -2F, 4, 12, 4); rightleg.setRotationPoint(-2F, 12F, 0F); rightleg.setTextureSize(64, 32); rightleg.mirror = true; setRotation(rightleg, 0F, 0F, 0F); leftleg = new ModelRenderer(this, 0, 16); leftleg.addBox(-2F, 0F, -2F, 4, 12, 4); leftleg.setRotationPoint(2F, 12F, 0F); leftleg.setTextureSize(64, 32); leftleg.mirror = true; setRotation(leftleg, 0F, 0F, 0F); } public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { super.render(entity, f, f1, f2, f3, f4, f5); //setRotationAngles(f, f1, f2, f3, f4, f5); head.render(f5); body.render(f5); rightarm.render(f5); leftarm.render(f5); rightleg.render(f5); leftleg.render(f5); } private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) { super.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor, entityIn); } } Here's my RenderBrian.java code package org.educraft.brianface.renderer.entity; import jdk.nashorn.internal.runtime.regexp.JoniRegExp; import net.minecraft.client.model.ModelCow; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderLiving; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.passive.EntityCow; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.client.registry.IRenderFactory; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.educraft.brianface.entityclasses.EntityBrian; import org.educraft.brianface.modelclasses.ModelBrian; import javax.annotation.Nonnull; import javax.annotation.Nullable; @SideOnly(Side.CLIENT) public class RenderBrian extends RenderLiving<EntityBrian> { private ResourceLocation BRIAN_TEXTURE = new ResourceLocation("bm:textures/entity/brian/brian.png"); public static final Factory FACTORY = new Factory(); public RenderBrian(RenderManager rendermanagerIn) { super(rendermanagerIn, new ModelBrian(), 0.5F); } @Nullable @Override protected ResourceLocation getEntityTexture(@Nonnull EntityBrian enttiy) { return BRIAN_TEXTURE; } public static class Factory implements IRenderFactory<EntityBrian> { @Override public Render<? super EntityBrian> createRenderFor(RenderManager manager) { return new RenderBrian(manager); } } } Here's my ModEntities.java code: package org.educraft.brianface.entityclasses; import net.minecraft.entity.EnumCreatureType; import net.minecraft.init.Biomes; import net.minecraft.util.ResourceLocation; import net.minecraft.world.storage.loot.LootTableList; import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.common.registry.EntityRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.educraft.brianface.Main; import org.educraft.brianface.Reference; import org.educraft.brianface.renderer.entity.RenderBrian; public class ModEntities { public static void init(){ //Mod ID numbers int id = 1; EntityRegistry.registerModEntity(new ResourceLocation(Reference.MOD_ID, "brian"), EntityBrian.class, "Brian", id++, Main.instance, 64, 3, true, 0xfaf77f, 0x2dd1f1); EntityRegistry.addSpawn(EntityBrian.class, 100, 3, 5, EnumCreatureType.CREATURE, Biomes.PLAINS, Biomes.ICE_PLAINS, Biomes.FOREST, Biomes.FOREST_HILLS); LootTableList.register(EntityBrian.LOOT); } @SideOnly(Side.CLIENT) public static void initModels() { RenderingRegistry.registerEntityRenderingHandler(EntityBrian.class, RenderBrian.FACTORY); } } And here's my json file for the loot table under assets.brianface.loot_tables.entities { "pools": [ { "name": "brianface:brian", "rolls": 1, "entries": [ { "type": "item", "name": "brianface:brapple", "weight": 1, "functions": [ { "function": "set_count", "count": { "min": 0, "max": 2 } }, { "function": "looting_enchant", "count": { "min": 0, "max": 1 } } ] } ] }, { "name": "brianface:brian", "conditions": [ { "condition": "killed_by_player" }, { "condition": "random_chance_with_looting", "chance": 0.05, "looting_multiplier": 0.01 } ], "rolls": 1, "entries": [ { "type": "item", "name": "brianface:raw_brian", "weight": 1 } ] } ] } I'm trying real hard here to find out what I did wrong. I run the initModels() class from ModEntities in the CommonProxy class as well. Any help would be appreciated.
  22. You are correct in that I did not intend to make 2 identical topics. Thanks! I'll look into the raytrace stuff. Thanks!
  23. This is my class I use for ore generation. Basically, it takes a block that you make and has it generate in your world. package org.gardenstreetacademy.cool.worldgen; import java.util.Random; import org.gardenstreetacademy.cool.init.ModBlocks; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkGenerator; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.feature.WorldGenMinable; import net.minecraft.world.gen.feature.WorldGenerator; import net.minecraftforge.fml.common.IWorldGenerator; public class ModWorldGen implements IWorldGenerator { private WorldGenerator gen_example; public ModWorldGen() { this.gen_example = new WorldGenMinable(ModBlocks.example_block.getDefaultState(),12); } @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { switch (world.provider.getDimension()) { case 0: //Overworld //this.modOreGenerator(this.gen_example, world, random, chunkX, chunkZ, 100, 0, 128); break; case -1: //Nether break; case 1: //End break; } } private void modOreGenerator(WorldGenerator generator, World world, Random rand, int chunk_X, int chunk_Z, int chancesToSpawn, int minHeight, int maxHeight) { if (minHeight < 0 || maxHeight > 256 || minHeight > maxHeight) throw new IllegalArgumentException("Illegal Height Arguments for WorldGenerator"); int heightDiff = maxHeight - minHeight + 1; for (int i = 0; i < chancesToSpawn; i ++) { int x = chunk_X * 16 + rand.nextInt(16); int y = minHeight + rand.nextInt(heightDiff); int z = chunk_Z * 16 + rand.nextInt(16); generator.generate(world, rand, new BlockPos(x, y, z)); } } public static int getGroundFromAbove(World world, int x, int z){ int y = 255; boolean foundGround = false; while(!foundGround && y-- >=0){ Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); foundGround = blockAt == Blocks.DIRT || blockAt == Blocks.GRASS; } return y; } }
×
×
  • Create New...

Important Information

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