Jump to content

[1.12.2] Coding in a crop gives me "java.lang.IllegalArgumentException" With Blockstates


Delupara

Recommended Posts

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

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

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.

Announcements



×
×
  • Create New...

Important Information

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