Posted July 27, 20196 yr So I've been using this tutorial to start creating a mod. I want to create an ore, but there's two issues that I have. The main issue I have is that I don't know what method to override so I can have the block drop xp. Other than that, I have a method so that the ore drops a random amount of items. However, it's not affected by fortune enchantments, and I'm don't know exactly how fortune enchantments work (like if they multiply the quantity, add onto the quantity, etc). Here is the code for my ore so far: public class AmethystOre extends BlockBase { public AmethystOre(String name, Material material) { super(name, material); setSoundType(SoundType.STONE); setHardness(3.0f); setResistance(15.0f); setHarvestLevel("pickaxe",1); setLightLevel(0.0f); //setLightOpacity(1); for glass blocks //setBlockUnbreakable(); } @Override public Item getItemDropped(IBlockState state, Random rand, int fortune) { return ModItems.AMETHYST; } @Override public int quantityDropped(Random rand) { int max = 5; int min = 2; return rand.nextInt(max)+min; } } Here is the code for BlockBase: public class BlockBase extends Block implements IHasModel { public BlockBase(String name, Material material) { super(material); setUnlocalizedName(name); setRegistryName(name); setCreativeTab(CreativeTabs.BUILDING_BLOCKS); ModBlocks.BLOCKS.add(this); ModItems.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName())); } @Override public void registerModels() { Main.proxy.registerItemRenderer(Item.getItemFromBlock(this), 0, "inventory"); } } I've omitted imports because the only things imported so far seem to be the main method and the random class. Are there any additional things I should import?
July 27, 20196 yr 32 minutes ago, SeptemberBlue said: So I've been using this tutorial Ok first thing after looking over your code I have determined that it isn't a good tutorial. So I don't recommend you keep using it. 33 minutes ago, SeptemberBlue said: implements IHasModel Remove this entirely from your workspace. And instead replace wherever you have <variable>.registerModels(); With Main.proxy.registerItemRenderer(item, 0, "inventory"); If you have any custom item models later do that manually. 35 minutes ago, SeptemberBlue said: public class BlockBase This is also bad remove it. Also if you have an ItemBase remove that too. 37 minutes ago, SeptemberBlue said: However, it's not affected by fortune enchantments, and I'm don't know exactly how fortune enchantments work (like if they multiply the quantity, add onto the quantity, etc). The math for fortune is in BlockOre#quantityDroppedWithBonus this is also the method you should use to apply fortune. 38 minutes ago, SeptemberBlue said: The main issue I have is that I don't know what method to override so I can have the block drop xp. The method to use is Block#getExpDrop and once again you can find an example in BlockOre#getExpDrop VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
July 27, 20196 yr Author 16 minutes ago, Animefan8888 said: Ok first thing after looking over your code I have determined that it isn't a good tutorial. So I don't recommend you keep using it. Remove this entirely from your workspace. And instead replace wherever you have <variable>.registerModels(); With Main.proxy.registerItemRenderer(item, 0, "inventory"); If you have any custom item models later do that manually. This is also bad remove it. Also if you have an ItemBase remove that too. The math for fortune is in BlockOre#quantityDroppedWithBonus this is also the method you should use to apply fortune. The method to use is Block#getExpDrop and once again you can find an example in BlockOre#getExpDrop So I have two more questions. First off, why is having a class like block base bad? Personally, I think it'd be easier to modify it so that instead of having to create a new class for each block, I would just give the base class some values and it would set the block. Or is it because you couldn't give those blocks any special events? My point is that I fail to see the issue. Second, I don't get the Block# thing. I'm not sure what I'm supposed to do to find it (I've also barely used eclipse, which is what I'm using to make this mod). What does it mean, and how do I find it? EDIT: Anyway, since the tutorial I've used isn't any good, is there a good tutorial that I could follow in order to improve my current code? EDIT 2: So I deleted the "implements IHasModel" portion, alongside the registerModels method. However, I think that was the only portion of code that actually registered the model, because I don't see any other area in which " <variable>.registerModels() " would be called. With that said, where should I call it? Edited July 27, 20196 yr by SeptemberBlue wanted to add something, but didn't want to add an additional comment.
July 27, 20196 yr 14 minutes ago, SeptemberBlue said: Anyway, since the tutorial I've used isn't any good, is there a good tutorial that I could follow in order to improve my current code? You could look at these I made these 2 years ago for 1.10. Not much of the basic stuff changed between 1.10 and 1.12. 14 minutes ago, SeptemberBlue said: First off, why is having a class like block base bad? It's the idea of composition over inheritance. You don't need to make a new class for each Block. You can just do new Block(Material.ROCK).setUnlocalizedName("modid:name").setRegistryName("modid:name").setCreativeTab(CreativeTabs.BUILDING_BLOCKS); But in your case you can make a class for your ores. Like vanilla's BlockOre class. 14 minutes ago, SeptemberBlue said: Second, I don't get the Block# thing. Block is the class and the # means that the following thing after it requires a field of the class type. IE Blocks.DIAMOND_ORE.getItem(...) instead of Block.getItem(...). 14 minutes ago, SeptemberBlue said: What does it mean, and how do I find it? Go to the BlockOre class. Which you can find by typing BlockOre and ctrl+left clicking on the name. Or by looking in the forge source file in the eclipse file explorer. Then find the methods with the names I gave you. Edited July 27, 20196 yr by Animefan8888 VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
July 27, 20196 yr Author 1 minute ago, Animefan8888 said: You could look at these I made these 2 years ago for 1.10. Not much of the basic stuff changed between 1.10 and 1.12. It's the idea of composition over inheritance. You don't need to make a new class for each Block. You can just do new Block(Material.ROCK).setUnlocalizedName("modid:name").setRegistryName("modid:name"); But in your case you can make a class for your ores. Like vanilla's BlockOre class. Block is the class and the # means that the following thing after it requires a field of the class type. IE Blocks.DIAMOND_ORE.getItem(...) instead of Block.getItem(...). Go to the BlockOre class. Which you can find by typing BlockOre and ctrl+left clicking on the name. Or by looking in the forge source file in the eclipse file explorer. Then find the methods with the names I gave you. (I'm not really sure how to quote certain sections of a comment, but for reference, I'm referring to the latter portion) In my eclipse project, I only see the resources for my mod, so where am I supposed to find the forge source file? So my mod is in a folder. Assuming that all mod folders are the same, where would I have to go to find the forge source file? Or is it not included in the mod folder?
July 27, 20196 yr Just now, SeptemberBlue said: (I'm not really sure how to quote certain sections of a comment, but for reference, I'm referring to the latter portion) You highlight it and it should give you the option to quote the selection. 1 minute ago, SeptemberBlue said: In my eclipse project, I only see the resources for my mod, so where am I supposed to find the forge source file? VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
July 27, 20196 yr Author Alright, so I've found those files, that's good. I just don't know what to do with those methods. Do I override them or do I call them? If the latter is true, where? Also, while my block appears to render just fine when placed, is missing its item texture. What am I supposed to do about that?
July 28, 20196 yr 3 minutes ago, SeptemberBlue said: Do I override them or do I call them? Override them. 3 minutes ago, SeptemberBlue said: Also, while my block appears to render just fine when placed, is missing its item texture. What am I supposed to do about that? That's a different issue. Do you have a item model file for it? Do you register the models for it. VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
July 28, 20196 yr Author Just now, Animefan8888 said: That's a different issue. Do you have a item model file for it? Do you register the models for it. So remember when you said to delete the IHasModel implementation? There was a method connected to that implementation, and that was where the model was registered. I'm not sure where else I'm supposed to register it.
July 28, 20196 yr Just now, SeptemberBlue said: I'm not sure where else I'm supposed to register it. You should have a ModelRegistryEvent and you need to do it there. VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
July 28, 20196 yr Author 23 minutes ago, Animefan8888 said: You should have a ModelRegistryEvent and you need to do it there. Where do I find an example of this? On another note, I was having trouble with this code (for items, wanted to add the ore item): public class ModItems { public static final List<Item> ITEMS = new ArrayList<Item>(); public static final Item AMETHYST = new Item().setUnlocalizedName("amethyst").setRegistryName("amethyst").setCreativeTab(CreativeTabs.MATERIALS); ITEMS.add(AMETHYST); } ITEMS doesn't need to be final, does it? Because I'm trying to add the amethyst item to it, but it won't compile. EDIT: Almost forgot my current code for the ore: public class AmethystOre extends Block { public AmethystOre(String name, Material material) { super(material); setUnlocalizedName(name); setRegistryName(name); setCreativeTab(CreativeTabs.BUILDING_BLOCKS); ModBlocks.BLOCKS.add(this); ModItems.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName())); setHardness(3.0f); setResistance(15.0f); setHarvestLevel("pickaxe",1); setLightLevel(0.0f); //setLightOpacity(1); for glass blocks //setBlockUnbreakable(); } @Override public Item getItemDropped(IBlockState state, Random rand, int fortune) { return ModItems.AMETHYST; } @Override public int quantityDropped(Random rand) { int max = 5; int min = 2; return rand.nextInt(max)+min; } @Override public int quantityDroppedWithBonus(int fortune, Random random) { if (fortune > 0 && Item.getItemFromBlock(this) != this.getItemDropped((IBlockState)this.getBlockState().getValidStates().iterator().next(), random, fortune)) { int i = random.nextInt(fortune + 2) - 1; if (i < 0) { i = 0; } return this.quantityDropped(random) * (i + 1); } else { return this.quantityDropped(random); } } } Edited July 28, 20196 yr by SeptemberBlue
July 28, 20196 yr Don't call new from a static location. You must do it from a Forge controlled event (such as the Register<Item> event handler) or setRegistryName won't work properly. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
July 28, 20196 yr 26 minutes ago, SeptemberBlue said: ITEMS.add(AMETHYST); You can't do this. This is against the Java syntax. VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
July 28, 20196 yr Author Given that the tutorial I followed appears to have several errors, I've basically deleted all of my code and am rewriting it based on Animefan8888's tutorial. I'll just post something when I have everything set up to a point and still have questions.
July 28, 20196 yr Or if you'd like, I condensed item and block registration down to several helper methods. https://github.com/Draco18s/ReasonableRealism/blob/1.12.1/src/main/java/com/draco18s/hardlib/EasyRegistry.java Note that this class (and another) act as Proxy and Client Proxy, though I've done away with this in 1.13+ (note that I'm still refining things in that branch). Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
July 28, 20196 yr Author Ok, so I've followed the tutorial to a point, since its outdated. Now I'm a little stuck for my ModItems class. public class ModItems { public static final List<Item> ITEMS = new ArrayList<Item>(); public static void init() { new ModItem("Amethyst"); register(); } public static void register() { for (Item item:ITEMS) { Main.proxy.registerItemRenderer(item, 0, "inventory"); } } } I'm not even sure if this would work. My problem with it now though is that I don't have a registerItemRenderer method. The tutorial I was following put it in a common proxy class, but I don't have that class (instead use server proxy). So where should I define the method? EDIT: Alright, defined it. Only issue is that my item doesn't show up at all. Any idea why? Edited July 28, 20196 yr by SeptemberBlue
July 28, 20196 yr You probably aren't registering it in a RegistryEvent.Register<Item> handler. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
July 28, 20196 yr 17 minutes ago, SeptemberBlue said: EDIT: Alright, defined it. Only issue is that my item doesn't show up at all. Any idea why? This is definitely the case. 17 minutes ago, SeptemberBlue said: EDIT: Alright, defined it. Only issue is that my item doesn't show up at all. Any idea why? I forgot that 1.10 didn't have the Registry events yet. So therefore its mostly useless. VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
July 28, 20196 yr Just now, Animefan8888 said: I forgot that 1.10 didn't have the Registry events yet. So therefore its mostly useless. He's on 1.12 Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
July 28, 20196 yr Just now, Draco18s said: He's on 1.12 Yeah I linked him my old tutorial for 1.10 that I had started. VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
July 28, 20196 yr Author I'm going to go back to that tutorial I was using earlier and redo the registry class it had, since I'm pretty sure that had worked.
July 28, 20196 yr You need this function: https://github.com/Draco18s/ReasonableRealism/blob/1.12.1/src/main/java/com/draco18s/hardlib/EasyRegistry.java#L194-L197 Register your items in it Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
July 28, 20196 yr Author 5 minutes ago, Draco18s said: You need this function: https://github.com/Draco18s/ReasonableRealism/blob/1.12.1/src/main/java/com/draco18s/hardlib/EasyRegistry.java#L194-L197 Register your items in it There is a lot of code there, and I don't need to use all of it. I was using this so far. @EventBusSubscriber public class RegistryHandler { @SubscribeEvent public static void onItemRegister(RegistryEvent.Register<Item> event) { event.getRegistry().registerAll(ModItems.ITEMS.toArray(new Item[0])); } @SubscribeEvent public static void onModelRegister(ModelRegistryEvent event) { for (Item item:ModItems.ITEMS) { if (item instanceOf ) } } } However, I stopped by the for loop, since it was going to check if "item instanceOf IHasModel", and I'm pretty sure that was something you shouldn't do. Is there a specific chunk from that code that I can use in place of what I currently have? I don't want to just copy and paste the entire thing because that seems like a hassle.
July 28, 20196 yr 1 minute ago, SeptemberBlue said: However, I stopped by the for loop, since it was going to check if "item instanceOf IHasModel", and I'm pretty sure that was something you shouldn't do. Is there a specific chunk from that code that I can use in place of what I currently have? I don't want to just copy and paste the entire thing because that seems like a hassle Yes do ModelLoader.setCustomModelLocation(item, 0, new ModelResourceLocation(item.getRegistryName()); inside the for loop. VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
July 28, 20196 yr You also don't need the item instanceof check. All the information neccessary is already available from Item directly. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
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.