Jump to content

Custom Crop Crashes w/ Unknown Error Upon Planting.


gmod622

Recommended Posts

Hello!

 

So during creation of a plant, I ran into an error, upon right clicking tilled soil:

 

 

 

[09:37:40] [server thread/FATAL]: Error executing task
java.util.concurrent.ExecutionException: java.lang.NullPointerException
at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_101]
at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_101]
at net.minecraft.util.Util.runTask(Util.java:26) [util.class:?]
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:742) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:687) [MinecraftServer.class:?]
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) [integratedServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:536) [MinecraftServer.class:?]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_101]
Caused by: java.lang.NullPointerException
at net.minecraft.item.ItemSeeds.getPlant(ItemSeeds.java:52) ~[itemSeeds.class:?]
at net.minecraft.block.Block.canSustainPlant(Block.java:1826) ~[block.class:?]
at net.minecraft.item.ItemSeeds.onItemUse(ItemSeeds.java:31) ~[itemSeeds.class:?]
at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:755) ~[ForgeHooks.class:?]
at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:158) ~[itemStack.class:?]
at net.minecraft.server.management.PlayerInteractionManager.processRightClickBlock(PlayerInteractionManager.java:509) ~[PlayerInteractionManager.class:?]
at net.minecraft.network.NetHandlerPlayServer.processRightClickBlock(NetHandlerPlayServer.java:706) ~[NetHandlerPlayServer.class:?]
at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:68) ~[CPacketPlayerTryUseItemOnBlock.class:?]
at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:13) ~[CPacketPlayerTryUseItemOnBlock.class:?]
at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:15) ~[PacketThreadUtil$1.class:?]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_101]
at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_101]
at net.minecraft.util.Util.runTask(Util.java:25) ~[util.class:?]
... 5 more

 

 

 

Some of the lines leads me to believe its something to do about my seed. So here is my seed class:

 

 

 

package com.lambda.PlentifulMisc.main.block;

import com.lambda.PlentifulMisc.main.item.ModItems;

import net.minecraft.block.BlockCrops;
import net.minecraft.item.Item;

public class PMBlkCropWatermelon extends BlockCrops {

public PMBlkCropWatermelon() {
	setUnlocalizedName("pmcropwatermelon");
	setRegistryName("pmcropwatermelon");
}

@Override
protected Item getSeed() {
	return ModItems.watermelonSeed;
}

@Override
protected Item getCrop() {
	return ModItems.watermelon;
}

}

 

 

 

And here is where I'm Registering the item:

 

 

 

package com.lambda.PlentifulMisc.main.item;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class ModItems {

public static PMItemBase cheese;
public static PMItemBase watermelon;
public static ItemWatermelonSeed watermelonSeed;

public static void init() {
	cheese = register(new PMItemBase("pmcheese").setCreativeTab(CreativeTabs.FOOD));
	watermelonSeed = register(new ItemWatermelonSeed());
	watermelon = register(new PMItemBase("pmwatermelon").setCreativeTab(CreativeTabs.FOOD));
}

private static <T extends Item> T register(T item) {
	GameRegistry.register(item);

	if (item instanceof ItemModelProvider ) {
		((ItemModelProvider )item).registerItemModel(item);
	}

	return item;
}

}

 

 

 

My Main Class.

 

 

 

package com.lambda.PlentifulMisc.main;

import com.lambda.PlentifulMisc.main.block.ModBlocks;
import com.lambda.PlentifulMisc.main.info.PMReference;
import com.lambda.PlentifulMisc.main.item.ModItems;
import com.lambda.PlentifulMisc.main.item.PMItemBase;
import com.lambda.PlentifulMisc.main.tab.PMTab;
import com.lambda.PlentifulMisc.proxy.CommonProxy;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

@Mod(modid = PMReference.MODID, version = PMReference.VERSION)
public class PlentifulMisc
{ 
@SidedProxy(serverSide = "com.lambda.PlentifulMisc.proxy.CommonProxy", clientSide = "com.lambda.PlentifulMisc.proxy.ClientProxy")
public static CommonProxy proxy;
@Mod.Instance(PMReference.MODID)

public static PlentifulMisc instance;
public static final PMTab creativeTab = new PMTab();



    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
	System.out.println("[Plentiful Misc] Plentiful Misc is loading!");
	System.out.println("[Plentiful Misc] Thanks for downloading!");

