Jump to content

Recommended Posts

Posted

I made colored clay blocks this is the class:

public class BlockStainedClay extends BlockBase{
	
	public Item itemdrop;

	public BlockStainedClay(Item drop, Material blockMaterialIn, MapColor blockMapColorIn, String name) {
		super(blockMaterialIn, blockMapColorIn, name);
		
		
		itemdrop = drop;
		setHardness(0.6F);
		setSoundType(SoundType.GROUND);
		
		
	}
	@Override
	public Item getItemDropped(IBlockState state, Random rand, int fortune)
    {
        return itemdrop;
    }

    @Override
    public int quantityDropped(Random random)
    {
        return 4;
    }

}

I assigned the same material as for the minecraft clayblock and the same hardness, still my block seems te be harder as the vanilla 1? How is this posseble?

Posted

BlockBase is an antipattern, do not use it.

 

36 minutes ago, winnetrie said:

Item drop

Passing an item to the constructor of the block indicates to me that there are many things horribly wrong with your code since item registry event fires after the block one and as such your items must be instantinated after your blocks, which means one of two things - either you are using static initializers in which case don't and instantinate your things in the appropriate registry event or you are passing null to the drop item.

 

What material are you passing to the block and what are you mining the block with? Consider that if the block is not mined by the correct tool and the tool is required to mine it then it will take a while to break it.

Posted
3 minutes ago, V0idWa1k3r said:

What material are you passing to the block and what are you mining the block with? Consider that if the block is not mined by the correct tool and the tool is required to mine it then it will take a while to break it.

I'm passing Material.CLAY and i'm mining it with the shovel. It should behave like the minecraft clayblock.

The minecraft clayblock has it's hardness set to 0.6, i have to set it to 0.1 to get the same result.

 

Can you explaine more about "BlockBase is an antipattern"?

 

How would i pass the correct item to this method?

public Item getItemDropped(IBlockState state, Random rand, int fortune)
    {
        return itemdrop;
    }

I can't directly say what item it has to be, because i use the same class to create 16 different blocks and they all need a different itemdrop.

Yes i use static initializers. My class looks like this:

public class ModBlocks {
	
	public static final List<Block> BLOCKS = new ArrayList<Block>();
	public static final List<ItemBlock> ITEMBLOCKS = new ArrayList<ItemBlock>();
	
