Jump to content

Recommended Posts

Posted

OK so I'm either being incredibly thick or just plain blind but I can't for the life of me figure out how to call the stone variants when checking the item in my player's hand correctly. getStateFromMeta is deprecated (and only returned the wrong one anyway so that's useless...) so I was wondering if anyone can help me out?

Posted

Hi !

 

You compare the blockstate with Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.STONE). Here I put EnumType.STONE, other variants work the same way.

Posted

Thanks for the detailed reply Koward but I have already tried that for several hours now.

 

Here's a snippet of my code:

 

Item item = heldItem.getItem();

if (item == Item.getItemFromBlock(Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.ANDESITE)))

 

The error message states it needs a block and this code returns a BlockState which is incompatible.

 

You see my issue?

Posted

I'm sorry, I read your post too fast.

 

Use EntityPlayer : public ItemStack getHeldItemMainhand() (or Offhand if you want).

You get an ItemStack, which has a metadata value. Use ItemStack : public int getMetadata(), and compare it with the metadata of one of the BlockStone.EnumType you want (getMetadata() too).

 

This way, no deprecation at all, you're as ready as possible for the future.

Posted

Hi

 

@SwordKorn you can do it the way you were trying, it's just a bit more involved.

    ItemStack heldItem = entityPlayer.getHeldItemMainhand();
    IBlockState iBlockStateAndesite = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.ANDESITE);
    Item itemStone = Item.getItemFromBlock(Blocks.STONE);
    ItemStack itemStackAndesite = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateAndesite));  // see Block.getItem()
    boolean heldItemIsAndesite = ItemStack.areItemsEqual(heldItem, itemStackAndesite);

 

I think Koward's suggestion is probably clearer.

 

-TGG

 

Posted

Both excellent suggestions and I tried them both.

 

Sad to report it doesn't work though so I'll expand on my code for reference:

    @Override
    public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
        if (heldItem == null) {
            return false;
        }else{
            if (!world.isRemote) {
                if (world.getBlockState(pos) == BlockReg.tableBlock0.getDefaultState()) {
                    Item item = heldItem.getItem();

                    if (item == Item.getItemFromBlock(Blocks.COBBLESTONE)) {
                        world.setBlockState(pos, BlockReg.tableBlock1.getDefaultState());
                    }

                    if (item == Item.getItemFromBlock(Blocks.STONE)) {
                        world.setBlockState(pos, BlockReg.tableBlock2.getDefaultState());
                        System.out.println("Boolean is FALSE" + itemIsAndesite + itemIsGranite + itemIsDiorite);
                    }

                    if (item == Item.getItemFromBlock(Blocks.STONEBRICK)) {
                        world.setBlockState(pos, BlockReg.tableBlock3.getDefaultState());
                    }

                    /*if (itemIsAndesite) {
                        heldItem = andesite;
                        world.setBlockState(pos, BlockReg.tableBlock4.getDefaultState());
                        System.out.println(heldItem);
                    }

                    if (itemIsDiorite) {
                        world.setBlockState(pos, BlockReg.tableBlock5.getDefaultState());
                        System.out.println("Boolean is TRUE");
                    }

                    if (itemIsGranite) {
                        world.setBlockState(pos, BlockReg.tableBlock6.getDefaultState());
                        System.out.println("Boolean is TRUE");
                    }*/
                }
            }
            return true;
        }
    }

Posted

You are not comparing metadata from the stacks so what you are doing is hey is this a ston block which will be true for diorite andesite granite and smooth stone.

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.

Posted

Well no, I'm not anymore. I took TheGreyGhost's code advice and implemented that to no avail so I removed that block of code.

 

Sufficed to say; when I was using that code the boolean states never switched from false defaulting to the main STONE conditional.

Posted

Oh sorry diesie... I will. Let me rewrite it and I'll modify this post when I've reimplemented everything

 

EDIT

    @Override
    public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
        if (heldItem == null) {
            return false;
        }else{
            if (!world.isRemote) {
                if (world.getBlockState(pos) == BlockReg.tableBlock0.getDefaultState()) {
                    Item item = heldItem.getItem();
                    heldItem = player.getHeldItemMainhand();

                    IBlockState iBlockStateAndesite = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.ANDESITE);
                    IBlockState iBlockStateGranite = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.GRANITE);
                    IBlockState iBlockStateDiorite = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.DIORITE);

                    Item itemStone = Item.getItemFromBlock(Blocks.STONE);

                    ItemStack andesite = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateAndesite));
                    ItemStack granite = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateGranite));
                    ItemStack diorite = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateDiorite));

                    boolean itemIsAndesite = ItemStack.areItemsEqual(heldItem, andesite);
                    boolean itemIsGranite = ItemStack.areItemsEqual(heldItem, granite);
                    boolean itemIsDiorite = ItemStack.areItemsEqual(heldItem, diorite);

                    if (item == Item.getItemFromBlock(Blocks.COBBLESTONE)) {
                        world.setBlockState(pos, BlockReg.tableBlock1.getDefaultState());
                    }

                    if (item == Item.getItemFromBlock(Blocks.STONE)) {
                        world.setBlockState(pos, BlockReg.tableBlock2.getDefaultState());
                        System.out.println(itemIsAndesite + " " + itemIsGranite + " " + itemIsDiorite);
                    }

                    if (item == Item.getItemFromBlock(Blocks.STONEBRICK)) {
                        world.setBlockState(pos, BlockReg.tableBlock3.getDefaultState());
                    }

                    if (itemIsAndesite) {
                        world.setBlockState(pos, BlockReg.tableBlock4.getDefaultState());
                        System.out.println("Boolean is TRUE");
                    }

                    if (itemIsDiorite) {
                        world.setBlockState(pos, BlockReg.tableBlock5.getDefaultState());
                        System.out.println("Boolean is TRUE");
                    }

                    if (itemIsGranite) {
                        world.setBlockState(pos, BlockReg.tableBlock6.getDefaultState());
                        System.out.println("Boolean is TRUE");
                    }
                }
            }
            return true;
        }
    }

