Jump to content

How do I create a creative tab and add vanilla Minecraft items and blocks to it in a certain order?


X66Herobrine66X

Recommended Posts

Trying to recreate the 1.19.3 creative changes in my mod. I know the basics of Java but I usually code with MCreator so if you could walk me through it that'd be great.

I found this link in an old thread, but it looks like it's outdated. Also I don't really understand whether I would have added that code to my existing creative tab class or have it as it's own separate class. Either way I had difficulties figuring out what each thing was.

 

Link to comment
Share on other sites

The default processing asks each item to add its relevant ItemStacks to a list in the order in which the Items were registered.

You override the method that does this in your custom CreativeModeTab.  e.g. (untested code)

    public static CreativeModeTab MY_CREATIVE_MODE_TAB = new CreativeModeTab("whatever") {

        @Override
        public void fillItemList(NonNullList<ItemStack> list) {
            // Default processing fills the list
            super.fillItemList(list);
            // Manipulate the list, e.g. sort by reverse order of rarity
            list.sort(Comparator.comparing(ItemStack::getRarity).reversed());
        }

        @Override
        public ItemStack makeIcon() {
            return Items.DIAMOND.getDefaultInstance();
        }
    };

 

Edited by warjort

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Link to comment
Share on other sites

15 minutes ago, warjort said:

The default processing asks each item to add its relevant ItemStacks to a list in the order in which the Items were registered.

You override the method that does this in your custom CreativeModeTab.  e.g. (untested code)


    public static CreativeModeTab MY_CREATIVE_MODE_TAB = new CreativeModeTab("whatever") {

        @Override
        public void fillItemList(NonNullList<ItemStack> list) {
            // Default processing
            super.fillItemList(list);
            // Manipulate the list, e.g. sort by reverse order of rarity
            list.sort(Comparator.comparing(ItemStack::getRarity).reversed());
        }

        @Override
        public ItemStack makeIcon() {
            return Items.DIAMOND.getDefaultInstance();
        }
    };

 

Ok that's worked so far, but I'm trying to add specific blocks in a specific order. This is my code so far:
 

package net.angelofcreation.randomshit.item;

import com.google.common.collect.Ordering;
import net.minecraft.core.NonNullList;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Blocks;
import net.minecraftforge.common.Tags;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class ModCreativeModeTab {

    static Comparator<ItemStack> tabSorter;

    public static final CreativeModeTab BUILDING_BLOCKS = new CreativeModeTab("building_block") {

        @Override
        public void fillItemList(NonNullList<ItemStack> list) {
            // Default processing
            super.fillItemList(list);
            // Manipulate the list, e.g. sort by reverse order of rarity
            list.sort(Comparator.comparing(ItemStack::getRarity).reversed());
        }

        @Override
        public ItemStack makeIcon() {
            return new ItemStack(Blocks.BRICKS);
        }

        void preInit() {
            List<Item> order = Arrays.asList();
            tabSorter = Ordering.explicit(order).onResultOf(ItemStack::getItem);
        }

    };
}

The problem I'm now running into is what to put in Arrays.asList. The link I'm going off of for this section says "List<Item> order = Arrays.asList(myItemA, myItemB, Item.getItemFromBlock(myBlockA), ...);" What would 'myItemA' be? What if it's a vanilla item I want to add?

Link to comment
Share on other sites

38 minutes ago, X66Herobrine66X said:

Ok that's worked so far, but I'm trying to add specific blocks in a specific order. This is my code so far:
 

The problem I'm now running into is what to put in Arrays.asList. The link I'm going off of for this section says "List<Item> order = Arrays.asList(myItemA, myItemB, Item.getItemFromBlock(myBlockA), ...);" What would 'myItemA' be? What if it's a vanilla item I want to add?

'myItemA' would be the item reference you want.

So obsidian would be: Item i = Items.OBSIDIAN;

Edited by MistaOmega
Link to comment
Share on other sites

4 minutes ago, MistaOmega said:

'myItemA' would be the item reference you want.

So obsidian would be: Item i = Items.OBSIDIAN;