	//Creating terracotta bricks
	public static final Block WHITE_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.WHITE_STAINED_HARDENED_CLAY, "white_terracotta_bricks");
	public static final Block ORANGE_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.ORANGE_STAINED_HARDENED_CLAY, "orange_terracotta_bricks");
	public static final Block MAGENTA_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.MAGENTA_STAINED_HARDENED_CLAY, "magenta_terracotta_bricks");
	public static final Block LIGHT_BLUE_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.LIGHT_BLUE_STAINED_HARDENED_CLAY, "light_blue_terracotta_bricks");
	public static final Block YELLOW_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.YELLOW_STAINED_HARDENED_CLAY, "yellow_terracotta_bricks");
	public static final Block LIME_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.LIME_STAINED_HARDENED_CLAY, "lime_terracotta_bricks");
	public static final Block PINK_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.PINK_STAINED_HARDENED_CLAY, "pink_terracotta_bricks");
	public static final Block GRAY_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.GRAY_STAINED_HARDENED_CLAY, "gray_terracotta_bricks");
	public static final Block SILVER_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.SILVER_STAINED_HARDENED_CLAY, "silver_terracotta_bricks");
	public static final Block CYAN_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.CYAN_STAINED_HARDENED_CLAY, "cyan_terracotta_bricks");
	public static final Block PURPLE_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.PURPLE_STAINED_HARDENED_CLAY, "purple_terracotta_bricks");
	public static final Block BLUE_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.BLUE_STAINED_HARDENED_CLAY, "blue_terracotta_bricks");
	public static final Block BROWN_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.BROWN_STAINED_HARDENED_CLAY, "brown_terracotta_bricks");
	public static final Block GREEN_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.GREEN_STAINED_HARDENED_CLAY, "green_terracotta_bricks");
	public static final Block RED_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.RED_STAINED_HARDENED_CLAY, "red_terracotta_bricks");
	public static final Block BLACK_TERRACOTTA_BRICKS = new BlockTerracotta(Material.ROCK, MapColor.BLACK_STAINED_HARDENED_CLAY, "black_terracotta_bricks");
	
	
	
	//Creating stained clay blocks
	public static final Block WHITE_STAINED_CLAY = new BlockStainedClay(ModItems.WHITE_STAINED_CLAYBALL, Material.CLAY, MapColor.WHITE_STAINED_HARDENED_CLAY, "white_stained_clay");
	public static final Block ORANGE_STAINED_CLAY = new BlockStainedClay(ModItems.ORANGE_STAINED_CLAYBALL, Material.CLAY, MapColor.ORANGE_STAINED_HARDENED_CLAY, "orange_stained_clay");
	public static final Block MAGENTA_STAINED_CLAY = new BlockStainedClay(ModItems.MAGENTA_STAINED_CLAYBALL, Material.CLAY, MapColor.MAGENTA_STAINED_HARDENED_CLAY, "magenta_stained_clay");
	public static final Block LIGHT_BLUE_STAINED_CLAY = new BlockStainedClay(ModItems.LIGHT_BLUE_STAINED_CLAYBALL, Material.CLAY, MapColor.LIGHT_BLUE_STAINED_HARDENED_CLAY, "light_blue_stained_clay");
	public static final Block YELLOW_STAINED_CLAY = new BlockStainedClay(ModItems.YELLOW_STAINED_CLAYBALL, Material.CLAY, MapColor.YELLOW_STAINED_HARDENED_CLAY, "yellow_stained_clay");
	public static final Block LIME_STAINED_CLAY = new BlockStainedClay(ModItems.LIME_STAINED_CLAYBALL, Material.CLAY, MapColor.LIME_STAINED_HARDENED_CLAY, "lime_stained_clay");
	public static final Block PINK_STAINED_CLAY = new BlockStainedClay(ModItems.PINK_STAINED_CLAYBALL, Material.CLAY, MapColor.PINK_STAINED_HARDENED_CLAY, "pink_stained_clay");
	public static final Block GRAY_STAINED_CLAY = new BlockStainedClay(ModItems.GRAY_STAINED_CLAYBALL, Material.CLAY, MapColor.GRAY_STAINED_HARDENED_CLAY, "gray_stained_clay");
	public static final Block SILVER_STAINED_CLAY = new BlockStainedClay(ModItems.SILVER_STAINED_CLAYBALL, Material.CLAY, MapColor.SILVER_STAINED_HARDENED_CLAY, "silver_stained_clay");
	public static final Block CYAN_STAINED_CLAY = new BlockStainedClay(ModItems.CYAN_STAINED_CLAYBALL, Material.CLAY, MapColor.CYAN_STAINED_HARDENED_CLAY, "cyan_stained_clay");
	public static final Block PURPLE_STAINED_CLAY = new BlockStainedClay(ModItems.PURPLE_STAINED_CLAYBALL, Material.CLAY, MapColor.PURPLE_STAINED_HARDENED_CLAY, "purple_stained_clay");
	public static final Block BLUE_STAINED_CLAY = new BlockStainedClay(ModItems.BLUE_STAINED_CLAYBALL, Material.CLAY, MapColor.BLUE_STAINED_HARDENED_CLAY, "blue_stained_clay");
	public static final Block BROWN_STAINED_CLAY = new BlockStainedClay(ModItems.BROWN_STAINED_CLAYBALL, Material.CLAY, MapColor.BROWN_STAINED_HARDENED_CLAY, "brown_stained_clay");
	public static final Block GREEN_STAINED_CLAY = new BlockStainedClay(ModItems.GREEN_STAINED_CLAYBALL, Material.CLAY, MapColor.GREEN_STAINED_HARDENED_CLAY, "green_stained_clay");
	public static final Block RED_STAINED_CLAY = new BlockStainedClay(ModItems.RED_STAINED_CLAYBALL, Material.CLAY, MapColor.RED_STAINED_HARDENED_CLAY, "red_stained_clay");
	public static final Block BLACK_STAINED_CLAY = new BlockStainedClay(ModItems.BLACK_STAINED_CLAYBALL, Material.CLAY, MapColor.BLACK_STAINED_HARDENED_CLAY, "black_stained_clay");
}