Posted

I just tried that and it came up with an interesting behaviour!

 

All the other block types didn't work at all and normal Stone called them all so that was fun!

 

Trying to work around that as I speak.

Posted
            if (!world.isRemote) {
                if (world.getBlockState(pos) == BlockReg.tableBlock0.getDefaultState()) {
                    Item item = heldItem.getItem();

                    IBlockState iBlockStateStone = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.STONE);
                    IBlockState iBlockStateAndesite = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.ANDESITE);
                    IBlockState iBlockStateGranite = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.GRANITE);
                    IBlockState iBlockStateDiorite = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.DIORITE);

                    Item itemStone = Item.getItemFromBlock(Blocks.STONE);

                    ItemStack stone = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateStone));
                    ItemStack andesite = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateAndesite));
                    ItemStack granite = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateGranite));
                    ItemStack diorite = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateDiorite));

                    boolean itemIsStone = ItemStack.areItemsEqual(heldItem, stone);
                    boolean itemIsAndesite = ItemStack.areItemsEqual(heldItem, andesite);
                    boolean itemIsGranite = ItemStack.areItemsEqual(heldItem, granite);
                    boolean itemIsDiorite = ItemStack.areItemsEqual(heldItem, diorite);

                    if (item == Item.getItemFromBlock(Blocks.COBBLESTONE)) {
                        world.setBlockState(pos, BlockReg.tableBlock1.getDefaultState());
                    }

                    if (itemIsStone) {
                        world.setBlockState(pos, BlockReg.tableBlock2.getDefaultState());
                    }

                    if (itemIsAndesite) {
                        world.setBlockState(pos, BlockReg.tableBlock4.getDefaultState());
                        System.out.println("Boolean is TRUE");
                    }

                    if (itemIsGranite) {
                        world.setBlockState(pos, BlockReg.tableBlock6.getDefaultState());
                        System.out.println("Boolean is TRUE");
                    }

                    if (itemIsDiorite) {
                        world.setBlockState(pos, BlockReg.tableBlock5.getDefaultState());
                        System.out.println("Boolean is TRUE");
                    }

                    if (item == Item.getItemFromBlock(Blocks.STONEBRICK)) {
                        world.setBlockState(pos, BlockReg.tableBlock3.getDefaultState());
                    }
                }
            }
            return true;
        }

Posted

It doesn't. This way causes the bug I described above.

 

Using this method, only regular stone will activate ALL the booleans, and no other variant accesses their relevant boolean firing them all as false.

 

It's a weird one for sure!

Posted

Well actually... now that I think about it...

 

Every ItemStack variant calls on itemStone which only checks for the default state of Stone in the player's hand. Therefore calling on itemStone may make them only actve when the default variant is located. In which case, I'm back to square one more or less.

Posted

Well I have deduced that:

                    Item itemStone = Item.getItemFromBlock(Blocks.STONE);

May be the reason only the default state activates all booleans. I came to this conclusion when I looked at:

                    ItemStack stone = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateStone));
                    ItemStack andesite = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateAndesite));
                    ItemStack granite = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateGranite));
                    ItemStack diorite = new ItemStack(itemStone, Blocks.STONE.damageDropped(iBlockStateDiorite));

As you can see, every instance of the ItemStack calls on the default variant and as my IDE so kindly pointed out;

 

"Argument 'itemStone' might be null"

Posted

So... OH I get you!

 

So the metadata is returning the stack size! That makes perfect sense now I think about it! Good catch Diesie!

 

Hmm... so now it comes down to a way to simply ignore that value or set it to an integer value that just fills in a value based on reading the stack size in the slot.

 

I'll do some more messing around and let you know what I come up with.

Posted

Well that was incredibly simple once you pointed that out diesie!

 