Thank you. This is the code that I've come up with:

package net.angelofcreation.randomshit;

import com.google.common.collect.Ordering;
import net.minecraft.core.NonNullList;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.CreativeModeTab;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class CreativechangesModTabs {

    static Comparator<ItemStack> tabSorter;

    public static CreativeModeTab TAB_BUILDING_BLOCKS;

    public static void load() {
        TAB_BUILDING_BLOCKS = new CreativeModeTab("tabbuilding_blocks") {


            @Override
            public void fillItemList(NonNullList<ItemStack> list) {
                List<Item> order = Arrays.asList(Items.OAK_LOG, Items.OAK_WOOD, Items.STRIPPED_OAK_LOG, Items.STRIPPED_OAK_WOOD);
                tabSorter = Ordering.explicit(order).onResultOf(ItemStack::getItem);
                super.fillItemList(list);
                list.sort(tabSorter);
            }

            @Override
            public ItemStack makeIcon() {
                return new ItemStack(Blocks.BRICKS);
            }
        };
    }
}

Unfortunately, the creative tab does not have any of the 4 items I specified. Do you know why this is and how I can fix it?

Link to comment
Share on other sites

 

5 minutes ago, X66Herobrine66X said:

Thank you. This is the code that I've come up with:

package net.angelofcreation.randomshit;

import com.google.common.collect.Ordering;
import net.minecraft.core.NonNullList;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.CreativeModeTab;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class CreativechangesModTabs {

    static Comparator<ItemStack> tabSorter;

    public static CreativeModeTab TAB_BUILDING_BLOCKS;

    public static void load() {
        TAB_BUILDING_BLOCKS = new CreativeModeTab("tabbuilding_blocks") {


            @Override
            public void fillItemList(NonNullList<ItemStack> list) {
                List<Item> order = Arrays.asList(Items.OAK_LOG, Items.OAK_WOOD, Items.STRIPPED_OAK_LOG, Items.STRIPPED_OAK_WOOD);
                tabSorter = Ordering.explicit(order).onResultOf(ItemStack::getItem);
                super.fillItemList(list);
                list.sort(tabSorter);
            }

            @Override
            public ItemStack makeIcon() {
                return new ItemStack(Blocks.BRICKS);
            }
        };
    }
}

Unfortunately, the creative tab does not have any of the 4 items I specified. Do you know why this is and how I can fix it?

Because you're not pushing anything into the super.

The super looks like it wants a NonNullList of ItemStacks. So create a list of ItemStacks, you can create an ItemStack with an item via: ItemStack stack = new ItemStack(Items.OBSIDIAN);
Then I'd send that list that you make into the super.fillItemList.

list.sort only serves to modify the order of the list, you need to ensure that what you create and manipulate you send to the super. If you're unsure what super is for, refer to this link here: https://www.w3schools.com/java/ref_keyword_super.asp

Edited by MistaOmega
Link to comment
Share on other sites

12 minutes ago, MistaOmega said:

 

Because you're not pushing anything into the super.

The super looks like it wants a NonNullList of ItemStacks. So create a list of ItemStacks, you can create one via it's constructor. E.G: ItemStack stack = new ItemStack(Items.OBSIDIAN);
Then I'd send that list that you make into the super.fillItemList.

list.sort only serves to modify the order of the list, you need to ensure that what you create and manipulate you send to the super. If you're unsure what super is for, refer to this link here: https://www.w3schools.com/java/ref_keyword_super.asp

Does this look right? It's crashing my game when I click on the tab:
 

package net.angelofcreation.randomshit;