	System.out.println("[Plentiful Misc] Initializing Blocks!");
	ModBlocks.init();
	System.out.println("[Plentiful Misc] Initializing Items!");
	ModItems.init();


    }

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    }

@EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {

    }
}

 

 

 

And finally, my Client Proxy:

 

 

 

package com.lambda.PlentifulMisc.proxy;

import com.lambda.PlentifulMisc.main.PlentifulMisc;
import com.lambda.PlentifulMisc.main.info.PMReference;

import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.ModelLoader;

public class ClientProxy extends CommonProxy {
@Override
public void registerItemRenderer(Item item, int meta, String id) {
	ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(PMReference.MODID + ":" + id, "inventory"));
}
}

 

 

 

[NOTE:] Yes, I understand that my code is very messy, uncommented, etc, this is just a test project.

 

Thanks.

Not new to java >> New to modding.

Link to comment
Share on other sites

So when you set a breakpoint at ItemSeeds.java:52 and re-ran in the debugger, what did you find? What's null there, and how could you make it not null before reaching that point?

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Link to comment
Share on other sites

Make sure you're registering your crop block and seed item at the exact same time (as in, put their registration in the same file. I use a separate class for items and blocks that need to be registered together).

I'm eager to learn and am prone to mistakes. Don't hesitate to tell me how I can improve.

Link to comment
Share on other sites

You can't register them at the exact same time: one will always goes first.

Stop passing references to constructors and instead alter the class files to point to your items/blocks lists.

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

So when you set a breakpoint at ItemSeeds.java:52 and re-ran in the debugger, what did you find? What's null there, and how could you make it not null before reaching that point?

 

Seems like it doesn't like how its calculating which way its facing:

 

 

    public BlockPos offset(EnumFacing facing)
    {
        return this.offset(facing, 1);
    }

    /**
     * Offsets this BlockPos n blocks in the given direction
     */
    public BlockPos offset(EnumFacing facing, int n)
    {
        return n == 0 ? this : new BlockPos(this.getX() + facing.getFrontOffsetX() * n, this.getY() + facing.getFrontOffsetY() * n, this.getZ() + facing.getFrontOffsetZ() * n);
    }

 

 

 

These two functions is where the first null spits out; The code that I jumped inside of was:

        if (facing == EnumFacing.UP && playerIn.canPlayerEdit(pos.offset(facing), facing, stack) && state.getBlock().canSustainPlant(state, worldIn, pos, EnumFacing.UP, this) && worldIn.isAirBlock(pos.up()))

 

 

Not new to java >> New to modding.

Link to comment
Share on other sites

So... Which value there was null? You did hover over each, right? When you have located the null element, then you should be able to see where you forgot to set it.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Link to comment
Share on other sites

For crops, this usually happens when you construct / register the seed item before you construct / register the crop block. So you need to control the order they are constructed / registered.

 

But as JeffryFisher says you should practice your ability to debug this sort of thing yourself. Find the null pointer then think or trace back why the thing that is null is so at that point in the execution.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

For crops, this usually happens when you construct / register the seed item before you construct / register the crop block. So you need to control the order they are constructed / registered.

 

Actually what usually happens is that they've set up their code in such a way that swapping the two results in a similar, but different, crash.  Because they're trying to pass the seed to the block constructor and the block to the seed constructor.

 

Not the case here (they posted the block class, which is not taking the seed as a parameter) but they didn't post the Item class, so who knows what it's doing.

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

I created a custom crop last night. In fact two. And both working fine!

 

You don't need to create a custom seed item. You need, however, to create a custom crop block because getSeed and getCrop needs to be overriden.

 

 

public class FennelCrop extends BlockCrops 
{
public FennelCrop() 
{
	super();
}

@Override
    protected Item getSeed()
    {
	return ModItems.FENNEL;
    }

@Override
    protected Item getCrop()
    {
        return ModItems.FENNEL;
    }

}

 

 

 

For seed you can use MC's own ItemSeed or even ItemSeedFood both will work.

 

