Jump to content

[Forge 1.12.2] [SOLVED] Get block property from known block at BlockPos (age of BlockCrop)


GenElectrovise

Recommended Posts

Hi all. I'm trying to get the age of a patch of vanilla potatoes from a tile entity, but I can't seem to find a way to do it. I've already seen this post regarding this in v1.10 but the code examples don't quite have enough info in them for me (an almost semi-experienced modder) to be able to replicate it and they examples aren't explained in detail. I have also read and mostly understand the concept of blockstates (painful but useful :) ) from this forge readthedocs page.
I have tried adding logging code and can get the properties as a PropertyInteger:

Spoiler

Properties{PropertyInteger{name=age, clazz=class java.lang.Integer, values=[0, 1, 2, 3, 4, 5, 6, 7]}=2}
Property keys[PropertyInteger{name=age, clazz=class java.lang.Integer, values=[0, 1, 2, 3, 4, 5, 6, 7]}]

 

from the potatoes but can't get the actual value of age from it. It says it at the end of the first one (from printing out the results of the world.getBlockState(blockPos).getProperties() method where the blockPos is that of the potatoes), but I don't know how to retrieve that value. I've looked at the possible methods I can use and none seem to help.

-----------------------------

My tile entity class -- relevant methods at the bottom. It should break potatoes/ replace them with air and spawn a EntityItem of an Amethyst Potato at the broken block's BlockPos (can break blocks but doesn't spawn entity but that's a separate issue -- right now it just doesn't get through the check for the crop's age)

-----------------------------

Spoiler

package com.magiksmostevile.tileentity;

import java.util.Iterator;

import com.google.common.collect.ImmutableMap;
import com.magiksmostevile.EvileLog;
import com.magiksmostevile.init.EvileItems;

import net.minecraft.block.Block;
import net.minecraft.block.BlockCrops;
import net.minecraft.block.BlockPotato;
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.entity.item.EntityItem;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;

public class TileEntityAmethystCrystal extends TileEntity implements ITickable {

    private String customName;
    private World world;

    public TileEntityAmethystCrystal() {
	super();
	EvileLog.logText(true, 1, "Constructing crystal tile entity (Not called previously - added by me)");
    }

    private String getName() {
	return this.hasCustomName() ? this.customName : "te.tile_entity_amethyst_crystal";
    }

    private boolean hasCustomName() {
	return this.customName != null && !this.customName.isEmpty();
    }

    private void setCustomName(String customNameIn) {
	this.customName = customNameIn;
    }

    @Override
    public void readFromNBT(NBTTagCompound compound) {
	super.readFromNBT(compound);
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
	return super.writeToNBT(compound);
    }

    @Override
    public void onLoad() { // HELPFUL POST FOR GETTING WORLD>>> https://www.minecraftforge.net/forum/topic/41640-world-and-position-empty-in-tile-entity/
	this.world = this.getWorld();
    }

    @Override
    public void update() {
	int posX = this.getPos().getX();
	int posY = this.getPos().getY();
	int posZ = this.getPos().getZ();
	int i = posX;
	int j = posY;
	int k = posZ;

	EvileLog.logText(false, 1, "tile entity coords are: " + posX + ":" + posY + ":" + posZ);

	try {
	    for (i = posX - 2; i < posX + 3; i++) {
		for (j = posY - 1; j < posY + 1; j++) {
		    for (k = posZ - 2; k < posZ + 3; k++) {
			BlockPos blockPos = new BlockPos(i, j, k);
			Block block = world.getBlockState(blockPos).getBlock();
			EvileLog.logText(false, 1, "for loop 3; world is: " + world + "; blockPos is: " + blockPos
				+ "; block is: " + block);
			doBlockReplacement(block, blockPos);
		    }

		}
	    }
	} catch (NullPointerException e) {
	    System.out.println("NullPointerException! world.getBlockState(blockPos).getBlock() returned null? ");
	    e.printStackTrace();
	} catch (Exception e) {
	    e.printStackTrace();
	}

    }

    private void doBlockReplacement(Block block, BlockPos blockPos) {
	if (block instanceof BlockPotato) {
	    BlockPotato blockCrop = (BlockPotato) block;
	    System.out.println("Properties" + world.getBlockState(blockPos).getProperties());
	    System.out.println("Property keys" + world.getBlockState(blockPos).getPropertyKeys());
	    
	    /*
	    if (AGE > 7 OR CROP IS AT MAX AGE) {
		doReplacementAndSpawning(block, blockPos);
	    }
	    */
	}
    }

    private void doReplacementAndSpawning(Block block, BlockPos blockPos) {
	// System.out.println(block.getBlockState().getProperties());
	System.out.println("Properties" + world.getBlockState(blockPos).getProperties());
	System.out.println("Property keys" + world.getBlockState(blockPos).getPropertyKeys());
	IBlockState air = Blocks.AIR.getDefaultState();
	world.setBlockState(blockPos, air);
	EntityItem toDrop = new EntityItem(world, blockPos.getX(), blockPos.getY(), blockPos.getZ(),
		new ItemStack(EvileItems.AMETHYST_POTATO, 1));
    }
    