import com.google.common.collect.Ordering;
import net.minecraft.core.NonNullList;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.CreativeModeTab;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class CreativechangesModTabs {

    static Comparator<ItemStack> tabSorter;

    public static CreativeModeTab TAB_BUILDING_BLOCKS;

    public static void load() {
        TAB_BUILDING_BLOCKS = new CreativeModeTab("tabbuilding_blocks") {


            @Override
            public void fillItemList(NonNullList<ItemStack> list) {
                // Create list of itemstacks
                List<ItemStack> itemList = new ArrayList<ItemStack>();
                
                // Add itemstacks to list
                itemList.add(new ItemStack(Items.OAK_LOG));
                itemList.add(new ItemStack(Items.OAK_WOOD));
                itemList.add(new ItemStack(Items.STRIPPED_OAK_LOG));
                itemList.add(new ItemStack(Items.STRIPPED_OAK_WOOD));

                // set list to itemList
                list = (NonNullList<ItemStack>) itemList;

                // sort list
                List<Item> order = Arrays.asList(Items.OAK_LOG.asItem(), Items.OAK_WOOD.asItem(), Items.STRIPPED_OAK_LOG.asItem(), Items.STRIPPED_OAK_WOOD.asItem());
                tabSorter = Ordering.explicit(order).onResultOf(ItemStack::getItem);
                list.sort(tabSorter);
                
                // add list to super
                super.fillItemList(list);
            }

            @Override
            public ItemStack makeIcon() {
                return new ItemStack(Blocks.BRICKS);
            }
        };
    }
}

 

Link to comment
Share on other sites

Don't do all that new list stuff, all that casting and so on is bound to make an error, also, call your super first

 

                // add list to super
                super.fillItemList(list);

                // Add itemstacks to list
                list.add(new ItemStack(Items.OAK_LOG));
                list.add(new ItemStack(Items.OAK_WOOD));
                list.add(new ItemStack(Items.STRIPPED_OAK_LOG));
                list.add(new ItemStack(Items.STRIPPED_OAK_WOOD));


                // sort list
                List<Item> definedOrder = Arrays.asList(Items.OAK_LOG.asItem(), Items.OAK_WOOD.asItem(), Items.STRIPPED_OAK_LOG.asItem(), Items.STRIPPED_OAK_WOOD.asItem());
                Comparator<ItemStack> tabSorter;tabSorter = Ordering.explicit(definedOrder).onResultOf(ItemStack::getItem);
                list.sort(tabSorter);
                

this should do it, after testing it shows up with what you want