In my ModItems I got this

 

 

public static final Item FENNEL = new ItemSeedFood(1, 0.3F, ModBlocks.CROP_FENNEL, Blocks.FARMLAND).setUnlocalizedName("fennel").setRegistryName("fennel").setCreativeTab(ModData.CREATIVE_TAB);

 

 

after which I register in preInit

 

Note that I used MC's own ItemSeedFood . This is fine because it has the crop, seed in the constructor. Minecraft's or is it Forge's own BlockCrop does not have a way to change crop and seed so you need to create a custom one so you can override the return stuff.

 

Note that in ModBlocks I have to register the crop.

 

And finally I have a ModelsHandler class where I register the models for item and for the crop block. I can show you that too. You HAVE to to id properly or else it will not show up. YOu need various models for each crop stage from 0 to 7 . You need a blockstate with age=0 ... age=7 pointing at the above block model. And for the item you just do it  the regular way like any other non specific MC item.

 

Disclaimer:  I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it.

Link to comment
Share on other sites

I created a custom crop last night. In fact two. And both working fine!

 

You don't need to create a custom seed item. You need, however, to create a custom crop block because getSeed and getCrop needs to be overriden.

 

 

public class FennelCrop extends BlockCrops 
{
public FennelCrop() 
{
	super();
}

@Override
    protected Item getSeed()
    {
	return ModItems.FENNEL;
    }

@Override
    protected Item getCrop()
    {
        return ModItems.FENNEL;
    }

}

 

 

 

For seed you can use MC's own ItemSeed or even ItemSeedFood both will work.

 

In my ModItems I got this

 

 

public static final Item FENNEL = new ItemSeedFood(1, 0.3F, ModBlocks.CROP_FENNEL, Blocks.FARMLAND).setUnlocalizedName("fennel").setRegistryName("fennel").setCreativeTab(ModData.CREATIVE_TAB);

 

 

after which I register in preInit

 

Note that I used MC's own ItemSeedFood . This is fine because it has the crop, seed in the constructor. Minecraft's or is it Forge's own BlockCrop does not have a way to change crop and seed so you need to create a custom one so you can override the return stuff.

 

Note that in ModBlocks I have to register the crop.

 

And finally I have a ModelsHandler class where I register the models for item and for the crop block. I can show you that too. You HAVE to to id properly or else it will not show up. YOu need various models for each crop stage from 0 to 7 . You need a blockstate with age=0 ... age=7 pointing at the above block model. And for the item you just do it  the regular way like any other non specific MC item.

 

By ModelsHandler, do you mean just a JSON?

I'm pretty sure this JSON will work out for a crop, or is there something more I need?

 

 

 

{
    "forge_marker": 1,
    "defaults": {
        "model": "cross"
    },
    "variants": {
        "age": {
            "0": {
                "textures": {
                    "cross": "pm:blocks/watermelon/0"
                }
            },
            "1": {
                "textures": {
                    "cross": "pm:blocks/watermelon/1"
                }
            },
            "2": {
                "textures": {
                    "cross": "pm:blocks/watermelon/2"
                }
            },
            "3": {
                "textures": {
                    "cross": "pm:blocks/watermelon/3"
                }
            },
            "4": {
                "textures": {
                    "cross": "pm:blocks/watermelon/4"
                }
            },
            "5": {
                "textures": {
                    "cross": "pm:blocks/watermelon/5"
                }
            },
            "6": {
                "textures": {
                    "cross": "pm:blocks/watermelon/6"
                }
            },
            "7": {
                "textures": {
                    "cross": "pm:blocks/watermelon/7"
                }
            }
        }
    }
}

 

 

Not new to java >> New to modding.

Link to comment
Share on other sites

modelhandler is my own class name nothing to do with forge. I jsut call the class that registers all my models that.

 

feel free to have a look at my crop files  for ex wormwood crop

https://github.com/trollworkout/technorcery/blob/master/src/main/java/com/technorcery/blocks/WormwoodCrop.java

 

you can find the json and all the other stuff there

 

is FULLY functional tested and not only grows properly but also has a seed, and a crop drop and when you middle click on it in creative you get the wormwood seeds

Disclaimer:  I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it.

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.