Jump to content

[1.12.2] Trying to create an ore.


SeptemberBlue

Recommended Posts

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?

Link to comment
Share on other sites

  • Replies 53
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

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.

Link to comment
Share on other sites

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 by SeptemberBlue
wanted to add something, but didn't want to add an additional comment.
Link to comment
Share on other sites

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 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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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?

temp.png.a0d2351b0b46fc7cfda991b4ada343c1.png

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by SeptemberBlue
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by SeptemberBlue
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

5 minutes ago, Draco18s said:

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.




×
×
  • Create New...

Important Information

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