Edited by MistaOmega
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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • LadangToto2 adalah pilihan terbaik bagi Anda yang mencari pengalaman bermain slot gacor dengan transaksi mudah menggunakan Bank Mestika. Berikut adalah beberapa alasan mengapa Anda harus memilih LadangToto2: Slot Gacor Terbaik Kami menyajikan koleksi slot gacor terbaik yang menawarkan kesenangan bermain dan peluang kemenangan besar. Dengan fitur-fitur unggulan dan tema-tema menarik, setiap putaran permainan akan memberikan Anda pengalaman yang tak terlupakan. Transaksi Mudah dengan Bank Mestika Kami menyediakan layanan transaksi mudah melalui Bank Mestika untuk kenyamanan dan keamanan Anda. Dengan proses yang cepat dan efisien, Anda dapat melakukan deposit dan penarikan dana dengan lancar dan tanpa hambatan. Hadiah Hingga 100 Juta LadangToto2 memberikan kesempatan untuk meraih hadiah hingga 100 juta dalam kemenangan. Dengan jackpot dan hadiah-hadiah besar yang ditawarkan, setiap putaran permainan bisa menjadi peluang untuk meraih keberuntungan besar.  
    • Mengapa Memilih LadangToto? LadangToto adalah pilihan terbaik bagi Anda yang mencari pengalaman bermain slot gacor WD Maxwin dengan transaksi mudah menggunakan Bank BNI. Berikut adalah beberapa alasan mengapa Anda harus memilih LadangToto: Slot Gacor WD Maxwin Terbaik Kami menyajikan koleksi slot gacor WD Maxwin terbaik yang menawarkan kesenangan bermain dan peluang kemenangan besar. Dengan fitur-fitur unggulan dan tema-tema menarik, setiap putaran permainan akan memberikan Anda pengalaman yang tak terlupakan. Transaksi Mudah dengan Bank BNI Kami menyediakan layanan transaksi mudah melalui Bank BNI untuk kenyamanan dan keamanan Anda. Dengan proses yang cepat dan efisien, Anda dapat melakukan deposit dan penarikan dana dengan lancar dan tanpa hambatan.  
    • Akun Pro Kamboja adalah pilihan terbaik bagi Anda yang mencari pengalaman bermain slot Maxwin dengan transaksi mudah menggunakan Bank Lampung. Berikut adalah beberapa alasan mengapa Anda harus memilih Akun Pro Kamboja: Slot Maxwin Terbaik Kami menyajikan koleksi slot Maxwin terbaik yang menawarkan kesenangan bermain dan peluang kemenangan besar. Dengan fitur-fitur unggulan dan tema-tema menarik, setiap putaran permainan akan memberikan Anda pengalaman yang tak terlupakan. Transaksi Mudah dengan Bank Lampung Kami menyediakan layanan transaksi mudah melalui Bank Lampung untuk kenyamanan dan keamanan Anda. Dengan proses yang cepat dan efisien, Anda dapat melakukan deposit dan penarikan dana dengan lancar dan tanpa hambatan. Anti Rungkat Akun Pro Kamboja memberikan jaminan "anti rungkat" kepada para pemainnya. Dengan fitur ini, Anda dapat merasakan sensasi bermain dengan percaya diri, karena kami memastikan pengalaman bermain yang adil dan menyenangkan bagi semua pemain.  
    • BINGO188: Destinasi Terbaik untuk Pengalaman Slot yang Terjamin Selamat datang di BINGO188, tempat terbaik bagi para pecinta slot yang mencari pengalaman bermain yang terjamin dan penuh kemenangan. Di sini, kami menawarkan fitur unggulan yang dirancang untuk memastikan kepuasan dan keamanan Anda. Situs Slot Garansi Kekalahan 100 Kami memahami bahwa kadang-kadang kekalahan adalah bagian dari permainan. Namun, di BINGO188, kami memberikan jaminan keamanan dengan fitur garansi kekalahan 100. Jika Anda mengalami kekalahan, kami akan mengembalikan saldo Anda secara penuh. Kemenangan atau uang kembali, kami memastikan Anda tetap merasa aman dan nyaman. Bebas IP Tanpa TO Nikmati kebebasan bermain tanpa batasan IP dan tanpa harus khawatir tentang TO (Turn Over) di BINGO188. Fokuslah pada permainan Anda dan rasakan sensasi kemenangan tanpa hambatan. Server Thailand Paling Gacor Hari Ini Bergabunglah dengan server terbaik di Thailand hanya di BINGO188! Dengan tingkat kemenangan yang tinggi dan pengalaman bermain yang lancar, server kami dijamin akan memberikan Anda pengalaman slot yang tak tertandingi. Kesimpulan BINGO188 adalah pilihan terbaik bagi Anda yang menginginkan pengalaman bermain slot yang terjamin dan penuh kemenangan. Dengan fitur situs slot garansi kekalahan 100, bebas IP tanpa TO, dan server Thailand paling gacor hari ini, kami siap memberikan Anda pengalaman bermain yang aman, nyaman, dan menguntungkan. Bergabunglah sekarang dan mulailah petualangan slot Anda di BINGO188!
    • Mengapa Memilih AlibabaSlot? AlibabaSlot adalah pilihan terbaik bagi Anda yang mencari slot gacor dari Pgsoft dengan transaksi mudah menggunakan Bank Panin. Berikut adalah beberapa alasan mengapa Anda harus memilih AlibabaSlot: Slot Gacor dari Pgsoft Kami menyajikan koleksi slot gacor terbaik dari Pgsoft. Dengan fitur-fitur unggulan dan peluang kemenangan yang tinggi, setiap putaran permainan akan memberikan Anda kesenangan dan keuntungan yang maksimal. Transaksi Mudah dengan Bank Panin Kami menyediakan layanan transaksi mudah melalui Bank Panin untuk kenyamanan dan keamanan Anda. Dengan proses yang cepat dan efisien, Anda dapat melakukan deposit dan penarikan dana dengan lancar dan tanpa masalah.  
  • Topics

×
×
  • Create New...

Important Information

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