So that's not how it supposed to be? I'm a bit confused now.

Posted
5 minutes ago, winnetrie said:

Yes i use static initializers

Well, don't. Static initializers are bad since you can't control the order in which your classes are loaded and thus your objects are instantinated which leads to a multitude of issues.

 

7 minutes ago, winnetrie said:

Can you explaine more about "BlockBase is an antipattern"?

 

BlockBase and alike abuse inheritance to simplify instantination which is not what inheritance is for. You can use a helper method that does the same but won't require your block to extend a BlockBase. All basic functionality is already included in the Block class, so there is no need for another layer of BlockBase. Additionally minecraft uses instanceof checks in many places which will be an issue to you if you are using a BlockBase class for things when you need to add new blocks which can't be an instance of BlockBase.

 

10 minutes ago, winnetrie said:

I can't directly say what item it has to be, because i use the same class to create 16 different blocks and they all need a different itemdrop.

 

You can use a switch statement, or if you want to use this one class for a lot of different instances then you can add a ResourceLocation to the constructor that would point to the registry name of your item and get the item from the registry on demand(probably caching it after doing so).

 

13 minutes ago, winnetrie said:

I'm passing Material.CLAY and i'm mining it with the shovel. It should behave like the minecraft clayblock.

 The minecraft clayblock has it's hardness set to 0.6, i have to set it to 0.1 to get the same result.

I am not sure then. Could you provide a link to your github repository so I can debug this issue locally?

Posted

Well if i shouldn't use static initializers, how do i do it right then?

My BlockBase class extends on Block, so there shouldn't be an issue for instanceof Block, because it is.

If i can't make my own class that extends on Block, then i have no clue how i would add and override stuff....

 

 

I'll try with a resourcelocation in the constructor.

 

Sorry no github, i have an account there but don't know how to use it

Posted
21 minutes ago, winnetrie said:

Well if i shouldn't use static initializers, how do i do it right then?

Inside the registry event.

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.

Posted (edited)
3 hours ago, winnetrie said:

My BlockBase class extends on Block, so there shouldn't be an issue for instanceof Block, because it is.

He meant that if you extends BlockBase, you cannot extends other actually useful classes like BlockStairs or something.

Composition over inheritance; do not use inheritance for writing less code at the cost of potentially messing up the entire structure of your code.

Edited by DavidM

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Posted
7 hours ago, DavidM said:

He meant that if you extends BlockBase, you cannot extends other actually useful classes like BlockStairs or something.

Composition over inheritance; do not use inheritance for writing less code at the cost of potentially messing up the entire structure of your code.

Oh i see, but i usually create a BlockBaseStair in that case and then use that to extends all my stairs..

Well, but then again you are right about it. It only has a few extra lines of code.

I removed that class now.

Posted
11 hours ago, Draco18s said:

Inside the registry event.

So does that mean i do not need to create fields for my blocks. because we just use the registry to get the blocks/items?

 

I do add my blocks to a list inside their class like this:

ModBlocks.BLOCKS.add(this);

The list is in another class called ModBlocks and looks like this:

public static final List<Block> BLOCKS = new ArrayList<Block>();

So i guess i can't use that anymore.

Perhaps it was a bad concept anyway.

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.

Announcements



×
×
  • Create New...

Important Information

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