anonymusdennis Posted November 18, 2020 Posted November 18, 2020 (edited) Minecraft version: 1.15.1 So I want my mod to add an Creative Tab in which one can use all the heads of the current online Players. so far I got this: public static ArrayList<String> online_player_names = new ArrayList<String>() {{ add("Steve"); add("my_name"); add("Alex"); add("Herobrine"); add("Cake"); add("CaptainSparkles"); add("Steve"); add("Steve"); add("Steve"); add("Steve"); add("Steve"); add("Steve"); add("Steve"); add("Steve"); add("Steve"); }}; //this is a list of predefined heads @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD) public static class RegistryEvents { @SubscribeEvent public static void updateHeads(final GuiOpenEvent event){ Collection<NetworkPlayerInfo> playersC= Minecraft.getInstance().getConnection().getPlayerInfoMap(); playersC.forEach((loadedPlayer)->{ String LoadedPlayerName = loadedPlayer.getGameProfile().getName(); if(!online_player_names.contains(LoadedPlayerName)){ online_player_names.add(LoadedPlayerName); } }); online_player_names.forEach((playername)->{ ItemStack head = (new ItemStack(Blocks.PLAYER_HEAD)); CompoundNBT nbt = head.getTag(); nbt.putString("Skullowner", playername); head.setTag(nbt); Item heads = head.getItem(); //Put Itemstack to Creative Tab ModItemGroups.MOD_ITEM_GROUP_Skulls.fill(new NonNullList<ItemStack>() {{add(head);}}); }); } this code gives an error when it tries to put the ItemStack into a new Creative Tab: Error Code From pastebin here I don't know how to solve this I didn't fin any references on how to add Already exsisting Items to a new CreativeTab but with changed NBT here is my code for the creative Tabs: package com.anonymusdennis.annomod.init; import com.anonymusdennis.annomod.annomod; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.NonNullList; import net.minecraft.util.registry.Registry; import java.util.function.Supplier; public class ModItemGroups { public static class ModItemGroup extends ItemGroup { private final Supplier<ItemStack> iconSupplier; public ModItemGroup(final String name, final Supplier<ItemStack> iconSupplier) { super(name); this.iconSupplier = iconSupplier; } @Override public ItemStack createIcon() { return iconSupplier.get(); } @Override public void fill(NonNullList<ItemStack> items) { for(Item item : Registry.ITEM) { item.fillItemGroup(this, items); } } } public static final ItemGroup MOD_ITEM_GROUP_Banner = new ModItemGroup("jolo", () -> new ItemStack(Items.LIGHT_BLUE_BANNER)); public static ItemGroup MOD_ITEM_GROUP_Skulls = (new ModItemGroup("Heads", () -> new ItemStack(Items.LIGHT_BLUE_BANNER))); public static final ItemGroup MOD_ITEM_GROUP_Standart = new ModItemGroup(annomod.MOD_ID, () -> new ItemStack(ItemInit.erstes_item)); public static final ItemGroup MOD_ITEM_GROUP_Rest = new ModItemGroup("Rest", () -> new ItemStack(Items.LIGHT_BLUE_BANNER)); } or here from pastebin: https://pastebin.com/EMm8BqyA Edited November 18, 2020 by anonymusdennis bad Internet Quote
anonymusdennis Posted November 18, 2020 Author Posted November 18, 2020 @Override public void fill(NonNullList<ItemStack> items) { for(Item item : Registry.ITEM) { item.fillItemGroup(this, items); } } so far I got this but what is the list of Items I am supposed to get? I am new to this topic please forgive my stupidity Quote
anonymusdennis Posted November 18, 2020 Author Posted November 18, 2020 (edited) public static class ModItemGroup extends ItemGroup { public String name = ""; public ItemGroup UpdateName(String name) { this.name = ""; return this; } public static ArrayList<String> player_names = new ArrayList<String>() {{}}; private final Supplier<ItemStack> iconSupplier; public ModItemGroup(final String name, final Supplier<ItemStack> iconSupplier) { super(name); this.iconSupplier = iconSupplier; } @Override public void fill(NonNullList<ItemStack> items) { LOGGER.info(this.name); if(this.name == "skull"){ LOGGER.info(this.name + "success"); items = new NonNullList<ItemStack>() {{ player_names.forEach((playername)->{ ItemStack head = (new ItemStack(Blocks.PLAYER_HEAD)); CompoundNBT nbt = head.getTag(); nbt.putString("Skullowner", playername); head.setTag(nbt); Item heads = head.getItem(); add(head); });}}; } } @Override public ItemStack createIcon() { return iconSupplier.get(); } } Now I got this is this better? I also removed the call of the fill function Now I got another error : [10:34:56] [Render thread/ERROR] [ne.mi.fm.ja.FMLModContainer/]: Exception caught during firing event: Unable to have damage AND stack. Index: 2 And below there is this error: Caught exception during event RegistryEvent.Register<minecraft:item> dispatch for modid annomod here is the complete Error https://pastebin.com/4W14KiMv Edited November 18, 2020 by anonymusdennis Quote
anonymusdennis Posted November 18, 2020 Author Posted November 18, 2020 okay i think I got it started without any errors: package com.anonymusdennis.annomod.init; import com.anonymusdennis.annomod.annomod; import net.minecraft.block.Blocks; import net.minecraft.client.gui.screen.inventory.CreativeScreen; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.container.Container; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.NonNullList; import net.minecraft.util.registry.Registry; import java.util.ArrayList; import java.util.function.Supplier; import net.minecraft.client.gui.screen.inventory.CreativeScreen; import static net.minecraft.world.biome.Biome.LOGGER; public class ModItemGroups { public static class ModItemGroup extends ItemGroup { public String name = ""; public ItemGroup UpdateName(String name) { this.name = ""; return this; } public static ArrayList<String> player_names = new ArrayList<String>() {{}}; private final Supplier<ItemStack> iconSupplier; public ModItemGroup(final String name, final Supplier<ItemStack> iconSupplier) { super(name); this.iconSupplier = iconSupplier; } @Override public void fill(NonNullList<ItemStack> items) { LOGGER.info(this.name); if(this.name == "skull"){ LOGGER.info(this.name + "success"); player_names.forEach((playername)-> { ItemStack head = (new ItemStack(Blocks.PLAYER_HEAD)); CompoundNBT nbt = head.getTag(); nbt.putString("Skullowner", playername); head.setTag(nbt); Item heads = head.getItem(); items.add(head); }); for(Item item : Registry.ITEM) { item.fillItemGroup(this, items); } } } @Override public ItemStack createIcon() { return iconSupplier.get(); } } public static final ItemGroup MOD_ITEM_GROUP_Banner = new ModItemGroup("jolo", () -> new ItemStack(Items.LIGHT_BLUE_BANNER)); public ItemGroup MOD_ITEM_GROUP_Skulls = ((new ModItemGroup("Heads", () -> new ItemStack(Items.LIGHT_BLUE_BANNER))).UpdateName("skull")); public static final ItemGroup MOD_ITEM_GROUP_Standart = new ModItemGroup(annomod.MOD_ID, () -> new ItemStack(ItemInit.erstes_item)); public static final ItemGroup MOD_ITEM_GROUP_Rest = new ModItemGroup("Rest", () -> new ItemStack(Items.LIGHT_BLUE_BANNER)); } this does somehow cause the creative Tab "Heads" not to show up why? I am truly sorry If I am stressing you.. Quote
anonymusdennis Posted November 18, 2020 Author Posted November 18, 2020 okay i got it now and here is my code for anyone who is interested: ModItemGroups.java package com.anonymusdennis.annomod.init; import com.anonymusdennis.annomod.annomod; import net.minecraft.block.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.NonNullList; import net.minecraft.util.registry.Registry; import java.util.ArrayList; import java.util.function.Supplier; import java.util.logging.Logger; import static net.minecraft.world.biome.Biome.LOGGER; public class ModItemGroups { public static class ModItemGroup extends ItemGroup { public String namer = ""; private final Supplier<ItemStack> iconSupplier; public ModItemGroup(final String name, final Supplier<ItemStack> iconSupplier, String skull) { super(name); this.namer = skull; namer = skull; this.iconSupplier = iconSupplier; } @Override public void fill(NonNullList<ItemStack> items) { if(namer == "skull"){ annomod.online_player_names.forEach((playername)-> { ItemStack head = (new ItemStack(Blocks.PLAYER_HEAD)); CompoundNBT nbt = head.getOrCreateTag(); nbt.putString("SkullOwner", playername); nbt.put("display", new CompoundNBT() {{ putString("text", playername); }}); head.setTag(nbt); Item heads = head.getItem(); items.add(head); }); } for(Item item : Registry.ITEM) { item.fillItemGroup(this, items); } } @Override public ItemStack createIcon() { return iconSupplier.get(); } } public static final ItemGroup MOD_ITEM_GROUP_Blocks = new ModItemGroup("jolo", () -> new ItemStack(Items.LIGHT_BLUE_BANNER), "banner"); public static final ItemGroup MOD_ITEM_GROUP_Skulls = new ModItemGroup("Heads", () -> new ItemStack(Items.PLAYER_HEAD),"skull"); public static final ItemGroup MOD_ITEM_GROUP_Standart = new ModItemGroup(annomod.MOD_ID, () -> new ItemStack(ItemInit.erstes_item), "standard"); public static final ItemGroup MOD_ITEM_GROUP_Food = new ModItemGroup("Rest", () -> new ItemStack(Items.LIGHT_BLUE_BANNER), "rest"); } annomod.java package com.anonymusdennis.annomod; import com.anonymusdennis.annomod.init.ModItemGroups; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.SkullBlock; import net.minecraft.block.SkullPlayerBlock; import net.minecraft.client.Minecraft; import net.minecraft.client.network.play.NetworkPlayerInfo; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.NonNullList; import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.Tags; import net.minecraftforge.common.util.Constants; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.server.FMLServerStartingEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.network.NetworkRegistry; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.ArrayList; // The value here should match an entry in the META-INF/mods.toml file @Mod("annomod") public class annomod { private int online_players = 0; // Directly reference a log4j logger. public static ArrayList<String> online_player_names = new ArrayList<String>() {{ add("anonymusdennis"); add("Steve"); //List of heads to be added by default }}; private static final Logger LOGGER = LogManager.getLogger(); public static final String MOD_ID = "annomod"; public static annomod instance; public annomod() { // Register the setup method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); // Register the enqueueIMC method for modloading //FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueIMC); // Register the processIMC method for modloading //FMLJavaModLoadingContext.get().getModEventBus().addListener(this::processIMC); // Register the doClientStuff method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff); instance = this; // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); } private void setup(final FMLCommonSetupEvent event) { // some preinit code } private void doClientStuff(final FMLClientSetupEvent event) { // do something that can only be done on the client } // You can use SubscribeEvent and let the Event Bus discover methods to call @SubscribeEvent public void onServerStarting(FMLServerStartingEvent event) { // do something when the server starts } // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD // Event bus for receiving Registry Events) @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD) public static class RegistryEvents { @SubscribeEvent public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) { // register a new block here LOGGER.info("HELLO from Register Block"); } @SubscribeEvent public static void updateHeads(final GuiOpenEvent event){ Collection<NetworkPlayerInfo> playersC= Minecraft.getInstance().getConnection().getPlayerInfoMap(); playersC.forEach((loadedPlayer)->{ String LoadedPlayerName = loadedPlayer.getGameProfile().getName(); if(!online_player_names.contains(LoadedPlayerName)){ online_player_names.add(LoadedPlayerName); } LoadedPlayerName = loadedPlayer.getDisplayName().getString(); if(!online_player_names.contains(LoadedPlayerName)) { online_player_names.add(LoadedPlayerName); } }); String LoadedPlayerName = Minecraft.getInstance().player.getDisplayName().getString(); if(!online_player_names.contains(LoadedPlayerName)) { online_player_names.add(LoadedPlayerName); } } } } Thanks to everyone !!!!!!!! Quote
anonymusdennis Posted February 10, 2021 Author Posted February 10, 2021 Thanks again for your tips Quote
Recommended Posts
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.