Jump to content

admiralmattbar

Members
  • Posts

    44
  • Joined

  • Last visited

Converted

  • Gender
    Undisclosed
  • Personal Text
    I am new!

Recent Profile Visitors

8899 profile views

admiralmattbar's Achievements

Tree Puncher

Tree Puncher (2/8)

0

Reputation

  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.
×
×
  • Create New...

Important Information

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