Jump to content

Recommended Posts

Posted

My custom flower keeps crashing from the "canBlockStay" part of my code. Not sure what the problem is because its mostly copied from the minecraft BlockFlower class.

public class BlockOrangeFlower extends Block implements IPlantable {

public BlockOrangeFlower(int par1, Material par2Material) {
	super(par1, par2Material);
	this.setTickRandomly(true);
	float f = 0.2F;
	this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 3.0F,
			0.5F + f);
	this.setCreativeTab(CreativeTabs.tabDecorations);
	this.setStepSound(soundGrassFootstep);
}

public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) {
	return super.canPlaceBlockAt(par1World, par2, par3, par4)
			&& canBlockStay(par1World, par2, par3, par4);
}

/**
 * Gets passed in the blockID of the block below and supposed to return true
 * if its allowed to grow on the type of blockID passed in. Args: blockID
 */
protected boolean canThisPlantGrowOnThisBlockID(int par1) {
	return par1 == Block.grass.blockID || par1 == Block.dirt.blockID
			|| par1 == Block.tilledField.blockID;
}

/**
 * Lets the block know when one of its neighbor changes. Doesn't know which
 * neighbor changed (coordinates passed are their own) Args: x, y, z,
 * neighbor blockID
 */
public void onNeighborBlockChange(World par1World, int par2, int par3,
		int par4, int par5) {
	super.onNeighborBlockChange(par1World, par2, par3, par4, par5);
	this.checkFlowerChange(par1World, par2, par3, par4);
}

/**
 * Ticks the block if it's been scheduled
 */
public void updateTick(World par1World, int par2, int par3, int par4,
		Random par5Random) {
	this.checkFlowerChange(par1World, par2, par3, par4);
}

protected final void checkFlowerChange(World par1World, int par2, int par3,
		int par4) {
	if (!this.canBlockStay(par1World, par2, par3, par4)) {
		this.dropBlockAsItem(par1World, par2, par3, par4,
				par1World.getBlockMetadata(par2, par3, par4), 0);
		par1World.setBlockToAir(par2, par3, par4);
	}
}

/**
 * Can this block stay at this position. Similar to canPlaceBlockAt except
 * gets checked often with plants.
 */
public boolean canBlockStay(World par1World, int par2, int par3, int par4) {
	Block soil = blocksList[par1World.getBlockId(par2, par3 - 1, par4)];
	return (par1World.getFullBlockLightValue(par2, par3, par4) >= 8 || par1World
			.canBlockSeeTheSky(par2, par3, par4))
			&& (soil != null && soil.canSustainPlant(par1World, par2,
					par3 - 1, par4, ForgeDirection.UP, this));
}

/**
 * Returns a bounding box from the pool of bounding boxes (this means this
 * box can change after the pool has been cleared to be reused)
 */
public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World,
		int par2, int par3, int par4) {
	return null;
}

/**
 * Is this block (a) opaque and (b) a full 1m cube? This determines whether
 * or not to render the shared face of two adjacent blocks and also whether
 * the player can attach torches, redstone wire, etc to this block.
 */
public boolean isOpaqueCube() {
	return false;
}

/**
 * If this block doesn't render as an ordinary block it will return False
 * (examples: signs, buttons, stairs, etc)
 */
public boolean renderAsNormalBlock() {
	return false;
}

/**
 * The type of render function that is called for this block
 */
public int getRenderType() {
	return 1;
}

@Override
public EnumPlantType getPlantType(World world, int x, int y, int z) {
	// TODO Auto-generated method stub
	return null;
}

@Override
public int getPlantID(World world, int x, int y, int z) {
	// TODO Auto-generated method stub
	return 0;
}

@Override
public int getPlantMetadata(World world, int x, int y, int z) {
	// TODO Auto-generated method stub
	return 0;
}

@SideOnly(Side.CLIENT)
public void registerIcons(IconRegister par1IconRegister) {

	this.blockIcon = par1IconRegister.registerIcon(Main.modid + ":"
			+ this.getUnlocalizedName2());

}

}

 

