winnetrie Posted April 8, 2019 Posted April 8, 2019 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? Quote Try out my new Modpack for MC 1.15.2 https://www.curseforge.com/minecraft/modpacks/terran-civilization
V0idWa1k3r Posted April 8, 2019 Posted April 8, 2019 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. Quote
winnetrie Posted April 8, 2019 Author Posted April 8, 2019 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. Quote Try out my new Modpack for MC 1.15.2 https://www.curseforge.com/minecraft/modpacks/terran-civilization
V0idWa1k3r Posted April 8, 2019 Posted April 8, 2019 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? Quote
winnetrie Posted April 8, 2019 Author Posted April 8, 2019 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 Quote Try out my new Modpack for MC 1.15.2 https://www.curseforge.com/minecraft/modpacks/terran-civilization
Draco18s Posted April 8, 2019 Posted April 8, 2019 21 minutes ago, winnetrie said: Well if i shouldn't use static initializers, how do i do it right then? Inside the registry event. Quote 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.
DavidM Posted April 9, 2019 Posted April 9, 2019 (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 April 9, 2019 by DavidM Quote 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.
winnetrie Posted April 9, 2019 Author Posted April 9, 2019 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. Quote Try out my new Modpack for MC 1.15.2 https://www.curseforge.com/minecraft/modpacks/terran-civilization
winnetrie Posted April 9, 2019 Author Posted April 9, 2019 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. Quote Try out my new Modpack for MC 1.15.2 https://www.curseforge.com/minecraft/modpacks/terran-civilization
Recommended Posts
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.