Posted September 7, 20196 yr Hi, I've come back to coding once again and Everything seems to go swell Except when I tried making a crop. It's similar enough to Reeds but slightly different. The Error in question is java.lang.IllegalArgumentException: Cannot set property PropertyInteger{name=age, clazz=class java.lang.Integer, values=[0, 1, 2, 3, 4, 5, 6, 7]} as it does not exist in BlockStateContainer{block=minecraft:air, properties=[age]} my Base Crop class where all my crops are based on this class Spoiler package com.cyadrogen.wc.blocks; import java.util.Random; import com.cyadrogen.wc.WC; import com.cyadrogen.wc.init.WcBlocks; import com.cyadrogen.wc.init.WcItems; import net.minecraft.block.Block; import net.minecraft.block.BlockCrops; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.item.ItemBlock; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.EnumPlantType; import net.minecraftforge.common.IPlantable; public class WcBlockCropBase extends BlockCrops implements IPlantable{ public static final PropertyInteger AGE = PropertyInteger.create("age", 0, 14); public WcBlockCropBase(String name) { this.setDefaultState(this.blockState.getBaseState().withProperty(AGE, Integer.valueOf(0))); this.setUnlocalizedName(name); this.setRegistryName(name); this.setCreativeTab(WC.WC_TAB); setTickRandomly(true); WcBlocks.crops.add(this); WcItems.items.add(new ItemBlock(this).setRegistryName(this.getRegistryName())); this.createBlockState(); this.setDefaultState(this.blockState.getBaseState().withProperty(AGE, Integer.valueOf(0))); } public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { if (worldIn.getBlockState(pos.down()).getBlock().getRegistryName() == this.getRegistryName()) { if (worldIn.isAirBlock(pos.up())) { int i; for (i = 1; worldIn.getBlockState(pos.down(i)).getBlock() == this; ++i){;} if (i < 3) { int j = ((Integer)state.getValue(AGE)).intValue(); if(net.minecraftforge.common.ForgeHooks.onCropsGrowPre(worldIn, pos, state, true)) { if (j == 15) { worldIn.setBlockState(pos.up(), this.getDefaultState()); worldIn.setBlockState(pos, state.withProperty(AGE, Integer.valueOf(0)), 4); } else { worldIn.setBlockState(pos, state.withProperty(AGE, Integer.valueOf(j + 1)), 4); } net.minecraftforge.common.ForgeHooks.onCropsGrowPost(worldIn, pos, state, worldIn.getBlockState(pos)); } } } } } @Override public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { IBlockState state = worldIn.getBlockState(pos.down()); Block block = state.getBlock(); if (block.canSustainPlant(state, worldIn, pos.down(), EnumFacing.UP, this)) return true; if (block == this) { return true; } else if (block != Blocks.GRASS && block != Blocks.DIRT && block != Blocks.SAND) { return false; } else { BlockPos blockpos = pos.down(); for (EnumFacing enumfacing : EnumFacing.Plane.HORIZONTAL) { IBlockState iblockstate = worldIn.getBlockState(blockpos.offset(enumfacing)); if (iblockstate.getMaterial() == Material.WATER || iblockstate.getBlock() == Blocks.FROSTED_ICE) { return true; } } return false; } } @Override public boolean canPlaceTorchOnTop(IBlockState state, IBlockAccess world, BlockPos pos) { return false; } @Override public EnumPlantType getPlantType(IBlockAccess world, BlockPos pos) { return net.minecraftforge.common.EnumPlantType.Beach; } @Override public IBlockState getPlant(IBlockAccess world, BlockPos pos) { return this.getDefaultState(); } @Override protected BlockStateContainer createBlockState() { // TODO Auto-generated method stub return new BlockStateContainer(this, new IProperty[] {AGE}); } @Override public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(AGE, Integer.valueOf(meta)); } @Override public int getMetaFromState(IBlockState state) { return state.getValue(AGE); } @Override protected int getBonemealAgeIncrease(World worldIn) { // TODO Auto-generated method stub return 2; } @Override public boolean canUseBonemeal(World worldIn, Random rand, BlockPos pos, IBlockState state) { // TODO Auto-generated method stub return true; } } Which gets added into my main block class here: Spoiler package com.cyadrogen.wc.init; import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; import net.minecraftforge.fml.common.registry.GameRegistry.ObjectHolder; public class WcBlocks { public static final List<Block> blocks = new ArrayList<Block>(); public static final List<Block> crops = new ArrayList<Block>(); @ObjectHolder("wc:hemp_block") public static final Block hemp_block = null; @ObjectHolder("wc:h_crop_block") public static final Block h_crop_block = null; } d Then Registered Here (Both The Blocks and Block Models): Spoiler package com.cyadrogen.wc.utils; import com.cyadrogen.wc.WC; import com.cyadrogen.wc.blocks.WcBlockBase; import com.cyadrogen.wc.blocks.WcBlockCropBase; import com.cyadrogen.wc.init.WcBlocks; import com.cyadrogen.wc.init.WcItems; import com.cyadrogen.wc.items.WcItemBase; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @EventBusSubscriber public class RegistryHandler { @SubscribeEvent public static void registerBlocks(RegistryEvent.Register<Block> event) { event.getRegistry().register(new WcBlockBase(Material.LEAVES,"wc:hemp_block","wc:hemp_block",SoundType.PLANT)); event.getRegistry().register(new WcBlockCropBase("wc:hemp_crop_block")); WcBlocks.blocks.add(WcBlocks.hemp_block); WcBlocks.crops.add(WcBlocks.hemp_crop_block); } @SubscribeEvent public static void registerItems(RegistryEvent.Register<Item> event) { event.getRegistry().register(new WcItemBase("wc:d_w")); event.getRegistry().register(new WcItemBase("wc:g")); WcItems.items.add(WcItems.d_w); WcItems.items.add(WcItems.g); } @SubscribeEvent public static void onModelRegister(ModelRegistryEvent event) { for(Item i : WcItems.items) {package com.cyadrogen.wc.utils; import com.cyadrogen.wc.WC; import com.cyadrogen.wc.blocks.WcBlockBase; import com.cyadrogen.wc.blocks.WcBlockCropBase; import com.cyadrogen.wc.init.WcBlocks; import com.cyadrogen.wc.init.WcItems; import com.cyadrogen.wc.items.WcItemBase; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @EventBusSubscriber public class RegistryHandler { @SubscribeEvent public static void registerBlocks(RegistryEvent.Register<Block> event) { event.getRegistry().register(new WcBlockBase(Material.LEAVES,"wc:hemp_block","wc:hemp_block",SoundType.PLANT)); event.getRegistry().register(new WcBlockCropBase("wc:hemp_crop_block")); WcBlocks.blocks.add(WcBlocks.hemp_block); WcBlocks.crops.add(WcBlocks.hemp_crop_block); } @SubscribeEvent public static void registerItems(RegistryEvent.Register<Item> event) { event.getRegistry().register(new WcItemBase("wc:d_w")); event.getRegistry().register(new WcItemBase("wc:g")); WcItems.items.add(WcItems.d_w); WcItems.items.add(WcItems.g); } @SubscribeEvent public static void onModelRegister(ModelRegistryEvent event) { for(Item i : WcItems.items) { WC.proxy.registerItemRenderer(i, 0, "inventory"); } for(Block b : WcBlocks.blocks) { WC.proxy.registerItemRenderer(Item.getItemFromBlock(b), 0, "inventory"); WC.proxy.registerBlockRenderer(b); } for(Block b : WcBlocks.crops) { WC.proxy.registerBlockRenderer(b); } } } WeedCraft.proxy.registerItemRenderer(i, 0, "inventory"); } for(Block b : WcBlocks.blocks) { WeedCraft.proxy.registerItemRenderer(Item.getItemFromBlock(b), 0, "inventory"); WeedCraft.proxy.registerBlockRenderer(b); } for(Block b : WcBlocks.crops) { WeedCraft.proxy.registerBlockRenderer(b); } } } The #registerModels function is defined in my ClientProxy Here: Spoiler package com.cyadrogen.wc.proxy; import net.minecraft.block.Block; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.Item; import net.minecraftforge.client.model.ModelLoader; public class ClientProxy implements IProxyBase{ public void registerItemRenderer(Item i, int meta, String id) { ModelLoader.setCustomModelResourceLocation(i, meta, new ModelResourceLocation(i.getRegistryName(),id)); } @Override public void registerBlockRenderer(Block block) { ModelLoader.setCustomStateMapper(block, null); } } I'm pretty sure I'm missing something obvious but idk what since I never touched IBlockstates before... If there's anything else someone needs like logs or other of my classes simply ask. I will provide. Edited September 7, 20196 yr by Delupara Update the relevant files to use @ObjectHolder instead of IHasModel interface. When they say your code doesn't follow convention but ur edgy so u dont care d-d-d-dab on them haterz
September 7, 20196 yr 1 minute ago, Delupara said: IHasModel No stop using this. 3 minutes ago, Delupara said: public static final Block H_BLOCK = new WcBlockBase(Material.LEAVES,"h_block","h_block",SoundType.PLANT); public static final Block H_CROP_BLOCK = new WcBlockCropBase("h_crop_block"); Don't statically initialize your Block or Item or any registry values. 5 minutes ago, Delupara said: java.lang.IllegalArgumentException: Cannot set property PropertyInteger{name=age, clazz=class java.lang.Integer, values=[0, 1, 2, 3, 4, 5, 6, 7]} as it does not exist in BlockStateContainer{block=minecraft:air, properties=[age]} This isn't quite enough information to diagnose the problem. Post the whole error. 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.
September 7, 20196 yr Author Just now, Animefan8888 said: No stop using this. Question: Why? Just now, Animefan8888 said: Don't statically initialize your Block or Item or any registry values. Where do I initialize them then? More importantly how since they're final Just now, Animefan8888 said: This isn't quite enough information to diagnose the problem. Post the whole error. I uploaded both the Lastest Log and the crash report latest.logcrash-2019-09-07_13.32.28-client.txt When they say your code doesn't follow convention but ur edgy so u dont care d-d-d-dab on them haterz
September 7, 20196 yr 3 minutes ago, Delupara said: Why? Because it's easier to just loop through a Set/List of Item/Block(technically still an Item) and register them directly in the ModelRegistryEvent with a for loop. It's much simpler and you only have to write it once instead of every new class. 10 minutes ago, Delupara said: Where do I initialize them then? Inside their registry event. 3 minutes ago, Delupara said: how since they're final Use the @ObjectHolder annotation it retrieves objects after the registry event has fired. And applies the value to the field. 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.
September 7, 20196 yr Author 19 minutes ago, Animefan8888 said: Inside their registry event. Ok so from what I understand I use @ObjectHolder to inject the null declared object from that object's registry (Block in this case) then somehow reference that ObjectHolder in the block registry handler and inject that object's declaration? If so how do I reference the object annotated by @ObjectHolder? The Wiki doesn't seem to tell me how... Also, whats the Event In question? I can't look it up Away from my pc and the documentation doesn't provide a list of available events Edited September 7, 20196 yr by Delupara When they say your code doesn't follow convention but ur edgy so u dont care d-d-d-dab on them haterz
September 7, 20196 yr 1 minute ago, Delupara said: whats the Event In question? Don't know what your asking here. I only referred to registry events. IE Register<Block> 2 minutes ago, Delupara said: then somehow reference that ObjectHolder in the block registry handler and inject that object's declaration? No. You just need to do something like this @ObjectHolder("modid") class Registry public static final Block SOME_BLOCK = null; registerBlocks event.getRegistry().register(new Block(...).setRegistryName("modid:some_block")) Boom done.Then you can reference the value you created in the registry event by using the SOME_BLOCK field. 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.
September 7, 20196 yr Author Ok, I've edited the code to remove IHasModel, Posted the changes in the original post. However The same error persist. I need help, thanks When they say your code doesn't follow convention but ur edgy so u dont care d-d-d-dab on them haterz
September 8, 20196 yr 39 minutes ago, Delupara said: However The same error persist. Post the error again it could be slightly different. Also maybe change this.blockState.getBaseState() in your blocks constructor to getDefaultState() 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.
September 8, 20196 yr Author Just now, Animefan8888 said: Post the error again it could be slightly different. Also maybe change this.blockState.getBaseState() in your blocks constructor to getDefaultState() Like I said Its more or less the same error/stacktrace but I still uploaded the new error. Doing what you suggested basically got nowhere. latest.log When they say your code doesn't follow convention but ur edgy so u dont care d-d-d-dab on them haterz
September 8, 20196 yr 5 hours ago, Delupara said: WcBlockCropBase extends BlockCrops implements IPlantable{ You know that BlockCrops already implements IPlantable, right? 5 hours ago, Delupara said: Integer.valueOf(0) You know that you don't have to use ValueOf on integer literals, right? 5 hours ago, Delupara said: this.setDefaultState(this.blockState.getBaseState().withProperty(AGE, Integer.valueOf(0))); Why do you have this in your constructor twice? 5 hours ago, Delupara said: public WcBlockCropBase(String name) { this.setDefaultState(this.blockState.getBaseState().withProperty(AGE, Integer.valueOf(0))); this.setUnlocalizedName(name); this.setRegistryName(name); this.setCreativeTab(WC.WC_TAB); setTickRandomly(true); WcBlocks.crops.add(this); WcItems.items.add(new ItemBlock(this).setRegistryName(this.getRegistryName())); this.createBlockState(); this.setDefaultState(this.blockState.getBaseState().withProperty(AGE, Integer.valueOf(0))); } And you called super()...where, exactly? 5 hours ago, Delupara said: ((Integer)state.getValue(AGE)).intValue(); getValue already returned an int, that you cast to an Integer, that you then called intValue on... 5 hours ago, Delupara said: WcBlocks.crops.add(this); 5 hours ago, Delupara said: WcBlocks.blocks.add(WcBlocks.hemp_block); WcBlocks.crops.add(WcBlocks.hemp_crop_block); 1) You don't need both of these 2) The second one is doubly-useless because those static references are still null because they aren't populated until AFTER the event 5 hours ago, Delupara said: WcItems.items.add(new ItemBlock(this).setRegistryName(this.getRegistryName())); 5 hours ago, Delupara said: WcItems.items.add(WcItems.d_w); WcItems.items.add(WcItems.g); Ditto... 5 hours ago, Delupara said: ModelLoader.setCustomStateMapper(block, null); Well, that was fucking pointless. 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.
September 11, 20196 yr Author On 9/7/2019 at 10:36 PM, Draco18s said: You know that BlockCrops already implements IPlantable, right? Yeah sorry I make mistakes. I don't code that much anymore and I just forgot child classes implement the same interfaces as their parents. My Mistake. Quote You know that you don't have to use ValueOf on integer literals, right? That was only because I followed what BlockCrop did. If it needed to translate integer litterals into wrapper objects I assumed I should of done the same. Sorry If Minecraft's programmers did this. Quote Why do you have this in your constructor twice? Because I didn't notice. Again look at my first answer. Quote And you called super()...where, exactly? Nowhere. I assumed it wasn't necessary since I was doing the same function calls. I added it though, First line in my constructor. Quote getValue already returned an int, that you cast to an Integer, that you then called intValue on... Does it really matter anyway? Java isn't the only coding language I program in, but one of the few that works this way when it comes to understanding the difference between object wrappers and litterals..... In the end it doesn't matter anyway. Quote 1) You don't need both of these 2) The second one is doubly-useless because those static references are still null because they aren't populated until AFTER the event Then how am I supposed to loop trough my items and blocks to register their respective models? I'm gonna add a lot to this mod so I don't feel like copying/pasting each individual items and blocks especially when looping is a thing.... And I know.... Read the lines above in the code, I did populated them with the right classes no? Those lines are for looping the ModelRegistryEvent items/blocks. Quote Ditto... Well, that was fucking pointless. Thanks for helping by making feel like a dunce for not know EVERY single details in an API. Goes to show how some people perpetuate the "You don't know 100% of the thing therefore you shouldn't deserve help". I don't code everyday and I have attention issues, Seems like you're gifted by not having these problems, stop being a prick and help those who DO have that problem instead of downing them. Regardless of you belittling, the problem persist with the code adjusted. Edited September 11, 20196 yr by Delupara When they say your code doesn't follow convention but ur edgy so u dont care d-d-d-dab on them haterz
September 11, 20196 yr 24 minutes ago, Delupara said: I assumed it wasn't necessary since I was doing the same function calls. I added it though, First line in my constructor. It matters because there are final fields in the Block class that aren't set unless you call the super. 27 minutes ago, Delupara said: Then how am I supposed to loop trough my items and blocks to register their respective models? Add them to the list in their constructor? Also I think he was also pointing out that having two lists is pointless. 29 minutes ago, Delupara said: Regardless of you belittling, the problem persist with the code adjusted. Post your updated code. 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.
September 11, 20196 yr 31 minutes ago, Delupara said: Sorry If Minecraft's programmers did this. They didn't. That's what the decompiler did because the decompiler doesn't know better because there's multiple different original Java source that compile to the same bytes. The point here is that you shouldn't blindly copy and paste stuff. You should actually understand what it's doing and evaluate if what its doing is the proper way to do things. By copying and pasting you've demonstrated that you lack sufficient knowledge of Java and we don't help with basic Java here. I am entirely within reason to point out stupid shit as being stupid. 31 minutes ago, Delupara said: the problem persist with the code adjusted Cool. Can you post it? The problems I was pointing out could have entirely been the cause of your issue, one way or another, but if its still a problem, its hard to diagnose it without seeing your current code. Edited September 11, 20196 yr by Draco18s 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.
September 11, 20196 yr 2 minutes ago, diesieben07 said: This is not true. It is impossible to not call a super constructor. If you don't do it explicitly, Java will call the parameterless superconstructor implicitly. If no such superconstructor exist, this is a compile-time error. I forgot that 1.12's BlockBush had a parameterless constructor. 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.
September 11, 20196 yr Author I did something better, I pushed a git commit to my github: https://github.com/Thegamerchunk1/WeedCraft. Also added the log. latest.log When they say your code doesn't follow convention but ur edgy so u dont care d-d-d-dab on them haterz
September 11, 20196 yr 13 minutes ago, Delupara said: Also added the log. The problem is that the BlockCrops is expecting your Block to have it's AGE property on it when it doesn't. So you'll have to not extend that class or use its AGE property. 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.
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.