Crash:

  java.lang.NullPointerException
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at net.minecraft.block.Block.canSustainPlant(Block.java:2213)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at derek.main.BlockOrangeFlower.canBlockStay(BlockOrangeFlower.java:79)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at derek.main.BlockOrangeFlower.canPlaceBlockAt(BlockOrangeFlower.java:31)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at net.minecraft.block.Block.canPlaceBlockOnSide(Block.java:939)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at net.minecraft.block.Block.canPlaceBlockOnSide(Block.java:921)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at net.minecraft.world.World.canPlaceEntityOnSide(World.java:3773)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at net.minecraft.item.ItemBlock.canPlaceItemBlockOnSide(ItemBlock.java:180)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at net.minecraft.client.multiplayer.PlayerControllerMP.onPlayerRightClick(PlayerControllerMP.java:376)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at net.minecraft.client.Minecraft.clickMouse(Minecraft.java:1315)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at net.minecraft.client.Minecraft.runTick(Minecraft.java:1799)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:834)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at net.minecraft.client.Minecraft.run(Minecraft.java:759)
2013-04-26 23:51:08 [iNFO] [sTDERR] 	at java.lang.Thread.run(Unknown Source)

 

Any help appreciated.

Posted

You're getting a crash because the canBlockSustainPlant method wants an EnumPlantType, so change getPlantType to this:

 

@Override
public EnumPlantType getPlantType(World world, int x, int y, int z) {
	return EnumPlantType.Plains;
}

 

Hope that helped ;)

Writing a steampunk mod called MineTech, and author of a long dead fishing mod

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hi everyone, I'm currently developing a Forge 1.21 mod for Minecraft and I want to display a custom HUD overlay for a minigame. My goal: When the game starts, all players should see an item/block icon (from the base game, not a custom texture) plus its name/text in the HUD – similar to how the bossbar overlay works. The HUD should appear centered above the hotbar (or at a similar prominent spot), and update dynamically (icon and name change as the target item changes). What I've tried: I looked at many online tutorials and several GitHub repos (e.g. SeasonHUD, MiniHUD), but most of them use NeoForge or Forge versions <1.20 that provide the IGuiOverlay API (e.g. implements IGuiOverlay, RegisterGuiOverlaysEvent). In Forge 1.21, it seems that neither IGuiOverlay nor RegisterGuiOverlaysEvent exist anymore – at least, I can't import them and they are missing from the docs and code completion. I tried using RenderLevelStageEvent as a workaround but it is probably not intended for custom HUDs. I am not using NeoForge, and switching the project to NeoForge is currently not an option for me. I tried to look at the original minecraft source code to see how elements like hearts, hotbar etc are drawn on the screen but I am too new to Minecraft modding to understand. What I'm looking for: What is the correct way to add a custom HUD element (icon + text) in Forge 1.21, given that the previous overlay API is missing? Is there a new recommended event, callback, or method in Forge 1.21 for custom HUD overlays, or is everyone just using a workaround? Is there a minimal open-source example repo for Forge 1.21 that demonstrates a working HUD overlay without relying on NeoForge or deprecated Forge APIs? My ideal solution: Centered HUD element with an in-game item/block icon (from the base game's assets, e.g. a diamond or any ItemStack / Item) and its name as text, with a transparent background rectangle. It should be visible to the players when the mini game is running. Easy to update the item (e.g. static variable or other method), so it can change dynamically during the game. Any help, code snippets, or up-to-date references would be really appreciated! If this is simply not possible right now in Forge 1.21, it would also help to know that for sure. Thank you very much in advance!
    • The simple answer is there is not an easy way. You would need to know how to program in Java, as well as at least some familiarity with how Forge works so you could port the differences. You would also need the sourcecode for the original mod, and permission from the author to modify it, if they did not use some sort of open source license. So it's not impossible, but it would take some effort, but doing so would open up a whole new world of possibilities for you!
    • Does it still crash if you remove holdmyitems? Looks like that mod doesn't work on a server as far as I can tell from the error.  
    • Crashes the server when trying to start. Error code -1. Log  
  • Topics

×
×
  • Create New...

Important Information

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