Here's my code for people wanting to know how I made this work and I'm marking this as solved! Thanks very much everyone for all your help!

 

    @Override
    public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
        if (heldItem == null) {
            return false;
        }else{
            if (!world.isRemote) {
                if (!player.capabilities.isCreativeMode) {
                    if (world.getBlockState(pos) == BlockReg.tableBlock0.getDefaultState()) {
                        Item item = heldItem.getItem();

                        IBlockState iBlockStateStone = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.STONE);
                        IBlockState iBlockStateAndesite = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.ANDESITE);
                        IBlockState iBlockStateGranite = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.GRANITE);
                        IBlockState iBlockStateDiorite = Blocks.STONE.getDefaultState().withProperty(BlockStone.VARIANT, BlockStone.EnumType.DIORITE);

                        Item itemStone = Item.getItemFromBlock(Blocks.STONE);

                        ItemStack stone = new ItemStack(itemStone, 1, Blocks.STONE.damageDropped(iBlockStateStone));
                        ItemStack andesite = new ItemStack(itemStone, 1, Blocks.STONE.damageDropped(iBlockStateAndesite));
                        ItemStack granite = new ItemStack(itemStone, 1, Blocks.STONE.damageDropped(iBlockStateGranite));
                        ItemStack diorite = new ItemStack(itemStone, 1, Blocks.STONE.damageDropped(iBlockStateDiorite));

                        boolean itemIsStone = ItemStack.areItemsEqual(heldItem, stone);
                        boolean itemIsAndesite = ItemStack.areItemsEqual(heldItem, andesite);
                        boolean itemIsGranite = ItemStack.areItemsEqual(heldItem, granite);
                        boolean itemIsDiorite = ItemStack.areItemsEqual(heldItem, diorite);

                        if (item == Item.getItemFromBlock(Blocks.COBBLESTONE)) {
                            world.setBlockState(pos, BlockReg.tableBlock1.getDefaultState());
                            heldItem.stackSize -= 1;
                        }

                        if (itemIsStone) {
                            world.setBlockState(pos, BlockReg.tableBlock2.getDefaultState());
                            heldItem.stackSize -= 1;
                        }

                        if (itemIsAndesite) {
                            world.setBlockState(pos, BlockReg.tableBlock4.getDefaultState());
                            heldItem.stackSize -= 1;
                            System.out.println("Boolean is TRUE");
                        }

                        if (itemIsGranite) {
                            world.setBlockState(pos, BlockReg.tableBlock6.getDefaultState());
                            heldItem.stackSize -= 1;
                            System.out.println("Boolean is TRUE");
                        }

                        if (itemIsDiorite) {
                            world.setBlockState(pos, BlockReg.tableBlock5.getDefaultState());
                            heldItem.stackSize -= 1;
                            System.out.println("Boolean is TRUE");
                        }

                        if (item == Item.getItemFromBlock(Blocks.STONEBRICK)) {
                            world.setBlockState(pos, BlockReg.tableBlock3.getDefaultState());
                            heldItem.stackSize -= 1;
                        }
                    }
                }
            }
            return true;
        }
    }

Posted

Now you can move your 4 IBlockState's to the class level, adding static and final attributes (It's really not necessary to construct them every time that method is called). Likewise the item-stacks.

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.

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

    • Betafort Recovery has emerged as a prominent figure in the realm of cryptocurrency recovery, gaining a reputation for their exceptional ability to retrieve lost Bitcoin (BTC) and other cryptocurrencies. Their expertise and track record have made them a beacon of hope for individuals facing the distressing situation of lost or inaccessible crypto assets.  
    • When you name a method like that, with no return value, it is a constructor. The constructor must have the same name as the class it constructs, in this case, ModItems. I would strongly advise reading up on some basic Java tutorials, because you will definitely be running into a lot more issues as you go along without the basics. *I should also add that the Forge documentation is a reference, not a tutorial. Even following tutorials, you should know Java basics, otherwise the smallest of mistakes will trip you up as you copy someone elses code.
    • so, I'm starting modding and I'm following the official documantation for forge: https://docs.minecraftforge.net, but in the registries part it is not working as it is in the docs:   public class ModItems { private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, DarkStarvation.MOD_ID); public static final RegistryObject<Item> TEST_ITEM = ITEMS.register("test_item", () -> new Item(new Item.Properties())); public DarkStarvation(FMLJavaModLoadingContext context) { ITEMS.register(context.getModEventBus()); } } in 'public DarkStarvation(...' the DarkStarvation has this error: Invalid method declaration; return type required and the getModEventBus(): Cannot resolve method 'getModEventBus' in 'FMLJavaModLoadingContext' please help, I asked gpt but it is saying that I'm using an old method, but I'm following the latest version of Forge Docs???
    • I merged your second post with the original , there is no need to post a new thread asking for an answer. If someone sees your post and can help, they will reply. If you are seeking a quicker response, you could try asking in the Minecraft Forge diacord.
    • Create a new instance and start with cobblemon - if this works, add the rest of your mods in groups   Maybe another mod is conflicting - like Sodium/Iris or Radical Cobblemon Trainers
  • Topics

×
×
  • Create New...

Important Information

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