    /*
     * LATEST ATTEMPT FROM LINKED v1.10 ISSUE PAGE -- DON'T KNOW WHAT 'e' IS IN THE CODE
    private void getAge(??????????? e) {
	int age = -1;
	int maxAge = -1;
	for (IProperty<?> p : e.getState().getPropertyNames())
	{
		if (p.getName().toLowerCase() == "age")
		{
			if (p instanceof PropertyInteger)
			{
				PropertyInteger ageProp = (PropertyInteger) p;
				age = e.getState().getValue(ageProp).intValue();
				maxAge = ageProp.getAllowedValues().size() - 1;
			}
		}
	}
    }
    */
}

 

Anyway! Wow that's a lot of text! Any help welcome I don't know what else I can try!

Thanks!

Edited by GenElectrovise
Forgot to add forge version to title + [SOLVED]

How to ask a good coding question: https://stackoverflow.com/help/how-to-ask

Give logs, code, desired effects, and actual effects. Be thorough or we can't help you. Don't post code without putting it in a code block (the <> button on the post - select "C-type Language"): syntax highlighting makes everything easier, and it keeps the post tidy.

 

My own mod, Magiks Most Evile: GitHub (https://github.com/GenElectrovise/MagiksMostEvile) Wiki (https://magiksmostevile.fandom.com/wiki/Magiks_Most_Evile_Wiki)

Edit your own signature at https://www.minecraftforge.net/forum/settings/signature/

Link to comment
Share on other sites

1 minute ago, diesieben07 said:

Uhm, TileEntity already has a field called world. You do not need this.

Maybe I don't -- It wasn't working before (crashing with NullPointerException because it couldn't find the blockstate for some reason)...

 

To use IStateHolder.get(IProperty) you would need to get the blockstate of the block right? And you would do this with: world.getBlockState(blockPos) or block.getBlockState ?

Then how would you go about calling the method. Would you need to get said IStateHolder from the block?

 

Also I can't find IStateHolder.java with Crtl+Shift+R. I guess that means it's a subclass?

How to ask a good coding question: https://stackoverflow.com/help/how-to-ask

Give logs, code, desired effects, and actual effects. Be thorough or we can't help you. Don't post code without putting it in a code block (the <> button on the post - select "C-type Language"): syntax highlighting makes everything easier, and it keeps the post tidy.

 

My own mod, Magiks Most Evile: GitHub (https://github.com/GenElectrovise/MagiksMostEvile) Wiki (https://magiksmostevile.fandom.com/wiki/Magiks_Most_Evile_Wiki)

Edit your own signature at https://www.minecraftforge.net/forum/settings/signature/

Link to comment
Share on other sites

Sorry! I'm using MC 1.12.2, just forgot to add it.

How to ask a good coding question: https://stackoverflow.com/help/how-to-ask

Give logs, code, desired effects, and actual effects. Be thorough or we can't help you. Don't post code without putting it in a code block (the <> button on the post - select "C-type Language"): syntax highlighting makes everything easier, and it keeps the post tidy.

 

My own mod, Magiks Most Evile: GitHub (https://github.com/GenElectrovise/MagiksMostEvile) Wiki (https://magiksmostevile.fandom.com/wiki/Magiks_Most_Evile_Wiki)

Edit your own signature at https://www.minecraftforge.net/forum/settings/signature/

Link to comment
Share on other sites

And in the context of getting the age of a potato plant, this would mean passing AGE in as a PropertyInteger? How would you go about this? I'm missing something key about the data structure I think... How would you get the IProperty to pass in?

How to ask a good coding question: https://stackoverflow.com/help/how-to-ask

Give logs, code, desired effects, and actual effects. Be thorough or we can't help you. Don't post code without putting it in a code block (the <> button on the post - select "C-type Language"): syntax highlighting makes everything easier, and it keeps the post tidy.

 

My own mod, Magiks Most Evile: GitHub (https://github.com/GenElectrovise/MagiksMostEvile) Wiki (https://magiksmostevile.fandom.com/wiki/Magiks_Most_Evile_Wiki)

Edit your own signature at https://www.minecraftforge.net/forum/settings/signature/

Link to comment
Share on other sites

Yes... I have looked and AGE is created as a new PropertyInteger with the args ' "age", 0, and 7' for 'name max and min' values. When I try passing th..... Wait.....

 

Let me try something... ( *Tests in eclipse* )

 

:) 

I get it. I needed to pass in ((BlockPotato) block).AGE as the property to get. That was..... more obvious than I expected!

The clue was in the "static".

 

I can now get the age! Thanks! And this looks like it'll help in future also! 

I'll try implementing this fully later, but I think the issue of getting the value is solved! If I have any more problems it shouldn't relate to the getting of the value -- just the comparing logic!

Many thanks, again!

GenElectrovise

How to ask a good coding question: https://stackoverflow.com/help/how-to-ask

Give logs, code, desired effects, and actual effects. Be thorough or we can't help you. Don't post code without putting it in a code block (the <> button on the post - select "C-type Language"): syntax highlighting makes everything easier, and it keeps the post tidy.

 

My own mod, Magiks Most Evile: GitHub (https://github.com/GenElectrovise/MagiksMostEvile) Wiki (https://magiksmostevile.fandom.com/wiki/Magiks_Most_Evile_Wiki)

Edit your own signature at https://www.minecraftforge.net/forum/settings/signature/

Link to comment
Share on other sites

10 minutes ago, GenElectrovise said:

((BlockPotato) block).AGE

Well it should actually be BlockPotato.AGE.

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

In 1.14 these all coalesced into the same place, BlockStateProperties and got names based on their range.

As well as adding a getAgeProperty() method to the CropBlock class (and getMaxAge()).

Just FYI for when you get around to updating.

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 know what static means (I spent several painful weeks when I was first learning java making everything static and learning why that tends not to be the best idea :) ) but didn't think to apply the knowledge as I didn't mentally register the static nature of the field. Oops! 

Anyways this now works! For any future modders having a similar issue the fix in the end was:

int potatoAge = (int)world.getBlockState(blockPos).getProperties().get(((BlockPotato) block).AGE);

where the block at blockPos is guaranteed to be a BlockPotato.

Thanks all! I guess this thread can be closed now? 

Now time for me to go root through the vanilla code to find out how to spawn EntityItems! (Yay)

How to ask a good coding question: https://stackoverflow.com/help/how-to-ask

Give logs, code, desired effects, and actual effects. Be thorough or we can't help you. Don't post code without putting it in a code block (the <> button on the post - select "C-type Language"): syntax highlighting makes everything easier, and it keeps the post tidy.

 

My own mod, Magiks Most Evile: GitHub (https://github.com/GenElectrovise/MagiksMostEvile) Wiki (https://magiksmostevile.fandom.com/wiki/Magiks_Most_Evile_Wiki)

Edit your own signature at https://www.minecraftforge.net/forum/settings/signature/

Link to comment
Share on other sites

2 minutes ago, GenElectrovise said:

((BlockPotato) block).AGE

This is still wrong...you're not using the fact that BlockPotato.AGE is static. You don't use an instance to access it. Use BlockPotato.AGE instead of casting and using an instance to access it.

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

Ok. Still guess @diesieben07 was right (as usual :) ). Still have stuff to learn. I'll change that.

How to ask a good coding question: https://stackoverflow.com/help/how-to-ask

Give logs, code, desired effects, and actual effects. Be thorough or we can't help you. Don't post code without putting it in a code block (the <> button on the post - select "C-type Language"): syntax highlighting makes everything easier, and it keeps the post tidy.

 

My own mod, Magiks Most Evile: GitHub (https://github.com/GenElectrovise/MagiksMostEvile) Wiki (https://magiksmostevile.fandom.com/wiki/Magiks_Most_Evile_Wiki)

Edit your own signature at https://www.minecraftforge.net/forum/settings/signature/

Link to comment
Share on other sites

All done (hopefully!), works perfectly!

To amend my previous statement, the correct (I hope) code is:

int potatoAge = (int)world.getBlockState(blockPos).getProperties().get(BlockPotato.AGE);

Maybe. Hopefully? :) (Just realised how many :) s I use)

How to ask a good coding question: https://stackoverflow.com/help/how-to-ask

Give logs, code, desired effects, and actual effects. Be thorough or we can't help you. Don't post code without putting it in a code block (the <> button on the post - select "C-type Language"): syntax highlighting makes everything easier, and it keeps the post tidy.

 

My own mod, Magiks Most Evile: GitHub (https://github.com/GenElectrovise/MagiksMostEvile) Wiki (https://magiksmostevile.fandom.com/wiki/Magiks_Most_Evile_Wiki)

Edit your own signature at https://www.minecraftforge.net/forum/settings/signature/

Link to comment
Share on other sites

2 minutes ago, GenElectrovise said:

int potatoAge = (int)world.getBlockState(blockPos).getProperties().get(BlockPotato.AGE);

This can be shortened to (int) world.getBlockState(pos).getValue(BlockPotato.AGE); Though it does the exact same thing just a step further down. You should probably use IBlockState#getValue for some error checking.

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

Ok. I've edited and shortened that line. I'll remember this for future!

And speaking of remembering things, I'll remember that your channel (from your signature) has 1.14 workspace setting up tutorials! That'll come in handy when I decide to update!

Edited by GenElectrovise
Bad grammar (forgot word :) )

How to ask a good coding question: https://stackoverflow.com/help/how-to-ask

Give logs, code, desired effects, and actual effects. Be thorough or we can't help you. Don't post code without putting it in a code block (the <> button on the post - select "C-type Language"): syntax highlighting makes everything easier, and it keeps the post tidy.

 

My own mod, Magiks Most Evile: GitHub (https://github.com/GenElectrovise/MagiksMostEvile) Wiki (https://magiksmostevile.fandom.com/wiki/Magiks_Most_Evile_Wiki)

Edit your own signature at https://www.minecraftforge.net/forum/settings/signature/

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.